Verificación OTP

Verificación en dos pasos (OTP) — generar, verificar, reenviar y restablecer códigos

Enviar Código de Verificación (OTP)
POST /otp/send
Verificar Código OTP
POST /otp/verify
Reenviar Código de Verificación (OTP)
POST /otp/resend
Restablecer Verificación OTP
POST /otp/reset

The Verificación Otp object

Returned by the verificación otp endpoints.

Attributes
successboolean
messagestring
Mensaje de estado
statusinteger
codestring
Código de respuesta
total_messagesinteger
Número de mensajes enviados
numberstring
Número de teléfono del destinatario con código de país
creditnumber
Créditos consumidos
referencestring
ID único de referencia del mensaje
verification_codestring
Código de verificación (solo cuando showcode=1)
fallbackboolean
True si ocurrió fallback de WhatsApp o Voz a SMS
The Verificación Otp object
{
  "success": true,
  "message": "code_successfully_generated",
  "status": 200,
  "code": "verification_01",
  "total_messages": 1,
  "number": "525512345678",
  "credit": 1,
  "reference": "abc123def456ghi789jkl",
  "verification_code": "123456",
  "fallback": false
}

Enviar Código de Verificación (OTP)

POST https://api.smsmasivos.com.mx/otp/send

Genera y envía un código de verificación por SMS, WhatsApp o llamada de voz al número especificado. Usa `showcode=1` para recibir el código en la respuesta (útil en sandbox/testing).

Parameters
phone_numberstringrequired
Número de teléfono a verificar, formato: XXXXXXXXXX (10 dígitos).
country_codestringrequired
Código de país. Por estandarización, siempre se debe enviar `52` que es el código correspondiente a México.
companystringrequired
Nombre de la compañía mostrada al usuario en el mensaje de verificación.
templateenumoptional
Letra de la plantilla SMS a utilizar. Las variables `{{company}}` y `{{code}}` se reemplazan automáticamente. Por defecto `a`. **Plantillas disponibles:** | Letra | Contenido del mensaje | |-------|----------------------| | **a** | "{{company}} El codigo de verificacion es: {{code}}" | | **b** | "Ingresa el siguiente codigo en tu app de {{company}} para validar tu cuenta: {{code}}" | | **c** | "Ingresa el codigo {{code}} para activar tu cuenta de {{company}}" | | **d** | "El codigo de autenticacion para {{company}} es: {{code}}" | | **e** | "Captura el codigo {{code}} para activar tu cuenta {{company}}" | | **f** | "{{company}} Tu codigo es: {{code}}" | | **g** | "Tu codigo de confirmacion {{company}} es: {{code}}" | | **h** | "{{code}} es tu codigo de verificacion de {{company}}" | | **i** | "{{code}} es tu codigo para iniciar sesion en {{company}}" | | **j** | "Tu codigo de activacion para {{company}} es el {{code}}" | | **k** | "{{company}}: {{code}} es tu codigo de seguridad" | | **l** | "Tu codigo de verificacion {{company}} es: {{code}} No compartas este codigo con nadie." | | **m** | "Tu codigo {{company}} es: {{code}}" | | **n** | "Usa la clave {{code}} para ingresar a {{company}}" | Usa `formal_tone: true` para cambiar el trato de "tú" a "usted" sin alterar la plantilla.abcdefghijklmn
formal_tonebooleanoptional
Define el trato gramatical del mensaje. `false` = trato informal (tú). `true` = trato formal (usted). Por defecto `false`.
code_lengthintegeroptional
Longitud del código de verificación (4 a 10 caracteres). Por defecto `4`.
expiration_datestringoptional
Fecha de expiración para el código de verificación. Por defecto 24 hrs. Máximo 3 días. Formato: `YYYY-MM-DD HH:mm:ss`.
localeenumoptional
Idioma de la respuesta. `es` = Español, `en` = Inglés. Por defecto `es`.esen
showcodeenumoptional
Devuelve el código de verificación generado en la respuesta. `1` = Mostrar, `0` = No mostrar. Por defecto `0`.01
code_typeenumoptional
Tipo de código generado. `alphanumeric` = letras y números, `numeric` = solo números, `letters` = solo letras. Por defecto `alphanumeric`.alphanumericnumericletters
senderstringoptional
Nombre del remitente personalizado (hasta 11 caracteres alfanuméricos). Si no lo tienes contratado, este parámetro se ignora.
referencebooleanoptional
Devuelve la referencia del mensaje enviado en la respuesta. Por defecto `true`.
curl -X POST https://api.smsmasivos.com.mx/otp/send \
  -H "Content-Type: application/json" \
  -H "apikey: TU_API_KEY" \
  -d '{
    "phone_number": "5512345678",
    "country_code": "52",
    "company": "Mi Empresa",
    "code_length": 6,
    "code_type": "numeric"
  }'
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.smsmasivos.com.mx/otp/send');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/json',
    'apikey: ' . getenv('SMSMASIVOS_API_KEY')
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
    'phone_number' => '5512345678',
    'country_code' => '52',
    'company' => 'Mi Empresa',
    'code_length' => 6,
    'code_type' => 'numeric'
]));
$response = curl_exec($ch);
curl_close($ch);
echo $response;
import requests

response = requests.post(
    'https://api.smsmasivos.com.mx/otp/send',
    headers={
        'Content-Type': 'application/json',
        'apikey': 'TU_API_KEY'
    },
    json={
        'phone_number': '5512345678',
        'country_code': '52',
        'company': 'Mi Empresa',
        'code_length': 6,
        'code_type': 'numeric'
    }
)
print(response.json())
const response = await fetch('https://api.smsmasivos.com.mx/otp/send', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'apikey': process.env.SMSMASIVOS_API_KEY
  },
  body: JSON.stringify({
    phone_number: '5512345678',
    country_code: '52',
    company: 'Mi Empresa',
    code_length: 6,
    code_type: 'numeric'
  })
});
const data = await response.json();
console.log(data);
const axios = require('axios');

const { data } = await axios.post(
  'https://api.smsmasivos.com.mx/otp/send',
  {
    phone_number: '5512345678',
    country_code: '52',
    company: 'Mi Empresa',
    code_length: 6,
    code_type: 'numeric'
  },
  {
    headers: {
      'Content-Type': 'application/json',
      'apikey': process.env.SMSMASIVOS_API_KEY
    }
  }
);
console.log(data);
require 'net/http'
require 'json'

uri = URI('https://api.smsmasivos.com.mx/otp/send')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

request = Net::HTTP::Post.new(uri.path, {
  'Content-Type' => 'application/json',
  'apikey' => ENV['SMSMASIVOS_API_KEY']
})
request.body = {
  phone_number: '5512345678',
  country_code: '52',
  company: 'Mi Empresa',
  code_length: 6,
  code_type: 'numeric'
}.to_json

response = http.request(request)
puts JSON.parse(response.body)
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("apikey", "TU_API_KEY");

var payload = new
{
    phone_number = "5512345678",
    country_code = "52",
    company = "Mi Empresa",
    code_length = 6,
    code_type = "numeric"
};

var response = await client.PostAsJsonAsync(
    "https://api.smsmasivos.com.mx/otp/send",
    payload
);
var result = await response.Content.ReadFromJsonAsync<JsonElement>();
Console.WriteLine(result);
OkHttpClient client = new OkHttpClient();

String json = "{"
    + "\"phone_number\":\"5512345678\","
    + "\"country_code\":\"52\","
    + "\"company\":\"Mi Empresa\","
    + "\"code_length\":6,"
    + "\"code_type\":\"numeric\""
    + "}";

Request request = new Request.Builder()
    .url("https://api.smsmasivos.com.mx/otp/send")
    .post(RequestBody.create(json, MediaType.parse("application/json")))
    .addHeader("apikey", "TU_API_KEY")
    .build();

Response response = client.newCall(request).execute();
System.out.println(response.body().string());
Response
{
  "success": true,
  "message": "Código generado exitosamente",
  "status": 200,
  "code": "verification_01",
  "request_id": "550e8400-e29b-41d4-a716-446655440000",
  "verification_code": "A1B2"
}
{
  "success": false,
  "message": "API Key inválida o no existe.",
  "status": 401,
  "code": "<string>"
}
{
  "success": false,
  "message": "API Key inválida o no existe.",
  "status": 401,
  "code": "auth_05"
}
{
  "success": false,
  "message": "La dirección IP no está autorizada para acceder.",
  "status": 403,
  "code": "auth_04"
}
{
  "success": false,
  "message": "Demasiadas solicitudes. Límite: 100 mensajes/segundo (producción) o 100/día (sandbox).",
  "status": 429,
  "code": "rate_01"
}
{
  "success": false,
  "message": "Error interno del servidor. Contacta a soporte con el request_id.",
  "status": 500,
  "code": "server_01",
  "request_id": "550e8400-e29b-41d4-a716-446655440000"
}

Verificar Código OTP

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

Verifica el código de verificación que el usuario ingresó. Una vez validado correctamente, el número queda verificado.

Parameters
phone_numberstringrequired
Número de teléfono a verificar, formato: XXXXXXXXXX (10 dígitos).
verification_codestringrequired
El código de verificación que el usuario recibió y capturó en tu aplicación.
localeenumoptional
Idioma de la respuesta. `es` = Español, `en` = Inglés. Por defecto `es`.esen
curl -X POST https://api.smsmasivos.com.mx/otp/verify \
  -H "Content-Type: application/json" \
  -H "apikey: TU_API_KEY" \
  -d '{
    "phone_number": "5512345678",
    "verification_code": "A1B2"
  }'
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.smsmasivos.com.mx/otp/verify');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/json',
    'apikey: ' . getenv('SMSMASIVOS_API_KEY')
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
    'phone_number' => '5512345678',
    'verification_code' => 'A1B2'
]));
$response = curl_exec($ch);
curl_close($ch);
echo $response;
import requests

response = requests.post(
    'https://api.smsmasivos.com.mx/otp/verify',
    headers={
        'Content-Type': 'application/json',
        'apikey': 'TU_API_KEY'
    },
    json={
        'phone_number': '5512345678',
        'verification_code': 'A1B2'
    }
)
print(response.json())
const response = await fetch('https://api.smsmasivos.com.mx/otp/verify', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'apikey': process.env.SMSMASIVOS_API_KEY
  },
  body: JSON.stringify({
    phone_number: '5512345678',
    verification_code: 'A1B2'
  })
});
const data = await response.json();
console.log(data);
const axios = require('axios');

const { data } = await axios.post(
  'https://api.smsmasivos.com.mx/otp/verify',
  {
    phone_number: '5512345678',
    verification_code: 'A1B2'
  },
  {
    headers: {
      'Content-Type': 'application/json',
      'apikey': process.env.SMSMASIVOS_API_KEY
    }
  }
);
console.log(data);
require 'net/http'
require 'json'

uri = URI('https://api.smsmasivos.com.mx/otp/verify')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

request = Net::HTTP::Post.new(uri.path, {
  'Content-Type' => 'application/json',
  'apikey' => ENV['SMSMASIVOS_API_KEY']
})
request.body = {
  phone_number: '5512345678',
  verification_code: 'A1B2'
}.to_json

response = http.request(request)
puts JSON.parse(response.body)
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("apikey", "TU_API_KEY");

var payload = new
{
    phone_number = "5512345678",
    verification_code = "A1B2"
};

var response = await client.PostAsJsonAsync(
    "https://api.smsmasivos.com.mx/otp/verify",
    payload
);
var result = await response.Content.ReadFromJsonAsync<JsonElement>();
Console.WriteLine(result);
OkHttpClient client = new OkHttpClient();

String json = "{"
    + "\"phone_number\":\"5512345678\","
    + "\"verification_code\":\"A1B2\""
    + "}";

Request request = new Request.Builder()
    .url("https://api.smsmasivos.com.mx/otp/verify")
    .post(RequestBody.create(json, MediaType.parse("application/json")))
    .addHeader("apikey", "TU_API_KEY")
    .build();

Response response = client.newCall(request).execute();
System.out.println(response.body().string());
Response
{
  "success": true,
  "message": "Usuario verificado exitosamente",
  "status": 200,
  "code": "validation_01",
  "request_id": "550e8400-e29b-41d4-a716-446655440000"
}
{
  "success": false,
  "message": "API Key inválida o no existe.",
  "status": 401,
  "code": "<string>"
}
{
  "success": false,
  "message": "API Key inválida o no existe.",
  "status": 401,
  "code": "auth_05"
}
{
  "success": false,
  "message": "La dirección IP no está autorizada para acceder.",
  "status": 403,
  "code": "auth_04"
}
{
  "success": false,
  "message": "Demasiadas solicitudes. Límite: 100 mensajes/segundo (producción) o 100/día (sandbox).",
  "status": 429,
  "code": "rate_01"
}
{
  "success": false,
  "message": "Error interno del servidor. Contacta a soporte con el request_id.",
  "status": 500,
  "code": "server_01",
  "request_id": "550e8400-e29b-41d4-a716-446655440000"
}

Reenviar Código de Verificación (OTP)

POST https://api.smsmasivos.com.mx/otp/resend

Reenvía el código de verificación al número especificado. Puedes cambiar el canal (SMS, WhatsApp, voz) y reiniciar el código con `reset_code=true`. Si el usuario no recibe el SMS, usa el parámetro `voice=true` para realizar una llamada en lugar de enviar un SMS.

Parameters
phone_numberstringrequired
Número de teléfono a verificar, formato: XXXXXXXXXX (10 dígitos).
country_codestringrequired
Código de país. Por estandarización, siempre se debe enviar `52` que es el código correspondiente a México.
companystringrequired
Nombre de la compañía mostrada al usuario en el mensaje de verificación.
templateenumoptional
Letra de la plantilla SMS a utilizar. Las variables `{{company}}` y `{{code}}` se reemplazan automáticamente. Por defecto `a`. **Plantillas disponibles:** | Letra | Contenido del mensaje | |-------|----------------------| | **a** | "{{company}} El codigo de verificacion es: {{code}}" | | **b** | "Ingresa el siguiente codigo en tu app de {{company}} para validar tu cuenta: {{code}}" | | **c** | "Ingresa el codigo {{code}} para activar tu cuenta de {{company}}" | | **d** | "El codigo de autenticacion para {{company}} es: {{code}}" | | **e** | "Captura el codigo {{code}} para activar tu cuenta {{company}}" | | **f** | "{{company}} Tu codigo es: {{code}}" | | **g** | "Tu codigo de confirmacion {{company}} es: {{code}}" | | **h** | "{{code}} es tu codigo de verificacion de {{company}}" | | **i** | "{{code}} es tu codigo para iniciar sesion en {{company}}" | | **j** | "Tu codigo de activacion para {{company}} es el {{code}}" | | **k** | "{{company}}: {{code}} es tu codigo de seguridad" | | **l** | "Tu codigo de verificacion {{company}} es: {{code}} No compartas este codigo con nadie." | | **m** | "Tu codigo {{company}} es: {{code}}" | | **n** | "Usa la clave {{code}} para ingresar a {{company}}" | Usa `formal_tone: true` para cambiar el trato de "tú" a "usted" sin alterar la plantilla.abcdefghijklmn
formal_tonebooleanoptional
Define el trato gramatical del mensaje. `false` = trato informal (tú). `true` = trato formal (usted). Por defecto `false`.
code_lengthintegeroptional
Longitud del código de verificación (4 a 10 caracteres). Se ignora si no se solicita reinicio del código.
expiration_datestringoptional
Fecha de expiración para el código de verificación. Por defecto 24 hrs. Máximo 3 días. Formato: `YYYY-MM-DD HH:mm:ss`.
localeenumoptional
Idioma de la respuesta. `es` = Español, `en` = Inglés. Por defecto `es`.esen
reset_codebooleanoptional
Reinicia el código de verificación. `true` = genera un nuevo código aleatorio. `false` = conserva el mismo código. Por defecto `false`.
voicebooleanoptional
Canal de voz para enviar el código. `true` = realiza una llamada telefónica con voz robótica. `false` = envía por SMS. Por defecto `false`.
whatsappbooleanoptional
Envía el código de verificación a través de WhatsApp. Requiere una instancia de WhatsApp configurada y activa. Si no está disponible, se envía por SMS (fallback).
showcodeenumoptional
Devuelve el código de verificación generado en la respuesta. `1` = Mostrar, `0` = No mostrar. Por defecto `0`.01
code_typeenumoptional
Tipo de código generado. Requiere `reset_code=true` para cambiar el tipo. `alphanumeric` = letras y números, `numeric` = solo números, `letters` = solo letras.alphanumericnumericletters
senderstringoptional
Nombre del remitente personalizado (hasta 11 caracteres alfanuméricos). Si no lo tienes contratado, este parámetro se ignora.
referencebooleanoptional
Devuelve la referencia del mensaje enviado en la respuesta. Por defecto `true`.
curl -X POST https://api.smsmasivos.com.mx/otp/resend \
  -H "Content-Type: application/json" \
  -H "apikey: TU_API_KEY" \
  -d '{
    "phone_number": "5512345678",
    "country_code": "52",
    "company": "Mi Empresa"
  }'
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.smsmasivos.com.mx/otp/resend');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/json',
    'apikey: ' . getenv('SMSMASIVOS_API_KEY')
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
    'phone_number' => '5512345678',
    'country_code' => '52',
    'company' => 'Mi Empresa'
]));
$response = curl_exec($ch);
curl_close($ch);
echo $response;
import requests

response = requests.post(
    'https://api.smsmasivos.com.mx/otp/resend',
    headers={
        'Content-Type': 'application/json',
        'apikey': 'TU_API_KEY'
    },
    json={
        'phone_number': '5512345678',
        'country_code': '52',
        'company': 'Mi Empresa'
    }
)
print(response.json())
const response = await fetch('https://api.smsmasivos.com.mx/otp/resend', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'apikey': process.env.SMSMASIVOS_API_KEY
  },
  body: JSON.stringify({
    phone_number: '5512345678',
    country_code: '52',
    company: 'Mi Empresa'
  })
});
const data = await response.json();
console.log(data);
const axios = require('axios');

const { data } = await axios.post(
  'https://api.smsmasivos.com.mx/otp/resend',
  {
    phone_number: '5512345678',
    country_code: '52',
    company: 'Mi Empresa'
  },
  {
    headers: {
      'Content-Type': 'application/json',
      'apikey': process.env.SMSMASIVOS_API_KEY
    }
  }
);
console.log(data);
require 'net/http'
require 'json'

uri = URI('https://api.smsmasivos.com.mx/otp/resend')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

request = Net::HTTP::Post.new(uri.path, {
  'Content-Type' => 'application/json',
  'apikey' => ENV['SMSMASIVOS_API_KEY']
})
request.body = {
  phone_number: '5512345678',
  country_code: '52',
  company: 'Mi Empresa'
}.to_json

response = http.request(request)
puts JSON.parse(response.body)
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("apikey", "TU_API_KEY");

var payload = new
{
    phone_number = "5512345678",
    country_code = "52",
    company = "Mi Empresa"
};

var response = await client.PostAsJsonAsync(
    "https://api.smsmasivos.com.mx/otp/resend",
    payload
);
var result = await response.Content.ReadFromJsonAsync<JsonElement>();
Console.WriteLine(result);
OkHttpClient client = new OkHttpClient();

String json = "{"
    + "\"phone_number\":\"5512345678\","
    + "\"country_code\":\"52\","
    + "\"company\":\"Mi Empresa\""
    + "}";

Request request = new Request.Builder()
    .url("https://api.smsmasivos.com.mx/otp/resend")
    .post(RequestBody.create(json, MediaType.parse("application/json")))
    .addHeader("apikey", "TU_API_KEY")
    .build();

Response response = client.newCall(request).execute();
System.out.println(response.body().string());
Response
{
  "success": true,
  "message": "Código generado exitosamente",
  "status": 200,
  "code": "verification_01",
  "request_id": "550e8400-e29b-41d4-a716-446655440000",
  "verification_code": "A1B2"
}
{
  "success": false,
  "message": "API Key inválida o no existe.",
  "status": 401,
  "code": "<string>"
}
{
  "success": false,
  "message": "API Key inválida o no existe.",
  "status": 401,
  "code": "auth_05"
}
{
  "success": false,
  "message": "La dirección IP no está autorizada para acceder.",
  "status": 403,
  "code": "auth_04"
}
{
  "success": false,
  "message": "Demasiadas solicitudes. Límite: 100 mensajes/segundo (producción) o 100/día (sandbox).",
  "status": 429,
  "code": "rate_01"
}
{
  "success": false,
  "message": "Error interno del servidor. Contacta a soporte con el request_id.",
  "status": 500,
  "code": "server_01",
  "request_id": "550e8400-e29b-41d4-a716-446655440000"
}

Restablecer Verificación OTP

POST https://api.smsmasivos.com.mx/otp/reset

Restablece (reinicia) el registro de verificación asociado a un número. Este método no envía ningún mensaje — solo limpia el estado para permitir una nueva verificación. Útil para flujos de contraseñas únicas donde necesitas re-verificar al usuario.

Parameters
phone_numberstringrequired
Número de teléfono a verificar, formato: XXXXXXXXXX (10 dígitos).
country_codestringrequired
Código de país. Por estandarización, siempre se debe enviar `52` que es el código correspondiente a México.
reset_codebooleanoptional
Reinicia el código de verificación. `true` = genera un nuevo código aleatorio. `false` = conserva el mismo código. Por defecto `false`.
curl https://api.smsmasivos.com.mx/otp/reset \
  -d phone_number=5512345678 \
  -d country_code=52 \
  -d reset_code=true
const Verificación OTP = await sms.verificacinotp.create({
  phone_number: '5512345678',
  country_code: '52',
  reset_code: 'true',
})
Verificación OTP = sms.verificacinotp.create(
    phone_number="5512345678",
    country_code="52",
    reset_code="true",
)
Verificación OTP, err := client.Verificacinotp.Create(ctx, &sms.VerificaciNOTPParams{
    PhoneNumber: sms.String("5512345678"),
    CountryCode: sms.String("52"),
    ResetCode: sms.String("true"),
})
Response
{
  "success": true,
  "message": "Usuario reiniciado correctamente",
  "status": 200,
  "code": "verification_01",
  "request_id": "550e8400-e29b-41d4-a716-446655440000"
}
{
  "success": false,
  "message": "API Key inválida o no existe.",
  "status": 401,
  "code": "<string>"
}
{
  "success": false,
  "message": "API Key inválida o no existe.",
  "status": 401,
  "code": "auth_05"
}
{
  "success": false,
  "message": "La dirección IP no está autorizada para acceder.",
  "status": 403,
  "code": "auth_04"
}
{
  "success": false,
  "message": "Demasiadas solicitudes. Límite: 100 mensajes/segundo (producción) o 100/día (sandbox).",
  "status": 429,
  "code": "rate_01"
}
{
  "success": false,
  "message": "Error interno del servidor. Contacta a soporte con el request_id.",
  "status": 500,
  "code": "server_01",
  "request_id": "550e8400-e29b-41d4-a716-446655440000"
}