API para recibir SMS
Compra números y lee códigos de verificación con una API JSON. Sin KYC, solo criptomonedas.
¿Cómo encaja todo en la API?
- Crea una cuenta y guarda la semilla que devuelve. Es la única credencial y no puede restablecerse.
- Crea una recarga, envía las criptomonedas y espera a que se acredite.
- Compra un número para el servicio y el país que necesites: el saldo se descuenta al instante.
- Consulta el código SMS. Si no llega ninguno antes de que expire el pedido, hay reembolso automático.
Financia una vez, compra muchas: una sola recarga cubre tantos números como permita su saldo, así que solo la primera compra espera una confirmación.
Autenticación
Envía la semilla de la cuenta como token bearer. No hay clave de API aparte ni llamada de inicio de sesión: la semilla es la credencial.
Authorization: Bearer YOUR-SEED-PHRASE
Los endpoints del catálogo no necesitan autenticación en absoluto, así que puedes consultar servicios, países y precios antes de que exista una cuenta. Todo lo que toca dinero o pedidos requiere la cabecera.
URL base
Todos los endpoints son relativos a:
https://otpdrop.com/api/v1
Las respuestas son JSON. Los cuerpos POST se aceptan como application/json o
application/x-www-form-urlencoded.
Errores
Los fallos devuelven un estado fuera de 2xx y un único objeto de error.
{
"error": {
"code": "invalid_request",
"message": "unknown service: \"whatsap\""
}
}
| Estado | Significado |
|---|---|
200 | Correcto |
201 | Creado: ya existe una cuenta, una recarga o un pedido |
401 | Falta la semilla en la cabecera Authorization o no es válida |
422 | La petición se entendió pero no pudo llevarse a cabo |
500 | Algo falló por nuestra parte |
Mensajes habituales con 422:
| Mensaje | Causa |
|---|---|
insufficient_funds | El saldo es menor que el precio: crea antes una recarga |
unknown service | No existe ese código de servicio; mira «listar servicios» |
unknown country | No existe ese código de país; mira «listar países» |
unknown coin | Moneda no aceptada; mira el endpoint de recarga |
amount_usd must be between… | Las recargas están limitadas a $25–$1000 |
¿Hay límites de frecuencia?
No hay cuota publicada ni clave de API que estrangular, pero llamar a los endpoints en bucle no sale gratis. Dos de ellos están pensados para consultas repetidas y merecen especial cuidado.
| Endpoint | Ritmo razonable | Por qué |
|---|---|---|
| Catálogo y cotizaciones | Guárdalos en caché | Los precios cambian poco; no hace falta pedir el catálogo en cada petición. |
/topups/{id} | Cada 10-15 segundos | La confirmación en la red tarda minutos, no milisegundos. Consultar más rápido no te dice nada antes. |
/orders/{id}/sms | Cada 3-5 segundos | Los códigos suelen llegar en segundos; un bucle más apretado solo añade carga. |
| Compras | Según haga falta | Cada compra descuenta de un saldo real, así que un bucle descontrolado te cuesta dinero antes que a nosotros. |
El tráfico que parezca un ataque se bloqueará en el borde sin un 429 de cortesía. Si
tienes un motivo legítimo para consultar con más frecuencia, escríbenos primero en la
página de contacto.
Listar servicios
GET/api/v1/services
Todos los servicios con su código, categoría y precio más bajo. No requiere autenticación.
Petición
curl -s https://otpdrop.com/api/v1/services
Respuesta
{
"services": [
{
"code": "binance",
"name": "Binance",
"category": "Finance",
"from_price_cents": 85,
"color": "#F0B90B",
"icon": "binance"
}
],
"count": 133
}
Listar países
GET/api/v1/countries
Every country with its dial code and how many services are available there. No authentication required.
Petición
curl -s https://otpdrop.com/api/v1/countries
Respuesta
{
"countries": [
{
"code": "us",
"name": "United States",
"dial_code": "+1",
"service_count": 133
}
],
"count": 197
}
Matriz de precios
GET/api/v1/catalog
The most useful service and country combinations with their prices, cheapest first. No authentication required.
Parámetros
| Nombre | Tipo | Descripción | |
|---|---|---|---|
limit | integer | opcional | How many rows to return, 1 to 500. Defaults to 12. |
Petición
curl -s 'https://otpdrop.com/api/v1/catalog?limit=2'
Respuesta
{
"items": [
{
"service": "badoo",
"country": "us",
"price_cents": 35
}
],
"count": 2
}
Cotizar un precio
GET/api/v1/quote
The exact price for one service and country before you commit to buying. No authentication required.
Parámetros
| Nombre | Tipo | Descripción | |
|---|---|---|---|
service | string | obligatorio | Service code, e.g. telegram |
country | string | obligatorio | Country code, e.g. us |
Petición
curl -s 'https://otpdrop.com/api/v1/quote?service=telegram&country=us'
Respuesta
{
"service": "telegram",
"country": "us",
"price_cents": 111,
"price_usd": "1.11",
"currency": "USD",
"purchasable": true
}
Crear cuenta
POST/api/v1/accounts
Generates an account and returns its seed. This is the only time the seed is ever shown. No authentication required.
Petición
curl -s -X POST https://otpdrop.com/api/v1/accounts
Respuesta
{
"public_id": "acc_7f3c1a92",
"seed": "PABh-ZbRt-9xKm-Lq4V",
"seed_prefix": "PABh",
"balance_cents": 0,
"warning": "This seed is shown exactly once, right now..."
}
Crear recarga
POST/api/v1/topups
Claims a deposit address and returns the exact amount to send, as coin_amount, at the rate in rate_usd. Each top-up gets its own address, and it expires at expires_at. Send only the named coin, on the named network, before then.
Parámetros
| Nombre | Tipo | Descripción | |
|---|---|---|---|
amount_usd | number | obligatorio | How much to add to the balance, in USD. Minimum 25, maximum 1000. |
coin | string | obligatorio | BTC, LTC, ETH, XMR, SOL, TRX, BNB, USDT, USDC and more |
Petición
curl -s -X POST https://otpdrop.com/api/v1/topups \
-H 'Authorization: Bearer YOUR-SEED' \
-H 'content-type: application/json' \
-d '{"amount_usd": 25, "coin": "XMR"}'
Respuesta
{
"topup_id": "top_019195919c80fc8f",
"status": "awaiting_payment",
"coin": "XMR",
"address": "89Rm4XN39m9PCr8Sr3yAFnXvLRRWQVEE...",
"amount_cents": 2500,
"amount_usd": "25.00",
"coin_amount": "0.1337",
"rate_usd": 187.02,
"bonus_cents": 0,
"credited_total_cents": 2500,
"expires_at": 1788532810
}
Estado de la recarga
GET/api/v1/topups/{id}
Whether a deposit has been credited. Confirmation is not instant — poll this rather than assuming the funds arrived.
Parámetros
| Nombre | Tipo | Descripción | |
|---|---|---|---|
id | string | obligatorio | The top-up id, in the path |
Petición
curl -s https://otpdrop.com/api/v1/topups/top_019195919c80fc8f \ -H 'Authorization: Bearer YOUR-SEED'
Respuesta
{
"topup_id": "top_019195919c80fc8f",
"status": "credited",
"coin": "XMR",
"amount_usd": "25.00",
"coin_amount": "0.1337",
"credited_total_cents": 2500,
"expires_at": 1788532810
}
Comprar un número
POST/api/v1/orders
Debits the balance and issues a number immediately. There is no per-purchase address and no second wait. Fails with insufficient_funds if the balance is short.
Parámetros
| Nombre | Tipo | Descripción | |
|---|---|---|---|
service | string | obligatorio | Service code, e.g. telegram |
country | string | obligatorio | Country code, e.g. us |
Petición
curl -s -X POST https://otpdrop.com/api/v1/orders \
-H 'Authorization: Bearer YOUR-SEED' \
-H 'content-type: application/json' \
-d '{"service": "telegram", "country": "us"}'
Respuesta
{
"order_id": "ord_1ad450bf7a42519c",
"service": "telegram",
"country": "us",
"phone": "+15558329008",
"status": "paid",
"price_usd": "1.11"
}
Listar tus pedidos
GET/api/v1/orders
Every order on the account, newest first, with status, number and price. Useful for reconciling state after a restart rather than for polling.
Petición
curl -s https://otpdrop.com/api/v1/orders \ -H 'Authorization: Bearer YOUR-SEED'
Respuesta
{
"orders": [
{
"order_id": "ord_1ad450bf7a42519c",
"service": "telegram",
"country": "us",
"phone": "+15558329008",
"status": "paid",
"price_usd": "1.11"
}
],
"count": 1
}
Obtener un pedido
GET/api/v1/orders/{id}
The current state of one order: its number, status and price.
Parámetros
| Nombre | Tipo | Descripción | |
|---|---|---|---|
id | string | obligatorio | The order id, in the path |
Petición
curl -s https://otpdrop.com/api/v1/orders/ord_1ad450bf7a42519c \ -H 'Authorization: Bearer YOUR-SEED'
Respuesta
{
"order_id": "ord_1ad450bf7a42519c",
"service": "telegram",
"country": "us",
"phone": "+15558329008",
"status": "paid",
"price_usd": "1.11"
}
Obtener el código SMS
GET/api/v1/orders/{id}/sms
Poll this until arrived turns true. If the order expires with nothing delivered, the price returns to your balance automatically.
Parámetros
| Nombre | Tipo | Descripción | |
|---|---|---|---|
id | string | obligatorio | The order id, in the path |
Petición
curl -s https://otpdrop.com/api/v1/orders/ord_1ad450bf7a42519c/sms \ -H 'Authorization: Bearer YOUR-SEED'
Respuesta
{
"order_id": "ord_1ad450bf7a42519c",
"status": "paid",
"arrived": false,
"code": null
}
¿Cómo es una integración completa?
De la cuenta al código en seis llamadas. Todo lo de abajo es real: pégalo y funciona.
# 1. Crear una cuenta y guardar la semilla
SEED=$(curl -s -X POST https://otpdrop.com/api/v1/accounts | jq -r .seed)
# 2. Financiarla: envía coin_amount a la dirección devuelta
curl -s -X POST https://otpdrop.com/api/v1/topups \
-H "Authorization: Bearer \$SEED" \
-H 'content-type: application/json' \
-d '{"amount_usd": 25, "coin": "USDT"}'
# 3. Consultar hasta que el depósito se acredite
curl -s https://otpdrop.com/api/v1/topups/TOPUP_ID \
-H "Authorization: Bearer \$SEED" | jq .status
# 4. Comprobar el precio antes de comprometerse
curl -s 'https://otpdrop.com/api/v1/quote?service=telegram&country=us'
# 5. Comprar: se descuenta el saldo y el número se entrega al momento
ORDER=$(curl -s -X POST https://otpdrop.com/api/v1/orders \
-H "Authorization: Bearer \$SEED" \
-H 'content-type: application/json' \
-d '{"service": "telegram", "country": "us"}' | jq -r .order_id)
# 6. Consultar el código
until curl -s https://otpdrop.com/api/v1/orders/\$ORDER/sms \
-H "Authorization: Bearer \$SEED" | jq -e .code; do sleep 4; done
La misma secuencia en Python, sin la shell:
import time, requests
API = "https://otpdrop.com/api/v1"
seed = requests.post(f"{API}/accounts").json()["seed"]
auth = {"Authorization": f"Bearer {seed}"}
topup = requests.post(f"{API}/topups", headers=auth,
json={"amount_usd": 25, "coin": "USDT"}).json()
print("send", topup["coin_amount"], topup["coin"], "to", topup["address"])
while requests.get(f"{API}/topups/{topup['topup_id']}",
headers=auth).json()["status"] != "credited":
time.sleep(15)
order = requests.post(f"{API}/orders", headers=auth,
json={"service": "telegram", "country": "us"}).json()
print("number:", order["phone"])
while True:
sms = requests.get(f"{API}/orders/{order['order_id']}/sms",
headers=auth).json()
if sms["arrived"]:
print("code:", sms["code"])
break
time.sleep(4)
Servidor MCP
Las mismas operaciones están disponibles por Model Context Protocol en https://otpdrop.com/mcp, como
once herramientas. Para añadirlo a Claude Code:
claude mcp add --transport http otpdrop https://otpdrop.com/mcp
La configuración y la lista completa de herramientas están en la página para agentes.
Archivos de descubrimiento
Descripciones del servicio legibles por máquinas, todas servidas sin autenticación.
| Archivo | Contenido |
|---|---|
/openapi.json | El esquema OpenAPI 3.1 completo |
/.well-known/agent.json | Capacidades, modelo de autenticación y reglas de negocio |
/llms.txt | Una orientación breve para modelos de lenguaje |
/llms-full.txt | Lo mismo con el catálogo completo incluido |
Preguntas frecuentes
¿La API de OTPDrop necesita una clave?
No. No hay nada que solicitar ni ningún paso de aprobación. La credencial es la semilla de la cuenta, enviada como token bearer, y los endpoints del catálogo no necesitan credencial alguna.
¿Cuánto cuesta la API de OTPDrop?
Nada más allá de los números que compres. No hay suscripción, ni coste por llamada, ni volumen mínimo: pagas los mismos precios que quien use la web.
¿Con qué lenguajes de programación funciona la API?
Con cualquiera capaz de hacer una petición HTTPS. Es JSON simple sobre HTTP con una cabecera bearer, así que no hay SDK que instalar ni nada que mantener al día con nuestras versiones.
¿Qué pasa si el código SMS nunca llega?
El pedido se reembolsa solo a tu saldo cuando expira, y puedes cancelarlo antes desde la web. Se te cobra por códigos entregados, no por intentos.
¿La API REST es lo mismo que el servidor MCP?
Sí, deliberadamente. Cada endpoint REST es una traducción de una llamada a una herramienta MCP, así que los dos no pueden separarse: arreglar uno es arreglar el otro. Elige el que le venga mejor a tu cliente.
¿Se puede probar la API sin gastar nada?
El catálogo, las cotizaciones y la creación de cuenta son gratuitos, así que puedes construir y probar casi toda una integración antes de financiar un saldo. Solo comprar cuesta dinero.