Referencia de errores
Taxonomía consolidada de las formas de error que podés recibir. Código HTTP a la izquierda, body canónico a la derecha.
Autenticación
| HTTP | Body | Causa |
|---|---|---|
| 401 | {"message": "API key missing"} | No Authorization / X-API-Key header. |
| 401 | {"message": "Invalid API key"} | Hash mismatch, revoked, or expired. |
| 404 | — | Cross-tenant resource or missing. 404 never 403. |
Validación
Standard Laravel-shaped 422s:
json
{
"message": "The pickup location field is required. (and 2 more errors)",
"errors": {
"pickup_location": ["The pickup location field is required when pickup lat is not present."],
"pickup_date": ["The pickup date field is required."]
}
}
Cupones
| HTTP | Body |
|---|---|
| 404 | {"error": "coupon_not_found"} |
| 422 | {"error": "coupon_not_valid"} |
| 422 | {"error": "coupon_brand_or_rate_mismatch"} |
| 422 | {"error": "coupon_country_mismatch"} |
| 422 | {"error": "coupon_days_out_of_range"} |
| 422 | {"error": "coupon_validation_failed", "reason": "..."} |
Errores del GDS upstream
Cuando el proveedor rechaza un request, GreenFlow expone el mensaje tal cual dentro de error.message. Estos son 422, no 5xx — el proveedor dijo que no, tu payload era sintácticamente válido.
json
{ "error": { "message": "RATE NOT AVAILABLE FOR THIS CAR CLASS" } }
Estados intra-meta (no HTTP)
Dentro de meta.{vendor}.reason en respuestas de /fleet/list, las entradas por marca llevan una clave reason cuando la marca aportó cero vehículos. No son errores HTTP: la respuesta es 200, pero una o más marcas quedaron silenciosas para ese query.
| reason | Notas |
|---|---|
| no_offices_for_pickup | Office code doesn't apply to this brand. |
| no_offices_for_pickup_within_radius | No office found in pickup_radius_km for lat/lng search. |
| circuit_open | Adapter circuit breaker is open. |
| provider_error | Exception parsing the provider response. See errors.{vendor}. |
| provider_returned_empty | Provider returned zero vehicles. |