API Reference

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.

REST / JSON API-key auth HTTPS only 📄 llms.txt for AI tools

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 a cgk_xxxxxxxx prefix 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.

ScopeGrants
agents:readList and read agents
calls:readList/read calls, transcripts, recordings; read context
calls:writeInitiate/end calls; write/delete context Pro
analytics:readRead call and agent analytics
webhooks:manageCreate, update, delete, and test webhook endpoints

Plan requirements

CapabilityMinimum plan
Any API access; read agents / calls / analytics; manage webhooksStarter
Initiate / end calls; all context endpointsPro

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-..."
}
CodeerrorMeaning
401unauthorizedMissing, malformed, inactive, or expired key
403forbidden / plan_requiredKey lacks the scope, or plan too low
404not_foundResource missing or belongs to another account
422validation_errorInvalid body or parameters
429too_many_requestsRate 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

GET /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_..."
GET /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

GET /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_..."
GET /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"
}
GET /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" }
  ]
}
GET /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 }
POST /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.

FieldTypeRequiredDescription
agent_idintyesAn agent in your account with a number assigned
phone_numberstringyesE.164, e.g. +61412345678
caller_namestringnoContact display name
callback_urlurlnoOptional per-call callback
custom_dataobjectnoArbitrary data for your integration
idempotency_keystringno≤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.

POST /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.

POST /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 }
GET /api/v1/context/{key} calls:read Pro Get context

Returns key, value, expires_at. Expired or missing keys return 404.

DELETE /api/v1/context/{key} calls:write Pro Delete context

Idempotent — returns 204 No Content whether or not the key existed.

Analytics

GET /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 }
}
GET /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

POST /api/v1/webhooks webhooks:manage Manage endpoints

Full CRUD for webhook subscriptions (max 20 per account):

GET/api/v1/webhooksList endpoints
POST/api/v1/webhooksCreate — 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}/testFire 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": "..." }
EVENTS Delivery & verification Payload, signature, retries

When a subscribed event fires, Audelo sends an HTTP POST to your URL. Available events:

EventFires whendata
call.startedA call connectscall_id, agent_id, from, to, direction, started_at
call.endedA call completes+ status, duration_sec, ended_at
call.transcriptA transcript segment is finalizedcall_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-Signaturesha256=<hex> — HMAC-SHA256 of the raw body
X-Audelo-EventThe event name
X-Audelo-DeliveryUnique 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 Free

Building with an AI tool? Point it at audelo.ai/llms.txt for a machine-readable version of this reference.