Errors
Stable error codes, the envelope format, and what to do about each.
{
"error": {
"code": "text_too_long",
"message": "Text is 341 characters but X (Twitter) allows 280. Shorten it or split the post."
}
}Codes
| Parameter | Type | Description |
|---|---|---|
| missing_access_token | 401 | No Authorization header — send `Bearer <token>` |
| invalid_access_token | 401 | Key revoked/unknown or OAuth token expired |
| invalid_parameters | 400 | Malformed body — the message names the field |
| invalid_json | 400 | Body is not valid JSON |
| text_too_long | 400 | Exceeds a target network's character limit |
| channel_not_found / not_found | 404 | Unknown id in this workspace |
| update_already_sent | 400 | Sent updates are immutable |
| invalid_state | 400 | Action not valid for this update's status |
| channel_exists | 409 | Network already connected to the workspace |
| plan_limit_reached | 403 | Channel/seat/webhook limit — upgrade or clean up |
| quota_exceeded | 403 | Successful-post quota exhausted on a hard-capped plan |
| rate_limit_exceeded | 429 | Slow down — the per-minute limiter includes `Retry-After`; monthly-quota exhaustion describes the reset in the message |
| internal_error | 500 | Our fault; retry with backoff |
Zero surprise deprecations
Breaking changes are announced in the changelog at least 90 days ahead, with dual-running periods.