API de Verificación SMS para Desarrolladores
Tres llamadas cubren el flujo entero: pedir un número, consultar hasta que llega el código y liberarlo si no llega. Token de portador, JSON de entrada y salida, y todo lo que se puede hacer en el panel está disponible por la misma API.
- Desde
- $0.01por código
- Servicios
- 744
Pagas por verificación. Si cancelas un pedido que no recibió ningún mensaje, el importe vuelve a tu saldo.
El flujo, en llamadas
GET /api/v2/tn101/get-services— el catálogo, con el identificador por el que vas a pedir y su precio actual.POST /api/v2/tn101/request-number— pide uno. Aceptaservice_key, y opcionalmentestatey prefijos. Responde con el identificador del pedido, el número y cuándo caduca.GET /api/v2/tn101/get-number-details— consúltalo conorder_id.pines nulo hasta que llega el código y lo contiene después. Es la lectura más barata de la API y la que está pensada para llamarse en bucle.POST /api/v2/tn101/reject-number— libera un número que no recibió nada. Es también lo que devuelve el importe.
En este camino no se te envía nada de forma proactiva, así que el paso 3 es una consulta repetida. Si prefieres que te avisen en lugar de preguntar, la cuenta también envía webhooks en los eventos de pedido, configurables desde el panel.
Autenticación
Cada petición lleva Authorization: Bearer <token>. Los tokens se generan en el panel, en el apartado de acceso a la API, y se pueden rotar allí en cualquier momento: rotar invalida el token anterior de inmediato, así que cámbialo primero en tu configuración.
Una petición sin token válido recibe 401. Una cuenta suspendida, o con el acceso a la API desactivado, recibe 403. Cuando la API está desactivada para todo el sitio, todos los endpoints responden 503 en lugar de fingir.
El envoltorio de la respuesta
Todos los endpoints responden con los mismos tres campos:
data lleva el contenido, success es el booleano sobre el que ramificar y summery es el mensaje legible. Esa grafía no es una errata de esta página: es el nombre de campo que la API lleva enviando desde siempre, está en todas las integraciones escritas contra ella, y renombrarlo las rompería todas por corregir una letra. Lee summery.
Los fallos de validación responden 422 con data como un objeto de nombres de campo a mensajes de error, de modo que quien llama puede informar de qué argumento estaba mal y no solo de que algo lo estaba.
Probar flujos de verificación
La API es una forma práctica de ejercitar un registro o una recuperación de contraseña contra una ruta real de operador en lugar de contra un simulador: pides un número, rellenas tu propio formulario con él, consultas hasta que llega el código y compruebas qué hace después tu aplicación. Es una prueba más lenta que un doble de prueba y detecta lo que un doble no puede: la normalización, el filtrado por tipo de línea y los retrasos de entrega que tus usuarios van a sufrir de verdad.
Límites
No hay un límite de peticiones por segundo en la API, pero sí dos cuotas sobre los pedidos, y son las mismas que aplica el panel:
- Pedidos abiertos. Una cuenta solo puede tener un número limitado de números reservados a la vez. Consulta y libera, en lugar de abrir muchos en paralelo.
- Pedidos cancelados y caducados al día. Si superas la cantidad diaria permitida, los pedidos se pausan durante un tiempo, que se alarga si se repite. Cada reserva consume suministro real llegue o no un código, y eso es lo que protege la cuota.
Las dos se describen con más detalle en los números temporales, que es donde se explica cómo transcurre un pedido.
Un ejemplo completo
Pedir, consultar y liberar. Sustituye YOUR_API_TOKEN por un token del panel y cada uno de estos ejemplos funciona tal cual está pegado.
# 1. Pide un número.
curl -X POST https://smsportal.io/api/v2/tn101/request-number \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"service_key": "Google"}'
# 2. Consulta hasta que "pin" deje de ser nulo.
curl "https://smsportal.io/api/v2/tn101/get-number-details?order_id=12345" \
-H "Authorization: Bearer YOUR_API_TOKEN"
# 3. ¿No llegó nada? Libéralo y recupera el importe.
curl -X POST https://smsportal.io/api/v2/tn101/reject-number \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"order_id": 12345}'Qué devuelve el paso 2 cuando llega el código
Antes de que llegue, la misma llamada devuelve la misma estructura con pin y message a nulo.
{
"data": {
"order_id": 12345,
"number": "12085551234",
"service": "Google",
"status": "Reserved",
"state": "CA",
"pin": "418902",
"message": "418902 is your Google verification code.",
"price": 0.35,
"till_expiration": "2026-09-03T12:20:00.000Z"
},
"success": true,
"summery": "Success"
}Endpoints
Agrupados por servidor. Todos aceptan el mismo token de portador y responden con el mismo envoltorio.
Cuenta
- GETPerfil de la cuenta
/api/v2/profile - GETSaldo del monedero
/api/v2/account-details
SIM real de EE. UU. — /api/v2/real-sim
- GETProductos, periodos de validez, precios y stock
/api/v2/real-sim/get-services - POSTComprar números (en cola, responde al instante)
/api/v2/real-sim/request-number - GETPendiente, listo con el número, o fallido y reembolsado
/api/v2/real-sim/get-order-status - GETTus números
/api/v2/real-sim/get-numbers - GETTodos los SMS de un número
/api/v2/real-sim/get-messages - POSTRenovar números otro periodo
/api/v2/real-sim/renew-number
Temp (s1) — /api/v2/tn101
- GETLista de servicios
/api/v2/tn101/get-services - GETEstados de EE. UU.
/api/v2/tn101/us-states - POSTPedir un número
/api/v2/tn101/request-number - POSTReutilizar un número
/api/v2/tn101/reuse-number - GETDetalle del pedido
/api/v2/tn101/get-number-details - GETNúmeros reservados
/api/v2/tn101/get-reserved-list - GETHistórico de pedidos
/api/v2/tn101/get-order-histories - POSTCancelar y reembolsar
/api/v2/tn101/reject-number
Temp (s2) — /api/v2/tn102
- GETServicios, operadores y recargos
/api/v2/tn102/get-services - GETNúmeros disponibles por código de área
/api/v2/tn102/get-area-stock - POSTPedir un número (operador, códigos de área)
/api/v2/tn102/request-number - POSTUn número para varios servicios
/api/v2/tn102/request-multiple - POSTPedir un número concreto
/api/v2/tn102/request-specific-number - POSTVolver a obtener el mismo número
/api/v2/tn102/reuse-number - GETDetalle del pedido y código
/api/v2/tn102/get-number-details - GETPedidos abiertos
/api/v2/tn102/get-reserved-list - GETHistórico de pedidos
/api/v2/tn102/get-order-histories - POSTCancelar y reembolsar (tras 5 minutos)
/api/v2/tn102/reject-number
Alquiler — /api/v2/rental
- GETServicios de alquiler y precios por periodo
/api/v2/rental/get-services - POSTAlquilar un número
/api/v2/rental/request-number - GETTus alquileres
/api/v2/rental/get-rentals - GETUn alquiler con sus mensajes
/api/v2/rental/get-rental-details - GETMensajes de un alquiler
/api/v2/rental/get-messages - POSTRenovar otro periodo
/api/v2/rental/renew-rental - POSTActivar o desactivar la renovación automática
/api/v2/rental/set-auto-renew - POSTCancelar y reembolsar (sin mensajes)
/api/v2/rental/cancel-rental
SIM real de EE. UU., Temp (s2) y alquiler
SIM real de EE. UU. vende números con SIM física que conservas durante días. La compra va en cola, así que un operador lento nunca agota el tiempo de tu petición:
get-services— todas las opciones; cada periodo de validez tiene su propioproduct_id,priceystock.request-number—product_idy, opcional,quantity(1–100). Cobra al momento y responde conorder_idsystatus: "pending". 402 si el saldo no alcanza.get-order-status—order_ids(separados por comas, hasta 100).pendingmientras conseguimos el número; luegoreadyconnumber,expires_aty unshare_link, ofailedconerror— un número fallido se reembolsa automáticamente.get-numbers(status=active|all) yget-messages(order_id) — todos los SMS, del más reciente al más antiguo, con elcodeextraído.renew-number—order_ids; cobra la renovación al momento y amplía cada número activo un periodo más, normalmente en pocas horas.get-numbersmuestrarenewal: "pending"hasta que se aplica; si no se aplica en 3 días se reembolsa automáticamente.- Un número entregado no es reembolsable. Compra uno primero al probar un servicio.
- Webhooks:
order.number_assignedcuando el número está listo,sms.receivedpor cada SMS,order.failed+order.refundedsi no se pudo entregar; llevan"provider": "us-real-sim".
Temp (s2) funciona como Temp (s1), con dos opciones más en request-number:
service_key— obligatorio; elservice_keydetn102/get-services.carrier— opcional,at&totmobile. Conkeep_carrier: trueel pedido falla en lugar de usar otro operador.area_codes— opcional, separados por comas, p. ej."212,305";tn102/get-area-stock?service_key=…muestra el stock. Conlock_area_code: trueel pedido falla en lugar de usar otro código.- Cada opción suma el recargo que devuelve
get-services. Un pedido fallido nunca se cobra. request-multiple—service_keys(2–7, separados por comas o en un array) y las mismas opcionescarrier/area_codes: un número para todos, un pedido por servicio. Todo o nada: si un servicio no cabe en el número, no se cobra ninguno.request-specific-number—number(10 dígitos de EE. UU.) yservice_key: ese número exacto, por el precio del servicio más un recargo. No se cobra nada si no está disponible.reject-numberfunciona a partir de cinco minutos tras la compra. Antes responde 409 condata.retry_after_seconds.- Consulta
get-number-details;codecontiene el código cuando llega. Los números sin usar se reembolsan solos al caducar.
Alquiler reserva un número para un servicio durante un periodo:
request-number—service_keyyperiod(1d,3d,7d,14do30d), obligatorios; opcionalesarea_codes,lock_area_code,auto_renew. Devuelverental_id.get-messages/get-rental-details—rental_id; todos los mensajes recibidos, del más reciente al más antiguo, con el código extraído.renew-rental—rental_id; cobra el precio actual del mismo periodo y amplía la fecha de fin. 402 si el saldo no alcanza.set-auto-renew—rental_id,auto_renew(true/false); renueva con el saldo poco antes del final.cancel-rental—rental_id; reembolsa completo solo mientras no haya llegado ningún mensaje.
Los eventos de ambos llegan a tus webhooks como los de cualquier pedido; los de alquiler llevan "provider": "s2-rental".
Crea una cuenta para generar un token: la referencia completa y tus claves están en el panel, en el apartado de acceso a la API.
Preguntas frecuentes
- ¿Cómo consigo un token?
- Crea una cuenta y genera uno en el panel, en el apartado de acceso a la API. Allí se muestra completo y se puede rotar cuando lo necesites.
- ¿Llamar a la API cuesta algo?
- Las peticiones son gratuitas; los números no. Se te cobra por un número cuando `request-number` emite uno, al mismo precio por verificación que un pedido hecho desde el panel.
- ¿Hay un entorno de pruebas?
- No hay un entorno separado. Hay uno solo, y un número pedido es un número real con un cargo real, que es también lo que hace que merezca la pena probar contra esta API.
- ¿Con qué frecuencia debo consultar el código?
- `get-number-details` es una búsqueda indexada sin llamadas externas, así que unos pocos segundos entre consultas es razonable. Para cuando `pin` tenga valor o cuando el pedido pase su caducidad, y libera todo lo que no recibió nada.
- ¿Pueden avisarme en lugar de consultar?
- Sí. Los webhooks se configuran por cuenta desde el panel y se disparan en los eventos de pedido, de modo que una integración de larga duración no tiene que quedarse en un bucle.
Páginas relacionadas
- Recibir SMS onlineCómo funciona una bandeja de entrada en el navegador, y por qué los números públicos gratuitos no.
- Verificación SMSCómo viaja un código de un solo uso, de principio a fin, y por qué a veces no llega.
- Números temporalesCuánto tiempo es tuyo un número alquilado, y qué cuentas no deberían depender de uno.
¿Todo listo para recibir tu código?
Crear la cuenta lleva un minuto y solo pagas por los números que entregan el mensaje.
Crear una cuenta gratis