Aiera Voice API Reference
The Aiera Voice API is a REST API for creating voice agents, placing calls, buying numbers, attaching knowledge bases, and receiving signed call-completion webhooks. All endpoints return JSON and use standard HTTP status codes.
Base URL
https://aiera-voice.com/api/public/v1Authentication
Every request must include an API key in the Authorization header using the Bearer scheme. Keys are created in the Developers section of the console and start with aml_live_.
Authorization: Bearer aml_live_your_api_keyKeep your key secret. It is shown only once when created. If a key is exposed, revoke it in the console and generate a new one.
Agents
Agents define the voice, language, prompt, and call behavior. Creating or updating an agent automatically publishes it to the voice service. Deleting an agent removes it from both the console and the voice service.
https://aiera-voice.com/api/public/v1/agentsList all active agents.https://aiera-voice.com/api/public/v1/agentsCreate a new agent.https://aiera-voice.com/api/public/v1/agents/:idGet a single agent by id.https://aiera-voice.com/api/public/v1/agents/:idUpdate an existing agent.https://aiera-voice.com/api/public/v1/agents/:idDelete an agent.curl -X POST https://aiera-voice.com/api/public/v1/agents \
-H "Authorization: Bearer aml_live_your_key" \
-H "Content-Type: application/json" \
-d '{
"name": "Sales qualifier",
"welcome_message": "Hello, this is Aiera calling. Do you have a moment to talk?",
"prompt": "You are a polite sales assistant. Ask two qualification questions, then say goodbye.",
"language": "en",
"voice_provider": "elevenlabs",
"voice_id": "V9LCAAi4tTlqe9JadbCo",
"voice_label": "Nila",
"transcriber_provider": "deepgram",
"transcriber_model": "nova-3",
"llm_model": "gpt-4o-mini",
"max_tokens": 150,
"temperature": 1,
"telephony_provider": "plivo",
"max_call_seconds": 300,
"hangup_after_silence": 10,
"languages": []
}'Agent fields
| Field | Type | Required | Description |
|---|---|---|---|
name | string | required | Display name of the agent. |
welcome_message | string | required | First thing the agent says when a call connects. |
prompt | string | required | System prompt that guides the agent's behavior. |
language | string | required | Primary language code, e.g. en, hi, ta, es. |
description | string | optional | Internal note about the agent. |
voice_provider | string | required | TTS provider: elevenlabs, cartesia, openai, etc. |
voice_id | string | required | Voice identifier from the voice catalog. |
voice_label | string | optional | Human-readable voice name. |
voice_model | string | optional | Provider-specific model id. |
transcriber_provider | string | required | STT provider: deepgram, openai, azure, etc. |
transcriber_model | string | required | STT model id, e.g. nova-3. |
llm_model | string | required | LLM id, e.g. gpt-4o-mini. |
max_tokens | integer | optional | Maximum tokens per agent response. |
temperature | number | optional | Sampling temperature (0-2). |
telephony_provider | string | required | Provider for inbound/outbound telephony. |
from_number | string | optional | Default outbound caller id. |
knowledge_base_ids | string[] | optional | Ids of knowledge sources to attach. |
max_call_seconds | integer | optional | Hard cap on call duration. |
hangup_after_silence | integer | optional | Seconds of silence before hanging up. |
hangup_message | string | optional | Spoken goodbye message. |
welcome_message_delay | integer | optional | Milliseconds to wait before the welcome message. |
noise_cancellation_level | integer | optional | 0-3 noise cancellation strength. |
ambient_noise_track | string | optional | Preset track id or null. |
voicemail_detection | boolean | optional | Whether to detect voicemail beeps. |
voicemail_detection_duration | integer | optional | Seconds to listen for voicemail. |
dtmf_enabled | boolean | optional | Allow keypad input. |
auto_reschedule | boolean | optional | Reschedule calls that hit guardrails. |
check_if_user_online | boolean | optional | Detect whether the human is actually speaking. |
trigger_user_online_message_after | integer | optional | Seconds before confirming user presence. |
inbound_limit | integer | optional | Max concurrent inbound calls. |
disallow_unknown_numbers | boolean | optional | Reject inbound calls not in a caller list. |
incremental_delay | integer | optional | Milliseconds added before each response. |
words_for_interruption | integer | optional | Words required before the agent can interrupt. |
endpointing | integer | optional | Endpointing threshold in milliseconds. |
backchanneling | boolean | optional | Acknowledge long user speech. |
backchanneling_message_gap | integer | optional | Gap between acknowledgements. |
backchanneling_start_delay | integer | optional | Delay before first acknowledgement. |
hangup_after_llm_call | boolean | optional | Let the LLM decide when to hang up. |
call_start_hour | integer | optional | Outbound calling window start (0-23). |
call_end_hour | integer | optional | Outbound calling window end (0-23). |
summary_enabled | boolean | optional | Generate a post-call summary. |
languages | array | optional | Multilingual overrides. Each entry has code, prompt, handoff_message, voice_provider, voice_id, voice_label, voice_model. |
Calls
Place outbound calls, check status, and stop calls that are still in progress.
https://aiera-voice.com/api/public/v1/callsList recent calls.https://aiera-voice.com/api/public/v1/callsPlace an outbound call.https://aiera-voice.com/api/public/v1/calls/:idGet call status, transcript, recording URL, and extracted data.https://aiera-voice.com/api/public/v1/calls/:id/stopStop a queued or in-progress call.curl -X POST https://aiera-voice.com/api/public/v1/calls \
-H "Authorization: Bearer aml_live_your_key" \
-H "Content-Type: application/json" \
-d '{
"agent_id": "<agent-uuid>",
"to": "+919876543210",
"from": "+14155551234",
"variables": { "customer_name": "Rahul" }
}'Call request fields
| Field | Type | Required | Description |
|---|---|---|---|
agent_id | uuid | required | Agent that will handle the call. |
to | string | required | E.164 phone number to dial. |
from | string | optional | E.164 caller id. Falls back to the agent's from_number. |
variables | object | optional | String key-value pairs available in the prompt and welcome message as {key}. |
scheduled_at | ISO 8601 | optional | Schedule the call for later. Use a numeric offset, e.g. 2026-09-15T10:00:00+05:30. |
Call response fields
| Field | Type | Description |
|---|---|---|
id | uuid | Call id. |
agent_id | uuid | Agent id. |
direction | string | outbound or inbound. |
to | string | Dialed number. |
from | string | Caller id. |
status | string | queued, in-progress, completed, failed, etc. |
duration_seconds | integer | Call duration in seconds. |
cost | number | Estimated cost in account currency. |
answered_by | string | human, voicemail, or unknown. |
hangup_reason | string | Reason the call ended. |
summary | string | Post-call summary when summary_enabled is true. |
transcript | array | Array of transcript turns. |
extracted_data | object | Key-value pairs extracted from the conversation. |
recording_url | string | Opaque URL to the call recording. |
created_at | ISO 8601 | When the call was created. |
updated_at | ISO 8601 | When the call was last updated. |
Recordings
Call recordings are served from this domain through an opaque token. The upstream source URL is never exposed to callers or end users.
https://aiera-voice.com/api/public/v1/recordings/:tokenStream or download a call recording.curl -L https://aiera-voice.com/api/public/v1/recordings/<recording-token>.mp3 \
-H "Authorization: Bearer aml_live_your_key" \
-o call-recording.mp3The endpoint supports Range requests for seeking. The response includes a branded Content-Disposition filename.
Phone numbers
Buy, release, link, and unlink phone numbers. A number linked to an agent becomes that agent's inbound and default outbound caller id.
https://aiera-voice.com/api/public/v1/numbersList numbers on the workspace.https://aiera-voice.com/api/public/v1/numbers/searchSearch for available numbers to buy.https://aiera-voice.com/api/public/v1/numbers/buyPurchase a number.https://aiera-voice.com/api/public/v1/numbers/:idRelease a purchased number.https://aiera-voice.com/api/public/v1/numbers/:id/linkLink a number to an agent.https://aiera-voice.com/api/public/v1/numbers/:id/unlinkUnlink a number from its agent.# Search available numbers
curl -X POST https://aiera-voice.com/api/public/v1/numbers/search \
-H "Authorization: Bearer aml_live_your_key" \
-H "Content-Type: application/json" \
-d '{"country":"US","pattern":"555"}'
# Buy one
curl -X POST https://aiera-voice.com/api/public/v1/numbers/buy \
-H "Authorization: Bearer aml_live_your_key" \
-H "Content-Type: application/json" \
-d '{"country":"US","phone_number":"+14155551234"}'
# Link to an agent
curl -X POST https://aiera-voice.com/api/public/v1/numbers/<number-id>/link \
-H "Authorization: Bearer aml_live_your_key" \
-H "Content-Type: application/json" \
-d '{"agent_id":"<agent-uuid>"}'Number fields
| Field | Type | Required | Description |
|---|---|---|---|
id | string | Number identifier. | |
phone_number | string | E.164 phone number. | |
agent_id | uuid | Linked agent id, if any. | |
agent_name | string | Linked agent name, if any. | |
linked_elsewhere | boolean | True if the number is linked to an agent outside your workspace. | |
renewal_at | ISO 8601 | Next renewal timestamp. |
Knowledge bases
Attach web pages or PDF documents to agents so they can answer questions from your own content.
https://aiera-voice.com/api/public/v1/knowledgeList knowledge sources.https://aiera-voice.com/api/public/v1/knowledgeCreate a knowledge source from a URL or PDF.https://aiera-voice.com/api/public/v1/knowledge/:idDelete a knowledge source.curl -X POST https://aiera-voice.com/api/public/v1/knowledge \
-H "Authorization: Bearer aml_live_your_key" \
-H "Content-Type: application/json" \
-d '{
"url": "https://aieramindlabs.com/faq",
"chunk_size": 1000,
"similarity_top_k": 3,
"overlapping": 100
}'Knowledge source fields
| Field | Type | Required | Description |
|---|---|---|---|
id | string | Source identifier. | |
name | string | Generated or provided name. | |
status | string | processing, ready, error. | |
size_bytes | integer | Size of the indexed content. | |
created_at | ISO 8601 | Creation timestamp. |
Bulk runs
Upload a CSV of contacts and run one agent against many numbers. Use bulk runs for campaigns, reminders, and lead qualification at scale.
https://aiera-voice.com/api/public/v1/batchesList bulk runs for an agent.https://aiera-voice.com/api/public/v1/batchesCreate a bulk run from a CSV.https://aiera-voice.com/api/public/v1/batches/:idGet bulk run status and execution summary.https://aiera-voice.com/api/public/v1/batches/:id/scheduleSchedule a bulk run for a future time.https://aiera-voice.com/api/public/v1/batches/:id/stopStop a running bulk run.https://aiera-voice.com/api/public/v1/batches/:idDelete a bulk run.curl -X POST https://aiera-voice.com/api/public/v1/batches \
-H "Authorization: Bearer aml_live_your_key" \
-H "Content-Type: application/json" \
-d '{
"agent_id": "<agent-uuid>",
"csv": "phone,name\n+919876543210,Rahul\n+919876543211,Priya",
"from_numbers": ["+14155551234"],
"scheduled_at": "2026-09-15T10:00:00+05:30"
}'Bulk run request fields
| Field | Type | Required | Description |
|---|---|---|---|
agent_id | uuid | required | Agent to run. |
csv | string | required | CSV with at least a phone column. |
from_numbers | string[] | optional | Caller ids to rotate through. |
scheduled_at | ISO 8601 | optional | Schedule for later. Use numeric offset, not Z. |
max_retries | integer | optional | Max retry attempts per failed call (0-5). |
retry_after_minutes | integer | optional | Minutes between retries. Default 30. |
Voice catalog
Discover available voice providers, models, and voices before assigning them to an agent.
https://aiera-voice.com/api/public/v1/providersList TTS providers and their models.https://aiera-voice.com/api/public/v1/voices?provider_id=...&model_id=...&language=...List voices for a provider + model + language.curl "https://aiera-voice.com/api/public/v1/voices?provider_id=elevenlabs&model_id=eleven_turbo_v2_5&language=en" \
-H "Authorization: Bearer aml_live_your_key"Outcomes & extraction fields
Extraction fields group the questions an agent should answer about every call. Outcomes are the individual questions, either objective (pick one of your options) or subjective (free-form model answer). Extracted values are returned on the call object and in the call.completed webhook.
https://aiera-voice.com/api/public/v1/agents/:id/fieldsList extraction fields on an agent.https://aiera-voice.com/api/public/v1/agents/:id/fieldsCreate an extraction field.https://aiera-voice.com/api/public/v1/fields/:idRename a field or change its model.https://aiera-voice.com/api/public/v1/fields/:idDelete a field and its outcomes.https://aiera-voice.com/api/public/v1/agents/:id/outcomesList outcomes for an agent.https://aiera-voice.com/api/public/v1/agents/:id/outcomesCreate an outcome.https://aiera-voice.com/api/public/v1/agents/:id/outcomes/bulkCreate several outcomes in one request.https://aiera-voice.com/api/public/v1/agents/:id/outcomes/testTest outcomes against a transcript or past call.https://aiera-voice.com/api/public/v1/outcomes/:idGet a single outcome.https://aiera-voice.com/api/public/v1/outcomes/:idUpdate an outcome.https://aiera-voice.com/api/public/v1/outcomes/:idDelete an outcome.curl -X POST https://aiera-voice.com/api/public/v1/agents/<agent-id>/outcomes \
-H "Authorization: Bearer aml_live_your_key" \
-H "Content-Type: application/json" \
-d '{
"name": "interested",
"question": "Was the caller interested?",
"model": "gpt-4.1-mini",
"options": [
{ "value": "yes", "condition": "caller expressed interest" },
{ "value": "no", "condition": "caller declined",
"sub_options": [ { "value": "price", "condition": "declined on price" } ] }
]
}'| Field | Type | Required | Description |
|---|---|---|---|
name | string | required | Short key used in extracted_data. |
question | string | required | Question the model answers from the transcript. |
field_id | string | optional | Extraction field to attach to. Defaults to the agent's General field. |
model | string | optional | Extraction model. Defaults to gpt-4.1-mini. |
subjective | boolean | optional | True for a free-form answer with no options. |
options | array | optional | Objective options: value, condition, and optional nested sub_options. |
Executions
An execution is one attempted conversation: its status, duration, cost, transcript, extracted values and recording. Date filters accept ISO dates and cover a maximum window of seven days per request.
https://aiera-voice.com/api/public/v1/agents/:id/executionsList executions for one agent.https://aiera-voice.com/api/public/v1/executions/:idGet one execution in full.https://aiera-voice.com/api/public/v1/executions/:id/logGet the turn-by-turn conversation log.https://aiera-voice.com/api/public/v1/agents/:id/stopStop all in-progress calls for an agent.https://aiera-voice.com/api/public/v1/calls/:id/stopStop one in-progress call.curl "https://aiera-voice.com/api/public/v1/agents/<agent-id>/executions?start_date=2026-09-11&end_date=2026-09-12&page_size=50" \
-H "Authorization: Bearer aml_live_your_key"Workflows
Workflows chain agents and logic nodes so a single run can route, branch, and hand off between agents.
https://aiera-voice.com/api/public/v1/workflowsList workflows.https://aiera-voice.com/api/public/v1/workflowsCreate a workflow. Body: {"name": "Loan follow-up"}. Optional nodes and edges are saved straight into the new draft.https://aiera-voice.com/api/public/v1/workflows/:idGet a workflow with its nodes.https://aiera-voice.com/api/public/v1/workflows/:idUpdate a workflow.https://aiera-voice.com/api/public/v1/workflows/:idDelete a workflow.https://aiera-voice.com/api/public/v1/workflows/:id/runStart a workflow run.https://aiera-voice.com/api/public/v1/workflows/:id/draftGet the unpublished draft of a workflow.https://aiera-voice.com/api/public/v1/workflows/:id/draftSave the draft nodes and edges.https://aiera-voice.com/api/public/v1/workflows/:id/validateValidate a workflow before publishing.https://aiera-voice.com/api/public/v1/workflows/:id/versions/:versionGet a published workflow version.https://aiera-voice.com/api/public/v1/workflow-node-typesList the node types available in workflows.https://aiera-voice.com/api/public/v1/workflow-runs/:idGet the status of a run.https://aiera-voice.com/api/public/v1/workflow-runs/:idCancel a run.Campaigns
Campaigns run an agent against a contact list on a schedule, with retries, pacing and per-contact reporting.
https://aiera-voice.com/api/public/v1/campaignsList campaigns.https://aiera-voice.com/api/public/v1/campaignsCreate a campaign. Body: {"name", "workflow_id", optional "version" (null pins the latest published version), "binding", "scheduled_at"}. The workflow needs a published version first.https://aiera-voice.com/api/public/v1/campaigns/:idGet one campaign.https://aiera-voice.com/api/public/v1/campaigns/:idControl a campaign. Body: {"action": "start" | "pause" | "resume" | "abort"}.https://aiera-voice.com/api/public/v1/campaigns/:idDelete a campaign.https://aiera-voice.com/api/public/v1/campaigns/:id/entriesList contacts in a campaign.https://aiera-voice.com/api/public/v1/campaigns/:id/entriesAdd contacts to a campaign.https://aiera-voice.com/api/public/v1/campaigns/:id/entries/templateDownload the contact CSV template.https://aiera-voice.com/api/public/v1/campaigns/:id/executionsList calls made by a campaign.https://aiera-voice.com/api/public/v1/campaigns/:id/reportGet aggregate campaign results.SIP trunks & inbound
Bring your own carrier with a SIP trunk, or point an existing number at an agent so inbound calls are answered automatically.
https://aiera-voice.com/api/public/v1/trunksList SIP trunks.https://aiera-voice.com/api/public/v1/trunksCreate a SIP trunk.https://aiera-voice.com/api/public/v1/trunks/:idGet one trunk.https://aiera-voice.com/api/public/v1/trunks/:idUpdate a trunk.https://aiera-voice.com/api/public/v1/trunks/:idDelete a trunk.https://aiera-voice.com/api/public/v1/trunks/:id/numbersList numbers on a trunk.https://aiera-voice.com/api/public/v1/trunks/:id/numbersAdd numbers to a trunk.https://aiera-voice.com/api/public/v1/trunks/:id/numbers/:numberIdRemove one number from a trunk.https://aiera-voice.com/api/public/v1/inboundPoint a number at an agent.https://aiera-voice.com/api/public/v1/inboundUnlink a number from an agent.curl -X POST https://aiera-voice.com/api/public/v1/inbound \
-H "Authorization: Bearer aml_live_your_key" \
-H "Content-Type: application/json" \
-d '{ "agent_id": "<agent-id>", "phone_number": "+14155551234" }'Provider keys & custom models
Use your own voice, transcription or LLM provider accounts, and register self-hosted models that agents can then select.
https://aiera-voice.com/api/public/v1/provider-keysList connected provider accounts.https://aiera-voice.com/api/public/v1/provider-keysAdd or replace a provider key.https://aiera-voice.com/api/public/v1/provider-keys/:nameRemove a provider key.https://aiera-voice.com/api/public/v1/modelsList custom models.https://aiera-voice.com/api/public/v1/modelsRegister a custom model. Body: {"name" (the model id your endpoint serves), "base_url" (OpenAI-compatible, including the version segment), "api_key", "family", optional "languages"}. The URL must be publicly reachable.https://aiera-voice.com/api/public/v1/models/:idDelete a custom model.https://aiera-voice.com/api/public/v1/violationsList content or usage violations.Account
Check your workspace's calling allowance and usage. Platform accounts also receive their own balance and capacity.
https://aiera-voice.com/api/public/v1/accountGet account status and usage.curl https://aiera-voice.com/api/public/v1/account \
-H "Authorization: Bearer aml_live_your_key"| Field | Type | Required | Description |
|---|---|---|---|
connected | boolean | Whether the voice service is reachable. | |
balance | number | Current wallet balance. | |
concurrency_max | integer | Maximum allowed concurrent calls. | |
concurrency_current | integer | Currently active concurrent calls. | |
minutes_allowed | number | Minutes allocated to this workspace. | |
minutes_used | number | Billed minutes used by this workspace. | |
minutes_remaining | number | Minutes still available to this workspace. | |
billing_increment_seconds | integer | Each call rounds up in 30-second increments. |
Workspaces
Workspaces let you isolate usage and balance per customer or team, with their own agents and reporting.
https://aiera-voice.com/api/public/v1/workspacesList workspaces and their usage.https://aiera-voice.com/api/public/v1/workspaces/usageUsage totals across every workspace.https://aiera-voice.com/api/public/v1/workspacesCreate a workspace.https://aiera-voice.com/api/public/v1/workspaces/:idGet workspace usage.https://aiera-voice.com/api/public/v1/workspaces/:idUpdate a workspace.https://aiera-voice.com/api/public/v1/workspaces/:idDelete a workspace.https://aiera-voice.com/api/public/v1/meGet the profile and limits for the current key.Webhooks
Register an HTTPS endpoint in the console and we will POST a signed call.completed event every time a call reaches a terminal status.
Headers
| Field | Type | Description |
|---|---|---|
Content-Type | application/json | |
X-Aiera-Event | call.completed | |
X-Aiera-Signature | t=<timestamp>,v1=<hmac-sha256> |
const crypto = require("crypto");
const secret = process.env.AIERA_WEBHOOK_SECRET; // from the console
const signature = req.headers["x-aiera-signature"]; // t=1234567890,v1=abc...
const body = JSON.stringify(req.body);
const [t, v1] = signature.split(",").map((part) => part.split("=")[1]);
const expected = crypto
.createHmac("sha256", secret)
.update(`${t}.${body}`)
.digest("hex");
if (expected !== v1) {
return res.status(401).send("Invalid signature");
}Payload
{
"event": "call.completed",
"data": {
"id": "<call-uuid>",
"agent_id": "<agent-uuid>",
"to": "+919876543210",
"from": "+14155551234",
"status": "completed",
"duration_seconds": 120,
"cost": 0.42,
"recording_url": "https://aiera-voice.com/api/public/v1/recordings/<token>.mp3",
"transcript": [...],
"extracted_data": { "interested": "yes" },
"created_at": "2026-09-12T10:00:00Z",
"updated_at": "2026-09-12T10:02:00Z"
}
}Errors
The API uses standard HTTP status codes. Error responses include a JSON body with a human-readable message.
| Field | Type | Description |
|---|---|---|
200 | OK | Successful GET or action. |
201 | Created | POST created a resource. |
400 | Bad Request | Invalid or missing parameter. |
401 | Unauthorized | Missing or invalid API key. |
403 | Forbidden | Valid key but insufficient permissions. |
404 | Not Found | Resource id does not exist. |
429 | Too Many Requests | Rate limit hit. Retry with backoff. |
500 | Internal Server Error | Unexpected error or scheduling format issue. |
{
"error": {
"message": "agent_id is required",
"status": 400
}
}