Get started

Errors & retries

Errors use plain HTTP status codes, and every error body has a stable code you can branch on.

Error shape

Branch on code; show error to people; log requestId.

Response · 422
{
  "error": "This Idempotency-Key was already used with a different request body.",
  "code": "idempotency_key_reuse",
  "requestId": "req_…"
}

Status codes

StatusMeaning
200Success. For a synchronous publish where every network failed, the body says so per target.
201Created — a draft, a scheduled post, or a publish that fully succeeded.
202Accepted and queued. Read the post, or wait for a webhook, to see the result.
207Partial: some networks published and some failed. Not an error — the successes are live.
400The request is malformed or a field is invalid.
401Missing, wrong, revoked or expired API key.
402A plan limit: no active plan or trial, bulk connect outside the Unlimited plan, or X before the plan is paid.
403The key lacks the scope, or the member lacks access to that account, group or ecosystem.
404Not found, or not visible to this key.
409A conflict: duplicate content within 24 hours, or the same request already in progress.
410A headless connect token expired.
422Validation failed, or an Idempotency-Key was reused with a different body.
429Rate limited. Wait for the seconds in Retry-After.

Error codes

codeWhat to do
unauthorizedThe key is missing or invalid.
forbiddenThe key or member may not do this.
rate_limitedOver this key's read or write budget for the minute. Wait for Retry-After.
too_many_targetsThe post has more targets than the per-post maximum (1,000 by default). Split it.
invalid_idsGET /posts?ids= needs 1–100 comma-separated post UUIDs.
validation_failedThe post isn't valid for one or more of the selected networks — too long, wrong media, and so on.
idempotency_key_requiredPOST /posts with an API key needs an Idempotency-Key header.
idempotency_key_reuseThat key was used before with a different body.
request_in_flightAn identical request is still running. Wait, then resend to get its result.
duplicate_contentThe same content went to the same accounts in the last 24 hours. The body includes existingPostId.
account_not_foundA target accountId is unknown or not available to this key.
group_emptyA groupId has no accounts you can publish to.
group_forbiddenA group is outside the ones this key or member may publish to.
ecosystem_forbiddenA target account is outside the ecosystems this member can access.
scheduled_in_pastscheduledFor is in the past.
conflicting_scheduleChoose one of publishNow, scheduledFor or useQueue.
invalid_timezonetimezone is not a valid IANA zone, such as Asia/Kolkata.
queue_unavailableThe queue doesn't exist, is paused, or has no free slot.
queue_forbiddenYou can only queue into your own schedule.
media_unreachableA media URL could not be fetched publicly. The body includes the url.
media_rejectedA media upload was refused (type or size).
unsupported_platformA target is on a network that can't be published to.
plan_requiredThe plan doesn't allow it: start a trial or choose a plan in Billing, use an ecosystem (bulk connect is on Unlimited), or wait for a paid plan to connect X.

Partial results

A post to several networks can succeed on some and fail on others. That is 207 (or the post.partial webhook), not a failure: the successful posts are live. Each failed target carries an error with a message, a source (user, platform or system) and a category:

categoryMeaning
auth_expiredThe account's access expired. Reconnect it; retrying won't help.
user_contentThe network rejected the content — too long, wrong media. Fix and retry.
platform_rejectedThe network refused for its own reasons, such as policy.
rate_limitedThe network is throttling. Safe to retry later.
system_errorSomething failed on our side or the network's. Safe to retry.
unknownUnclassified. Check the message.

Retrying safely

  • Timeouts and network errors: resend POST/posts with the same Idempotency-Key and body. You get the original response back (with an Idempotent-Replayed: true header), never a second post. Keys are remembered for 24 hours.
  • Failed networks: call POST/posts/{id}/retry. It re-runs only the failed targets, so networks that already published are left alone.
  • 429: wait the number of seconds in Retry-After.
  • auth_expired: don't retry — reconnect the account first.