Cupons
Os cupons de desconto se encaixam em /fleet/show (pré-visualização do preço) e em /bookings (aplicar na venda). A lógica de validação é compartilhada; os motivos de erro são estáveis.
POST /coupons/validate
Pré-verificação antes de mostrar um desconto na UI. Idempotente — audita cada tentativa mas não consome slot de uso.
bash
curl -X POST https://greenflow.live/api/v1/coupons/validate \
-H "Authorization: Bearer gfc_7s2wprmy_DWTZRBGBEV6La4dTOoFdMkEhWmWCsXdwc3zVMnqP" \
-H "Content-Type: application/json" \
-d '{
"code": "SUMMER25",
"brand": 11,
"rate": "011880",
"country_id": 31,
"days": 3
}'
json
{
"data": {
"code": "SUMMER25",
"discount_type": "percentage",
"discount_value": 25.0,
"currency": null,
"discount_code": "S25BR",
"stackable": false
}
}
Fluxo em três passos
Chame POST /coupons/validate da UI, depois passe coupon_code em POST /fleet/show para ver o preço com desconto, e novamente em POST /bookings para fixá-lo. O último passo é o que consome o slot de uso.
Erros
| HTTP | Body | Causa |
|---|---|---|
| 404 | {"error": "coupon_not_found"} | Code doesn't exist. |
| 422 | {"error": "coupon_not_valid"} | Expired, outside window, no uses left. |
| 422 | {"error": "coupon_brand_or_rate_mismatch"} | Brand or rate does not apply. |
| 422 | {"error": "coupon_country_mismatch"} | Country does not apply. |
| 422 | {"error": "coupon_days_out_of_range"} | Days outside min/max. |