# Verificación por SMS en Python

Un script completo con la librería requests: compra un número temporal, espera el código y cierra el pedido. No hace falta SDK.

## ¿Cómo recibo un código de verificación por SMS en Python?

Usa requests con la cabecera X-Api-Key: POST /v1/orders para obtener el número, consulta GET /v1/orders/{id} cada 4 segundos hasta que messages traiga el SMS, lee messages[-1]["code"] y llama a POST finish. Si no llega nada a tiempo, llama a POST cancel para liberar el importe reservado.

## Preparación

- Python 3.8 o superior.
- pip install requests
- Exporta la clave: export SMSNITRO_API_KEY=...

## Script completo

**activation.py**

```python
import os
import time
import requests

API = "https://smsnitro.com/api/v1"
session = requests.Session()
session.headers["X-Api-Key"] = os.environ["SMSNITRO_API_KEY"]


def api(method, path, **kw):
    r = session.request(method, API + path, timeout=30, **kw)
    if r.status_code >= 400:
        raise RuntimeError(f"{r.status_code}: {r.json().get('detail')}")
    return r.json()


print("Balance:", api("GET", "/balance")["balance"], "USD")

order = api("POST", "/orders", json={"product": "telegram", "country": "usa"})
print("Number:", order["phone"], "order", order["id"])

deadline = time.time() + 600  # numbers stay reserved for up to 20 minutes
while time.time() < deadline:
    order = api("GET", f"/orders/{order['id']}")
    if order["messages"]:
        print("Code:", order["messages"][-1]["code"])
        api("POST", f"/orders/{order['id']}/finish")
        break
    if order["status"] in ("CANCELED", "TIMEOUT", "BANNED", "FINISHED"):
        print("Ended without SMS:", order["status"], "(not charged)")
        break
    time.sleep(4)  # poll every 3 to 5 seconds
else:
    api("POST", f"/orders/{order['id']}/cancel")  # refund the frozen amount
    print("No SMS: cancelled and refunded")
```

## Cómo funciona el script

- Una requests.Session mantiene la conexión y la cabecera de la clave en todas las llamadas.
- Cualquier respuesta 4xx o 5xx lanza una excepción con el mensaje detail de la API.
- Consulta cada 4 segundos durante un máximo de 10 minutos y después cancela, así que un SMS que no llega no cuesta nada.
- Cambia product y country por la app y el país que necesites; GET /v1/services muestra las opciones.

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