Referência de erros
Taxonomia consolidada dos formatos de erro que você pode receber. Código HTTP à esquerda, body canônico à direita.
Autenticação
| 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. |
Validação
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."]
}
}
Cupons
| 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": "..."} |
Erros do GDS upstream
Quando o provedor rejeita uma requisição, GreenFlow expõe a mensagem literalmente dentro de error.message. São 422, não 5xx — o provedor disse não, seu payload estava sintaticamente válido.
json
{ "error": { "message": "RATE NOT AVAILABLE FOR THIS CAR CLASS" } }
Estados intra-meta (não HTTP)
Dentro de meta.{vendor}.reason nas respostas de /fleet/list, as entradas por marca carregam uma chave reason quando a marca contribuiu com zero veículos. Não são erros HTTP: a resposta é 200, mas uma ou mais marcas ficaram silenciosas para essa 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. |