Skip to content

Posts

The posts endpoints publish a rendered clip to your team’s connected social platforms. The flow follows the same draft → edit → publish pattern the dashboard uses, so AI-generated captions are already there when you start.

  1. Generate a clip with POST /v1/clips, then poll GET /v1/clips/:jobId until the clips’ previews are ready.

  2. Drafts auto-create. When a clip’s preview is ready, Choppity generates a draft post per connected platform — one for YouTube, one for TikTok, etc. Each draft has an AI-written, platform-tailored caption (and title for YouTube) ready to review.

  3. Read the drafts with GET /v1/clips/:clipId/posts.

  4. Edit anything you want with PUT /v1/posts/:postId — caption, title, TikTok privacy, YouTube category.

  5. Publish with POST /v1/posts/:postId/publish. Pass a scheduled_at to schedule it for later, or omit it to go out immediately.

Lists every post (drafts, scheduled, published, failed, cancelled) for a clip.

Auth: Bearer JWT or API key

ParamTypeDescription
clipIdstringA clip id from GET /v1/clips/:jobId
{
"posts": [
{
"id": "9d8e7f6a-...",
"clip_id": "fc3eb2a1-...",
"platform": "youtube",
"status": "draft",
"caption": "Three things I wish I'd known about onboarding...",
"title": "How we onboarded 1000 users in a week",
"youtube": { "category_id": "22" }
},
{
"id": "4b3a2c1d-...",
"clip_id": "fc3eb2a1-...",
"platform": "tiktok",
"status": "draft",
"caption": "Three things I wish I'd known... 🧵",
"tiktok": {
"privacy_level": "PUBLIC_TO_EVERYONE",
"disable_comment": false,
"disable_duet": true,
"disable_stitch": true,
"brand_content_toggle": false,
"brand_organic_toggle": false
}
}
]
}

Reads a single post.

Auth: Bearer JWT or API key

{
"post": {
"id": "9d8e7f6a-...",
"clip_id": "fc3eb2a1-...",
"platform": "youtube",
"status": "published",
"caption": "Three things I wish I'd known...",
"title": "How we onboarded 1000 users in a week",
"published_at": 1745800120000,
"published_url": "https://www.youtube.com/watch?v=abc123",
"youtube": { "category_id": "22" }
}
}
FieldTypeDescription
idstringPost id
clip_idstringThe clip the post is for
platformstringyoutube · tiktok · instagram · linkedin
statusstringdraft · scheduled · queued · processing · uploading · published · failed · cancelled
captionstringYouTube description / TikTok / Instagram / LinkedIn caption
titlestringYouTube only
scheduled_atnumberUnix-ms — present when status === "scheduled"
published_atnumberUnix-ms — present when status === "published"
published_urlstringDirect link to the live post — present when status === "published"
errorstringHuman-readable failure reason — present when status === "failed"
tiktokobjectTikTok-only settings (see below)
youtubeobjectYouTube-only settings (see below)
FieldTypeDescription
category_idstringYouTube category id (e.g. "22" for People & Blogs)
FieldTypeDescription
privacy_levelstringPUBLIC_TO_EVERYONE · MUTUAL_FOLLOW_FRIENDS · FOLLOWER_OF_CREATOR · SELF_ONLY
disable_commentbooleanWhen true, comments are turned off
disable_duetbooleanWhen true, duets are turned off
disable_stitchbooleanWhen true, stitches are turned off
brand_content_togglebooleanTikTok branded-content disclosure
brand_organic_togglebooleanTikTok organic-promotion disclosure

Updates a draft post. Only posts with status === "draft" are editable.

Auth: Bearer JWT or API key

FieldTypeDescription
captionstringNew caption (or YouTube description). Platform-specific length limits apply.
titlestringYouTube only — new video title (max 100 chars)
tiktokobjectTikTok-only — partial settings to merge over the existing draft
youtubeobjectYouTube-only — partial settings to merge over the existing draft
Terminal window
curl -X PUT https://api2.choppity.com/v1/posts/$POST_ID \
-H "Authorization: Key $CHOPPITY_KEY" \
-H "Content-Type: application/json" \
-d '{
"caption": "My new caption",
"tiktok": { "privacy_level": "PUBLIC_TO_EVERYONE" }
}'

The full updated post (same shape as GET /v1/posts/:postId).

Publishes a draft. Pass scheduled_at to schedule for later (must be at least 5 minutes in the future), or omit to go out immediately.

Auth: Bearer JWT or API key

FieldTypeDescription
scheduled_atnumberOptional. Unix-ms when the post should publish. ≥ 5 minutes in the future.
Terminal window
# Publish immediately
curl -X POST https://api2.choppity.com/v1/posts/$POST_ID/publish \
-H "Authorization: Key $CHOPPITY_KEY" \
-H "Content-Type: application/json" \
-d '{}'
# Schedule for an hour from now
curl -X POST https://api2.choppity.com/v1/posts/$POST_ID/publish \
-H "Authorization: Key $CHOPPITY_KEY" \
-H "Content-Type: application/json" \
-d "{\"scheduled_at\": $(date -v+1H +%s)000}"

The full post with its new status (queued for immediate, scheduled for future). Subscribe to post.published / post.failed webhook events to learn the outcome without polling.

{
"post": {
"id": "9d8e7f6a-...",
"clip_id": "fc3eb2a1-...",
"platform": "youtube",
"status": "queued",
"caption": "..."
}
}

Cancels a post in draft, scheduled, or queued status. Once a post moves to processing we can no longer pull it back.

Auth: Bearer JWT or API key

The full post with status: "cancelled".

{
"post": {
"id": "9d8e7f6a-...",
"clip_id": "fc3eb2a1-...",
"platform": "youtube",
"status": "cancelled",
"caption": "..."
}
}
Terminal window
# 1. Read drafts
DRAFTS=$(curl -s https://api2.choppity.com/v1/clips/$CLIP_ID/posts \
-H "Authorization: Key $CHOPPITY_KEY")
YT_POST_ID=$(echo "$DRAFTS" | jq -r '.posts[] | select(.platform=="youtube") | .id')
# 2. Edit caption
curl -X PUT https://api2.choppity.com/v1/posts/$YT_POST_ID \
-H "Authorization: Key $CHOPPITY_KEY" \
-H "Content-Type: application/json" \
-d '{ "caption": "My final caption" }'
# 3. Publish now
curl -X POST https://api2.choppity.com/v1/posts/$YT_POST_ID/publish \
-H "Authorization: Key $CHOPPITY_KEY" \
-H "Content-Type: application/json" \
-d '{}'
CodeHTTPWhen
BAD_REQUEST400Invalid body. Common cases: editing a non-draft post, sending title / youtube settings to a non-YouTube post, sending tiktok settings to a non-TikTok post, scheduled_at less than 5 minutes in the future, no active connection for the post’s platform.
UNAUTHORIZED401Missing or invalid credential
NOT_FOUND404postId doesn’t exist on your team