API Envío de Contratos para Firma — v4 (4.0)

INTRODUCCIÓN

API REST de integración para el envío de contratos y documentos para firma electrónica desde sus aplicaciones. Esta es la versión 4 (v4), plenamente compatible con peticiones del formato v3 anterior, pero ampliada con las siguientes capacidades nuevas:



Resumen de novedades v4:
1. Canales omnicanal en cascada: en lugar de un único canal de notificación (SMS/Email/SMS-cert), ahora puede definir una lista ordenada de canales (SMS, Email, RCS, WhatsApp). El sistema intentará el primero y, si falla, pasará automáticamente al siguiente, dándole máxima fiabilidad de entrega.
2. Grupos secuenciales de autorización: documentos que el firmante debe revisar y aceptar antes de llegar al contrato a firmar (NDA, RGPD, etc.). Hasta 3 grupos secuenciales (Grupo 1 → Grupo 2 → Grupo 3 → Contrato).
3. Recuadros múltiples por documento: hasta 10 recuadros de firma de tipo Firmante y 10 de tipo Emisor por cada PDF, no uno solo como en v3.
4. OTP por canal específico: el código OTP puede enviarse por el canal que elija (SMS, Email, RCS o WhatsApp), no solo SMS.
5. Multi-envío: en una sola petición puede crear N contratos independientes, cada uno con su lista de firmantes y variables propias (útil para envíos masivos personalizados).
6. Identificación interna trazable: cada mensaje generado lleva una RefInterna con formato CONTRATO-{idC}-{idU}-{idF} que permite consultar todos los envíos asociados a un contrato.



Compatibilidad legacy: si su integración actual envía peticiones v3 a este endpoint v4, funcionarán exactamente igual sin modificaciones. El sistema detecta automáticamente el formato y aplica el comportamiento adecuado. Esto le permite migrar a v4 cuando lo desee, no a la fuerza.

COMPATIBILIDAD Y VERSIONES


Versión 1.0 – 1.7: Última actualización 2017. Versiones no soportadas. Contacte con soporte para ayuda a la migración.
Versión 2.0 – 2.55: Última actualización 2021. Funcionales pero se recomienda migrar a v3 o superior.
Versión 3.0 – 3.1: Última actualización 2023. Soporte completo. Convive con v4.
Versión 4.0: Esta versión (2026). Añade canales omnicanal, autorizaciones secuenciales, recuadros múltiples, OTP por canal elegible y multi-envío. Compatible 100% hacia atrás con v3.

AUTENTICACIÓN

En su cuenta de usuario encontrará el Usuario API y el API Token, ambos necesarios para realizar las peticiones REST. Las peticiones, por seguridad, deben realizarse en POST sobre HTTPS (TLS ≥ 1.2).



Para utilizar la Autenticación Básica HTTP debe incluir una cabecera 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 concatene UsuarioApi:APIToken y codifíquelo con cualquier función base64_encode.

FORMATO DE LA PETICIÓN

Todas las peticiones a esta API se realizan mediante POST en formato JSON en el body. La cabecera debe incluir Content-Type: application/json.



El parámetro RESP indica el formato de la respuesta. Valores posibles: JSON (recomendado), XML o TXT. Si no se especifica, se asume TXT por compatibilidad con versiones antiguas de la API.

CONCEPTOS CLAVE — DEBE LEER ESTO ANTES DE INTEGRAR

1. Canales de notificación (CANALESFIRMA)

Un canal es un medio por el que el sistema envía al firmante el enlace de firma. Los canales soportados son:
  • SMS: mensaje de texto al móvil del firmante.
  • EMAIL: correo electrónico al email del firmante. Puede usar el dominio por defecto del distribuidor (token interno __mensatek__ — el nombre se conserva por compatibilidad con datos existentes en BD; conceptualmente significa «dominio por defecto») o un dominio propio validado por DNS en su cuenta.
  • RCS: mensaje RCS (Rich Communication Services) al móvil del firmante. Requiere agente RCS y plantilla configurados en el panel.
  • WHATSAPP: mensaje WhatsApp al móvil del firmante. Requiere cuenta WhatsApp Business (WABA) y plantilla configurada en el panel.

Cascada: el array CANALESFIRMA es una lista ordenada. El sistema intentará el primer canal; si el envío falla (operador caído, número inválido, plantilla rechazada, etc.), pasará automáticamente al siguiente. Si todos fallan, el envío queda marcado como fallido y puede reintentarse manualmente o esperar al recordatorio.

Recordatorios rotativos: si configura recordatorios automáticos, cada uno utilizará el siguiente canal de la cascada (no el mismo que ya falló previamente). De ese modo se maximiza la probabilidad de alcanzar al firmante.


Variables sustituibles en mensajes y plantillas (todos estos formatos son equivalentes, puede usar el que prefiera): {{LINK}}, [LINK], (LINK), ###LINK###. Las variables disponibles son:
    {{LINK}} — enlace único de firma para ese firmante.
    {{NOMBRE}} — nombre del firmante.
    {{NIF}} — NIF del firmante.
    {{EMAIL}} — email del firmante.
    {{MOVIL}} — móvil del firmante.
    {{TIPODOCUMENTO}} — el valor que pase en TIPODOCUMENTO (por defecto 'contrato').

2. Canales OTP (CANALESOTP)

Si TIPOFIRMA=OTP, el sistema enviará al firmante un código de un solo uso (PIN de 5 dígitos) que debe introducir antes de firmar. Por defecto se envía por SMS al móvil del firmante (comportamiento legacy v3). En v4 puede configurar CANALESOTP con la misma estructura que CANALESFIRMA para enviar el OTP por el canal/plantilla que prefiera.


La variable sustituible específica del PIN es: {{CODE}}. La plantilla del canal OTP debe contenerla obligatoriamente.

3. Documentos (TIPODOC + GRUPOAUT)

Los documentos del contrato pueden ser de dos tipos:
  • CONTRATO (default): el documento principal a firmar. Acepta recuadros de firma del firmante y del emisor.
  • AUTORIZACION: un documento que el firmante debe revisar y aceptar antes de llegar al contrato a firmar. Se agrupan en hasta 3 grupos secuenciales mediante GRUPOAUT (1, 2 o 3). El firmante deberá aceptar primero todos los del Grupo 1, después los del Grupo 2, después los del Grupo 3 y, finalmente, firmar el documento de tipo CONTRATO.

Coste extra por autorizaciones: PRECIO_FIJO_AUTORIZACIONES (7 créditos) × número de grupos distintos usados. Por ejemplo, si tiene autorizaciones del Grupo 1 y Grupo 3 (sin Grupo 2), se cobran 14 créditos (no 21).

4. Recuadros múltiples por documento (STAMPFIRMASFIRMANTE / STAMPFIRMASEMISOR)

En v3 cada PDF aceptaba un único recuadro de firma para el firmante (STAMPFIRMAFIRMANTE) y otro para el emisor (STAMPFIRMAEMISOR). En v4 puede definir hasta 10 recuadros de cada tipo mediante los nuevos parámetros plurales STAMPFIRMASFIRMANTE y STAMPFIRMASEMISOR (arrays de strings con el mismo formato que el singular: pag,x,y,tamx,tamy,H|V).


Si solo necesita un recuadro, siga usando los singulares legacy. Si envía ambos (singular y plural) prevalece el plural.

5. Multi-envío (ENVIOS)

En una sola petición puede generar múltiples contratos independientes, cada uno con sus propios firmantes y variables personalizables. Útil para enviar el mismo documento a N personas con datos individualizados sin tener que hacer N peticiones a la API.


Si el JSON incluye el campo ENVIOS (array de objetos), se ignoran los campos FIRMANTES y PERSONALIZACION de nivel raíz y cada objeto en ENVIOS genera un contrato independiente. La respuesta devuelve un array Contratos con un objeto por cada contrato creado.

A TENER EN CUENTA

Conexiones en vacío: Una conexión errónea repetida será tratada por el sistema como spam y podrá llegar a bloquear temporalmente la conexión. Evite realizar repetidas conexiones con datos erróneos o conexiones rápidas 'en vacío' (sin envíos) con los mismos datos para obtener el número de créditos o el mismo report.

Para obtener reports de forma óptima en tiempo real se recomienda configurar la API en el panel para recibirlos en un script de su web.


Respuesta de las peticiones: La mayoría de las funciones disponen de un parámetro RESP que define el formato de la respuesta (JSON, XML o TXT). Se recomienda definirlo siempre como JSON para máxima claridad. Si no se define, las funciones responden por defecto en formato TXT por compatibilidad con versiones antiguas.


Funcionamiento recomendado:
- PROCESO 1: Envío de petición de firma con la función /EnviarContrato.
- PROCESO 2: Recepción automática de cambios de estado en su web (configurable en el panel — ver sección 'Recepción automática de eventos' en este documento).

Enviar Petición de Firma (v4 omnicanal)

/EnviarContrato

Función principal de la API. Crea un contrato (o varios, si usa ENVIOS) y envía la solicitud de firma al/a los firmantes por los canales configurados.

Esta es la función más completa de la API. Soporta tanto el formato legacy v3 (un único canal definido por MEDIOCOMUNICACION, recuadros singulares, un solo envío) como el formato nuevo v4 (cascada omnicanal con CANALESFIRMA/CANALESOTP, recuadros múltiples, autorizaciones por grupos, multi-envío).

El sistema detecta automáticamente qué formato usa el cliente y aplica el comportamiento adecuado. Es perfectamente válido mezclar parámetros legacy y nuevos en una misma petición (por ejemplo: enviar CANALESFIRMA moderno pero seguir usando STAMPFIRMAFIRMANTE singular).

ATENCIÓN: revise la sección de recepción de eventos al final si desea recibir el estado de los contratos y las interacciones del firmante en tiempo real en un script de su servidor.

query Parameters
Firmantes
Array of arrays
Example: Firmantes=[{"Nombre":"Pedro Pérez","NIF":"00000000T","Email":"destinatario@eldominio.com","Telefono":"34600000001","Orden":1}]

Array JSON con los datos de los firmantes. Use este parámetro cuando solo va a enviar UN contrato. Para enviar varios contratos en una sola petición, use ENVIOS en su lugar (ver más abajo).

Cada elemento del array debe contener:
Nombre : (Obligatorio si VERIFICACIONIDENTIDAD=NO) Nombre y apellidos del firmante.
NIF : (Obligatorio si VERIFICACIONIDENTIDAD=NO) NIF/DNI del firmante.
Email : (Opcional pero requerido si no incluye Telefono) Email del firmante.
Telefono : (Opcional pero requerido si no incluye Email) Móvil del firmante con prefijo internacional sin '+', ej. '34600000001'.
Orden : (Opcional) Orden de firma cuando hay varios firmantes. El firmante con menor Orden firma primero.



Si VERIFICACIONIDENTIDAD=SI, los campos Nombre y NIF se rellenan automáticamente con los datos verificados durante el proceso de identificación, por lo que pueden omitirse.



Ejemplo con dos firmantes:


                       ["FIRMANTES": [
                          {
                            "Nombre":   "Pedro Aicart",
                            "NIF":      "00000000T",
                            "Email":    "pedro@dominio.com",
                            "Telefono": "34600000002",
                            "Orden":    1
                          },
                          {
                            "Nombre":   "Ana Aguado",
                            "NIF":      "00000001E",
                            "Telefono": "34600000001",
                            "Orden":    2
                          }
                        ]
Envios
Array of strings
Example: Envios=[{"Firmantes":[{"Nombre":"Juan","NIF":"11111111H","Telefono":"34611111111","Email":"juan@a.com","Orden":1}],"Variables":{"importe":"100€"}}]

NUEVO en v4. Array JSON para crear múltiples contratos independientes en una sola petición. Cada objeto del array genera un contrato.



Use este parámetro en lugar de FIRMANTES + PERSONALIZACION cuando necesite enviar el mismo documento a varias personas con variables personalizadas distintas. Si envía ENVIOS, los campos FIRMANTES y PERSONALIZACION de nivel raíz se ignoran.



Cada objeto en el array debe contener:
Firmantes : (Obligatorio) Array de firmantes para este contrato (misma estructura que el parámetro FIRMANTES de nivel raíz).
Variables : (Opcional) Objeto con pares clave/valor de variables sustituibles en plantillas y mensajes para este contrato concreto. Las claves se normalizan a minúsculas y se accederá a ellas en plantillas como {{nombrevariable}}.



Ejemplo: dos contratos con variables distintas


                       ["ENVIOS": [
                          {
                            "Firmantes": [
                              { "Nombre":"Juan García", "NIF":"11111111H", "Telefono":"34611111111", "Email":"juan@a.com", "Orden":1 }
                            ],
                            "Variables": { "importe":"100€", "plazo":"30 días" }
                          },
                          {
                            "Firmantes": [
                              { "Nombre":"Ana Pérez", "NIF":"22222222J", "Telefono":"34622222222", "Email":"ana@a.com", "Orden":1 }
                            ],
                            "Variables": { "importe":"250€", "plazo":"60 días" }
                          }
                        ]



La respuesta cuando se usa ENVIOS contiene un array Contratos con un objeto por cada contrato creado (con ContratoId, ReportID, Firmantes, Documentos).

Flujotrabajo
string
Example: Flujotrabajo=238754787

Identificador de un flujo de trabajo previamente guardado en su panel. Tiene predefinidos documentos, plantillas, tipo de firma, etc. y basta con definir los firmantes en la petición.

Las variables de la petición prevalecen sobre las del flujo (ej. si en el flujo está TIPOFIRMA=ACEPTACION y en la petición envía TIPOFIRMA=BIOMETRICA, se usa BIOMETRICA). Excepción: DOCUMENTOS y FIRMASEMISOR son acumulativos (se añaden los del flujo a los de la petición).

Firmasemisor
Array of arrays
Example: Firmasemisor=[{"ID":1865998}]

Array JSON con las firmas de emisor (usted) guardadas en su cuenta que desea estampar sobre los documentos firmados. El sistema añade su firma y certificados al documento al final del proceso, completando el documento legal. Los recuadros donde se estampan se definen con STAMPFIRMAEMISOR/STAMPFIRMASEMISOR en cada documento PDF.



Cada elemento del array debe contener:
ID: Identificador de la firma manuscrita o certificada guardada en su cuenta. Lo encuentra en el panel.

Documentos
Array of arrays
Example: Documentos=[{"Tipo":"PDF","Nombre":"Contrato","Contenido":"JVBERi0xLj...","Aceptacion":"SI","TipoDoc":"CONTRATO","StampFirmaFirmante":"1,80,500,180,80,H"}]

Array JSON con la lista de documentos del contrato. Cada elemento representa un PDF, una plantilla del panel o una casilla de verificación.



Tipos soportados (campo Tipo):
  PLANTILLA : Plantilla creada en su panel. Requiere Plantilla, Nombre, Aceptacion.
  PDF : Fichero PDF en base64. Requiere Contenido, Nombre, Aceptacion. Opcionalmente StampFirmaEmisor/StampFirmaFirmante (singular legacy) o StampFirmasEmisor/StampFirmasFirmante (plural NUEVO v4).
  CHECKBOX : Pregunta al firmante (RGPD, etc.). Requiere Texto, Inicial, Final.



Campos comunes:
Tipo : PLANTILLA | PDF | CHECKBOX (Obligatorio)
Nombre : Nombre visible para el firmante (PLANTILLA y PDF).
TipoDoc : NUEVO v4. CONTRATO (default) o AUTORIZACION.
GrupoAut : NUEVO v4. 1, 2 o 3. Solo válido si TipoDoc=AUTORIZACION; indica en qué grupo secuencial debe revisarse este documento antes del contrato.



Campos para PLANTILLA:
Plantilla : ID de la plantilla del panel. Formato {idUsuario}-{idPlantilla}.
Aceptacion : SI (el firmante debe llegar al final con scroll) | NO (puede firmar sin scroll).



Campos para PDF:
Contenido : Contenido del PDF en base64.
Aceptacion : SI | NO (igual que PLANTILLA).
StampFirmaEmisor : (Singular legacy) Recuadro UNO de la firma del emisor. Formato: pag,x,y,tamx,tamy,H|V. Ej. 1,80,580,220,110,H.
StampFirmaFirmante : (Singular legacy) Recuadro UNO de la firma del firmante. Mismo formato.
StampFirmasEmisor : NUEVO v4. Array de strings — hasta 10 recuadros del emisor con el mismo formato que el singular.
StampFirmasFirmante : NUEVO v4. Array de strings — hasta 10 recuadros del firmante.



Formato de recuadro pag,x,y,tamx,tamy,H|V:
  pag : página (1-based).
  x : coordenada X del borde izquierdo (0 = borde izquierdo de la página).
  y : coordenada Y del borde superior (0 = borde superior de la página).
  tamx : ancho del recuadro.
  tamy : alto del recuadro.
  H | V : orientación de la página. V (vertical, default A4): max ancho 595, max alto 841. H (horizontal A4): max ancho 841, max alto 595.



Campos para CHECKBOX:
Texto : La pregunta o frase que verá el firmante.
Inicial : OFF (desactivada al cargar) | ON (activada al cargar).
Final : OFF (debe quedar desactivada para firmar) | ON (debe quedar activada) | LIBRE (el firmante decide).



Ejemplo: 2 autorizaciones (Grupo 1 y Grupo 2) + contrato con 2 recuadros firmante


                           ["DOCUMENTOS": [
                              {
                                "Tipo":     "PDF",
                                "Nombre":   "NDA Confidencialidad",
                                "Contenido":"JVBERi0xLj...",
                                "TipoDoc":  "AUTORIZACION",
                                "GrupoAut": 1
                              },
                              {
                                "Tipo":     "PDF",
                                "Nombre":   "Política de Privacidad RGPD",
                                "Contenido":"JVBERi0xLj...",
                                "TipoDoc":  "AUTORIZACION",
                                "GrupoAut": 2
                              },
                              {
                                "Tipo":       "PDF",
                                "Nombre":     "Contrato Principal",
                                "Contenido":  "JVBERi0xLj...",
                                "TipoDoc":    "CONTRATO",
                                "Aceptacion": "SI",
                                "StampFirmasFirmante": [
                                  "1,80,500,180,80,H",
                                  "2,80,500,180,80,H"
                                ],
                                "StampFirmasEmisor": [
                                  "1,320,500,180,80,H"
                                ]
                              }
                            ]
Documentossolicitados
Array of arrays
Example: Documentossolicitados=[{"Texto":"Adjunte copia del DNI","Firmante":0}]

Array JSON con documentos que el firmante debe ADJUNTAR al firmar (ej. copia DNI, justificante, etc.). Cada elemento define un texto descriptivo y a qué firmante se le pide.



Coste fijo: PRECIO_FIJO_SOLICITUD_DOCUMENTOS (11 créditos).



Cada elemento debe contener:
Texto : Descripción del documento solicitado (ej. 'Adjunte copia de su DNI por las dos caras').
Firmante : 0 = a todos los firmantes; 1, 2, ... = al firmante con ese índice (1-based).

Personalizacion
string
Example: Personalizacion={"importe":"100€","plazo":"30 días"}

Variables sustituibles en plantillas y mensajes. Debe ser un string JSON con un objeto plano de pares clave/valor. Las claves se normalizan a minúsculas y se accede a ellas en plantillas como {{nombrevariable}} (o equivalentes [nombrevariable], (nombrevariable), ###nombrevariable###).



Si usa ENVIOS (multi-envío), defina las variables en Variables dentro de cada envío en lugar de aquí.

Tipofirma
string
Enum: 1 2 3 4
Example: Tipofirma=BIOMETRICA

Tipo de firma a aplicar. IMPORTANTE: debe usar el TEXTO, no el número.



ACEPTACION : Firma por aceptación explícita (botón Acepto/Rechazo).
OTP : Firma con código OTP de un solo uso. Si no envía CANALESOTP, el OTP irá por SMS al móvil del firmante.
BIOMETRICA : Firma manuscrita biométrica (default).
CERTIFICADO : Firma con certificado electrónico o DNI electrónico del firmante.

Remitente
string
Example: Remitente=FIRMA

Identificador del emisor (3-11 caracteres alfanuméricos). Usado en SMS legacy y como fallback si no especifica REMITENTE en cada canal SMS.

Mensaje
string
Example: Mensaje=Hola [NOMBRE], firma el [TIPODOCUMENTO] aquí: [LINK]

Legacy v3. Texto del SMS/Email cuando se usa MEDIOCOMUNICACION y NO se envía CANALESFIRMA. Ignorado si usa CANALESFIRMA (cada canal lleva su propio mensaje). Variables sustituibles: [NOMBRE], [NIF], [LINK], [TIPODOCUMENTO].

Mediocomunicacion
string
Enum: 1 2 3
Example: Mediocomunicacion=SMS

Legacy v3. Canal único de notificación. Se ignora si envía CANALESFIRMA; en su lugar use CANALESFIRMA para definir uno o varios canales.



SMS : Envío por SMS al móvil del firmante. Coste extra: PRO_CREDITOS_MENSAJE.
EMAIL : Envío por email (dominio por defecto del distribuidor). Sin coste extra.
SMSCERTIFICADO : SMS con certificación de entrega. Coste extra: CREDITOS_CERTIFICADO + CREDITOS_PARTE_CERTIFICADO.

Tipodocumento
string
Example: Tipodocumento=Contrato

Tipo de documento (texto libre, max 50 chars). Se sustituye en el placeholder [TIPODOCUMENTO] de los mensajes legacy. Default: 'Contrato'.

Verificacionidentidad
string
Enum: "NO" "SI"
Example: Verificacionidentidad=NO

SI activa la verificación online de identidad antes de firmar (vídeo + DNI). Coste extra: VERIFICAR_IDENTIDAD (20 créditos por firmante). Requiere que su cuenta esté validada por soporte. Si SI, los campos Nombre y NIF de FIRMANTES son opcionales (se rellenan tras la verificación).

Minparecidoverificacion
integer
Referenciausuario
string
Example: Referenciausuario=PEDIDO-2026-00123

Referencia interna del integrador (max 200 chars). Se devuelve en los reports y permite asociar el contrato con su sistema externo. Acepta letras, dígitos, espacios y los caracteres . - _ ,

Accesible
string
Enum: "NO" "SI"
Example: Accesible=SI

SI deja el contrato accesible para descarga futura tras la firma; NO bloquea acceso futuro tras la certificación. Default: SI.

Alternamedios
string
Enum: "NO" "SI"
Example: Alternamedios=SI

SI permite que los recordatorios alternen canales (SMS y Email) si el firmante tiene ambos definidos; NO usa siempre el mismo canal. En v4 con CANALESFIRMA, la rotación es automática entre todos los canales del array, independientemente de este parámetro.

Recordatorios
integer
Example: Recordatorios=3

Número de recordatorios automáticos a enviar al firmante si no ha firmado (1-10). Cada recordatorio usa el siguiente canal de la cascada (rotación).

Fechalimite
string
Example: Fechalimite=2026-12-31 23:59

Fecha límite de firma en formato YYYY-MM-DD HH:mm. Mínimo: hoy + 1 hora. Máximo: hoy + 45 días. Default: mes siguiente, mismo día. Pasada esta fecha el contrato expira sin firma (estado 150).

Idioma
string
Enum: "es" "pt"
Example: Idioma=es

Idioma de la interfaz que verá el firmante en la pantalla de firma. es (español, default) | pt (portugués).

Minimocheck
integer
Example: Minimocheck=0

Si hay CHECKBOXES en DOCUMENTOS, número mínimo de casillas que el firmante debe marcar para poder firmar. Entre 0 y el número total de checkboxes.

Maximocheck
integer
Example: Maximocheck=10

Si hay CHECKBOXES en DOCUMENTOS, número máximo de casillas que el firmante puede marcar. Debe ser ≥ MINIMOCHECK.

Mensajeautorizacion
string
Example: Mensajeautorizacion=Antes de firmar el contrato debe revisar y aceptar los documentos de autorización.

NUEVO v4. Mensaje informativo (max 1000 chars) que se muestra al firmante en una ventana emergente al llegar al primer documento de autorización. Útil para explicar al firmante qué va a revisar antes de firmar el contrato. Se ignora si no hay documentos con TipoDoc=AUTORIZACION.

Resp
string
Enum: "TXT" "JSON" "XML"
Example: Resp=JSON

Formato de la respuesta. Recomendado JSON para facilitar el parseo.


JSON : Objeto JSON.
XML : Documento XML.
TXT : Texto plano (default por compat legacy).

Canalesfirma
Array of strings
Example: Canalesfirma=[{"TIPO":"SMS","REMITENTE":"FIRMA","MENSAJE":"Firma: {{LINK}}"}]

NUEVO en v4. Array JSON con la lista ordenada de canales por los que enviar la solicitud de firma. El sistema intentará el primero; si falla, pasará al siguiente automáticamente (cascada). Si configura recordatorios, cada uno usará el siguiente canal disponible (rotación).



Si NO incluye CANALESFIRMA, el sistema construye internamente un canal único a partir de los parámetros legacy MEDIOCOMUNICACION, MENSAJE y REMITENTE (compat v3). Es decir, no es obligatorio para mantener su integración v3 actual.



Cada elemento del array debe llevar el campo TIPO y los campos específicos de ese tipo:



SMS — campos:
  TIPO: "SMS"
  REMITENTE: (Opcional) Identificador del emisor del SMS, max 11 chars alfanum (default: 'FIRMA').
  MENSAJE: (Obligatorio) Texto del SMS. Debe contener {{LINK}} (o [LINK]) que se sustituirá por el enlace de firma.



EMAIL — campos:
  TIPO: "EMAIL"
  DOMINIO: (Obligatorio) Token mensatek para usar el dominio por defecto del distribuidor (no requiere validación adicional), o su dominio propio validado por DNS en el panel. El nombre del token interno se mantiene como mensatek por compatibilidad con datos existentes en BD; conceptualmente significa «dominio por defecto».
  REMITENTE: (Obligatorio si DOMINIO ≠ mensatek) Email completo del emisor; el dominio del email DEBE coincidir con DOMINIO.
  IDPLANTILLA: (Obligatorio si DOMINIO ≠ mensatek) ID numérico de la plantilla email transaccional creada en el panel; debe contener {{LINK}}.
  ASUNTOEMAIL: (Opcional) Asunto del email.
  MENSAJEEMAIL: (Opcional, solo si DOMINIO=mensatek) Cuerpo del email cuando no usa plantilla.



RCS — campos:
  TIPO: "RCS"
  IDAGENTE: (Obligatorio) ID del agente RCS configurado en el panel.
  IDPLANTILLA: (Obligatorio) ID de la plantilla RCS; debe contener {{LINK}}.
  REMITENTE: (Opcional) Nombre comercial mostrado al destinatario.



WHATSAPP — campos:
  TIPO: "WHATSAPP"
  IDTELEFONO: (Obligatorio) Phone Number ID de WhatsApp Business configurado en el panel.
  IDPLANTILLA: (Obligatorio) Nombre/ID de la plantilla WhatsApp aprobada en Meta. La plantilla DEBE incluir un botón URL apuntando a https://firma.ws/.
  VARSCUSTOM: (Opcional) Objeto con variables custom que la plantilla WhatsApp espera (ej. cabecera de imagen, etc.).



Ejemplo de cascada SMS → Email (dominio por defecto) → WhatsApp


                       ["CANALESFIRMA": [
                          {
                            "TIPO":      "SMS",
                            "REMITENTE": "FIRMA",
                            "MENSAJE":   "Hola {{NOMBRE}}, firma aquí: {{LINK}}"
                          },
                          {
                            "TIPO":         "EMAIL",
                            "DOMINIO":      "__mensatek__",
                            "REMITENTE":    "contratos@su-dominio.com",
                            "ASUNTOEMAIL":  "Solicitud de firma",
                            "MENSAJEEMAIL": "Pulse aquí para firmar: {{LINK}}"
                          },
                          {
                            "TIPO":        "WHATSAPP",
                            "IDTELEFONO":  "123456789012345",
                            "IDPLANTILLA": "firma_contrato_es"
                          }
                        ]
Canalesotp
Array of strings
Example: Canalesotp=[{"TIPO":"SMS","REMITENTE":"FIRMA","MENSAJE":"Código: {{CODE}}"}]

NUEVO en v4. Array JSON con los canales por los que enviar el código OTP (PIN de 5 dígitos) cuando TIPOFIRMA=OTP. La estructura es idéntica a CANALESFIRMA: cada elemento lleva TIPO y los campos específicos.



Diferencia clave: en plantillas y mensajes use {{CODE}} en lugar de {{LINK}}. La plantilla email/RCS/WhatsApp para OTP debe contener {{CODE}}.



Si TIPOFIRMA=OTP y NO incluye CANALESOTP, el sistema construye automáticamente un canal SMS al móvil del firmante con el mensaje 'Su código de verificación es: {{CODE}}'. Este es el comportamiento legacy v3 (el OTP siempre se enviaba por SMS).



Si quiere que el OTP llegue por Email/RCS/WhatsApp en lugar de SMS, defina CANALESOTP explícitamente.



Ejemplo: OTP por SMS y Email simultáneamente


                       ["CANALESOTP": [
                          {
                            "TIPO":      "SMS",
                            "REMITENTE": "FIRMA",
                            "MENSAJE":   "Tu código OTP es: {{CODE}}"
                          },
                          {
                            "TIPO":         "EMAIL",
                            "DOMINIO":      "__mensatek__",
                            "REMITENTE":    "otp@su-dominio.com",
                            "ASUNTOEMAIL":  "Tu código OTP",
                            "MENSAJEEMAIL": "Tu código es {{CODE}}"
                          }
                        ]

Responses

Response Schema:
Array
Res
required
integer <int32>

Resultado de la operación.


1 Correcto.
-1 Error de autenticación o IP no autorizada.
-2 Sin créditos suficientes (incluye los campos Necesarios y Cred).
-3 Error en parámetros (incluye Error con descripción).
-4 a -6 Error general en INSERT del contrato.
-7 a -9 Error general en INSERT de firmantes.
-10 a -14 Error general en INSERT de documentos.
-15 Para ACEPTACION=SI debe haber exactamente UN PDF.
-16 No existe el PDF adjunto especificado.
-20 a -22 Error al insertar documentos solicitados.
-23 NUEVO v4. Estructura/tipo de canal inválido en CANALESFIRMA o CANALESOTP.
-24 NUEVO v4. Plantilla sin {{LINK}} (firma) o sin {{CODE}} (OTP) según el caso.
-25 NUEVO v4. Dominio email no validado para el usuario.
-26 NUEVO v4. WhatsApp WABA no configurado en la cuenta.
-27 NUEVO v4. GRUPOAUT inválido (debe ser 1-3 y solo aplicable si TipoDoc=AUTORIZACION).

ContratoId
string

Identificador del contrato (CSV — Código Seguro de Verificación). Junto con ReportID se usa para llamadas posteriores a otras funciones de la API. También llega en los eventos en tiempo real.

ReportId
integer

Identificador interno de reports. Junto con ContratoID se usa para llamadas posteriores (ej. descarga del PDF certificado, forzar reenvío, etc.).

Cred
integer

Créditos restantes en la cuenta tras el envío.

Firmantes
integer

Número de firmantes del contrato.

Documentos
integer

Número de documentos enviados (PLANTILLAS + PDFs + CHECKBOXES).

Contratos
Array of arrays

NUEVO v4. Solo presente si usó ENVIOS con más de un envío. Array con un objeto por contrato creado, cada uno con su ContratoId, ReportID, Firmantes y Documentos.

Request samples


curl --location --request POST 'https://api.mensatek.com/firma/v4/EnviarContrato' \ 
--header 'Authorization: Basic BASE64ENCODEdelStringUsuarioAPI:APIToken' \ 

Response samples

Content type
[
  • {
    }
]

Recepción automática de eventos

https://{SuDominio}/path/de/su/script/de/recepción/de/reports

RECEPCIÓN EN TIEMPO REAL DE LOS ESTADOS DE CADA CONTRATO EN UN SCRIPT DE SU SERVIDOR.

Activando la opción de recibir los reports en tiempo real en un script en su servidor desde su panel de usuario, recibirá una petición POST con el formato indicado cada vez que cada contrato enviado cambie de estado.

Puede configurar recibir las peticiones con autenticación básica y en formato JSON o FORM-DATA

Request Body schema:

Parámetros recibidos en su script en petición POST con la configuración especificada en su panel de usuario/configuración API.

Servicio
required
string

Tipo de report. Para esta API recibirá CONTRATACION.

ContratoID
string

Identificador del contrato (CSV).

ReportID
integer

Identificador interno de reports.

Resultado
required
integer

Estado del contrato. Estados posibles:

ESTADODESCRIPCIÓNSIGNIFICADO
0En procesoContrato aceptado, esperando primer firmante.
100CertificandoProceso terminado, generando certificado.
101Firmado y CertificadoCertificado disponible para descarga.
150ExpiradoEl contrato expiró sin firma.
151CanceladoCancelado por el usuario antes de la firma.
1014Firmado y CertificadoSinónimo de 101.
1050ExpiradoSinónimo de 150.
FechaEnvio
string

Fecha en la que se envió el contrato.

FechaFirma
string

Fecha en la que se firmó el contrato (si se ha firmado).

NumFirmantes
required
string

Número de firmantes del contrato.

NumFirmados
string

Número de firmantes que ya han firmado.

Referencia
string

REFERENCIAUSUARIO que envió en la petición original.

TipoFirma
integer

Tipo de firma del contrato (numérico):
1: ACEPTACION
2: OTP
3: BIOMETRICA
4: CERTIFICADO

CanalUsado
string

NUEVO v4. Canal por el que se envió el último mensaje al firmante. Posibles: sms, email, rcs, whatsapp. Útil para auditar qué canal de la cascada funcionó.

Request samples

Content type
{
  • "Servicio": "CONTRATACION",
  • "ContratoID": "ASYYFRE5492-HN776TFD",
  • "ReportID": "299846332",
  • "Resultado": "11",
  • "FechaEnvio": "2026-05-03 10:10",
  • "FechaFirma": "2026-05-03 11:30",
  • "NumFirmantes": "2",
  • "NumFirmados": "1",
  • "Referencia": "PEDIDO-2026-00123",
  • "TipoFirma": "3",
  • "CanalUsado": "sms"
}

Forzar reenvío al siguiente firmante

/ForzarRecomunicacionCONTRATO

Fuerza la continuación inmediata del flujo de firma. Su uso típico es reenviar la solicitud al firmante actual cuando no responde. Si configuró cascada de canales en CANALESFIRMA, este reenvío usará el SIGUIENTE canal de la cascada (rotación). Limitado a 2 ejecuciones por día por proceso de firma.

query Parameters
Reportid
string
Example: Reportid=1283876988

ReportID devuelto en la función de envío.

Contratoid
string
Example: Contratoid=ASYYFRE5492-HN776TFD

ContratoID devuelto en la función de envío.

Resp
string
Example: Resp=JSON

Formato de respuesta: JSON | XML | TXT.

Responses

Response Schema:
Array
Res
required
integer <int32>

0 El contrato ya está firmado.
1 Reenvío realizado correctamente.
-1 Error de autenticación.
-2 Datos incorrectos.
-3 Error en parámetros (incluye Error).

Cred
integer

Créditos restantes.

CanalUsado
string

NUEVO v4. Canal por el que se intentó el reenvío.

Request samples


curl --location --request POST 'https://api.mensatek.com/firma/v4/ForzarRecomunicacionCONTRATO' \ 
--header 'Authorization: Basic BASE64ENCODEdelStringUsuarioAPI:APIToken' \ 

Response samples

Content type
[
  • {
    }
]

Descarga del Certificado del Contrato

/GetCertificadoCONTRATO

Descarga el fichero PDF del certificado del contrato firmado. Se ejecuta normalmente como respuesta a la recepción del report con estado 101/1014 (Firmado y Certificado).

query Parameters
Reportid
string
Example: Reportid=1283876988

ReportID devuelto en la función de envío.

Contratoid
string
Example: Contratoid=ASYYFRE5492-HN776TFD

ContratoID devuelto en la función de envío.

Doc
string
Example: Doc=CERTIFICADO

Tipo de documento a descargar:
CERTIFICADO - Documento certificado completo con todos los eventos.
FIRMANTE - Copia para firmantes (solo documento firmado con firmas estampadas).

Resp
string
Example: Resp=JSON

Formato de respuesta cuando hay error: JSON | XML | TXT. En caso de éxito se descarga directamente el PDF.

Responses

Response Schema:
string

Request samples


curl --location --request POST 'https://api.mensatek.com/firma/v4/GetCertificadoCONTRATO' \ 
--header 'Authorization: Basic BASE64ENCODEdelStringUsuarioAPI:APIToken' \ 

Response samples

Content type
PDF certificado del contrato.

Consulta de Créditos

/GetCreditos

Devuelve el número de créditos en la cuenta. Función esporádica ya que la mayoría de funciones devuelven el saldo en la respuesta.

query Parameters
Resp
string
Enum: "TXT" "JSON" "XML"
Example: Resp=JSON

Formato de respuesta: JSON | XML | TXT.

Responses

Response Schema:
Array
Res
required
integer <int32>

1 Función concluida con éxito.
-1 Error de autenticación.

Cred
required
double

Créditos restantes en la cuenta.

Request samples


curl --location --request POST 'https://api.mensatek.com/firma/v4/GetCreditos' \ 
--header 'Authorization: Basic BASE64ENCODEdelStringUsuarioAPI:APIToken' \ 

Response samples

Content type
[
  • {
    }
]

Migración v3 → v4

Compatibilidad total

La API v4 es compatible al 100% hacia atrás con peticiones v3. Si su integración actual envía peticiones al endpoint v3 y las redirige a v4, todo seguirá funcionando sin cambios.

Decisión: ¿migro a v4 o me quedo en v3?

Mantenemos ambos endpoints activos para que migre cuando le convenga.

Cambios mínimos para activar capacidades v4

  • Cascada de canales: añada el campo CANALESFIRMA con un array de canales en lugar de o además de MEDIOCOMUNICACION.
  • Autorizaciones: añada TipoDoc:'AUTORIZACION' y GrupoAut: 1|2|3 a los documentos relevantes.
  • Recuadros múltiples: cambie StampFirmaFirmante (singular) por StampFirmasFirmante (array de strings).
  • Multi-envío: use ENVIOS en lugar de FIRMANTES + PERSONALIZACION.
  • OTP por canal específico: añada CANALESOTP cuando use TIPOFIRMA=OTP.

Tabla rápida de equivalencias

v3v4
MEDIOCOMUNICACION:'SMS' + MENSAJE + REMITENTECANALESFIRMA:[{TIPO:'SMS', REMITENTE:'...', MENSAJE:'... {{LINK}}'}]
STAMPFIRMAFIRMANTE:'1,80,500,180,80,H'STAMPFIRMASFIRMANTE:['1,80,500,180,80,H']
Solo se podía firmar el contrato directoTipoDoc:'AUTORIZACION' + GrupoAut:1 añade pasos previos

Cálculo de créditos

Fórmula completa

créditos = PRECIO_FIJO_CONTRATO (11)
         + nFirmantes × FIRMANTE (3)
         + nFirmantesConVerifica × VERIFICAR_IDENTIDAD (20)
         + nCheckboxes × CHECKBOX (1)
         + (hayDocumentosSolicitados ? PRECIO_FIJO_SOLICITUD_DOCUMENTOS (11) : 0)
         + nGruposAutorizacionDistintos × PRECIO_FIJO_AUTORIZACIONES (7)
         + extras según MEDIOCOMUNICACION (legacy):
              SMS:            PRO_CREDITOS_MENSAJE
              EMAIL:          0
              SMSCERTIFICADO: CREDITOS_CERTIFICADO + CREDITOS_PARTE_CERTIFICADO

Ejemplo práctico

Un contrato con 2 firmantes, 1 PDF, 2 checkboxes, sin verificación de identidad, sin documentos solicitados, sin autorizaciones, enviado por SMS legacy:
11 + 2×3 + 0 + 2×1 + 0 + 0 + 2×PRO_CREDITOS_MENSAJE = 19 + 2×SMS

Un contrato con 1 firmante, 1 PDF, 0 checkboxes, con autorizaciones del Grupo 1 y Grupo 3 (2 grupos distintos), sin SMS legacy (usa CANALESFIRMA):
11 + 1×3 + 0 + 0 + 0 + 2×7 = 28 créditos. Cada canal de la cascada se cobra cuando se envía (no al crear el contrato).

Códigos de error

Tabla completa de códigos Res

CódigoSignificadoCuándo
1OKOperación exitosa.
-1Auth/IPCredenciales inválidas o IP no autorizada.
-2Sin créditosEl campo Necesarios indica cuántos hacen falta.
-3ParámetrosEl campo Error describe el problema concreto.
-4 a -6INSERT contratoError interno al insertar (contacte soporte).
-7 a -9INSERT firmantesError interno al insertar firmantes.
-10 a -14INSERT documentosError interno al insertar documentos.
-15ACEPTACION=SI requiere 1 PDFSi activa scroll de aceptación, debe haber exactamente UN PDF.
-16PDF inexistenteEl PDF referenciado no existe en su cuenta.
-20 a -22INSERT solicitudesError al insertar documentos solicitados al firmante.
-23NUEVO v4 Canal inválidoEstructura/tipo de un canal en CANALESFIRMA o CANALESOTP es incorrecta. El campo Error detalla cuál.
-24NUEVO v4 Plantilla sin {{LINK}}/{{CODE}}La plantilla referenciada no contiene el placeholder requerido.
-25NUEVO v4 Dominio email no validadoEl DOMINIO de un canal Email no está validado por DNS en su cuenta.
-26NUEVO v4 WABA no configuradoWhatsApp Business no está configurado en su cuenta.
-27NUEVO v4 GRUPOAUT inválidoGrupoAut debe ser 1, 2 o 3 y solo aplica con TipoDoc=AUTORIZACION.

Ejemplos por escenario

1. SMS legacy simple (compat v3)

{
  "RESP": "JSON",
  "TIPOFIRMA": "BIOMETRICA",
  "MEDIOCOMUNICACION": "SMS",
  "REMITENTE": "FIRMA",
  "MENSAJE": "Firma aquí: [LINK]",
  "FIRMANTES": [{"Nombre":"Juan","NIF":"00000000T","Telefono":"34600000001","Email":"j@a.com","Orden":1}],
  "DOCUMENTOS": [{"Tipo":"CHECKBOX","Texto":"Acepto","Inicial":"OFF","Final":"ON"}]
}

2. Cascada SMS → Email (dominio por defecto)

{
  "RESP": "JSON",
  "TIPOFIRMA": "BIOMETRICA",
  "CANALESFIRMA": [
    {"TIPO":"SMS","REMITENTE":"FIRMA","MENSAJE":"Firma: {{LINK}}"},
    {"TIPO":"EMAIL","DOMINIO":"__mensatek__","REMITENTE":"contratos@su-dominio.com","ASUNTOEMAIL":"Firma","MENSAJEEMAIL":"Pulse {{LINK}}"}
  ],
  "FIRMANTES": [{"Nombre":"Juan","NIF":"00000000T","Telefono":"34600000001","Email":"j@a.com","Orden":1}],
  "DOCUMENTOS": [{"Tipo":"PDF","Nombre":"Contrato","Contenido":"JVBERi0xLj...","Aceptacion":"SI","StampFirmaFirmante":"1,80,500,180,80,H"}]
}

3. Autorizaciones en 2 grupos + contrato

{
  "RESP": "JSON",
  "TIPOFIRMA": "BIOMETRICA",
  "MENSAJEAUTORIZACION": "Antes de firmar revise NDA y RGPD.",
  "CANALESFIRMA": [{"TIPO":"SMS","REMITENTE":"FIRMA","MENSAJE":"Firma: {{LINK}}"}],
  "FIRMANTES": [{"Nombre":"Juan","NIF":"00000000T","Telefono":"34600000001","Email":"j@a.com","Orden":1}],
  "DOCUMENTOS": [
    {"Tipo":"PDF","Nombre":"NDA","Contenido":"JVBERi0xLj...","TipoDoc":"AUTORIZACION","GrupoAut":1},
    {"Tipo":"PDF","Nombre":"RGPD","Contenido":"JVBERi0xLj...","TipoDoc":"AUTORIZACION","GrupoAut":2},
    {"Tipo":"PDF","Nombre":"Contrato","Contenido":"JVBERi0xLj...","TipoDoc":"CONTRATO","Aceptacion":"SI","StampFirmaFirmante":"1,80,500,180,80,H"}
  ]
}

4. OTP por SMS y Email

{
  "RESP": "JSON",
  "TIPOFIRMA": "OTP",
  "CANALESFIRMA": [{"TIPO":"SMS","REMITENTE":"FIRMA","MENSAJE":"Firma: {{LINK}}"}],
  "CANALESOTP": [
    {"TIPO":"SMS","REMITENTE":"FIRMA","MENSAJE":"Tu código: {{CODE}}"},
    {"TIPO":"EMAIL","DOMINIO":"__mensatek__","REMITENTE":"otp@su-dominio.com","ASUNTOEMAIL":"OTP","MENSAJEEMAIL":"Tu código es {{CODE}}"}
  ],
  "FIRMANTES": [{"Nombre":"Juan","NIF":"00000000T","Telefono":"34600000001","Email":"j@a.com","Orden":1}],
  "DOCUMENTOS": [{"Tipo":"CHECKBOX","Texto":"Acepto","Inicial":"OFF","Final":"ON"}]
}

5. Multi-envío con variables propias

{
  "RESP": "JSON",
  "TIPOFIRMA": "BIOMETRICA",
  "CANALESFIRMA": [{"TIPO":"SMS","REMITENTE":"FIRMA","MENSAJE":"Hola {{NOMBRE}}: {{LINK}}"}],
  "ENVIOS": [
    {"Firmantes":[{"Nombre":"Juan","NIF":"11111111H","Telefono":"34611111111","Email":"j@a.com","Orden":1}],"Variables":{"importe":"100€"}},
    {"Firmantes":[{"Nombre":"Ana","NIF":"22222222J","Telefono":"34622222222","Email":"a@a.com","Orden":1}],"Variables":{"importe":"250€"}}
  ],
  "DOCUMENTOS": [{"Tipo":"PLANTILLA","Plantilla":"1234-5678","Nombre":"Contrato","Aceptacion":"SI"}]
}

La respuesta del ejemplo 5 contendrá un campo Contratos con 2 objetos (uno por contrato creado).