The error envelope
Errors return an appropriate HTTP status and this JSON body:code is stable and machine-readable; branch on it, not on message (messages may be reworded). Rate-limit errors add a retry_after field inside the envelope.
Legacy exception: subscription errors
One middleware predates the v1 envelope and is shared with the SuperX app, so two subscription-related responses use a plain stringerror field instead of the object envelope:
403when the subscription has lapsed (string starts withsubscription_required:)500if subscription verification itself fails (string starts withinternal_error:)
error is a string or an object. All other errors, including every other 403, use the object envelope.
Error codes
Retired code:
media_not_supported (posts were text-only before 2026-07-09). Posts now take images via POST /v1/media plus parts[].media; a top-level media field on the create or update body returns 400 invalid_parameter with a message pointing at parts[].media.
Fail-closed behavior
When the API cannot verify something, it refuses rather than guesses: unverifiable linked or shared accounts return503 accounts_unavailable (never stale data), and an unreachable scheduling service returns 503 upstream_unavailable (never a silent success).