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/sendund 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.
Senden per Kontakt-ID
POST /contacts/{contactId}/send-message
| Feld | Erforderlich | Beschreibung |
|---|---|---|
body |
Ja | Der zu sendende Nachrichtentext. |
mediaUrl |
Nein | URL einer Mediendatei (Bild, Dokument usw.), die angehängt werden soll. |
mediaContentType |
Nein | MIME-Typ der angehängten Medien, z. B. image/jpeg. |
pauseBot |
Nein | true pausiert die KI für diesen Kontakt, während die Nachricht gesendet wird – für die Übernahme durch einen Menschen. Siehe KI pausieren oder fortsetzen. |
clearIncompleteReply |
Nein | true verwirft eine halbfertige Bot-Antwort, damit diese nach Ihrer Nachricht nicht fortgesetzt wird. |
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. |
contact_id |
Nein | ID eines bestehenden Kontakts. Wenn gesetzt, werden die Identitätsfelder unten nicht benötigt. |
channel |
Nein | Kanal, über den gesendet werden soll. Erforderlich, wenn contact_id nicht angegeben ist. Einer der 14 für ausgehende Nachrichten 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 zum Anhängen. |
media_content_type |
Nein | MIME-Typ der angehängten Medien, 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
422fehl. Wenn kein Kontakt mit der von Ihnen angegebenen ID oder Identität übereinstimmt, erhalten Sie ein404.
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
filterunddirectionwerden auf jede Seite angewendet, nachdem sie gelesen wurde. Daher kann eine gefilterte Seite weniger Elemente enthalten alslimit. Dernext_cursorschreitet weiterhin durch die gesamte Konversation voran, fahren Sie also mit der Paginierung fort, bisnext_cursorden Wertnullhat.
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. |
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. Nur-Text-Nachrichten haben den Typ null; automatisierte Aktivitäten von Assistenten-Tools sind als tool_use gekennzeichnet. |
timestamp |
ISO 8601-Zeitpunkt der Erstellung der Nachricht. |
media_url |
URL einer angehängten Mediendatei, falls vorhanden. |
media_content_type |
MIME-Typ der angehängten Medien, 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 Nachricht bewerten oder mit Stern markieren. |
is_important |
true, wenn die Nachricht mit einem Stern markiert wurde. |
is_deleted |
true, wenn die Nachricht gelöscht wurde. Gelöschte Nachrichten verbleiben in der Liste, aber ihre Felder 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 enthält emoji, from_phone_number, from_me (true, wenn die Reaktion von Ihnen stammt) und reacted_at. |
Chat-Sitzungen auflisten
Eine Chat-Sitzung ist ein Konversationsfenster mit einem Kontakt: Es öffnet sich, wenn dieser zu schreiben beginnt, und schließt sich, wenn das Gespräch beendet ist. Sitzungen ermöglichen es Ihnen, 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 sieid. 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, Telegram, LinkedIn | Kein Limit beim 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 | Keines |
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 darf maximal 4096 Zeichen lang sein. |
Im Gegensatz zum Löschen schlägt dies deutlich fehl, wenn der Kanal dies verweigert: Sie erhalten einen 409 und Ihre Kopie bleibt exakt so, wie der Kontakt sie hat, da das Anzeigen einer Bearbeitung, die er nie erhalten hat, zu einer Diskrepanz zwischen beiden Seiten führen würde. Das Feld edit_reason gibt an, warum — das Bearbeitungsfenster des Kanals ist abgelaufen, der Kanal ist getrennt 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}/messagesmitis_deleted: truesowie einem leerenbodyundmedia_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
hoursundlimitbei 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 zwei optionale 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 diese danach nicht fortgesetzt wird. |
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
}'
Die Antwort enthält "botPaused": true, wenn die Pause angewendet wurde.
Das Markieren eines Kontakts als privat mit
POST /contacts/bulk-flagpausiert 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.