{"id":277655,"date":"2026-05-07T10:17:12","date_gmt":"2026-05-07T10:17:12","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/keytomic-publisher\/"},"modified":"2026-05-07T10:16:46","modified_gmt":"2026-05-07T10:16:46","slug":"keytomic","status":"publish","type":"plugin","link":"https:\/\/mlt.wordpress.org\/plugins\/keytomic\/","author":23443217,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"0.1.3","stable_tag":"0.1.3","tested":"6.9.4","requires":"6.0","requires_php":"8.1","requires_plugins":null,"header_name":"Keytomic","header_author":"Keytomic","header_description":"Receives Keytomic blog drafts via API and saves them into WordPress.","assets_banners_color":"fefcfb","last_updated":"2026-05-07 10:16:46","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":55,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.1.3":{"tag":"0.1.3","author":"salam09","date":"2026-05-07 10:16:46"}},"upgrade_notice":{"0.1.3":"<p>Adds slug-based upsert behavior for incoming Keytomic draft\/publish requests and avoids duplicate featured image sideloads on retries.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3525376,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3525376,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3525447,"resolution":"1544x500","location":"assets","locale":""},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3525447,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.1.3"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3525466,"resolution":"1","location":"assets","locale":""},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3525466,"resolution":"2","location":"assets","locale":""},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3525466,"resolution":"3","location":"assets","locale":""}},"screenshots":{"1":"Keytomic settings screen","2":"Example request result (connection successful)","3":"Draft post created by Keytomic"},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[181641,139075,96456,23853,186],"plugin_category":[55],"plugin_contributors":[262155],"plugin_business_model":[],"class_list":["post-277655","plugin","type-plugin","status-publish","hentry","plugin_tags-content-automation","plugin_tags-content-publishing","plugin_tags-editorial-workflow","plugin_tags-rest-api","plugin_tags-seo","plugin_category-seo-and-marketing","plugin_contributors-salam09","plugin_committers-salam09"],"banners":{"banner":"https:\/\/ps.w.org\/keytomic\/assets\/banner-772x250.png?rev=3525447","banner_2x":"https:\/\/ps.w.org\/keytomic\/assets\/banner-1544x500.png?rev=3525447","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/keytomic\/assets\/icon-128x128.png?rev=3525376","icon_2x":"https:\/\/ps.w.org\/keytomic\/assets\/icon-256x256.png?rev=3525376","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/keytomic\/assets\/screenshot-1.png?rev=3525466","caption":"Keytomic settings screen"},{"src":"https:\/\/ps.w.org\/keytomic\/assets\/screenshot-2.png?rev=3525466","caption":"Example request result (connection successful)"},{"src":"https:\/\/ps.w.org\/keytomic\/assets\/screenshot-3.png?rev=3525466","caption":"Draft post created by Keytomic"}],"raw_content":"<!--section=description-->\n<p>Keytomic is a lightweight companion plugin for the Keytomic platform. It allows Keytomic to send blog drafts to your WordPress site using a secure REST API endpoint.<\/p>\n\n<p>The plugin does not generate content inside WordPress. It receives a request from Keytomic and creates or updates a post on your site based on the payload you provide.<\/p>\n\n<h4>Key features<\/h4>\n\n<ol>\n<li>Secure authentication using an API key (stored as a hash).<\/li>\n<li>REST endpoint for creating or updating posts (slug-based upsert):\n\n<ul>\n<li>POST \/wp-json\/keytomic\/v1\/drafts<\/li>\n<\/ul><\/li>\n<li>Supports multiple modes:\n\n<ul>\n<li>ping (connection test)<\/li>\n<li>draft (creates or updates a draft post by slug)<\/li>\n<li>publish (creates or updates a published post by slug)<\/li>\n<\/ul><\/li>\n<li>Converts Keytomic payloads into WordPress post content:\n\n<ul>\n<li>contentHtml, contentMarkdown, or sections (heading\/body)<\/li>\n<\/ul><\/li>\n<li>Optional featured image sideloading from a provided URL (skips re-sideloading when the same URL is sent again for the same post).<\/li>\n<li>Stores an SEO meta description and outputs it as a meta description tag on single posts.<\/li>\n<\/ol>\n\n<h4>Authentication<\/h4>\n\n<p>Requests must include the Authorization header:<\/p>\n\n<p>Authorization: Keytomic YOUR_API_KEY<\/p>\n\n<p>(As a fallback, apiKey may also be provided in the JSON payload.)<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin is designed to be used with the Keytomic platform and requires an API key generated in your Keytomic account.<\/p>\n\n<p>This plugin does not send your site\u2019s content to Keytomic on its own. It only processes inbound requests made to your site\u2019s endpoint.<\/p>\n\n<p>Data handled:\n- API key (entered by the site admin and stored as a hash in WordPress options)\n- Post data received from Keytomic (title, slug, summary\/excerpt, content, optional hero image URL and alt text, optional SEO description)<\/p>\n\n<p>When data is processed:\n- When Keytomic sends a request to your site\u2019s REST endpoint\n- When the plugin downloads a featured image from a URL provided in the request (if used)<\/p>\n\n<p>External service links:\n- Keytomic: https:\/\/keytomic.com\n- Privacy Policy: https:\/\/keytomic.com\/privacy\n- Terms of Service: https:\/\/keytomic.com\/terms<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code> or install via the WordPress admin.<\/li>\n<li>Activate the plugin from the \u201cPlugins\u201d page.<\/li>\n<li>Go to <strong>Settings \u2192 Keytomic<\/strong>.<\/li>\n<li>Paste your Keytomic API key and save.<\/li>\n<li>In Keytomic, connect your WordPress site using your site URL and the endpoint shown above.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"where%20is%20the%20endpoint%3F\"><h3>Where is the endpoint?<\/h3><\/dt>\n<dd><p>POST \/wp-json\/keytomic\/v1\/drafts<\/p><\/dd>\n<dt id=\"how%20do%20i%20test%20the%20connection%3F\"><h3>How do I test the connection?<\/h3><\/dt>\n<dd><p>Send a request with mode set to ping and your Authorization header. A successful response returns \u201cConnection successful\u201d.<\/p><\/dd>\n<dt id=\"does%20it%20publish%20automatically%3F\"><h3>Does it publish automatically?<\/h3><\/dt>\n<dd><p>It supports both draft and publish modes. Keytomic controls the mode per request.<\/p><\/dd>\n<dt id=\"does%20it%20create%20duplicates%20if%20i%20send%20the%20same%20draft%20again%3F\"><h3>Does it create duplicates if I send the same draft again?<\/h3><\/dt>\n<dd><p>No, the plugin updates the existing post when the incoming slug matches an existing WordPress post. If the slug changes, it creates a new post.<\/p><\/dd>\n<dt id=\"is%20the%20api%20key%20stored%20in%20plain%20text%3F\"><h3>Is the API key stored in plain text?<\/h3><\/dt>\n<dd><p>No. The API key is stored as a hash and verified server-side.<\/p><\/dd>\n<dt id=\"what%20payload%20formats%20are%20supported%3F\"><h3>What payload formats are supported?<\/h3><\/dt>\n<dd><p>The plugin accepts contentHtml, contentMarkdown, or sections (heading\/body). It can also accept a heroImage URL to set a featured image.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.1.3<\/h4>\n\n<ul>\n<li>Add slug-based upsert for draft\/publish requests (same slug updates the same post).<\/li>\n<li>Promote draft-to-publish on the same post when slug matches.<\/li>\n<li>Skip duplicate hero image sideloading when the source URL is unchanged.<\/li>\n<li>Add response metadata for create\/update operations.<\/li>\n<\/ul>\n\n<h4>0.1.2<\/h4>\n\n<ul>\n<li>Internal improvements and compatibility updates.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Settings screen for API key.<\/li>\n<li>REST endpoint for ping, draft, and publish modes.<\/li>\n<li>Optional featured image sideloading.<\/li>\n<li>Meta description support.<\/li>\n<\/ul>","raw_excerpt":"Keytomic companion plugin that receives blog drafts via API and saves them as WordPress posts (draft or published).","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/mlt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/277655","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mlt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/mlt.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/mlt.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=277655"}],"author":[{"embeddable":true,"href":"https:\/\/mlt.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/salam09"}],"wp:attachment":[{"href":"https:\/\/mlt.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=277655"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/mlt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=277655"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/mlt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=277655"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/mlt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=277655"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/mlt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=277655"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/mlt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=277655"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}