03Reference · Errors

Every status we return, in one table.

Converlane errors are intentionally narrow — we'd rather give you eight clear codes than thirty fuzzy ones. Each carries a JSON body with a stable error string.

Status codes

StatusCodeMeaning
400invalid_requestBody was malformed JSON or exceeded the 4 KB cap.
401missing_api_keyAuthorization header absent or not a vv_live_… Bearer token.
401invalid_api_keyKey not found, revoked, or disabled.
402insufficient_balanceWallet is empty and autopay is not active. Top up or enable autopay.
403scope_deniedKey exists but is not authorized for this surface.
429rate_limitedPer-key budget exceeded. See X-RateLimit-* headers.
500server_errorWe failed. Retry with exponential backoff.
502upstream_errorUpstream backend (LiveKit / meeting-agent) failed. Retry.

Error envelope

Every non-2xx response is JSON with at least an error string. Some errors carry a second hint field:

Optional fields

FieldTypeNotes
setup_urlstringReturned with 402 — points at the billing page where you can top up or enable autopay.
room_urlstringReturned with 502 from meeting-agent if Vikash dispatch fails after the room was already created.
curl
# All errors are JSON with an "error" field. 4xx responses
# have NO retry value beyond Retry-After on 429.
HTTP/1.1 401 Unauthorized
Content-Type: application/json

{ "error": "Invalid API key" }

HTTP/1.1 402 Payment Required
Content-Type: application/json

{ "error": "insufficient_balance", "setup_url": "https://vaanilabs.in/settings#billing" }

HTTP/1.1 403 Forbidden
Content-Type: application/json

{ "error": "Key not authorized for surface 'meeting-agent'" }
javascript
# All errors are JSON with an "error" field. 4xx responses
# have NO retry value beyond Retry-After on 429.
HTTP/1.1 401 Unauthorized
Content-Type: application/json

{ "error": "Invalid API key" }

HTTP/1.1 402 Payment Required
Content-Type: application/json

{ "error": "insufficient_balance", "setup_url": "https://vaanilabs.in/settings#billing" }

HTTP/1.1 403 Forbidden
Content-Type: application/json

{ "error": "Key not authorized for surface 'meeting-agent'" }
python
# All errors are JSON with an "error" field. 4xx responses
# have NO retry value beyond Retry-After on 429.
HTTP/1.1 401 Unauthorized
Content-Type: application/json

{ "error": "Invalid API key" }

HTTP/1.1 402 Payment Required
Content-Type: application/json

{ "error": "insufficient_balance", "setup_url": "https://vaanilabs.in/settings#billing" }

HTTP/1.1 403 Forbidden
Content-Type: application/json

{ "error": "Key not authorized for surface 'meeting-agent'" }

What we don't return

We do not currently return 409 conflicts, idempotency keys, or pagination cursors — there are no list endpoints on the public API. If a future surface needs them, they'll arrive in a versioned v2.

Was this page helpful?