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.
SMS Masivos
+52 55 9162-4427
Tu código de acceso es 428291. No lo compartas. Mi App.
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.
# 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_numberva a 10 dígitos, sin lada de país ni espacios. El+52se manda aparte. -
·
country_codees numérico en string:"52", no"MX". -
·
messagees 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
2. WhatsApp
Clic en "No recibí" reenvía por WhatsApp
3. Voz
Si tampoco llega, voz robótica dicta el código
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
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.
¿Cuántos SMS vas a enviar?
Mínimo 500 SMS. Más de 400,000 cotiza volumen.
Envía vía API REST, CSV o integración con Shopify, WooCommerce y Zapier
¿Por qué SMS Masivos?
Compara lo que importa para una empresa mexicana que verifica usuarios en producción.
| Característica |
|
Otro proveedor |
|---|---|---|
| Carriers en México | Telcel, Movistar, AT&T, Altán. Ruta directa. | Rutas de agregador internacional |
| Velocidad de entrega | Menos de 5 segundos | Variable, 10-30+ segundos |
| Rescue automático vía API | SMS a WhatsApp a Voz | Solo SMS |
| CFDI 4.0 | Incluido en cada compra | No disponible |
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.
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