Verificación por SMS en Node.js
Un módulo ES completo que usa el fetch nativo de Node.js 18+: compra un número temporal, espera el código y cierra el pedido, con los tipos TypeScript de la respuesta.
¿Cómo recibo un código de verificación por SMS en Node.js?
Llama a fetch con la cabecera X-Api-Key: POST /v1/orders para obtener el número, consulta GET /v1/orders/{id} cada 4 segundos hasta que messages traiga el SMS, lee messages.at(-1).code y llama a POST finish. Cancela si no llega nada para liberar el importe reservado.
Preparación
- Node.js 18 o superior (fetch nativo y await de nivel superior en archivos .mjs).
- Sin dependencias que instalar.
- Exporta la clave: export SMSNITRO_API_KEY=...
Script completo
// Node.js 18+ (global fetch). Save as activation.mjs and run: node activation.mjs
const API = "https://smsnitro.com/api/v1";
const headers = { "X-Api-Key": process.env.SMSNITRO_API_KEY, "Content-Type": "application/json" };
async function api(method, path, body) {
const res = await fetch(API + path, { method, headers, body: body && JSON.stringify(body) });
const data = await res.json();
if (!res.ok) throw new Error(`${res.status}: ${data.detail}`);
return data;
}
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
const { balance } = await api("GET", "/balance");
console.log("Balance:", balance, "USD");
let order = await api("POST", "/orders", { product: "telegram", country: "usa" });
console.log("Number:", order.phone, "order", order.id);
const deadline = Date.now() + 600_000; // numbers stay reserved for up to 20 minutes
let done = false;
while (!done && Date.now() < deadline) {
order = await api("GET", `/orders/${order.id}`);
if (order.messages.length) {
console.log("Code:", order.messages.at(-1).code);
await api("POST", `/orders/${order.id}/finish`);
done = true;
} else if (["CANCELED", "TIMEOUT", "BANNED", "FINISHED"].includes(order.status)) {
console.log("Ended without SMS:", order.status, "(not charged)");
done = true;
} else {
await sleep(4000); // poll every 3 to 5 seconds
}
}
if (!done) {
await api("POST", `/orders/${order.id}/cancel`); // refund the frozen amount
console.log("No SMS: cancelled and refunded");
}Tipos TypeScript
El objeto de pedido que devuelven todos los endpoints de pedidos. Los precios llegan como cadena decimal: conviértelos con Number() solo para mostrarlos.
type Sms = { sender: string; text: string; code: string; received_at: string };
type Order = {
id: number;
phone: string;
status: "PENDING" | "RECEIVED" | "FINISHED" | "CANCELED" | "TIMEOUT" | "BANNED";
price: string; // decimal string, USD
expires: string | null; // ISO 8601, UTC
messages: Sms[];
awaiting_resend: boolean;
server: number;
};