# Errori e limiti d’uso

Gli errori usano codici HTTP standard e un corpo JSON con il messaggio in detail. Quasi sempre dicono esattamente cosa fare dopo.

## Cosa significa un 409 dalla API di SMS Nitro?

Il 409 indica che al momento non c’è un numero disponibile per quell’app e quel paese. Prova un altro paese, oppure indica l’altro server in server, e acquista di nuovo. Non viene addebitato nulla.

## Codici di stato

| HTTP | Significato | Cosa fare |
|---|---|---|
| 400 | Richiesta non possibile ora: paese non venduto per l’app, ordine già chiuso, numero scaduto, annullamento troppo presto | Leggi detail e correggi. Annullamento presto: attendi 2 minuti |
| 401 | Chiave API assente, non valida o revocata | Controlla l’intestazione e la chiave nella dashboard |
| 402 | Saldo insufficiente | Ricarica e riprova |
| 404 | Ordine non trovato, oppure app non disponibile su quel server | Controlla id, product e server |
| 409 | Nessun numero disponibile in questo momento | Prova un altro paese o server |
| 422 | Corpo o parametro non valido. Qui detail è un elenco di errori per campo | Correggi i campi elencati in detail |
| 429 | Limite di richieste raggiunto | Attendi e riprova con intervalli crescenti |
| 502 | Fornitura momentaneamente non disponibile | Riprova tra qualche secondo |

**Corpo dell’errore**

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

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

## Limiti d’uso

- POST /v1/orders: 500 acquisti al minuto per account e per IP.
- POST /v1/orders/{id}/resend: 30 richieste al minuto.
- Controllo dello stato: basta un GET per ordine ogni 3-5 secondi. Interrogare più spesso non fa arrivare prima l’SMS.

## Strategia di nuovi tentativi

Ripeti 429 e 502 con intervalli esponenziali. Non ripetere 400, 401, 402 o 404 senza modificare la richiesta. Un acquisto fallito con 409 o 502 non è stato addebitato, quindi puoi riacquistare senza rischi.

**Funzione di supporto in 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

**Mi viene addebitato qualcosa se una richiesta fallisce?** No. Gli acquisti con errore non generano mai addebiti, e gli ordini senza SMS vengono rimborsati.

Fonte: https://smsnitro.com/it/sviluppatori/errori
