API de verificación por SMS
Última modificación el 2026/11/03
Ejecutando consultas a la API
Dos API comparten una clave: una API REST con JSON, y el formato de activación por SMS que muchas herramientas ya usan. Crea la clave en la página Clave API de la consola; se muestra una vez. Límite: 300 solicitudes por minuto por clave. Cada pedido tiene una ventana de código de 20 minutos, igual que en la consola.
# REST API (JSON) curl https://virtualsns.com/api/v1/balance -H "Authorization: Bearer YOUR_KEY" # SMS activation format curl "https://virtualsns.com/stubs/handler_api.php?api_key=YOUR_KEY&action=getBalance"
Códigos de servicio y país
Los códigos de servicio son los nombres en las direcciones de nuestras páginas de servicio, por ejemplo kakaotalk, line, wechat, zalo, naver, shopee y whatsapp. Los códigos de país son códigos ISO en minúsculas: kr, jp, id, ph, vn, th, us. GET /services y GET /countries devuelven las listas completas.
Flujo típico
- Ordena un número con el servicio y el país. Guarda el id.
- Ingresa el número en la aplicación y pídele que envíe el SMS.
- Lee el pedido cada 4 segundos hasta que haya un código.
- ¿Necesitas otro SMS? Solicita otro código, luego lee nuevamente. Hecho: finaliza el pedido.
- ¿No hay código? Cancela para un reembolso completo. Sin una llamada, el reembolso ocurre automáticamente cuando finaliza la ventana.
Python
import os, time, requests
API = "https://virtualsns.com/api/v1"
H = {"Authorization": f"Bearer {os.environ['VIRTUALSNS_KEY']}"}
order = requests.post(f"{API}/orders", headers=H,
data={"service": "kakaotalk", "country": "kr"}).json()["order"]
print("Use this number:", order["phone"])
while True:
o = requests.get(f"{API}/orders/{order['id']}", headers=H).json()["order"]
if o["code"] or o["status"] in ("refunded", "canceled"):
break
time.sleep(4)
print("Code:", o["code"])Node.js
const API = "https://virtualsns.com/api/v1";
const H = { Authorization: `Bearer ${process.env.VIRTUALSNS_KEY}` };
const { order } = await fetch(`${API}/orders`, {
method: "POST", headers: H,
body: new URLSearchParams({ service: "line", country: "jp" }),
}).then((r) => r.json());
console.log("Use this number:", order.phone);
let o = order;
while (!o.code && !["refunded", "canceled"].includes(o.status)) {
await new Promise((r) => setTimeout(r, 4000));
({ order: o } = await fetch(`${API}/orders/${order.id}`, { headers: H }).then((r) => r.json()));
}
console.log("Code:", o.code);Devolver códigos de error
API REST
Los errores vienen en JSON: {"error":{"code","message"}} con estos estados HTTP:
| 400 | Campo faltante o incorrecto (missing_filter, bad_json). |
| 401 | Sin clave o clave incorrecta (no_key, bad_key). |
| 402 | Saldo insuficiente (no_balance). |
| 404 | Servicio, país, pedido o endpoint desconocido. |
| 409 | El pedido no puede hacer eso ahora (has_code, not_ready, too_many_open, no_numbers). |
| 429 | Más de 300 solicitudes en un minuto (rate_limited). |
Formato de activación por SMS
| BAD_KEY | Falta o es incorrecta la clave de API. |
| BAD_ACTION | Acción desconocida. |
| BAD_SERVICE | Código de servicio desconocido. |
| BAD_COUNTRY | El servicio no se vende en ese país. |
| NO_BALANCE | Saldo insuficiente. |
| NO_NUMBERS | No hay números disponibles en este momento. Inténtalo de nuevo en un momento. |
| NO_ACTIVATION | ID de activación desconocido o no es tuyo. |
| EARLY_CANCEL_DENIED | Ya ha llegado un código, por lo que la activación no se puede cancelar. |
| TOO_MANY_REQUESTS | Más de 300 solicitudes en un minuto. |
| NO_ACTIVATIONS | Ya hay 20 activaciones abiertas. |
Métodos de API REST
https://virtualsns.com/api/v1
GET/services
Cada código de servicio con su nombre, tipo y precio más bajo. No se necesita clave.
curl "https://virtualsns.com/api/v1/services"
{"services":[{"code":"kakaotalk","name":"KakaoTalk","category":"social","from":"0.06"}]}GET/countries
Cada código de país (ISO, minúscula) con su nombre y código de marcación. No se necesita clave.
curl "https://virtualsns.com/api/v1/countries"
{"countries":[{"code":"kr","name":"South Korea","dial_code":"82"}]}GET/prices
Precios en USD. Añade servicio, país o ambos. No se necesita clave.
curl "https://virtualsns.com/api/v1/prices?service=line&country=jp"
{"prices":[{"service":"line","country":"jp","price":"5.40"}]}GET/balance
Tu saldo en USD.
curl "https://virtualsns.com/api/v1/balance" \ -H "Authorization: Bearer YOUR_KEY"
{"balance":"25.00","currency":"USD"}POST/orders
Compra un número (201). Devuelve el pedido con el número de teléfono y la hora en que finaliza la ventana.
curl -X POST https://virtualsns.com/api/v1/orders \ -H "Authorization: Bearer YOUR_KEY" \ -d service=kakaotalk -d country=kr
{"order":{"id":"AC-7K2M9QX4PB","service":"kakaotalk","country":"kr","phone":"+821023456789","status":"waiting","code":null,"expires_at":"2026-11-03T12:20:00.000Z"},"window_minutes":20}GET/orders/AC-7K2M9QX4PB
Un pedido con su estado y cada código recibido. Estados: esperando, recibido, finalizado, reembolsado, cancelado.
curl "https://virtualsns.com/api/v1/orders/AC-7K2M9QX4PB" \ -H "Authorization: Bearer YOUR_KEY"
{"order":{"id":"AC-7K2M9QX4PB","status":"received","code":"482193","sms":"[Kakao] Verification code [482193]"}}GET/orders
Tus pedidos abiertos (status=all para los últimos 100).
curl "https://virtualsns.com/api/v1/orders?status=open" \ -H "Authorization: Bearer YOUR_KEY"
{"orders":[...]}POST/orders/AC-7K2M9QX4PB/resend
Solicita otro código en el mismo número, después del primer código y mientras la ventana está abierta. Sin cargo adicional.
curl -X POST https://virtualsns.com/api/v1/orders/AC-7K2M9QX4PB/resend \ -H "Authorization: Bearer YOUR_KEY"
{"order":{"status":"received","waiting_for_resend":true}}POST/orders/AC-7K2M9QX4PB/finish
Cierra un pedido que recibió su código.
curl -X POST https://virtualsns.com/api/v1/orders/AC-7K2M9QX4PB/finish \ -H "Authorization: Bearer YOUR_KEY"
{"order":{"status":"finished"}}POST/orders/AC-7K2M9QX4PB/cancel
Cancela antes de que llegue un código. El precio completo se devuelve a tu saldo.
curl -X POST https://virtualsns.com/api/v1/orders/AC-7K2M9QX4PB/cancel \ -H "Authorization: Bearer YOUR_KEY"
{"order":{"status":"canceled","refunded":"8.40"}}Métodos de formato de activación por SMS
https://virtualsns.com/stubs/handler_api.php
Método getBalance
Tu saldo en USD.
GET https://virtualsns.com/stubs/handler_api.php?api_key=KEY&action=getBalance
ACCESS_BALANCE:12.50
Método getServicesList
Códigos de servicio que puedes comprar (JSON).
GET https://virtualsns.com/stubs/handler_api.php?api_key=KEY&action=getServicesList
{"status":"success","services":[{"code":"line","name":"LINE"}]}Método getCountries
Códigos de país (ISO, minúscula) y códigos de marcación (JSON).
GET https://virtualsns.com/stubs/handler_api.php?api_key=KEY&action=getCountries
{"jp":{"name":"Japan","dial":"81"}}Método getPrices
Precios en USD por país y servicio. Ambos filtros son opcionales.
GET https://virtualsns.com/stubs/handler_api.php?api_key=KEY&action=getPrices&service=line&country=jp
{"jp":{"line":{"cost":5.4,"count":100}}}Método getNumber
Compra un número. Devuelve el ID de activación y el número con su código de país.
GET https://virtualsns.com/stubs/handler_api.php?api_key=KEY&action=getNumber&service=line&country=jp
ACCESS_NUMBER:AC-7K2M9QX4PB:819012345678
Método getStatus
STATUS_WAIT_CODE (sin código aún), STATUS_OK:<code>, STATUS_WAIT_RETRY:<último código> (otro código solicitado), STATUS_CANCEL (cancelado o reembolsado).
GET https://virtualsns.com/stubs/handler_api.php?api_key=KEY&action=getStatus&id=AC-7K2M9QX4PB
STATUS_OK:482913
Método setStatus
status=1 listo (ACCESS_READY), 3 otro código (ACCESS_RETRY_GET), 6 finalizado (ACCESS_ACTIVATION), 8 cancelación con reembolso completo si no llegó ningún código (ACCESS_CANCEL).
GET https://virtualsns.com/stubs/handler_api.php?api_key=KEY&action=setStatus&id=AC-7K2M9QX4PB&status=3
ACCESS_RETRY_GET