Skip to main content
Everything an operator does — creating agents, attaching numbers, placing calls, reading transcripts, running campaigns — is an HTTP request. The dashboard is one way to make them; this page is the working set for doing it directly, which is what you want for anything scripted or reproducible.
The stack also ships a dashboard covering most of this. Nothing on this page depends on it. For exploring routes interactively, use the console described in API overview.
The shape of a first run, before the detail:

Getting a token

Token mechanics, lifetime, and roles are covered in Authentication. The one call you need to start:
The first signup creates the organisation and makes you its super_admin. On later runs, log in instead of signing up again — see Authentication for the login call, token expiry, and the service-to-service bot-token path. A re-login helper for long sessions:

The tasks you do most

Each recipe assumes $API and $TOKEN are set. Placeholders are YOUR_AGENT_ID, YOUR_ORG_ID, YOUR_CALL_ID.

Add provider credentials

Do this first — agents validate their model configuration against configured providers. See Provider credentials for the field contract; the flow is catalog, store, verify:

Create an agent

Browse the catalogs first — they are generated from the provider registry, so they are always current:
Then create. A telephony agent requires telephony_provider and provisions an application at the provider on create; a websocket agent must not send telephony_provider.
The agents path has no trailing slash. 422 means config validation failed — the message names the field. Full field reference in Agent configuration and Agents.

Attach a number

See what your telephony account holds, then attach:
With agent_id, this also links the number to the agent’s provider application, so inbound calls route to it. Omit agent_id to import into inventory only. Detach is a DELETE with a body, and keeps the inventory row:

Place a test call

custom_variables override the agent’s config.custom_variables defaults for this call only. Add from_number to override the caller ID. The response carries a call_id; everything afterwards keys off it.

Check a call’s transcript

Both return 404 until the runtime uploads the artifact at the end of the call, and 404 permanently for a call that produced none.
Browser websocket sessions create a call_type: web CallLog, so they produce transcripts and recordings alongside telephony calls. Pre-register one with POST /api/v1/calls/web to know the call_id up front.

Invite a member

The invite sets the member’s initial password directly; there is no email invitation flow. Requires admin or super_admin. See Multi-tenancy and roles for who can promote or remove members.

Start a campaign

Three calls: upload, create, start. Field contract, retry/circuit-breaker config, and reports are in Campaigns and Running a campaign.

Scripting

Three habits make API-driven operation bearable. Keep credentials out of the command. Put them in the environment and let the shell interpolate:
Fail loudly. curl exits 0 on a 4xx by default, which turns a failed script into a silently wrong one. Use --fail-with-body:
Keep bodies in files. Agent configurations are long and quoting them inline invites mistakes. -d @agent.json reads from disk and diffs in version control. A poll loop for a campaign, using only Python’s standard library:
VoicEra ships no CLI. There is no voicerctl; scripts/ contains only start-application-services.sh and stop-application-services.sh.