Tots els errors de l'API tenen el mateix format JSON i un codi estable que pots fer servir al teu codi. El text de message és en anglès i pot canviar, i els missatges de details en errors de validació surten en l'idioma per defecte de la plataforma (avui català), no en el del club ni en anglès; programa contra code i contra l'estat HTTP, no contra el missatge.
Format
{
"error": {
"code": "validation_failed",
"message": "The given data was invalid.",
"details": {
"ends_at": ["L’hora de fi ha de ser posterior a l’hora d’inici."]
}
}
}
code: identificador estable ensnake_case.message: descripció llegible en anglès. No la mostris tal qual als teus usuaris.details: sempre present; és{}quan no hi ha res a afegir. Avalidation_failed, conté els errors per camp; els textos són en l'idioma per defecte de la plataforma (a l'exemple, català), així que no programis contra ells: fes servir el nom del camp.
Codis
| Codi | HTTP | Quan passa | Què fer |
|---|---|---|---|
unauthenticated |
401 | Falta el token, no existeix o no és vàlid. La resposta inclou WWW-Authenticate: Bearer. |
Revisa la capçalera Authorization: Bearer …. |
token_expired |
401 | La credencial ha caducat. | Crea una credencial nova al tauler. |
token_revoked |
401 | La credencial ha estat revocada. | Crea una credencial nova al tauler. |
feature_disabled |
403 | El club no té activada la funció integrations. |
Demana-la a l'equip de Pranarp Club. |
insufficient_ability |
403 | La credencial no té el permís necessari. details.required indica quin. |
Crea una credencial amb aquest permís. |
space_not_allowed |
403 | La credencial no pot fer servir aquest espai. details.space_id indica quin. |
Amplia els espais de la credencial o fes-ne servir un altre. |
not_owner |
403 | Intentes modificar o cancel·lar una reserva que no ha creat aquesta credencial, sense el permís bookings:write_all. |
Fes servir la credencial que la va crear o concedeix bookings:write_all. |
booking_not_modifiable |
403 | La reserva prové d'una activitat del club i no es pot modificar per l'API. | No reintentis; gestiona-la des del tauler. |
not_found |
404 | El recurs no existeix, és inactiu/eliminat o és d'un altre club. | Revisa l'identificador. |
slot_unavailable |
409 | La franja ja no està disponible (reserva, bloqueig o aforament). | Consulta la disponibilitat i tria'n una altra. |
idempotency_conflict |
409 | Mateixa Idempotency-Key amb un altre cos, o la petició original encara és en curs. |
Vegeu idempotència. |
validation_failed |
422 | Dades invàlides. details llista els errors per camp. |
Corregeix els camps indicats. |
player_not_found |
422 | Alguna referència external_ref de players no està sincronitzada. details.players llista les que falten. |
Sincronitza-les abans amb PUT /players/{external_ref}. |
rate_limited |
429 | Has superat les 120 peticions per minut. Inclou Retry-After. |
Espera i reintenta; vegeu límits de ritme. |
Altres errors genèrics
No formen part dels codis anteriors, però tenen el mateix format:
| Codi | HTTP | Significat |
|---|---|---|
forbidden |
403 | Fallada d'autorització genèrica fora dels casos anteriors. |
method_not_allowed |
405 | El mètode no existeix per a aquella ruta; la capçalera Allow llista els admesos. |
http_error |
altres 4xx | Un altre error de client sense codi específic. |
server_error |
500 | Error intern. Reintenta amb backoff; si persisteix, contacta amb nosaltres. |
Gestió recomanada
- 4xx (excepte 409 per conflicte temporal i 429): l'error és teu; reintentar sense canviar res donarà el mateix resultat.
- 429 i 5xx: reintenta amb espera exponencial (i
Retry-Afterquan existeixi), sempre amb la mateixaIdempotency-Keya les creacions. - 409
slot_unavailable: no és una fallada tècnica, és un conflicte de negoci normal. Torna a consultar la disponibilitat.
Exemple de 409 en crear una reserva:
curl -s -i -X POST "$PRANARP_URL/api/v1/bookings" \
-H "Authorization: Bearer $PCK_TOKEN" \
-H "Content-Type: application/json" \
-d '{"space_id":7,"starts_at":"2026-10-22T18:00:00+02:00","ends_at":"2026-10-22T19:00:00+02:00","holder":{"name":"Laura Pons"}}'
{
"error": {
"code": "slot_unavailable",
"message": "The requested time slot is not available.",
"details": {}
}
}