Skip to content

Webhooks ​

A NomadPay envia webhooks (callbacks) para o seu sistema sempre que há uma atualização importante no status de uma cobrança ou de um saque.

Configuração ​

Você pode configurar a sua Webhook URL no painel da NomadPay, acessando API > Webhook URL. Após configurar, você pode validar se sua aplicação está respondendo corretamente clicando no botão Enviar Teste (ping), que disparará um evento ping para a URL informada. O painel exibirá o histórico completo dos webhooks disparados, incluindo carga útil (payload), código de status e tempo de resposta.

Ao receber uma requisição da NomadPay, a sua aplicação deve retornar o status HTTP 200 OK.

Segurança (Assinatura) ​

Para garantir que a requisição partiu legitimamente da NomadPay, nós enviamos os seguintes cabeçalhos em todas as requisições:

http
X-NomadPay-Event: <evento>
X-Signature: <hmac-sha256-hex>
Content-Type: application/json

O valor de X-Signature é um HMAC SHA256 do corpo (payload) da requisição — excluindo o campo signature presente no body — gerado usando o seu Webhook Secret (disponível no seu dashboard). O campo signature também é incluído no próprio body do payload com o mesmo valor.

⚠️ API REST x Webhooks ​

A NomadPay possui dois mecanismos diferentes de integração:

API RESTWebhooks
Utilizada quando sua aplicação faz uma requisição para a NomadPay.Utilizado quando a NomadPay envia automaticamente um evento para sua URL configurada.
Você inicia a comunicação.A NomadPay inicia a comunicação.
Exemplo: GET /charges/:idExemplo: evento charge.paid

Esses formatos não são iguais.

A resposta de um endpoint REST possui uma estrutura própria.

Os Webhooks possuem outro formato, contendo informações do evento ocorrido.

Sempre utilize o campo event para identificar qual evento foi recebido.

Cada evento representa uma mudança de estado da transação e deve ser tratado individualmente pela sua aplicação.

Exemplo de resposta da API REST ​

json
{
  "id": "chg_xxxxx",
  "amount": 100.50,
  "description": "Pedido #123",
  "status": "PAID",
  "pix_code": "...",
  "created_at": "...",
  "paid_at": "..."
}

Exemplo de Webhook ​

json
{
  "event": "charge.paid",
  "event_id": "evt_xxxxxxxxx",
  "timestamp": "2026-07-08T16:30:00.000Z",
  "charge_id": "chg_xxxxx",
  "status": "PAID",
  "amount": 100.50,
  "net_amount": 98.40,
  "e2e_id": "E123...",
  "endToEndId": "E123...",
  "txid": "TX123...",
  "signature": "..."
}

O payload acima é enviado automaticamente para a URL de Webhook cadastrada no painel da NomadPay.

Quando cada Webhook é enviado ​

EventoQuando é disparado
charge.paidQuando uma cobrança muda para PAID.
withdrawal.pendingAssim que o saque é solicitado.
withdrawal.processingQuando o saque começa a ser processado.
withdrawal.paidQuando o saque é concluído com sucesso.
withdrawal.failedQuando o saque falha.
withdrawal.cancelledQuando o saque é cancelado.

Eventos Disponíveis ​

charge.paid ​

Enviado quando uma cobrança PIX é confirmada como paga com sucesso.

json
// Headers:
// X-NomadPay-Event: charge.paid
// X-Signature: <hmac-sha256-hex>
// Content-Type: application/json

// Payload:
{
  "event": "charge.paid",
  "event_id": "evt_a1b2c3d4e5f6g7h8i9j0",
  "timestamp": "2026-06-27T12:05:00.000Z",
  "charge_id": "chg_xxxxxxx",
  "status": "PAID",
  "amount": 100.50,
  "net_amount": 100.50,
  "e2e_id": "E9999999920260627120500000000000",
  "endToEndId": "E9999999920260627120500000000000",
  "txid": "chg_xxxxxxx",
  "signature": "<hmac-sha256-hex>"
}

Status possíveis da cobrança:

StatusDescrição
PENDINGAguardando pagamento.
PAIDPaga com sucesso. O webhook charge.paid é disparado neste momento.
EXPIREDExpirada sem pagamento.
CANCELLEDCancelada.

O webhook charge.paid é enviado somente quando a cobrança muda para PAID.


Eventos de Saque (PIX Out) ​

Ao longo do ciclo de vida de um saque, sua aplicação receberá webhooks em tempo real. Cada mudança de status gera um evento distinto.

Eventos disparados ​

EventoQuando é enviado
withdrawal.pendingDisparado imediatamente após a criação do saque.
withdrawal.processingDisparado quando o saque sai da fila e começa a ser processado no banco.
withdrawal.paidDisparado quando o PIX é liquidado com sucesso na conta informada.
withdrawal.failedDisparado quando ocorre um erro bancário (ex: chave PIX inválida). O campo reason conterá o motivo.
withdrawal.cancelledDisparado caso a operação seja cancelada. O campo reason pode conter o motivo.

Status possíveis do saque ​

StatusDescrição
PENDINGO saque entrou na fila de processamento e o valor foi reservado.
PROCESSINGO saque está sendo ativamente processado com o banco.
PAIDO saque foi liquidado com sucesso na conta informada.
FAILEDOcorreu uma falha no processamento bancário. O valor é estornado.
CANCELLEDA operação foi cancelada. O valor é estornado.

withdrawal.pending ​

json
// Headers:
// X-NomadPay-Event: withdrawal.pending
// X-Signature: <hmac-sha256-hex>
// Content-Type: application/json

// Payload:
{
  "event": "withdrawal.pending",
  "event_id": "evt_a1b2c3d4e5f6g7h8i9j0",
  "timestamp": "2026-06-27T17:00:00.000Z",
  "company_id": "comp_xxxxxxx",
  "withdrawal_id": "wd_a1b2c3d4e5f6",
  "withdrawal_reference": "WDR_A1B2C3D4E5F67890",
  "status": "PENDING",
  "amount": 250.00,
  "retry_count": 0,
  "signature": "<hmac-sha256-hex>"
}

withdrawal.processing ​

json
// Headers:
// X-NomadPay-Event: withdrawal.processing
// X-Signature: <hmac-sha256-hex>
// Content-Type: application/json

// Payload:
{
  "event": "withdrawal.processing",
  "event_id": "evt_b2c3d4e5f6g7h8i9j0k1",
  "timestamp": "2026-06-27T17:02:00.000Z",
  "company_id": "comp_xxxxxxx",
  "withdrawal_id": "wd_a1b2c3d4e5f6",
  "withdrawal_reference": "WDR_A1B2C3D4E5F67890",
  "status": "PROCESSING",
  "amount": 250.00,
  "retry_count": 0,
  "signature": "<hmac-sha256-hex>"
}

withdrawal.paid ​

json
// Headers:
// X-NomadPay-Event: withdrawal.paid
// X-Signature: <hmac-sha256-hex>
// Content-Type: application/json

// Payload:
{
  "event": "withdrawal.paid",
  "event_id": "evt_c3d4e5f6g7h8i9j0k1l2",
  "timestamp": "2026-06-27T17:05:00.000Z",
  "company_id": "comp_xxxxxxx",
  "withdrawal_id": "wd_a1b2c3d4e5f6",
  "withdrawal_reference": "WDR_A1B2C3D4E5F67890",
  "status": "PAID",
  "amount": 250.00,
  "retry_count": 0,
  "signature": "<hmac-sha256-hex>"
}

withdrawal.failed ​

json
// Headers:
// X-NomadPay-Event: withdrawal.failed
// X-Signature: <hmac-sha256-hex>
// Content-Type: application/json

// Payload:
{
  "event": "withdrawal.failed",
  "event_id": "evt_d4e5f6g7h8i9j0k1l2m3",
  "timestamp": "2026-06-27T17:05:00.000Z",
  "company_id": "comp_xxxxxxx",
  "withdrawal_id": "wd_a1b2c3d4e5f6",
  "withdrawal_reference": "WDR_A1B2C3D4E5F67890",
  "status": "FAILED",
  "amount": 250.00,
  "retry_count": 0,
  "reason": "Chave PIX inválida ou inexistente.",
  "signature": "<hmac-sha256-hex>"
}

withdrawal.cancelled ​

json
// Headers:
// X-NomadPay-Event: withdrawal.cancelled
// X-Signature: <hmac-sha256-hex>
// Content-Type: application/json

// Payload:
{
  "event": "withdrawal.cancelled",
  "event_id": "evt_e5f6g7h8i9j0k1l2m3n4",
  "timestamp": "2026-06-27T17:05:00.000Z",
  "company_id": "comp_xxxxxxx",
  "withdrawal_id": "wd_a1b2c3d4e5f6",
  "withdrawal_reference": "WDR_A1B2C3D4E5F67890",
  "status": "CANCELLED",
  "amount": 250.00,
  "retry_count": 0,
  "reason": "Operação cancelada pelo administrador.",
  "signature": "<hmac-sha256-hex>"
}