Documentația Bulk Template Message API
Acest API vă permite să trimiteți mesaje șablon către mai mulți destinatari simultan, prin canalul WhatsApp.
Livrarea mesajelor este procesată asincron; cererea API returnează imediat un bulkMessageId, iar mesajele sunt puse în coadă și procesate în fundal.
POST https://app.monochat.ai/api/:slug/custom-functions/bulk-message-api-app/api/bulk-message/send.js
Funcționalități principale
- Trimiteți mesaje șablon în masă către 1–5.000 de destinatari într-o singură cerere
- Variabile personalizate pentru fiecare destinatar (HEADER, BODY, BUTTONS, CAROUSEL)
defaultPayloadcomun pentru toți destinatarii, cu îmbinareapayload-ului specific fiecărui destinatar (isMerge)- Livrare programată (
scheduleAt) - Indicați destinatarii prin
username(număr de telefon),userIdsausessionId - Trimiteți mai multe mesaje aceluiași utilizator în cadrul unei singure cereri în masă
referenceIdopțional pentru urmărirea înregistrărilor în sisteme externe- Atribuiți automat conversațiile unui utilizator sau unui grup de lucru după trimitere (
action)
Acest API poate trimite doar șabloane aprobate de Meta.
Numele șablonului și codul de limbă trebuie să corespundă exact șablonului înregistrat în Meta Business Manager.
Parametrii cererii
Parametri de nivel superior
| Parametru | Tip | Obligatoriu | Descriere |
|---|---|---|---|
channelUsername | string | Da | Numărul canalului WhatsApp folosit pentru trimiterea mesajului (de exemplu "908506669933") |
connectorBrand | string | Da | Brandul conectorului de canal. Valoare acceptată în prezent: "whatsapp" |
title | string | Nu | Titlul campaniei. Folosit pentru afișare în dashboard. Implicit: "-" |
scheduleAt | string (ISO 8601) | Nu | Data și ora livrării programate (de exemplu "2026-06-10T10:00:00.000Z"). Dacă este omis, mesajele se trimit imediat. |
defaultPayload | object | Condiționat* | Payload-ul implicit al șablonului, aplicat tuturor destinatarilor. Obligatoriu dacă un destinatar nu furnizează propriul payload. |
recipients | array | Da | Lista destinatarilor. Minimum 1, maximum 5.000 de destinatari. |
action | object | Nu | Acțiune aplicată conversației după trimitere. assign-to-user sau assign-to-workgroup. |
*Dacă fiecare destinatar furnizează propriul payload, defaultPayload este opțional.
Structura destinatarului
Pentru fiecare destinatar trebuie furnizat exact unul dintre username, userId sau sessionId. Mai mulți identificatori nu pot fi folosiți împreună, iar omiterea tuturor duce la o eroare.
Pentru a trimite mai multe mesaje aceluiași utilizator într-o singură cerere în masă, adăugați același identificator în lista de destinatari de mai multe ori.
| Câmp | Tip | Descriere |
|---|---|---|
username | string | Numărul de telefon al destinatarului (de exemplu "905554443322"). Dacă utilizatorul nu există în sistem, este creat automat. |
userId | string | ID-ul unui utilizator existent în sistem. |
sessionId | string | ID-ul unei sesiuni de conversație existente în sistem. |
referenceId | string | ID de referință opțional (maximum 256 de caractere) pentru asocierea cu înregistrările din sisteme externe (CRM, comandă, tichet etc.). Dacă este furnizat, trebuie să fie unic în cadrul mesajului în masă. |
payload | object | Payload-ul șablonului specific destinatarului (opțional). Dacă isMerge: true, este îmbinat cu defaultPayload. |
isMerge | boolean | Suprascrie comportamentul de îmbinare pentru acest destinatar (opțional). Dacă este omis, se folosește defaultPayload.isMerge. |
Structura acțiunii
| Câmp | Tip | Descriere |
|---|---|---|
action.key | string | "assign-to-user" atribuie conversația unui anumit agent; "assign-to-workgroup" o atribuie unui grup de lucru. |
action.value | string | ID-ul utilizatorului sau al grupului de lucru țintă. |
Structura payload-ului șablonului
defaultPayload și payload-ul specific destinatarului au aceeași structură. Pentru mesajele șablon trebuie indicat type: "template".
{
"type": "template",
"template": {
"templateName": "order_confirmation",
"languageCode": "tr-TR",
"variables": []
},
"isMerge": true
}
| Câmp | Tip | Obligatoriu | Descriere |
|---|---|---|---|
type | string | Da | Tipul payload-ului. Pentru mesaje șablon: "template" |
template.templateName | string | Da* | Numele șablonului înregistrat în Meta. Opțional în payload-urile destinatarilor când se folosește isMerge: true (se moștenește din cel implicit). |
template.languageCode | string | Nu | Codul de limbă al șablonului (de exemplu "tr", "en", "tr-TR", "en-US"). Trebuie să corespundă exact limbii înregistrate în Meta. |
template.variables | array | Nu | Lista variabilelor aplicate componentelor șablonului. Detalii mai jos. |
isMerge | boolean | Nu | true: payload-ul destinatarului este îmbinat în profunzime cu defaultPayload. false sau omis: payload-ul destinatarului înlocuiește complet defaultPayload. |
- Dacă
defaultPayload.isMerge: trueși destinatarul furnizează propriulpayload, se aplică o îmbinare în profunzime. - Cu îmbinarea în profunzime, destinatarul poate furniza doar
variables;templateNameșilanguageCodesunt moștenite din payload-ul implicit. - Câmpul
isMergeal destinatarului îl suprascrie pedefaultPayload.isMerge. - Dacă un destinatar nu furnizează un
payload, se folosește întotdeaunadefaultPayload.
Structura variabilelor
Fiecare element din array-ul variables corespunde unei componente a șablonului. Un tip de componentă (type) poate apărea o singură dată în array.
| type | Descriere | parameters | cards |
|---|---|---|---|
"HEADER" | Componenta de antet a șablonului. Variabilă de text sau URL media (imagine, videoclip, document) | Da | — |
"BODY" | Variabilele de text din corpul șablonului | Da | — |
"BUTTONS" | Variabile pentru sufixul URL dinamic al butoanelor | Da | — |
"CAROUSEL" | Componentele cardurilor pentru șabloanele de tip carusel | — | Da |
Formate pentru parametri
Câmpul parameters poate fi furnizat în trei formate diferite:
// Formatul 1: array (pe bază de index) — pentru substituenți precum {{1}}, {{2}}, {{3}}
"parameters": ["value1", "value2", "value3"]
// Formatul 2: obiect (chei numerice) — reprezentare alternativă pentru {{1}}, {{2}}
"parameters": { "1": "value1", "2": "value2" }
// Formatul 3: obiect (chei denumite) — pentru substituenți precum {{name}}, {{amount}}
"parameters": { "name": "John", "amount": "150 USD" }
- Dacă șablonul dvs. Meta folosește substituenți precum
{{1}},{{2}}, folosiți fie formatul array, fie formatul obiect cu chei numerice. - Dacă șablonul dvs. folosește substituenți cu nume, precum
{{firstName}}sau{{orderTotal}}, folosiți formatul obiect cu chei denumite. - Când folosiți array-uri, ordinea contează: primul element corespunde lui
{{1}}, al doilea lui{{2}}și așa mai departe.
Componenta HEADER
Folosiți componenta HEADER când antetul șablonului conține media (imagine, videoclip, document) sau text dinamic.
// Antet media (URL de imagine)
{
"type": "HEADER",
"parameters": ["https://example.com/product-image.jpg"]
}
// Variabilă de text în antet
{
"type": "HEADER",
"parameters": ["Special Campaign"]
}
Componenta BODY
Se folosește pentru variabilele de text dinamic din corpul șablonului.
// Format array — când șablonul folosește {{1}}, {{2}}, {{3}}
{
"type": "BODY",
"parameters": ["John", "ORD-12345", "150.00 USD"]
}
// Format cu nume — când șablonul folosește {{name}}, {{orderAmount}}
{
"type": "BODY",
"parameters": {
"name": "John",
"orderAmount": "150.00 USD"
}
}
Componenta BUTTONS
Se folosește pentru butoanele cu sufixe URL dinamice. Dacă șablonul conține mai multe butoane URL, doar butoanele cu variabile sunt indexate secvențial (butoanele fără variabile sau butoanele FLOW sunt ignorate).
// Variabilă pentru sufixul unui singur buton URL
{
"type": "BUTTONS",
"parameters": ["tracking/ORD-12345"]
}
// Variabile pentru sufixele mai multor butoane URL (primul buton URL, al doilea buton URL)
{
"type": "BUTTONS",
"parameters": ["tracking/ORD-12345", "cancel/ORD-12345"]
}
Componenta CAROUSEL
Pentru șabloanele de tip carusel, variabilele componentelor se definesc separat pentru fiecare card.
{
"type": "CAROUSEL",
"cards": [
{
"components": [
{
"type": "HEADER",
"parameters": ["https://example.com/card1.jpg"]
},
{
"type": "BODY",
"parameters": ["Product A", "99.00 USD"]
}
]
},
{
"components": [
{
"type": "HEADER",
"parameters": ["https://example.com/card2.jpg"]
},
{
"type": "BODY",
"parameters": ["Product B", "149.00 USD"]
}
]
}
]
}
Lungimea array-ului cards trebuie să corespundă exact numărului de carduri definite în șablon.
Exemple
1. Șablon simplu — fără variabile, același conținut pentru toți destinatarii
Aceasta este cea mai simplă modalitate de a trimite un șablon static, fără variabile, către mai mulți destinatari.
{
"channelUsername": "908506669933",
"connectorBrand": "whatsapp",
"title": "General Announcement",
"defaultPayload": {
"type": "template",
"template": {
"templateName": "hello_world",
"languageCode": "tr-TR"
}
},
"recipients": [{ "username": "905554443301" }, { "username": "905554443302" }, { "username": "905554443303" }]
}
curl --location 'https://app.monochat.ai/api/:slug/custom-functions/bulk-message-api-app/api/bulk-message/send.js' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_JWT_TOKEN' \
--data '{
"channelUsername": "908506669933",
"connectorBrand": "whatsapp",
"title": "General Announcement",
"defaultPayload": {
"type": "template",
"template": {
"templateName": "hello_world",
"languageCode": "tr-TR"
}
},
"recipients": [
{ "username": "905554443301" },
{ "username": "905554443302" },
{ "username": "905554443303" }
]
}'
- Destinatarii indicați prin
usernamesunt creați automat dacă nu există încă în sistem - Toți destinatarii folosesc același
defaultPayload; nu sunt necesare date specifice destinatarului - Când
isMergenu este specificat, fiecare destinatar folosește directdefaultPayload
2. Șablon cu variabile de corp comune
Același șablon este trimis tuturor destinatarilor, cu aceleași valori ale variabilelor. Șablonul conține substituenți precum {{1}} și {{2}}.
{
"channelUsername": "908506669933",
"connectorBrand": "whatsapp",
"title": "Summer Campaign",
"defaultPayload": {
"type": "template",
"template": {
"templateName": "promo_notification",
"languageCode": "tr-TR",
"variables": [
{
"type": "BODY",
"parameters": ["30%", "July 31, 2026"]
}
]
}
},
"recipients": [{ "username": "905554443301" }, { "username": "905554443302" }]
}
- În acest exemplu, corpul șablonului ar putea conține un text de genul: „Beneficiați de o reducere de
{{1}}în campania noastră! Ofertă valabilă până la{{2}}.” parameters[0]înlocuiește{{1}}, iarparameters[1]înlocuiește{{2}}
3. Șablon personalizat — variabile pentru fiecare destinatar, cu isMerge
Pentru fiecare destinatar se folosesc valori diferite ale variabilelor. Dacă setați isMerge: true în defaultPayload, destinatarii trebuie să furnizeze doar variables; templateName și languageCode sunt moștenite din payload-ul implicit.
În acest exemplu, șablonul include atât un antet media, cât și variabile de corp personalizate.
{
"channelUsername": "908506669933",
"connectorBrand": "whatsapp",
"title": "Personal Order Notification",
"defaultPayload": {
"type": "template",
"template": {
"templateName": "order_confirmation",
"languageCode": "tr-TR"
},
"isMerge": true
},
"recipients": [
{
"username": "905554443301",
"payload": {
"template": {
"variables": [
{
"type": "HEADER",
"parameters": ["https://s3.example.com/product-a.jpg"]
},
{
"type": "BODY",
"parameters": ["Ahmet", "ORD-001", "150.00 TRY"]
}
]
}
}
},
{
"username": "905554443302",
"payload": {
"template": {
"variables": [
{
"type": "HEADER",
"parameters": ["https://s3.example.com/product-b.jpg"]
},
{
"type": "BODY",
"parameters": ["Fatma", "ORD-002", "289.00 TRY"]
}
]
}
}
}
]
}
- Datorită
isMerge: true,templateNamenu trebuie repetat în payload-ul fiecărui destinatar - Array-ul
variablesal fiecărui destinatar este complet independent - URL-ul media din antet trebuie să fie accesibil public
- Dacă
typeeste omis în payload-ul destinatarului, se moșteneștedefaultPayload.type
4. Variabilă pentru butonul URL
Folosiți componenta BUTTONS când șablonul conține un buton cu sufix URL dinamic. De exemplu, un număr de urmărire adăugat la URL-ul de bază https://example.com/track/.
{
"channelUsername": "908506669933",
"connectorBrand": "whatsapp",
"title": "Shipment Tracking Notification",
"defaultPayload": {
"type": "template",
"template": {
"templateName": "shipment_tracking",
"languageCode": "tr-TR"
},
"isMerge": true
},
"recipients": [
{
"username": "905554443301",
"payload": {
"template": {
"variables": [
{
"type": "BODY",
"parameters": ["Ahmet", "TK-98765"]
},
{
"type": "BUTTONS",
"parameters": ["TK-98765"]
}
]
}
}
},
{
"username": "905554443302",
"payload": {
"template": {
"variables": [
{
"type": "BODY",
"parameters": ["Recep", "TK-12345"]
},
{
"type": "BUTTONS",
"parameters": ["TK-12345"]
}
]
}
}
}
]
}
- Parametrii
BUTTONSsunt asociați în ordinea butoanelor care conțin variabile - Butoanele FLOW și butoanele fără variabile sunt ignorate; indexarea se aplică doar butoanelor URL dinamice
- Dacă URL-ul butonului din șablon este
https://example.com/track/{{1}}, atunciparameters[0]înlocuiește{{1}}
5. Livrare programată
Programați trimiterea unui mesaj la o dată și o oră viitoare. scheduleAt trebuie furnizat ca timestamp UTC în format ISO 8601.
{
"channelUsername": "908506669933",
"connectorBrand": "whatsapp",
"title": "Morning Campaign Message",
"scheduleAt": "2026-06-10T07:00:00.000Z",
"defaultPayload": {
"type": "template",
"template": {
"templateName": "morning_campaign",
"languageCode": "en-US"
},
"isMerge": true
},
"action": {
"key": "assign-to-workgroup",
"value": "WORKGROUP_ID"
},
"recipients": [
{
"username": "905554443301",
"payload": {
"template": {
"variables": [
{
"type": "BODY",
"parameters": { "name": "Ahmet", "discountRate": "25" }
}
]
}
}
},
{
"username": "905554443302",
"payload": {
"template": {
"variables": [
{
"type": "BODY",
"parameters": { "name": "Zeynep", "discountRate": "40" }
}
]
}
}
}
]
}
scheduleAttrebuie furnizat în fusul orar UTC (de exemplu, pentru ora 10:00 AM a Turciei, folosiți07:00:00.000Z)- Acest exemplu folosește formatul cu parametri denumiți; șablonul trebuie să conțină substituenți precum
{{name}}și{{discountRate}} - Cu
action, conversațiile create prin livrarea mesajului sunt atribuite automat grupului de lucru indicat
Răspuns
O cerere reușită returnează un bulkMessageId, care poate fi folosit pentru a urmări procesul de livrare:
{
"bulkMessageId": "abc123xyz789"
}
Răspunsuri de eroare
| Stare | Descriere |
|---|---|
Channel not found | Nu a fost găsit niciun canal verificat care să corespundă channelUsername și connectorBrand |
Channel is not verified | Canalul găsit există, dar nu a fost încă verificat |
invalidRequest | Au fost furnizați mai mulți identificatori pentru un destinatar sau lipsește un payload obligatoriu |
channelNotFound | Nu a fost găsit niciun canal activ care să corespundă channelId furnizat |
schema-error | Un câmp din corpul cererii nu a trecut validarea schemei (câmp obligatoriu lipsă, tip incorect sau valoare neacceptată) |
bulkMessageId-ul returnat poate fi folosit cu endpoint-urile de mai jos pentru a interoga statisticile de livrare și pentru a opri procesul de livrare.
Stats — statistici de livrare
Returnează starea curentă a livrării unui mesaj în masă. Oferă numărul de înregistrări în așteptare, reușite, eșuate și anulate.
POST https://app.monochat.ai/api/:slug/custom-functions/bulk-message-api-app/api/bulk-message/stats.js
Parametrii cererii
| Parametru | Tip | Obligatoriu | Descriere |
|---|---|---|---|
bulkMessageId | string | Da | ID-ul mesajului în masă de urmărit (returnat de createBulkPerRecipient) |
{
"bulkMessageId": "abc123xyz789"
}
curl --location 'https://app.monochat.ai/api/:slug/custom-functions/bulk-message-api-app/api/bulk-message/stats.js' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_JWT_TOKEN' \
--data '{
"bulkMessageId": "abc123xyz789"
}'
Răspuns
{
"bulkMessage": {
"_id": "abc123xyz789",
"slug": "my-workspace",
"title": "Campaign Title",
"channelUsername": "908506669933",
"connectorBrand": "whatsapp",
"connectorSlug": "whatsapp-cloud",
"payload": {
"recipientCount": 100,
"defaultPayloadType": "template",
"jobId": "job_abc123"
},
"schedule": {
"date": "2026-06-10T07:00:00.000Z",
"type": "later"
},
"createdAt": "2026-06-08T10:00:00.000Z",
"updatedAt": "2026-06-08T10:30:00.000Z"
},
"stats": {
"pending": 45,
"success": 42,
"failed": 3,
"cancelled": 10,
"total": 100
}
}
Câmpurile Stats
| Câmp | Tip | Descriere |
|---|---|---|
stats.pending | number | Numărul de înregistrări aflate încă în coadă |
stats.success | number | Numărul de înregistrări procesate cu succes pentru livrare |
stats.failed | number | Numărul de înregistrări care au întâmpinat o eroare de livrare |
stats.cancelled | number | Numărul de înregistrări anulate |
stats.total | number | Numărul total de înregistrări (pending + success + failed + cancelled) |
stats.success indică faptul că mesajul a fost predat cu succes de sistem. Nu garantează că Meta a livrat mesajul destinatarului. Actualizările de stare ulterioare generate de Meta (precum delivered, read sau failed) nu afectează acest contor și nu sunt reflectate aici.
- endpoint-ul stats: arată starea job-ului de livrare (pending, success, failed, cancelled)
- endpoint-ul message-stats: arată starea reală a mesajului (
pending,sending,sent,delivered,read,erroretc.) - Un job poate fi reușit, dar mesajul poate să nu fie încă livrat sau citit
ID de referință
referenceId este un câmp opțional pe care îl puteți folosi pentru a asocia înregistrările de livrare cu un ID din propriul sistem, în scopuri de urmărire (de exemplu, numărul comenzii sau ID-ul tichetului).
Dacă este furnizat, trebuie să fie unic în cadrul mesajului în masă (maximum 256 de caractere).
- Nu este obligatoriu
- Nu poate fi duplicat în cadrul aceluiași mesaj în masă
- Poate fi refolosit în mesaje în masă diferite
Message Stats — starea mesajelor WhatsApp
Returnează statisticile de stare a mesajelor pentru un mesaj în masă. Spre deosebire de endpoint-ul stats, acesta arată message.status real pentru fiecare înregistrare, în loc de starea job-ului.
Stări posibile ale mesajului: pending, sending, sent, delivered, read, deleted, warning, error, unknown, not-sended
POST https://app.monochat.ai/api/:slug/custom-functions/bulk-message-api-app/api/bulk-message/message-stats.js
Parametrii cererii
| Parametru | Tip | Obligatoriu | Descriere |
|---|---|---|---|
bulkMessageId | string | Da | ID-ul mesajului în masă de interogat |
{
"bulkMessageId": "abc123xyz789"
}
curl --location 'https://app.monochat.ai/api/:slug/custom-functions/bulk-message-api-app/api/bulk-message/message-stats.js' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_JWT_TOKEN' \
--data '{
"bulkMessageId": "abc123xyz789"
}'
Răspuns
{
"bulkMessage": {
"_id": "abc123xyz789",
"slug": "my-workspace",
"type": "perRecipient",
"title": "Campaign Title"
},
"messageStats": {
"pending": 5,
"sending": 2,
"sent": 10,
"delivered": 45,
"read": 30,
"deleted": 2,
"warning": 1,
"error": 3,
"unknown": 0,
"not-sended": 2,
"no-message": 10,
"total": 120
}
}
Câmpurile Message Stats
| Câmp | Tip | Descriere |
|---|---|---|
pending | number | Mesaje netrimise încă |
sending | number | Mesaje în curs de trimitere |
sent | number | Mesaje predate către WhatsApp, încă nelivrate |
delivered | number | Mesaje livrate pe telefonul destinatarului |
read | number | Mesaje citite de destinatar |
deleted | number | Mesaje șterse |
warning | number | Mesaje cu avertismente |
error | number | Mesaje cu erori |
unknown | number | Mesaje cu stare necunoscută |
not-sended | number | Mesaje care nu au putut fi trimise |
no-message | number | Înregistrări fără mesaj încă (în coadă) |
total | number | Numărul total de înregistrări |
- Un număr mare de
no-messageindică faptul că livrarea este încă în curs - Numărul
deliveredarată câte mesaje au fost livrate cu succes - Numărul
readpoate fi folosit pentru a măsura implicarea în campanie - Puteți interoga periodic acest endpoint pentru urmărire în timp real
Structura options — paginare, filtrare și sortare
Parametrul options folosit în endpoint-urile list și list-with-messages oferă o structură standard pentru paginare, filtrare și sortare.
Câmpurile options
| Câmp | Tip | Obligatoriu | Descriere |
|---|---|---|---|
pagination | object | Nu | Setări de paginare |
filtering | object | Nu | Criterii de filtrare |
sorting | object | Nu | Setări de sortare (de exemplu {"createdAt": -1}) |
Structura paginării
| Câmp | Tip | Implicit | Descriere |
|---|---|---|---|
currentPage | number | 1 | Numărul paginii de preluat |
pageItems | number | 50 | Numărul de înregistrări pe pagină (maximum: 50) |
Structura filtrării
Filtrarea se face în formatul de interogare MongoDB. Puteți filtra după câmpurile înregistrării. În endpoint-ul list-with-messages puteți filtra și după câmpurile mesajului (de exemplu, message.status).
// Filtrare după starea înregistrării
{
"options": {
"filtering": {
"status": "success"
}
}
}
// Filtrare după referenceId
{
"options": {
"filtering": {
"referenceId": "ORDER-12345"
}
}
}
// Filtrare după starea mesajului (doar list-with-messages)
{
"options": {
"filtering": {
"message.status": "delivered"
}
}
}
// Filtrare după mai multe stări cu $in (operator MongoDB)
{
"options": {
"filtering": {
"message.status": {
"$in": ["delivered", "read"]
}
}
}
}
// Excluderea unor stări cu $nin (operator MongoDB)
{
"options": {
"filtering": {
"message.status": {
"$nin": ["error", "not-sended"]
}
}
}
}
Structura sortării
Sortarea se face în formatul de sortare MongoDB. 1 înseamnă crescător, -1 înseamnă descrescător.
// Sortare după data creării, descrescător (cele mai noi primele)
{
"options": {
"sorting": {
"createdAt": -1
}
}
}
// Sortare după mai multe câmpuri
{
"options": {
"sorting": {
"status": 1,
"createdAt": -1
}
}
}
Exemplu de utilizare combinată
{
"bulkMessageId": "abc123xyz789",
"options": {
"pagination": {
"currentPage": 2,
"pageItems": 50
},
"filtering": {
"message.status": "delivered"
},
"sorting": {
"createdAt": -1
}
}
}
Acest exemplu sortează mesajele livrate de la cele mai noi la cele mai vechi.
- Combinați
filteringșipaginationpentru interogări țintite - Răspunsul include
options.pagination.totalCountșioptions.pagination.totalPagespentru navigare - Filtrul
message.statusfuncționează doar în endpoint-ullist-with-messages
Records — detalii și listarea înregistrărilor
Listează toate înregistrările de livrare ale unui mesaj în masă. Fiecare înregistrare reprezintă un singur mesaj trimis unui destinatar.
List — lista înregistrărilor
POST https://app.monochat.ai/api/:slug/custom-functions/bulk-message-api-app/api/bulk-message-records/list.js
Parametrii cererii
| Parametru | Tip | Obligatoriu | Descriere |
|---|---|---|---|
bulkMessageId | string | Da | ID-ul mesajului în masă de listat |
options | object | Nu | Opțiuni de paginare, filtrare și sortare. Consultați Structura options pentru detalii. |
Cerere — utilizare de bază
{
"bulkMessageId": "abc123xyz789",
"options": {
"pagination": {
"currentPage": 1,
"pageItems": 50
}
}
}
Cerere — filtrare după o anumită stare
{
"bulkMessageId": "abc123xyz789",
"options": {
"pagination": {
"currentPage": 1,
"pageItems": 50
},
"filtering": {
"status": "success"
}
}
}
Listează doar înregistrările de livrare reușite (record.status = "success").
Răspuns
{
"bulkMessageRecords": [
{
"_id": "record_1",
"bulkMessageId": "abc123xyz789",
"slug": "my-workspace",
"userId": "user_123",
"sessionId": "session_456",
"messageId": "msg_789",
"referenceId": "ORDER-12345",
"status": "success",
"createdAt": "2026-06-10T10:00:00.000Z"
}
],
"options": {
"pagination": {
"currentPage": 1,
"pageItems": 50,
"totalCount": 150,
"totalPages": 3
},
"sorting": {},
"filtering": {}
}
}
List With Messages — listare cu detaliile mesajelor
Are aceleași funcționalități ca endpoint-ul list (paginare, filtrare, sortare). Singura diferență: dacă o înregistrare are un messageId, este returnat și obiectul message asociat. Astfel puteți vedea starea mesajului (delivered, read, error etc.) și payload-ul într-o singură interogare.
POST https://app.monochat.ai/api/:slug/custom-functions/bulk-message-api-app/api/bulk-message-records/list-with-messages.js
Cerere — utilizare de bază
{
"bulkMessageId": "abc123xyz789",
"options": {
"pagination": {
"currentPage": 1,
"pageItems": 50
}
}
}
Cerere — filtrare după starea mesajului
{
"bulkMessageId": "abc123xyz789",
"options": {
"pagination": {
"currentPage": 1,
"pageItems": 50
},
"filtering": {
"message.status": "delivered"
}
}
}
Acest exemplu preia doar mesajele cu starea „delivered”.
Cerere — listarea mesajelor eșuate
{
"bulkMessageId": "abc123xyz789",
"options": {
"pagination": {
"currentPage": 1,
"pageItems": 50
},
"filtering": {
"message.status": "error"
}
}
}
Se folosește pentru a verifica mesajele care au întâmpinat erori de livrare.
Răspuns
{
"bulkMessageRecords": [
{
"_id": "record_1",
"bulkMessageId": "abc123xyz789",
"userId": "user_123",
"messageId": "msg_789",
"referenceId": "ORDER-12345",
"status": "success",
"message": {
"_id": "msg_789",
"status": "delivered",
"payload": {
"type": "template",
"template": {
"templateName": "order_notification"
}
},
"createdAt": "2026-06-10T10:01:00.000Z",
"deliveredAt": "2026-06-10T10:01:05.000Z"
}
}
],
"options": {
"pagination": {
"currentPage": 1,
"pageItems": 50,
"totalCount": 150,
"totalPages": 3
},
"sorting": {},
"filtering": {}
}
}
Câmpurile înregistrării
| Câmp | Tip | Descriere |
|---|---|---|
_id | string | ID-ul înregistrării |
bulkMessageId | string | ID-ul mesajului în masă căruia îi aparține această înregistrare |
userId | string | ID-ul utilizatorului destinatar |
sessionId | string | ID-ul sesiunii de conversație |
messageId | string | ID-ul mesajului trimis (null dacă nu a fost trimis încă) |
referenceId | string | ID de referință opțional (dacă este furnizat) |
status | string | Starea înregistrării: pending, success, failed, cancelled |
message | object | Detaliile mesajului (doar în list-with-messages) |
Comparație între List și List-With-Messages
| Funcționalitate | list | list-with-messages |
|---|---|---|
| Paginare | Da | Da |
| Filtrare | Da (doar câmpurile înregistrării) | Da (câmpuri de înregistrare și de mesaj) |
| Obiect mesaj | Nu | Da (dacă există messageId) |
| Performanță | Rapid | Mediu (execută JOIN) |
| Filtru message.status | Indisponibil | Disponibil |
- list: listați rapid toate înregistrările, filtrați după referenceId, verificați stările înregistrărilor
- list-with-messages: vedeți stările mesajelor WhatsApp (delivered, read), inspectați payload-urile mesajelor
- Exemple de filtrare:
{"status": "failed"}— înregistrări cu livrare eșuată{"referenceId": "ORDER-123"}— un anumit ID de referință{"message.status": "delivered"}— mesaje livrate (doar list-with-messages){"message.status": "read"}— mesaje citite (doar list-with-messages){"message.status": "error"}— mesaje cu erori (doar list-with-messages){"message.status": {"$in": ["delivered", "read"]}}— mesaje livrate sau citite (doar list-with-messages){"message.status": {"$nin": ["error", "not-sended"]}}— mesaje, fără cele cu erori și cele netrimise (doar list-with-messages){"status": {"$in": ["success", "pending"]}}— înregistrări reușite sau în așteptare
- Endpoint-ul
listeste mai rapid; preferați-l pentru verificările generale de stare - Folosiți
list-with-messagescând aveți nevoie de detaliile mesajelor - Numărul maxim de înregistrări pe pagină (pageItems) este 50; implicit este 50 dacă nu este specificat
- Filtrul
message.statusfuncționează doar înlist-with-messages - Înregistrările cu messageId nul vor avea obiecte
messagenule
Stop — anularea livrării
Oprește o livrare în masă aflată în desfășurare. Job-ul din coadă este anulat, iar toate înregistrările pending trec în starea cancelled. Înregistrările deja procesate ca success sau failed nu sunt afectate.
POST https://app.monochat.ai/api/:slug/custom-functions/bulk-message-api-app/api/bulk-message/stop.js
Această acțiune nu poate fi anulată. O livrare oprită nu poate fi reluată.
Parametrii cererii
| Parametru | Tip | Obligatoriu | Descriere |
|---|---|---|---|
bulkMessageId | string | Da | ID-ul mesajului în masă de oprit |
{
"bulkMessageId": "abc123xyz789"
}
curl --location 'https://app.monochat.ai/api/:slug/custom-functions/bulk-message-api-app/api/bulk-message/stop.js' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_JWT_TOKEN' \
--data '{
"bulkMessageId": "abc123xyz789"
}'
Răspuns
Pentru o cerere reușită, corpul răspunsului este gol. Un status HTTP 200 indică faptul că operațiunea s-a încheiat cu succes.
{}
- Pot fi oprite doar mesajele în masă create prin acest API
- După oprirea unei livrări, puteți folosi endpoint-ul
statspentru a verifica numărul de înregistrări anulate - Dacă mesajul în masă nu este găsit, API-ul returnează eroarea:
bulkMessageNotFound