API-Referenz
Erstellen Sie individuelle Integrationen mit der Asyntai REST API
Kostenpflichtiger Tarif erforderlich: API-Zugang ist in den Starter-, Standard- und Pro-Tarifen verfügbar. Preise ansehen
Übersicht
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.
Authentifizierung
All API requests require authentication using your API key. You can get your API key from the API Settings page.
Fügen Sie Ihren API-Schlüssel in Anfragen mit einer dieser Methoden ein:
- Authorization-Header (empfohlen):
Authorization: Bearer YOUR_API_KEY - X-API-Key-Header:
X-API-Key: YOUR_API_KEY
Halten Sie Ihren API-Schlüssel geheim. Jeder mit Ihrem Schlüssel kann über die API auf Ihr Konto zugreifen. Geben Sie ihn niemals in clientseitigem Code preis.
Basis-URL
https://asyntai.com/api/v1/
Endpunkte
POST /chat/
Senden Sie eine Nachricht und erhalten Sie eine KI-generierte Antwort.
Anfragekörper
{
"message": "What are your business hours?",
"session_id": "user_123", // optional
"website_id": 1 // optional
}
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
message |
string | Ja | Die Nachricht des Benutzers, die an die KI gesendet wird |
session_id |
string | Nein | Eindeutige Kennung für die Konversation. Verwenden Sie dieselbe session_id, um den Gesprächsverlauf beizubehalten. |
website_id |
integer | Nein | Spezifische Website-ID. Wenn nicht angegeben, wird Ihre primäre Website verwendet. |
Antwort
{
"success": true,
"response": "Our business hours are Monday-Friday, 9 AM to 5 PM EST.",
"session_id": "user_123"
}
Beispiel (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"}'
Beispiel (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"])
Beispiel (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/
Alle mit Ihrem Konto verknüpften Websites auflisten.
Antwort
{
"success": true,
"websites": [
{
"id": 1,
"name": "My Website",
"domain": "example.com",
"is_primary": true
}
]
}
Beispiel (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.
Anfragekörper
| Feld | Typ | Beschreibung |
|---|---|---|
domain |
string | Required. The website address, for example example.com |
name |
string | 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. |
Antwort
{
"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>"
}
Beispiel (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.
Antwort
{
"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.
Beispiel (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": "#0B0D10",
"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 | Einstellungen | Examples |
|---|---|---|
| Any paid plan | 25 | widget_color, ai_support_name, initial_message |
| Starter und höher | 22 | profile_picture, conversation_starters_enabled |
| Standard und höher | 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}'
Anfragekörper
| Feld | Typ | Beschreibung |
|---|---|---|
instructions |
string | 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 |
string | 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/
Konversationsverlauf für eine bestimmte Sitzung abrufen.
Abfrageparameter
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
session_id |
string | Ja | Die Sitzungs-ID, für die der Verlauf abgerufen werden soll |
limit |
integer | Nein | Maximale Anzahl zurückzugebender Nachrichten (Standard: 50, Max: 100) |
Antwort
{
"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
}
]
}
Eine Frage und ihre Antwort werden in einem Datensatz gespeichert, daher tragen beide denselben timestamp. Ziehen Sie nicht den einen vom anderen ab, um die Antwortgeschwindigkeit zu messen, denn das Ergebnis ist immer null. Verwenden Sie response_time_ms, die tatsächliche Dauer der Antwort in Millisekunden.
sender_type ist ai, wenn der Chatbot geantwortet hat, und human, wenn einer Ihrer Agenten den Chat übernommen hat. agent_name enthält den Anzeigenamen dieses Agenten.
Beispiel (cURL)
curl "https://asyntai.com/api/v1/conversations/?session_id=user_123&limit=20" \
-H "Authorization: Bearer YOUR_API_KEY"
GET /sessions/
Listen Sie Ihre letzten Chat-Sitzungen auf. Verwenden Sie dies, um Sitzungs-IDs zu finden, die Sie dann an /conversations/ übergeben können, um den vollständigen Nachrichtenverlauf abzurufen.
Abfrageparameter
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
limit |
integer | Nein | Anzahl der zurückzugebenden letzten Sitzungen (Standard: 20, Max: 100) |
website_id |
string | Nein | Sitzungen nach einer bestimmten Website-ID filtern |
source |
string | Nein | Nach Sitzungsquelle filtern: widget, api, whatsapp, instagram, messenger, gorgias, freshchat, zapier |
since |
string | Nein | Nur Sitzungen, deren letzte Nachricht an oder nach diesem ISO-Datum liegt, zum Beispiel 2024-01-15 |
before |
string | Nein | Nur Sitzungen, deren letzte Nachricht vor diesem ISO-Datum oder Zeitpunkt liegt. Verwenden Sie es zum Rückwärtsblättern, siehe unten. |
Antwort
{
"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,
"page_url": "https://example.com/pricing",
"country": "Germany",
"category": "Pricing",
"website_domain": "example.com"
}
]
}
Zeitstempelfelder für Berichte
| Feld | Beschreibung |
|---|---|
started_at |
Wann der Besucher den Chat geöffnet hat. Nur für Widget-Sitzungen verfügbar, da über die API erstellte Sitzungen nie ein Widget öffnen. |
first_message_at |
Wann die erste Nachricht der Unterhaltung gespeichert wurde. |
first_response_time_ms |
Wie lange die erste Antwort gedauert hat, in Millisekunden. Verwenden Sie dies für die erste Antwortzeit. |
first_human_response_at |
Wann einer Ihrer Agenten die erste Antwort gesendet hat. Der Wert ist null, wenn der Chatbot die gesamte Unterhaltung bearbeitet hat. |
taken_over_at |
Wann ein Agent den Chat vom Chatbot übernommen hat. |
last_message_at |
Wann die letzte Nachricht der Unterhaltung gespeichert wurde. |
ended_at |
Wann der Besucher den Chat verlassen hat. Ein Chat hat keinen Status gelöst oder geschlossen, weil ein Besucher jederzeit zurückkehren und eine weitere Frage stellen kann. |
Alle Zeitstempel sind in UTC und verwenden das Format ISO 8601. Sie können die Zeitzone nicht ändern. Rechnen Sie die Werte in Ihrem eigenen Berichtstool um.
Weitere Felder für Berichte
| Feld | Beschreibung |
|---|---|
page_url |
Die Seite, auf der sich der Besucher beim Start des Chats befand. Nur für Widget-Sitzungen verfügbar. |
country |
Das Land des Besuchers, aus der IP-Adresse zum Zeitpunkt des Chats. Nur für Widget-Sitzungen verfügbar. |
category |
Das Thema aus den Chat-Kategorien. Leer, wenn die Funktion aus ist oder der tägliche Lauf diesen Chat noch nicht zugeordnet hat. |
Beispiel (cURL)
curl "https://asyntai.com/api/v1/sessions/?since=2024-01-01&limit=100" \
-H "Authorization: Bearer YOUR_API_KEY"
Durch die Historie blättern
Ein Aufruf liefert höchstens 100 Sitzungen, neueste zuerst. Um weiter zurückzulesen, nehmen Sie last_message_at der letzten Sitzung auf der Seite und übergeben Sie es beim nächsten Aufruf als before. Wiederholen Sie das, bis ein Aufruf eine leere Liste liefert.
import requests
url = "https://asyntai.com/api/v1/sessions/"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
params = {"since": "2024-01-01", "limit": 100}
sessions = []
while True:
page = requests.get(url, headers=headers, params=params).json()["sessions"]
if not page:
break
sessions.extend(page)
params["before"] = page[-1]["last_message_at"]
print(len(sessions), "sessions since 2024-01-01")
GET /leads/
Gesammelte Leads abrufen — E-Mail-Adressen und Telefonnummern, die von Besuchern während Chat-Gesprächen übermittelt wurden.
Abfrageparameter
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
limit |
integer | Nein | Anzahl der zurückzugebenden Leads (Standard: 50, Max: 100) |
website_id |
string | Nein | Leads nach einer bestimmten Website-ID filtern |
since |
string | Nein | Nur Leads, die an oder nach diesem ISO-Datum begonnen haben, zum Beispiel 2024-01-15 |
before |
string | Nein | Nur Leads, die vor diesem ISO-Datum oder Zeitpunkt begonnen haben. Damit blättern Sie rückwärts durch die gesamte Historie. |
Antwort
{
"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"
}
]
}
| Feld | Typ | Beschreibung |
|---|---|---|
session_id |
string | Die Chat-Sitzungs-ID. Übergeben Sie diese an /conversations/, um den vollständigen Chatverlauf zu sehen. |
email |
String oder null | Vom Besucher angegebene E-Mail-Adresse, oder null wenn nicht erfasst |
phone |
String oder null | Vom Besucher angegebene Telefonnummer, oder null wenn nicht erfasst |
page_url |
String oder null | Die Seiten-URL, auf der der Besucher gechattet hat |
started_at |
string | ISO 8601 Zeitstempel des Chat-Sitzungsbeginns |
Beispiel (cURL)
curl "https://asyntai.com/api/v1/leads/?limit=20" \
-H "Authorization: Bearer YOUR_API_KEY"
Beispiel (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 /tickets/
Rufen Sie Support-Tickets mit den Zeitstempeln ab, die Sie zur Messung der Bearbeitungszeiten brauchen: wann das Ticket einging, wann es jemand übernommen hat, wann es zum ersten Mal beantwortet wurde und wann es gelöst war.
Abfrageparameter
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
limit |
integer | Nein | Anzahl der zurückgegebenen Tickets (Standard: 50, max.: 100) |
website_id |
string | Nein | Tickets nach Website-ID oder nach der Domain der Website filtern, zum Beispiel example.com |
name |
string | Nein | Nach einem beliebigen Teil des Besuchernamens filtern, zum Beispiel anna |
status |
string | Nein | Nach Status filtern: open, in_progress, resolved oder closed |
since |
string | Nein | Nur Tickets, die an oder nach diesem ISO-Datum erstellt wurden, zum Beispiel 2024-01-15 |
before |
string | Nein | Nur Tickets, die vor diesem ISO-Datum oder Zeitpunkt erstellt wurden. Verwenden Sie es zum Rückwärtsblättern, siehe unten. |
Antwort
{
"success": true,
"tickets": [
{
"ticket_number": "TKT-00001",
"session_id": "session_abc123def",
"status": "resolved",
"priority": "medium",
"subject": "Cannot complete checkout",
"visitor_email": "[email protected]",
"visitor_name": "Anna Novak",
"page_url": "https://example.com/checkout",
"website_id": 12,
"channel": "session",
"assigned_to": "[email protected]",
"created_at": "2024-01-15T10:30:00Z",
"first_assigned_at": "2024-01-15T10:41:00Z",
"first_response_at": "2024-01-15T11:02:00Z",
"resolved_at": "2024-01-15T12:20:00Z"
}
]
}
| Feld | Typ | Beschreibung |
|---|---|---|
ticket_number |
string | Die Ticketnummer, die in Ihrem Dashboard angezeigt wird |
session_id |
string | Die Chat-Sitzung, aus der das Ticket stammt. Übergeben Sie sie an /conversations/, um den gesamten Chat hinter dem Ticket zu lesen. |
visitor_name |
String oder null | Der Name des Besuchers oder null, wenn der Besucher keinen angegeben hat |
status |
string | Einer von: open, in_progress, resolved, closed |
priority |
string | Einer von: low, medium, high |
channel |
string | Woher das Gespräch kam, zum Beispiel session für das Web-Chat-Widget |
assigned_to |
String oder null | Das Teammitglied, das das Ticket hat, oder null, wenn es niemand übernommen hat |
created_at |
string | Wann das Ticket erstellt wurde |
first_assigned_at |
String oder null | Wann jemand das Ticket zuerst übernommen hat. Null, wenn es niemand getan hat. |
first_response_at |
String oder null | Wann die erste Antwort aus Asyntai gesendet wurde. Null, wenn es aus Asyntai keine Antwort gab. |
resolved_at |
String oder null | Wann das Ticket als gelöst markiert wurde. Null, solange es offen ist. |
Wir sehen nur eine Antwort, die aus Asyntai gesendet wurde. Antwortet Ihr Team einem Besucher stattdessen aus dem eigenen Postfach, sehen wir das nie, und first_response_at bleibt leer, obwohl der Besucher beantwortet wurde. Denken Sie daran, bevor Sie diese Zahlen mitteln.
Alle Zeitstempel sind in UTC und verwenden das ISO-8601-Format. Tickets, die vor dieser Funktion erstellt wurden, haben kein first_assigned_at und kein first_response_at, weil diese Zeiten nie erfasst wurden.
Beispiel (cURL)
curl "https://asyntai.com/api/v1/tickets/?status=resolved&limit=20" \
-H "Authorization: Bearer YOUR_API_KEY"
Beispiel (Python)
import requests
from datetime import datetime
response = requests.get(
"https://asyntai.com/api/v1/tickets/",
headers={"Authorization": "Bearer YOUR_API_KEY"},
params={"since": "2024-01-01", "limit": 100}
)
for ticket in response.json()["tickets"]:
if ticket["first_response_at"]:
created = datetime.fromisoformat(ticket["created_at"])
replied = datetime.fromisoformat(ticket["first_response_at"])
print(ticket["ticket_number"], replied - created)
Durch die Historie blättern
Ein Aufruf liefert höchstens 100 Tickets, neueste zuerst. Um weiter zurückzulesen, nehmen Sie created_at des letzten Tickets auf der Seite und übergeben Sie es beim nächsten Aufruf als before. Wiederholen Sie das, bis ein Aufruf eine leere Liste liefert.
import requests
url = "https://asyntai.com/api/v1/tickets/"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
params = {"since": "2024-01-01", "limit": 100}
tickets = []
while True:
page = requests.get(url, headers=headers, params=params).json()["tickets"]
if not page:
break
tickets.extend(page)
params["before"] = page[-1]["created_at"]
print(len(tickets), "tickets since 2024-01-01")
GET /account/
Ihre Kontoinformationen und Nutzungsstatistiken abrufen.
Antwort
{
"success": true,
"account": {
"email": "[email protected]",
"plan": "starter",
"messages_used": 150,
"messages_limit": 800
}
}
Beispiel (cURL)
curl https://asyntai.com/api/v1/account/ \
-H "Authorization: Bearer YOUR_API_KEY"
Mehrere Websites? Wissensdatenbank-Endpunkte verwenden standardmäßig Ihre primäre Website. Wenn Sie mehrere Websites haben, übergeben Sie website_id um eine bestimmte auszuwählen. Sie finden Ihre Website-IDs mit GET /websites/.
Tägliche Upload-Limits: Wissensdatenbank-Uploads (Text, URL, Tabellenkalkulation) unterliegen einem täglichen Zeichenlimit basierend auf Ihrem Plan. Dies gilt für den gesamten Inhalt, der pro Tag über alle Wissensdatenbank-Endpunkte hochgeladen wird.
| Plan | Zeichen/Tag |
|---|---|
| Starter | 300.000 |
| Standard | 1.500.000 |
| Pro | 6.000.000 |
GET /knowledge/
Listen Sie Ihre Wissensdatenbank-Einträge auf. Dies sind die Inhaltsquellen, die Ihr KI-Chatbot zur Beantwortung von Fragen verwendet.
Abfrageparameter
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
limit |
integer | Nein | Anzahl der zurückzugebenden Einträge (Standard: 50, Max: 100) |
website_id |
string | Nein | Nach Website-ID filtern (Standard ist Ihre primäre Website) |
Antwort
{
"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"
}
]
}
Beispiel (cURL)
curl "https://asyntai.com/api/v1/knowledge/?limit=10" \
-H "Authorization: Bearer YOUR_API_KEY"
POST /knowledge/text/
Fügen Sie benutzerdefinierten Textinhalt zu Ihrer Wissensdatenbank hinzu. Die KI wird diesen verwenden, um Besucherfragen zu beantworten.
Anfragekörper
{
"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 | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
title |
string | Ja | Ein Titel für diesen Wissensdatenbank-Eintrag |
content |
string | Ja | Der Textinhalt (mindestens 10 Zeichen) |
website_id |
string | Nein | Zielwebsite (Standard ist Ihre primäre Website) |
Antwort
{
"success": true,
"id": "abc-123-def",
"title": "Return Policy",
"chunks_created": 1
}
Beispiel (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/
Fügen Sie eine Webseite zu Ihrer Wissensdatenbank hinzu. Der Inhalt wird automatisch abgerufen und extrahiert.
Anfragekörper
{
"url": "https://example.com/faq",
"website_id": "123"
}
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
url |
string | Ja | Die URL, von der der Inhalt abgerufen werden soll |
website_id |
string | Nein | Zielwebsite (Standard ist Ihre primäre Website) |
Antwort
{
"success": true,
"id": "abc-123-def",
"title": "FAQ - Example",
"url": "https://example.com/faq",
"chunks_created": 5
}
Beispiel (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/
Laden Sie eine CSV- oder Excel-Tabelle (.xlsx) in Ihre Wissensdatenbank hoch. Jede Zeile wird zu einem separaten Wissensdatenbank-Eintrag – ideal für Produktkataloge, FAQ-Listen, Preistabellen und Verzeichnisse.
Anfrage
Als multipart/form-data (Datei-Upload) senden, nicht als JSON.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
file |
Datei | Ja | Eine .csv- oder .xlsx-Datei. Die erste Zeile muss Spaltenüberschriften enthalten. Maximale Zeilen pro Upload: Starter 500, Standard 2.000, Pro 10.000. Überschüssige Zeilen werden abgeschnitten. |
website_id |
string | Nein | Zielwebsite (Standard ist Ihre primäre Website) |
Antwort
{
"success": true,
"id": "abc-123-def",
"title": "products.csv",
"rows_processed": 15,
"chunks_created": 15
}
Beispiel (cURL)
curl -X POST "https://asyntai.com/api/v1/knowledge/spreadsheet/" \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "[email protected]"
GET /knowledge/{id}/
Lesen Sie einen einzelnen Eintrag der Wissensdatenbank samt dem dafür gespeicherten Text. Die id stammt aus der Antwort von GET /knowledge/.
Inhalte werden für die Einträge zurückgegeben, die Sie selbst hinzugefügt haben: Text, Dateien, Tabellen, einzelne URLs und Videos. Ein Website-Crawl wird aufgelistet, seine Seiten werden jedoch nicht zurückgegeben, da die Quelle Ihre eigene öffentliche Website ist. In diesem Fall ist content gleich null, und das Feld reason erklärt den Grund.
Antwort
{
"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
}
Beispiel (cURL)
curl "https://asyntai.com/api/v1/knowledge/abc-123-def/" \
-H "Authorization: Bearer YOUR_API_KEY"
DELETE /knowledge/{id}/
Einen Wissensdatenbank-Eintrag löschen. Die id finden Sie in der Antwort von GET /knowledge/.
Antwort
{
"success": true,
"message": "Knowledge base entry deleted"
}
Beispiel (cURL)
curl -X DELETE "https://asyntai.com/api/v1/knowledge/abc-123-def/" \
-H "Authorization: Bearer YOUR_API_KEY"
Tipp: Sie können Webhooks auch über die API-Einstellungen Seite verwalten, ohne Code zu schreiben.
GET /webhooks/
Ihre registrierten Webhooks auflisten.
Antwort
{
"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"
}
]
}
Beispiel (cURL)
curl "https://asyntai.com/api/v1/webhooks/" \
-H "Authorization: Bearer YOUR_API_KEY"
POST /webhooks/
Registrieren Sie einen neuen Webhook, um Echtzeit-Ereignisbenachrichtigungen zu erhalten.
Verfügbare Ereignisse
| Ereignis | Beschreibung |
|---|---|
message.received |
Ein Besucher hat eine Nachricht gesendet und eine Antwort erhalten |
conversation.started |
Eine neue Chat-Sitzung wurde gestartet |
escalation.requested |
Die KI hat eine Eskalation an einen menschlichen Agenten ausgelöst |
takeover.started |
Ein menschlicher Agent hat eine Chat-Sitzung übernommen |
Anfragekörper
{
"url": "https://example.com/webhook",
"events": ["message.received", "escalation.requested"],
"website_id": "123"
}
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
url |
string | Ja | Die HTTPS-URL zum Empfangen von Webhook-POST-Anfragen |
events |
Array | Ja | Liste der Ereignisse, die abonniert werden sollen (siehe Tabelle oben) |
website_id |
string | Nein | Zielwebsite (Standard ist Ihre primäre Website) |
Antwort
{
"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"
}
}
Webhooks verifizieren: Jeder Webhook enthält ein secret (wird nur bei der Erstellung angezeigt). Jeder POST an Ihre URL enthält ein X-Webhook-Signature Header — ein HMAC-SHA256 des Anfragetexts, signiert mit Ihrem Geheimnis.
Beispiel (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}/
Einen Webhook löschen. Die id finden Sie in der Antwort von GET /webhooks/.
Antwort
{
"success": true,
"message": "Webhook deleted"
}
Beispiel (cURL)
curl -X DELETE "https://asyntai.com/api/v1/webhooks/abc-123-def/" \
-H "Authorization: Bearer YOUR_API_KEY"
Fehlerantworten
Alle Fehlerantworten folgen diesem Format:
{
"success": false,
"error": "Error message describing what went wrong"
}
| Statuscode | Beschreibung |
|---|---|
400 |
Bad Request – Ungültige Parameter oder fehlende Pflichtfelder |
401 |
Unauthorized – Ungültiger oder fehlender API-Schlüssel |
429 |
Too Many Requests – Nachrichtenlimit für Ihren Tarif erreicht |
503 |
Service Unavailable – KI-Dienst vorübergehend nicht verfügbar |
Ratenbegrenzungen
Die API-Nutzung ist durch Ihren Abonnementplan begrenzt:
- Free: 50 Nachrichten/Monat
- Starter (39 $/Monat): 800 Nachrichten/Monat
- Standard (139 $/Monat): 15.000 Nachrichten/Monat
- Pro (449 $/Monat): 50.000 Nachrichten/Monat
Brauchen Sie Hilfe?
If you have any questions or run into issues, contact us at [email protected].