API-reference
Byg brugerdefinerede integrationer med Asyntai REST API
Betalt abonnement kræves: API-adgang er tilgængelig på Starter-, Standard- og Pro-abonnementer. Se priser
Oversigt
The Asyntai API allows you to integrate AI-powered customer support into any application. Send messages and receive intelligent responses grounded in your website content and knowledge base.
Godkendelse
Alle API-anmodninger kræver godkendelse med din API-nøgle. Du kan hente din API-nøgle fra siden API-indstillinger.
Inkluder din API-nøgle i anmodninger ved hjælp af en af disse metoder:
- Authorization-header (anbefalet):
Authorization: Bearer YOUR_API_KEY - X-API-Key-header:
X-API-Key: YOUR_API_KEY
Hold din API-nøgle hemmelig. Enhver med din nøgle kan tilgå din konto via API'en. Udsæt den aldrig i klientkode.
Basis-URL
https://asyntai.com/api/v1/
Slutpunkter
POST /chat/
Send en besked og modtag et AI-genereret svar.
Anmodningstekst
{
"message": "What are your business hours?",
"session_id": "user_123", // optional
"website_id": 1 // optional
}
| Parameter | Type | Påkrævet | Beskrivelse |
|---|---|---|---|
message |
streng | Ja | Brugerens besked, der skal sendes til AI'en |
session_id |
streng | Nej | Unik identifikator for samtalen. Brug samme session_id for at opretholde samtalens historik. |
website_id |
heltal | Nej | Specifikt websted-ID. Hvis det ikke angives, bruges dit primære websted. |
Svar
{
"success": true,
"response": "Our business hours are Monday-Friday, 9 AM to 5 PM EST.",
"session_id": "user_123"
}
Eksempel (cURL)
curl -X POST https://asyntai.com/api/v1/chat/ \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"message": "What are your business hours?", "session_id": "user_123"}'
Eksempel (Python)
import requests
response = requests.post(
"https://asyntai.com/api/v1/chat/",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
json={
"message": "What are your business hours?",
"session_id": "user_123"
}
)
data = response.json()
print(data["response"])
Eksempel (JavaScript)
const response = await fetch("https://asyntai.com/api/v1/chat/", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({
message: "What are your business hours?",
session_id: "user_123"
})
});
const data = await response.json();
console.log(data.response);
GET /websites/
List alle websteder, der er tilknyttet din konto.
Svar
{
"success": true,
"websites": [
{
"id": 1,
"name": "My Website",
"domain": "example.com",
"is_primary": true
}
]
}
Eksempel (cURL)
curl https://asyntai.com/api/v1/websites/ \
-H "Authorization: Bearer YOUR_API_KEY"
POST /websites/
Create a new AI agent. This does the same thing as adding a website in your dashboard: it makes the agent, reads your site, and writes the first draft of the AI instructions.
Use this to set up customers from your own software. You get back the widget ID and the code to put on the website.
Anmodningstekst
| Felt | Type | Beskrivelse |
|---|---|---|
domain |
streng | Required. The website address, for example example.com |
name |
streng | Optional. A display name for the agent. Useful when one website has several agents. |
crawl |
boolean | Optional, true by default. Set it to false to create the agent without reading the website. Nothing is crawled and no instructions are written. |
force |
boolean | Optional, false by default. Set it to true to add a website you already have. The copy is stored with a number after it. |
Svar
{
"success": true,
"website": {
"id": 42,
"domain": "example.com",
"name": "Support agent",
"widget_id": "asyntai_ab12cd34ef56",
"is_primary": true,
"crawl_started": true,
"instructions_status": "generating",
"job_id": "8f2c1e90-..."
},
"embed_code": "<script>...</script>"
}
Eksempel (cURL)
curl -X POST https://asyntai.com/api/v1/websites/ \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"domain": "example.com", "name": "Support agent"}'
Reading a website takes a few minutes, so this call answers straight away. Check when the agent is ready with the next endpoint.
Errors
| Code | Meaning |
|---|---|
403 |
You have reached the number of websites your plan allows. The answer tells you the limit. |
409 |
Your account already has this website. Send force as true to add it again. |
GET /websites/{id}/
Get one website and see whether it is ready. Use this after you create an agent, to wait until the website has been read and the AI instructions are written.
Svar
{
"success": true,
"website": {
"id": 42,
"domain": "example.com",
"name": "Support agent",
"widget_id": "asyntai_ab12cd34ef56",
"is_primary": true,
"created_at": "2026-08-11T09:12:00+00:00",
"ready": true,
"instructions": {
"status": "completed",
"has_instructions": true,
"characters": 3421
},
"crawl": {
"job_id": "8f2c1e90-...",
"status": "completed",
"pages_crawled": 47,
"pages_found": 50,
"max_pages": 50,
"completed_at": "2026-08-11T09:15:31+00:00",
"error": ""
},
"knowledge_items": 47
},
"embed_code": "<script>...</script>"
}
The ready field is true when nothing is still running. A crawl that failed also counts as ready, because it has finished. Look at the crawl status to see what happened.
Eksempel (cURL)
curl https://asyntai.com/api/v1/websites/42/ \
-H "Authorization: Bearer YOUR_API_KEY"
GET PATCH /websites/{id}/settings/
Read or change the chat widget settings for one website. These are the same settings you see on the Customize page: colours, the name of the assistant, the first message, lead capture, and everything else.
Reading the settings
A GET request returns every setting with its current value, plus a locked list. Locked shows the settings your plan cannot change, and which plans they need.
{
"success": true,
"settings": {
"ai_support_name": "AI Assistant",
"widget_color": "#6366f1",
"initial_message": "Hi, how can I help you?",
"hide_branding": false,
"...": "..."
},
"locked": {
"hide_branding": ["pro", "enterprise"],
"widget_style": ["pro", "enterprise"]
}
}
Changing the settings
A PATCH request changes only the settings you send. Everything you leave out stays as it is.
curl -X PATCH https://asyntai.com/api/v1/websites/42/settings/ \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"ai_support_name": "Ava", "widget_color": "#0f172a", "use_emoji": true}'
{
"success": true,
"updated": ["ai_support_name", "use_emoji", "widget_color"],
"settings": { "...": "..." },
"locked": { "...": "..." }
}
Plans
Each setting needs its own plan, the same as in the dashboard. For example, hiding the Asyntai branding needs the Pro plan, and voice input needs Standard.
| Plan needed | Indstillinger | Examples |
|---|---|---|
| Any paid plan | 25 | widget_color, ai_support_name, initial_message |
| Starter og derover | 22 | profile_picture, conversation_starters_enabled |
| Standard og derover | 25 | speech_to_text_enabled, image_vision_enabled, escalation_enabled |
| Pro | 6 | hide_branding, widget_style |
If you send a setting your plan does not allow, the whole request is refused with code 403 and nothing is saved. The same happens if any value is wrong, for example a colour that is not a hex code. Your settings never end up half changed.
GET PUT /websites/{id}/instructions/
Read or replace the AI instructions for one website. These are the rules that tell the assistant who it is, what it may say, and what it must not say. They are the same instructions you edit in the dashboard.
Reading
{
"success": true,
"instructions": "You are the support agent for Acme Tools...",
"characters": 1979,
"version": 7,
"mode": "instructions",
"ask_questions": true,
"generation_status": "completed",
"being_edited_by": null
}
Replacing
A PUT request replaces the whole text, the same as saving in the dashboard. There is no append mode. To add a paragraph, read the instructions, add your text, then write it back.
curl -X PUT https://asyntai.com/api/v1/websites/42/instructions/ \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"instructions": "You are the support agent for Acme Tools...", "version": 7}'
Anmodningstekst
| Felt | Type | Beskrivelse |
|---|---|---|
instructions |
streng | Required. The complete new text. It replaces everything that was there. |
version |
number | Optional but recommended. The version you read. If somebody changed the instructions since then, your write is refused instead of overwriting their work. |
mode |
streng | Optional. Either instructions or general. |
ask_questions |
boolean | Optional. Whether the assistant asks a follow-up question at the end of its answers. |
force |
boolean | Optional, false by default. Needed only when your new text is less than half the length of the current text. |
How your instructions are protected
Instructions can take hours to write, so a write can be refused to protect them:
| Code | Meaning |
|---|---|
400 |
Your new text is less than half the length of the current text. This catches a script that sends empty or cut-off text over instructions somebody spent hours on. Send force as true if you meant it. |
409 |
The instructions changed after you read them. Read them again, apply your change, then write. |
423 |
Somebody is editing the instructions in the dashboard right now. The answer tells you who. Try again in a couple of minutes. |
Every change also saves a copy of the previous text, so an earlier version can always be restored from the dashboard.
GET /conversations/
Hent samtalens historik for en specifik session.
Forespørgselsparametre
| Parameter | Type | Påkrævet | Beskrivelse |
|---|---|---|---|
session_id |
streng | Ja | Session-ID'et, som historikken skal hentes for |
limit |
heltal | Nej | Maks. beskeder der returneres (standard: 50, maks.: 100) |
Svar
{
"success": true,
"session_id": "user_123",
"messages": [
{
"role": "user",
"content": "What are your business hours?",
"timestamp": "2024-01-15T10:30:00Z"
},
{
"role": "assistant",
"content": "Our business hours are Monday-Friday, 9 AM to 5 PM EST.",
"timestamp": "2024-01-15T10:30:01Z",
"sender_type": "ai",
"agent_name": null,
"response_time_ms": 1840.5
}
]
}
Et spørgsmål og dets svar gemmes i én post, så begge har det samme timestamp. Træk ikke det ene fra det andet for at måle svarhastigheden, for resultatet er altid nul. Brug response_time_ms, som er den reelle tid, svaret tog, i millisekunder.
sender_type er ai, når chatbotten svarede, og human, når en af dine agenter overtog chatten. agent_name indeholder visningsnavnet på den agent.
Eksempel (cURL)
curl "https://asyntai.com/api/v1/conversations/?session_id=user_123&limit=20" \
-H "Authorization: Bearer YOUR_API_KEY"
GET /sessions/
List dine seneste chatsessioner. Brug dette til at finde session-ID'er, som du derefter kan sende til /conversations/ for at hente den fulde beskedhistorik.
Forespørgselsparametre
| Parameter | Type | Påkrævet | Beskrivelse |
|---|---|---|---|
limit |
heltal | Nej | Antal seneste sessioner der returneres (standard: 20, maks.: 100) |
website_id |
streng | Nej | Filtrer sessioner efter et specifikt websted-ID |
source |
streng | Nej | Filtrer efter sessionskilde: widget, api, whatsapp, instagram, messenger, gorgias, freshchat, zapier |
Svar
{
"success": true,
"sessions": [
{
"session_id": "session_abc123def",
"source": "widget",
"message_count": 5,
"first_message": "What are your business hours?",
"first_message_at": "2024-01-15T10:30:00Z",
"last_message_at": "2024-01-15T10:35:00Z",
"first_response_time_ms": 1840.5,
"first_human_response_at": null,
"started_at": "2024-01-15T10:29:58Z",
"ended_at": "2024-01-15T10:41:12Z",
"taken_over_at": null,
"website_domain": "example.com"
}
]
}
Tidsstempelfelter til rapportering
| Felt | Beskrivelse |
|---|---|
started_at |
Hvornår den besøgende åbnede chatten. Kun tilgængelig for widget-sessioner, fordi sessioner oprettet via API'et aldrig åbner en widget. |
first_message_at |
Hvornår den første besked i samtalen blev gemt. |
first_response_time_ms |
Hvor lang tid det første svar tog, i millisekunder. Brug dette til første svartid. |
first_human_response_at |
Hvornår en af dine agenter sendte det første svar. Værdien er null, når chatbotten klarede hele samtalen. |
taken_over_at |
Hvornår en agent overtog chatten fra chatbotten. |
last_message_at |
Hvornår den sidste besked i samtalen blev gemt. |
ended_at |
Hvornår den besøgende forlod chatten. En chat har ingen løst eller lukket tilstand, fordi en besøgende altid kan vende tilbage og stille et nyt spørgsmål. |
Alle tidsstempler er i UTC og bruger ISO 8601-formatet. Du kan ikke ændre tidszonen. Konvertér værdierne i dit eget rapporteringsværktøj.
Eksempel (cURL)
curl "https://asyntai.com/api/v1/sessions/?limit=10" \
-H "Authorization: Bearer YOUR_API_KEY"
GET /leads/
Hent indsamlede leads — e-mailadresser og telefonnumre indsendt af besøgende under chatsamtaler.
Forespørgselsparametre
| Parameter | Type | Påkrævet | Beskrivelse |
|---|---|---|---|
limit |
heltal | Nej | Antal leads der skal returneres (standard: 50, maks: 100) |
website_id |
streng | Nej | Filtrer leads efter et specifikt websted-ID |
Svar
{
"success": true,
"leads": [
{
"session_id": "session_abc123def",
"email": "[email protected]",
"phone": "+1234567890",
"page_url": "https://example.com/pricing",
"started_at": "2024-01-15T10:30:00Z"
}
]
}
| Felt | Type | Beskrivelse |
|---|---|---|
session_id |
streng | Chatsession-ID. Send dette til /conversations/ for at se den fulde chathistorik. |
email |
streng eller null | E-mailadresse angivet af den besøgende, eller null hvis ikke indsamlet |
phone |
streng eller null | Telefonnummer angivet af den besøgende, eller null hvis ikke indsamlet |
page_url |
streng eller null | Side-URL'en hvor den besøgende chattede |
started_at |
streng | ISO 8601 tidsstempel for hvornår chatsessionen startede |
Eksempel (cURL)
curl "https://asyntai.com/api/v1/leads/?limit=20" \
-H "Authorization: Bearer YOUR_API_KEY"
Eksempel (Python)
import requests
response = requests.get(
"https://asyntai.com/api/v1/leads/",
headers={"Authorization": "Bearer YOUR_API_KEY"},
params={"limit": 20}
)
leads = response.json()["leads"]
for lead in leads:
print(f"{lead['email'] or ''} | {lead['phone'] or ''}")
GET /account/
Hent dine kontooplysninger og brugsstatistikker.
Svar
{
"success": true,
"account": {
"email": "[email protected]",
"plan": "starter",
"messages_used": 150,
"messages_limit": 2500
}
}
Eksempel (cURL)
curl https://asyntai.com/api/v1/account/ \
-H "Authorization: Bearer YOUR_API_KEY"
Flere websteder? Vidensbasens slutpunkter anvender som standard dit primære websted. Hvis du har flere websteder, skal du sende website_id for at målrette en bestemt. Du kan finde dine hjemmeside-ID'er ved at bruge GET /websites/.
Daglige uploadgrænser: Upload til vidensbasen (tekst, URL, regneark) er underlagt en daglig tegngrænse baseret på dit abonnement. Dette gælder det samlede indhold, der uploades på tværs af alle vidensbasens slutpunkter pr. dag.
| Plan | Tegn/dag |
|---|---|
| Starter | 300.000 |
| Standard | 1.500.000 |
| Pro | 6.000.000 |
GET /knowledge/
List dine vidensbaseindgange. Dette er de indholdskilder, som din AI-chatbot bruger til at besvare spørgsmål.
Forespørgselsparametre
| Parameter | Type | Påkrævet | Beskrivelse |
|---|---|---|---|
limit |
heltal | Nej | Antal indgange der returneres (standard: 50, maks.: 100) |
website_id |
streng | Nej | Filtrer efter websted-ID (standard er dit primære websted) |
Svar
{
"success": true,
"entries": [
{
"id": "abc-123-def",
"type": "text",
"title": "Business Hours",
"description": "Manual text content (150 words)",
"created_at": "2024-01-15T10:30:00Z"
},
{
"id": "ghi-456-jkl",
"type": "url",
"title": "About Us - Example",
"description": "Content from https://example.com/about",
"created_at": "2024-01-14T09:00:00Z"
}
]
}
Eksempel (cURL)
curl "https://asyntai.com/api/v1/knowledge/?limit=10" \
-H "Authorization: Bearer YOUR_API_KEY"
POST /knowledge/text/
Tilføj brugerdefineret tekstindhold til din vidensbase. AI'en vil bruge dette til at besvare besøgendes spørgsmål.
Anmodningstekst
{
"title": "Return Policy",
"content": "We offer a 30-day return policy on all items. Items must be unused and in original packaging. Refunds are processed within 5-7 business days.",
"website_id": "123"
}
| Parameter | Type | Påkrævet | Beskrivelse |
|---|---|---|---|
title |
streng | Ja | En titel til denne vidensindgang |
content |
streng | Ja | Tekstindholdet (min. 10 tegn) |
website_id |
streng | Nej | Målwebsted (standard er dit primære websted) |
Svar
{
"success": true,
"id": "abc-123-def",
"title": "Return Policy",
"chunks_created": 1
}
Eksempel (cURL)
curl -X POST "https://asyntai.com/api/v1/knowledge/text/" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"title": "Return Policy", "content": "We offer a 30-day return policy..."}'
POST /knowledge/url/
Tilføj en webside til din vidensbase. Indholdet hentes og udtrækkes automatisk.
Anmodningstekst
{
"url": "https://example.com/faq",
"website_id": "123"
}
| Parameter | Type | Påkrævet | Beskrivelse |
|---|---|---|---|
url |
streng | Ja | URL'en, som indhold hentes fra |
website_id |
streng | Nej | Målwebsted (standard er dit primære websted) |
Svar
{
"success": true,
"id": "abc-123-def",
"title": "FAQ - Example",
"url": "https://example.com/faq",
"chunks_created": 5
}
Eksempel (cURL)
curl -X POST "https://asyntai.com/api/v1/knowledge/url/" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/faq"}'
POST /knowledge/spreadsheet/
Upload et CSV- eller Excel-regneark (.xlsx) til din vidensbase. Hver række bliver en separat vidensindgang, ideel til produktkataloger, FAQ-lister, pristabeller og mapper.
Anmodning
Send som multipart/form-data (filupload), ikke JSON.
| Parameter | Type | Påkrævet | Beskrivelse |
|---|---|---|---|
file |
fil | Ja | En .csv- eller .xlsx-fil. Første række skal være kolonneoverskrifter. Maks. rækker pr. upload: Starter 500, Standard 2.000, Pro 10.000. Overskydende rækker afkortes. |
website_id |
streng | Nej | Målwebsted (standard er dit primære websted) |
Svar
{
"success": true,
"id": "abc-123-def",
"title": "products.csv",
"rows_processed": 15,
"chunks_created": 15
}
Eksempel (cURL)
curl -X POST "https://asyntai.com/api/v1/knowledge/spreadsheet/" \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "[email protected]"
GET /knowledge/{id}/
Læs én post i vidensbasen, inklusive den tekst der er gemt for den. Værdien id kommer fra svaret på GET /knowledge/.
Indhold returneres for de poster, du selv har tilføjet: tekst, filer, regneark, enkelte URL'er og videoer. En hjemmesidegennemgang vises på listen, men dens sider returneres ikke, fordi kilden er dit eget offentlige websted. I det tilfælde er content lig null, og feltet reason forklarer hvorfor.
Svar
{
"success": true,
"id": "abc-123-def",
"type": "text",
"title": "Business Hours",
"description": "Manual text content (150 words)",
"created_at": "2024-01-15T10:30:00Z",
"chunks_count": 3,
"content": "We are open Monday to Friday, 9am to 5pm...",
"content_available": true,
"char_count": 43
}
Eksempel (cURL)
curl "https://asyntai.com/api/v1/knowledge/abc-123-def/" \
-H "Authorization: Bearer YOUR_API_KEY"
DELETE /knowledge/{id}/
Slet en vidensbaseindgang. id kan findes i svaret fra GET /knowledge/.
Svar
{
"success": true,
"message": "Knowledge base entry deleted"
}
Eksempel (cURL)
curl -X DELETE "https://asyntai.com/api/v1/knowledge/abc-123-def/" \
-H "Authorization: Bearer YOUR_API_KEY"
Tip: Du kan også administrere webhooks fra API-indstillinger siden uden at skrive nogen kode.
GET /webhooks/
List dine registrerede webhooks.
Svar
{
"success": true,
"webhooks": [
{
"id": "abc-123-def",
"url": "https://example.com/webhook",
"events": ["message.received", "escalation.requested"],
"is_active": true,
"created_at": "2024-01-15T10:30:00Z"
}
]
}
Eksempel (cURL)
curl "https://asyntai.com/api/v1/webhooks/" \
-H "Authorization: Bearer YOUR_API_KEY"
POST /webhooks/
Registrer en ny webhook for at modtage realtidsbegivenhedsnotifikationer.
Tilgængelige begivenheder
| Begivenhed | Beskrivelse |
|---|---|
message.received |
En besøgende sendte en besked og modtog et svar |
conversation.started |
En ny chatsession blev startet |
escalation.requested |
AI'en udløste en eskalering til en menneskelig agent |
takeover.started |
En menneskelig agent overtog en chatsession |
Anmodningstekst
{
"url": "https://example.com/webhook",
"events": ["message.received", "escalation.requested"],
"website_id": "123"
}
| Parameter | Type | Påkrævet | Beskrivelse |
|---|---|---|---|
url |
streng | Ja | HTTPS-URL'en til at modtage webhook POST-anmodninger |
events |
array | Ja | Liste over begivenheder, der abonneres på (se tabellen ovenfor) |
website_id |
streng | Nej | Målwebsted (standard er dit primære websted) |
Svar
{
"success": true,
"webhook": {
"id": "abc-123-def",
"url": "https://example.com/webhook",
"events": ["message.received", "escalation.requested"],
"secret": "whsec_abc123...",
"created_at": "2024-01-15T10:30:00Z"
}
}
Verificering af webhooks: Hver webhook inkluderer en secret (vises kun ved oprettelse). Hvert POST til din URL inkluderer en X-Webhook-Signature header — en HMAC-SHA256 af anmodningsteksten signeret med din hemmelighed.
Eksempel (cURL)
curl -X POST "https://asyntai.com/api/v1/webhooks/" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/webhook", "events": ["message.received"]}'
DELETE /webhooks/{id}/
Slet en webhook. id kan findes i svaret fra GET /webhooks/.
Svar
{
"success": true,
"message": "Webhook deleted"
}
Eksempel (cURL)
curl -X DELETE "https://asyntai.com/api/v1/webhooks/abc-123-def/" \
-H "Authorization: Bearer YOUR_API_KEY"
Fejlsvar
Alle fejlsvar følger dette format:
{
"success": false,
"error": "Error message describing what went wrong"
}
| Statuskode | Beskrivelse |
|---|---|
400 |
Ugyldig anmodning - Ugyldige parametre eller manglende påkrævede felter |
401 |
Ikke autoriseret - Ugyldig eller manglende API-nøgle |
429 |
For mange anmodninger - Beskedgrænsen for dit abonnement er nået |
503 |
Tjeneste utilgængelig - AI-tjenesten er midlertidigt utilgængelig |
Hastighedsgrænser
API-brug er begrænset af dit abonnement:
- Free: 100 beskeder/måned
- Starter ($39/md.): 2.500 beskeder/måned
- Standard ($139/md.): 15.000 beskeder/måned
- Pro ($449/md.): 50.000 beskeder/måned
Brug for hjælp?
Hvis du har spørgsmål eller støder på problemer, kan du kontakte os på [email protected].