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 |
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.
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 rPreguntas frecuentes
¿Se me cobra cuando una petición falla?
No. Las compras con error nunca generan cobro, y los pedidos sin SMS se reembolsan.