# Erros e limites de uso

Os erros usam códigos HTTP padrão e um corpo JSON com a mensagem em detail. Quase sempre eles dizem exatamente o que fazer a seguir.

## O que significa um 409 na API da SMS Nitro?

O 409 indica que não há número disponível agora para aquele app e país. Tente outro país, ou informe o outro servidor em server, e compre de novo. Nada é cobrado.

## Códigos de status

| HTTP | Significado | O que fazer |
|---|---|---|
| 400 | Pedido impossível agora: país não vendido para o app, pedido já encerrado, número expirado, cancelamento cedo demais | Leia detail e ajuste. Cancelamento cedo: espere 2 minutos |
| 401 | Chave de API ausente, inválida ou revogada | Confira o cabeçalho e a chave no painel |
| 402 | Saldo insuficiente | Recarregue e tente de novo |
| 404 | Pedido não encontrado, ou app indisponível naquele servidor | Confira o id, o product e o server |
| 409 | Nenhum número disponível agora | Tente outro país ou servidor |
| 422 | Corpo ou parâmetro inválido. Aqui detail é uma lista de erros por campo | Corrija os campos listados em detail |
| 429 | Limite de requisições atingido | Espere e tente de novo com intervalo crescente |
| 502 | Fornecimento temporariamente indisponível | Tente de novo em alguns segundos |

**Corpo do erro**

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

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

## Limites de uso

- POST /v1/orders: 500 compras por minuto por conta e por IP.
- POST /v1/orders/{id}/resend: 30 pedidos por minuto.
- Consulta de status: um GET por pedido a cada 3 a 5 segundos basta. Consultar mais rápido não faz o SMS chegar antes.

## Estratégia de nova tentativa

Repita 429 e 502 com intervalo exponencial. Não repita 400, 401, 402 ou 404 sem mudar a requisição. Uma compra que falhou com 409 ou 502 não foi cobrada, então pode comprar de novo com segurança.

**Função auxiliar em 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

**Sou cobrado quando uma requisição falha?** Não. Compras com erro nunca geram cobrança, e pedidos sem SMS são estornados.

Fonte: https://smsnitro.com/pt/desenvolvedores/erros
