# Errores y límites de uso

Los errores usan códigos HTTP estándar y un cuerpo JSON con el mensaje en detail. Casi siempre te dicen exactamente qué hacer a continuación.

## ¿Qué significa un 409 en la API de SMS Nitro?

Un 409 indica que ahora no hay número disponible para esa app y ese país. Prueba otro país, o indica el otro servidor en server, y vuelve a comprar. No se cobra nada.

## Códigos de estado

| HTTP | Significado | Qué hacer |
|---|---|---|
| 400 | Petición imposible ahora: país no disponible para la app, pedido ya cerrado, número caducado, cancelación demasiado pronto | Lee detail y ajusta. Cancelación pronta: espera 2 minutos |
| 401 | Clave de API ausente, inválida o revocada | Revisa la cabecera y la clave en el panel |
| 402 | Saldo insuficiente | Recarga y vuelve a intentarlo |
| 404 | Pedido no encontrado, o app no disponible en ese servidor | Revisa el id, el product y el server |
| 409 | Ningún número disponible ahora | Prueba otro país u otro servidor |
| 422 | Cuerpo o parámetro inválido. Aquí detail es una lista de errores por campo | Corrige los campos listados en detail |
| 429 | Límite de peticiones alcanzado | Espera y reintenta con intervalos crecientes |
| 502 | Suministro no disponible temporalmente | Reintenta en unos segundos |

**Cuerpo del error**

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

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

## Límites de uso

- POST /v1/orders: 500 compras por minuto por cuenta y por IP.
- POST /v1/orders/{id}/resend: 30 peticiones por minuto.
- Consulta de estado: basta un GET por pedido cada 3 a 5 segundos. Consultar más rápido no hace que el SMS llegue antes.

## Estrategia de reintentos

Reintenta 429 y 502 con intervalos exponenciales. No repitas 400, 401, 402 ni 404 sin cambiar la petición. Una compra que falló con 409 o 502 no se cobró, así que puedes volver a comprar sin riesgo.

**Función auxiliar 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

**¿Se me cobra cuando una petición falla?** No. Las compras con error nunca generan cobro, y los pedidos sin SMS se reembolsan.

Fuente: https://smsnitro.com/es/desarrolladores/errores
