Skip to content

Every post flows through the same five-stage pipeline, regardless of whether you're using the SDK, CLI, MCP, or REST API.

The states

pending → processing → publishing → completed
                                  ↘ partial_failure
                                  ↘ failed

Plus two start states:

  • draft — created with saveDraft: true, waiting for publishDraft()
  • scheduled — created with scheduledAt, waiting for the scheduled time

What each state means

StatusWhat's happening
pendingQueued; about to be picked up
processingMedia being transcoded / validated
publishingFanning out to each connected platform in parallel
completedEvery channel succeeded
partial_failureSome channels succeeded, some failed
failedAll channels failed
draftSaved, not yet published
scheduledWill publish at scheduledAt

The fan-out

A single post with N connections produces N channels — one per connection. Each channel publishes independently:

typescript
const status = await socifyr.uploads.getStatus(uploadId)
//  {
//    status: 'partial_failure',
//    channels: [
//      { platform: 'instagram',
//        result: { status: 'success', postUrl: 'https://instagram.com/p/...' } },
//      { platform: 'x',
//        result: { status: 'failed', error: 'rate limit exceeded' } },
//    ]
//  }

If one channel fails, the others are unaffected.

Retrying

uploads.retry(id) re-queues only the failed channels:

typescript
await socifyr.uploads.retry(uploadId)

Successful channels are skipped via an idempotency guard — you can't double-post.

Polling vs webhooks

ApproachWhen to use
Polling (getStatus / --wait)Scripts, CLI users, one-off jobs
WebhooksProduction apps — get a push when state changes

See Webhooks for the full setup.

Timing

Typical times from publishing to completed:

ContentTime per channel
Text< 2 sec
1–3 images3–10 sec
Carousel (10 images)15–30 sec
Short video (< 60s)30–90 sec
Long video (10+ min)2–10 min

YouTube and TikTok video processing on the platform side can add several more minutes — the result.publishedAt reflects platform-side completion, not just upload.