Pular para o conteúdo principal

Exemplos de Uso

1. Envio Simples (cURL)

Mensagem Única

curl -X POST "https://producer-whatsapp-trigger.incibrasil.workers.dev?api_key=<INCI_API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"phone_number": "5588981397730",
"name": "João Edson",
"inbox_id": "123",
"template_name": "saudacao_inicial",
"template_language": "pt_BR",
"template_category": "UTILITY",
"variables": ["João Edson", "seu pedido"]
}'
API Key

Substitua <INCI_API_KEY> pela chave real fornecida pela equipe INCI.


2. Campanha em Lote

Enviar para 50 clientes

curl -X POST "https://producer-whatsapp-trigger.incibrasil.workers.dev?api_key=<INCI_API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"inbox_id": "123",
"template_name": "lembrete_pagamento",
"template_language": "pt_BR",
"template_category": "UTILITY",
"contacts": [
{
"phone_number": "5588981397730",
"name": "João Edson",
"variables": ["João Edson", "R$ 150,00", "25/10/2025"]
},
{
"phone_number": "5511999887766",
"name": "Maria Silva",
"variables": ["Maria Silva", "R$ 200,00", "26/10/2025"]
}
]
}'

3. Integração com Retool

Formato CSV Upload

O Retool permite fazer upload de arquivos CSV para disparo em massa.

📥 Baixar modelo CSV

Estrutura do arquivo modelo-disparo-lista-retool.csv:

full_name,phone_number,var_1,var_2
João Edson,5588981397730,João Edson,seu pedido
Maria Silva,5511999887766,Maria Silva,sua encomenda

Colunas:

  • full_name: Nome completo do contato
  • phone_number: Número com código do país (apenas dígitos)
  • var_1, var_2, ...: Variáveis do template (quantidade depende do template)

Script Retool

// Ler CSV e converter para formato batch
const contacts = csvData.map(row => ({
phone_number: row.phone_number,
name: row.full_name,
variables: [row.var_1, row.var_2]
}));

// Enviar via API
const response = await fetch('https://producer-whatsapp-trigger.incibrasil.workers.dev?api_key=<INCI_API_KEY>', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
inbox_id: '123',
template_name: 'template_campanha',
template_language: 'pt_BR',
template_category': 'MARKETING',
contacts: contacts
})
});

const result = await response.json();
console.log(result);

4. Integração com Brevo

Passo a Passo para Configurar

  1. Acesse sua automação (workflow) na Brevo
  2. Adicione uma ação do tipo Webhook
  3. Configure a URL com os parâmetros desejados
  4. ⚠️ IMPORTANTE: Marque o checkbox "Quero enviar as propriedades do contato para o webhook"
  5. Salve a automação
Checkbox Obrigatório

Sem marcar a opção "Quero enviar as propriedades do contato para o webhook", as propriedades (properties) não serão enviadas no payload e as variáveis não funcionarão.

Exemplo 1: Template Sem Variáveis

Template: "Olá! Bem-vindo à INCI Brasil."

URL do Webhook:

https://producer-whatsapp-trigger.incibrasil.workers.dev/brevo/boas_vindas/123/

Descrição:

  • Template estático sem variáveis dinâmicas
  • Última barra (/) indica que não há parâmetros

Exemplo 2: Template com Propriedades Dinâmicas

Template: "Olá {{1}}, seu pedido {{2}} está confirmado!"

URL do Webhook:

https://producer-whatsapp-trigger.incibrasil.workers.dev/brevo/confirmacao_pedido/123/props:properties.nome&props:properties.numero_pedido

Payload enviado pela Brevo:

{
"email": "[email protected]",
"event": "order_confirmed",
"properties": {
"nome": "João Edson",
"numero_pedido": "#98765",
"whatsapp": "5588981397730"
}
}

Resultado:

  • \{\{1\}\} = "João Edson" (extraído de properties.nome)
  • \{\{2\}\} = "#98765" (extraído de properties.numero_pedido)
  • Mensagem final: "Olá João Edson, seu pedido #98765 está confirmado!"

Exemplo 3: Combinando Valores Fixos e Dinâmicos

Template: "Olá {{1}}! O produto {{2}} chegou em estoque."

URL do Webhook:

https://producer-whatsapp-trigger.incibrasil.workers.dev/brevo/novo_produto/123/props:properties.nome&Smartwatch%20Pro

Payload enviado pela Brevo:

{
"email": "[email protected]",
"event": "product_available",
"properties": {
"nome": "Maria Silva",
"whatsapp": "5511999887766"
}
}

Resultado:

  • \{\{1\}\} = "Maria Silva" (extraído de properties.nome)
  • \{\{2\}\} = "Smartwatch Pro" (valor fixo/literal na URL)
  • Mensagem final: "Olá Maria Silva! O produto Smartwatch Pro chegou em estoque."
Quando usar valores fixos?

Use valores fixos (literais) quando o conteúdo é sempre o mesmo para todos os destinatários. Exemplo: nome de produto em campanha de lançamento.

Exemplo 4: Navegação Aninhada

URL do Webhook:

https://producer-whatsapp-trigger.incibrasil.workers.dev/brevo/lembrete/123/props:properties.cliente.nome&props:properties.endereco.cidade&props:properties.pedido_id

Payload enviado pela Brevo:

{
"email": "[email protected]",
"event": "delivery_reminder",
"properties": {
"cliente": {
"nome": "Carlos Santos"
},
"endereco": {
"cidade": "São Paulo",
"estado": "SP"
},
"pedido_id": "#45678",
"whatsapp": "5511988776655"
}
}

Resultado:

  • \{\{1\}\} = "Carlos Santos" (de properties.cliente.nome)
  • \{\{2\}\} = "São Paulo" (de properties.endereco.cidade)
  • \{\{3\}\} = "#45678" (de properties.pedido_id)

Referência da API Brevo

As propriedades enviadas vêm do trackEvent da API Brevo. Estrutura completa do payload:

{
"email": "[email protected]",
"event": "cart_updated",
"eventdata": {
"data": {
"added_product": [
{
"currency": "EUR",
"name": "Wrist watch",
"type": "accessories",
"price": "50.00"
}
]
}
},
"properties": {
"additionalProp": "string"
}
}
Campo properties

O campo properties é onde você define os dados personalizados que serão extraídos pelas variáveis props:properties.campo.


5. JavaScript / TypeScript

Node.js / Fetch API

interface ChatwootMessage {
phone_number: string;
name: string;
inbox_id: string;
template_name: string;
template_language: string;
template_category: string;
variables: string[];
}

async function sendWhatsAppMessage(message: ChatwootMessage) {
const response = await fetch('https://producer-whatsapp-trigger.incibrasil.workers.dev?api_key=<INCI_API_KEY>', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(message),
});

const result = await response.json();

if (!result.success) {
throw new Error(`Erro ao enviar: ${result.message}`);
}

return result;
}

// Uso
const resultado = await sendWhatsAppMessage({
phone_number: '5588981397730',
name: 'João Edson',
inbox_id: '123',
template_name: 'saudacao',
template_language: 'pt_BR',
template_category: 'UTILITY',
variables: ['João Edson', 'produto X'],
});

console.log('Mensagem enfileirada:', resultado.data.message_id);

6. Python

Requests Library

import requests
import json

def send_whatsapp_batch(inbox_id, template_name, contacts):
url = 'https://producer-whatsapp-trigger.incibrasil.workers.dev?api_key=<INCI_API_KEY>'

payload = {
'inbox_id': inbox_id,
'template_name': template_name,
'template_language': 'pt_BR',
'template_category': 'UTILITY',
'contacts': contacts
}

response = requests.post(url, json=payload)
response.raise_for_status()

return response.json()

# Uso
contacts = [
{
'phone_number': '5588981397730',
'name': 'João Edson',
'variables': ['João Edson', 'seu pedido']
},
{
'phone_number': '5511999887766',
'name': 'Maria Silva',
'variables': ['Maria Silva', 'sua compra']
}
]

result = send_whatsapp_batch('123', 'template_nome', contacts)
print(f"Enfileirados: {result['data']['total']} contatos")

7. Consultar Templates Disponíveis

cURL

curl -X GET "https://producer-whatsapp-trigger.incibrasil.workers.dev/templates?inbox_id=123&api_key=<INCI_API_KEY>"

JavaScript

async function getTemplates(inboxId) {
const response = await fetch(
`https://producer-whatsapp-trigger.incibrasil.workers.dev/templates?inbox_id=${inboxId}&api_key=<INCI_API_KEY>`
);

const result = await response.json();
return result.data.templates;
}

// Uso
const templates = await getTemplates('123');
console.log('Templates disponíveis:', templates.map(t => t.name));

Response Esperado

{
"success": true,
"data": {
"templates": [
{
"id": "123456",
"name": "saudacao_inicial",
"status": "APPROVED",
"category": "UTILITY",
"language": "pt_BR",
"components": [
{
"type": "BODY",
"text": "Olá {{1}}, tudo bem? Seu {{2}} está pronto!"
}
]
}
]
}
}

8. Tratamento de Erros

Exemplo Completo com Retry

async function sendWithRetry(message: ChatwootMessage, maxRetries = 3) {
let lastError: Error | null = null;

for (let i = 0; i < maxRetries; i++) {
try {
const response = await fetch('https://producer-whatsapp-trigger.incibrasil.workers.dev?api_key=<INCI_API_KEY>', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(message),
});

const result = await response.json();

if (!result.success) {
throw new Error(result.message);
}

return result;

} catch (error) {
lastError = error as Error;
console.warn(`Tentativa ${i + 1} falhou: ${error.message}`);

if (i < maxRetries - 1) {
// Exponential backoff: 1s, 2s, 4s
await new Promise(resolve => setTimeout(resolve, 1000 * Math.pow(2, i)));
}
}
}

throw new Error(`Falha após ${maxRetries} tentativas: ${lastError?.message}`);
}

9. Validação Antes do Envio

Verificar Template Antes de Enviar

async function validateAndSend(inboxId, templateName, contacts) {
// 1. Buscar templates disponíveis
const templatesResponse = await fetch(
`https://producer-whatsapp-trigger.incibrasil.workers.dev/templates?inbox_id=${inboxId}&api_key=<INCI_API_KEY>`
);

const { data: { templates } } = await templatesResponse.json();

// 2. Encontrar template desejado
const template = templates.find(t => t.name === templateName);

if (!template) {
throw new Error(`Template "${templateName}" não encontrado`);
}

// 3. Verificar número de variáveis
const bodyComponent = template.components.find(c => c.type === 'BODY');
const variableCount = (bodyComponent.text.match(/\{\{\d+\}\}/g) || []).length;

// 4. Validar todos os contatos
for (const contact of contacts) {
if (contact.variables.length !== variableCount) {
throw new Error(
`Contato ${contact.name}: template requer ${variableCount} variáveis, mas ${contact.variables.length} foram fornecidas`
);
}
}

// 5. Enviar
return await fetch('https://producer-whatsapp-trigger.incibrasil.workers.dev?api_key=<INCI_API_KEY>', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
inbox_id: inboxId,
template_name: templateName,
template_language: template.language,
template_category: template.category,
contacts: contacts
})
}).then(r => r.json());
}

Próximos Passos