Pular para o conteúdo
Menu da documentação

Guias

Idempotência

Rede cai, timeout estoura, processo reinicia. A Idempotency-Key deixa você repetir um POST sem cobrar nem cancelar duas vezes. Referência: referência da API.

A regra em uma frase

Uma chave por operação lógica, gravada antes de enviar, reaproveitada em toda repetição da mesma operação.

  • "Operação lógica" é "cobrar a guia 778899 do contribuinte X", não "a requisição HTTP número 3".
  • Ela é obrigatória em todo POST sob /v1 (criar e cancelar). Sem ela: 400 idempotency_key_required.
  • Até 255 caracteres. Use um UUID.
  • Vale 24 h e é do seu tenant: a mesma chave em outro tenant é outra requisição.

O que o Pagaki faz com a chave

Você envia O Pagaki responde
Chave nova Executa e guarda a resposta
Mesma chave, mesma rota, mesmo corpo, até 24 h A resposta original, idêntica, sem executar de novo, com Idempotent-Replayed: true
Mesma chave com outro corpo ou em outra rota 422 idempotency_key_reused
Mesma chave enquanto a primeira ainda roda 409 idempotency_key_in_progress

O corpo é comparado como JSON normalizado: ordem das chaves e espaços não contam.

Quando repetir com a mesma chave, quando usar outra

O que aconteceu Mesma chave?
Timeout, conexão caiu, sem resposta Sim: se a primeira chegou a executar, você recebe a resposta dela
500 internal_error Sim: o 500 não fica guardado
409 idempotency_key_in_progress Sim, depois de alguns segundos
429 rate_limited Sim, depois do Retry-After: a requisição barrada não reservou a chave
422 validation_failed Pode: corrija o corpo e reenvie; a validação não fica guardada
422 no_gateway_available, gateway_invalid_data, cancel_not_supported, 409 invalid_state Não: a resposta fica guardada. Corrija a causa e use uma chave nova
502 gateway_rejected ou gateway_failure Não: o 502 fica guardado. Na criação, o pagamento já está failed; crie outro com chave nova. No cancelamento, repita com chave nova
201/202/200 Não há o que repetir. Se repetir, recebe a mesma resposta

Exemplo: criar com repetição segura

KEY=$(uuidgen)   # guarde KEY junto da guia antes de chamar
for i in 1 2 3; do
  curl -s --max-time 15 https://api.sandbox.pagaki.com.br/v1/payments \
    -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
    -H "Idempotency-Key: $KEY" \
    -d '{"method":"pix","amount":12550,"external_id":"guia-778899","payer":{"name":"Fulano de Tal","document":"12345678909"}}' \
    && break
  sleep $((i * 2))
done

Erros comuns

  • Gerar a chave dentro do laço de repetição. Cada tentativa vira um pagamento novo. Gere uma vez, fora do laço, e grave.
  • Reaproveitar a chave da criação no cancelamento. Dá 422 idempotency_key_reused: são operações diferentes.
  • Usar o external_id como chave. Funciona só se você nunca cobrar a mesma guia duas vezes (uma segunda via, por exemplo, precisa de chave nova). Prefira um UUID por tentativa de cobrança e guarde o external_id à parte.
  • Contar com a chave depois de 24 h. Passado esse prazo, a mesma chave é uma requisição nova.

Webhooks

A idempotência de quem recebe é outra: o mesmo evento pode chegar mais de uma vez, e você deduplica pelo id do evento (evt_…). Ver webhooks.