> ## Documentation index
> Fetch the complete documentation index at: https://dash.robopost.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Errors

An error answers with a status code and a JSON body with a readable `msg` and a stable `code`. Branch on
`code`, never on `msg`, which may be reworded.

```json
{ "msg": "The post changed since you read it. Read it again and retry.", "code": "REVISION_MISMATCH", "current_revision": 7 }
```

Validation errors (`422`) use the standard shape instead: `{"detail": [{"loc": [...], "msg": "...", "type": "..."}]}`.

## Status codes

| Status | Meaning | Retry? |
| --- | --- | --- |
| `200`, `201`, `202` | Done (`202`: queued) | |
| `400` | The request is wrong (`code` says how) | No, fix it |
| `401` | Missing or invalid API key | No |
| `403` | The plan doesn't include this (`PLAN_NOT_ELIGIBLE`) | No |
| `404` | Not found in your team | No |
| `409` | Conflicts with the post's current state | After reading the post again |
| `412` | `If-Match` revision is outdated | After reading the post again |
| `415` | Unsupported file type | No |
| `422` | The body doesn't match the schema, or an idempotency key was reused | No |
| `502` | The social network refused the action | Later, after checking the channel |
| `5xx` | Robopost error | Yes, with the same `Idempotency-Key` |

## Error codes

| Code | Where | Meaning |
| --- | --- | --- |
| `CHANNEL_NOT_FOUND` | create, edit | Not one of this team's live channels |
| `CHANNEL_IDS_REQUIRED` | create | No channels and not a draft |
| `MEDIA_NOT_FOUND` | create, edit | A media ID isn't in this team's library |
| `PLAN_LIMIT_HIT` | create, schedule | The plan's scheduled-post limit is reached |
| `ACCOUNT_USAGE_FROZEN` | create, schedule | The subscription isn't active |
| `INVALID_IDEMPOTENCY_KEY` | create | Key empty, too long or has spaces |
| `IDEMPOTENCY_KEY_REUSED` | create | Same key, different body |
| `IDEMPOTENCY_REQUEST_IN_PROGRESS` | create | Same key still running; wait `retry_after_seconds` |
| `POST_NOT_FOUND` | any post call | No such post in your team |
| `REVISION_MISMATCH` | edit, delete | Changed since you read it |
| `POST_IS_PUBLISHING` | edit, delete | Being published right now |
| `POST_ALREADY_PUBLISHED` | edit | Live already; delete and recreate instead |
| `MEDIA_NOT_READY` | edit | Media still being prepared |
| `POST_DELETED` | edit | It was removed |
| `POST_IN_COLLECTION` | edit | Collection posts can't change status |
| `POST_HAS_NO_CHANNEL` | edit | A multi-channel draft can't be scheduled as one post |
| `RETRY_COULD_DUPLICATE` | edit | The network may have published it; check first |
| `INVALID_STATUS`, `INVALID_SORT`, `INVALID_ORDER`, `INVALID_CURSOR`, `INVALID_IF_MATCH` | lists, edit | A parameter has a wrong value |
| `INVALID_WEBHOOK_URL`, `TOO_MANY_WEBHOOKS`, `WEBHOOK_NOT_FOUND` | webhooks | See [webhooks](https://dash.robopost.app/docs/api/changes-and-webhooks.md) |
| `NETWORK_NOT_SUPPORTED`, `NETWORK_REJECTED_COMMENT`, `NETWORK_REJECTED_DELETE` | inbox | See [social inbox](https://dash.robopost.app/docs/api/social-inbox.md) |
| `PLAN_NOT_ELIGIBLE` | analytics refresh | Analytics aren't in the plan |

A post that fails to publish isn't an API error: the post gets `status: failed` and a `failure` object.
See [List and read posts](https://dash.robopost.app/docs/api/list-and-read-posts.md#failures).

## Next

[Dashboard vs API](https://dash.robopost.app/docs/api/capabilities.md)
