Download OpenAPI specification:Download
API de integración del servicio de 2FA (autenticación de dos factores) y OTP (código de un solo uso). El sistema genera un código, lo envía al usuario final y usted lo valida con una segunda llamada. El código puede viajar por una lista ORDENADA de canales: SMS, VOZ (llamada con locución), EMAIL, WHATSAPP, RCS y PUSH. Si la entrega del primer canal falla, el sistema reenvía EL MISMO código por el siguiente canal de la lista automáticamente, sin intervención del integrador.
Esta versión sustituye a la API de 2FA/OTP de la v5 (peticionotp.php / validarotp.php), que solo enviaba por SMS o VOZ.
En su cuenta de usuario encontrará el Usuario API y el API Token, ambos son necesarios para realizar las peticiones API REST a las funciones de la API. Las Peticiones, por seguridad deben realizarse en POST y con protocolo HTTPS Seguro.
Para utilizar la Autenticación Básica debe incluir una cabecera en las peticiones del tipo: Authorization: Basic Base64StringAPI donde Base64StringAPI es la codificación en Base64 de la cadena UsuarioAPI:APIToken, puede encontrar su Usuario API y API Token en su cuenta de usuario en Tus Datos -> Configurar Cuenta.
Para generar el string codificado en Base64, simplemente genere el string UsuarioApi:APIToken y codifíquelo en base64 mediante cualquier función base64encode.
Flujo normal del servicio:
1.- Su aplicación solicita el teléfono (y/o email) al usuario para validar una operación.
2.- Su aplicación llama a EnviarOTP: el sistema genera el código y lo envía.
3.- El usuario introduce el código recibido y su aplicación llama a ValidarOTP.
4.- Si el resultado es 1, la operación queda validada.
Requisitos por canal:
Cada canal que incluya en la cascada debe estar disponible en su cuenta:
- SMS: siempre disponible. MENSAJE opcional (por defecto se envía uno estándar con el código); si lo indica debe contener [CODE].
- VOZ: llamada con locución Text-to-Speech que deletrea el código. Requiere un número de voz propio ACTIVO como REMITENTE (solicitado en el panel).
- EMAIL: con DOMINIO propio validado (remitente de su dominio) o sin DOMINIO (sale por el dominio transaccional por defecto del servicio). ASUNTO y MENSAJEEMAIL opcionales.
- WHATSAPP: requiere cuenta WhatsApp Business conectada, IDTELEFONO e IDPLANTILLA de una plantilla de AUTENTICACIÓN aprobada por Meta (el código rellena la variable del body y el botón de copiar código).
- RCS: requiere Agente RCS activo (IDAGENTE) y una plantilla (IDPLANTILLA) que incluya la variable (CODE).
- PUSH: aviso a los dispositivos del usuario final vinculados desde el panel (sección Avisos). El destino es el ALIAS del dispositivo (parámetro REFPUSH o el campo REF del canal).
Cascada de reintento: El estado de entrega lo notifica cada operador. Si un canal reporta fallo definitivo, el sistema reenvía el MISMO código por el siguiente canal de la lista. Cuando el código se valida (o caduca), la cascada se detiene automáticamente.
Webhook de estados (recomendado, evita el polling):
Si su cuenta tiene configurada una URL de reports (Tus Datos → Configurar Cuenta), cada cambio de estado del código se envía por POST a esa URL con un JSON que incluye Tipo:"OTP", Evento (entregado | leido | reenviado | fallido), idOTP, idEnvio, App, Destinatario/Email, Canal, CanalesFallidos, Fecha, Expira y ReferenciaUsuario (nunca el código). El evento reenviado añade Motivo y el Canal nuevo. Con webhook configurado, ConsultarOTP solo responde cuando la entrega ya está resuelta (o la petición validada/caducada): la integración correcta es webhook + ValidarOTP, sin bucles de consulta.
Seguimiento en el panel:
Cada petición OTP aparece en el panel como una campaña omnicanal de un destinatario, en Envío Omnicanal → Campañas, etiquetada como OTP y con su propio filtro (Solo OTP), con el detalle de canal, entregas y reintentos.
Control antifraude (opcional):
Con ANTIFRAUDE=SI, antes de enviar se consulta el módulo antifraude sobre el destino (DatosTelefono si hay teléfono; DatosEmail si el destino es solo email; se cobra según el catálogo del módulo). La respuesta incluye el objeto Antifraude con el riesgo (0-100) y sus motivos; si el riesgo alcanza ANTIFRAUDEMAXRIESGO el envío se rechaza con Res -16. Útil contra el SMS-pumping y los números recién portados (secuestro de línea).
Anti-abuso:
Por seguridad, un mismo destino admite un máximo de 5 peticiones de envío cada 10 minutos (Res -6 si se supera). El número de intentos de validación se limita con MAXINTENTOS (por defecto 3). Los códigos se almacenan con hash, viajan cifrados en la cola de reintentos (nunca en claro en reposo) y las respuestas nunca los devuelven.
Migración desde la API v5 (peticionotp/validarotp):
La autenticación pasa de Correo/Passwd a Usuario API + API Token (Basic). El envío por defecto sigue siendo SMS y el parámetro MENSAJE con [CODE] se mantiene. Fail2Voice se sustituye por la cascada (añada el canal voz detrás del sms). Los códigos de resultado de ValidarOTP son los mismos que en la v5.
Respuesta de las peticiones:
La mayoría de las funciones disponen de un parámetro denominado 'Resp'. Este parámetro define el formato de la respuesta que se devolverá. Puede ser TXT, JSON o XML. Se recomienda siempre definir este parámetro.
Autenticación HTTP Basic. Use su Usuario API como usuario y su API Token como contraseña (los encuentra en su panel, en Tus Datos → Configurar Cuenta). El header resultante es Authorization: Basic base64(UsuarioAPI:APIToken). La mayoría de las librerías HTTP lo construyen automáticamente (curl -u, requests auth=, basic_auth de Ruby, etc.) sin necesidad de codificar el base64 a mano.
basicGenera un código de un solo uso y lo envía al destino por la cascada de canales indicada en CANALES (por defecto, SMS). Devuelve idOTP para validar/consultar después. Si la entrega de un canal falla, el sistema reintenta automáticamente por el siguiente canal con el MISMO código.
| Destinatario | string Example: Destinatario=34600000001 Teléfono del usuario final en formato internacional sin '+' (Ej: 34600000001). Obligatorio si la cascada incluye sms, voz, whatsapp o rcs. |
string Example: Email=usuario@ejemplo.com Email del usuario final. Obligatorio si la cascada incluye el canal email. | |
| Refpush | string Example: Refpush=cliente-4471 Alias del dispositivo vinculado del usuario final (sección Avisos del panel). Obligatorio si la cascada incluye el canal push y el canal no trae su propio REF. |
| Nombre | string Example: Nombre=Pedro Aicart Nombre del destinatario; disponible como variable {{NOMBRE}} en las plantillas. |
| Canales | Array of strings Example: Canales=[{"Tipo":"whatsapp","IdTelefono":"572863982585983","IdPlantilla":"codigo_acceso"},{"Tipo":"sms","Remitente":"MIEMPRESA","Mensaje":"Su codigo de acceso es [CODE]"}] Array JSON ORDENADO de canales de la cascada (cada tipo una sola vez; máximo 6). Si se omite se envía por sms. Campos por elemento:
|
| Mensaje | string Example: Mensaje=Su codigo de verificacion es [CODE]. No lo comparta con nadie. Plantilla común para los canales sms/voz/email/push que no traigan la suya. Debe contener [CODE] (se sustituye por el código generado). Si se omite, cada canal usa su texto por defecto. |
| Remitente | string Example: Remitente=MIEMPRESA Remitente por defecto del canal sms (máx. 11 caracteres alfanuméricos). |
| Codigo | string Example: Codigo= Código propio generado por su aplicación (3 a 10 caracteres alfanuméricos). Si se omite, el sistema lo genera según LONG y TIPO (recomendado). |
| Long | integer Example: Long=6 Longitud del código a generar (3 a 10). |
| Tipo | integer Example: Tipo=1 Alfabeto del código:
|
| Maxintentos | integer Example: Maxintentos=3 Intentos de validación fallidos antes de invalidar el código (0 = ilimitados, máximo 10). |
| Validez | integer Example: Validez=600 Tiempo en segundos durante el que el código puede validarse (60 a 86400). Por ejemplo 600 para 10 minutos. |
| Appid | integer Example: Appid=0 Identificador de la aplicación que hace la petición. Permite validar el mismo destino en aplicaciones distintas sin interferirse. |
| Variables | Array of strings Example: Variables={"NOMBRE":"Pedro"} Variables extra para las plantillas (objeto plano {"VAR":"valor"} o lista [{Nombre,Valor}]): {{NOMBRE}}, cabeceras multimedia de WhatsApp... La variable CODE la pone siempre el sistema. |
| Referenciausuario | string Example: Referenciausuario=login-web Referencia libre para sus listados (máx. 50 caracteres). |
| Validarcanales | string Enum: "NO" "SI" Example: Validarcanales=NO SI = valida la configuración REAL de cada canal antes de enviar: agente y plantilla RCS (y que incluya la variable CODE), plantilla email con su HTML, cuenta WhatsApp Business con el teléfono registrado y la plantilla APROBADA en Meta, y dispositivos push vinculados con el alias. Pensado para PREPRODUCCIÓN: añade latencia y tiene límite de peticiones por minuto (Res -6). En producción use NO. |
| Antifraude | string Enum: "NO" "SI" Example: Antifraude=NO SI = antes de enviar consulta el módulo antifraude sobre el destino (DatosTelefono con teléfono; DatosEmail si el destino es solo email). La consulta se cobra según el catálogo del módulo (una repetición reciente no se cobra). La respuesta incluye el objeto Antifraude; si el riesgo alcanza ANTIFRAUDEMAXRIESGO no se envía (Res -16). Si la consulta no puede resolverse (avería del proveedor), el código SE ENVÍA igualmente y Antifraude lo avisa. |
| Antifraudemaxriesgo | integer Example: Antifraudemaxriesgo=50 Riesgo (0-100) a partir del cual el envío se rechaza con ANTIFRAUDE=SI. 0 = solo informar, nunca bloquear. 50 equivale al nivel ALTO del módulo. |
| Resp | string Enum: "TXT" "JSON" "XML" Example: Resp=JSON Tipo de respuesta a mostrar como resultado de la llamada.
|
Los parámetros se envían en el cuerpo de la petición POST, como objeto JSON (Content-Type application/json, RECOMENDADO) o como formulario application/x-www-form-urlencoded. En el formato formulario, los parámetros de tipo array u objeto se envían como string JSON-codificado. Los nombres de los parámetros no distinguen mayúsculas de minúsculas. La descripción detallada de cada parámetro está en la sección de parámetros de esta operación.
| Destinatario | string |
string | |
| Refpush | string |
| Nombre | string |
| Canales | Array of any |
| Mensaje | string |
| Remitente | string |
| Codigo | string |
| Long | integer |
| Tipo | integer |
| Maxintentos | integer |
| Validez | integer |
| Appid | integer |
| Variables | Array of any |
| Referenciausuario | string |
| Validarcanales | string |
| Antifraude | string |
| Antifraudemaxriesgo | integer |
| Resp | string |
| Res required | integer <int32> Respuesta de la función solicitada
|
| Error | string En caso de Res negativo, descripción del problema. |
| idOTP | integer Identificador de la petición OTP. Úselo en ValidarOTP y ConsultarOTP. |
| idEnvio | integer Identificador de la campaña omnicanal que transporta el código (visible en el panel). |
| Canal | string Canal por el que ha salido el primer intento (sms|voz|email|whatsapp|rcs|push). |
| Expira | string Fecha y hora hasta la que el código puede validarse. |
| MaxIntentos | integer Intentos de validación admitidos (0 = ilimitados). |
| CreditosUsados | number Créditos cobrados por el primer intento (solo se cobra el canal por el que realmente sale cada intento). |
| Antifraude | Array of arrays Solo con ANTIFRAUDE=SI: resultado de la consulta del módulo antifraude sobre el destino (Riesgo con Puntos 0-100, Nivel y Motivos; Linea u objetos Dominio/Buzon en email; Creditos cobrados por la consulta). |
| Cred | number Créditos disponibles en la cuenta tras la operación. |
{- "Destinatario": "34600000001",
- "Email": "usuario@ejemplo.com",
- "Refpush": "cliente-4471",
- "Nombre": "Pedro Aicart",
- "Canales": "[{\"Tipo\":\"whatsapp\",\"IdTelefono\":\"572863982585983\",\"IdPlantilla\":\"codigo_acceso\"},{\"Tipo\":\"sms\",\"Remitente\":\"MIEMPRESA\",\"Mensaje\":\"Su codigo de acceso es [CODE]\"}]",
- "Mensaje": "Su codigo de verificacion es [CODE]. No lo comparta con nadie.",
- "Remitente": "MIEMPRESA",
- "Codigo": "",
- "Long": "6",
- "Tipo": "1",
- "Maxintentos": "3",
- "Validez": "600",
- "Appid": "0",
- "Variables": "{\"NOMBRE\":\"Pedro\"}",
- "Referenciausuario": "login-web",
- "Validarcanales": "NO",
- "Antifraude": "NO",
- "Antifraudemaxriesgo": "50",
- "Resp": "JSON"
}[- {
- "Res": "1",
- "Error": "",
- "idOTP": "88231",
- "idEnvio": "1024",
- "Canal": "sms",
- "Expira": "2026-09-01 10:40:00",
- "MaxIntentos": "3",
- "CreditosUsados": "1",
- "Antifraude": "{\"Servicio\":\"DatosTelefono\",\"Riesgo\":{\"Puntos\":10,\"Nivel\":\"BAJO\",\"Motivos\":[\"No se ha detectado ningun indicio de riesgo en los datos del numero.\"]},\"Linea\":{\"Tipo\":\"movil\",\"TipoTexto\":\"Movil\"},\"Creditos\":1,\"Repetida\":0}",
- "Cred": "970.5"
}
]Valida el código introducido por el usuario final. La petición se localiza por IDOTP (recomendado) o por DESTINATARIO/EMAIL + APPID (la última de ese destino). Al validar, la cascada de reintentos del código se detiene automáticamente. Los códigos de resultado son los mismos que en la API v5.
| Idotp | integer Example: Idotp=88231 Identificador devuelto por EnviarOTP. Si se indica, no hace falta DESTINATARIO/EMAIL. |
| Destinatario | string Example: Destinatario=34600000001 Teléfono al que se envió el código, en formato internacional sin '+'. |
string Example: Email=usuario@ejemplo.com Email al que se envió el código. | |
| Appid | integer Example: Appid=0 Identificador de aplicación usado en EnviarOTP. |
| Codigo required | string Example: Codigo=430913 Código introducido por el usuario final (3 a 10 caracteres). |
| Resp | string Enum: "TXT" "JSON" "XML" Example: Resp=JSON Tipo de respuesta a mostrar como resultado de la llamada.
|
Los parámetros se envían en el cuerpo de la petición POST, como objeto JSON (Content-Type application/json, RECOMENDADO) o como formulario application/x-www-form-urlencoded. En el formato formulario, los parámetros de tipo array u objeto se envían como string JSON-codificado. Los nombres de los parámetros no distinguen mayúsculas de minúsculas. La descripción detallada de cada parámetro está en la sección de parámetros de esta operación.
| Idotp | integer |
| Destinatario | string |
string | |
| Appid | integer |
| Codigo required | string |
| Resp | string |
| Res required | integer <int32> Respuesta de la función solicitada
|
| Error | string En caso de Res negativo, descripción del problema. |
| idOTP | integer Identificador de la petición validada. |
| FechaValidado | string Fecha y hora de la validación. |
| Intentos | integer Intentos realizados hasta la validación. |
| Canal | string Canal por el que estaba viajando el código. |
| Cred | number Créditos disponibles en la cuenta. |
{- "Idotp": "88231",
- "Destinatario": "34600000001",
- "Email": "usuario@ejemplo.com",
- "Appid": "0",
- "Codigo": "430913",
- "Resp": "JSON"
}[- {
- "Res": "1",
- "Error": "",
- "idOTP": "88231",
- "FechaValidado": "2026-09-01 10:32:11",
- "Intentos": "1",
- "Canal": "sms",
- "Cred": "970.5"
}
]Devuelve el estado completo de una petición OTP: canal actual, estado de entrega (pendiente, enviado, entregado, leído, reenviado por otro canal, fallido), validación y créditos cobrados. Nunca devuelve el código.
NO es una función de polling: los cambios de estado se envían a su webhook (JSON con Tipo:"OTP"). Si su cuenta tiene webhook configurado, esta consulta devuelve -10 hasta que la entrega esté resuelta (webhook de entregado/leído/fallido emitido) o la petición validada/caducada, y hay un límite de consultas por minuto (-6). Sin webhook configurado responde siempre.
| Idotp | integer Example: Idotp=88231 Identificador devuelto por EnviarOTP. Si se indica, no hace falta DESTINATARIO/EMAIL. |
| Destinatario | string Example: Destinatario=34600000001 Teléfono al que se envió el código, en formato internacional sin '+'. Se consulta la ÚLTIMA petición de ese destino. |
string Example: Email=usuario@ejemplo.com Email al que se envió el código. | |
| Appid | integer Example: Appid=0 Identificador de aplicación usado en EnviarOTP. |
| Resp | string Enum: "TXT" "JSON" "XML" Example: Resp=JSON Tipo de respuesta a mostrar como resultado de la llamada.
|
Los parámetros se envían en el cuerpo de la petición POST, como objeto JSON (Content-Type application/json, RECOMENDADO) o como formulario application/x-www-form-urlencoded. En el formato formulario, los parámetros de tipo array u objeto se envían como string JSON-codificado. Los nombres de los parámetros no distinguen mayúsculas de minúsculas. La descripción detallada de cada parámetro está en la sección de parámetros de esta operación.
| Idotp | integer |
| Destinatario | string |
string | |
| Appid | integer |
| Resp | string |
| Res required | integer <int32> Respuesta de la función solicitada
|
| idOTP | integer Identificador de la petición. |
| App | integer APPID de la petición. |
| Telefono | string Teléfono destino (vacío si el OTP fue solo por email/push). |
string Email destino (vacío si no se usó). | |
| Fecha | string Fecha de la petición. |
| Expira | string Fecha de caducidad del código. |
| Expirado | integer 1 si el código ya ha caducado. |
| Canal | string Canal actual del código (sms|voz|email|whatsapp|rcs|push). |
| EstadoEnvio | string Estado de entrega: pendiente | enviado | entregado | leido | reenviado | fallido. |
| CanalesFallidos | string Canales que ya fallaron para esta petición (CSV). |
| IntentosEnvio | integer Intentos de envío realizados (uno por canal usado). |
| UltimoError | string Último error de envío, si lo hubo. |
| Validado | integer 1 si el código ya fue validado. |
| FechaValidado | string Fecha de la validación (si Validado=1). |
| IntentosValidacion | integer Intentos de validación realizados. |
| MaxIntentos | integer Intentos de validación admitidos (0 = ilimitados). |
| ReferenciaUsuario | string Referencia libre indicada en EnviarOTP. |
| CreditosUsados | number Créditos cobrados hasta ahora por esta petición. |
| Cred | number Créditos disponibles en la cuenta. |
{- "Idotp": "88231",
- "Destinatario": "34600000001",
- "Email": "usuario@ejemplo.com",
- "Appid": "0",
- "Resp": "JSON"
}[- {
- "Res": "1",
- "idOTP": "88231",
- "App": "0",
- "Telefono": "34600000001",
- "Email": "usuario@ejemplo.com",
- "Fecha": "2026-09-01 10:30:00",
- "Expira": "2026-09-01 10:40:00",
- "Expirado": "0",
- "Canal": "sms",
- "EstadoEnvio": "entregado",
- "CanalesFallidos": "",
- "IntentosEnvio": "1",
- "UltimoError": "",
- "Validado": "1",
- "FechaValidado": "2026-09-01 10:32:11",
- "IntentosValidacion": "1",
- "MaxIntentos": "3",
- "ReferenciaUsuario": "login-web",
- "CreditosUsados": "1",
- "Cred": "970.5"
}
]Listado de las peticiones OTP de un periodo (máximo 31 días) con su estado de entrega y validación. Sustituye al report CSV de la v5: aquí el listado llega estructurado en la propia respuesta.
| Fechadesde | string Example: Fechadesde=2026-08-01 00:00 Inicio del periodo, formato YYYY-MM-DD HH:mm (CET/CEST). Si se omite: 30 días antes de FECHAHASTA (o de hoy). |
| Fechahasta | string Example: Fechahasta=2026-08-31 23:59 Fin del periodo, formato YYYY-MM-DD HH:mm (CET/CEST). Si se omite: ahora (o 31 días tras FECHADESDE). |
| Appid | string Example: Appid=-1 Filtra por identificador de aplicación. -1 (por defecto) devuelve todas. |
| Max | integer Example: Max=1000 Máximo de filas a devolver (1 a 5000). |
| Resp | string Enum: "TXT" "JSON" "XML" Example: Resp=JSON Tipo de respuesta a mostrar como resultado de la llamada.
|
Los parámetros se envían en el cuerpo de la petición POST, como objeto JSON (Content-Type application/json, RECOMENDADO) o como formulario application/x-www-form-urlencoded. En el formato formulario, los parámetros de tipo array u objeto se envían como string JSON-codificado. Los nombres de los parámetros no distinguen mayúsculas de minúsculas. La descripción detallada de cada parámetro está en la sección de parámetros de esta operación.
| Fechadesde | string |
| Fechahasta | string |
| Appid | string |
| Max | integer |
| Resp | string |
| Res required | integer <int32> Respuesta de la función solicitada
|
| Num | integer Número de peticiones devueltas. |
| FechaDesde | string Inicio efectivo del periodo consultado. |
| FechaHasta | string Fin efectivo del periodo consultado. |
| Peticiones | Array of arrays Listado de peticiones. Cada elemento incluye: idOTP, App, Fecha, Expira, Telefono, Email, Canal, EstadoEnvio (pendiente|enviado|entregado|leido|reenviado|fallido), CanalesFallidos, IntentosEnvio, UltimoError, Validado, FechaValidado, IntentosValidacion, MaxIntentos, ReferenciaUsuario y CreditosUsados. El código nunca se incluye. |
| Cred | number Créditos disponibles en la cuenta. |
{- "Fechadesde": "2026-08-01 00:00",
- "Fechahasta": "2026-08-31 23:59",
- "Appid": "-1",
- "Max": "1000",
- "Resp": "JSON"
}[- {
- "Res": "1",
- "Num": "25",
- "FechaDesde": "2026-08-01 00:00",
- "FechaHasta": "2026-08-31 23:59",
- "Peticiones": "[{\"idOTP\":88231,\"App\":0,\"Fecha\":\"2026-08-30 10:30:00\",\"Expira\":\"2026-08-30 10:40:00\",\"Telefono\":\"34600000001\",\"Email\":\"\",\"Canal\":\"sms\",\"EstadoEnvio\":\"entregado\",\"CanalesFallidos\":\"\",\"IntentosEnvio\":1,\"UltimoError\":\"\",\"Validado\":1,\"FechaValidado\":\"2026-08-30 10:31:12\",\"IntentosValidacion\":1,\"MaxIntentos\":3,\"ReferenciaUsuario\":\"login-web\",\"CreditosUsados\":1}]",
- "Cred": "970.5"
}
]