An API that reads
like the dashboard.
Everything you can click, you can call. Assistants, calls, leads, campaigns, voices and models over plain REST with JSON. Keys carry scopes, webhooks carry signatures, and the docs are written for people who would rather copy a working example than read a spec. The spec is there too.
Three requests to your first call.
- Create a key under Developers → API keys, tick the scopes it needs
- Send it as the X-API-Key header; the key acts in the workspace it was created in
- Create an assistant, or use one you built in the dashboard, and place a call
- Poll the call, or let a webhook tell you when it completes
Base URL: https://nordtell.com/api/v1. Sixty requests a minute per key; above that you get a 429 and wait. Errors say which field was wrong.
# 1. an assistant, from a prompt in plain words curl -X POST https://nordtell.com/api/v1/assistants \ -H "X-API-Key: $NORDTELL_KEY" -H "Content-Type: application/json" \ -d '{"name": "Reception", "direction": "inbound", "engine": "hybrid", "config": {"prompt": "You are Freja, the receptionist at Nørrebro Clinic…"}}' # 2. a call curl -X POST https://nordtell.com/api/v1/calls/make \ -H "X-API-Key: $NORDTELL_KEY" -H "Content-Type: application/json" \ -d '{"agent_id": "ASSISTANT_ID", "to_number": "+4531183990", "variables": {"name": "Sara"}}' # 3. what happened curl https://nordtell.com/api/v1/calls/CALL_ID -H "X-API-Key: $NORDTELL_KEY"
We tap you on the shoulder.
Register a URL and a secret. When a call starts, is answered, ends or completes, you get a signed JSON body with the transcript, the summary, the variables the agent collected and the minutes it cost. One endpoint per system, so you can revoke the CRM's without touching Slack's.
- Events: call.started, call.answered, call.ended, call.completed, plus agent and lead events
- HMAC signature in the header; verify it, then trust the body
- Delivery log on every call, with the status your server answered
{
"event": "call.completed",
"data": {
"id": "b0c1…", "direction": "inbound", "duration_seconds": 134,
"from_number": "+45…", "summary": "Booked a check-up Tue 14:40.",
"variables": { "appointment": "2026-09-15T14:40" },
"transcript": [ … ]
}
}Your API, in the agent's hands.
A tool is a function with a name, a description and typed parameters. Point it at your HTTP endpoint and the model calls it mid-conversation, waits for the answer and speaks it. Already have an MCP server? Add its URL and every tool it exposes appears in the agent editor.
- Tool names are function names: check_availability, not "Check availability"
- Per-tool timeouts and a spoken filler while the tool runs
- Built-ins: transfer, end call, send SMS, current time
{
"name": "check_availability",
"description": "Free slots for a practitioner on a date",
"parameters": {
"practitioner": { "type": "string" },
"date": { "type": "string", "format": "date" }
},
"url": "https://clinic.example/api/slots",
"method": "GET"
}What is on the menu.
Each key gets only the scopes you tick. The full reference, with request and response bodies, lives in the docs and in the OpenAPI spec.
| Endpoint | Scope | What it does |
|---|---|---|
| GET / POST /assistants | agents:read / agents:write | List and create assistants; PATCH and DELETE by id |
| GET /calls, GET /calls/{id} | calls:read | Call list; transcript, summary, variables and deliveries |
| POST /calls/make | calls:make | Place an outbound call from an assistant's number |
| GET / POST /leads | leads:read / leads:write | Leads with phone, name, variables and status |
| POST /campaigns, …/leads, …/start, …/stop | campaigns:manage | Outbound campaigns: create, add leads, run, pause |
| GET /languages, /models, /voices | any key | The lookups the editor uses, so your UI can match ours |
Make a key. Make a call.
The free account includes the API. Keys live under Developers in the dashboard.