Quickstart: Ihre erste Anfrage in 60 Sekunden

Erstellen Sie einen API-Schlüssel in Ihrem Workspace, exportieren Sie ihn und listen Sie Ihre Gespräche auf. Schlüssel gelten pro Workspace und können nur-lesend oder lesend-schreibend sein.

curl https://api.inteligenciaviva.com/v1/workspaces/WORKSPACE_ID/conversations \
  -H "Authorization: Bearer sk_live_..."

Jede Antwort ist JSON. Sammlungs-Endpunkte liefern `data`-Arrays; Fehler liefern ein `error`-Objekt mit `code` und `message` und dem passenden HTTP-Status.

Die kostenlose API — ohne Konto, ohne Schlüssel

Auch die kostenlose Ebene spricht API. `POST /v1/free/widget-snippet` nimmt exakt dieselbe Konfiguration entgegen, die der visuelle Generator auf der Seite Kostenlos baut, und liefert das fertige HTML-Snippet zum Einfügen — ohne Authentifizierung, ohne Registrierung. Nutzen Sie sie, um Widgets für Kundenseiten im Stapel zu erzeugen, Embeds aus der CI neu zu generieren, wenn sich Zeitpläne ändern, oder einfach, um die API anzufassen, bevor Sie einen Cent zahlen.

curl -X POST https://api.inteligenciaviva.com/v1/free/widget-snippet \
  -H "Content-Type: application/json" \
  -d @widget-config.json
# → { "snippet": "<link rel=\"stylesheet\" ..." }

Authentifizierung

Jede Anfrage trägt einen API-Schlüssel in der `Authorization`-Kopfzeile als Bearer-Token. Schlüssel werden über die API selbst oder im Dashboard erstellt und widerrufen, pro Workspace — ein widerrufener Schlüssel verliert seinen Zugriff sofort.

Die Sitzungs-Endpunkte auf Kontoebene (Registrierung, Login, Google-Anmeldung, Ticket-Tausch, Profil und Kontolöschung unter `/v1/auth`) treiben unsere eigenen Apps an; für Server-zu-Server-Integrationen bevorzugen Sie immer Workspace-API-Schlüssel gegenüber Benutzersitzungen.

Authorization: Bearer sk_live_...

Ressourcen-Referenz

Alle Routen unten hängen an `https://api.inteligenciaviva.com/v1/workspaces/{workspaceId}`, sofern nicht anders vermerkt. Dies ist die real gemountete Oberfläche des aktuellen Backends — nichts Aspirationales.

Bereichsübergreifender Posteingang /inbox

GET/conversationsAlle Unterhaltungen ALLER Bereiche, die diese Anmeldedaten betreuen, in einer nach Aktivität sortierten Liste.
GET/conversations/{id}Eine Unterhaltung, über alle Bereiche hinweg gesucht. Gibt ihre workspace_id zurück.
GET/workspacesDie Bereiche, die diese Anmeldedaten betreuen können, mit ihrer Rolle in jedem.

Gespräche /conversations

GET/Gespräche auflisten, filterbar nach Zustand.
GET/{id}Ein Gespräch mit Zustand, Kanal, Kontakt und Zuweisung.
GET/{id}/messagesNachrichtenverlauf (Besucher, menschlicher Agent, KI, System).
POST/{id}/messagesAls Agent eine Nachricht in das Gespräch senden.
POST/{id}/assignDas Gespräch einem menschlichen Agenten oder einer Abteilung zuweisen.
POST/{id}/resolveDas Gespräch schließen. Hat die KI es allein geschlossen, zählt es als abrechenbare Lösung.
POST/Eine Unterhaltung außerhalb des Widgets öffnen (z. B. um einen bestehenden Verlauf zu migrieren).
GET/{id}/ai-turns«Woher hat sie das?» — das Protokoll jedes KI-Zugs: worauf sie sich stützte, welches Modell, wie lange und warum übergeben wurde.
GET/{id}/portal-caseStatus des Falls, den diese Unterhaltung im Support-Board des Portals eröffnet hat, samt Antworten. Wird live abgefragt: der Status ändert sich im anderen Board.
POST/{id}/readUnterhaltung als vom Team gelesen markieren (Zähler für Ungelesene).
POST/{id}/reopenEine geschlossene Unterhaltung wieder öffnen, mit erhaltenem Verlauf. Ohne dies war ein versehentliches Schließen endgültig.
POST/{id}/archiveArchivieren oder zurückholen. Sie verlässt den Posteingang, ohne geschlossen zu werden oder etwas zu verlieren; Body: {valor:true|false}.
POST/{id}/pinOben anheften oder lösen. Angeheftete stehen auf der ersten Seite des Posteingangs ganz oben. Body: {valor:true|false}.
POST/{id}/muteHinweise für N Stunden stummschalten, oder {horas:null}, um sie wieder zu hören.
POST/{id}/unreadAls ungelesen lassen: die Lesemarke rückt hinter die letzte Nachricht der Kundin oder des Kunden zurück.

Kontakte /contacts

GET/Kontakte auflisten.
GET/{id}Ein Kontakt mit seinen Identitäten und seinem Gesprächsverlauf.

KI-Agenten /ai-agents

GET/Die KI-Agenten des Workspace auflisten.
POST/Einen KI-Agenten erstellen: Anweisungen, Abteilung, Konfidenzschwelle.
PATCH/{id}Anweisungen, Schwelle oder Abteilung aktualisieren.
GET/{id}/knowledge-sourcesWissensquellen, die mit diesem Agenten verknüpft sind.
POST/{id}/knowledge-sourcesEine Wissensquelle mit diesem Agenten verknüpfen.
GET/{aiAgentId}Ein KI-Agent: Anweisungen, Konfidenzschwelle, Werkzeuge und Abteilung.

Wissen (RAG) /knowledge-sources

POST/documentEin Dokument als fundiertes Wissen indexieren.
POST/urlEine URL indexieren.
GET/{id}Status und Metadaten der Quelle.
DELETE/{id}Eine Quelle und ihre Vektoren entfernen.
POST/{id}/reindexEine URL-Quelle neu einlesen, ohne sie zu löschen: Schlägt der Abruf fehl, bleibt alles unverändert.
GET/Wissensquellen mit ihrem Indexierungsstatus auflisten.

Kanäle /channels

GET/Kanäle auflisten. Heute live: Web-Chat und API; weitere kommen hinzu, sobald sie erscheinen.
PUT/{id}/credentialsDie Zugangsdaten eines Kanals setzen.
PUT/{id}/statusEinen Kanal aktivieren oder deaktivieren.
POST/Einen Kanal anlegen.
GET/{channelId}Ein Kanal mit Typ, Status und Einstellungen.
GET/{channelId}/snippetDie eine Zeile, die der Kunde in seine Website einfügt. Alles andere wird hier konfiguriert.
GET/{channelId}/configDie Chat-Konfiguration: das Veröffentlichte (`config`) und das, was dieser Kanal überschreibt (`settings`). Nicht verwechseln.
PUT/{channelId}/configKonfiguration speichern. Speichern und Veröffentlichen sind ein Schritt: schlägt das CDN fehl, schlägt das PUT fehl.
POST/{channelId}/config/publishDie Konfiguration erneut ins CDN veröffentlichen, ohne sie zu ändern.
POST/{channelId}/avatarDas Gesicht des Assistenten hochladen (≤512 KB). Liegt in R2, ausgeliefert vom CDN.
POST/republicar-todosAlle Kanäle des Workspace neu veröffentlichen. Der Cron tut das bei Änderung des Textpakets; dies spart das Warten.

Menschliche Agenten & Abteilungen /agents · /departments

GET/agentsMenschliche Agenten im Workspace auflisten.
POST/agents/{userId}/departmentsEinen Agenten in eine Abteilung aufnehmen.
GET/departmentsAbteilungen auflisten.
PUT/departments/{id}/routing-rulesRouting-Regeln für eingehende Gespräche festlegen.
POST/agentsEine Person in den Workspace einladen, mit Rolle und Abteilungen.
GET/agents/{userId}Ein Teammitglied.
POST/departmentsEine Abteilung mit ihren Routing-Regeln anlegen.
GET/departments/{id}Eine Abteilung.

Webhooks, Schlüssel, Abrechnung, Analysen /webhooks · /api-keys · /billing · /analytics

POST/webhooksEinen Endpunkt registrieren; sein Signatur-Secret erhalten Sie genau einmal.
DELETE/webhooks/{id}Einen Endpunkt entfernen.
POST/api-keysEinen Schlüssel erstellen (nur-lesend oder lesend-schreibend).
DELETE/api-keys/{id}Einen Schlüssel sofort widerrufen.
GET/billing/subscriptionPlan, enthaltene KI-Lösungen und Nutzung im laufenden Zeitraum.
GET/analyticsAggregierte Metriken des Workspace.
GET/webhooksWebhook-Endpunkte auflisten.
GET/webhooks/{id}/deliveriesZustellverlauf eines Webhooks, mit Wiederholungen. Das zeigt, ob der Fehler bei Ihnen oder bei uns liegt.
GET/api-keysSchlüssel auflisten. Das Geheimnis wird nie zurückgegeben, nur sein Präfix.

Agenten-Werkzeuge /conversations/{id} · /canned-responses · /tags · /presence

GET/conversations/{id}/notesInterne Notizen zur Unterhaltung. Der Besucher sieht sie nie.
POST/conversations/{id}/notesInterne Notiz hinzufügen.
DELETE/conversations/{id}/notes/{noteId}Interne Notiz löschen.
GET/canned-responsesGespeicherte Antworten des Workspace, mit ihrem Kürzel.
POST/canned-responsesGespeicherte Antwort anlegen.
PATCH/canned-responses/{cannedId}Gespeicherte Antwort bearbeiten.
DELETE/canned-responses/{cannedId}Gespeicherte Antwort löschen.
POST/presencePräsenz-Heartbeat: meldet, dass eine Person verfügbar ist. Nur mit Sitzung — ein API-Schlüssel, der schlägt, ist niemand vor dem Bildschirm und wird mit 400 abgelehnt.
GET/presenceIst gerade jemand online? Das entscheidet, ob eine Übergabe wartet oder umgeleitet wird.
GET/ai-usageInferenz-Verbrauch des Workspace pro Tag und die teuersten Unterhaltungen.
GET/tagsTags des Workspace.
GET/conversations/{id}/tagsTags einer Unterhaltung.
POST/conversations/{id}/tagsUnterhaltung taggen. Legt den Tag an, falls er nicht existierte.
DELETE/conversations/{id}/tags/{tagId}Tag von der Unterhaltung entfernen.
POST/conversations/{id}/transferUnterhaltung an eine Abteilung übergeben. Hat Vorrang vor den Routing-Regeln: eine manuelle Übergabe wird nicht automatisch rückgängig gemacht.
POST/contacts/{contactId}/blockKontakt sperren. Er erhält ein 403 ohne Details: einem Missbraucher erklärt man nicht, wie er erkannt wurde.

Anhänge, Geräte und Workspaces /conversations/{id}/attachments · /devices · /workspaces

POST/conversations/{id}/attachmentsEinen Anhang als Agent hochladen. Strikte Allowlist und 10 MB: nichts, was ein Browser ausführen kann.
GET/conversations/{id}/attachmentsAnhänge einer Unterhaltung.
GET/attachments/{attachmentId}Einen Anhang herunterladen. Mit strengen Headern und `nosniff`; nur Bilder und Audio werden inline dargestellt.
POST/devices/registerPush-Token eines Geräts registrieren, um eine Person bei einer KI-Übergabe zu benachrichtigen. Außerhalb des Workspace-Präfixes: `/v1/devices/register`.
POST/workspacesEinen Workspace anlegen. Außerhalb des Präfixes: `/v1/workspaces`.

Echte Beispiele

Eine Agenten-Nachricht senden (curl)

curl -X POST \
  https://api.inteligenciaviva.com/v1/workspaces/$WS/conversations/$CONV/messages \
  -H "Authorization: Bearer $IV_KEY" \
  -H "Content-Type: application/json" \
  -d '{"content": "Hi! I checked your order — it ships tomorrow."}'

Gespräche auflisten (JavaScript)

const res = await fetch(
  `https://api.inteligenciaviva.com/v1/workspaces/${WS}/conversations`,
  { headers: { Authorization: `Bearer ${process.env.IV_KEY}` } }
);
const { data } = await res.json();

Eine Webhook-Signatur verifizieren (Node)

import { createHmac, timingSafeEqual } from "node:crypto";

function verify(secret, rawBody, header, toleranceSec = 300) {
  const { t, v1 } = Object.fromEntries(
    header.split(",").map((p) => p.split("="))
  );
  if (Math.abs(Date.now() / 1000 - Number(t)) > toleranceSec) return false;
  const expected = createHmac("sha256", secret)
    .update(`${t}.${rawBody}`)
    .digest("hex");
  return timingSafeEqual(Buffer.from(expected), Buffer.from(v1));
}

Webhooks

Registrieren Sie einen HTTPS-Endpunkt, und wir senden jedes Ereignis per POST dorthin, signiert. Die Kopfzeile ist `iv-signature: t=<unix>,v1=<hex>`, wobei `v1` der HMAC-SHA256 von `<timestamp>.<roher Body>` mit dem Secret Ihres Endpunkts ist — weisen Sie alles ab, was älter als 5 Minuten ist (Replay-Schutz). Fehlgeschlagene Zustellungen werden automatisch mit frischer Signatur wiederholt, bis zu 5 Versuche.

conversation.createdEin neues Gespräch hat auf irgendeinem Kanal begonnen.
message.createdEine Nachricht ist eingetroffen (Besucher, Mensch, KI oder System).
handoff.requestedDie KI hat entschieden, dass sie einen Menschen braucht — der exakte Moment, mit der Zusammenfassung.
conversation.resolvedEin Gespräch wurde geschlossen; sagt Ihnen, ob die KI es allein geschlossen hat.

Jede Zustellung und ihr Status werden aufgezeichnet — ein Webhook, dem Sie nicht vertrauen können, ist schlimmer als keiner.

Echtzeit-Streaming

Für Live-Oberflächen öffnen Sie einen WebSocket gegen den Workspace-Stream und erhalten Gesprächsereignisse, während sie geschehen — derselbe Kanal, den unsere eigenen Agenten-Apps nutzen.

wss://api.inteligenciaviva.com/v1/workspaces/{workspaceId}/stream

Fehler und Limits

Fehler sind konventionelles HTTP: `400` fehlerhafte Anfrage, `401` fehlender oder ungültiger Schlüssel, `403` Schlüssel ohne Berechtigung, `404` Ressource nicht in diesem Workspace, `429` Ratenlimit erreicht (warten und mit Jitter erneut versuchen), `5xx` unsere Schuld — wiederholen Sie idempotente Anfragen. Der Body trägt immer einen `error.code` und eine menschenlesbare `error.message`. Ratenlimits gelten pro Schlüssel und sind großzügig für echte Integrationen.

Häufig gestellte Fragen

Ist diese Dokumentation aspirational oder die reale Oberfläche?

Real. Sie ist gegen die gemounteten Routen des aktuellen Backends geschrieben. Wenn hier etwas „kommt bald“ sagt, existiert es noch nicht — wir dokumentieren keinen Dunst.

Brauche ich einen kostenpflichtigen Plan, um die API zu nutzen?

Ja — die API ist Teil der kostenpflichtigen Plattform (Pro enthält sie). Das kostenlose Widget und das WordPress-Plugin sind client-seitig und brauchen gar keine API.

Was ist der Unterschied zwischen nur-lesenden und lesend-schreibenden Schlüsseln?

Nur-lesende Schlüssel können auflisten und abfragen, aber nie verändern — ideal für Dashboards und BI. Lesend-schreibende Schlüssel können Nachrichten, Kontakte, KI-Agenten und Konfiguration erstellen.

Wie erfahre ich von neuen Nachrichten — Polling oder Webhooks?

Webhooks (`message.created`) für Server, der WebSocket-Stream für Live-Oberflächen. Polling funktioniert, aber Sie stoßen an die Ratenlimits, bevor Sie Echtzeit erreichen.

Wie verifiziere ich genau, dass ein Webhook von Ihnen kam?

Berechnen Sie den HMAC-SHA256 von `<t>.<roher Body>` mit Ihrem Endpunkt-Secret neu und vergleichen Sie ihn in konstanter Zeit mit dem `v1`-Wert der `iv-signature`-Kopfzeile; weisen Sie ab, wenn `t` älter als 300 Sekunden ist. Funktionierender Code steht auf dieser Seite.

Was passiert, wenn mein Webhook-Endpunkt ausgefallen ist?

Wir zeichnen die fehlgeschlagene Zustellung auf und wiederholen automatisch mit frischem Timestamp und frischer Signatur, bis zu 5 Versuche. Wurde der Endpunkt inzwischen gelöscht oder deaktiviert, stoppen die Wiederholungen sauber.

Kann die KI an mein eigenes Eskalationssystem übergeben?

Ja — genau dafür gibt es `handoff.requested`. Es feuert in dem Moment, in dem die Konfidenz der KI unter die Schwelle des Workspace fällt, mit der Gesprächszusammenfassung — damit Sie eine Person alarmieren oder anderswo ein Ticket öffnen können.

Welche Kanäle kann ich heute über die API steuern?

Der Web-Chat ist von Ende zu Ende live, und alles in dieser Referenz funktioniert heute. Telegram und weitere Messaging-Kanäle verbinden sich mit demselben Gesprächsmodell, sobald sie erscheinen — Ihre Integration ändert sich nicht.

Gibt es ein SDK?

Ein Flutter-SDK treibt unsere eigene Agenten-App an und ist die Basis des White-Label-SDK für Enterprise. Für Server ist die REST-Oberfläche bewusst schlicht — jeder HTTP-Client funktioniert ohne Wrapper.

Wo melde ich einen API-Bug oder eine Lücke in dieser Dokumentation?

Schreiben Sie an l@inteligenciaviva.com. Dokumentation, die lügt, ist auch ein Bug — wir behandeln sie mit derselben Schwere.