Erreurs
Toute erreur répond avec la même forme JSON, et un statut HTTP qui indique quoi faire ensuite.
Le format
{
"code": "customer_not_found",
"message": "No customer with id cus_123",
"hint": "Check the customer id",
"statusCode": 404,
"requestId": "req_0123456789abcdef"
}
code: stable et lisible par une machine ; branchez-vous dessus, pas surmessage.message: une phrase pour un humain.hint: ce qu’il faut essayer, quand il y a quelque chose à suggérer.statusCode: le statut HTTP, répété.requestId:req_suivi de 16 caractères hexadécimaux. Citez-le au support QBill pour qu’il retrouve votre requête.
Codes HTTP
| Statut | code |
Quand |
|---|---|---|
| 400 | bad_request |
Le corps ne passe pas la validation. Quand plusieurs champs sont faux, les messages sont joints par ; . Les champs inconnus du corps sont ignorés. |
| 401 | unauthorized |
Pas de clé, ou clé invalide (voir Authentification et clés). |
| 403 | publishable_key_forbidden |
Une clé publishable utilisée hors des quelques lectures de plans qui lui sont permises. |
| 403 | api_key_read_only |
Une clé read_only a tenté d’écrire. |
| 403 | merchant_suspended |
Le compte est suspendu. |
| 404 | par exemple customer_not_found |
L’objet n’existe pas. |
| 409 | par exemple sales_link_busy |
La requête entre en conflit avec l’état actuel ou avec une autre requête. Lisez code : sales_link_busy peut réussir à la relance, coupon_code_taken non. |
| 429 | too_many_requests, rate_limited |
Limite de débit atteinte, voir ci-dessous. |
D’autres erreurs portent leur propre code, comme invoice_not_refundable ou key_mode_mismatch.
Limites de débit
- 600 requêtes par minute par adresse IP : au-delà, la réponse est 429
too_many_requests. - 300 requêtes par minute par clé d’API : au-delà, la réponse est 429
rate_limited. Les réponses portentX-RateLimit-LimitetX-RateLimit-Remaining; un 429 porte aussiRetry-After, le temps à attendre.
Attendez Retry-After avant de réessayer.
Dans le SDK
Le SDK Node (bientôt sur npm) lève une QBillError pour toute réponse non 2xx, avec status, code, hint et requestId :
try {
await qbill.subscriptions.create({ customer, plan });
} catch (e) {
if (e instanceof QBillError) {
console.error(e.status, e.code, e.hint, e.requestId);
}
throw e;
}
Le SDK réessaie aussi pour vous, maxRetries fois (2 par défaut, réglable dans les options du constructeur). Il respecte Retry-After sur un 429. Les appels qu’on peut répéter sans risque sont aussi réessayés après un délai dépassé ou une erreur serveur. Voir Webhooks pour les événements reçus par vos endpoints.