# Errors

Every error response shares the same shape:

```json
{ "error": "widget_not_found", "message": "No widget with that ID exists." }
```

## Status codes

| Status | Meaning |
|---|---|
| `400` | Malformed request - check the error `message` for which field failed |
| `401` | Missing, invalid, or expired API key - see [Auth](/docs/core/2026-01/guides/auth/) |
| `404` | The resource doesn't exist, or you don't have access to it |
| `429` | Rate limit exceeded - see [Rate limits](/docs/core/2026-01/guides/rate-limits/) |
| `500` | Something went wrong on our end - safe to retry with backoff |

<Callout type="danger">
  Never retry a `400` or `401` without changing the request first - retrying a malformed or unauthenticated request just repeats the same failure and wastes part of your rate-limit budget.
</Callout>