Get started with the API
Connect your own systems to Telenoa — read and create inquiries, contacts, calls and knowledge with an API key.
The Telenoa API lets your own systems work directly with Telenoa: a web shop can create inquiries, a CRM can fetch contacts, and a dashboard can show Noa's calls. This page is for the person setting up the integration.
Want to use Telenoa from Claude, ChatGPT or another AI tool? Read MCP.
At a glance
| Address | https://app.telenoa.com/api/v1 |
| Format | JSON in and out |
| Key | Authorization: Bearer tln_live_… |
| Limit | 60 calls per minute per key |
| Description | OpenAPI 3.1 |
Field names and values are in Danish (henvendelser = inquiries, kontakter = contacts, opkald = calls, viden = knowledge), the same everywhere in the API.
Your first call
An administrator goes to Opsætning → Indstillinger (Setup → Settings) and opens the API og webhooks (API and webhooks) tab.
Click Opret nøgle (Create key). Give it a name, for example "Web shop", and choose only the access the system needs. See API keys.
Copy the key right away. It is not shown again.
Try it:
curl https://app.telenoa.com/api/v1/henvendelser?limit=5 \
-H "Authorization: Bearer tln_live_…"The response is a page of the newest inquiries:
{
"data": [
{
"id": "6f1c…",
"emne": "Quote for a kitchen",
"kanal": "formular",
"status": "modtaget",
"mappe": "indbakke",
"kontakt": { "navn": "Anna Jensen", "email": "anna@company.com", "telefon": null }
}
],
"naeste_cursor": "MTc…"
}Errors
All errors have the same shape. kode never changes, so your code can act on it. besked is written for people.
{ "fejl": { "kode": "ikke_fundet", "besked": "Henvendelsen findes ikke." } }| HTTP | kode | Meaning |
|---|---|---|
| 400 | ugyldig_foresporgsel | A field is wrong. detaljer says which. |
| 401 | uautoriseret | The key is missing, wrong, expired or revoked. |
| 403 | mangler_adgang | The key doesn't have the access needed. |
| 404 | ikke_fundet | Doesn't exist — or belongs to another company. |
| 409 | konflikt | Can't be done right now, for example there is no email account to reply from. |
| 413 | for_stor | The body is over 100 KB. |
| 422 | idempotens_konflikt | The Idempotency-Key was used for a different request. |
| 429 | for_mange_kald | Over 60 calls per minute. Wait the number of seconds in Retry-After. |
| 500 | intern_fejl | Something went wrong on our side. Try again shortly. |
Limits
Each key may make 60 calls per minute. Every response has these headers:
X-RateLimit-Limit— the limit (60)X-RateLimit-Remaining— calls left this minuteX-RateLimit-Reset— when the minute starts over (Unix time in seconds)
If several systems use the API, give each its own key. Then each has its own limit.
New inquiries via the API also follow the form limits: at most 20 per minute per key and 5 in 5 minutes from the same email address.
More pages
Lists return at most limit rows (default 25, max 100), newest first. If there are more, you get a naeste_cursor. Send it as cursor to get the next page. When naeste_cursor is null, you're done.
Don't send the same thing twice
Add the header Idempotency-Key to a POST, for example your order number. If you send exactly the same call again with the same key within 24 hours, you get the first response back and nothing new happens. The response then has the header Idempotent-Replayed: true.
That makes it safe to retry when a connection drops.
Only your own data
A key belongs to one company. Everything you can read and change with it is your own inquiries, contacts, calls and knowledge — never anyone else's.
If you ask for an id that belongs to another company, the answer is the same as for an id that doesn't exist: 404.
Versions
The address contains the version (/api/v1). We add fields and endpoints without changing the version, but we never remove or rename anything in v1. Let your code ignore fields it doesn't know.