Idempotencia
Evita duplicar comprobantes al reintentar: Idempotency-Key en POST /documentos/enviar y /guias/enviar, y clave natural serie+correlativo+tipo.
Si tu cliente HTTP se cae a mitad de un envío o reintentas el mismo POST, Facturalo no debe emitir dos veces el mismo comprobante. Hay dos capas de protección.
1. Clave natural (serie + correlativo + tipo)
Si ya existe un documento o guía con la misma empresa, entorno, tipo, serie y correlativo, el envío no crea otro: responde el estado actual del existente y marca la respuesta con el header X-Idempotent-Replayed: true.
2. Header Idempotency-Key (recomendado)
Envía un identificador único de tu lado (por ejemplo el id de la orden en tu ERP) en el header Idempotency-Key. La primera respuesta exitosa (2xx) se guarda 24 horas. El mismo key + el mismo cuerpo devuelve la respuesta original con X-Idempotent-Replayed: true. El mismo key con otro cuerpo responde 409.
-primary-dark)">curl -X POST https://api.facturalo.pe/api/v3/documentos/enviar \
-H "Authorization: sk_live_…" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: orden-1042" \
-d @factura.jsonawait facturalo.documentos.enviar(documento, {
idempotencyKey: "orden-1042",
});$facturalo->documentos->enviar($documento, webhook: false, establecimiento: null, idempotencyKey: 'orden-1042');Dónde aplica
POST /documentos/enviar y POST /guias/enviar. También acepta X-Idempotency-Key o el campo idempotencyKey / idempotency_key en el JSON.Headers de respuesta
| Header | Significado |
|---|---|
Idempotency-Key | Eco de la clave que enviaste. |
X-Idempotent-Replayed: true | Se devolvió una respuesta ya conocida (replay), no una emisión nueva. |
X-Idempotent-Replayed: false | Primera vez que se guardó esa clave. |