SMSPVAdevelopers
SMSPVA / DOCUMENTATION

Flujo de activación

Elige un número, recupera el resultado y gestiona el pedido.

SMSPVA API

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.

RespuestaAcción
200Usa data.sms y termina el bucle
202 + SMS_NOT_YET_RECEIVEDEspera y repite dentro del plazo
410 + ORDER_CLOSEDDetén el bucle; el pedido está cerrado
Otro errorGestiona 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);

Descargar función

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.

En esta página