> ## Documentation Index
> Fetch the complete documentation index at: https://docs.daily.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Errors

> How to handle errors from the Daily REST API.

Daily API errors are returned as HTTP `4xx` or `5xx` responses. The response body includes two fields:

* `error` — a stable string identifying the error type. Use this for programmatic error handling.
* `info` — a human-readable description with additional context. Treat this as debug information only; the content may change.

```json theme={null}
{
  "error": "invalid-request-error",
  "info": "bad Authorization header format"
}
```

## HTTP status codes

| Status | Meaning                                                              |
| ------ | -------------------------------------------------------------------- |
| `200`  | OK — request succeeded.                                              |
| `400`  | Bad Request — the operation could not be performed as requested.     |
| `401`  | Unauthorized — the API key was not valid.                            |
| `403`  | Forbidden — the API key is valid but the resource is not accessible. |
| `404`  | Not Found — the requested resource does not exist.                   |
| `429`  | Too Many Requests — rate limit exceeded. Back off and retry.         |
| `5xx`  | Server Error — something unexpected happened on Daily's side.        |

## Error types

| `error` value                | Description                                                                                                                                     |
| ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| `authentication-error`       | The API key is not valid.                                                                                                                       |
| `authorization-header-error` | The `Authorization` header is missing or malformed.                                                                                             |
| `forbidden-error`            | The API key is valid but the resource is forbidden.                                                                                             |
| `json-parsing-error`         | The request body could not be parsed as JSON.                                                                                                   |
| `invalid-request-error`      | The request could not be completed. Check the `info` field for details — common causes are missing required parameters or bad parameter values. |
| `rate-limit-error`           | Too many requests in too short a window. See [Authentication](/docs/rest-api/authentication#rate-limits) for limits.                            |
| `server-error`               | An unexpected error occurred on Daily's side.                                                                                                   |

## Pagination

List endpoints (`GET /rooms`, `GET /recordings`, etc.) return up to 100 objects per request, sorted in reverse chronological order by default. Use cursor-based pagination to page through all results.

**Query parameters:**

| Parameter        | Description                                                                                                                                                  |
| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `limit`          | Number of objects to return. Max and default: `100`.                                                                                                         |
| `starting_after` | Object ID cursor. Returns objects created *after* this ID — use to fetch the next page.                                                                      |
| `ending_before`  | Object ID cursor. Returns objects created *before* this ID — use to fetch a previous page. Pass the special value `OLDEST` to start from the oldest objects. |

**Examples:**

```bash theme={null}
# Most recent 5 rooms
curl -H "Authorization: Bearer DAILY_API_KEY" \
  "https://api.daily.co/v1/rooms?limit=5"

# 5 oldest rooms
curl -H "Authorization: Bearer DAILY_API_KEY" \
  "https://api.daily.co/v1/rooms?limit=5&ending_before=OLDEST"

# Next page after a known room ID
curl -H "Authorization: Bearer DAILY_API_KEY" \
  "https://api.daily.co/v1/rooms?limit=5&starting_after=ROOM_ID"
```

**Fetching all results:**

```javascript theme={null}
let rooms = await getPageOfRooms('https://api.daily.co/v1/rooms');

while (rooms.data.length > 0) {
  for (const room of rooms.data) {
    doSomethingWith(room);
  }
  const lastId = rooms.data[rooms.data.length - 1].id;
  rooms = await getPageOfRooms(`https://api.daily.co/v1/rooms?starting_after=${lastId}`);
}
```

<Note>
  `created_at` timestamps have one-second granularity. If multiple objects are created within the same second, list order is stabilized by `id` as a secondary sort key.
</Note>
