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.
{
"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 for limits. |
server-error | An unexpected error occurred on Daily’s side. |
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:
# 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:
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}`);
}
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.