What you need
In the app, open Publishing and add a destination. Only pages that pass the editor's checks, and have finished their hold, are ever sent. Fill in these fields:
| Field | What to enter |
|---|---|
| Create URL | The endpoint that creates a post. We send a POST request with your payload. |
| Update URL (optional) | The endpoint that updates a post, with {{id}} where the post id goes. We send a PUT request. Needed for the second pass that fixes internal links. |
| Auth header | One header line, name and value separated by a colon. |
| Payload template | The JSON body, with placeholders. It must be valid JSON after the placeholders are filled. |
| link_path | A dot path to the public URL in your API's response. |
| id_path | A dot path to the post id in your API's response. |
Example
Create URL: https://api.yourblog.com/posts
Update URL: https://api.yourblog.com/posts/{{id}}
Auth header: Authorization: Bearer xyzEvery request also sends Content-Type: application/json and Accept: application/json.
Placeholders
| Placeholder | Replaced with |
|---|---|
{{heading}} | The page title (the H1). Inserted as an escaped JSON string. |
{{subheading}} | A one-line summary. Escaped JSON string. |
{{html}} | The article body as HTML, without the H1. Escaped JSON string. |
{{keywords}} | A JSON array of strings, inserted as-is. Do not wrap it in quotes. |
{{slug}} | The planned URL slug, such as best-payroll-software-india. Escaped JSON string. |
{{id}} | Your blog's id for the page, from id_path. Filled on updates only. |
{{url}} | The page's public URL, from link_path. Filled on updates only. |
Text placeholders are JSON-escaped, so put them inside quotes in your template. Keywords is already an array, so leave it bare.
Dot paths
link_path and id_path tell us where to find the URL and id in your response. Separate keys with dots. Use a number for an array position.
Response:
{"savedBlogs":[{"_id":"66f1c2","link":"https://yourblog.com/blog/best-payroll-software"}]}
link_path: savedBlogs.0.link -> https://yourblog.com/blog/best-payroll-software
id_path: savedBlogs.0._id -> 66f1c2Presets
Pick a preset in the app and adjust it if your API differs.
Payload template:
{"heading":"{{heading}}","subheading":"{{subheading}}","description":"{{html}}","keywords":{{keywords}}}
link_path: link
id_path: idFor WordPress, the create URL is usually https://yoursite.com/wp-json/wp/v2/posts and the update URL is https://yoursite.com/wp-json/wp/v2/posts/{{id}}. Use an application password in a Basic auth header. The preset creates posts as drafts, so you publish them from WordPress.
Two-pass link resolution
Pages link to each other, but a page's URL is only known after your blog creates it. Drafts therefore write internal links as tokens, such as {{LINK:best-payroll-software}}.
- Pass 1: create. Posted in link order, so a page others link to goes first. Each token becomes the real URL if that page is live, or a placeholder. We keep the URL and id you return.
- Pass 2: update. For each live page whose tokens can now all be resolved, we fill in the real URLs and send the page to your update URL. Pages without tokens are marked done.
Without an update URL, pass 2 is skipped and some links may point to a placeholder until you fix them by hand. A failed update is retried on the next publish run.
What the HTML contains
- The article body in semantic HTML: sections with H2 and H3, lists, tables and FAQ details. No H1, since the title is sent as the heading.
- Scoped styles, so the page looks right inside your theme without changing the rest of your site.
- An answer-first section, a last-verified line, a methodology box and a limits box.
- JSON-LD structured data: Article, FAQPage, and ItemList on best-of list pages.
- A meta block with the title, description and keywords, for your own SEO fields.
- A claim about the wider world with no source stays in an HTML comment marked [VERIFY], never as visible text. Your own prices and features publish as you gave them.
Troubleshooting
The page is marked failed
A non-2xx response marks the page as failed. The first part of your API's response is shown in the app.
The URL is empty after posting
Check
link_pathagainst a real response.The template fails
Check that it is valid JSON and that text placeholders sit inside quotes.
Need help connecting? Contact us.