# Errors and limits

Errors share one body:

```json
{
  "success": false,
  "error": { "code": "NOT_FOUND", "message": "Article not found.", "path": "/api/v1/…", "timestamp": "…" },
  "meta": { "requestId": "…" }
}
```

Branch on `error.code`, and include `meta.requestId` when you contact support.

| Status | `code` | When |
|---|---|---|
| `401` | `UNAUTHORIZED` | Missing, unknown, or revoked content key. |
| `403` | `FORBIDDEN` | A content key used on another project, for a write, or on any endpoint other than reading articles. |
| `404` | `NOT_FOUND` | No published article at that slug or ID. A draft reads as missing. |
| `429` | `RATE_LIMIT_EXCEEDED` | More than 300 requests in a minute on one key from one edge location. Wait, then retry. |

## Limits

- 300 requests a minute per content key, counted per edge location (requests from different regions are counted separately).
- 100 articles per page.
- Published articles only.

A static build reads each article once per build, and a revalidating site once per refresh, so a normal site stays far below the limit. If your build reads a large site in parallel, cap the number of parallel requests.
