Skip to main content
Toda automação com gatilho webhook tem um link só dela. O seu sistema faz POST nesse link pra iniciar a automação, já com a cobrança, e depois faz outro POST no mesmo link pra avisar se o cliente pagou. Com isso a automação sabe “pagou / não pagou” sem você mapear variáveis nem chamar outra API.
Copie o link pronto na tela da automação; o token tem 43 caracteres depois de ara_hook_.
O link não usa API key: o token na URL é a credencial. Trate o link como um segredo. Se ele vazar, gere outro no dashboard, na tela da automação. O link antigo para de funcionar na hora.

Exemplo completo

Assinatura mensal por Pix. O seu sistema gera o Pix no seu PSP e entrega pra Arara; a automação cobra, espera e agradece. Se nada chegar em 1 hora, manda um lembrete.

1. A automação

O primeiro template é um template de cobrança. Como a cobrança vem no corpo do POST, o passo não precisa do molde charge com {{variaveis}}: ele usa a cobrança recebida. A automação nasce desligada. Ligue com PUT /v1/automations/{id}/active e { "active": true }. Depois copie o link na tela da automação, no dashboard.

2. Iniciar com a cobrança

3. Avisar que pagou

Quando o webhook do seu PSP confirmar o pagamento:
O cartão ganha o selo de pago e a execução segue pelo caminho paid. Se esse POST não chegar em 60 minutos, ela segue por unpaid.

Os dois corpos

O link aceita dois corpos. Com phone, inicia uma execução. Com referenceId e status na raiz, atualiza o pagamento.

Iniciar

Resposta 202: Valem as mesmas conferências do envio pela API. A Arara não guarda o código Pix nem o link depois do envio. Sem charge, o link só inicia a automação com as variables.

Atualizar o pagamento

Resposta 200:

O passo wait_payment

“Esperar pagamento”. Para a execução até a cobrança ter um resultado, ou até o prazo acabar. Se a cobrança já está paga quando a execução chega no passo, ela vai direto pra paid. Enquanto a execução espera, as mensagens do cliente seguem o caminho normal (Brain ou caixa de entrada). O passo não consome as respostas, diferente do question. No histórico, a execução fica com status WAITING_PAYMENT e gera os eventos PAYMENT_WAITING, PAYMENT_CONFIRMED e PAYMENT_NOT_CONFIRMED.

Assinatura (opcional)

Por padrão, quem tem o link consegue chamar. Pra exigir prova de que a chamada veio do seu sistema, ligue Exigir assinatura na tela da automação e copie o secret. Ele aparece uma vez só.
Ligue a assinatura sempre que o link for usado pra marcar cobrança como paga.
Com a assinatura ligada, toda chamada precisa do header:
<hex> é o HMAC-SHA256 do corpo cru da requisição, com o secret como chave, em hexadecimal. Assine exatamente os bytes que você envia: serialize o JSON uma vez, assine essa string e mande a mesma string.
Guarde o link e o secret em variáveis de ambiente, nunca no código nem no front-end. Pela API: PUT /v1/automations/{id}/hook/signature com { "enabled": true } liga a assinatura, e POST /v1/automations/{id}/hook/regenerate gera um link novo.

Idempotência

  • Iniciar: mande o header Idempotency-Key. Sem ele, o charge.referenceId faz o papel. Chamada repetida responde 202 com "status": "duplicate" e não envia outra cobrança.
  • Atualizar: repetir o mesmo status responde 200 com { "status": "unchanged" }. Pode reenviar sem medo quando o seu PSP repetir o webhook.
  • Um status final diferente depois de outro status final é recusado com CHARGE_ALREADY_SETTLED.

Erros

Todo erro segue o formato padrão, com o código em error.code:
paid, canceled e expired são finais. failed não é: uma cobrança que falhou ainda pode ser paga. Veja a lista de erros.

Com n8n

São dois nós HTTP Request, os dois apontando pro mesmo link.
  1. Iniciar. Depois do nó que cria o Pix no seu PSP: método POST, URL do link, corpo JSON com phone, variables e charge, preenchidos com a saída do nó do PSP. Adicione o header Idempotency-Key com o número do pedido.
  2. Avisar o pagamento. Num segundo workflow, que começa no nó Webhook que recebe o aviso do seu PSP: método POST, mesma URL, corpo { "referenceId": "...", "status": "paid" }.
Com a assinatura ligada, ponha antes de cada HTTP Request um nó Crypto (ação HMAC, tipo SHA256, encoding HEX, o secret como chave) sobre a string do corpo, ou calcule num nó Code (Function). Envie o resultado no header X-Arara-Signature com o prefixo sha256=. No HTTP Request, mande o corpo como texto cru (Raw, application/json) usando a mesma string que foi assinada. Se o n8n serializar o JSON de novo, a assinatura não confere. Guarde o link e o secret em credenciais ou variáveis do n8n, não no texto do nó.

Outros caminhos

  • Gatilhos charge.paid e charge.expired. Iniciam uma automação quando qualquer cobrança da conta chega nesse status, venha de onde vier (conversa, template, automação ou link). A execução começa com as variáveis reference_id, amount_cents e description. Serve pra um pós-venda único, separado da automação que cobrou.
  • Webhook da Arara pro seu backend. Os eventos charge.* avisam o seu sistema de cada mudança de status.
  • Endpoint da organização. O endpoint de recuperação com o header X-Arara-Event continua funcionando como antes.

Como testar

  1. Crie a automação com "timeoutMinutes": 1 no wait_payment e ligue.
  2. Copie o link no dashboard.
  3. Faça o POST de início com o seu próprio telefone e um Pix válido. Confira o 202 e o cartão no WhatsApp.
  4. Faça o POST com "status": "paid". Confira o selo de pago, runResumed: true e a mensagem do caminho paid.
  5. Repita o mesmo POST: a resposta é { "status": "unchanged" }.
  6. Inicie outra execução, com outro referenceId, e não avise o pagamento. Depois de 1 minuto chega a mensagem do caminho unpaid.
  7. Abra GET /v1/automations/{id}/runs/{runId}/events e confira a ordem: CHARGE_SENT, PAYMENT_WAITING e PAYMENT_CONFIRMED ou PAYMENT_NOT_CONFIRMED.
  8. Se ligou a assinatura, mande uma chamada sem o header e confira o HOOK_SIGNATURE_INVALID.
Pra criar, editar e ligar a automação pela API, veja Automações pela API.