The REST API gives your product access to the same data that Voicetta sends through webhooks.
Use it when you need:
- conversation history
- backfills
- recovery after downtime
- individual records
- reports
- an integration without webhooks
Paths, parameters, and response bodies live in the API Reference. This page covers the rules that apply to every endpoint.
Base URL
https://api.voicetta.com/v1Collections
| Collection | Contains | Webhook event |
|---|---|---|
/v1/calls | Voice calls | call.started, call.completed |
/v1/messages | SMS and WhatsApp messages | message.received, message.sent |
/v1/threads | Completed SMS and WhatsApp conversations | thread.completed |
/v1/assistants | Agents in this workspace | — |
The same underlying objects are available through the API and webhooks.
To start a call rather than read one, see Outbound Calls API. This page covers reading.
Authentication
Every request requires an API key.
Create one in Settings → Developers.
Send it as a bearer token:
Authorization: Bearer vk_live_xxxxxxxxxxxxxxxxxxxxxxxxKeys are shown once.
If you lose a key, revoke it and create another one.
Each key belongs to one workspace.
Choosing what you can read
API keys have their own field permissions.
| Block | Contains | Default | Collections |
|---|---|---|---|
call | Record id, workspace, assistant, timestamps | Always | All |
customer | Name, phone, email, language, country | On | All |
costs | Cost breakdown | Off | All |
transcript | Turn-by-turn transcript | On | Calls, threads |
analysis | Summary, intent, outcome, sentiment | On | Calls, threads |
evaluations | Evaluation results | On | Calls, threads |
follow_ups | Follow-up state | Off | Calls, threads |
recording | Recording status and link | On | Calls |
performance_metrics | Speech, model, and voice latency | Off | Calls |
config_snapshot | Assistant configuration | Off | Calls |
You can further narrow a request with fields.
For example:
?fields=transcriptRequesting a field your key is not allowed to read returns 403.
Choosing what you can do
Field permissions say how much of a call a key may see. Placing calls is a separate, opt-in permission.
| Permission | Grants | Default |
|---|---|---|
| Place outbound calls | POST /v1/calls | Off |
Reading more of a call is a privacy decision; ringing a phone is a spending decision. The second is never implied by the first, so every key is read-only until you tick the box in Settings → Developers.
Endpoints
Request samples, parameters, and response codes for each path are in the API Reference.
Pagination
Use cursor pagination.
Do not use offsets.
cursor=""
while :; do
page=$(curl -sH "Authorization: Bearer $KEY" \
"https://api.voicetta.com/v1/calls?limit=100&cursor=$cursor")
echo "$page" | jq -c '.calls[]'
[ "$(echo "$page" | jq -r '.has_more')" = "true" ] || break
cursor=$(echo "$page" | jq -r '.next_cursor')
doneThree rules:
- Stop when
has_moreis false. - Treat cursors as opaque strings.
- Do not construct or modify cursors.
Errors
The API uses standard HTTP status codes.
| Status | Meaning |
|---|---|
400 | Invalid request |
401 | Missing or invalid API key |
403 | Your key does not have access to the requested data |
404 | Record does not exist |
429 | Rate limit exceeded |
500 | Server error |
Error responses include a JSON body explaining the problem.
Rate limits
| Limit | Scope |
|---|---|
| 1,000 requests per hour | Per endpoint, per caller |
| 100 requests per second | Burst protection |
| 200 calls per hour | POST /v1/calls, per workspace |
| 10 requests per second | POST /v1/calls burst protection |
If you are regularly hitting the hourly limit, use webhooks instead of polling.
Backfilling history
The REST API is also how you load data from before your webhook was enabled.
For example:
curl -H "Authorization: Bearer $KEY" \
"https://api.voicetta.com/v1/calls?limit=100&from=2026-08-01T00:00:00Z"Feed the results through the same processing logic as your webhook.
The objects are the same.
Make your handler idempotent so running a backfill more than once is safe.
For a specific recovery window, use both from and to.
Versioning
All API paths use /v1.
Within version 1, existing fields are stable.
We add fields without breaking existing integrations.
Breaking changes get a new version.
The OpenAPI specification is available at:
/open-api