Audelo API
A REST API to manage AI voice agents, place and control outbound calls, read transcripts and recordings, query analytics, store per-call context, and subscribe to webhooks — programmatically.
Authentication
Every request authenticates with an API key sent as a Bearer token in the Authorization header.
curl https://audelo.ai/api/v1/agents \ -H "Authorization: Bearer cgk_your_api_key" \ -H "Accept: application/json"
- Generate keys in the dashboard under API Keys (account admins only).
- The full key (
cgk_+ 48 characters) is shown once at creation — store it securely. Afterward only acgk_xxxxxxxxprefix is displayed. - API access requires a paid plan (Starter or higher). Free / Explorer accounts receive
403 plan_required. - Up to 20 active keys per account. Delete a key to revoke it, or set it inactive to disable.
Scopes
Each key is limited to the scopes you assign when creating it. A key created with no scopes has full access. A request missing the required scope returns 403 forbidden.
| Scope | Grants |
|---|---|
| agents:read | List and read agents |
| calls:read | List/read calls, transcripts, recordings; read context |
| calls:write | Initiate/end calls; write/delete context Pro |
| analytics:read | Read call and agent analytics |
| webhooks:manage | Create, update, delete, and test webhook endpoints |
Plan requirements
| Capability | Minimum plan |
|---|---|
| Any API access; read agents / calls / analytics; manage webhooks | Starter |
| Initiate / end calls; all context endpoints | Pro |
Base URL
https://audelo.ai/api/v1
All endpoints are relative to this base URL. All responses are application/json; timestamps are ISO-8601.
Errors
Errors use a consistent envelope. request_id is unique per request — quote it when contacting support. errors appears only on validation failures.
{
"error": "validation_error",
"message": "The given data was invalid.",
"errors": { "phone_number": ["The phone number format is invalid."] },
"request_id": "f1c2a4e8-..."
}
| Code | error | Meaning |
|---|---|---|
| 401 | unauthorized | Missing, malformed, inactive, or expired key |
| 403 | forbidden / plan_required | Key lacks the scope, or plan too low |
| 404 | not_found | Resource missing or belongs to another account |
| 422 | validation_error | Invalid body or parameters |
| 429 | too_many_requests | Rate limit exceeded |
Rate limits
300 requests per minute, per API key. Exceeding the limit returns 429 too_many_requests.
Pagination
List endpoints (/agents, /calls) return a length-aware paginator. Page size is fixed at 50; navigate with ?page=N. Single-resource, transcript, recording, analytics, and context endpoints are not paginated.
{
"data": [ ... ],
"current_page": 1, "last_page": 3, "per_page": 50, "total": 142,
"next_page_url": "https://audelo.ai/api/v1/calls?page=2",
"prev_page_url": null
}
Agents
/api/v1/agents
agents:read
List agents
Returns your agents, paginated (50/page), ordered by name. Each row: id, name, status, voice, language, created_at, updated_at.
curl https://audelo.ai/api/v1/agents \ -H "Authorization: Bearer cgk_..."
/api/v1/agents/{id}
agents:read
Get agent
Returns one agent, or 404 if it isn't in your account.
{
"id": 12, "name": "Reception Bot", "status": "active",
"voice": "aria", "language": "en-AU",
"humour_level": 10, "empathy_level": 80,
"created_at": "2026-06-25T10:30:00.000000Z",
"updated_at": "2026-06-25T10:30:00.000000Z"
}
Calls
/api/v1/calls
calls:read
List calls
Paginated call records, newest first. Row fields: id, agent_id, from_e164, to_e164, direction, status, duration_sec, created_at. Filters: agent_id, status, from (date), to (date).
curl "https://audelo.ai/api/v1/calls?status=completed&agent_id=12" \ -H "Authorization: Bearer cgk_..."
/api/v1/calls/{id}
calls:read
Get call
One call, including the AI summary and recording link.
{
"id": 456, "agent": { "id": 12, "name": "Reception Bot" },
"from_e164": "+61412345678", "to_e164": "+61253009003",
"direction": "inbound", "status": "completed", "duration_sec": 92,
"summary": "Caller booked a consultation for Tuesday...",
"recording_url": "https://...", "created_at": "2026-06-25T10:30:00.000000Z"
}
/api/v1/calls/{id}/transcript
calls:read
Transcript
Ordered turns. timestamp is the offset in milliseconds from call start; speaker is caller or agent.
{
"call_id": 456,
"transcript": [
{ "timestamp": 0, "speaker": "agent", "text": "Hi, thanks for calling..." },
{ "timestamp": 3200, "speaker": "caller", "text": "I'd like to book an appointment" }
]
}
/api/v1/calls/{id}/recording
calls:read
Recording
Returns the recording link, or 404 if the call has no recording.
{ "call_id": 456, "recording_url": "https://...", "duration_sec": 92 }
/api/v1/calls/initiate
calls:write
Pro
Initiate an outbound call
Places an outbound call. The call runs through your DNC list, calling-hours, and max-concurrent caps. Returns 202 Accepted.
| Field | Type | Required | Description |
|---|---|---|---|
| agent_id | int | yes | An agent in your account with a number assigned |
| phone_number | string | yes | E.164, e.g. +61412345678 |
| caller_name | string | no | Contact display name |
| callback_url | url | no | Optional per-call callback |
| custom_data | object | no | Arbitrary data for your integration |
| idempotency_key | string | no | ≤64 chars; de-dupes retries for 24h |
curl -X POST https://audelo.ai/api/v1/calls/initiate \
-H "Authorization: Bearer cgk_..." \
-H "Content-Type: application/json" \
-d '{"agent_id":12,"phone_number":"+61412345678","caller_name":"Jane"}'
{ "call_id": "cgt_789", "agent_id": 12, "status": "queued",
"created_at": "2026-06-25T10:30:00+00:00" }
Note: call_id is a cgt_... placeholder for the queued call — it hasn't been dialed yet. Use it with /end, or poll GET /calls for the materialized record once it connects.
/api/v1/calls/{id}/end
calls:write
Pro
End a call
Hangs up an in-progress call. id may be a numeric call id or a cgt_... placeholder. Idempotent for already-ended calls. The final status is set by the carrier callback — poll GET /calls/{id} to confirm.
{ "call_id": "cgt_789", "status": "in-progress",
"hangup_requested_at": "2026-06-25T10:31:00+00:00" }
Context Store
A per-account key/value store for data your agents use across calls. Keys match [A-Za-z0-9._:-]+ (≤191 chars); values are JSON. Pro required for all context endpoints.
/api/v1/context/{key}
calls:write
Pro
Set context
Body: value (any JSON, required), ttl_seconds (optional). TTL defaults to 86400 (24h), max 2592000 (30 days). Returns 201.
{ "key": "customer:42", "expires_at": "2026-06-26T10:30:00+00:00", "ttl_seconds": 86400 }
/api/v1/context/{key}
calls:read
Pro
Get context
Returns key, value, expires_at. Expired or missing keys return 404.
/api/v1/context/{key}
calls:write
Pro
Delete context
Idempotent — returns 204 No Content whether or not the key existed.
Analytics
/api/v1/analytics/calls
analytics:read
Call analytics
Aggregate call stats for a window (from, to dates; default last 30 days).
{
"period": { "from": "2026-05-26", "to": "2026-06-25" },
"calls": { "total_calls": 412, "total_duration_sec": 38400,
"avg_duration_sec": 93, "completed": 388 }
}
/api/v1/analytics/agents
analytics:read
Agent analytics
Per-agent breakdown for the window (from, to; default last 30 days).
{
"period": { "from": "2026-05-26", "to": "2026-06-25" },
"agents": [ { "id": 12, "name": "Reception Bot",
"total_calls": 250, "avg_duration_sec": 88 } ]
}
Webhooks
/api/v1/webhooks
webhooks:manage
Manage endpoints
Full CRUD for webhook subscriptions (max 20 per account):
| GET | /api/v1/webhooks | List endpoints |
| POST | /api/v1/webhooks | Create — returns the signing secret once |
| PUT | /api/v1/webhooks/{id} | Update url / events / active |
| DELETE | /api/v1/webhooks/{id} | Delete endpoint |
| POST | /api/v1/webhooks/{id}/test | Fire a synchronous test delivery |
Create — body: url (required, public HTTPS), description (optional), events (required array). Returns 201 including the signing secret (whsec_...) — shown once.
{ "id": 5, "url": "https://example.com/hooks/audelo",
"events": ["call.ended"], "secret": "whsec_...",
"is_active": true, "created_at": "..." }
Delivery & verification
Payload, signature, retries
When a subscribed event fires, Audelo sends an HTTP POST to your URL. Available events:
| Event | Fires when | data |
|---|---|---|
| call.started | A call connects | call_id, agent_id, from, to, direction, started_at |
| call.ended | A call completes | + status, duration_sec, ended_at |
| call.transcript | A transcript segment is finalized | call_id, speaker, text |
Payload
{
"id": "wh_a1b2c3d4e5f6a7b8",
"event": "call.ended",
"timestamp": "2026-06-25T10:31:32.000000Z",
"data": { "call_id": 456, "agent_id": 12, "status": "completed",
"duration_sec": 92, "ended_at": "2026-06-25T10:31:32.000000Z" }
}
Headers
| X-Audelo-Signature | sha256=<hex> — HMAC-SHA256 of the raw body |
| X-Audelo-Event | The event name |
| X-Audelo-Delivery | Unique delivery id — dedupe on this |
Verify the signature — recompute HMAC-SHA256 over the raw request body with your whsec_ secret and compare (constant-time):
import hmac, hashlib
def verify(raw_body, header, secret):
expected = "sha256=" + hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, header)
Delivery: a 2xx marks success. Failures retry up to 5 times (backoff 5s, 30s, 5m, 30m, 2h). An endpoint auto-disables after 10 consecutive failures. The same event may arrive more than once — dedupe on X-Audelo-Delivery.
Ready to build?
Create a free account, upgrade to a paid plan, and generate an API key from the dashboard.
Get Started FreeBuilding with an AI tool? Point it at audelo.ai/llms.txt for a machine-readable version of this reference.