POST com a mesma chave e a Repass garante que a operação rode no máximo uma vez, devolvendo a resposta original em qualquer reenvio.
Como funciona
Envie um headerIdempotency-Key em qualquer POST autenticado. Use um valor único por operação que você queira proteger: um UUID v4 é a escolha mais comum.
- Na primeira vez que a chave é vista, a requisição é processada normalmente e a resposta é gravada.
- Em reenvios com a mesma chave e o mesmo payload, a Repass devolve a resposta gravada (sem reexecutar a lógica de negócio) com o header
Idempotent-Replay: true.
A idempotência por header só atua em requisições
POST autenticadas que enviam um Idempotency-Key não vazio. GET, PUT e DELETE passam direto pelo mecanismo.Exemplo
Reenviar a mesma requisição com a mesma chave é seguro: a segunda chamada não cria uma segunda Conversão, apenas devolve a primeira resposta.Resposta (reenvio)
Escopo da chave
A unicidade daIdempotency-Key é por organização + usuário (escopo organizationId:userId). A mesma string de chave pode coexistir em organizações ou usuários diferentes sem colidir: cada tenant tem seu próprio espaço de chaves.
Isso significa que você não precisa coordenar a geração de chaves entre tenants: basta garantir que sejam únicas dentro do seu próprio escopo de credenciais.
O que conta como “a mesma requisição”
Além da chave, a Repass compara um hash do request:sha256("<método> <url> <body>"). O replay só acontece quando chave e payload coincidem.
- Mesma chave + mesmo payload → replay da resposta gravada.
- Mesma chave + payload diferente → erro
idempotency_key_reused(a chave já está vinculada a outra operação).
Ciclo de vida de uma chave
Pontos importantes do ciclo de vida:- Respostas
>= 500não são gravadas. O registro é descartado e a chave fica livre para uma nova tentativa. Falhas de servidor nunca “travam” uma chave. Reenvie à vontade. - Respostas
4xx(como400ou409) são gravadas como resultado idempotente. Um reenvio com a mesma chave devolve o mesmo erro determinístico via replay. - TTL de 24 horas. Após esse período a chave expira; o próximo
POSTcom ela inicia uma operação nova do zero.
Tratamento de erros
Erros de idempotência usam o envelope padrão de erro comtype: idempotency_error. Veja o formato completo em Erros.
409 idempotency_in_flight
O
idempotency_in_flight também protege contra corridas: se duas requisições com a mesma chave chegam ao mesmo tempo, apenas uma é processada e a outra recebe 409. Isso é esperado: reenvie a perdedora após a primeira concluir.Padrão de retry recomendado
Combine idempotência com retry e backoff exponencial. Como a chave é estável entre tentativas, reenviar é sempre seguro: você nunca duplica a operação.Retry com backoff
A mesma chave é mantida em todas as tentativas. Numa falha
5xx, o registro foi descartado e o reenvio reexecuta a operação. Num sucesso anterior que você não chegou a receber, o reenvio devolve a resposta gravada via replay. De qualquer forma, a operação acontece no máximo uma vez.Rotas que não suportam idempotência
Os fluxos públicos de tracking e ingestão não usam o headerIdempotency-Key: eles têm idempotência própria de negócio (por exemplo, deduplicação por sourceEventId). Estes prefixos são ignorados pelo mecanismo:
Para garantir exatamente-uma-vez em conversões server-to-server, use o campo
sourceEventId no corpo da requisição: ele deduplica por evento de origem. Veja Conversões server-to-server.Próximos passos
Erros
O envelope de erro único e todos os códigos da API.
IDs e recursos
Identificadores opacos com prefixo de tipo + ULID.
Conversões server-to-server
Deduplicação por sourceEventId em integrações de backend.
Integração básica
Primeiros passos para integrar com a API Repass.