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/v1

Authentication

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_.

Header
Authorization: Bearer aml_live_your_api_key

Keep 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.

GEThttps://aiera-voice.com/api/public/v1/agentsList all active agents.
POSThttps://aiera-voice.com/api/public/v1/agentsCreate a new agent.
GEThttps://aiera-voice.com/api/public/v1/agents/:idGet a single agent by id.
PATCHhttps://aiera-voice.com/api/public/v1/agents/:idUpdate an existing agent.
DELETEhttps://aiera-voice.com/api/public/v1/agents/:idDelete an agent.
Create 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

FieldTypeRequiredDescription
namestringrequiredDisplay name of the agent.
welcome_messagestringrequiredFirst thing the agent says when a call connects.
promptstringrequiredSystem prompt that guides the agent's behavior.
languagestringrequiredPrimary language code, e.g. en, hi, ta, es.
descriptionstringoptionalInternal note about the agent.
voice_providerstringrequiredTTS provider: elevenlabs, cartesia, openai, etc.
voice_idstringrequiredVoice identifier from the voice catalog.
voice_labelstringoptionalHuman-readable voice name.
voice_modelstringoptionalProvider-specific model id.
transcriber_providerstringrequiredSTT provider: deepgram, openai, azure, etc.
transcriber_modelstringrequiredSTT model id, e.g. nova-3.
llm_modelstringrequiredLLM id, e.g. gpt-4o-mini.
max_tokensintegeroptionalMaximum tokens per agent response.
temperaturenumberoptionalSampling temperature (0-2).
telephony_providerstringrequiredProvider for inbound/outbound telephony.
from_numberstringoptionalDefault outbound caller id.
knowledge_base_idsstring[]optionalIds of knowledge sources to attach.
max_call_secondsintegeroptionalHard cap on call duration.
hangup_after_silenceintegeroptionalSeconds of silence before hanging up.
hangup_messagestringoptionalSpoken goodbye message.
welcome_message_delayintegeroptionalMilliseconds to wait before the welcome message.
noise_cancellation_levelintegeroptional0-3 noise cancellation strength.
ambient_noise_trackstringoptionalPreset track id or null.
voicemail_detectionbooleanoptionalWhether to detect voicemail beeps.
voicemail_detection_durationintegeroptionalSeconds to listen for voicemail.
dtmf_enabledbooleanoptionalAllow keypad input.
auto_reschedulebooleanoptionalReschedule calls that hit guardrails.
check_if_user_onlinebooleanoptionalDetect whether the human is actually speaking.
trigger_user_online_message_afterintegeroptionalSeconds before confirming user presence.
inbound_limitintegeroptionalMax concurrent inbound calls.
disallow_unknown_numbersbooleanoptionalReject inbound calls not in a caller list.
incremental_delayintegeroptionalMilliseconds added before each response.
words_for_interruptionintegeroptionalWords required before the agent can interrupt.
endpointingintegeroptionalEndpointing threshold in milliseconds.
backchannelingbooleanoptionalAcknowledge long user speech.
backchanneling_message_gapintegeroptionalGap between acknowledgements.
backchanneling_start_delayintegeroptionalDelay before first acknowledgement.
hangup_after_llm_callbooleanoptionalLet the LLM decide when to hang up.
call_start_hourintegeroptionalOutbound calling window start (0-23).
call_end_hourintegeroptionalOutbound calling window end (0-23).
summary_enabledbooleanoptionalGenerate a post-call summary.
languagesarrayoptionalMultilingual 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.

GEThttps://aiera-voice.com/api/public/v1/callsList recent calls.
POSThttps://aiera-voice.com/api/public/v1/callsPlace an outbound call.
GEThttps://aiera-voice.com/api/public/v1/calls/:idGet call status, transcript, recording URL, and extracted data.
POSThttps://aiera-voice.com/api/public/v1/calls/:id/stopStop a queued or in-progress call.
Place a 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

FieldTypeRequiredDescription
agent_iduuidrequiredAgent that will handle the call.
tostringrequiredE.164 phone number to dial.
fromstringoptionalE.164 caller id. Falls back to the agent's from_number.
variablesobjectoptionalString key-value pairs available in the prompt and welcome message as {key}.
scheduled_atISO 8601optionalSchedule the call for later. Use a numeric offset, e.g. 2026-09-15T10:00:00+05:30.

Call response fields

FieldTypeDescription
iduuidCall id.
agent_iduuidAgent id.
directionstringoutbound or inbound.
tostringDialed number.
fromstringCaller id.
statusstringqueued, in-progress, completed, failed, etc.
duration_secondsintegerCall duration in seconds.
costnumberEstimated cost in account currency.
answered_bystringhuman, voicemail, or unknown.
hangup_reasonstringReason the call ended.
summarystringPost-call summary when summary_enabled is true.
transcriptarrayArray of transcript turns.
extracted_dataobjectKey-value pairs extracted from the conversation.
recording_urlstringOpaque URL to the call recording.
created_atISO 8601When the call was created.
updated_atISO 8601When 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.

GEThttps://aiera-voice.com/api/public/v1/recordings/:tokenStream or download a call recording.
Download a recording
curl -L https://aiera-voice.com/api/public/v1/recordings/<recording-token>.mp3 \
  -H "Authorization: Bearer aml_live_your_key" \
  -o call-recording.mp3

The 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.

GEThttps://aiera-voice.com/api/public/v1/numbersList numbers on the workspace.
POSThttps://aiera-voice.com/api/public/v1/numbers/searchSearch for available numbers to buy.
POSThttps://aiera-voice.com/api/public/v1/numbers/buyPurchase a number.
DELETEhttps://aiera-voice.com/api/public/v1/numbers/:idRelease a purchased number.
POSThttps://aiera-voice.com/api/public/v1/numbers/:id/linkLink a number to an agent.
POSThttps://aiera-voice.com/api/public/v1/numbers/:id/unlinkUnlink a number from its agent.
Search and buy
# 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

FieldTypeRequiredDescription
idstringNumber identifier.
phone_numberstringE.164 phone number.
agent_iduuidLinked agent id, if any.
agent_namestringLinked agent name, if any.
linked_elsewherebooleanTrue if the number is linked to an agent outside your workspace.
renewal_atISO 8601Next renewal timestamp.

Knowledge bases

Attach web pages or PDF documents to agents so they can answer questions from your own content.

GEThttps://aiera-voice.com/api/public/v1/knowledgeList knowledge sources.
POSThttps://aiera-voice.com/api/public/v1/knowledgeCreate a knowledge source from a URL or PDF.
DELETEhttps://aiera-voice.com/api/public/v1/knowledge/:idDelete a knowledge source.
Add a web 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

FieldTypeRequiredDescription
idstringSource identifier.
namestringGenerated or provided name.
statusstringprocessing, ready, error.
size_bytesintegerSize of the indexed content.
created_atISO 8601Creation 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.

GEThttps://aiera-voice.com/api/public/v1/batchesList bulk runs for an agent.
POSThttps://aiera-voice.com/api/public/v1/batchesCreate a bulk run from a CSV.
GEThttps://aiera-voice.com/api/public/v1/batches/:idGet bulk run status and execution summary.
POSThttps://aiera-voice.com/api/public/v1/batches/:id/scheduleSchedule a bulk run for a future time.
POSThttps://aiera-voice.com/api/public/v1/batches/:id/stopStop a running bulk run.
DELETEhttps://aiera-voice.com/api/public/v1/batches/:idDelete a bulk run.
Create 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

FieldTypeRequiredDescription
agent_iduuidrequiredAgent to run.
csvstringrequiredCSV with at least a phone column.
from_numbersstring[]optionalCaller ids to rotate through.
scheduled_atISO 8601optionalSchedule for later. Use numeric offset, not Z.
max_retriesintegeroptionalMax retry attempts per failed call (0-5).
retry_after_minutesintegeroptionalMinutes between retries. Default 30.

Voice catalog

Discover available voice providers, models, and voices before assigning them to an agent.

GEThttps://aiera-voice.com/api/public/v1/providersList TTS providers and their models.
GEThttps://aiera-voice.com/api/public/v1/voices?provider_id=...&model_id=...&language=...List voices for a provider + model + language.
List voices
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.

GEThttps://aiera-voice.com/api/public/v1/agents/:id/fieldsList extraction fields on an agent.
POSThttps://aiera-voice.com/api/public/v1/agents/:id/fieldsCreate an extraction field.
PATCHhttps://aiera-voice.com/api/public/v1/fields/:idRename a field or change its model.
DELETEhttps://aiera-voice.com/api/public/v1/fields/:idDelete a field and its outcomes.
GEThttps://aiera-voice.com/api/public/v1/agents/:id/outcomesList outcomes for an agent.
POSThttps://aiera-voice.com/api/public/v1/agents/:id/outcomesCreate an outcome.
POSThttps://aiera-voice.com/api/public/v1/agents/:id/outcomes/bulkCreate several outcomes in one request.
POSThttps://aiera-voice.com/api/public/v1/agents/:id/outcomes/testTest outcomes against a transcript or past call.
GEThttps://aiera-voice.com/api/public/v1/outcomes/:idGet a single outcome.
PATCHhttps://aiera-voice.com/api/public/v1/outcomes/:idUpdate an outcome.
DELETEhttps://aiera-voice.com/api/public/v1/outcomes/:idDelete an outcome.
Create an objective 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" } ] }
    ]
  }'
FieldTypeRequiredDescription
namestringrequiredShort key used in extracted_data.
questionstringrequiredQuestion the model answers from the transcript.
field_idstringoptionalExtraction field to attach to. Defaults to the agent's General field.
modelstringoptionalExtraction model. Defaults to gpt-4.1-mini.
subjectivebooleanoptionalTrue for a free-form answer with no options.
optionsarrayoptionalObjective 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.

GEThttps://aiera-voice.com/api/public/v1/agents/:id/executionsList executions for one agent.
GEThttps://aiera-voice.com/api/public/v1/executions/:idGet one execution in full.
GEThttps://aiera-voice.com/api/public/v1/executions/:id/logGet the turn-by-turn conversation log.
POSThttps://aiera-voice.com/api/public/v1/agents/:id/stopStop all in-progress calls for an agent.
POSThttps://aiera-voice.com/api/public/v1/calls/:id/stopStop one in-progress call.
List executions for the last day
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.

GEThttps://aiera-voice.com/api/public/v1/workflowsList workflows.
POSThttps://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.
GEThttps://aiera-voice.com/api/public/v1/workflows/:idGet a workflow with its nodes.
PATCHhttps://aiera-voice.com/api/public/v1/workflows/:idUpdate a workflow.
DELETEhttps://aiera-voice.com/api/public/v1/workflows/:idDelete a workflow.
POSThttps://aiera-voice.com/api/public/v1/workflows/:id/runStart a workflow run.
GEThttps://aiera-voice.com/api/public/v1/workflows/:id/draftGet the unpublished draft of a workflow.
PUThttps://aiera-voice.com/api/public/v1/workflows/:id/draftSave the draft nodes and edges.
POSThttps://aiera-voice.com/api/public/v1/workflows/:id/validateValidate a workflow before publishing.
GEThttps://aiera-voice.com/api/public/v1/workflows/:id/versions/:versionGet a published workflow version.
GEThttps://aiera-voice.com/api/public/v1/workflow-node-typesList the node types available in workflows.
GEThttps://aiera-voice.com/api/public/v1/workflow-runs/:idGet the status of a run.
DELETEhttps://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.

GEThttps://aiera-voice.com/api/public/v1/campaignsList campaigns.
POSThttps://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.
GEThttps://aiera-voice.com/api/public/v1/campaigns/:idGet one campaign.
POSThttps://aiera-voice.com/api/public/v1/campaigns/:idControl a campaign. Body: {"action": "start" | "pause" | "resume" | "abort"}.
DELETEhttps://aiera-voice.com/api/public/v1/campaigns/:idDelete a campaign.
GEThttps://aiera-voice.com/api/public/v1/campaigns/:id/entriesList contacts in a campaign.
POSThttps://aiera-voice.com/api/public/v1/campaigns/:id/entriesAdd contacts to a campaign.
GEThttps://aiera-voice.com/api/public/v1/campaigns/:id/entries/templateDownload the contact CSV template.
GEThttps://aiera-voice.com/api/public/v1/campaigns/:id/executionsList calls made by a campaign.
GEThttps://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.

GEThttps://aiera-voice.com/api/public/v1/trunksList SIP trunks.
POSThttps://aiera-voice.com/api/public/v1/trunksCreate a SIP trunk.
GEThttps://aiera-voice.com/api/public/v1/trunks/:idGet one trunk.
PATCHhttps://aiera-voice.com/api/public/v1/trunks/:idUpdate a trunk.
DELETEhttps://aiera-voice.com/api/public/v1/trunks/:idDelete a trunk.
GEThttps://aiera-voice.com/api/public/v1/trunks/:id/numbersList numbers on a trunk.
POSThttps://aiera-voice.com/api/public/v1/trunks/:id/numbersAdd numbers to a trunk.
DELETEhttps://aiera-voice.com/api/public/v1/trunks/:id/numbers/:numberIdRemove one number from a trunk.
POSThttps://aiera-voice.com/api/public/v1/inboundPoint a number at an agent.
DELETEhttps://aiera-voice.com/api/public/v1/inboundUnlink a number from an agent.
Route an inbound number to 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.

GEThttps://aiera-voice.com/api/public/v1/provider-keysList connected provider accounts.
POSThttps://aiera-voice.com/api/public/v1/provider-keysAdd or replace a provider key.
DELETEhttps://aiera-voice.com/api/public/v1/provider-keys/:nameRemove a provider key.
GEThttps://aiera-voice.com/api/public/v1/modelsList custom models.
POSThttps://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.
DELETEhttps://aiera-voice.com/api/public/v1/models/:idDelete a custom model.
GEThttps://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.

GEThttps://aiera-voice.com/api/public/v1/accountGet account status and usage.
Account status
curl https://aiera-voice.com/api/public/v1/account \
  -H "Authorization: Bearer aml_live_your_key"
FieldTypeRequiredDescription
connectedbooleanWhether the voice service is reachable.
balancenumberCurrent wallet balance.
concurrency_maxintegerMaximum allowed concurrent calls.
concurrency_currentintegerCurrently active concurrent calls.
minutes_allowednumberMinutes allocated to this workspace.
minutes_usednumberBilled minutes used by this workspace.
minutes_remainingnumberMinutes still available to this workspace.
billing_increment_secondsintegerEach 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.

GEThttps://aiera-voice.com/api/public/v1/workspacesList workspaces and their usage.
GEThttps://aiera-voice.com/api/public/v1/workspaces/usageUsage totals across every workspace.
POSThttps://aiera-voice.com/api/public/v1/workspacesCreate a workspace.
GEThttps://aiera-voice.com/api/public/v1/workspaces/:idGet workspace usage.
PATCHhttps://aiera-voice.com/api/public/v1/workspaces/:idUpdate a workspace.
DELETEhttps://aiera-voice.com/api/public/v1/workspaces/:idDelete a workspace.
GEThttps://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

FieldTypeDescription
Content-Typeapplication/json
X-Aiera-Eventcall.completed
X-Aiera-Signaturet=<timestamp>,v1=<hmac-sha256>
Verify signature
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

call.completed 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.

FieldTypeDescription
200OKSuccessful GET or action.
201CreatedPOST created a resource.
400Bad RequestInvalid or missing parameter.
401UnauthorizedMissing or invalid API key.
403ForbiddenValid key but insufficient permissions.
404Not FoundResource id does not exist.
429Too Many RequestsRate limit hit. Retry with backoff.
500Internal Server ErrorUnexpected error or scheduling format issue.
Error response
{
  "error": {
    "message": "agent_id is required",
    "status": 400
  }
}