POST/posts
Create or schedule a post with the PostEverywhere API
Omit `scheduled_for` to publish immediately; provide it (ISO 8601, assumed UTC when no offset given) to schedule. Set `draft: true` to save a native draft instead (no destinations are created and nothing publishes until `POST /posts/{id}/schedule`). Attach media by id (see [media requirements per platform](/media-requirements)), and use `platform_content` for per-platform overrides — the [Platform Guides](/platforms/instagram) document every option. Field-name handling: camelCase aliases (`accountIds`, `mediaIds`, `scheduledFor`, `platformContent`) and the deprecated `scheduled_at` alias are accepted. Fields whose names imply a different shape (`media`, `media_id`, `mediaId`, `attachments`) are rejected with `400 invalid_field_name`. Content rules: `content` may be omitted only when `platform_content` provides at least one per-platform caption or media is attached. Max 10,000 characters. Max 50 `account_ids`. Instagram captions with more than 30 hashtags are rejected (`instagram_hashtag_limit_exceeded`). WordPress blog posts use `platform_content.wordpress` (see `WordPressBlogPost`). Bad settings return `400 wordpress_post_invalid` with every problem in `details.errors`; a WordPress target with no title returns `400 wordpress_title_required`. A long blog body goes in `platform_content.wordpress.content` (up to 200,000 characters), not in `content`. Google Business Profile posts use `platform_content.google_business` (see `GoogleBusinessPost`): text up to 1500 characters, at most 1 photo, no video. A post that breaks a rule returns `400 google_business_post_invalid` with every problem in `details.errors`. Media referenced by `media_ids` must exist in the workspace and be `ready` (`media_not_found` / `media_not_ready` otherwise; media stuck in `uploading` is auto-finalized via the `/complete` flow when the file was actually uploaded). Platform media requirements are validated pre-flight (`platform_requirement_violation`, e.g. video to Pinterest). Not accepted: `schedule_at` (MCP only; the REST API returns `400 unsupported_schedule_at` instead of publishing now; call `GET /best-times` and send its time as `scheduled_for`), and `request_approval` without `draft: true` (`400 request_approval_needs_draft`). `timezone` is stored for display only: `scheduled_for` without an offset is read as UTC. Settings: the snake_case spellings first_comment, alt_text, media_alt_text, reply_settings, privacy_level, disable_comment, disable_duet, disable_stitch, video_type, cover_photo_url, topic_tag, link_attachment, board_id, board_section_id, comment_status are accepted and stored as the camelCase keys the publishers read. Facebook `contentType` Reels posts a video as a Reel; Post or Video posts it as a regular video (a landscape video always posts as a regular video). First comments are not available on Instagram, Facebook, LinkedIn, Threads and YouTube yet. They work on X. A first comment sent for those platforms is removed and the response `notes` say so. `notes` also warns when a cover image from `cover_photo.media_id` is a 7-day link and the post goes out later than that. A circuit breaker refuses a request body that has already failed 5+ times in 6 hours for the same key with `422 permanent_failure_circuit_breaker` — change any field to reset. Error codes: `invalid_json`, `wrong_content_type_for_endpoint`, `invalid_field_name`, `validation_error`, `content_too_long`, `account_ids_required`, `too_many_accounts`, `invalid_timezone`, `invalid_accounts`, `instagram_hashtag_limit_exceeded`, `invalid_datetime`, `past_schedule_time`, `media_not_found`, `media_not_ready`, `platform_requirement_violation`, `post_creation_failed`, `rate_limit_exceeded`, `permanent_failure_circuit_breaker`, `x_article_invalid`, `wordpress_post_invalid`, `wordpress_title_required`, `google_business_post_invalid`, `unsupported_schedule_at`, `request_approval_needs_draft`, `campaign_not_found`.
Guides: Quick start: create your first post · Bulk operations guide
This endpoint accepts a JSON request body. See the posts guide for a worked example.
Responses
- 201Post created. Regular creates return the full publishing topology (`destinations`); `draft: true` returns the smaller draft shape with `next_steps`.
- 400
- 401
- 402
- 403
- 422Circuit breaker open for this exact request body
- 429
- 500