Tilbage til dashboard

Dokumentation

Lær, hvordan du bruger Asyntai

API-reference

Byg brugerdefinerede integrationer med Asyntai REST API

Hent API-nøgle

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
Starter300.000
Standard1.500.000
Pro6.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].