Nachrichten-Callback-API
Übersicht
Die Daten zu „Nachrichtenstatus“ und „Nachrichtenantwort“ werden an das Geschäftssystem des Unternehmens zurückgespielt. Diese Informationen können beispielsweise für Statistiken oder zur Beantwortung von Nutzeranfragen verwendet werden.
Callbacks zum Nachrichtenstatus und zu eingehenden Nutzernachrichten können eine Business-Scoped User ID (BSUID) enthalten, um den jeweiligen WhatsApp-Nutzer zu identifizieren. Die BSUID wird über neue optionale Felder zurückgegeben und hat keine Auswirkungen auf vorhandene Felder oder Callback-Ereignisse.
Callback-Adresse
Unternehmen müssen Callback-Adressen einrichten, um Nachrichtenstatus und Nachrichtenantworten zu empfangen. Weitere Informationen finden Sie unter Callback-Einstellungen.
Callback-Format
Die Anfragemethode ist POST, der Request-Body ist im JSON-Format und der Datentyp ist „Content-Type: application/json“.
Es werden jeweils mehrere Datensätze gleichzeitig zurückgegeben.
Sicherheitsmechanismus
Der Dienst muss online sein. Aktuell enthält der Callback keine Authentifizierungsinformationen. Daher sollte für die API, die den Callback empfängt, keine Berechtigungsprüfung eingerichtet werden.
Antwortmechanismus
Nach Erhalt des EngageLab-Callbacks muss der Entwicklerdienst innerhalb von 3 Sekunden wie folgt antworten:
Erfolgreich empfangen: Der HTTP-Response-Statuscode muss 200 zurückgeben, eine Antwortnachricht ist nicht erforderlich.
Retry-Mechanismus
Der Dienst muss online sein.
Anfrageparameter
EngageLab sendet folgende Anfrageparameter an die Callback-Adresse des Geschäftssystems:
| Feld | Typ | Option | Beschreibung |
|---|---|---|---|
| total | int | erforderlich | Anzahl der Callback-Datensätze |
| rows | JSON Array | erforderlich | Details der Callback-Daten |
Die Parameter in rows sind wie folgt:
| Feld | Typ | Option | Beschreibung |
|---|---|---|---|
| message_id | string | optional | Status und Antwort der Nachricht. |
| from | string | optional | Absender. Wird bei Nachrichtenstatus- und Upstream-Nachrichten-Callbacks zurückgegeben; behält die bisherige Bedeutung als Nummernfeld bei und darf nicht als BSUID verwendet werden. |
| to | string | optional | Empfänger. Wird bei Nachrichtenstatus- und Upstream-Nachrichten-Callbacks zurückgegeben; behält die bisherige Bedeutung als Nummernfeld bei und darf nicht als BSUID verwendet werden. |
| server | string | erforderlich | Produktservice, zu dem die Callback-Information gehört. Fester Wert: whatsapp. |
| channel | string | optional | Kanal, zu dem Status oder Antwort gehören. Fester Wert: whatsapp. |
| itime | int | erforderlich | Zeitstempel, der durch die Callback-Daten generiert wurde. Über das Feld message_status können Sie den Anfrage-, Sende-, Zustell- und Lesetimestamp abrufen. |
| custom_args | JSON Object | optional | Optionale Felder, die beim Senden der Nachricht individuell angepasst wurden. Diese werden beim Nachrichtenstatus-Callback zurückgegeben. |
| status | JSON Object | optional | Nachrichtenstatus-Feld |
| response | JSON Object | optional | Nachrichtenantwort-Feld |
BSUID-Felder
Die BSUID wird im vorhandenen Callback-Payload über die folgenden optionalen Felder zurückgegeben:
| Callback-Typ | JSON-Pfad | Typ | Beschreibung |
|---|---|---|---|
| Nachrichtenstatus-Callback | rows[].status.status_data.recipient_user_id |
String | BSUID des Empfängers |
| Callback für eingehende Nutzernachrichten | rows[].response.response_data.contact.user_id |
String | BSUID des Nutzers, der die Nachricht gesendet hat |
- Wenn keine BSUID verfügbar ist, wird das entsprechende Feld weggelassen. Clientseitige Parser müssen das Fehlen des Feldes zulassen.
- Um Nummer und BSUID gemeinsam anzuzeigen, verwenden Sie bei Nachrichtenstatus-Callbacks
tozusammen mitstatus_data.recipient_user_idund bei eingehenden Nutzernachrichtencontact.wa_idzusammen mitcontact.user_id. - Die BSUID-Felder dienen ausschließlich zur Nutzeridentifizierung in Callbacks. Die Sende-API unterstützt derzeit keine BSUID als Empfänger.
Nachrichtenstatus – Status
Callback-Parameter
| Feld | Typ | Option | Beschreibung |
|---|---|---|---|
| message_status | string | erforderlich | Status der Nachricht. |
| status_data | JSON Object | optional | Detaillierte Daten zu diesem Status |
| error_code | int | optional | Fehlercode. Bei Fehlern wird der Fehlercode zurückgegeben. |
| error_detail | JSON Object | optional | Fehlerdetails. Bei Fehlern wird die Fehlermeldung zurückgegeben. |
| loss | JSON Object | optional | Verlustphase und -quelle |
message_status – Werte und Beschreibung
| Wert | Beschreibung | Definition |
|---|---|---|
| plan | Geplante Zustellung | Die Nummer ist unter den „Empfängernummern“ und dokumentiert den Status eines geplanten Versandziels. |
| target_valid | Gültiges Ziel | Gültigkeitsprüfung bestanden 1. Die Nummer wurde von EngageLab als gültig erkannt. 2. Die Nummer wurde vom Meta WhatsApp Service als gültig erkannt. |
| sent | Erfolgreich gesendet | Fehlermeldung, nachdem EngageLab die Nummer an den Meta WhatsApp Service übergeben hat. |
| delivered | Erfolgreich zugestellt | Der Meta WhatsApp Service bestätigt, dass die Nachricht beim Nutzer zugestellt wurde. |
| read | Gelesen | Der Meta WhatsApp Service bestätigt, dass der Nutzer die Nachricht gelesen hat. |
| target_invalid | Ziel ungültig | 1. Die Nummer wurde von EngageLab als ungültig erkannt. 2. Die Nummer wurde vom Meta WhatsApp Service als ungültig erkannt. |
| sent_failed | Senden fehlgeschlagen | Fehlermeldung nach Übergabe der Nummer an den Meta WhatsApp Service. |
| delivered_failed | Zustellung fehlgeschlagen | Die Nummer wurde an den Meta WhatsApp Service übergeben, aber der Meta-Callback ist fehlgeschlagen. |
| delivered_timeout | Nicht zugestellt nach Timeout | Die Nummer wurde erfolgreich an den Meta WhatsApp Service übergeben, aber Meta hat innerhalb von 5 Minuten keine Rückmeldung zum Erfolg/Misserfolg gegeben. Dies wird als Timeout gewertet. |
status_data
| Feld | Typ | Option | Beschreibung |
|---|---|---|---|
| msg_time | int | erforderlich | Zeitpunkt, zu dem die Nachricht gesendet wurde. |
| channel_message_id | String | erforderlich | Die von WhatsApp zurückgegebene Nachrichten-ID. |
| whatsapp_business_account_id | String | erforderlich | ID des WhatsApp Business Accounts, von dem die Nummer stammt. |
| timezone | String | erforderlich | Zeitzone der Organisation |
| plan_user_total | int | optional | Gesamtanzahl der geplanten Ziele. Nur bei message_status = plan vorhanden. |
| country_code | String | erforderlich | Ländervorwahl der Empfängernummer. |
| from_phone_id | String | erforderlich | ID der Absendernummer (from) |
| recipient_user_id | String | optional | BSUID des Empfängers; wird zurückgegeben, wenn sie verfügbar ist, andernfalls wird das Feld weggelassen |
| conversation | JSON Object | optional | Sitzungsinformationen |
| pricing | JSON Object | optional | Preisinformationen |
recipient_user_id wird häufig bei sent-, delivered- und read-Callbacks zurückgegeben, sobald die BSUID des Empfängers verfügbar ist. Bei Vorverarbeitungs- oder Fehlerstatus, historischen Nachrichten oder Daten aus älteren Verarbeitungswegen kann das Feld fehlen.
conversation
| Feld | Typ | Option | Beschreibung |
|---|---|---|---|
| id | String | optional | ID der Meta-Konversation, zu der die Nachricht gehört. |
| origin | JSON Object | optional | Wer die Konversation initiiert hat. Angegeben durch type. Beispiel: "origin":{"type":"business_initiated"}. Gültige Werte: |
pricing
| Feld | Typ | Option | Beschreibung |
|---|---|---|---|
| pricing_model | String | optional | Fester Wert: CBP |
| category | String | optional | Kategorie der Dialogpreisgestaltung. Gültige Werte: |
error_detail
| Feld | Typ | Option | Beschreibung |
|---|---|---|---|
| message | String | erforderlich | Ursache |
loss
| Feld | Typ | Option | Beschreibung |
|---|---|---|---|
| loss_step | int | erforderlich | Verlustphase 1: Von geplantem Ziel zu effektivem Ziel, d. h. ungültiges Ziel 2: Gültiges Ziel bis Senden, d. h. Senden fehlgeschlagen 3: Senden bis Zustellung. Zustellung fehlgeschlagen |
| loss_source | String | erforderlich | Quelle des Verlusts. Gültige Werte: engagelab: EngageLab WhatsApp-Verlust durch Serviceprüfung meta: Fehler von Meta zurückgegeben. |
Callback-Beispiel
{
"total": 1,
"rows": [
{
"message_id": "1666165485030094861",
"from": "",
"to": "",
"server": "whatsapp",
"channel": "whatsapp",
"itime": 1640707579,
"custom_args": {},
"status": {
"message_status": "delivered",
"status_data": {
"msg_time": 1663432355,
"channel_message_id": "wamid.123321abcdefed==",
"whatsapp_business_account_id": "",
"timezone": "",
"plan_user_total": 2007,
"country_code": "CN",
"from_phone_id": "111111",
"recipient_user_id": "ID.1234567890123456",
"conversation": {
"id": "ebe2398cdaa37a0899ca5268b987b0c8",
"origin": {
"type": "business_initiated"
}
},
"pricing": {
"pricing_model": "CBP",
"category": "business_initiated"
}
},
"error_code": 0,
"error_detail": {
"message": ""
},
"loss": {
"loss_step": 1,
"loss_source": "aa"
}
}
}
]
}
Nachrichtenantwort
Callback-Parameter
| Feld | Typ | Option | Beschreibung |
|---|---|---|---|
| event | string | optional | Antwortereignis |
| response_data | JSON Object | optional | Inhalt der Upstream-Antwort/Interaktion |
event
| Wert | Beschreibung | Details |
|---|---|---|
| received | Empfangene Nutzernachricht | Der Nutzer hat eine Nachricht direkt gesendet. |
| reply | Nutzer hat auf Ihre Nachricht geantwortet. | Das Unternehmen sendet zuerst eine Nachricht, der Nutzer antwortet darauf. |
| order | Nutzerbestellung | - |
| deleted | Nutzer hat seine Nachricht gelöscht. | Der Nutzer hat die von ihm gesendete Nachricht gelöscht (in Vorbereitung). |
response_data
| Feld | Typ | Option | Beschreibung |
|---|---|---|---|
| channel_message_id | String | erforderlich | Die von WhatsApp zurückgegebene Nachrichten-ID. |
| whatsapp_business_account_id | String | erforderlich | ID des WhatsApp Business Accounts, von dem die Nummer stammt. |
| contact | JSON Object | optional | Absenderinformationen |
| message | JSON Object | erforderlich | Nachrichteninhalt |
| message_context | JSON Object | Optional | Nachrichtenkontext, erscheint beim reply-Event und gibt an, auf welche Nachricht der Nutzer geantwortet hat |
contact
| Feld | Typ | Option | Beschreibung |
|---|---|---|---|
| profile | JSON Object | optional | Informationen des Absenders (Kunde). Aktuell gibt nur das Feld name den Kundennamen an. Beispiel: "profile": {"name": "bob"} |
| wa_id | String | optional | Nummer des Absenders. |
| user_id | String | optional | BSUID des Nutzers, der die Nachricht gesendet hat; wird zurückgegeben, wenn sie verfügbar ist, andernfalls wird das Feld weggelassen |
contact.wa_id behält seine bisherige Bedeutung als Nummernfeld bei, während contact.user_id die BSUID enthält. Lesen Sie zur Identifizierung eines Nutzers per BSUID contact.user_id; behandeln Sie from, to oder contact.wa_id nicht als BSUID.
message
| Feld | Typ | Option | Beschreibung |
|---|---|---|---|
| type | String | erforderlich | Gültige Werte: text, image, audio, video, document, sticker, button, interactive, unknown, order. |
| text | JSON Object | optional | Weitere Informationen siehe Textobjekt-Beschreibung |
| image | JSON Object | optional | Weitere Informationen siehe Bildobjekt-Beschreibung |
| audio | JSON Object | optional | Weitere Informationen siehe Audioobjekt-Beschreibung |
| video | JSON Object | optional | Weitere Informationen siehe Videoobjekt-Beschreibung |
| document | JSON Object | optional | Weitere Informationen siehe Dokumentobjekt-Beschreibung |
| sticker | JSON Object | optional | Weitere Informationen siehe Stickerobjekt-Beschreibung |
message_context
| Feld | Typ | Option | Beschreibung |
|---|---|---|---|
| origin_from_phone | String | erforderlich | Absendernummer der referenzierten Nachricht, ohne Leerzeichen oder + |
| origin_channel_message_id | String | erforderlich | Eindeutige ID der referenzierten Nachricht |
| origin_from_phone_id | String | optional | Absendernummer-ID der referenzierten Nachricht, normalerweise vorhanden |
| origin_message_id | String | optional | Nachrichten-ID der referenzierten Nachricht, normalerweise vorhanden |
Callback-Beispiel
{
"total": 1,
"rows": [
{
"message_id": "1666165485030094861",
"from": "",
"to": "",
"server": "whatsapp",
"channel": "whatsapp",
"itime": 1640707579,
"response": {
"event": "",
"response_data": {
"channel_message_id": "wamid.123321abcdefed==",
"whatsapp_business_account_id": "123321",
"contact": {
"profile": {
"name": "bob"
},
"wa_id": "8613800138000",
"user_id": "ID.1234567890123456"
},
"message": {
"type": "text",
"text": {
"body": "Hier steht der Textinhalt der Nachricht"
}
}
}
}
}
]
}
Nachrichtenbenachrichtigung – Notification
Callback-Parameter
| Feld | Typ | Option | Beschreibung |
|---|---|---|---|
| event | string | optional | Antwortereignis |
| notification_data | JSON Object | optional | Inhalt der Systembenachrichtigung |
event
| Wert | Beschreibung | Detaillierte Erklärung |
|---|---|---|
| insufficient_balance | Unzureichendes Guthaben | Das Echtzeit-Guthaben liegt unter dem von Ihnen festgelegten Schwellenwert (Standard: $10) |
| template_update | Template-Status geändert | Änderung des Template-Status und der Template-Qualität |
| phone_number_update | Status der Absendernummer geändert | Statusänderung der Absendernummer, aktuell werden nur Änderungen am „Nachrichtenversandlimit“ unterstützt. Werte sind: TIER_50: 50 Kund:innen/24 Stunden TIER_250: 250 Kund:innen/24 Stunden TIER_1K: 1.000 Kund:innen/24 Stunden TIER_10K: 10.000 Kund:innen/24 Stunden TIER_100K: 100.000 Kund:innen/24 Stunden TIER_UNLIMITED: Unbegrenzt |
| whatsapp_business_update | WABA-Account geändert | WABA-Account gesperrt, verwarnt etc. |
notification_data
| Feld | Typ | Option | Beschreibung |
|---|---|---|---|
| whatsapp_business_account_id | String | erforderlich | WhatsApp Business Account Nummer |
| remain_balance | int | optional | Bei event = insufficient_balance Aktueller Echtzeit-Guthabenwert (USD) |
| balance_threshold | int | optional | Bei event = insufficient_balance Der von Ihnen gesetzte Schwellenwert für die Guthabenwarnung (USD) |
| template_id | String | optional | Bei event = template_update Template-ID |
| template_name | String | optional | Bei event = template_update Template-Name |
| template_language | String | optional | Bei event = template_update Templatesprache |
| template_status | String | optional | Bei event = template_update Template-Status, Werte: APPROVED/REJECTED/PENDING/DISABLED/FLAGGED/REINSTATED |
| template_status_reason | String | optional | Bei event = template_update Änderungsgrund, meist bei abgelehnter Template-Prüfung, sonst „NONE“ oder nicht vorhanden |
| phone_number_id | String | optional | Bei event = phone_number_update Absendernummer-ID |
| display_phone_number | String | optional | Bei event = phone_number_update, Absendernummer, Beispiele: +1 320-302-7083 +86 183 7981 2430 |
| current_limit | String | optional | Bei event = phone_number_update Aktuelles Versandlimit, Werte: TIER_50/TIER_250/TIER_1K/TIER_10K/TIER_100K/TIER_UNLIMITED |
| waba_event | String | optional | Bei event = whatsapp_business_update, aktuelle Werte: DISABLED_UPDATE Account gesperrt ACCOUNT_VIOLATION Account-Verstoß |
| ban_state | String | optional | Bei event = whatsapp_business_update und waba_event = DISABLED_UPDATE, aktueller Wert: DISABLE Gesperrt |
| violation_type | String | optional | Bei event = whatsapp_business_update und waba_event = ACCOUNT_VIOLATION, aktuelle Werte: SPAM Als Spam/Belästigung markiert SCAM Als Betrug markiert |
Callback-Beispiel
{
"total": 1,
"rows": [
{
"server": "whatsapp",
"itime": 1640707579,
"notification": {
"event": "insufficient_balance",
"notification_data": {
"whatsapp_business_account_id": "",
"remain_balance": 5.1234,
"balance_threshold": 10
}
}
}
]
}










