Task Interface
Ein Endpunkt. Einfache Sprache. Der Agent erledigt alles andere.
Der Wandel
Herkömmliche Integrationen zwingen dich, Endpunkte zu lernen, Felder zuzuordnen, Schemata zu versionieren und jeden Sonderfall abzudecken. Das Chat-Agent-Gateway ersetzt all das durch agentische Kommunikation. Beschreibe, was du brauchst. Der eigene Agent von SOIS interpretiert deine Absicht, klärt die Details, führt sie über deinen Workspace aus und antwortet mit dem Ergebnis. Das ist der Einstieg für Aufrufer, die keine eigene KI mitbringen. Wenn du bereits einen Agenten hast, verbinde ihn stattdessen direkt über den MCP-Server.
Keine Konnektoren. Keine Middleware. Keine Drittanbieter-Automatisierungsschicht.
Authentifizierung
Jede Nachricht erfordert zwei Zugangsdaten:
| Header | Wert | Funktion |
|---|---|---|
Authorization |
Bearer <token> |
Weist nach, wer du bist |
X-Api-Key |
sois_... |
Steuert dein Budget, deinen Webhook und die Signierung |
Warum zwei? Dein Token weist deine Identität nach. Dein Key steuert die Ausgaben. Wenn nur eines davon durchsickert, ist es ohne das andere nutzlos. Ein Benutzer kann mehrere Keys mit unterschiedlichen Budgets für unterschiedliche Integrationen haben.
Beides erhältst du unter Settings in deinem Sois AI Workspace.
Eine Nachricht senden
POST /api/agent
Headers
Authorization: Bearer <your_token>
X-Api-Key: sois_...
Content-Type: application/json
Body
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
message |
string | Ja | Sag dem Agenten, was du brauchst, in einfacher Sprache, bis zu 10.000 Zeichen |
context.entity_type |
string | Nein | Hinweis: contact, task, document, inbox usw. |
context.entity_id |
string | Nein | Ein bestimmter Datensatz, mit dem gearbeitet werden soll |
context.action |
string | Nein | Hinweis: create, update, search, summarize |
metadata |
object | Nein | Beliebige zusätzliche Schlüssel-Wert-Daten für den Agenten |
Beispiel
curl -X POST "https://your-workspace.sois.ai/api/agent" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "X-Api-Key: sois_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"message": "Create a contact for John Smith at Acme Corp, [email protected], +44 7700 900000",
"context": { "entity_type": "contact", "action": "create" }
}'
Antwort 202 Accepted
{
"conversation_uuid": "6cafd8ba-dd51-4411-808e-671d1dd59561",
"status": "accepted",
"message": "Your request has been queued."
}
Deine Nachricht ist im Gateway. Der Agent übernimmt von hier.
Die Antwort empfangen
Du hast zwei Möglichkeiten: auf den Webhook warten oder die Unterhaltung abfragen.
Option 1: Webhook (empfohlen)
Wenn dein Key eine response_url hat, liefert der Agent das Ergebnis direkt an dich, sobald er fertig ist: signiert, verifiziert, ohne Polling.
POST https://your-app.com/webhook
Content-Type: application/json
X-Signature: <hmac_sha256>
X-Conversation-UUID: 6cafd8ba-...
Resolved:
{
"conversation_uuid": "6cafd8ba-...",
"status": "resolved",
"response": "Contact created: John Smith, Acme Corp, [email protected], +44 7700 900000."
}
Failed:
{
"conversation_uuid": "6cafd8ba-...",
"status": "failed",
"error": "An error occurred while processing your request."
}
Option 2: Die Unterhaltung abfragen
GET /api/agent/{conversation_uuid}
Authorization: Bearer <your_token>
X-Api-Key: sois_...
Antwort 200 OK:
{
"conversation_uuid": "6cafd8ba-...",
"status": "resolved",
"turns": [
{
"role": "user",
"payload": { "message": "Find all contacts from London" },
"timestamp": "2026-02-12T01:07:03+00:00"
},
{
"role": "agent",
"payload": {
"content": "I found 12 contacts based in London..."
},
"timestamp": "2026-02-12T01:07:13+00:00"
}
],
"webhook": {
"status": "delivered",
"delivered_at": "2026-02-12T01:07:14+00:00"
},
"resolved_at": "2026-02-12T01:07:13+00:00",
"expires_at": "2026-02-13T01:07:03+00:00",
"created_at": "2026-02-12T01:07:03+00:00"
}
Status der Unterhaltung
| Status | Was passiert |
|---|---|
open |
Im Gateway, wartet auf den Agenten |
processing |
Der Agent arbeitet daran |
resolved |
Fertig, die Antwort steht im letzten Turn |
failed |
Konnte nach Wiederholungen nicht abgeschlossen werden |
Webhook-Signaturen verifizieren
Jeder Webhook wird mit HMAC-SHA256 unter Verwendung des Signing Secret deines Keys signiert. Verifiziere ihn immer vor der Verarbeitung.
Python:
import hmac, hashlib
expected = hmac.new(
key=your_signing_secret.encode(),
msg=raw_request_body.encode(),
digestmod=hashlib.sha256
).hexdigest()
assert expected == request.headers['X-Signature']
Node.js:
const crypto = require('crypto');
const expected = crypto
.createHmac('sha256', signingSecret)
.update(rawBody)
.digest('hex');
if (expected !== req.headers['x-signature']) {
throw new Error('Invalid signature');
}
PHP:
$expected = hash_hmac('sha256', $rawBody, $signingSecret);
if (!hash_equals($expected, $request->header('X-Signature'))) {
abort(403, 'Invalid signature');
}
Beispielunterhaltungen
Der Agent hat vollen Zugriff auf deinen Sois AI Workspace. Hier sind einige Dinge, um die du ihn bitten kannst:
Suchen:
{ "message": "Find all contacts from London" }
Erstellen:
{
"message": "Create a contact: Jane Doe, CEO of Acme Corp, [email protected]",
"context": { "entity_type": "contact", "action": "create" }
}
E-Mail:
{
"message": "Send an email to [email protected] introducing our new product line",
"context": { "entity_type": "inbox", "action": "compose" }
}
Aufgaben:
{
"message": "Create a task: Research competitor pricing for Q1 2026",
"context": { "entity_type": "task", "action": "create" }
}
Zusammenfassen:
{
"message": "Give me a full summary of this contact",
"context": { "entity_type": "contact", "entity_id": "abc-123", "action": "summarize" }
}
Mehrstufig:
{ "message": "Find the Q1 report, summarise it, and email the summary to the sales team" }
Der Agent klärt Mehrdeutigkeiten. Wenn er erst suchen muss, bevor er handeln kann, sucht er. Wenn mehrere Datensätze passen, wählt er den besten und erklärt dir warum. Keine starren Schemata, nur Absicht.
Key-Verwaltung
Verwalte deine Keys unter Settings > API Keys in deinem Sois AI Workspace oder programmatisch.
Einen Key erstellen
POST /api/api-keys
{
"label": "My CRM Integration",
"response_url": "https://your-app.com/webhook",
"budget_usd_cents": 5000,
"budget_period": "monthly"
}
Die Antwort enthält deinen Key (wird einmal angezeigt, kopiere ihn sofort) und dein Signing Secret zur Webhook-Verifizierung.
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
label |
string | Nein | Ein Name für diesen Key |
response_url |
url | Nein | Wohin Webhook-Antworten geliefert werden |
budget_usd_cents |
integer | Nein | Ausgabenobergrenze in US-Cent |
budget_period |
string | Nein | daily, monthly oder total |
Keys verwalten
| Methode | Endpunkt | Beschreibung |
|---|---|---|
GET |
/api/api-keys |
Alle deine Keys auflisten |
POST |
/api/api-keys |
Einen neuen Key erstellen |
GET |
/api/api-keys/{id} |
Key-Details und Nutzungsstatistiken |
PUT |
/api/api-keys/{id} |
Label, Webhook-URL oder Budget aktualisieren |
DELETE |
/api/api-keys/{id} |
Einen Key widerrufen |
Budgetsteuerung
Herkömmliche Integrationen drosseln dich mit willkürlichen Rate Limits: 100 Anfragen pro Minute, 10.000 pro Tag. Das Chat-Agent-Gateway rechnet in Dollar.
Lege ein Budget pro Key fest. Der Agent berechnet Credits pro Aktion. Du bestimmst, was jede Integration wert ist.
| Feld | Beschreibung |
|---|---|
budget_usd_cents |
Obergrenze in US-Cent (z. B. 5000 = 50 $). null = unbegrenzt. |
budget_period |
daily setzt um Mitternacht zurück, monthly am 1., total setzt nie zurück |
Wird ein Budget überschritten, geben Nachrichten 429 mit einer klaren Erklärung zurück, nicht einen kryptischen Fehlercode.
Fehler
Jeder Fehler folgt demselben Format:
{
"error": {
"code": "ERROR_CODE",
"message": "A clear, human-readable explanation."
}
}
| HTTP | Code | Was passiert ist |
|---|---|---|
| 401 | UNAUTHENTICATED |
Fehlendes oder ungültiges Access Token |
| 401 | INVALID_API_KEY |
Fehlender oder ungültiger Key |
| 403 | KEY_OWNER_MISMATCH |
Der Key gehört nicht dir |
| 403 | KEY_REVOKED |
Dieser Key wurde widerrufen |
| 404 | NOT_FOUND |
Unterhaltung nicht gefunden oder abgelaufen |
| 422 | - | Validierungsfehler (siehe Nachricht) |
| 429 | BUDGET_EXCEEDED |
Dein Budget ist aufgebraucht, lade auf oder warte auf das Zurücksetzen |
Limits
| Was | Limit |
|---|---|
| Nachrichtenlänge | 10.000 Zeichen |
| Ablauf der Unterhaltung | 24 Stunden |
| Budget | Pro Key, du entscheidest |