This article explains how to interpret error responses from the Video API and how to page through list endpoints.
Status codes
| Code | Meaning | When you'll see it |
|---|---|---|
200 OK |
Success | Listing, fetching, or updating a resource |
201 Created |
Resource created | Creating a room |
204 No Content |
Success, no body | Deleting or closing a room |
400 Bad Request |
Validation failed | Creating a room with missing or invalid fields |
401 Unauthorized |
Missing or invalid token | Any request without a valid Authorization header |
403 Forbidden |
Token not allowed to do this | Calling a feedbacks endpoint without an Instance API Token |
404 Not Found |
Resource doesn't exist, or isn't visible to your token | Fetching a room by a token that doesn't match any room, or one that belongs to another organization |
422 Unprocessable Content |
Request understood but rejected | Submitting permanent: true when the permanent_rooms feature toggle isn't enabled |
Validation errors (400)
When a request fails validation, the response body is an array of error objects, each with an attribute, a type, and a human-readable message:
[
{
"attribute": "name",
"type": "blank",
"message": "can't be blank"
}
]
Iterate over the array — a single request can fail more than one validation at once.
Scope errors (404, not 403)
An Organization API Token only sees rooms belonging to its own organization or to that organization's doctors. Everything else answers 404 Not Found, the same response an unknown room token gets — the API does not reveal that a room exists outside your scope, so there is no 403 to catch here.
Treat a 404 on a room you expected to see as a scope problem before assuming it was deleted. See Authentication & API tokens for what each token type can reach.
Feature-gated errors (422)
Creating or updating a room with permanent: true requires the permanent_rooms feature toggle to be enabled for your tenant or organization, which is not the case by default. If the toggle isn't enabled, the API returns 422 Unprocessable Content with a different, single-object shape:
{
"error": "Permanent rooms are not available in your current plan."
}
See Additional participants & permanent rooms for details on this feature.
The two error shapes are not interchangeable: 400 responses are a JSON array of validation errors, while this specific 422 response is a single JSON object with an error string. Branch on the status code first, then parse accordingly.
Pagination
List endpoints — GET /api/rooms and GET /api/room_feedbacks — are paginated using a page query parameter, which defaults to 1 if omitted.
Each paginated response includes these headers:
| Header | Description |
|---|---|
Current-Page |
The current returned page |
Page-Limit |
The maximum number of items per page (default: 20) |
Total-Pages |
The total number of pages |
Total-Count |
The total number of items |
Link |
Navigation links in RFC 5988 format, with first, last, next, and prev relations |
Requesting a page beyond the last page returns 200 OK with an empty rooms array rather than an error.
Worked example
curl -i "https://acme.meetone.io/api/rooms?page=2" \
-H "Authorization: Bearer $MEETONE_API_TOKEN"
HTTP/1.1 200 OK
Current-Page: 2
Page-Limit: 20
Total-Pages: 5
Total-Count: 97
Link: <https://acme.meetone.io/api/rooms?page=1>; rel="first", <https://acme.meetone.io/api/rooms?page=5>; rel="last", <https://acme.meetone.io/api/rooms?page=3>; rel="next", <https://acme.meetone.io/api/rooms?page=1>; rel="prev"
{
"rooms": [ ... ]
}
Follow the next and prev links from the Link header instead of incrementing the page parameter yourself. It keeps your integration working even if the pagination scheme changes.
Related
Questions? Contact us at support@meetone.io.