# Errors

> Every Distilled API error has the same body: a short code and a detail that says what went wrong. Each code, its HTTP status and what it means.

Every error has the same body: a short code, and a detail that says what went wrong when there is more to say.

409 Conflict:

```json
{
  "error": "leased",
  "detail": "phone phone-1 is held by run run_5t1x"
}
```

| Status | Code | Means |
| --- | --- | --- |
| 400 | `bad-request` | The body or query failed validation, or is over 1 MB. The detail names the field. |
| 401 | `unauthorized` | The key is missing, unknown or revoked. |
| 402 | `payment-required` | Your balance does not cover it. Adding phones needs a month of each monthly one, or 24 hours of each charged by the minute, and a phone cannot start while the balance is used up or short of the month it needs. Top up and try again. |
| 403 | `forbidden` | The key lacks the scope this route needs. |
| 404 | `not-found` | Nothing with that id in your workspace. |
| 409 | `leased` | A run or another key holds the phone. |
| 409 | `busy` | The phone already has two commands in flight. Wait for one to finish. |
| 409 | `preempted` | Someone took over the phone in the live view. |
| 409 | `not_running` | The phone is off. |
| 409 | `proxy-in-use` | A phone still goes out through the proxy you tried to remove. |
| 422 | `unprocessable` | The request is well formed but cannot apply. |
| 429 | `throttled` | Too many requests. Wait as long as Retry-After says. |
| 429 | `budget` | Your runs have used the day's model allowance. |
| 503 | `unavailable` | Something the request needs is down for a moment. Retry with backoff. |
| 503 | `node_offline` | The machine the phone runs on cannot be reached. |
| 503 | `exits-exhausted` | No fresh exit is ready to rotate to. More are being vetted, so try again later. With `reason: none-clean`, the city you named has none, so pick another. |
| 504 | `timeout` | The phone did not answer in time. |

An id that belongs to another workspace returns `404`, the same as one that does not exist, so ids never reveal what other workspaces hold.

Source: https://distilled.cx/docs/errors/
