Idempotência
A API suporta idempotência para repetir solicitações com segurança, sem executar a mesma operação duas vezes. Útil quando uma chamada é interrompida em trânsito e você não recebe resposta — por exemplo, uma requisição para criar uma conta a pagar que cai por erro de rede pode ser repetida com a mesma chave, garantindo que apenas um registro seja criado.
Como usar
Envie o cabeçalho X-Idempotency-Key: <chave> em qualquer requisição POST, PUT ou PATCH. A chave é livre, gerada pelo seu lado. Recomendamos UUID v4 ou outra string aleatória com entropia suficiente para evitar colisões.
curl -i \
-H "Authorization: Bearer $KOBANA_TOKEN" \
-H 'Content-Type: application/json' \
-H 'X-Idempotency-Key: 8c0f5d6e-3f8b-4cb5-9a47-d8f5b15e9b21' \
-H 'User-Agent: Meu Sistema (contato@example.com)' \
-d '{
"account_id": "00000000-0000-0000-0000-000000000001",
"description": "Aluguel Janeiro/2026",
"amount": "3500.00",
"due_date": "2026-01-10"
}' \
-X POST 'https://api.finance.kobana.com.br/v1/payables'
Como funciona
Quando o servidor recebe uma requisição com X-Idempotency-Key:
- Reserva a chave atomicamente, escopada ao workspace. Dois workspaces diferentes podem usar a mesma chave sem conflito.
- Calcula a impressão digital da requisição — SHA-256 de
método + caminho + corpo bruto. Esse hash é guardado junto com a chave. - Executa o handler. Se ele retornar uma resposta, o servidor grava
status_code, corpo e cabeçalhos relevantes vinculados à chave. - Marca a chave como completa. Qualquer nova requisição com a mesma chave dentro de 24 horas recebe a resposta original verbatim — mesmo
status_code, mesmo corpo, mesmos cabeçalhos — acrescida do cabeçalhoX-Idempotency-Replayed: truepara indicar que se trata de uma reexecução.
A camada salva o resultado independentemente de ter sido sucesso ou falha. Retries com a mesma chave retornam o mesmo resultado, incluindo erros 5xx.
Limites
- Tamanho máximo da chave: 255 caracteres.
- Retenção: chaves expiram automaticamente 24 horas após a criação.
- Escopo: por workspace. Uma chave usada em um workspace não interfere em outro.
- Caracteres aceitos: qualquer string UTF-8 imprimível.
Conflitos
Se a mesma chave for reutilizada com uma requisição diferente (qualquer mudança em método, caminho ou corpo), a API responde 409 conflict com details.reason = "idempotency_key_reused".
{
"error": {
"code": "conflict",
"message": "X-Idempotency-Key was already used with different request parameters. Reuse the original parameters or generate a new key.",
"details": { "reason": "idempotency_key_reused" }
}
}
Métodos aceitos
| Método | Aceita X-Idempotency-Key? |
|---|---|
POST | ✅ Sim |
PATCH | ✅ Sim |
GET | ❌ Não (já é idempotente por definição) |
DELETE | ❌ Não (já é idempotente por definição) |
Boas práticas
- Uma chave por operação lógica. Não reutilize a mesma chave para criar dois recursos diferentes — você receberá
409 conflict. - Persista a chave junto com o estado da operação no seu lado, para que o retry depois de crash ou reinício use a mesma chave.
- Combine com backoff exponencial ao receber
5xxou timeout. - Limpe a chave depois de 24 horas. Não há ganho em mantê-la no seu lado após esse prazo.