# Erreurs et limites d’utilisation

Les erreurs utilisent les codes HTTP standard et un corps JSON avec le message dans detail. La plupart indiquent précisément quoi faire ensuite.

## Que signifie un 409 de l’API SMS Nitro ?

Un 409 indique qu’aucun numéro n’est disponible pour l’instant pour cette application et ce pays. Essayez un autre pays, ou indiquez l’autre serveur dans server, puis achetez à nouveau. Rien n’est débité.

## Codes de statut

| HTTP | Signification | Que faire |
|---|---|---|
| 400 | Demande impossible pour l’instant : pays non proposé pour l’application, commande déjà clôturée, numéro expiré, annulation trop tôt | Lisez detail et corrigez. Annulation trop tôt : attendez 2 minutes |
| 401 | Clé d’API absente, invalide ou révoquée | Vérifiez l’en-tête et la clé dans le tableau de bord |
| 402 | Solde insuffisant | Rechargez puis réessayez |
| 404 | Commande introuvable, ou application indisponible sur ce serveur | Vérifiez l’id, le product et le server |
| 409 | Aucun numéro disponible pour l’instant | Essayez un autre pays ou serveur |
| 422 | Corps ou paramètre invalide. Ici, detail est une liste d’erreurs par champ | Corrigez les champs listés dans detail |
| 429 | Limite de requêtes atteinte | Patientez et réessayez avec des délais croissants |
| 502 | Approvisionnement momentanément indisponible | Réessayez dans quelques secondes |

**Corps de l’erreur**

```http
HTTP/1.1 402 Payment Required
Content-Type: application/json

{ "detail": "Insufficient balance" }
```

## Limites d’utilisation

- POST /v1/orders : 500 achats par minute par compte et par IP.
- POST /v1/orders/{id}/resend : 30 requêtes par minute.
- Suivi du statut : un GET par commande toutes les 3 à 5 secondes suffit. Interroger plus vite ne fait pas arriver le SMS plus tôt.

## Stratégie de nouvelles tentatives

Réessayez les 429 et 502 avec des délais exponentiels. Ne répétez pas un 400, 401, 402 ou 404 sans modifier la requête. Un achat qui a échoué en 409 ou 502 n’a pas été débité : vous pouvez racheter sans risque.

**Fonction utilitaire en Python**

```python
import random, time, requests

def call(method, url, **kw):
    for attempt in range(5):
        r = requests.request(method, url, timeout=30, **kw)
        if r.status_code == 429:
            time.sleep(float(r.headers.get("Retry-After", 2 ** attempt)))
            continue
        if r.status_code in (502, 503, 504):
            time.sleep(2 ** attempt + random.random())
            continue
        return r
    r.raise_for_status()
    return r
```

## FAQ

**Suis-je débité quand une requête échoue ?** Non. Les achats en erreur ne génèrent jamais de débit, et les commandes sans SMS sont remboursées.

Source: https://smsnitro.com/fr/developpeurs/erreurs
