Your AI Connector Docs

Nachrichten & Konversationen

Mit der Messages API können Sie Nachrichten an jeden Kontakt senden, Konversationen nachlesen, bereits gesendete Nachrichten korrigieren oder entfernen, auf Nachrichten reagieren, vollständige Chat-Verläufe abrufen, Transkripte exportieren und Chats als gelesen oder ungelesen markieren – alles, ohne den Posteingang zu öffnen.

Alle Pfade auf dieser Seite beziehen sich auf die Basis-URL https://api.youraiconnector.com/v1. Jede Anfrage erfordert Ihren API-Schlüssel – siehe Authentifizierung für die vollständige Liste der Möglichkeiten, diesen zu senden. Die folgenden Beispiele verwenden den Header X-API-Key, wobei ein cURL-Beispiel auch das Abfrageformular ?apiKey= zeigt.

Wie die Zustellung funktioniert: Das Senden einer Nachricht wartet nicht auf deren Ankunft. Die API nimmt Ihre Nachricht entgegen, antwortet sofort mit einer Nachrichten-ID und stellt sie dann im Hintergrund über den Kanal des Kontakts (WhatsApp, SMS, Instagram usw.) zu. Um nachzuverfolgen, ob eine Nachricht tatsächlich zugestellt oder gelesen wurde, sollten Sie auf Status-Updates via Webhooks hören – verwenden Sie kein Polling. Die Antwort auf das Senden bestätigt lediglich, dass die Nachricht akzeptiert wurde.


Nachricht senden

Es gibt zwei Möglichkeiten zum Senden. Wählen Sie diejenige, die am besten dazu passt, wie Sie den Kontakt bereits identifizieren:

  • Senden per Kontakt-ID — Sie kennen die ID des Kontakts bereits (z. B. weil Sie den Kontakt über die API erstellt oder über einen Webhook erhalten haben). Verwenden Sie POST /contacts/{contactId}/send-message.
  • Senden per Kontaktidentität — Sie kennen die Telefonnummer, Instagram-ID usw. des Kontakts, aber nicht dessen interne ID. Verwenden Sie POST /contacts/send und lassen Sie die Plattform den richtigen Kontakt finden.

Beide Methoden stellen die Nachricht auf die gleiche Weise in die Warteschlange und liefern sie über den Kanal aus, den der Kontakt nutzt. Sie wählen keinen Transportweg – die Plattform leitet WhatsApp-Kontakte über WhatsApp, SMS-Kontakte über SMS usw. weiter.

Beide finden ebenfalls nur Kontakte, die bereits existieren. Keiner der Aufrufe erstellt einen: Wenn eine ID oder Identität zu nichts passt, wird 404 zurückgegeben; es wird kein neuer Kontakt angelegt. Wenn Sie also jemandem zum ersten Mal schreiben, erstellen Sie entweder zuerst den Kontakt mit POST /contacts oder verwenden Sie in WhatsApp Web unten Direkt an eine WhatsApp Web-Nummer senden, wodurch der Kontakt im selben Aufruf erstellt wird.

Senden per Kontakt-ID

POST /contacts/{contactId}/send-message

Feld Erforderlich Beschreibung
body Ja Der zu sendende Nachrichtentext, bis zu 65.536 Zeichen. Ein Textkörper, der länger ist, als der Kanal in einer Nachricht zulässt (1.500 bei der WhatsApp Business API und SMS, 1.000 bei Instagram, 2.000 bei Messenger, 4.096 bei Telegram und LinkedIn, 5.000 bei LINE, 6.000 bei TikTok, 7.000 bei Viber, 65.536 bei WhatsApp Web; keine Begrenzung bei E-Mail, dem Chat-Widget und benutzerdefinierten Kanälen), wird als mehrere Nachrichten in der richtigen Reihenfolge zugestellt, wobei an Absatz- oder Satzenden getrennt wird. Die Antwort enthält dann messageIds für jeden Teil und autoSplit: true.
mediaUrl Nein URL einer Mediendatei (Bild, Audio, Video, Dokument), die angehängt werden soll.
mediaContentType Nein MIME-Typ der angehängten Medien, z. B. image/jpeg. Wird bei Weglassen aus der Dateiendung der URL ermittelt (.mp3 → audio/mpeg, .pdf → application/pdf); legen Sie ihn für eine URL ohne Endung fest.
sendAsVoiceNote Nein Nur WhatsApp Web, nur Audio: liefert das Audio als Sprachnachricht (die Wiedergabeblase). Audio, das nicht im OGG/Opus-Format vorliegt, wird zum Sendezeitpunkt konvertiert. Standardwert ist false.
pauseBot Nein true pausiert die KI für diesen Kontakt, während die Nachricht gesendet wird – für einen Menschen, der übernimmt. Siehe KI pausieren oder fortsetzen.
clearIncompleteReply Nein true verwirft eine halbfertige Bot-Antwort, damit sie nach Ihrer Nachricht nicht fortgesetzt wird.
human_reply Nein true markiert die Nachricht als von einer Person aus Ihrem Team geschrieben und nicht von einer Integration. Die KI behandelt sie dann als Antwort eines Teammitglieds im Gespräch, und eine Antwort, die die KI für die letzte Nachricht des Kontakts in die Warteschlange gestellt hatte, wird abgebrochen, damit der Kontakt nicht zwei Antworten erhält. Dies pausiert die KI nicht; verwenden Sie dafür pauseBot. Standardwert ist false.

Auf LinkedIn wird eine Nachricht, die Sie auf diese Weise oder über den Posteingang senden, auch dann zugestellt, wenn eine Person den Thread auf der LinkedIn-Seite bearbeitet. Die eigenen Antworten der KI und ihre Nachfassaktionen werden in einem solchen Thread zurückgehalten. Eine zurückgehaltene Antwort wird aus dem Chat entfernt, anstatt als fehlgeschlagen angezeigt zu werden, da nichts gesendet wurde und kein Guthaben verbraucht wird. Die letzte Antwort der KI, bevor sie einen Thread an eine Person übergibt, wird weiterhin zugestellt.

cURL

curl -X POST "https://api.youraiconnector.com/v1/contacts/contact123/send-message" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "body": "Hi! Your appointment is confirmed for tomorrow at 10:00."
  }'

JavaScript

const res = await fetch(
  "https://api.youraiconnector.com/v1/contacts/contact123/send-message",
  {
    method: "POST",
    headers: {
      "X-API-Key": "YOUR_API_KEY",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      body: "Hi! Your appointment is confirmed for tomorrow at 10:00.",
    }),
  }
);
const data = await res.json();
console.log(data.messageId);

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/contacts/contact123/send-message",
    headers={
        "X-API-Key": "YOUR_API_KEY",
        "Content-Type": "application/json",
    },
    json={"body": "Hi! Your appointment is confirmed for tomorrow at 10:00."},
)
print(res.json()["messageId"])

Antwort (200 OK):

{
  "success": true,
  "messageId": "aB3dE5fG7hI9jK1lM2nO",
  "contactId": "contact123",
  "channel": "whatsapp",
  "message": "Message created successfully. Delivery is being processed."
}

Senden per Kontaktidentität

POST /contacts/send

Verwenden Sie dies, wenn Sie die interne ID des Kontakts nicht haben. Geben Sie den Nachrichten-body sowie entweder eine contact_id oder ein channel zusammen mit dem Identitätsfeld an, das zu diesem Kanal passt.

Feld Erforderlich Beschreibung
body Ja Der zu sendende Nachrichtentext, bis zu 65.536 Zeichen. Ein Textkörper, der länger ist, als der Kanal in einer Nachricht zulässt (1.500 bei der WhatsApp Business API und SMS, 1.000 bei Instagram, 2.000 bei Messenger, 4.096 bei Telegram und LinkedIn, 5.000 bei LINE, 6.000 bei TikTok, 7.000 bei Viber, 65.536 bei WhatsApp Web; keine Begrenzung bei E-Mail, dem Chat-Widget und benutzerdefinierten Kanälen), wird als mehrere Nachrichten nacheinander zugestellt, getrennt bei Absatz- oder Satzumbrüchen. Die Antwort enthält dann messageIds für jeden Teil und autoSplit: true.
contact_id Nein ID eines bestehenden Kontakts. Wenn diese gesetzt ist, sind die Identitätsfelder unten nicht erforderlich.
channel Nein Kanal, über den gesendet werden soll. Erforderlich, wenn contact_id nicht angegeben ist. Einer der 14 für den ausgehenden Versand verfügbaren Kanäle: whatsapp, whatsapp_web, sms, instagram, instagram_private, messenger, telegram, chat-widget, custom, email, line, imessage, linkedin, viber.
phone_number Nein Telefonnummer des Kontakts im internationalen Format. Wird mit whatsapp, whatsapp_web und sms verwendet.
instagram_id Nein Instagram-Benutzer-ID des Kontakts. Wird mit instagram verwendet.
messenger_id Nein Messenger-Benutzer-ID des Kontakts. Wird mit messenger verwendet.
telegram_user_id Nein Telegram-Benutzer-ID des Kontakts. Wird mit telegram verwendet.
media_url Nein URL einer Mediendatei, die angehängt werden soll.
media_content_type Nein MIME-Typ des angehängten Mediums, z. B. image/jpeg.

Welche Kanäle können über eine Identität aufgelöst werden. Nur sechs der 14 Kanäle akzeptieren ein Identitätsfeld anstelle einer contact_id: whatsapp, whatsapp_web und sms werden über phone_number nachgeschlagen, instagram über instagram_id, messenger über messenger_id und telegram über telegram_user_id. Die anderen acht — instagram_private, chat-widget, custom, email, line, imessage, linkedin und viber — haben keine öffentliche Identität, die nachgeschlagen werden kann, daher erfordert das Senden über diese Kanäle contact_id; die alleinige Übergabe von channel führt zu einem 400, der besagt, dass contact_id erforderlich ist.

cURL (unter Verwendung des Abfrageformulars ?apiKey=)

curl -X POST "https://api.youraiconnector.com/v1/contacts/send?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "channel": "whatsapp",
    "phone_number": "+31612345678",
    "body": "Hi! Your appointment is confirmed."
  }'

JavaScript

const res = await fetch("https://api.youraiconnector.com/v1/contacts/send", {
  method: "POST",
  headers: {
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    channel: "whatsapp",
    phone_number: "+31612345678",
    body: "Hi! Your appointment is confirmed.",
  }),
});
const data = await res.json();
console.log(data.message_id, data.channel);

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/contacts/send",
    headers={
        "X-API-Key": "YOUR_API_KEY",
        "Content-Type": "application/json",
    },
    json={
        "channel": "whatsapp",
        "phone_number": "+31612345678",
        "body": "Hi! Your appointment is confirmed.",
    },
)
data = res.json()
print(data["message_id"], data["channel"])

Antwort (201 Created):

{
  "success": true,
  "message_id": "aB3dE5fG7hI9jK1lM2nO",
  "contact_id": "contact123",
  "channel": "whatsapp"
}

Warum eine Nachricht abgelehnt werden könnte: Ein Kontakt, bei dem „Nicht stören“ oder der Privatmodus aktiviert ist, kann keine ausgehenden Nachrichten empfangen — die Anfrage schlägt mit einem 422 fehl. Wenn kein Kontakt mit der von Ihnen angegebenen ID oder Identität übereinstimmt, erhalten Sie ein 404.

Senden über WhatsApp Web: Variationen und Schutz vor Nachrichtenfluten

Für body gelten zwei Dinge, wenn der Kontakt WhatsApp Web verwendet.

Spintax-Klammern werden pro Versand aufgelöst. Ein body von {Hi|Hello|Hey} there, quick question wird als eine der drei Begrüßungen versendet, die für diesen Versand ausgewählt wurde – die Klammern erreichen den Kontakt niemals. Verwenden Sie dies, um jedem Kontakt eine unterschiedliche Eröffnungsnachricht mit demselben Integrationscode zu senden. Text ohne Klammern wird exakt so gesendet, wie er geschrieben wurde.

Häufungen identischer Eröffnungsnachrichten werden abgelehnt. Wenn innerhalb einer Stunde zehn nahezu identische Eröffnungsnachrichten von einer WhatsApp Web-Nummer an Kontakte gesendet werden, die Ihnen noch nie geschrieben haben, werden weitere Nachrichten nicht zugestellt: Der Versand wird wie gewohnt akzeptiert (Sie erhalten weiterhin ein messageId), aber die Nachricht verbleibt dann mit status: "failed" und error_code: "opener_burst", versehen mit einem für den Kunden lesbaren Grund. Ein erneuter Versuch mit demselben Text hilft nicht – variieren Sie den Text, warten Sie eine Stunde und senden Sie erneut. Antworten innerhalb bestehender Konversationen sind davon nie betroffen. Die Begründung finden Sie unter Identische Eröffnungsnachrichten führen zu Einschränkungen der Nummern.

Direkt an eine WhatsApp Web-Nummer senden

POST /whatsapp-web/send

Senden Sie eine Nachricht an eine Telefonnummer in WhatsApp Web, ohne vorher nach einem Kontakt zu suchen. Wenn die Nummer noch kein Kontakt ist, wird der Kontakt im selben Aufruf erstellt, wobei die KI dafür ausgeschaltet ist, sodass die Nachricht wie eine von Ihnen manuell gesendete Nachricht aussieht und kein Assistent das Gespräch danach übernimmt. Ein bestehender Kontakt wird unverändert wiederverwendet.

Feld Erforderlich Beschreibung
phoneNumber Ja Die Nummer, an die gesendet werden soll, im internationalen Format (+31612345678).
message Nein Der zu sendende Text. Entweder message oder mediaUrl muss vorhanden sein.
mediaUrl Nein Öffentliche URL einer Datei, die gesendet werden soll. Entweder message oder mediaUrl muss vorhanden sein.
mediaContentType Nein MIME-Typ der Datei, zum Beispiel image/jpeg. Wird aus der URL ermittelt, wenn Sie es weglassen.
sendAsVoiceNote Nein true sendet eine Audiodatei als Sprachnachricht anstatt als Anhang.
fromPhoneNumber Nein Von welcher Ihrer verbundenen WhatsApp Web-Nummern gesendet werden soll, im internationalen Format. Standardmäßig die Nummer, zu der der Kontakt bereits gehört.
campaignId Nein Übernehmen Sie die aktiven Stunden von diesem Agenten anstelle des Standardwerts des Kontos. Muss ein Agent auf demselben Konto sein.
ignoreActiveHours Nein true sendet sofort, ungeachtet der aktiven Stunden.
sub_account_id Nein Für Agenturen: Senden im Namen eines Ihrer Kundenkonten.
curl -X POST "https://api.youraiconnector.com/v1/whatsapp-web/send?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "phoneNumber": "+31612345678",
    "message": "Hi Alex, your quote is ready."
  }'

Ein erfolgreicher Aufruf antwortet mit 202:

{ "success": true, "queued": true, "contactId": "abc123" }

202 bedeutet akzeptiert, aber noch nicht zugestellt. Außerhalb der aktiven Stunden wird der Versand zurückgehalten und im nächsten erlaubten Zeitfenster ausgeführt, es sei denn, Sie haben ignoreActiveHours übergeben. Lesen Sie den Status der Nachricht mit Nachrichten eines Kontakts auflisten unter Verwendung der contactId, die Sie hier erhalten haben, wieder aus.

Wenn es nicht durchgeht:

Status Code Was ist passiert
400 INVALID_PHONE_FORMAT Die Nummer ist nicht im internationalen Format, oder phoneNumber fehlt, oder sowohl message als auch mediaUrl fehlen.
400 CONTACT_DND Dieser Kontakt ist auf „Nicht stören“ gesetzt, daher wird nichts ausgehend an ihn gesendet.
400 CONTACT_PRIVATE Dieser Kontakt ist als privat markiert.
404 CAMPAIGN_NOT_FOUND Kein Agent passt zu dem campaignId, den Sie übergeben haben.
403 CAMPAIGN_FORBIDDEN Dieser Agent gehört zu einem anderen Konto.
402 Das Konto hat keine Credits mehr oder es ist keine WhatsApp Web-Nummer verbunden.

Ein zweiter Aufruf für denselben Kontakt, während ein zurückgehaltener Versand noch wartet, antwortet mit 409, sodass sich niemals eine Warteschlange hinter einer Person ansammelt.


Eine Notiz in einer Konversation protokollieren

POST /contacts/notes

Fügt eine Zeile zur Konversation eines Kontakts hinzu, ohne sie zu versenden. Verwenden Sie dies für Kontext, den Ihr Team und die KI kennen sollten, der Kontakt aber niemals erhalten darf: eine Zusammenfassung eines Telefonats, das Ihr Voice-Agent gerade geführt hat, eine Anmerkung aus Ihrem CRM oder eine Notiz von einem Kollegen. Dies funktioniert auf jedem Kanal (WhatsApp, SMS, Instagram, Messenger, Telegram, Chat-Widget, benutzerdefinierte Kanäle usw.).

Was mit einer Notiz geschieht:

  • Sie erscheint im Chat im Posteingang als gelbe Notiz-Karte, zusammen mit dem Autor, falls Sie einen angegeben haben.
  • Die KI liest sie als Teil des Konversationsverlaufs, markiert als interne Notiz, sodass ihre nächste Antwort diese berücksichtigt.
  • Sie wird niemals an den Kontakt gesendet, verbraucht keine Nachrichtenguthaben und löst nichts aus: keine KI-Antwort, keine Automatisierung, kein Webhook, keine Benachrichtigung, kein ungelesen-Badge. Sie pausiert die KI nicht und zählt nicht als Antwort Ihres Teams.

Finden Sie den Kontakt auf die gleiche Weise wie unter Nach Kontaktidentität senden: entweder über dessen ID oder über ein channel plus den passenden Identifikator. Eine Notiz kann nur an einen bereits existierenden Kontakt gesendet werden; wenn nichts gefunden wird, ist das ein 404.

Feld Erforderlich Beschreibung
contact_id Eines von beiden Die ID des Kontakts.
channel + identifier Eines von beiden channel plus phone_number (WhatsApp, WhatsApp Web, SMS), instagram_id, messenger_id oder telegram_user_id, wie unter Senden per Kontaktidentität beschrieben.
body Ja Der Notiztext, bis zu 4.000 Zeichen. Zeilenumbrüche bleiben erhalten.
author Nein Wer oder was die Notiz verfasst hat, bis zu 80 Zeichen, zum Beispiel Voice agent oder Sarah (sales). Wird auf der Karte und für die KI angezeigt.
timestamp Nein Wann es passiert ist, in Epochen-Millisekunden. Standardmäßig jetzt. Verwenden Sie die Endzeit des Anrufs, damit die Notiz an der richtigen Stelle im Thread erscheint. Sie darf nicht mehr als 5 Minuten in der Zukunft liegen; eine spätere Zeit wird mit einem 400-Fehler abgelehnt.
external_id Nein Ihre eigene ID für diese Notiz, bis zu 200 Zeichen, zum Beispiel die Anruf-ID. Das erneute Senden derselben external_id für denselben Kontakt fügt keine zweite Notiz hinzu; die Antwort enthält dann duplicate: true. Verwenden Sie dies, damit ein wiederholter Webhook denselben Anruf nicht zweimal protokolliert.

cURL

curl -X POST "https://api.youraiconnector.com/v1/contacts/notes" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "channel": "whatsapp",
    "phone_number": "+31612345678",
    "author": "Voice agent",
    "body": "Voice call, 3:12. Asked about knee surgery waiting times, prefers a call back on Tuesday morning.",
    "external_id": "call_8f2k1"
  }'

Antwort (201 oder 200 mit duplicate: true, wenn die external_id bereits protokolliert wurde)

{
  "success": true,
  "messageId": "note_4c1f0e...",
  "contactId": "contact123"
}

Eine Notiz erscheint unter Nachrichten eines Kontakts auflisten mit type: "note".

Einen Antwortentwurf mit der KI erstellen

POST /contacts/{contactId}/draft-reply

Fordert den KI-Agenten, der eine Unterhaltung verwaltet, dazu auf, die nächste Antwort zu schreiben, und gibt Ihnen den Text zurück. Es wird nichts gesendet. Es handelt sich um denselben Entwurf, den die Schaltfläche Antwort generieren im Posteingang erstellt: Der Agent nutzt seine Konfiguration, seine Wissensdatenbank und den bisherigen Verlauf der Unterhaltung und antwortet in der Sprache des Kontakts. Verwenden Sie dies, um einen Menschen (oder Ihre eigene App) zwischen die KI und den Kontakt zu schalten: Rufen Sie den Entwurf ab, zeigen Sie ihn zur Genehmigung an und senden Sie ihn dann mit Nach Kontakt-ID senden – entweder unverändert oder angepasst.

  • Der Entwurf wird von dem Agenten geschrieben, der dem Kontakt zugewiesen ist. Ein Kontakt, der noch keinen Agenten hat, erhält den Agenten, der auf seine nächste Nachricht antworten würde.
  • Während der Erstellung des Entwurfs führt der Agent keine Tools oder Funktionen aus, sodass keine Buchungen, Tags, Übergaben oder andere Aktionen stattfinden.
  • Es wird nichts in der Unterhaltung gespeichert und der Kontakt sieht nichts.
  • Ein Entwurf kostet die gleichen Credits wie eine KI-Antwort dieses Agenten in dieser Unterhaltung; wenn Ihr eigener KI-Schlüssel verbunden ist, entstehen keine Kosten.
  • Die Unterhaltung muss mindestens eine Nachricht enthalten.

Alle Body-Felder sind optional; ein leerer Body (oder kein Body) erstellt einen Entwurf für die nächste Antwort.

Feld Erforderlich Beschreibung
instruction Nein Eine einmalige Anweisung für diesen Entwurf, bis zu 2.000 Zeichen, identisch mit dem langen Drücken auf „Antwort generieren“ im Posteingang. Zum Beispiel Offer Tuesday at 3pm oder Ask for their email address.
campaign_id Nein Entwurf unter dieser Kampagne anstelle des Agenten des Kontakts erstellen.
purpose Nein chat_reply (Standard) schreibt eine Nachricht an den Kontakt. faq_answer schreibt eine kurze Antwort auf die Frage des Kontakts, die für sich allein steht, z. B. für eine FAQ-Wissensdatenbank.

cURL

curl -X POST "https://api.youraiconnector.com/v1/contacts/contact123/draft-reply" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "instruction": "Offer Tuesday at 3pm for the consultation" }'

Antwort (200)

{
  "success": true,
  "contact_id": "contact123",
  "draft": "Hi Sara, Tuesday at 3pm works for the consultation. Shall I put you down for it?"
}

Ein 400 bedeutet, dass die Unterhaltung noch keine Nachrichten enthält, Ihre Credits aufgebraucht sind oder der Kontakt keinen Agenten oder keine Kampagne für den Entwurf hat (error gibt an, woran es liegt). Ein 404 bedeutet, dass der Kontakt nicht existiert oder der Schlüssel eines Teammitglieds auf Kontakte beschränkt ist, die es nicht sehen kann. Der Schlüssel oder das Teammitglied benötigt die Berechtigung zum Bearbeiten von Nachrichten.

Verwenden Sie einen KI-Client über MCP? Die gleiche Aktion ist als generate_reply_draft-Tool verfügbar.

Nachrichten eines Kontakts auflisten

GET /contacts/{contactId}/messages

Gibt die Nachrichten eines Kontakts zurück, beginnend mit der neuesten, mit cursorbasierter Paginierung.

Abfrageparameter Erforderlich Beschreibung
limit Nein Seitengröße. Standard 50, Maximum 100.
cursor Nein Der next_cursor-Wert aus einer vorherigen Antwort. Gibt Nachrichten zurück, die älter als der Cursor sind.
filter Nein Nach Inhaltstyp filtern: all (Standard), text, media oder tool_use.
direction Nein Nach Richtung filtern: all (Standard), inbound (vom Kontakt empfangen) oder outbound (von Ihnen gesendet).

Hinweis zu Filtern und Paginierung: Die Filter filter und direction werden auf jede Seite angewendet, nachdem sie gelesen wurde. Daher kann eine gefilterte Seite weniger Elemente enthalten als limit. Der next_cursor schreitet weiterhin durch die gesamte Konversation voran, fahren Sie also mit der Paginierung fort, bis next_cursor den Wert null hat.

cURL

curl "https://api.youraiconnector.com/v1/contacts/contact123/messages?limit=50&direction=inbound" \
  -H "X-API-Key: YOUR_API_KEY"

JavaScript

const params = new URLSearchParams({ limit: "50", direction: "inbound" });
const res = await fetch(
  `https://api.youraiconnector.com/v1/contacts/contact123/messages?${params}`,
  { headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();
console.log(data.messages, data.next_cursor);

Python

import requests

res = requests.get(
    "https://api.youraiconnector.com/v1/contacts/contact123/messages",
    headers={"X-API-Key": "YOUR_API_KEY"},
    params={"limit": 50, "direction": "inbound"},
)
data = res.json()
print(data["messages"], data["next_cursor"])

Antwort (200 OK):

{
  "success": true,
  "contact_id": "contact123",
  "messages": [
    {
      "id": "aB3dE5fG7hI9jK1lM2nO",
      "body": "Hi! Thanks for reaching out.",
      "direction": "inbound",
      "channel": "whatsapp",
      "status": "delivered",
      "type": null,
      "timestamp": "2026-06-01T10:00:00.000Z",
      "media_url": null,
      "media_content_type": null,
      "bot_reply": false
    }
  ],
  "next_cursor": "cD4eF6gH8iJ0kL2mN3oP"
}

Nachrichtenfelder

Feld Beschreibung
id Eindeutige ID der Nachricht.
body Textinhalt der Nachricht. Bei einer Nachricht mit Anhang beginnt body mit einer Notiz in Klammern darüber, was angekommen ist, gefolgt von einer Bildunterschrift, zum Beispiel [THE CONTACT UPLOADED AN IMAGE] Here is my CV oder [THE CONTACT UPLOADED A VOICE NOTE] - [TRANSCRIPTION: ...]. Sprachnotizen und Videos enthalten die Transkription.
direction inbound (vom Kontakt empfangen) oder outbound (von Ihrem Konto gesendet).
channel Kanal, über den die Nachricht gesendet oder empfangen wurde (z. B. whatsapp, sms, instagram).
status Aktueller Zustellstatus, z. B. Created, sent, delivered, read, failed.
type Nachrichtentyp. Klartextnachrichten haben den Typ null; Aktivitäten automatisierter Assistenten-Tools sind als tool_use markiert.
timestamp ISO 8601-Zeitpunkt, zu dem die Nachricht erstellt wurde.
media_url URL einer angehängten Mediendatei, falls vorhanden. Dieser Link funktioniert auf jedem Kanal (WhatsApp Business API, WhatsApp Web, Instagram, Messenger, Telegram, Chat-Widget und andere) 7 Tage nach Eingang der Nachricht nicht mehr. Rufen Sie einen neuen Link ab mit Anhang einer Nachricht herunterladen.
media_content_type MIME-Typ des angehängten Mediums, falls vorhanden.
bot_reply true, wenn die Nachricht vom KI-Assistenten generiert wurde.
score Ihre Bewertung der Nachricht: 1 Daumen hoch, -1 Daumen runter, 0 wenn sie nicht bewertet wurde. Siehe Eine Nachricht bewerten oder markieren.
is_important true, wenn die Nachricht mit einem Stern markiert wurde.
is_deleted true, wenn die Nachricht gelöscht wurde. Gelöschte Nachrichten bleiben in der Liste, aber ihr body und media_url sind leer.
reactions Emoji-Reaktionen auf die Nachricht von beiden Seiten. Immer ein Array – leer, wenn keine vorhanden sind. Jeder Eintrag hat emoji, from_phone_number, from_me (true, wenn die Reaktion von Ihnen stammt) und reacted_at.
faq_ids_used IDs der Wissensdatenbank-FAQs, die der KI vorlagen, als sie diese Antwort schrieb: die für die letzte Nachricht ausgewählten sowie die aus dem früheren Konversationsverlauf beibehaltenen. Dieselbe Liste befindet sich bei jeder Nachricht einer Antwort, die in mehreren Teilen gesendet wurde. Immer ein Array, leer bei eingehenden Nachrichten, von Personen gesendeten Nachrichten, automatischen Follow-ups und KI-Antworten, die vor dem 25. September 2026 gesendet wurden.
faqs_used Dieselben FAQs mit ihrer Frage: jeder Eintrag hat id und question. question ist null, wenn das FAQ seitdem gelöscht wurde.

Anhang einer Nachricht herunterladen

POST /chat-exports/media/download-url

Gibt Ihnen einen neuen Download-Link für die an eine Nachricht angehängte Datei: ein Bild, eine Sprachnachricht, ein Video oder ein Dokument. Der Link ist 1 Stunde lang gültig. Verwenden Sie ihn, wenn Sie Anhänge an einem anderen Ort speichern möchten (zum Beispiel beim Archivieren von Lebensläufen oder Sprachnachrichten eines Kontakts) oder wenn der media_url einer Nachricht oder ein New Message Webhook sich nicht mehr öffnen lässt.

Um Nachrichten mit Anhängen zu finden, listen Sie die Nachrichten eines Kontakts mit filter=media auf. Die id jeder Nachricht und die ID des Kontakts bilden die messagePath.

Body-Feld Erforderlich Beschreibung
messagePath Ja Welche Nachricht, in der Form contacts/{contactId}/messages/{messageId}.

cURL

curl -X POST "https://api.youraiconnector.com/v1/chat-exports/media/download-url" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"messagePath": "contacts/contact123/messages/aB3dE5fG7hI9jK1lM2nO"}'

JavaScript

const res = await fetch("https://api.youraiconnector.com/v1/chat-exports/media/download-url", {
  method: "POST",
  headers: { "X-API-Key": "YOUR_API_KEY", "Content-Type": "application/json" },
  body: JSON.stringify({ messagePath: "contacts/contact123/messages/aB3dE5fG7hI9jK1lM2nO" }),
});
const { data } = await res.json();
console.log(data.url); // download the file within the hour

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/chat-exports/media/download-url",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={"messagePath": "contacts/contact123/messages/aB3dE5fG7hI9jK1lM2nO"},
)
file_url = res.json()["data"]["url"]

Antwort (200 OK):

{
  "success": true,
  "data": {
    "url": "https://storage.googleapis.com/...",
    "expiresInMs": 3600000
  }
}
Feld Beschreibung
data.url Der Download-Link. Laden Sie die Datei direkt darüber herunter, es ist kein API-Schlüssel erforderlich.
data.expiresInMs Wie lange der Link gültig ist, in Millisekunden (3600000 = 1 Stunde). Rufen Sie den Endpunkt erneut auf, um einen neuen Link zu erhalten.
Status Wann
400 messagePath fehlt oder liegt nicht im contacts/{contactId}/messages/{messageId}-Format vor, oder die Nachricht enthält keinen Anhang, der auf diese Weise heruntergeladen werden kann. Einige ältere Anhänge werden beim Kanalanbieter gespeichert und können nicht erneut ausgestellt werden, und ein geteiltes Instagram-Reel oder ein Beitrag ist ein Link zu Instagram und keine Datei.
403 Der Kontakt gehört nicht zu Ihrem Konto.
404 Es existiert keine Nachricht mit dieser ID für diesen Kontakt.

Verwenden Sie einen KI-Client über MCP? Die gleiche Aktion ist als get_chat_media_download_url-Tool verfügbar.


Chat-Sitzungen auflisten

Eine Chat-Sitzung ist ein Konversationsfenster mit einem Kontakt. Sie öffnet sich bei der ersten eingehenden Nachricht, wenn keine Sitzung geöffnet ist, und schließt sich automatisch 48 Stunden nach der letzten eingehenden Nachricht des Kontakts (jede neue eingehende Nachricht verschiebt die Schließung um weitere 48 Stunden). Wenn die KI einen Chat beendet, wird die Sitzung nicht geschlossen; es wird lediglich der Webhook „Chat beendet“ ausgelöst. Sitzungen dienen dazu, einen langen Verlauf in lesbare Konversationen zu unterteilen, anstatt eine endlose Liste zu erhalten.

Aktuelle Sitzungen über alle Kontakte hinweg

GET /chat-sessions/recent

Gibt die Sitzungen zurück, die in den letzten X Stunden begonnen haben, sortiert nach Aktualität, über alle Kontakte des Kontos hinweg.

Abfrageparameter Erforderlich Beschreibung
hours Ja Wie viele Stunden zurückgeblickt werden soll. Muss eine positive ganze Zahl sein.
status Nein Nur Sitzungen mit diesem Status zurückgeben: ChatSessionOpened oder ChatSessionClosed.
limit Nein Maximale Anzahl der zurückzugebenden Sitzungen. Standard 100, Maximum 100.
includeMessages Nein true fügt jeder Sitzung ein messages-Array hinzu. Standardmäßig deaktiviert, da dies die Antwort deutlich vergrößert.

cURL

curl "https://api.youraiconnector.com/v1/chat-sessions/recent?hours=24&status=ChatSessionClosed" \
  -H "X-API-Key: YOUR_API_KEY"

JavaScript

const params = new URLSearchParams({ hours: "24", status: "ChatSessionClosed" });
const res = await fetch(`https://api.youraiconnector.com/v1/chat-sessions/recent?${params}`, {
  headers: { "X-API-Key": "YOUR_API_KEY" },
});
const data = await res.json();
console.log(data.data.total_sessions, data.data.sessions);

Python

import requests

res = requests.get(
    "https://api.youraiconnector.com/v1/chat-sessions/recent",
    headers={"X-API-Key": "YOUR_API_KEY"},
    params={"hours": 24, "status": "ChatSessionClosed"},
)
data = res.json()["data"]
print(data["total_sessions"], data["sessions"])

Antwort (200 OK):

{
  "success": true,
  "data": {
    "hours_ago": 24,
    "total_sessions": 2,
    "sessions": [
      {
        "session_id": "session456",
        "contact_id": "contact123",
        "contact_name": "Jane Doe",
        "contact_phone": "+31612345678",
        "contact_email": "jane@example.com",
        "start_date_time": "2026-06-01T09:55:00.000Z",
        "end_date_time": "2026-06-01T10:20:00.000Z",
        "status": "ChatSessionClosed",
        "tag": "Booking enquiry"
      }
    ]
  }
}

Alle Sitzungen für einen Kontakt

GET /chat-sessions/{contactId}

Gibt jede Chat-Sitzung für einen einzelnen Kontakt zurück. Gleiche Parameter wie status, limit und includeMessages wie oben – hours findet hier keine Anwendung.

cURL

curl "https://api.youraiconnector.com/v1/chat-sessions/contact123?limit=20" \
  -H "X-API-Key: YOUR_API_KEY"

Antwort (200 OK):

{
  "success": true,
  "data": {
    "contact_id": "contact123",
    "contact_name": "Jane Doe",
    "total_sessions": 2,
    "sessions": [
      {
        "id": "session456",
        "start_date_time": "2026-06-01T09:55:00.000Z",
        "end_date_time": "2026-06-01T10:20:00.000Z",
        "status": "ChatSessionClosed",
        "tag": "Booking enquiry"
      }
    ]
  }
}

Die Feldnamen für die Sitzungs-ID unterscheiden sich zwischen den beiden Endpunkten. Die Liste der aktuellen Sitzungen nennt sie session_id (sie enthält auch die Details des Kontakts, da Sitzungen von vielen Kontakten stammen); die Liste pro Kontakt nennt sie id. Beide Werte können als {sessionId} verwendet werden, wenn Sie den vollständigen Thread wie unten beschrieben abrufen.

Wenn includeMessages=true gesetzt ist, erhält jede Sitzung ein messages-Array, dessen Einträge id, body, direction, timestamp, type, channel und status enthalten.


Chat-Sitzungs-Thread abrufen

GET /contacts/{contactId}/chat-sessions/{sessionId}/messages

Eine Chat-Sitzung gruppiert die Nachrichten eines Kontakts in einem Konversationsfenster. Dieser Endpunkt gibt den vollständigen Thread einer einzelnen Sitzung zurück, beginnend mit der ältesten Nachricht, zusammen mit den Metadaten der Sitzung. Sie finden Sitzungs-IDs für einen Kontakt über die Chat-Sitzungs-Endpunkte.

cURL

curl "https://api.youraiconnector.com/v1/contacts/contact123/chat-sessions/session456/messages" \
  -H "X-API-Key: YOUR_API_KEY"

JavaScript

const res = await fetch(
  "https://api.youraiconnector.com/v1/contacts/contact123/chat-sessions/session456/messages",
  { headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();
console.log(data.session, data.messages);

Python

import requests

res = requests.get(
    "https://api.youraiconnector.com/v1/contacts/contact123/chat-sessions/session456/messages",
    headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()
print(data["session"], data["messages"])

Antwort (200 OK):

{
  "success": true,
  "contact_id": "contact123",
  "session": {
    "id": "session456",
    "status": "ChatSessionClosed",
    "start_date_time": "2026-06-01T09:55:00.000Z",
    "end_date_time": "2026-06-01T10:20:00.000Z",
    "tag": "Booking enquiry"
  },
  "messages": [
    {
      "id": "aB3dE5fG7hI9jK1lM2nO",
      "body": "Hi! Thanks for reaching out.",
      "direction": "inbound",
      "channel": "whatsapp",
      "status": "delivered",
      "type": null,
      "timestamp": "2026-06-01T09:55:00.000Z",
      "media_url": null,
      "media_content_type": null,
      "bot_reply": false
    }
  ]
}

Das session-Objekt meldet status (ChatSessionOpened während der Aktivität, ChatSessionClosed nach Beendigung), start_date_time, end_date_time und einen für Menschen lesbaren tag. Das messages-Array verwendet dieselben Nachrichtenfelder wie der Listen-Endpunkt.


Nachrichten bearbeiten, löschen und darauf reagieren

Diese Endpunkte ändern eine Nachricht, nachdem sie gesendet wurde. Zwei davon greifen sowohl auf den Kanal des Kontakts als auch auf Ihre eigene Kopie zu. Lesen Sie daher die Einleitung des Abschnitts, bevor Sie diese implementieren – was möglich ist, hängt vollständig vom Kanal ab, auf dem die Konversation stattfindet.

Was jeder Kanal ermöglicht

Aktion Kanäle, die die Kopie des Kontakts ändern können Zeitlimit
Gesendete Nachricht bearbeiten Chat-Widget, WhatsApp Web (nur Textnachrichten), Telegram, LinkedIn Keine im Chat-Widget, 15 Minuten bei WhatsApp Web, 48 Stunden bei Telegram, 60 Minuten bei LinkedIn
Für alle löschen Chat-Widget, WhatsApp Web, Telegram, LinkedIn 60 Minuten bei LinkedIn; die anderen haben kein veröffentlichtes Limit
Mit einem Emoji reagieren WhatsApp Web, Telegram Keine

Bei allen anderen Kanälen — WhatsApp Business API, SMS, Instagram, Messenger, E-Mail, LINE, benutzerdefinierte Kanäle — entfernt ein Löschvorgang die Nachricht zwar aus Ihrem Posteingang, der Kontakt behält jedoch seine Kopie, und das Bearbeiten oder Reagieren ist überhaupt nicht möglich.

Nachricht bearbeiten

POST /contacts/{contactId}/messages/{messageId}/edit

Schreibt eine bereits gesendete Nachricht auf dem Gerät des Kontakts und in Ihrer Kopie um.

Feld Erforderlich Beschreibung
body Ja Der neue Nachrichtentext. Darf nicht leer sein und nicht länger als das, was der Kanal in einer Nachricht zulässt (die gleichen kanalbezogenen Limits wie bei Senden nach Kontakt-ID; 4.096, wenn die Nachricht keinen Kanal hat).

Im Gegensatz zum Löschen schlägt dies lautstark fehl, wenn der Kanal dies verweigert: Sie erhalten einen 409 und Ihre Kopie bleibt genau so, wie der Kontakt sie hat, da das Anzeigen einer Bearbeitung, die er nie erhalten hat, dazu führen würde, dass beide Seiten nicht mehr synchron sind. Das Feld edit_reason gibt Ihnen den Grund an – das Bearbeitungsfenster des Kanals ist abgelaufen, der Kanal ist getrennt, die Nachricht enthält einen Anhang, den der Kanal nicht bearbeiten kann (media_not_editable: bei WhatsApp Web können nur Textnachrichten bearbeitet werden, nicht der Text unter einem Foto, Video oder einer Datei) oder etwas anderes ist schiefgelaufen.

cURL

curl -X POST "https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1/edit" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "body": "Sorry - I meant Thursday at 3pm." }'

JavaScript

const res = await fetch(
  "https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1/edit",
  {
    method: "POST",
    headers: {
      "X-API-Key": "YOUR_API_KEY",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({ body: "Sorry - I meant Thursday at 3pm." }),
  }
);
const data = await res.json();
console.log(data.edited, data.edit_reason);

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1/edit",
    headers={
        "X-API-Key": "YOUR_API_KEY",
        "Content-Type": "application/json",
    },
    json={"body": "Sorry - I meant Thursday at 3pm."},
)
data = res.json()
print(data.get("edited"), data.get("edit_reason"))

Antwort (200 OK):

{
  "success": true,
  "contact_id": "contact123",
  "message_id": "msg_1",
  "edited": true,
  "edit_reason": "edit_dispatched"
}

Wenn der Kanal die Bearbeitung nicht akzeptiert, erhalten Sie stattdessen einen 409 und es wurde nichts geändert:

{
  "success": false,
  "error": "The message could not be edited",
  "edit_reason": "channel_disconnected"
}

Eine Nachricht, die bereits gelöscht wurde, ein Kanal, der überhaupt nicht bearbeiten kann, und eine Nachricht, die für ihren Kanal zu alt ist, geben alle 400 zurück — die Anfrage erreicht den Kanal nie.

Eine Nachricht löschen

DELETE /contacts/{contactId}/messages/{messageId}

Entfernt die Nachricht aus Ihrer Unterhaltung und zieht, sofern der Kanal dies zulässt, auch die Kopie des Kontakts zurück. Kein Request-Body.

Dies antwortet immer mit 200, wenn die Nachricht existierte, selbst wenn die Kopie des Kontakts nicht zurückgezogen werden konnte — Ihre Kopie ist weg, daher wäre ein Fehler irreführend. Lesen Sie die drei Felder in der Antwort, um dem Benutzer mitzuteilen, was tatsächlich passiert ist:

Feld Beschreibung
revoke_supported Ob dieser Kanal Nachrichten überhaupt zurückziehen kann.
revoked Ob die Kopie auf dem Gerät des Kontakts entfernt wurde.
revoke_reason Warum sie nicht entfernt wurde, wenn revoked den Wert false hat — zum Beispiel revoke_window_closed oder already_deleted.

cURL

curl -X DELETE "https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1" \
  -H "X-API-Key: YOUR_API_KEY"

JavaScript

const res = await fetch(
  "https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1",
  { method: "DELETE", headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();
console.log(data.revoked, data.revoke_reason);

Python

import requests

res = requests.delete(
    "https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1",
    headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()
print(data["revoked"], data["revoke_reason"])

Antwort (200 OK):

{
  "success": true,
  "contact_id": "contact123",
  "message_id": "msg_1",
  "revoke_supported": true,
  "revoked": true,
  "revoke_reason": "revoke_dispatched"
}

Gelöschte Nachrichten werden nicht aus dem Konversationsverlauf entfernt. Sie verbleiben in GET /contacts/{contactId}/messages mit is_deleted: true sowie einem leeren body und media_url.

Mehrere Nachrichten gleichzeitig löschen

POST /contacts/{contactId}/messages/bulk-delete

Löscht eine Reihe von Nachrichten nur auf Ihrer Seite. Die Nachrichtentexte und Anhänge werden geleert, aber auf dem Gerät des Kontakts wird nichts zurückgezogen – um eine Nachricht auch dort zu entfernen, löschen Sie sie einzeln über den oben genannten Endpunkt für einzelne Nachrichten.

Feld Erforderlich Beschreibung
message_ids Ja Ein nicht leeres Array von Nachrichten-IDs, bis zu 500 pro Anfrage. messageIds wird als Alias akzeptiert.

cURL

curl -X POST "https://api.youraiconnector.com/v1/contacts/contact123/messages/bulk-delete" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "message_ids": ["msg_1", "msg_2"] }'

JavaScript

const res = await fetch(
  "https://api.youraiconnector.com/v1/contacts/contact123/messages/bulk-delete",
  {
    method: "POST",
    headers: {
      "X-API-Key": "YOUR_API_KEY",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({ message_ids: ["msg_1", "msg_2"] }),
  }
);
console.log((await res.json()).deleted);

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/contacts/contact123/messages/bulk-delete",
    headers={
        "X-API-Key": "YOUR_API_KEY",
        "Content-Type": "application/json",
    },
    json={"message_ids": ["msg_1", "msg_2"]},
)
print(res.json()["deleted"])

Antwort (200 OK):

{
  "success": true,
  "contact_id": "contact123",
  "deleted": 2
}

Auf eine Nachricht reagieren

POST /contacts/{contactId}/messages/{messageId}/react

Fügt Ihre eigene Emoji-Reaktion zu einer Nachricht hinzu oder nimmt sie durch Senden eines leeren Strings wieder zurück. Die Reaktionen des Kontakts selbst werden niemals angetastet.

Feld Erforderlich Beschreibung
emoji Ja Das Emoji für die Reaktion oder "", um Ihre Reaktion zu entfernen. Muss ein einzelner String ohne Leerzeichen mit maximal 16 Zeichen sein.

Wie bei der Bearbeitung schlägt dies fehl, anstatt eine Reaktion anzuzeigen, die der Kontakt nie erhalten hat. Der Fehler gibt an, ob ein erneuter Versuch sinnvoll ist:

  • 422 — kann in dieser Konversation niemals zugestellt werden: Der Kanal unterstützt keine Reaktionen, die Nachricht hat keine kanalinterne ID oder das Emoji liegt außerhalb des vom Kanal erlaubten Satzes.
  • 409 — der Kanal war vorübergehend nicht erreichbar. Ein erneuter Versuch könnte funktionieren.

cURL

curl -X POST "https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1/react" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "emoji": "👍" }'

JavaScript

const res = await fetch(
  "https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1/react",
  {
    method: "POST",
    headers: {
      "X-API-Key": "YOUR_API_KEY",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({ emoji: "👍" }),
  }
);
const data = await res.json();
console.log(data.reactions);

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1/react",
    headers={
        "X-API-Key": "YOUR_API_KEY",
        "Content-Type": "application/json",
    },
    json={"emoji": "👍"},
)
print(res.json()["reactions"])

Antwort (200 OK):

{
  "success": true,
  "contact_id": "contact123",
  "message_id": "msg_1",
  "reaction_supported": true,
  "reaction_reason": "reaction_dispatched",
  "reactions": [
    {
      "emoji": "👍",
      "from_phone_number": "+31612345678",
      "from_me": true,
      "reacted_at": "2026-06-01T10:05:00.000Z"
    }
  ]
}

Das reactions-Array ist der vollständige Satz der aktuell auf der Nachricht vorhandenen Reaktionen, sowohl Ihre als auch die des Kontakts. Bei einem 409 oder 422 wird es unverändert zurückgegeben, sodass ein Client, der direkt daraus rendert, niemals eine Reaktion anzeigt, die nicht zugestellt wurde.

Eine Nachricht bewerten oder mit einem Stern markieren

PATCH /contacts/{contactId}/messages/{messageId}

Bewertet eine Nachricht mit „Daumen hoch“ oder „Daumen runter“ und/oder markiert sie als wichtig. Dies dient nur Ihrer eigenen Buchführung – es wird nichts an den Kontakt gesendet.

Feld Erforderlich Beschreibung
score Nein 1 Daumen hoch, -1 Daumen runter, 0 löscht die Bewertung.
is_important Nein true markiert die Nachricht mit einem Stern, false entfernt den Stern wieder. Muss ein echter boolescher Wert sein, nicht der String "true".

Senden Sie mindestens eines der beiden, sonst erhalten Sie einen 400. Nur das, was Sie senden, wird geschrieben. Das Markieren einer Nachricht mit einem Stern löscht also niemals deren Bewertung und umgekehrt – und die Antwort spiegelt nur die Felder wider, die Sie gesendet haben.

cURL

curl -X PATCH "https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "score": 1, "is_important": true }'

JavaScript

await fetch("https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1", {
  method: "PATCH",
  headers: {
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ score: 1, is_important: true }),
});

Python

import requests

requests.patch(
    "https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={"score": 1, "is_important": True},
)

Antwort (200 OK):

{
  "success": true,
  "contact_id": "contact123",
  "message_id": "msg_1",
  "score": 1,
  "is_important": true
}

Nachrichten als gelesen markieren

Sie können den Status „ungelesen“ entweder für bestimmte Nachrichten oder für die gesamte Konversation löschen.

Bestimmte Nachrichten als gelesen markieren

POST /contacts/{contactId}/messages/mark-read

Übergeben Sie die IDs der Nachrichten, die als gelesen markiert werden sollen.

Feld Erforderlich Beschreibung
message_ids Ja Ein nicht leeres Array von Nachrichten-IDs (bis zu 500 pro Anfrage).

cURL

curl -X POST "https://api.youraiconnector.com/v1/contacts/contact123/messages/mark-read" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "message_ids": ["aB3dE5fG7hI9jK1lM2nO", "cD4eF6gH8iJ0kL2mN3oP"]
  }'

JavaScript

const res = await fetch(
  "https://api.youraiconnector.com/v1/contacts/contact123/messages/mark-read",
  {
    method: "POST",
    headers: {
      "X-API-Key": "YOUR_API_KEY",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      message_ids: ["aB3dE5fG7hI9jK1lM2nO", "cD4eF6gH8iJ0kL2mN3oP"],
    }),
  }
);
const data = await res.json();
console.log(data.marked_read);

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/contacts/contact123/messages/mark-read",
    headers={
        "X-API-Key": "YOUR_API_KEY",
        "Content-Type": "application/json",
    },
    json={"message_ids": ["aB3dE5fG7hI9jK1lM2nO", "cD4eF6gH8iJ0kL2mN3oP"]},
)
print(res.json()["marked_read"])

Antwort (200 OK):

{
  "success": true,
  "contact_id": "contact123",
  "marked_read": 2
}

Den gesamten Chat als gelesen markieren

POST /contacts/{contactId}/mark-read

Löscht das „Ungelesen“-Symbol für die gesamte Konversation des Kontakts im Posteingang. Es ist kein Anfragetext erforderlich.

cURL

curl -X POST "https://api.youraiconnector.com/v1/contacts/contact123/mark-read" \
  -H "X-API-Key: YOUR_API_KEY"

JavaScript

const res = await fetch(
  "https://api.youraiconnector.com/v1/contacts/contact123/mark-read",
  { method: "POST", headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();
console.log(data.success);

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/contacts/contact123/mark-read",
    headers={"X-API-Key": "YOUR_API_KEY"},
)
print(res.json()["success"])

Antwort (200 OK):

{
  "success": true,
  "contact_id": "contact123"
}

Den gesamten Chat als ungelesen markieren

POST /contacts/{contactId}/mark-unread

Setzt das Badge für ungelesene Nachrichten zurück auf die Unterhaltung – praktisch, wenn jemand aus Ihrem Team einen Chat geöffnet hat, ihn aber wieder zurückgibt. Es ist kein Request-Body erforderlich.

Dies ist ein reines Posteingangs-Flag: Es ändert nicht, wann die Unterhaltung zuletzt gelesen wurde, daher wird bei Kanälen, die dies unterstützen, keine Lesebestätigung an den Kontakt gesendet.

cURL

curl -X POST "https://api.youraiconnector.com/v1/contacts/contact123/mark-unread" \
  -H "X-API-Key: YOUR_API_KEY"

Antwort (200 OK):

{
  "success": true,
  "contact_id": "contact123"
}

Eine Unterhaltung exportieren

Exporte liefern Ihnen eine ganze Unterhaltung als lesbares Transkript, anstatt durch Nachrichten blättern zu müssen. Jeder Export-Endpunkt akzeptiert einen filter von all (Standard), text, media oder tool_use, passend zum Filter in der Nachrichtenliste.

Chat eines Kontakts exportieren

GET /chat-exports/{contactId}

Abfrageparameter Erforderlich Beschreibung
format Nein txt (Standard) gibt einen Download-Link zu einem Klartext-Transkript zurück. json gibt die Nachrichten als strukturierte Daten in der Antwort zurück.
filter Nein all (Standard), text, media oder tool_use.

cURL

curl "https://api.youraiconnector.com/v1/chat-exports/contact123?format=json" \
  -H "X-API-Key: YOUR_API_KEY"

Python

import requests

res = requests.get(
    "https://api.youraiconnector.com/v1/chat-exports/contact123",
    headers={"X-API-Key": "YOUR_API_KEY"},
    params={"format": "json"},
)
print(res.json()["data"]["messages"])

Antwort mit format=json (200 OK):

{
  "success": true,
  "data": {
    "contact": {
      "id": "contact123",
      "name": "Jane Doe",
      "phone": "+31612345678",
      "email": "jane@example.com"
    },
    "messages": [
      {
        "body": "Hi! I have a question about my order.",
        "direction": "inbound",
        "timestamp": "2026-06-01T09:55:00.000Z",
        "type": "text",
        "media_url": null,
        "media_content_type": null,
        "name": null,
        "args": null
      }
    ]
  }
}

Bei format=txt (dem Standard) ist data stattdessen ein Download-Link zur generierten Transkript-Datei:

{
  "success": true,
  "data": "https://storage.googleapis.com/.../chat-export-contact123-....txt"
}

Der Download-Link ist nur kurzzeitig gültig. Laden Sie die Datei herunter, sobald Sie den Link erhalten, anstatt ihn zu speichern – fordern Sie einen neuen Export an, wenn Sie das Transkript erneut benötigen.

Alle kürzlichen Unterhaltungen exportieren

GET /chat-exports/recent

Exportiert die Konversationen aller Kontakte, die in den letzten X Stunden aktiv waren, in einem einzigen Aufruf.

Abfrageparameter Erforderlich Beschreibung
hours Ja Wie viele Stunden Aktivität zurückverfolgt werden sollen. Muss eine positive ganze Zahl sein.
format Nein json (Standard) gibt einen Eintrag pro Kontakt zurück. txt gibt eine einzelne herunterladbare Textdatei mit allen Konversationen darin zurück.
limit Nein Maximale Anzahl der zu exportierenden Kontakte. Standard 50, Maximum 100.
filter Nein all (Standard), text, media oder tool_use.

cURL

curl "https://api.youraiconnector.com/v1/chat-exports/recent?hours=24&limit=25" \
  -H "X-API-Key: YOUR_API_KEY"

Antwort (200 OK):

{
  "success": true,
  "data": {
    "hours_ago": 24,
    "total_contacts": 2,
    "exports": [
      {
        "contactId": "contact123",
        "contactName": "Jane Doe",
        "phoneNumber": "+31612345678",
        "email": "jane@example.com",
        "messageCount": 12,
        "chatExport": "Acme Export - Jane Doe\nPhone: +31612345678\n..."
      }
    ]
  }
}

Bei format=txt ist die Antwort die Textdatei selbst, die als Download gesendet wird, anstatt als JSON.

Dieser eine Aufruf ruft den vollständigen Verlauf jedes übereinstimmenden Kontakts ab. Halten Sie daher hours und limit bei stark frequentierten Konten in einem angemessenen Rahmen.

Ein Transkript per E-Mail an den Kontakt senden

POST /chat-exports/{contactId}/email

Sendet dem Kontakt sein eigenes Konversationstranskript per E-Mail – der „Sende mir diesen Chat per E-Mail“-Ablauf, gesteuert über Ihr eigenes System.

Feld Erforderlich Beschreibung
recipient_email Nein Wohin es gesendet werden soll. Standardmäßig die gespeicherte E-Mail-Adresse des Kontakts.
via Nein auto (Standard) wählt den besten Weg, transactional sendet es als System-E-Mail, email_channel sendet es von Ihrem verbundenen E-Mail-Kanal.
note Nein Eine kurze Zeile von Ihnen, die über dem Transkript angezeigt wird. Bis zu 1000 Zeichen.

cURL

curl -X POST "https://api.youraiconnector.com/v1/chat-exports/contact123/email" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "note": "Here is a copy of our chat, as promised." }'

Antwort (200 OK):

{
  "success": true,
  "data": {
    "via": "transactional",
    "recipientEmail": "jane@example.com",
    "messageCount": 42,
    "omittedCount": 0
  }
}

omittedCount gibt an, wie viele der ältesten Nachrichten weggelassen wurden, um die E-Mail in einer angemessenen Länge zu halten. Ein 200 bedeutet, dass das Transkript erstellt und für den Versand in die Warteschlange gestellt wurde, nicht, dass es bereits im Posteingang angekommen ist.


KI für einen Kontakt pausieren oder fortsetzen

PUT /contacts/{contactId}

Setzen Sie is_bot_active auf false, um zu verhindern, dass die KI auf einen Kontakt antwortet, und zurück auf true, um das Gespräch wieder zu übergeben. Dies ist der Übernahmeschalter, den Sie benötigen, wenn ein Mensch in ein Gespräch eingreift: Ausgehende Nachrichten, die Sie über die API senden, werden weiterhin zugestellt, während der Bot pausiert ist.

cURL

curl -X PUT "https://api.youraiconnector.com/v1/contacts/contact123" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "is_bot_active": false }'

JavaScript

await fetch("https://api.youraiconnector.com/v1/contacts/contact123", {
  method: "PUT",
  headers: {
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ is_bot_active: false }),
});

Python

import requests

requests.put(
    "https://api.youraiconnector.com/v1/contacts/contact123",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={"is_bot_active": False},
)

Antwort

{
  "success": true,
  "contact_id": "contact123"
}

Pausieren als Teil der Antwort

Wenn ein Mensch durch das Senden einer Antwort übernimmt, können Sie den Bot in derselben Anfrage pausieren, anstatt einen zweiten Aufruf zu tätigen. POST /contacts/{contactId}/send-message akzeptiert diese optionalen Flags:

Feld Beschreibung
pauseBot true pausiert die KI für diesen Kontakt, während die Nachricht gesendet wird.
clearIncompleteReply true verwirft eine halbfertige Bot-Antwort, damit sie danach nicht fortgesetzt wird.
human_reply true markiert die Nachricht als Antwort eines Teammitglieds und bricht eine Antwort ab, die die KI in die Warteschlange gestellt hatte. Zum Pausieren wird weiterhin pauseBot benötigt.
curl -X POST "https://api.youraiconnector.com/v1/contacts/contact123/send-message" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "body": "Hi, Sarah here - taking over from the assistant.",
    "pauseBot": true,
    "clearIncompleteReply": true,
    "human_reply": true
  }'

Die Antwort enthält "botPaused": true, wenn die Pause angewendet wurde.

Das Markieren eines Kontakts als privat mit POST /contacts/bulk-flag pausiert ebenfalls den Bot für diesen Kontakt. Siehe Kontakte für die vollständige Feldliste.


Eigenen Posteingang erstellen

Alles, was ein Posteingang benötigt, finden Sie auf dieser Seite und unter Kontakte:

Was Sie benötigen Endpunkt
Konversationen auflisten GET /contacts
Eine Konversation lesen GET /contacts/{contactId}/messages
Chat-Sitzungen eines Kontakts auflisten GET /chat-sessions/{contactId}
Sehen, was kürzlich eingegangen ist GET /chat-sessions/recent
Eine Chat-Sitzung lesen GET /contacts/{contactId}/chat-sessions/{sessionId}/messages
Eine manuelle Antwort senden POST /contacts/{contactId}/send-message
Eine gerade gesendete Antwort korrigieren POST /contacts/{contactId}/messages/{messageId}/edit
Eine Nachricht entfernen DELETE /contacts/{contactId}/messages/{messageId}
Mehrere Nachrichten löschen POST /contacts/{contactId}/messages/bulk-delete
Mit einem Emoji reagieren POST /contacts/{contactId}/messages/{messageId}/react
Eine Nachricht bewerten oder mit einem Stern markieren PATCH /contacts/{contactId}/messages/{messageId}
Als gelesen markieren POST /contacts/{contactId}/mark-read
Einen Chat an das Team zurückgeben POST /contacts/{contactId}/mark-unread
Ein Transkript exportieren GET /chat-exports/{contactId}
Die KI pausieren oder fortsetzen PUT /contacts/{contactId} mit is_bot_active

Für Live-Updates abonnieren Sie die Ereignisse New Message, Replies, Human Alerted und Chat Concluded mit Webhooks, anstatt diese API zeitgesteuert abzufragen.


Fehler der Messages-API

Nachrichten-Endpunkte geben das Standard-Fehler-Envelope zurück:

{
  "success": false,
  "error": "Contact not found"
}
Status Wann es bei einem Nachrichten-Endpunkt auftritt
400 Ein erforderliches Feld fehlt oder ein Parameter ist ungültig (falsche limit, hours, filter, direction, status, ein leeres oder über 500 Elemente umfassendes message_ids-Array, ein ungültiges cursor, ein leeres oder zu langes Bearbeitungs-body, ein score außerhalb von -1/0/1 oder ein Emoji mit Leerzeichen oder über 16 Zeichen). Wird auch zurückgegeben, wenn eine Nachricht überhaupt nicht bearbeitet werden kann – sie wurde gelöscht, ihr Kanal unterstützt keine Bearbeitung oder das Bearbeitungsfenster des Kanals ist abgelaufen.
404 Der Kontakt, die Chat-Sitzung oder eine der bereitgestellten Nachrichten-IDs wurde nicht gefunden.
409 Der Kanal akzeptiert die Änderung derzeit nicht. Es wurde nichts geschrieben: Bei einer Bearbeitung gibt edit_reason den Grund an; bei einer Reaktion war der Kanal vorübergehend nicht erreichbar und ein erneuter Versuch könnte funktionieren.
422 Der Kontakt kann keine ausgehenden Nachrichten empfangen (Nicht-stören-Modus, privat oder ein nicht unterstützter Kanal) oder eine Reaktion kann in dieser Konversation niemals zugestellt werden (reaction_reason gibt an, welche).

Die gemeinsamen Codes, die jeder Endpunkt zurückgeben kann — 401, 403 (Ihr Plan beinhaltet keinen API-Zugriff), 429 (Ratenbegrenzung) und 500 — sind zusammen mit Hinweisen zur Wiederholung unter Fehler & Paginierung aufgeführt.


Nächste Schritte

  • Webhooks — erhalten Sie Zustellungsstatus-Updates per Push, anstatt sie abzufragen.
  • Kontakte — erstellen und suchen Sie die Kontakte, denen Sie Nachrichten senden.
  • Termine — buchen und verwalten Sie Termine für Ihre Kontakte.