Documentação da Bulk Template Message API
Esta API permite enviar mensagens de template a vários destinatários simultaneamente pelo canal de WhatsApp.
O envio das mensagens é processado de forma assíncrona; a requisição da API retorna imediatamente um bulkMessageId, enquanto as mensagens são colocadas em fila e processadas em segundo plano.
POST https://app.monochat.ai/api/:slug/custom-functions/bulk-message-api-app/api/bulk-message/send.js
Principais recursos
- Envie mensagens de template em massa para 1 a 5.000 destinatários em uma única requisição
- Variáveis personalizadas para cada destinatário (HEADER, BODY, BUTTONS, CAROUSEL)
defaultPayloadcompartilhado por todos os destinatários, com mesclagem dopayloadespecífico de cada destinatário (isMerge)- Envio agendado (
scheduleAt) - Indique os destinatários por
username(número de telefone),userIdousessionId - Envie várias mensagens ao mesmo usuário em uma única requisição em massa
referenceIdopcional para acompanhar registros em sistemas externos- Atribua automaticamente as conversas a um usuário ou grupo de trabalho após o envio (
action)
Esta API só pode enviar templates que tenham sido aprovados pela Meta.
O nome do template e o código de idioma devem corresponder exatamente ao template cadastrado no Meta Business Manager.
Parâmetros da requisição
Parâmetros de nível superior
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
channelUsername | string | Sim | Número do canal de WhatsApp usado para enviar a mensagem (por exemplo "908506669933") |
connectorBrand | string | Sim | Marca do conector do canal. Valor atualmente aceito: "whatsapp" |
title | string | Não | Título da campanha. Usado para exibição no painel. Padrão: "-" |
scheduleAt | string (ISO 8601) | Não | Data e hora do envio agendado (por exemplo "2026-06-10T10:00:00.000Z"). Se omitido, as mensagens são enviadas imediatamente. |
defaultPayload | object | Condicional* | Payload de template padrão aplicado a todos os destinatários. Obrigatório se um destinatário não informar o próprio payload. |
recipients | array | Sim | Lista de destinatários. Mínimo de 1, máximo de 5.000 destinatários. |
action | object | Não | Ação aplicada à conversa após o envio. assign-to-user ou assign-to-workgroup. |
*Se todos os destinatários informarem o próprio payload, o defaultPayload é opcional.
Estrutura do destinatário
Para cada destinatário, deve ser informado exatamente um entre username, userId ou sessionId. Não é possível usar vários identificadores juntos, e omitir todos resultará em erro.
Para enviar várias mensagens ao mesmo usuário em uma única requisição em massa, adicione o mesmo identificador à lista de destinatários várias vezes.
| Campo | Tipo | Descrição |
|---|---|---|
username | string | Número de telefone do destinatário (por exemplo "905554443322"). Se o usuário não existir no sistema, ele é criado automaticamente. |
userId | string | ID de um usuário existente no sistema. |
sessionId | string | ID de uma sessão de conversa existente no sistema. |
referenceId | string | ID de referência opcional (máximo de 256 caracteres) para correspondência com registros de sistemas externos (CRM, pedido, ticket etc.). Deve ser único dentro do envio em massa, se informado. |
payload | object | Payload de template específico do destinatário (opcional). Se isMerge: true, ele é mesclado com o defaultPayload. |
isMerge | boolean | Substitui o comportamento de mesclagem para este destinatário (opcional). Se omitido, usa-se o defaultPayload.isMerge. |
Estrutura da ação
| Campo | Tipo | Descrição |
|---|---|---|
action.key | string | "assign-to-user" atribui a conversa a um atendente específico; "assign-to-workgroup" atribui a um grupo de trabalho. |
action.value | string | ID do usuário ou do grupo de trabalho de destino. |
Estrutura do payload do template
defaultPayload e o payload específico de cada destinatário têm a mesma estrutura. Para mensagens de template, é preciso informar type: "template".
{
"type": "template",
"template": {
"templateName": "order_confirmation",
"languageCode": "tr-TR",
"variables": []
},
"isMerge": true
}
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
type | string | Sim | Tipo do payload. Para mensagens de template: "template" |
template.templateName | string | Sim* | Nome do template cadastrado na Meta. Opcional nos payloads de destinatário quando se usa isMerge: true (herda do padrão). |
template.languageCode | string | Não | Código de idioma do template (por exemplo "tr", "en", "tr-TR", "en-US"). Deve corresponder exatamente ao idioma cadastrado na Meta. |
template.variables | array | Não | Lista de variáveis aplicadas aos componentes do template. Detalhada abaixo. |
isMerge | boolean | Não | true: o payload do destinatário é mesclado em profundidade com o defaultPayload. false ou omitido: o payload do destinatário substitui completamente o defaultPayload. |
- Se
defaultPayload.isMerge: truee o destinatário informar o própriopayload, é aplicada uma mesclagem em profundidade. - Com a mesclagem em profundidade, o destinatário pode informar apenas
variables;templateNameelanguageCodesão herdados do payload padrão. - O campo
isMergedo destinatário substitui odefaultPayload.isMerge. - Se um destinatário não informar um
payload, odefaultPayloadé sempre usado.
Estrutura das variáveis
Cada item do array variables corresponde a um componente do template. Um tipo de componente (type) pode aparecer apenas uma vez no array.
| type | Descrição | parameters | cards |
|---|---|---|---|
"HEADER" | Componente de cabeçalho do template. Variável de texto ou URL de mídia (imagem, vídeo, documento) | Sim | — |
"BODY" | Variáveis de texto do corpo do template | Sim | — |
"BUTTONS" | Variáveis de sufixo de URL dinâmico para botões | Sim | — |
"CAROUSEL" | Componentes de cartão para templates de carrossel | — | Sim |
Formatos dos parâmetros
O campo parameters pode ser informado em três formatos diferentes:
// Format 1: Array (index-based) — for placeholders like {{1}}, {{2}}, {{3}}
"parameters": ["value1", "value2", "value3"]
// Format 2: Object (numeric keys) — alternative representation for {{1}}, {{2}}
"parameters": { "1": "value1", "2": "value2" }
// Format 3: Object (named keys) — for placeholders like {{name}}, {{amount}}
"parameters": { "name": "John", "amount": "150 USD" }
- Se o seu template da Meta usa marcadores como
{{1}},{{2}}, use o formato de array ou o de objeto com chaves numéricas. - Se o seu template usa marcadores nomeados, como
{{firstName}}ou{{orderTotal}}, use o formato de objeto com chaves nomeadas. - Ao usar arrays, a ordem importa: o primeiro elemento corresponde a
{{1}}, o segundo a{{2}}, e assim por diante.
Componente HEADER
Use o componente HEADER quando o cabeçalho do template contiver mídia (imagem, vídeo, documento) ou texto dinâmico.
// Media header (image URL)
{
"type": "HEADER",
"parameters": ["https://example.com/product-image.jpg"]
}
// Text header variable
{
"type": "HEADER",
"parameters": ["Special Campaign"]
}
Componente BODY
Usado para variáveis de texto dinâmicas dentro do corpo do template.
// Array format — when the template uses {{1}}, {{2}}, {{3}}
{
"type": "BODY",
"parameters": ["John", "ORD-12345", "150.00 USD"]
}
// Named format — when the template uses {{name}}, {{orderAmount}}
{
"type": "BODY",
"parameters": {
"name": "John",
"orderAmount": "150.00 USD"
}
}
Componente BUTTONS
Usado para botões com sufixos de URL dinâmicos. Se o template contiver vários botões de URL, apenas os botões com variáveis são indexados em sequência (botões sem variáveis ou botões FLOW são ignorados).
// Single URL button suffix variable
{
"type": "BUTTONS",
"parameters": ["tracking/ORD-12345"]
}
// Multiple URL button suffix variables (first URL button, second URL button)
{
"type": "BUTTONS",
"parameters": ["tracking/ORD-12345", "cancel/ORD-12345"]
}
Componente CAROUSEL
Em templates de carrossel, as variáveis dos componentes são definidas separadamente para cada cartão.
{
"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"]
}
]
}
]
}
O tamanho do array cards deve corresponder exatamente ao número de cartões definidos no template.
Exemplos
1. Template simples — sem variáveis, mesmo conteúdo para todos os destinatários
Esta é a forma mais simples de enviar um template estático, sem variáveis, a vários destinatários.
{
"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" }
]
}'
- Os destinatários indicados por
usernamesão criados automaticamente se ainda não existirem no sistema - Todos os destinatários usam o mesmo
defaultPayload; nenhum dado específico por destinatário é necessário - Quando
isMergenão é especificado, cada destinatário usa diretamente odefaultPayload
2. Template com variáveis de corpo compartilhadas
O mesmo template é enviado a todos os destinatários com valores de variáveis idênticos. O template contém marcadores como {{1}} e {{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" }]
}
- Neste exemplo, o corpo do template pode conter um texto como: "Aproveite
{{1}}de desconto na nossa campanha! Oferta válida até{{2}}." parameters[0]substitui{{1}}, enquantoparameters[1]substitui{{2}}
3. Template personalizado — variáveis por destinatário com isMerge
Valores de variáveis diferentes são usados para cada destinatário. Ao definir isMerge: true no defaultPayload, os destinatários só precisam informar variables; templateName e languageCode são herdados do payload padrão.
Neste exemplo, o template inclui um cabeçalho de mídia e variáveis de corpo personalizadas.
{
"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"]
}
]
}
}
}
]
}
- Graças a
isMerge: true,templateNamenão precisa ser repetido no payload de cada destinatário - O array
variablesde cada destinatário é totalmente independente - A URL da mídia do cabeçalho deve ser publicamente acessível
- Se
typefor omitido no payload do destinatário,defaultPayload.typeé herdado
4. Variável de botão de URL
Use o componente BUTTONS quando o template contiver um botão com sufixo de URL dinâmico. Por exemplo, um código de rastreamento acrescentado à URL base 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"]
}
]
}
}
}
]
}
- Os parâmetros de
BUTTONSsão associados conforme a ordem dos botões que contêm variáveis - Botões FLOW e botões sem variáveis são ignorados; a indexação se aplica apenas aos botões de URL dinâmica
- Se a URL do botão do template for
https://example.com/track/{{1}}, entãoparameters[0]substitui{{1}}
5. Envio agendado
Agende o envio de uma mensagem para uma data e hora futuras. scheduleAt deve ser informado como um timestamp ISO 8601 em UTC.
{
"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" }
}
]
}
}
}
]
}
scheduleAtdeve ser informado no fuso horário UTC (por exemplo, para 10:00 no horário da Turquia, use07:00:00.000Z)- Este exemplo usa o formato de parâmetros nomeados; o template deve conter marcadores como
{{name}}e{{discountRate}} - Com
action, as conversas criadas pelo envio da mensagem são atribuídas automaticamente ao grupo de trabalho especificado
Resposta
Uma requisição bem-sucedida retorna um bulkMessageId, que pode ser usado para acompanhar o processo de envio:
{
"bulkMessageId": "abc123xyz789"
}
Respostas de erro
| Status | Descrição |
|---|---|
Channel not found | Nenhum canal verificado correspondente a channelUsername e connectorBrand foi encontrado |
Channel is not verified | O canal correspondente existe, mas ainda não foi verificado |
invalidRequest | Foram informados vários identificadores para um destinatário ou falta um payload obrigatório |
channelNotFound | Nenhum canal ativo correspondente ao channelId informado foi encontrado |
schema-error | Um campo do corpo da requisição falhou na validação do esquema (campo obrigatório ausente, tipo incorreto ou valor não aceito) |
O bulkMessageId retornado pode ser usado com os endpoints abaixo para consultar as estatísticas de envio e interromper o processo de envio.
Stats — estatísticas de envio
Obtém o status atual de envio de uma mensagem em massa. Retorna as contagens de registros pendentes, bem-sucedidos, com falha e cancelados.
POST https://app.monochat.ai/api/:slug/custom-functions/bulk-message-api-app/api/bulk-message/stats.js
Parâmetros da requisição
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
bulkMessageId | string | Sim | ID da mensagem em massa a acompanhar (retornado por 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"
}'
Resposta
{
"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
}
}
Campos de stats
| Campo | Tipo | Descrição |
|---|---|---|
stats.pending | number | Número de registros ainda aguardando na fila |
stats.success | number | Número de registros processados com sucesso para envio |
stats.failed | number | Número de registros que tiveram um erro de envio |
stats.cancelled | number | Número de registros cancelados |
stats.total | number | Número total de registros (pending + success + failed + cancelled) |
stats.success indica que a mensagem foi repassada com sucesso pelo sistema. Isso não garante que a Meta entregou a mensagem ao destinatário. As atualizações de status posteriores geradas pela Meta (como delivered, read ou failed) não afetam esse contador e não são refletidas aqui.
- Endpoint stats: mostra o status do trabalho de envio (pending, success, failed, cancelled)
- Endpoint message-stats: mostra o status real da mensagem (
pending,sending,sent,delivered,read,erroretc.) - Um trabalho pode ter sucesso, mas a mensagem ainda pode não ter sido entregue/lida
ID de referência
O referenceId é um campo opcional que você pode usar para associar os registros de envio a um ID do seu próprio sistema para fins de acompanhamento (por exemplo, número do pedido, ID do ticket).
Se informado, ele deve ser único dentro do envio em massa (máximo de 256 caracteres).
- Não é obrigatório
- Não pode ser duplicado dentro da mesma mensagem em massa
- Pode ser reutilizado em mensagens em massa diferentes
Message Stats — status das mensagens do WhatsApp
Obtém as estatísticas de status das mensagens de uma mensagem em massa. Diferentemente do endpoint stats, este mostra o message.status real de cada registro, em vez do status do trabalho.
Status possíveis das mensagens: 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
Parâmetros da requisição
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
bulkMessageId | string | Sim | ID da mensagem em massa a consultar |
{
"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"
}'
Resposta
{
"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
}
}
Campos de message stats
| Campo | Tipo | Descrição |
|---|---|---|
pending | number | Mensagens ainda não enviadas |
sending | number | Mensagens sendo enviadas no momento |
sent | number | Mensagens entregues ao WhatsApp, ainda não entregues ao destinatário |
delivered | number | Mensagens entregues ao telefone do destinatário |
read | number | Mensagens lidas pelo destinatário |
deleted | number | Mensagens excluídas |
warning | number | Mensagens com avisos |
error | number | Mensagens com erros |
unknown | number | Mensagens com status desconhecido |
not-sended | number | Mensagens que não puderam ser enviadas |
no-message | number | Registros ainda sem mensagem (ainda na fila) |
total | number | Total de registros |
- Uma contagem alta de
no-messageindica que o envio ainda está em andamento - A contagem de
deliveredmostra as mensagens entregues com sucesso - A contagem de
readpode ser usada para medir o engajamento da campanha - Você pode consultar este endpoint periodicamente para acompanhamento em tempo real
Estrutura de options — paginação, filtragem e ordenação
O parâmetro options usado nos endpoints list e list-with-messages oferece uma estrutura padrão para paginação, filtragem e ordenação.
Campos de options
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
pagination | object | Não | Configurações de paginação |
filtering | object | Não | Critérios de filtragem |
sorting | object | Não | Configurações de ordenação (por exemplo, {"createdAt": -1}) |
Estrutura de paginação
| Campo | Tipo | Padrão | Descrição |
|---|---|---|---|
currentPage | number | 1 | Número da página a obter |
pageItems | number | 50 | Número de registros por página (máximo: 50) |
Estrutura de filtragem
A filtragem usa o formato de consulta do MongoDB. Você pode filtrar pelos campos do registro. No endpoint list-with-messages, também é possível filtrar pelos campos da mensagem (por exemplo, message.status).
// Filter by record status
{
"options": {
"filtering": {
"status": "success"
}
}
}
// Filter by referenceId
{
"options": {
"filtering": {
"referenceId": "ORDER-12345"
}
}
}
// Filter by message status (only list-with-messages)
{
"options": {
"filtering": {
"message.status": "delivered"
}
}
}
// Filter by multiple statuses using $in (MongoDB operator)
{
"options": {
"filtering": {
"message.status": {
"$in": ["delivered", "read"]
}
}
}
}
// Exclude specific statuses using $nin (MongoDB operator)
{
"options": {
"filtering": {
"message.status": {
"$nin": ["error", "not-sended"]
}
}
}
}
Estrutura de ordenação
A ordenação usa o formato de ordenação do MongoDB. 1 significa crescente e -1 significa decrescente.
// Sort by creation date descending (newest first)
{
"options": {
"sorting": {
"createdAt": -1
}
}
}
// Sort by multiple fields
{
"options": {
"sorting": {
"status": 1,
"createdAt": -1
}
}
}
Exemplo de uso combinado
{
"bulkMessageId": "abc123xyz789",
"options": {
"pagination": {
"currentPage": 2,
"pageItems": 50
},
"filtering": {
"message.status": "delivered"
},
"sorting": {
"createdAt": -1
}
}
}
Este exemplo ordena as mensagens entregues da mais recente para a mais antiga.
- Combine
filteringepaginationpara consultas direcionadas - A resposta inclui
options.pagination.totalCounteoptions.pagination.totalPagespara navegação - O filtro
message.statussó funciona no endpointlist-with-messages
Records — detalhes e listagem de registros
Lista todos os registros de envio de uma mensagem em massa. Cada registro representa uma única mensagem enviada a um destinatário.
List — lista de registros
POST https://app.monochat.ai/api/:slug/custom-functions/bulk-message-api-app/api/bulk-message-records/list.js
Parâmetros da requisição
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
bulkMessageId | string | Sim | ID da mensagem em massa a listar |
options | object | Não | Opções de paginação, filtragem e ordenação. Veja Estrutura de options para mais detalhes. |
Requisição — uso básico
{
"bulkMessageId": "abc123xyz789",
"options": {
"pagination": {
"currentPage": 1,
"pageItems": 50
}
}
}
Requisição — filtrar por um status específico
{
"bulkMessageId": "abc123xyz789",
"options": {
"pagination": {
"currentPage": 1,
"pageItems": 50
},
"filtering": {
"status": "success"
}
}
}
Lista apenas os registros de envio bem-sucedidos (record.status = "success").
Resposta
{
"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 — lista com detalhes das mensagens
Tem os mesmos recursos do endpoint list (paginação, filtragem, ordenação). A única diferença: se um registro tiver um messageId, o objeto message relacionado também é retornado. Isso permite ver o status da mensagem (delivered, read, error etc.) e o payload em uma única consulta.
POST https://app.monochat.ai/api/:slug/custom-functions/bulk-message-api-app/api/bulk-message-records/list-with-messages.js
Requisição — uso básico
{
"bulkMessageId": "abc123xyz789",
"options": {
"pagination": {
"currentPage": 1,
"pageItems": 50
}
}
}
Requisição — filtrar por status da mensagem
{
"bulkMessageId": "abc123xyz789",
"options": {
"pagination": {
"currentPage": 1,
"pageItems": 50
},
"filtering": {
"message.status": "delivered"
}
}
}
Este exemplo obtém apenas as mensagens com status "delivered".
Requisição — listar mensagens com falha
{
"bulkMessageId": "abc123xyz789",
"options": {
"pagination": {
"currentPage": 1,
"pageItems": 50
},
"filtering": {
"message.status": "error"
}
}
}
Usado para revisar as mensagens que tiveram erros de envio.
Resposta
{
"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": {}
}
}
Campos do registro
| Campo | Tipo | Descrição |
|---|---|---|
_id | string | ID do registro |
bulkMessageId | string | ID da mensagem em massa à qual este registro pertence |
userId | string | ID do usuário destinatário |
sessionId | string | ID da sessão de conversa |
messageId | string | ID da mensagem enviada (null se ainda não foi enviada) |
referenceId | string | ID de referência opcional (se informado) |
status | string | Status do registro: pending, success, failed, cancelled |
message | object | Detalhes da mensagem (somente em list-with-messages) |
Comparação entre List e List-With-Messages
| Recurso | list | list-with-messages |
|---|---|---|
| Paginação | Sim | Sim |
| Filtragem | Sim (somente campos do registro) | Sim (campos do registro e da mensagem) |
| Objeto message | Não | Sim (se messageId existir) |
| Desempenho | Rápido | Médio (executa JOIN) |
| Filtro message.status | Indisponível | Disponível |
- list: liste rapidamente todos os registros, filtre por referenceId, verifique os status dos registros
- list-with-messages: veja os status das mensagens do WhatsApp (delivered, read), inspecione os payloads das mensagens
- Exemplos de filtragem:
{"status": "failed"}— registros de envio com falha{"referenceId": "ORDER-123"}— um ID de referência específico{"message.status": "delivered"}— mensagens entregues (somente list-with-messages){"message.status": "read"}— mensagens lidas (somente list-with-messages){"message.status": "error"}— mensagens com erros (somente list-with-messages){"message.status": {"$in": ["delivered", "read"]}}— mensagens entregues ou lidas (somente list-with-messages){"message.status": {"$nin": ["error", "not-sended"]}}— mensagens, exceto as com erro e as não enviadas (somente list-with-messages){"status": {"$in": ["success", "pending"]}}— registros bem-sucedidos ou pendentes
- O endpoint
listé mais rápido; prefira-o para verificações gerais de status - Use
list-with-messagesquando os detalhes da mensagem forem necessários - O máximo de registros por página (pageItems) é 50; o padrão é 50 se não for especificado
- O filtro
message.statussó funciona emlist-with-messages - Registros com messageId nulo terão objetos
messagenulos
Stop — cancelar o envio
Interrompe o envio em andamento de uma mensagem em massa. O trabalho em fila é cancelado e todos os registros pending passam para o status cancelled. Os registros que já foram processados como success ou failed não são afetados.
POST https://app.monochat.ai/api/:slug/custom-functions/bulk-message-api-app/api/bulk-message/stop.js
Esta ação não pode ser desfeita. Um envio interrompido não pode ser retomado.
Parâmetros da requisição
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
bulkMessageId | string | Sim | ID da mensagem em massa a interromper |
{
"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"
}'
Resposta
Em uma requisição bem-sucedida, o corpo da resposta fica vazio. Um status HTTP 200 indica que a operação foi concluída com sucesso.
{}
- Somente as mensagens em massa criadas por esta API podem ser interrompidas
- Depois de interromper um envio, você pode usar o endpoint
statspara verificar o número de registros cancelados - Se a mensagem em massa não for encontrada, a API retorna o erro:
bulkMessageNotFound