Guías
Idempotencia
Cómo usar la cabecera Idempotency-Key para reintentar el alta de un aviso sin crear duplicados, cuánto dura y qué significan los 409.
Última revisión: 1 de octubre de 2026
El problema
Envías un aviso y la conexión se corta antes de recibir la respuesta. ¿Se creó o no? Si lo vuelves a enviar sin más, puede que tengas dos avisos y que salgan dos unidades al mismo domicilio. Si no lo envías, puede que el paciente se quede sin visita.
La cabecera Idempotency-Key resuelve esto: con ella, repetir la misma alta es seguro.
Cómo funciona
Genera un identificador único para cada alta en tu sistema y envíalo en la cabecera Idempotency-Key de POST /visits. Si tienes que repetir la petición, repítela con la misma clave y el mismo cuerpo.
curl -X POST "$SERAD_API_URL/visits" \
-H "X-Api-Key: $SERAD_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: crm-exp-2026-004512-1" \
-d @aviso.json| Situación | Respuesta |
|---|---|
| Primera vez que usas la clave | 201 Created con el aviso nuevo. |
| Repites la clave con el mismo cuerpo | 200 OK con el mismo aviso (no se crea otro) y la cabecera Idempotent-Replayed: true. |
| Repites la clave con otro cuerpo | 409 con el tipo /errors/provider-api/idempotency-key-reused. |
| Repites la clave mientras la primera petición aún se está procesando | 409 con el tipo /errors/provider-api/idempotency-in-progress. Espera unos segundos y reintenta. |
La primera petición falló (por ejemplo, un 400 de validación) | La clave queda libre: puedes corregir el cuerpo y reutilizarla. |
- La clave es tuya: hasta 200 caracteres, cualquier texto. Más larga,
400con el tipo/errors/provider-api/idempotency-key-invalid. - Las claves valen por API key: la misma
Idempotency-Keyenviada con dos claves de API distintas son dos operaciones distintas. - Se recuerdan durante 24 horas. Pasado ese tiempo, la misma clave crearía un aviso nuevo.
- «El mismo cuerpo» se compara por su contenido JSON, no por los bytes: el orden de los campos o los espacios no importan.
Cómo elegir la clave
La clave tiene que identificar la intención de crear este aviso, no la petición HTTP:
- ✅ Algo que ya tienes y que es único para ese aviso:
crm-<nº de expediente>-<nº de aviso del expediente>, o un UUID que generas y guardas junto al aviso antes de llamar a la API. - ❌ Un UUID nuevo en cada intento: entonces cada reintento es una alta nueva y la idempotencia no sirve de nada.
- ❌ Solo el nº de expediente, si un mismo expediente puede tener varios avisos (por ejemplo, una visita hoy y una cura la semana que viene).
Reintentos seguros
Con la clave, la estrategia de reintento de un alta queda así:
- Genera y guarda la
Idempotency-Keycon el aviso pendiente en tu base de datos. - Envía
POST /visits. - Si la respuesta es
201o200: guarda eliddel aviso. Listo. - Si es un error de red, un tiempo de espera agotado, un
429o un5xx: reintenta con la misma clave y el mismo cuerpo, con espera exponencial (ver límites de uso). - Si es un
409 idempotency-in-progress: espera unos segundos y reintenta igual. - Si es un
400,401,403o409 idempotency-key-reused: no reintentes; es un error que hay que corregir.
¿Falta algo o algo no cuadra con lo que ves? Escribe al equipo técnico: info@saludenruta.es.
