Pedidos e entregas
"Pedido confirmado", "saiu para entrega" e a nota fiscal em PDF, por URL. Quando o cliente responde "chegou?", a mensagem cai no seu webhook.
template pedido_enviado → message.received
Uma API REST simples para integrar o WhatsApp ao seu sistema pela Cloud API da Meta.
Conecte o número pela janela da Meta, crie uma chave e envie com
POST /v1/messages. A Chasque cuida da conexão, das novas tentativas, dos logs e dos erros. Você cuida da regra de negócio.
Estamos em beta fechado: a entrada é por convite. Pedir convite →
curl -X POST https://SEU-DOMINIO/v1/messages \
-H "Authorization: Bearer chq_live_…" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"from": "pn_01J…",
"to": "+5511900000000",
"type": "template",
"template": {
"name": "pedido_enviado",
"language": "pt_BR",
"variables": ["Ana", "#1234"]
}
}'
# PowerShell 5.1+ (Windows) ou 7+ (Linux e macOS)
$body = @'
{
"from": "pn_01J…",
"to": "+5511900000000",
"type": "template",
"template": {
"name": "pedido_enviado",
"language": "pt_BR",
"variables": ["Ana", "#1234"]
}
}
'@
$response = Invoke-RestMethod -Method Post -Uri 'https://SEU-DOMINIO/v1/messages' `
-Headers @{
'Authorization' = 'Bearer chq_live_…'
'Idempotency-Key' = [guid]::NewGuid().ToString()
} `
-ContentType 'application/json; charset=utf-8' `
-Body ([System.Text.Encoding]::UTF8.GetBytes($body))
$response | ConvertTo-Json -Depth 10
// Node.js 18+ (fetch nativo), como módulo ES (.mjs)
import { randomUUID } from 'node:crypto';
const response = await fetch('https://SEU-DOMINIO/v1/messages', {
method: 'POST',
headers: {
Authorization: 'Bearer chq_live_…',
'Content-Type': 'application/json',
'Idempotency-Key': randomUUID(),
},
body: JSON.stringify({
from: 'pn_01J…',
to: '+5511900000000',
type: 'template',
template: {
name: 'pedido_enviado',
language: 'pt_BR',
variables: ['Ana', '#1234'],
},
}),
});
console.log(response.status, await response.json());
# Python 3.8+ · pip install requests
import uuid
import requests
response = requests.post(
"https://SEU-DOMINIO/v1/messages",
headers={
"Authorization": "Bearer chq_live_…",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"from": "pn_01J…",
"to": "+5511900000000",
"type": "template",
"template": {
"name": "pedido_enviado",
"language": "pt_BR",
"variables": ["Ana", "#1234"],
},
},
timeout=15,
)
print(response.status_code, response.json())
<?php
// PHP 8+ com a extensão curl
$body = [
'from' => 'pn_01J…',
'to' => '+5511900000000',
'type' => 'template',
'template' => [
'name' => 'pedido_enviado',
'language' => 'pt_BR',
'variables' => ['Ana', '#1234'],
],
];
$ch = curl_init('https://SEU-DOMINIO/v1/messages');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer chq_live_…',
'Content-Type: application/json',
'Idempotency-Key: ' . bin2hex(random_bytes(16)),
],
CURLOPT_POSTFIELDS => json_encode($body),
CURLOPT_RETURNTRANSFER => true,
]);
$response = curl_exec($ch);
echo curl_getinfo($ch, CURLINFO_HTTP_CODE), ' ', $response, PHP_EOL;
// Java 17+
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.UUID;
public class EnviarMensagem {
public static void main(String[] args) throws Exception {
String body = """
{
"from": "pn_01J…",
"to": "+5511900000000",
"type": "template",
"template": {
"name": "pedido_enviado",
"language": "pt_BR",
"variables": ["Ana", "#1234"]
}
}
""";
HttpRequest request = HttpRequest.newBuilder(URI.create("https://SEU-DOMINIO/v1/messages"))
.header("Authorization", "Bearer chq_live_…")
.header("Content-Type", "application/json")
.header("Idempotency-Key", UUID.randomUUID().toString())
.POST(HttpRequest.BodyPublishers.ofString(body))
.build();
// HTTP/1.1: alguns proxies não completam o upgrade h2c do cliente padrão.
HttpClient client = HttpClient.newBuilder().version(HttpClient.Version.HTTP_1_1).build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode() + " " + response.body());
}
}
// .NET 8+ (C# 11), programa de nível superior
using System.Net.Http.Headers;
using System.Text;
var json = """
{
"from": "pn_01J…",
"to": "+5511900000000",
"type": "template",
"template": {
"name": "pedido_enviado",
"language": "pt_BR",
"variables": ["Ana", "#1234"]
}
}
""";
using var request = new HttpRequestMessage(HttpMethod.Post, "https://SEU-DOMINIO/v1/messages")
{
Content = new StringContent(json, Encoding.UTF8, "application/json"),
};
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", "chq_live_…");
request.Headers.Add("Idempotency-Key", Guid.NewGuid().ToString());
using var http = new HttpClient();
var response = await http.SendAsync(request);
Console.WriteLine($"{(int)response.StatusCode} {await response.Content.ReadAsStringAsync()}");
"id": "msg_01J…", "status": "accepted"
Cada mudança chega no seu webhook, assinada, ou em GET /v1/messages/{id}.
Para quem desenvolve ou mantém um sistema que fala com cliente: loja, agenda, cobrança, login. Cada caso usa um recurso da API que já existe hoje.
"Pedido confirmado", "saiu para entrega" e a nota fiscal em PDF, por URL. Quando o cliente responde "chegou?", a mensagem cai no seu webhook.
template pedido_enviado → message.received
Lembrete de consulta ou serviço com botões de resposta rápida. "Confirmar" e "Remarcar" voltam como mensagem no webhook, prontos para a sua regra.
quick_reply "Confirmar" → message.received
Template de autenticação com botão de copiar o código e validade definida por você. O texto é o padrão da Meta, aprovado mais rápido.
template codigo_verificacao · "482913"
"Sua fatura de outubro está disponível", com o boleto anexado por URL pública e nome de arquivo. Sem upload prévio na Meta.
type: "document" · boleto-outubro.pdf
Precisa falar com muita gente de uma vez? Campanhas disparam um template aprovado para uma lista com opt-in, no ritmo do número.
Você pode integrar direto na Cloud API da Meta. A Chasque existe para tirar do seu time a infraestrutura e a operação que vêm junto, usando a mesma API oficial.
131047 e o fórum para descobrir que a janela de 24 h fechouIdempotency-Keywindow_closed e a frase "envie um template"Você integra. A Chasque cuida da camada operacional.
Os mesmos passos do tutorial do painel, que acompanha a sua primeira mensagem ao vivo até "Lido".
Número pela janela da Meta, novo ou o que já está no app, com Coexistence. Cada número conta no limite do plano.
pn_01J… · ativo
No painel, em um clique. A chave aparece uma vez e fica guardada só como hash. Revogue quando quiser.
chq_live_••••3f9a
Texto, template e mídia por URL. raw repassa o objeto da Meta e o wamid volta na hora.
POST /v1/messages → 201
Status, respostas dos clientes e mídia chegam assinados no seu endpoint. Ou consulte por GET /v1/messages/{id}.
message.delivered
A Meta conecta você ao WhatsApp. A Chasque conecta o WhatsApp ao seu software.
Requisição, resposta, evento de webhook, erros e painel, como aparecem na integração.
Payload enxuto: from, to e o conteúdo. O header Idempotency-Key garante que um retry não envia duas vezes, e a resposta diz quantos envios restam no mês.
user_id de quem ocultou o númerotype: "raw" repassa qualquer objeto da Meta (interativo, localização, reação){
"from": "pn_01J…",
"to": "+5511900000000",
"type": "text",
"text": { "body": "Pedido #1234 saiu para entrega." }
}
Chasque-Quota-Remaining: 9871
{
"id": "msg_01J…",
"wamid": "wamid.HBg…",
"status": "accepted"
}
Um evento por mudança: na fila, enviado, entregue, lido, falhou. Mensagens recebidas, mídia e respostas também. Tudo com Chasque-Signature (HMAC-SHA256 com carimbo de tempo) e Chasque-Event-Id para deduplicar.
Se o seu servidor não responder 2xx, tentamos de novo em
…e a cada 24 h, por 7 dias. Cada entrega fica no painel, com reenvio manual.
Eventos
Chasque-Signature: t=1758900004,v1=9f2c…
Chasque-Event-Id: evt_01J…
{
"id": "evt_01J…",
"type": "message.delivered",
"created_at": "2026-09-26T15:00:04Z",
"data": {
"phone_number_id": "pn_01J…",
"message": {
"id": "msg_01J…",
"status": "delivered"
},
"raw": { … }
}
}
A Meta responde com números. A Chasque devolve um código legível, o status HTTP certo e a frase de ação, no retorno da API e no log do painel. O que não tem tradução chega como meta_error, com o código e a mensagem originais.
| Meta | Chasque | O que fazer |
|---|---|---|
| 131047 | window_closed 422 | Passaram 24 h desde a última mensagem do usuário. Envie um template. |
| 131026 | recipient_unreachable 422 | O destinatário não pode receber: sem WhatsApp, versão antiga ou bloqueou. |
| 131042 | meta_payment_required 402 | Cadastre um cartão na sua conta WhatsApp Business. |
| 132000 | template_params_mismatch 422 | O número de variáveis não bate com o template. |
| 130429 | throughput_exceeded 429 | Limite por segundo do número (a Meta aceita até 80, ou 20 no Coexistence). Tente de novo em instantes. |
Cada mensagem com status e erro traduzido, entregas do webhook com payload e resposta, editor de templates com prévia e checklist do que a Meta recusa, campanhas com o andamento, e a cota do mês com aviso aos 80%. Tema claro e escuro.
Para avisos em lote: recall de produto, mudança de horário, novidade para quem pediu para receber. O painel monta o disparo em três passos e a API faz o resto no ritmo que a Meta tolera.
Escolha o número e um template aprovado pela Meta. Variáveis fixas aqui; as que mudam por pessoa vêm da lista.
CSV, Excel ou ODS, uma pessoa por linha, com telefone e as variáveis dela. Você declara que a lista tem opt-in; sem isso o disparo não existe.
Quantos envios, qual template, agora ou em um horário marcado. Nada sai antes de confirmar.
| Plano | Campanhas por vez | Destinatários por campanha |
|---|---|---|
| Free | 1 | 1.000 |
| Starter | 1 | 2.000 |
| Pro | 3 | 20.000 |
| Business | 5 | 100.000 |
campaign.started, campaign.paused e campaign.completed no webhookSó com template aprovado e destinatários que aceitaram receber. É regra da Meta e da nossa política de uso aceitável; disparo em massa fora disso é proibido.
Nada aqui é roadmap. Cada item está no produto e na documentação.
POST /v1/messages e a mensagem sai.
Idempotency-Key e type: "raw" para qualquer formato da Meta.Status por webhook assinado e por GET /v1/messages/{id}.
account.quota_warning no webhook e pausa automática quando a Meta rebaixa o número.Para quem integra no Brasil.
Os caminhos para colocar o WhatsApp no seu sistema, comparados por categoria.
| Critério | WhatsApp não oficialautomação do WhatsApp Web | Cloud API diretaapp próprio na Meta | Chasqueoficial via Tech Provider |
|---|---|---|---|
| WhatsApp oficial | Não, número sujeito a bloqueio sem aviso | Sim | Sim, pela Cloud API |
| Para começar | Ler um QR code | App na Meta, Business Verification e App Review | Conta com GitHub e a janela da Meta |
| API | Varia | Graph API | API REST simplificada, com idempotência |
| Templates | Não | Sim | Sim, com análise da Meta |
| Status de entrega | Limitado | Sim | Sim, normalizado |
| Webhooks | Varia | Reenvio por até 7 dias, sem histórico nem reenvio manual | Novas tentativas por 7 dias, histórico de cada entrega e reenvio manual |
| Erros | Varia | Códigos numéricos | Traduzidos, com o que fazer |
| Campanhas | Varia, sem opt-in | Você constrói o disparo e o ritmo | Incluídas, com opt-in declarado e ritmo por número |
| Painel operacional | Varia | Você constrói | Incluído |
| Documentação | Varia | Documentação da Meta | Docs em português |
| Coexistence | Não se aplica | Só como Tech Provider, com Embedded Signup | Sim |
| Preço da plataforma | Por instância | R$ 0 (o custo é a engenharia) | R$ 0 a R$ 399 por mês, com excedente por mil |
| Tarifa da Meta | Não se aplica | Paga direto à Meta | Direto à Meta, sem markup |
A mesma Cloud API, com menos código e menos operação.
As tarifas por mensagem são definidas e cobradas pela Meta. Ver a tabela oficial →
A mensalidade inclui uma cota de envios pela API. Nos planos pagos, você escolhe: limitar a cobrança à mensalidade ou autorizar o excedente por mil, com um limite de gasto que você define. Mensagens recebidas nunca são bloqueadas.
Para testar a API e desenvolver a integração.
Para colocar a integração em produção.
Para mais volume ou vários números.
Para sistemas que dependem do WhatsApp em escala.
Por padrão a cobrança fica limitada à mensalidade: ao fim das mensagens incluídas, os envios pausam até o dia 1. Se preferir, ative a cobrança por uso no painel: o que passar da cota é cobrado por mil na fatura seguinte, até um limite de gasto mensal que você define (o padrão é uma mensalidade). Mensagens recebidas continuam sempre.
| Plano | Incluído por mês | Excedente |
|---|---|---|
| Free | 1.000 | não disponível |
| Starter | 10.000 | R$ 8 / 1.000 |
| Pro | 50.000 | R$ 6 / 1.000 |
| Business | 200.000 | R$ 4 / 1.000 |
Sem promessas genéricas: o que está implementado.
As respostas curtas. A lista completa cobre preços, cobrança, janela de 24 h, templates, webhooks e dados.
A camada de infraestrutura que liga o WhatsApp ao seu software pela Cloud API da Meta. Você conecta o número, gera uma chave e envia com POST /v1/messages. Cada mudança de status (na fila, enviado, entregue, lido, falhou) chega no seu webhook, assinada.
Sim. As mensagens passam pela Cloud API da Meta e a Chasque atua como provedora de tecnologia (Tech Provider). A Chasque não é afiliada ao WhatsApp ou à Meta.
Pode, e a Chasque usa a mesma Cloud API oficial. A diferença é o que fica com o seu time: direto na Meta, você mantém o app e os tokens, recebe e valida os webhooks, trata novas tentativas e códigos de erro e monta logs e painel. Na Chasque, essa camada já está pronta: você integra uma API REST com uma chave e acompanha tudo pelo painel. As tarifas por mensagem continuam sendo cobradas pela Meta, sem markup.
Não. Você conecta o número pelo Embedded Signup do app da Chasque, numa janela da própria Meta. A verificação do app e as permissões ficam com a Chasque.
Sim, com o Coexistence: a empresa continua atendendo pelo app e a sua integração usa a API. Ao conectar, isto muda no app:
Sim. A Meta cobra por mensagem enviada pela Cloud API, direto no cartão cadastrado na sua conta WhatsApp Business. Essa tarifa não está no preço da Chasque e é repassada sem markup: ela varia por categoria e, a partir de 1º de outubro de 2026, mensagens de serviço também passam a ser cobradas no Brasil. O plano Free é gratuito na Chasque, não no WhatsApp. Mensagens enviadas pelo app, no Coexistence, continuam sem custo.
Com a sua conta do GitHub. Não pedimos senha nem acesso aos seus repositórios. Durante o beta a entrada é por convite: peça pelo formulário de contato.
O token da Meta fica cifrado (AES-GCM), as chaves de API são guardadas só como hash e todo o tráfego usa HTTPS. Os logs de mensagens são apagados depois de 3, 14, 30 ou 90 dias, conforme o plano. Detalhes na Política de privacidade.
Crie a conta com o GitHub, conecte o número pela janela da Meta e acompanhe o status ao vivo no tutorial do painel. Plano Free permanente, sem cartão.
Estamos em beta fechado: a entrada é por convite. Pedir convite →