Notifica WS Órbita

API do Notifica WS Órbita

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.

Como funciona

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."

Antes de começar você precisa de: a credencial da sua loja (nós entregamos na adesão, junto com a lista de eventos ligados) e o opt-in no seu checkout, com um texto que diga que os avisos chegam pelo número do Notifica WS Órbita.

Endereço e autenticação

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".

Catálogo de eventos

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.

EventoCampos extras em dataTexto
pedido_recebidototalOlá {{nome}}! A *{{loja}}* recebeu seu pedido *{{pedido}}*. Valor: {{total}} Avisaremos por aqui sobre as próximas etapas.
pedido_confirmadoOlá {{nome}}! Seu pedido *{{pedido}}* na *{{loja}}* foi confirmado e segue para processamento. Avisaremos por aqui sobre as próximas etapas.
pagamento_pendente_pixvalidade · exige reference, sai 1 vez por pedidoOlá {{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_boletovencimento · exige reference, sai 1 vez por pedidoOlá {{nome}}. O boleto do pedido *{{pedido}}* na *{{loja}}* ainda está pendente. Vencimento: {{vencimento}} Se já pagou, desconsidere este aviso.
pagamento_aprovadoOlá {{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_recusadomotivo · 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_separacaoOlá {{nome}}! Seu pedido *{{pedido}}* na *{{loja}}* está em separação. Avisaremos por aqui sobre as próximas etapas.
nota_fiscal_emitidalink (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_enviadotransportadora, 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_entregaprevisao · 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_atrasadoprevisao · 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_realizadamotivo · 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_entregueOlá {{nome}}! O pedido *{{pedido}}* na *{{loja}}* foi entregue. Em caso de dúvida, entre em contato com a loja.
pedido_pronto_retiradalocal, horarioOlá {{nome}}! Seu pedido *{{pedido}}* na *{{loja}}* está pronto para retirada. Local: {{local}} Horário: {{horario}} Leve um documento com foto.
retirada_nao_realizadalocal, horarioOlá {{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_retiradoOlá {{nome}}! A retirada do pedido *{{pedido}}* na *{{loja}}* foi confirmada. Em caso de dúvida, entre em contato com a loja.
pedido_canceladomotivoOlá {{nome}}. O pedido *{{pedido}}* na *{{loja}}* foi cancelado. Motivo: {{motivo}} Em caso de dúvida, entre em contato com a loja.
devolucao_recebidaOlá {{nome}}! A *{{loja}}* recebeu a devolução referente ao pedido *{{pedido}}*. Avisaremos por aqui sobre as próximas etapas.
reembolso_em_processamentoOlá {{nome}}! O reembolso referente ao pedido *{{pedido}}* na *{{loja}}* está em processamento. Avisaremos por aqui quando for concluído.
reembolso_efetuadovalor, prazoOlá {{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.

Enviar

POST /v1/notify

curl -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"
    }
  }'
CampoObrigatórioDescrição
eventsimUm evento do catálogo, ligado para a sua loja.
tosimTelefone. Aceita qualquer formatação. Sem código de país, assumimos Brasil.
datasimnome, pedido e os campos extras do evento. Nunca mande loja: vem do seu cadastro.
referencerecomendadoIdentificação do pedido no seu sistema. Volta em todo webhook. Obrigatório nos eventos de pagamento pendente.
consent1º envioProva 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" }
202 não quer dizer que chegou. Quer dizer que aceitamos e enfileiramos. Número que não existe no WhatsApp responde 202 igual. O veredito vem depois, no webhook: message.delivered ou message.failed.

Idempotência

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.

Consentimento

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.

Trate o webhook contact.opted_out. Sem isso a sua tela continua dizendo "avisos ligados" para quem já saiu.

Respostas do cliente

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.

Receber de volta (webhooks)

Registramos a sua URL na adesão (ou depois, a pedido). Enviamos POST com JSON e assinatura:

EventoQuando
message.sentA mensagem foi aceita pelo WhatsApp.
message.deliveredChegou no aparelho.
message.readO cliente abriu.
message.failedNão foi entregue. Traz error.code e error.message.
message.inboundO cliente respondeu. Traz text.
button.clickedO cliente tocou num botão de link (rastreio, nota fiscal, pagamento). Traz link e url.
contact.opted_outO cliente pediu para parar. Traz to e reason. Exige ação sua.
contact.opted_inO 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" }

Como conferir a assinatura

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="
Os eventos não chegam em ordem garantida. Um 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ê.

Consultar

RotaO que devolve
GET /v1/healthEstado da sua loja no serviço (ativa ou pausada), limites e eventos ligados.
GET /v1/eventsEventos ligados para a sua loja e os campos que cada um espera em data.
GET /v1/messages/:idEstado de uma mensagem que você enviou.

Erros

{ "error": { "code": "consent_required", "message": "..." } }
CódigoHTTPO que fazer
unauthorized401Credencial ausente, errada ou mal formada.
key_revoked401A credencial foi revogada. Peça outra.
merchant_paused403Os envios da sua loja estão pausados (falhas ou pedidos de saída em excesso). A mensagem diz o motivo; fale conosco.
package_exhausted403O 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_limited429Espere o Retry-After e tente de novo.
quota_exceeded429Cota do dia da sua loja acabou.
invalid_phone400Telefone fora do formato aceito.
invalid_request400Corpo inválido, loja em data, ou reference faltando onde é obrigatório.
event_not_configured404Esse evento não existe no catálogo.
event_disabled403O evento existe, mas não está ligado para a sua loja.
template_not_approved409A Meta ainda não aprovou o template desse evento. Raro; fale conosco.
missing_variables422Faltou campo em data. A mensagem diz qual.
consent_required403Primeiro envio da sua loja para esse número exige o objeto consent.
recipient_opted_out403A pessoa pediu para não receber. Não insista.
recipient_rate_limited429Esse número já recebeu avisos demais nas últimas 24 horas, somando todas as lojas.
already_sent409Evento de pagamento pendente já saiu para esse pedido.
idempotency_conflict409Mesma Idempotency-Key com corpo diferente.

Pacote de mensagens

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.

Limites e boas práticas