> ## 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>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.