Create draft or scheduled post
postfjord_create_draftCreates a new social post for one or more channels, saved as a draft or scheduled for publishing at a set time. Use it to write content once and validate it per channel before it goes out.
Instructions
Makes one new post. To put a time on a draft that already exists use postfjord_schedule_post, to change one post postfjord_update_post, to move or remove many posts postfjord_bulk_update_posts. Without scheduledAt it is saved as a draft (validation problems are returned so you can fix them). With scheduledAt it must pass validation and becomes scheduled: the engine publishes it at that time. Check the brand profile and channel limits first. Instagram requires at least one image or video (mediaIds from postfjord_list_media). Send dry_run: true first to check a post before it is scheduled. Pictures: every channel sends its own shape. Before scheduling, call postfjord_preview_post and show the person the picture of each channel. Where a crop would cut off a person (a head, hands, feet) or words in the picture (a poster, a menu, a quote), set that picture's fit to { mode: "whole" } in targets, or move focus to what must stay, then preview again. On a retry after a timeout or error, send the same idempotency_key: the first answer comes back and nothing is made or sent twice.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| link | No | URL for platforms that support links in the text. | |
| intent | No | give: the post helps, teaches or entertains. ask: it asks people to buy, book, sign up or click. Left out, Postfjord labels it when it is scheduled. | |
| pillar | No | Content pillar label, for your own planning. | |
| bioLink | No | Where a tap on this post on your link in bio page goes. Never added to the post. On update, send it alone to change it on a published post (needs a key that may publish). An empty string removes it. | |
| dry_run | No | true: save nothing, and answer what would be made: draft or scheduled, the channels, the time in the workspace time zone, the problems and what would refuse it (ok, blockers). | |
| targets | No | Per-channel overrides keyed by channel id. | |
| baseText | Yes | The post text used on every channel unless overridden in targets. | |
| mediaIds | No | Ids from postfjord_list_media, in display order. | |
| videoPage | No | false: this video gets no video page on postfjord.page when it goes out. Left out, the workspace setting decides (see postfjord_list_pages, videoPages). | |
| channelIds | Yes | Ids from postfjord_list_channels. May be empty for a draft; scheduling needs at least one. | |
| scheduledAt | No | ISO 8601 date-time with its time zone offset, e.g. 2026-09-10T08:00:00-04:00. A time without one is refused. | |
| idempotency_key | No | Your own id for this one action, for example post-20261006-launch. Make a new one for each new thing; send the same one again only when you retry. Left out, the exact same call within 10 minutes counts as a retry. |