Skip to main content
Every failed request to the SocialAPI REST API returns a JSON error with an HTTP status, a stable error.code, a human-readable error.message, and a request_id. Branch on error.code, never on error.message: messages change, codes do not. This page lists every code a client using an API key or the MCP server can receive.
request_id is the X-Request-ID request header you sent when it matches ^[a-zA-Z0-9_-]{1,64}$. Otherwise it is 8 lowercase hexadecimal characters that SocialAPI generates. Quote it in support requests: see Debugging. A 429 response carries Retry-After (in seconds) whenever error.meta.retry_after_seconds is present. MCP server. A failed tool call returns isError: true and a text result holding JSON: {"error": "<message>", "code": "<error.code>"}, with the error.meta fields added at the top level. The code values are the ones on this page. A request refused before the tool runs, such as an expired token, returns an HTTP error: see Authentication.

Code namespaces

The first segment of a code tells you which part of the system refused the request. One code has no namespace: ambiguous_post_id.

Authentication and access

Every /v1 request needs Authorization: Bearer <API key>. See Authentication and Scoped API keys. The /oauth/token endpoint answers errors in the OAuth format (error, error_description) instead of this envelope: see OAuth for MCP clients.

Request validation

These codes apply to any endpoint. error.meta.field names the offending input when the input is a single field.

Not found, conflicts, and unsupported operations

Rate limits

Rate-limit codes are 429 and are covered in Rate limits, which says what each limit counts and how to retry.

Billing and plan allowances

Allowances and billing periods are defined in Plans and usage.

Connect an account

These codes come from POST /v1/accounts/connect, the steps that follow the consent screen, and the Page and location pickers. See Connect accounts for the flow. A code marked Redirect has no HTTP status: it reaches your redirect_uri as status=error and error=<code>, with error_description.

BYOK app credentials

Platforms that use your own app (X) return these codes.

Brands, invites, and keys

An empty GET /v1/invites list does not mean POST /v1/invites succeeds: the brand can already hold a connected account for the platform. Check GET /v1/accounts as well.

Publish a post

These codes come from POST /v1/posts, POST /v1/posts/validate, the post lifecycle endpoints, and the post media fields. Platform-specific media rules are under Platform-specific codes. See Publishing and Delivery. POST /v1/posts can also return the billing.* and validation.post_limit_exhausted codes in Billing and plan allowances. Publishing failures that happen after the request returns appear on the post: see Delivery failures.

Delivery failures

A target that fails after POST /v1/posts returned is a failed delivery. It does not return an HTTP error. Its code is in targets[].error.code on the post (GET /v1/posts/{pid}) and in results[].error.code of the post.failed and post.partial webhooks. GET /v1/events has no error code. See Delivery.

Inbox: comments, messages, and reviews

See Comments, Direct messages, Reviews, and Mentions. Messages and replies spend interaction credits, so they can also return validation.interaction_limit_exhausted. WhatsApp messaging errors are in WhatsApp. Telegram’s are in Telegram.

Automations

Returned by POST /v1/automations and PATCH /v1/automations/{id}. The rules behind each code are in Automations. A definition that breaks a rule returns 400 with one of these codes, and error.meta.field points at the offending field (for example steps[1].buttons). An action that fails when an Automation runs is not returned as an error. It is recorded on the run with the same code the API call would have returned: see Firings.

Webhooks

Media library and exports

Analytics and insights

Google Business Profile

Platform-specific codes

Instagram and Facebook

Threads

TikTok

A TikTok code that this table does not list returns 502 with the code after platform.tiktok..

X, LinkedIn, YouTube, and Zalo

WhatsApp

WhatsApp has the most codes because of its messaging window, frequency caps, and template states. See WhatsApp.

Telegram

Zalo

platform.zalo.not_deliverable is the most common: Zalo allows a customer service message within 7 days of the person’s last interaction with your Official Account (free within 48 hours), and refuses later sends with 422.

Bluesky

platform.bluesky.dm_scope_missing affects only the DM endpoints. Treat it as a failure of one capability, not a dead connection.

Pinterest

Platform errors

When a platform refuses a call, the code is platform.<name>.<reason>, where <name> is the platform slug. SocialAPI forwards the platform’s HTTP status when it maps one, and returns 502 otherwise. Branch on the prefix and suffix: platform. with .auth means reconnect, with .rate_limit means back off.

System errors

Handling errors

Read error.code from the response, then branch. Reconnect on a dead token, back off on a throttle, show the field on a validation failure, and log request_id for anything else.
For a 429 without meta.retry_after_seconds (a platform limit), wait and retry with backoff. A plan allowance such as validation.post_limit_exhausted does not clear until the billing period ends: check GET /v1/usage.
Last modified on October 19, 2026