Create post
create_postPublish a blog post to Ghost or WordPress with support for drafts, scheduling, multiple authors, images, and SEO metadata.
Instructions
Publish an article. Defaults to status "published" — pass "draft" only when the user asked for a draft, or "scheduled" with publish_at to go live at a set time. The author accepts a persona slug and resolves to that site's author id. HTML must not still contain [[content_image]]. Every article gets a hero (feature_image) and an inline by default when an image provider is configured — refused otherwise; pass images: "hero" | "inline" | "none" to opt out.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| faq | No | Builds FAQPage JSON-LD. Must match the visible FAQ section exactly. | |
| html | Yes | ||
| site | Yes | ||
| tags | No | ||
| title | Yes | ||
| author | No | Byline. Either a persona slug (resolved to that site's author id) or a raw platform-native author id, to attribute the post to someone with no persona file — the id's format is specific to the target site's platform and is not the same across every site. Omit to use the site default_author. Run list_authors against the target site to find its ids. | |
| images | No | Which of the hero image (feature_image) and the in-body <img> are required before publishing. Only enforced when an image provider is configured; pass "none" if this article genuinely has no image. | both |
| schema | No | Inject Article (+FAQPage) JSON-LD into the page head for AEO/GEO | |
| status | No | "published" goes live now, "draft" is not visible, "scheduled" goes live at publish_at (which is then required). | published |
| keywords | No | Feeds Article JSON-LD | |
| og_image | No | Defaults to feature_image | |
| og_title | No | Facebook/LinkedIn card title | |
| meta_title | No | SEO title; defaults to title | |
| publish_at | No | When the post should be published, as a date and a time of day — "2026-08-04T10:00". **It is read in the TARGET BLOG'S OWN timezone, never yours and never the user's.** So "publish at 10am tomorrow" is simply "2026-08-04T10:00": pass the wall-clock time the user said, verbatim. Do NOT convert it to UTC, do NOT convert it to your own timezone, and do NOT ask the user which timezone they mean — the blog decides, and Byline looks its timezone up from the platform. The same string sent to two blogs in two countries is two different instants, on purpose. An explicit offset ("2026-08-04T10:00:00+05:30" or "...Z") is also accepted and is then taken at face value, but only use one if the user actually named a timezone. Required with status "scheduled", where it must be at least 2 minutes in the future. With status "published" it must be in the PAST — that backdates the post; a future time with status "published" is refused, because Ghost would publish it immediately while WordPress would schedule it. The result reports publish_at_local, the time as the blog's own clock reads it — tell the user that one, not the UTC value. | |
| canonical_url | No | ||
| feature_image | No | URL from upload_image | |
| twitter_image | No | Defaults to feature_image | |
| twitter_title | No | X card title | |
| custom_excerpt | No | Shown in listings and feeds | |
| og_description | No | ||
| feature_image_id | No | The native id upload_image returned alongside the url (its `id` field), needed by platforms that reference media by id rather than URL — e.g. WordPress's featured_media. Ghost has no such field and ignores this. | |
| meta_description | No | ||
| feature_image_alt | No | ||
| twitter_description | No | ||
| feature_image_caption | No |