OTP SMS API · Empresa Mexicana

OTP por SMS que sí llega, en México.

El código entra en menos de 5 segundos, vía rutas directas a los 4 carriers mexicanos. Si no llega, rescatas la conversión por WhatsApp o Voz.

8 créditos sin costo, sin tarjeta ni contrato.

Telcel Movistar AT&T Altán <5 seg
9:41 🇲🇽 Telcel 5G 97%
SM

SMS Masivos

+52 55 9162-4427

428291

Tu código de acceso es 428291. No lo compartas. Mi App.

3 seg
✓ Entregado · Ruta directa Telcel

2 endpoints. 15 minutos. Listo.

Sin webhooks ni configuraciones extra: la lógica de generación y validación ya viene integrada. Reenviar y cambiar de canal usan el mismo endpoint de envío.

Respuesta real de la API

# Paso 1: Solicitar codigo

curl -X POST https://api.smsmasivos.com.mx/v2/otp \

-H "apikey: $API_KEY" \

-H "Content-Type: application/json" \

-d '{"phone_number":"5512345678",

"country_code":"52","company":"Mi App",

"message":"{{code}} es tu clave de acceso a {{company}}"}'

→ 201 · state: pending · action: created

# Paso 2: Usuario ingresa el codigo en tu app

Tu frontend captura el input...

→ Código capturado

# Paso 3: Validar codigo (sin costo)

POST https://api.smsmasivos.com.mx/v2/otp/verify

phone_number, country_code, code

→ 200 correcto · 401 incorrecto · 410 expirado

# Clic en "No recibi": el MISMO endpoint reenvia

POST https://api.smsmasivos.com.mx/v2/otp { ...mismos campos, "channel": "whatsapp" }

→ 201 · action: resent

# 2do clic, fallback final

POST https://api.smsmasivos.com.mx/v2/otp { ...mismos campos, "channel": "voice" }

→ Voz

// Node 18+ en modulo ESM (.mjs o "type":"module"): usa await de nivel superior

const API = 'https://api.smsmasivos.com.mx/v2';

const H = { apikey: process.env.API_KEY,

'Content-Type': 'application/json' };

// Paso 1: Solicitar codigo

const payload = {

phone_number: '5512345678',

country_code: '52',

company:      'Mi App',

message:      '{{code}} es tu clave de acceso a {{company}}',

};

await fetch(`${API}/otp`, { method: 'POST', headers: H,

body: JSON.stringify(payload) });

→ 201 · action: created

// Paso 3: Validar codigo ingresado (sin costo)

await fetch(`${API}/otp/verify`, {

method: 'POST', headers: H,

body: JSON.stringify({ phone_number: '5512345678', country_code: '52', code: '483920' })

});

→ 200 OK

// Clic en "No recibi": mismo endpoint, cambias el canal

await fetch(`${API}/otp`, { method: 'POST', headers: H,

body: JSON.stringify({ ...payload, channel: 'whatsapp' }) });

→ 201 · action: resent

// 2do clic: fallback final con channel: 'voice'

import requests, os

API = 'https://api.smsmasivos.com.mx/v2'

H = {'apikey': os.environ['API_KEY']}

# Paso 1: Solicitar codigo

payload = {

'phone_number': '5512345678',

'country_code': '52',

'company':      'Mi App',

'message':      '{{code}} es tu clave de acceso a {{company}}',

}

requests.post(f'{API}/otp', headers=H, json=payload)

→ 201 · action: created

# Paso 3: Validar codigo ingresado (sin costo)

requests.post(f'{API}/otp/verify', headers=H,

json={'phone_number': '5512345678', 'country_code': '52', 'code': '483920'})

→ 200 OK

# Clic en "No recibi": mismo endpoint, cambias el canal

requests.post(f'{API}/otp', headers=H,

json={**payload, 'channel': 'whatsapp'})

→ 201 · action: resent

# 2do clic: fallback final con 'channel': 'voice'

$api = 'https://api.smsmasivos.com.mx/v2';

$h = ['apikey: ' . getenv('API_KEY'), 'Content-Type: application/json'];

// Paso 1: Solicitar codigo

$ch = curl_init($api . '/otp');

curl_setopt($ch, CURLOPT_HTTPHEADER, $h);

curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([

'phone_number' => '5512345678',

'country_code' => '52',

'company'      => 'Mi App',

'message'      => '{{code}} es tu clave de acceso a {{company}}',

]));

curl_exec($ch);

→ 201 · action: created

// Paso 3: Validar codigo (sin costo)

$r = curl_init($api . '/otp/verify');

curl_setopt($r, CURLOPT_HTTPHEADER, $h);

curl_setopt($r, CURLOPT_POSTFIELDS, json_encode([

'phone_number' => '5512345678', 'country_code' => '52', 'code' => '483920']));

curl_exec($r);

→ 200 OK

// Clic en "No recibi": mismo endpoint, cambias el canal

$w = curl_init($api . '/otp');

curl_setopt($w, CURLOPT_HTTPHEADER, $h);

curl_setopt($w, CURLOPT_POSTFIELDS, json_encode([

'phone_number' => '5512345678', 'country_code' => '52',

'company'      => 'Mi App',

'message'      => '{{code}} es tu clave de acceso a {{company}}',

'channel'      => 'whatsapp',

]));

curl_exec($w);

→ 201 · action: resent

// 2do clic: fallback final con 'channel' => 'voice'

// Un closure: las 3 llamadas comparten base, apikey y Content-Type

post := func(path, body string) {

req, _ := http.NewRequest("POST", "https://api.smsmasivos.com.mx/v2"+path,

strings.NewReader(body))

req.Header.Set("apikey", os.Getenv("API_KEY"))

req.Header.Set("Content-Type", "application/json")

http.DefaultClient.Do(req)

}

// Paso 1: Envia el codigo

post("/otp", `{"phone_number":"5512345678","country_code":"52",

"company":"Mi App","message":"{{code}} es tu clave de acceso a {{company}}"}`)

→ 201 · action: created

// Paso 2: Usuario ingresa el codigo en tu app

→ Código capturado

// Paso 3: Validar codigo (sin costo)

post("/otp/verify",

`{"phone_number":"5512345678","country_code":"52","code":"483920"}`)

→ 200 OK

// Clic en "No recibi": mismo endpoint, cambias el canal

post("/otp", `{"phone_number":"5512345678","country_code":"52",

"company":"Mi App","message":"{{code}} es tu clave de acceso a {{company}}",

"channel":"whatsapp"}`)

→ 201 · action: resent

// 2do clic, fallback final: "channel":"voice"

→ Voz

// Dentro de un metodo que declare throws Exception (client.send es checked)

String api = "https://api.smsmasivos.com.mx/v2";

String key = System.getenv("API_KEY");

HttpClient client = HttpClient.newHttpClient();

// Paso 1: Solicitar codigo

String body = "{\"phone_number\":\"5512345678\",\"country_code\":\"52\","

+ "\"company\":\"Mi App\",\"message\":\"{{code}} es tu clave de acceso a {{company}}\"}";

client.send(HttpRequest.newBuilder(URI.create(api + "/otp"))

.header("apikey", key).header("Content-Type", "application/json")

.POST(BodyPublishers.ofString(body)).build(), BodyHandlers.ofString());

→ 201 · action: created

// Paso 2: Usuario ingresa el codigo en tu app

→ Código capturado

// Paso 3: Validar codigo (sin costo)

client.send(HttpRequest.newBuilder(URI.create(api + "/otp/verify"))

.header("apikey", key).header("Content-Type", "application/json")

.POST(BodyPublishers.ofString(

"{\"phone_number\":\"5512345678\",\"country_code\":\"52\",\"code\":\"483920\"}"))

.build(), BodyHandlers.ofString());

→ 200 OK

// Clic en "No recibi": mismo endpoint, cambias el canal

String resend = "{\"phone_number\":\"5512345678\",\"country_code\":\"52\","

+ "\"company\":\"Mi App\",\"message\":\"{{code}} es tu clave de acceso a {{company}}\","

+ "\"channel\":\"whatsapp\"}";

client.send(HttpRequest.newBuilder(URI.create(api + "/otp"))

.header("apikey", key).header("Content-Type", "application/json")

.POST(BodyPublishers.ofString(resend)).build(), BodyHandlers.ofString());

→ 201 · action: resent

// 2do clic, fallback final: "channel":"voice"

→ Voz

// Paso 1: Solicitar codigo

var client = new HttpClient();

client.DefaultRequestHeaders.Add("apikey",

Environment.GetEnvironmentVariable("API_KEY"));

await client.PostAsJsonAsync("https://api.smsmasivos.com.mx/v2/otp", new {

phone_number = "5512345678", country_code = "52",

company = "Mi App",

message = "{{code}} es tu clave de acceso a {{company}}"

});

→ 201 · action: created

// Paso 2: Usuario ingresa el codigo en tu app

→ Código capturado

// Paso 3: Validar codigo (sin costo)

await client.PostAsJsonAsync("https://api.smsmasivos.com.mx/v2/otp/verify", new {

phone_number = "5512345678", country_code = "52", code = "483920" });

→ 200 OK

// Clic en "No recibi": mismo endpoint, cambias el canal

await client.PostAsJsonAsync("https://api.smsmasivos.com.mx/v2/otp", new {

phone_number = "5512345678", country_code = "52",

company = "Mi App",

message = "{{code}} es tu clave de acceso a {{company}}",

channel = "whatsapp" });

→ 201 · action: resent

// 2do clic: fallback final con channel = "voice"

→ Voz

# Paso 1: Solicitar codigo

api = 'https://api.smsmasivos.com.mx/v2'

hdr = { 'apikey' => ENV['API_KEY'], 'Content-Type' => 'application/json' }

payload = {

phone_number: '5512345678', country_code: '52',

company: 'Mi App',

message: '{{code}} es tu clave de acceso a {{company}}'

}

Net::HTTP.post(URI("#{api}/otp"), payload.to_json, hdr)

→ 201 · action: created

# Paso 2: Usuario ingresa el codigo en tu app

→ Código capturado

# Paso 3: Validar codigo (sin costo)

Net::HTTP.post(URI("#{api}/otp/verify"),

{ phone_number: '5512345678', country_code: '52', code: '483920' }.to_json, hdr)

→ 200 OK

# Clic en "No recibi": mismo endpoint, cambias el canal

Net::HTTP.post(URI("#{api}/otp"),

payload.merge(channel: 'whatsapp').to_json, hdr)

→ 201 · action: resent

# 2do clic, fallback final: channel: 'voice'

→ Voz

  • · phone_number va a 10 dígitos, sin lada de país ni espacios. El +52 se manda aparte.
  • · country_code es numérico en string: "52", no "MX".
  • · message es obligatorio y debe traer los marcadores {{code}} y {{company}}. Máximo 160 caracteres ya sustituidos.

Las APIs globales tratan México como Tier-2.

Un agregador internacional introduce latencia, drop rate y falta de visibilidad. Tu tasa de registro lo paga.

Drop rate invisible

Las rutas de agregador reportan "enviado" aunque nunca llegó al carrier: dashboard verde, pantalla en blanco para tu usuario.

Latencia variable

El código llega en 8-20 segundos variables: el usuario asume que está roto y abandona.

Sin factura fiscal MX

Las APIs internacionales no emiten CFDI 4.0. Para cualquier empresa mexicana, eso es gasto de infraestructura que no puedes deducir.

SMS Masivos tiene rutas directas a los 4 carriers.

Sin intermediarios: ruta directa, entrega garantizada en menos de 5 segundos.

Si el SMS no llega, dale al botón. Listo.

Un clic activa el reintento por WhatsApp transaccional o Voz desde el mismo endpoint. Sin timers ni colas, sin difusión a listas frías: el destinatario es quien acaba de pedir su código, y ese clic es su opt-in.

1. SMS

Envío inmediato por ruta directa al carrier

Inicial

2. WhatsApp

Clic en "No recibí" reenvía por WhatsApp

1er clic

3. Voz

Si tampoco llega, voz robótica dicta el código

2do clic

Usuario verificado

Registro completado. Tasa de conversión protegida.

Mismo endpoint POST /v2/otp, cambias el canal.

Con la confianza de empresas en México

Desde 2010

en el mercado mexicano

4

carriers directos en MX

CFDI

4.0 en cada compra

MX

soporte en español

Clientes referencia: Nissan, Soriana, Holcim, HP

Prueba la entrega real antes de pagar.

8 créditos sin costo para probar la entrega real antes de decidir.

Trial sin costo

8

créditos sin costo

Sin tarjeta de crédito
Rescue automático incluido
Acceso completo a la API y docs
Facturación fiscal desde la primera compra
Activar API Key Gratis
Precios transparentes

Calcula tu costo al instante

Sin renta mensual. Compras créditos que no expiran: entre más volumen, menor el precio unitario. Créditos prepago, sin fecha de vencimiento.

Calculadora

¿Cuántos SMS vas a enviar?

SMS

Mínimo 500 SMS. Más de 400,000 cotiza volumen.

Tu costo total
$450.00
MXN + IVA
Precio / SMS
$0.90
Escalón
500+
Si recargas 500 SMS más (= 1,000), tu precio baja a $0.77 / SMS. Ahorras $65.00 en los 500 originales.
Recargar 500 SMS ahora

Envía vía API REST, CSV o integración con Shopify, WooCommerce y Zapier

Alto volumen: desde $0.23 / SMS con recargas 200,000+
Baja hasta $0.13 / SMS en volúmenes muy altos

¿Por qué SMS Masivos?

Compara lo que importa para una empresa mexicana que verifica usuarios en producción.

Carriers en México

SMS Masivos

Directo a Telcel, Movistar, AT&T, Altán

Otro proveedor

Ruta de agregador

Velocidad de entrega

SMS Masivos

Menos de 5 segundos

Otro proveedor

10-30+ segundos

Rescue automático vía API

SMS Masivos

SMS a WhatsApp a Voz

Otro proveedor

Solo SMS

CFDI 4.0

SMS Masivos

Incluido

Otro proveedor

No disponible

Visibilidad real, no solo "enviado / no enviado"

Tasa de verificación por carrier, tiempo de entrega y patrones de abuso.

Datos ilustrativos
Analytics · Últimas 24 h
en vivo

OTPs enviados

12,483

↑ 3.2% vs ayer

Tasa de entrega

99.1%

rutas directas

Tiempo promedio

3.2 seg

mediana nacional

Rescues activos

247

reintento WA / Voz

Datos ilustrativos. Tu dashboard muestra métricas reales de tu cuenta en tiempo real.

Preguntas frecuentes

¿Cuánto tarda la integración?

Entre 15 y 30 minutos con acceso a los docs: 2 endpoints (POST /v2/otp para enviar, reenviar y cambiar de canal; POST /v2/otp/verify para validar, sin costo). La lógica de generación y validación ya está integrada.

¿Necesito tarjeta de crédito para el trial?

No. Tu cuenta incluye 8 créditos sin costo para probar la entrega real en México.

¿Emiten CFDI 4.0?

Sí, automático en cada recarga. Aceptamos tarjeta, SPEI, PayPal y OXXO. Sin conversión de divisas.

¿Funciona con todos los carriers mexicanos?

Sí, con ruta directa: Telcel, Movistar, AT&T, Altán y MVNOs. Sin agregador global, sin Tier-2.

¿Qué pasa si el SMS no llega?

Se activa el rescue automático: conexión alterna al carrier, luego WhatsApp y, si hace falta, voz. Mismo endpoint, sin desarrollo adicional.

Activa tu API key sin costo

8 créditos sin costo. Rutas directas y rescue SMS, WhatsApp o Voz.

Obtener API Key Gratis Ver los endpoints
Sin tarjeta de crédito
CFDI 4.0 automático
Soporte en español, horario México
Obtener API Key Gratis