Una xarxa inestable pot deixar-te sense saber si una petició s'ha arribat a processar. Si reintentes un POST /bookings sense més, podries crear dues reserves. La capçalera Idempotency-Key et permet reintentar amb seguretat.
Com es fa servir
Genera una clau única per intenció (un UUID per cada reserva que vols crear) i envia-la a la capçalera:
curl -s -X POST "$PRANARP_URL/api/v1/bookings" \
-H "Authorization: Bearer $PCK_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 3f1c9a5e-6c1b-4d57-9a2e-0e6f7d3a8b11" \
-d '{
"space_id": 7,
"starts_at": "2026-10-22T18:00:00+02:00",
"ends_at": "2026-10-22T19:00:00+02:00",
"external_ref": "comanda-9981",
"holder": { "name": "Laura Pons", "email": "laura@example.com" },
"price": { "amount_cents": 2400, "paid_externally": true }
}'
La capçalera és opcional, però molt recomanable a POST /bookings, que és l'única operació que l'admet. La resta d'operacions d'escriptura (PUT i DELETE de jugadors, PATCH i DELETE de reserves) ja es poden repetir sense efectes addicionals.
Què passa en repetir la petició
| Situació | Resultat |
|---|---|
| Mateixa clau i mateix cos, l'original ha acabat bé (2xx) | Es retorna la resposta desada, amb el mateix estat i cos i la capçalera Idempotent-Replayed: true. No es crea res de nou. |
| Mateixa clau però cos diferent | 409 idempotency_conflict. |
| Mateixa clau mentre la petició original encara és en curs | 409 idempotency_conflict. Espera un moment i reintenta. |
| Clau de més de 255 caràcters o buida | 422 validation_failed. |
Detalls a tenir en compte:
- Abast: les claus són per credencial. Dues credencials diferents poden fer servir la mateixa clau sense interferir.
- Durada: la clau i la seva resposta es conserven 24 hores. Passat aquest temps, la clau es pot reutilitzar.
- Només es desen les respostes correctes (2xx). Si l'original ha fallat (per exemple
409 slot_unavailableo422), la clau s'allibera i pots reintentar amb la mateixa clau, idealment després de corregir-ne la causa. - Peticions abandonades: una clau que fa més de 60 segons que és «en curs» sense resposta es considera abandonada i es pot reutilitzar.
- En comparar cossos no importa l'ordre de les propietats del JSON.
Bones pràctiques
- Desa la clau juntament amb la intenció al teu sistema abans d'enviar la petició, per reutilitzar-la si cal reintentar.
- Reintenta amb la mateixa clau davant d'errors de xarxa,
5xxi429(respectaRetry-After; vegeu límits de ritme). - Si reps
409 idempotency_conflict, no canviïs el cos amb la mateixa clau: fes servir una clau nova si realment vols una altra reserva. - Si la resposta inclou
Idempotent-Replayed: true, tracta-la com un èxit: la reserva ja existia.