Avisos de status de pedido no WhatsApp, pelo número oficial do serviço Notifica WS Órbita. Sua loja manda um evento com dados; nós enviamos o aviso e devolvemos o que aconteceu no seu webhook. Funciona com qualquer plataforma: basta fazer requisições HTTP.
O Notifica é um serviço com um número compartilhado por várias lojas e um catálogo fechado de avisos utilitários de pedido. Você não escreve o texto da mensagem: escolhe, na adesão, quais eventos do catálogo a sua loja emite, e manda os dados de cada um. O nome da sua loja entra em toda mensagem.
Exemplo do que o cliente recebe: "Olá Ana! Seu pedido 1234 na Loja Exemplo foi enviado por Correios. Rastreio: AA123456789BR."
https://notifica.wsorbita.com/v1
A credencial vai no cabeçalho:
Authorization: Bearer wso_live_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Credenciais começam com wso_test_ ou wso_live_. A de teste valida tudo, não gasta mensagem e não chega em ninguém: use ela durante a integração inteira. Os webhooks saem normalmente, marcados com "mode": "test".
Todo evento recebe nome e pedido em data; loja vem do seu cadastro. A tabela mostra os campos extras e o texto exato que o cliente recebe (*asteriscos* viram negrito no WhatsApp). Nos eventos com link opcional, mandar um link (https) acrescenta o botão "Acompanhar entrega"; sem ele, sai a versão sem botão. GET /v1/events devolve só os que estão ligados para a sua loja.
| Evento | Campos extras em data | Texto |
|---|---|---|
pedido_recebido | total | Olá {{nome}}! A *{{loja}}* recebeu seu pedido *{{pedido}}*. Valor: {{total}} Avisaremos por aqui sobre as próximas etapas. |
pedido_confirmado | Olá {{nome}}! Seu pedido *{{pedido}}* na *{{loja}}* foi confirmado e segue para processamento. Avisaremos por aqui sobre as próximas etapas. | |
pagamento_pendente_pix | validade · exige reference, sai 1 vez por pedido | Olá {{nome}}. O pagamento via PIX do pedido *{{pedido}}* na *{{loja}}* ainda está pendente. Código PIX válido até: {{validade}} Se já pagou, desconsidere este aviso. |
pagamento_pendente_boleto | vencimento · exige reference, sai 1 vez por pedido | Olá {{nome}}. O boleto do pedido *{{pedido}}* na *{{loja}}* ainda está pendente. Vencimento: {{vencimento}} Se já pagou, desconsidere este aviso. |
pagamento_aprovado | Olá {{nome}}! O pagamento do pedido *{{pedido}}* na *{{loja}}* foi aprovado. Seu pedido segue para preparação. Avisaremos por aqui sobre as próximas etapas. | |
pagamento_recusado | motivo · link opcional (vira botão "Tentar outro pagamento") | Olá {{nome}}. O pagamento do pedido *{{pedido}}* na *{{loja}}* não foi aprovado. Motivo: {{motivo}} Para concluir a compra, escolha outra forma de pagamento na loja. |
pedido_em_separacao | Olá {{nome}}! Seu pedido *{{pedido}}* na *{{loja}}* está em separação. Avisaremos por aqui sobre as próximas etapas. | |
nota_fiscal_emitida | link (vira botão "Ver nota fiscal") | Olá {{nome}}! A nota fiscal do pedido *{{pedido}}* na *{{loja}}* foi emitida. Toque no botão abaixo para ver a nota fiscal. |
pedido_enviado | transportadora, rastreio · link opcional (vira botão "Acompanhar entrega") | Olá {{nome}}! Seu pedido *{{pedido}}* na *{{loja}}* foi enviado. Transportadora: {{transportadora}} Código de rastreio: {{rastreio}} Acompanhe a entrega pelo código de rastreio no site da transportadora. |
pedido_saiu_entrega | previsao · link opcional (vira botão "Acompanhar entrega") | Olá {{nome}}! Seu pedido *{{pedido}}* na *{{loja}}* saiu para entrega. Previsão: {{previsao}} Se possível, deixe alguém disponível para receber a encomenda. |
pedido_atrasado | previsao · link opcional (vira botão "Acompanhar entrega") | Olá {{nome}}. O prazo de entrega do pedido *{{pedido}}* na *{{loja}}* foi atualizado. Nova previsão: {{previsao}} Pedimos desculpas pelo transtorno. |
entrega_nao_realizada | motivo · link opcional (vira botão "Acompanhar entrega") | Olá {{nome}}. Não foi possível entregar o pedido *{{pedido}}* na *{{loja}}*. Motivo: {{motivo}} Uma nova tentativa de entrega será realizada. |
pedido_entregue | Olá {{nome}}! O pedido *{{pedido}}* na *{{loja}}* foi entregue. Em caso de dúvida, entre em contato com a loja. | |
pedido_pronto_retirada | local, horario | Olá {{nome}}! Seu pedido *{{pedido}}* na *{{loja}}* está pronto para retirada. Local: {{local}} Horário: {{horario}} Leve um documento com foto. |
retirada_nao_realizada | local, horario | Olá {{nome}}. O pedido *{{pedido}}* na *{{loja}}* ainda não foi retirado e continua disponível. Local: {{local}} Horário: {{horario}} Leve um documento com foto. |
pedido_retirado | Olá {{nome}}! A retirada do pedido *{{pedido}}* na *{{loja}}* foi confirmada. Em caso de dúvida, entre em contato com a loja. | |
pedido_cancelado | motivo | Olá {{nome}}. O pedido *{{pedido}}* na *{{loja}}* foi cancelado. Motivo: {{motivo}} Em caso de dúvida, entre em contato com a loja. |
devolucao_recebida | Olá {{nome}}! A *{{loja}}* recebeu a devolução referente ao pedido *{{pedido}}*. Avisaremos por aqui sobre as próximas etapas. | |
reembolso_em_processamento | Olá {{nome}}! O reembolso referente ao pedido *{{pedido}}* na *{{loja}}* está em processamento. Avisaremos por aqui quando for concluído. | |
reembolso_efetuado | valor, prazo | Olá {{nome}}! O reembolso do pedido *{{pedido}}* na *{{loja}}* foi efetuado. Valor: {{valor}} Prazo para aparecer no extrato: {{prazo}} Em caso de dúvida, entre em contato com a loja. |
Os campos são texto livre, do jeito que o cliente deve ler ("total": "R$ 150,00", "previsao": "hoje até 18h"). Não interpretamos nem formatamos. Precisa de um evento que não está aqui? Fale conosco: o catálogo cresce, e o evento novo fica disponível para todas as lojas.
/v1/notifycurl -X POST https://notifica.wsorbita.com/v1/notify \
-H "Authorization: Bearer $NOTIFICA_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: pedido-1234-enviado-5541988721661" \
-d '{
"event": "pedido_enviado",
"to": "5541988721661",
"data": { "nome": "Ana", "pedido": "1234",
"transportadora": "Correios", "rastreio": "AA123456789BR" },
"reference": "pedido:1234",
"consent": {
"granted_at": "2026-08-29T12:00:00Z",
"source": "checkout",
"text": "Quero receber avisos deste pedido no WhatsApp pelo Notifica WS Órbita"
}
}'
| Campo | Obrigatório | Descrição |
|---|---|---|
event | sim | Um evento do catálogo, ligado para a sua loja. |
to | sim | Telefone. Aceita qualquer formatação. Sem código de país, assumimos Brasil. |
data | sim | nome, pedido e os campos extras do evento. Nunca mande loja: vem do seu cadastro. |
reference | recomendado | Identificação do pedido no seu sistema. Volta em todo webhook. Obrigatório nos eventos de pagamento pendente. |
consent | 1º envio | Prova de que o cliente autorizou a sua loja. Obrigatório na primeira mensagem para cada número, ou registre antes em /v1/consent. |
Resposta 202:
{ "id": "msg_8842", "status": "queued", "to": "5541988721661",
"event": "pedido_enviado", "reference": "pedido:1234", "mode": "live" }
message.delivered ou message.failed.
Mande o cabeçalho Idempotency-Key com um valor estável e com o telefone dentro: pedido-1234-enviado-5541988721661. Mesma chave e mesmo corpo em até 24 horas devolvem a resposta original sem enviar de novo; mesma chave com corpo diferente devolve 409. Sem o cabeçalho, um retry de rede vira uma segunda mensagem.
Os eventos pagamento_pendente_pix e pagamento_pendente_boleto têm uma trava a mais: saem uma única vez por pedido (reference), independentemente do cabeçalho. Repetição devolve 409 already_sent.
O consentimento é por loja: quem aceitou avisos da sua loja não aceitou da loja ao lado, mesmo que o número de envio seja o mesmo. Registre no momento em que a pessoa aceita:
POST /v1/consent
{ "to": "5541988721661", "status": "granted",
"source": "checkout", "text": "Quero receber avisos no WhatsApp pelo Notifica WS Órbita" }
Quem responder PARAR ao número é removido de todas as lojas de uma vez: a pessoa está bloqueando o número, não a sua loja. Tentar enviar depois devolve 403 recipient_opted_out. Se ela voltar a aceitar no seu checkout, um novo granted reabre só para a sua loja.
contact.opted_out. Sem isso a sua tela continua dizendo "avisos ligados" para quem já saiu.
O número do Notifica não é atendido. Quem responde recebe, uma vez por dia, uma mensagem automática dizendo isso e apontando o contato da sua loja (o que você informou na adesão). A resposta chega para você no webhook message.inbound, com o texto: se houver algo a fazer, é do seu lado.
Registramos a sua URL na adesão (ou depois, a pedido). Enviamos POST com JSON e assinatura:
| Evento | Quando |
|---|---|
message.sent | A mensagem foi aceita pelo WhatsApp. |
message.delivered | Chegou no aparelho. |
message.read | O cliente abriu. |
message.failed | Não foi entregue. Traz error.code e error.message. |
message.inbound | O cliente respondeu. Traz text. |
button.clicked | O cliente tocou num botão de link (rastreio, nota fiscal, pagamento). Traz link e url. |
contact.opted_out | O cliente pediu para parar. Traz to e reason. Exige ação sua. |
contact.opted_in | O cliente voltou a consentir com a sua loja. Traz to. |
{ "event": "message.delivered", "at": "2026-08-29T12:00:03Z",
"id": "msg_8842", "reference": "pedido:1234",
"to": "5541988721661", "mode": "live" }
Cabeçalhos: X-Orbita-Event, X-Orbita-Delivery, X-Orbita-Timestamp e X-Orbita-Signature. A assinatura é HMAC-SHA256 de timestamp + "." + corpo, com o segredo do webhook, em hexadecimal:
const assinatura = crypto
.createHmac('sha256', SEGREDO)
.update(`${timestamp}.${corpoBruto}`)
.digest('hex')
// compare com o header, sem o prefixo "sha256="
message.delivered antigo pode chegar depois de um contact.opted_out. Se você limpa alguma marca ao receber sent ou delivered, exclua dessa limpeza quem está parado por opt-out.
Responda 2xx rápido. Outro código conta como falha e tentamos de novo em 1, 5, 15, 60 e 360 minutos. Depois de 20 falhas seguidas o endpoint é desligado e avisamos você.
| Rota | O que devolve |
|---|---|
GET /v1/health | Estado da sua loja no serviço (ativa ou pausada), limites e eventos ligados. |
GET /v1/events | Eventos ligados para a sua loja e os campos que cada um espera em data. |
GET /v1/messages/:id | Estado de uma mensagem que você enviou. |
{ "error": { "code": "consent_required", "message": "..." } }
| Código | HTTP | O que fazer |
|---|---|---|
unauthorized | 401 | Credencial ausente, errada ou mal formada. |
key_revoked | 401 | A credencial foi revogada. Peça outra. |
merchant_paused | 403 | Os envios da sua loja estão pausados (falhas ou pedidos de saída em excesso). A mensagem diz o motivo; fale conosco. |
package_exhausted | 403 | O pacote de mensagens do mês acabou (ou não há pacote). Contrate um pacote para voltar a enviar; a mensagem não fica em fila. |
rate_limited | 429 | Espere o Retry-After e tente de novo. |
quota_exceeded | 429 | Cota do dia da sua loja acabou. |
invalid_phone | 400 | Telefone fora do formato aceito. |
invalid_request | 400 | Corpo inválido, loja em data, ou reference faltando onde é obrigatório. |
event_not_configured | 404 | Esse evento não existe no catálogo. |
event_disabled | 403 | O evento existe, mas não está ligado para a sua loja. |
template_not_approved | 409 | A Meta ainda não aprovou o template desse evento. Raro; fale conosco. |
missing_variables | 422 | Faltou campo em data. A mensagem diz qual. |
consent_required | 403 | Primeiro envio da sua loja para esse número exige o objeto consent. |
recipient_opted_out | 403 | A pessoa pediu para não receber. Não insista. |
recipient_rate_limited | 429 | Esse número já recebeu avisos demais nas últimas 24 horas, somando todas as lojas. |
already_sent | 409 | Evento de pagamento pendente já saiu para esse pedido. |
idempotency_conflict | 409 | Mesma Idempotency-Key com corpo diferente. |
O serviço é pré-pago: sua loja contrata um pacote de N mensagens por mês fechado (1 a 30/31). Pacotes contratados no mesmo mês somam; o que não for usado não passa para o mês seguinte. Conta mensagem aceita (202) de credencial de produção; a credencial de teste não consome. Esgotou, a API devolve 403 package_exhausted e a mensagem não sai nem fica em fila. GET /v1/health mostra o consumo (package: contratado, usado, restante) para o seu sistema acompanhar.
403 é proibição, não fila.reference. É o que torna o webhook útil sem você guardar os nossos ids.