---
title: Errors
status: current
phase: 3
order: 1
---

# Errors

Every API error has this shape:

```json
{ "error": { "code": "…", "message": "…", "fix": "…", "doc_url": "…", "details": { } } }
```

- `code` never changes: it is what your code compares against.
- `message` and `fix` are for people and agents: what happened and how to fix it.
- `details` (optional) points to the field or parameter at fault.

| Code | HTTP | What happened |
| --- | --- | --- |
| [`missing_key`](missing_key.md) | 401 | The key is missing. |
| [`invalid_key`](invalid_key.md) | 401 | The key does not exist or was revoked. |
| [`wrong_space`](wrong_space.md) | 403 | This key belongs to another site. |
| [`key_cannot`](key_cannot.md) | 403 | This key cannot do that. |
| [`not_found`](not_found.md) | 404 | It does not exist. |
| [`invalid_parameter`](invalid_parameter.md) | 400 | A parameter is not valid. |
| [`validation_failed`](validation_failed.md) | 422 | The data did not pass validation. |
| [`version_conflict`](version_conflict.md) | 409 | Someone saved another version in the meantime. |
| [`invalid_body`](invalid_body.md) | 400 | The request body is not valid JSON. |
| [`invite_used`](invite_used.md) | 410 | This invite link has already been used. |
| [`invite_expired`](invite_expired.md) | 410 | This invite link has expired. |
| [`check_unavailable`](check_unavailable.md) | 422 | The readiness check couldn't run. |
| [`translation_unavailable`](translation_unavailable.md) | 503 | The translation with AI couldn't run. |
| [`rate_limited`](rate_limited.md) | 429 | Too many requests with this token. |
