/v1/postscreatePost
Create a post. Creates a post with one variant per target channel. Exactly one mode is required: `draft: true` (save only), `scheduled_at` (future publish), or `publish_now: true` (immediate — requires the workspace's dangerous-operations toggle for API callers). Send an `Idempotency-Key` header to make retries safe.
Idempotent by design
Send an Idempotency-Key header (a UUID) so retries can never double-post. Replays of the same key + body return the recorded response with Idempotency-Replayed: true; the same key with a different body is rejected with 422 idempotency_key_reused. Ledger window: 24 hours. Details: idempotency docs.
Headers
Idempotency-KeystringoptionalClient-chosen key (1–255 printable ASCII chars, e.g. a UUID) making this POST safely retryable: within 24h, the same key + same body replays the original response with `Idempotency-Replayed: true`; the same key with a DIFFERENT body is rejected with 422 `idempotency_key_reused`.
Request body
variantsarray of objectrequiredOne variant per target channel.
channel_idstringrequiredA connected channel's `id` (see /v1/channels).
bodystringrequiredThe text to publish to this channel.
mediaarray of PostMediaItemoptionalMedia attachments for this channel.
titlestring | nulloptionalInternal title (not published).
bodystring | nulloptionalOptional channel-agnostic base text.
draftbooleanoptionalSave as a draft (no scheduling, no publishing).
scheduled_atstring (ISO-8601)optionalFuture publish time (ISO-8601). Mutually exclusive with `draft` and `publish_now`.
publish_nowbooleanoptionalPublish immediately. Requires the workspace's dangerous-operations toggle for API callers.
Depth-limited view — the interactive reference has every nested schema.
Responses
201PostThe created post.
Errors are RFC 9457 problem+json with a stable code and a request_id — each code above links to its own page.
Example
curl -X POST https://app.usepostify.com/v1/posts \
-H "Authorization: Bearer postify_live_XXXXXXXXXXXXXXXX" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"variants": [
{
"channel_id": "ch_9x2y3z0001",
"body": "Shipping day 🚀 Our new analytics dashboard is live — see what actually lands with your audience."
}
],
"scheduled_at": "2026-08-01T09:00:00Z"
}'