| body | Yes | Post content as markdown. Raw HTML is stripped. A YouTube URL alone on its own line becomes an embedded player. | |
| slug | No | URL slug, e.g. "hello-world": 2–100 lowercase letters, digits and hyphens, no hyphen at either end. The post lives at {blog_url}{slug}/. Omit to derive it from the title. Cannot be changed later; "lang" is reserved. | |
| tags | No | Tags shown on the post page, e.g. ["ai", "travel"]. Defaults to none. | |
| title | Yes | Post title, 1–200 characters. The slug is derived from it when `slug` is omitted. | |
| author | No | Author name, up to 100 characters. Used in the page's metadata, the feed and the markdown source. | |
| status | No | "published" (default) puts the post live immediately; "draft" saves it without publishing. | published |
| blog_id | No | Your blog's id, as returned by signup. Optional with an API key: it defaults to the key's blog, and any id you pass must be that blog. Required when the server runs without API keys. | |
| excerpt | No | Summary shown under the title in the post list, up to 300 characters. Omit to derive it from the body. | |
| language | No | Language of this post as a BCP-47 tag, e.g. "en", "ru", "pt-BR". Omit to inherit the blog's language. | |
| seoTitle | No | Title for search results and link previews, up to 200 characters. Defaults to `title`. | |
| coverImage | No | Cover image URL (http/https), shown above the post and used as its link-preview image. Use an uploaded image URL or any public image URL. | |
| translationOf | No | Slug of an existing post in this blog that this post translates. The two become a translation group: one post per language, cross-linked with hreflang and a language switcher. Set `language` to the translation's language; it must differ from every other member's. | |
| seoDescription | No | Description for search results and link previews, up to 300 characters. Defaults to the excerpt. | |
| idempotency_key | No | Optional retry key, any unique string (e.g. a UUID). Retrying with the same key and identical arguments returns the first result instead of writing again; the same key with different arguments fails with IDEMPOTENCY_KEY_CONFLICT. Scoped to your API key and this tool. | |