Schedule post
Pass queue_id (instead of scheduled_time) to drop the post into a posting queue’s next open slot. Supports evergreen recycling via the optional recycle object: each published occurrence automatically schedules the next one until the chain hits its bound.
Authorizations
API key from Developer dashboard (Bearer token).
Headers
Act inside a profile (sub-account) you own: data reads and writes target the profile workspace while billing, rate limits and usage stay on your own account. Requires the profiles:manage scope. Returns 404 for profiles you do not own and 409 for paused profiles.
Client idempotency key (X-Request-Id accepted as an alias). Send a fresh key per logical post and REUSE it when retrying that exact call after a timeout / 5xx / connection reset: the retry returns the original post with HTTP 200 and idempotent_replay: true instead of creating a duplicate. A key permanently identifies its post in the workspace (deleting the post frees the key). See the Idempotency guide.
64^[A-Za-z0-9._:-]{1,64}$Body
Schedule request. Provide scheduled_time (with optional timezone) OR queue_id (next open slot), not both.
Post text content
Target platforms. Use twitter for X and gmb for Google Business. telegram posts via the workspace's connected bot (created with @BotFather); discord posts via the connected server webhook. Both are connected in the dashboard's Social Accounts page.
facebook, instagram, twitter, linkedin, youtube, tiktok, gmb, threads, bluesky, tumblr, telegram, discord IDs of connected social accounts
When to publish (ISO 8601)
Media URLs to attach to the post
URL to include with the post
Schedule into a posting queue instead of a fixed time: the queue's next open slot is resolved server-side and the post occupies it. Mutually exclusive with scheduled_time.
IANA timezone scheduled_time is expressed in (default UTC). Ignored with queue_id (the queue's own timezone applies).
Evergreen recycling: after this post publishes, the next occurrence is automatically scheduled interval_hours later, repeating until a bound is hit. A bound is REQUIRED - set max_repeats and/or until (no unbounded chains). Stop a chain anytime with DELETE /social/posts/{post_id}/recycle.
Skip the 24h duplicate-content guard. Without it, content identical to a post created in this workspace in the last 24 hours is rejected with 409 DUPLICATE_CONTENT (and the charge is refunded).
Per-platform composer options - the same payload the web composer stores; publish handlers read it as-is (unknown keys are ignored, max 20KB). Keyed by platform, e.g. {"tiktok": {"privacy_level": "SELF_ONLY"}, "instagram": {"content": "IG-specific caption"}, "_thumbnail": {"timestamp_ms": 3000}}. Common keys: per-platform content override; tiktok privacy/duet/stitch options; _thumbnail custom video cover. Per-platform STAGGER: give any platform its own scheduled_time here (interpreted in the request timezone) and it publishes at that moment - platforms without one use the request-level scheduled_time. One call, one post per distinct time (response carries staggered[] with the created legs). Not combinable with queue_id or recycle.

