# Errors and limits

Handle failed requests without losing your last valid snapshot.

Source: [Errors and limits](/errors/)

Failed reads return `application/problem+json; charset=utf-8`. The response’s HTTP status is also in the body. External read errors have no machine `code` field; use the HTTP status, and treat `detail` as an explanation.

```json
{
  "type": "about:blank",
  "title": "Not Found",
  "status": 404,
  "detail": "The requested fixture feed does not exist.",
  "instance": "/v1/fixtures/unknown/feeds/pulse"
}
```

| Status                      | Meaning                                                                         | Client action                                                                                       |
| --------------------------- | ------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- |
| `400 Bad Request`           | Malformed, repeated or unsupported replay parameter.                            | Correct the query. Portland does not support replay.                                                |
| `404 Not Found`             | Unknown path, sample, asset or feed, or a live game with no published item yet. | Check the path. A live feed may not have its first item yet. Do not clear your last valid snapshot. |
| `405 Method Not Allowed`    | Unsupported method on the external read surface.                                | Use GET, HEAD or OPTIONS. The Allow header names these methods.                                     |
| `500 Internal Server Error` | Unexpected failure while completing the request.                                | Retain state and retry with bounded backoff. Contact Storyteller if it persists.                    |

`HEAD` errors have the same status and headers without a problem body. Error responses use `Cache-Control: no-store`.

## Edge errors [#edge-errors]

An edge security check can return `403` before the request reaches the Worker. Use a descriptive User-Agent for your server client; the Python example supplies one. Contact Storyteller if access is denied. An edge response may have different headers or an error format from the Worker responses above.

## Feed bounds [#feed-bounds]

A feed is bounded at publication: up to 1,000 published item identities and 49 published revisions per item, with separate capacity reserved for withdrawals. These are publishing bounds, not read pagination. A read does not return a `feed_limit` error; it reads the accepted snapshot. Contact Storyteller if you expect more content than appears. Public feed reads have no application rate limit, request quota or minimum polling interval. See [Polling and caching](/markdown/polling.md) for continuous polling and conditional reads.
