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.
Facebook allows 30 API-published Reels per Page in a moving 24-hour window. A post whose platform_options.facebook.type is reel is refused when a selected Page would be at that limit at the post’s publish time (Reels published plus Reels already scheduled in the 24 hours before it): 422 PLATFORM_DAILY_LIMIT_REACHED, with details carrying account_id, limit, used and next_available_at. Nothing is created. If a scheduled Reel still hits the limit when it publishes, that account’s result fails with PLATFORM_DAILY_LIMIT_REACHED and is not retried automatically.
Requires scope social:write.
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.

