Developers
Create, review, and schedule social posts
Create text, image, carousel, Reel, and Story posts; understand media limits, approval behavior, scheduling conflicts, and platform review settings.
Updated
Create a reviewable post
POST /v1/posts requires platform and body. It creates a draft unless you supply a future schedule_at. The publish scope is required. body accepts 1–4,000 characters and hashtags up to 500; platform-specific requirements still apply when publishing.
{
"platform": "linkedin",
"body": "Three questions we ask before estimating a repair: what changed, when did it start, and can we reproduce it?",
"brand_id": "YOUR_BRAND_ID",
"kind": "image",
"asset_ids": ["YOUR_ASSET_ID"]
}Replace the ID placeholders with strings returned by your own account. Upload media before creating the post. asset_ids preserves order and can contain repeated IDs. The generic limit is 20 attachments; the platform's smaller limit takes precedence.
Choose a supported media shape
| Platform | Supported public post shapes |
|---|---|
| Image: 1 image. Carousel: 2–10 images/videos. Reel: 1 video. Story: 1 image or video. | |
| Text, 1–10 images, Reel/feed video: 1 video, Story: 1 image or video. | |
| Threads | Text, image: 1, carousel: 2–20 images/videos, video using kind reel: 1 video. |
| Text, image: 1, carousel: 2–20 images. Uses multi-image publishing, not PDF documents. | |
| Bluesky | Text or 1–4 images through create_post. |
| TikTok | Reel: exactly 1 video; requires creator review settings. |
| YouTube | Reel: exactly 1 video; connection is preview-gated and requires per-post settings. |
| Image: 1 image, or reel: 1 video; requires a connected account and board selection. |
When kind is omitted, multiple assets infer a carousel on Instagram, Threads, and LinkedIn, and a multi-photo image post on Facebook and Bluesky. Explicit carousel on Facebook or Bluesky means the same multi-photo post. Story is never inferred: request kind: story deliberately because the platform does not display its stored body as a caption.
Registry channels such as Mastodon, WordPress, Ghost, Telegram, Discord, and newsletters accept their channel slug as platform. Connection fields, required destination settings, and supported media vary by channel. Complete the connection and any per-post choices in Krevaya before scheduling; missing required settings hold the post.
Schedule a new or existing post
For a new post, set schedule_at to a future ISO-8601 timestamp. Include Z or a UTC offset to make the intended instant explicit. An offset-free timestamp is interpreted as UTC. A successful creation returns status: scheduled and scheduled_at; it has already authorized future publication.
{
"platform": "linkedin",
"body": "The repair intake checklist is ready for our next workshop.",
"brand_id": "YOUR_BRAND_ID",
"schedule_at": "2027-01-19T15:00:00Z"
}Replace the sample time with your intended future time. To schedule an existing post, call MCP schedule_post with post_id and optional when. Omitting when chooses the platform's next free posting slot. For an external key, schedule_post also approves a draft or rejected post; treat that call as an approval and scheduling decision.
A second post from the same account on the same platform cannot hold the same minute, even across brands. REST returns 409 for a collision. Choose a different minute or use schedule_post without when to ask for the next free slot.
Record the user's review decision
| MCP tool | Effect |
|---|---|
| approve_post | Approve the specified draft |
| reject_post | Reject with optional reason and code |
| favorite_post / unfavorite_post | Set or clear an explicit preference signal |
| update_post | Change body and/or hashtags; refuses publishing, published, or failed posts |
| unschedule_post | Remove a scheduled slot and return the post to draft |
Use a concrete rejection reason, such as ‘The pricing claim is not on our current price list.’ The countable codes are off_voice, wrong_topic, too_salesy, factually_off, bad_hook, too_long, and other. Approval, rejection, and starring affect learning; record the user's decision rather than inventing a preference.
Account for platform-specific review
TikTok needs a human to choose the post's visibility and interaction settings. YouTube requires visibility and a made-for-kids answer. Pinterest requires a board. These settings use signed-in dashboard routes, not /v1. Creating a draft through the API does not supply the missing choices. YouTube remains preview-gated. Pinterest is available publicly and requires the reviewer to choose a board; Krevaya does not automatically approve or draft Pins.
Threads videos must be MP4 or MOV and satisfy Meta's limits. URL ingest does not always record duration and dimensions, so a file can upload successfully and still fail at publication. Read post.failed events and the post's error instead of treating an accepted draft as proof of publishability.
Frequently asked questions
Can I schedule an existing post over REST?
The public /v1 API schedules at creation through schedule_at. To schedule an existing post with an API key, use the MCP schedule_post tool.
Why did an unscheduled post return to drafts?
unschedule_post clears its slot and changes its status to draft, matching the dashboard. It does not reject the post or leave it approved for automatic publication.