Flujo de activación
Elige un número, recupera el resultado y gestiona el pedido.
1. Selecciona los códigos y el tipo
Consulta países y servicios, operadores, disponibilidad y precios. Comprueba los permisos: voice=0 SMS, 1 caller-ID, 2 voz.
Los precios y la disponibilidad no reservan un número. En operadores donantes, 9999 indica que se desconoce el recuento exacto.
2. Obtén un número
Usa Obtener número, o Obtener número por operador si necesitas uno concreto.
Guarda data.orderId: lo necesitarás para recibir mensajes y gestionar el pedido. La respuesta también incluye data.orderExpireIn, los segundos que quedan hasta que venza. Calcula el vencimiento una sola vez:
const expiresAt = Date.now() + numberResult.data.orderExpireIn * 1000;Conserva este vencimiento al consultar los mensajes: todas las consultas usan el mismo plazo. Usa la duración devuelta por la API en vez de suponer que siempre son diez minutos.
Si se agota el tiempo de espera, revisa Pedidos actuales antes de pedir otro número: el primero puede haberse creado. No hay una clave de idempotencia documentada que evite duplicados.
3. Espera el resultado
Consulta Receive SMS con orderId. También obtiene voz y caller-ID sin parámetro voice adicional.
| Respuesta | Acción |
|---|---|
| 200 | Usa data.sms y termina el bucle |
| 202 + SMS_NOT_YET_RECEIVED | Espera y repite dentro del plazo |
| 410 + ORDER_CLOSED | Detén el bucle; el pedido está cerrado |
| Otro error | Gestiona el error documentado |
La respuesta de espera incluye error: comprueba primero si es SMS_NOT_YET_RECEIVED antes de tratarla como un fallo. Leer un SMS recién recibido puede generar el cobro.
Este ejemplo espera cinco segundos entre consultas; es configuración del cliente, no un nuevo límite de la API. Respeta los errores de límite y el plazo. Los fallos de conexión y respuestas no JSON detienen el bucle.
// Node.js 22.16+. No automatic retries after transport errors or terminal responses.
export async function waitForSms({ apiKey, orderId, expiresAt, intervalMs = 5000 }, {
fetchImpl = fetch,
now = Date.now,
sleep = ms => new Promise(resolve => setTimeout(resolve, ms)),
baseUrl = 'https://api.smspva.com',
} = {}) {
if (!apiKey || !/^\d+$/.test(String(orderId))) throw new Error('Set your API key and order ID');
if (!Number.isFinite(expiresAt) || expiresAt <= now()) throw new Error('Order deadline has passed');
if (!Number.isFinite(intervalMs) || intervalMs < 5000) throw new Error('Use a polling interval of at least 5000 ms in this example');
while (now() < expiresAt) {
const remaining = expiresAt - now();
const response = await fetchImpl(`${baseUrl}/activation/sms/${encodeURIComponent(orderId)}`, {
headers: { apikey: apiKey },
signal: AbortSignal.timeout(Math.max(1, Math.floor(Math.min(30_000, remaining)))),
});
const result = await response.json();
if (response.status === 202 && result.statusCode === 202 && result.error?.type === 'SMS_NOT_YET_RECEIVED') {
const delay = Math.min(intervalMs, expiresAt - now());
if (delay <= 0) break;
await sleep(delay);
continue;
}
if (response.status !== 200 || result.error || result.statusCode !== 200) {
throw new Error(`HTTP ${response.status}: ${JSON.stringify(result)}`);
}
return result.data;
}
throw new Error('No result before the order deadline');
}Guarda la función como poll-sms.mjs y llámala con el plazo calculado al recibir el número:
import { waitForSms } from './poll-sms.mjs';
const data = await waitForSms({ apiKey, orderId, expiresAt });
console.log(data.sms);4. Gestiona el pedido
- Clear SMS: borra el SMS actual para recibir otro. Conserva
orderExpireIn. El 404 / NO_SMS_TO_CLEAN no confirma un borrado. - Stop SMS: detiene la recepción.
- Cancel order: cancela el pedido.
- Block number: marca el número como no operativo.
- Number status: comprueba un número utilizado antes para el mismo servicio.
No son acciones intercambiables ni se ejecutan automáticamente al agotar el tiempo. Consulta las respuestas de cada método.