API reference
How every VoiceLayer API request works, and where to find each endpoint.
The VoiceLayer API is a JSON REST API. Every endpoint has its own page in this section, with its parameters, a request in curl, TypeScript and Python, and an example response.
Make a request
The base URL is https://api.vlayers.ai, and every route is under /v1. Send your API key as a bearer token:
curl https://api.vlayers.ai/v1/channels \
-H "Authorization: Bearer $VOICELAYER_API_KEY"Create keys in the dashboard under Developers → API keys. See Authentication and API keys for test and live keys and their scopes.
Conventions
- JSON in, JSON out. Send
Content-Type: application/jsonwith a body. Every answer is JSON, except the event stream, which is Server-Sent Events. - Ids are opaque strings. Store them as you receive them.
- Times are ISO 8601 in UTC, for example
2026-10-20T15:04:05.000Z. - Sends are accepted, not delivered. A send answers
202 Accepted; delivery arrives later as events. - New fields appear without notice. Ignore fields and enum values you do not know.
The OpenAPI document
The whole API is described by one OpenAPI 3.1 document at /openapi.json. Load it into your API client or a code generator. The SDKs are generated from it.
Errors
A refused request answers an HTTP error status and a JSON body:
{
"error": "window_closed",
"message": "The 24-hour reply window for this conversation is closed.",
"requestId": "req-8f2c1d4b",
"retryable": false,
"docs": "https://docs.vlayers.ai/errors/window_closed"
}error is a stable code: branch on it, not on message. Every code has a page in Error codes.
Everything else
| Topic | Page |
|---|---|
Retrying safely with Idempotency-Key | Errors, retries and idempotency |
| Cursors and page sizes | Pagination |
| Requests per minute | Rate limits |
| Versions and what changed | Changelog and versioning |
| Real-time events | Webhooks, event stream |