Free every month: 500 minutes on any model, no card needed.Start free

API reference

Everything the dashboard does is available over HTTPS. Authenticate with a workspace API key from the Keys page; keys carry scopes (agents:read, agents:write, calls:read, calls:write, numbers:write). Base URL https://voiceflint.com.

curl -H "Authorization: Bearer vf_live_..." https://voiceflint.com/api/v1/agents

Agents

List agents

GET /api/v1/agents

Returns every agent in the workspace with its stack, region and settings.

Create an agent

POST /api/v1/agents

Start from a preset (balanced, multilingual, lowest-latency, lowest-cost, highest-quality, speech-to-speech) or pass an explicit stack of catalog model ids.
curl -X POST https://voiceflint.com/api/v1/agents \
  -H "Authorization: Bearer vf_live_..." -H "content-type: application/json" \
  -d '{"name":"Front desk","systemPrompt":"You book appointments for Acme Dental.","preset":"balanced","region":"us-east","tools":[{"name":"book","description":"Book a slot","parameters":{"type":"object","properties":{"day":{"type":"string"}},"required":["day"]},"url":"https://example.com/book"}]}'

Steps, variables and knowledge

POST /api/v1/agents

Optional fields on the same call. workflow splits the conversation into steps; each step has a goal and transitions with a plain-language condition, and the agent moves between them silently. variables are defaults for {{placeholders}} in prompts; pass per-call values in variables on POST /api/v1/calls. Knowledge documents are added on the agent page and injected into the prompt.
"workflow": {"start": "identify", "steps": [
  {"id": "identify", "name": "Identify the issue", "goal": "Greet {{customer_name}} and find out why they are calling.",
   "edges": [{"to": "book", "condition": "The caller wants an appointment"}, {"to": "end", "condition": "The caller says goodbye"}]},
  {"id": "book", "name": "Book", "goal": "Collect a day and time, confirm them back, then call the book tool.", "tools": ["book"], "edges": [{"to": "end", "condition": "The booking is confirmed"}]}
]},
"variables": {"customer_name": ""}
Built-in tools on every call: end_call, transfer_call, send_dtmf, mark_do_not_call, skip_turn, switch_language, and update_state when variables are declared.

Calls

Place an outbound call

POST /api/v1/calls

Dials a number from one of your numbers with an outbound trunk. Refused when outbound is off, the number is on your do-not-call list, it is outside the local calling window, or the 24-hour frequency cap is reached.
curl -X POST https://voiceflint.com/api/v1/calls -H "Authorization: Bearer vf_live_..." -H "content-type: application/json" \
  -d '{"agentId":"<uuid>","to":"+14155550123","metadata":{"crmId":"42"}}'

List calls

GET /api/v1/calls?agentId=&limit=

Recent calls with status, duration, cost summary and latency percentiles.

Get a call

GET /api/v1/calls/:id

The full receipt (one line per model at list price, the managed-key fee, telephony, platform), the per-turn latency waterfall and the transcript.

Erase a call

DELETE /api/v1/calls/:id

Deletes transcript, recording and phone numbers for a call (data-subject requests). Billing totals are kept.

Numbers

List numbers

GET /api/v1/numbers

Numbers, their routing agent and whether an outbound trunk exists. Numbers are added under Numbers in the dashboard.

Webhooks

Add an endpoint under Keys. Each delivery is a JSON POST signed with HMAC-SHA256 of the raw body using your signing secret.

POST https://example.com/voiceflint
X-Voiceflint-Event: call.completed
X-Voiceflint-Signature: sha256=<hex hmac>

{"event":"call.completed","createdAt":"2026-09-09T12:00:00Z","data":{"id":"...","status":"completed","durationSec":252,"cost":{"total":0.1867,"charged":0.0},"latency":{"e2eP50":740,"e2eP95":910},"transcript":[{"role":"user","text":"..."}]}}

Web widget

Enable the widget on an agent to get a public key, then drop one script tag on any page. Visitors talk to the agent over WebRTC; calls appear in your dashboard with the same receipt.

<script src="https://voiceflint.com/widget.js" data-agent="pk_..." data-label="Talk to us"></script>

Or mint tokens yourself from a server with POST /api/public/token and connect with livekit-client.