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. Cada vez que fuerce continuación del proceso de contratación, adicionalmente, el sistema rotará los canales con el objetivo de asegurar entregas y maximizar la fiabilidad.
2. Grupos secuenciales de autorización: documentos que el firmante debe revisar y aceptar antes de llegar al contrato a firmar (Aceptar NDA, RGPD, etc. antes de firmar el contrato). Hasta 3 grupos secuenciales (Grupo 1 → Grupo 2 → Grupo 3 → Contrato). El sistema generará un certificado por grupo de autorizaciones, otro para el contrato que compondrían las copias de firmante y uno global que incluye todas las evidencias, interacciones y documentos (copia para emisor)
3. Recuadros múltiples por documento: hasta 10 recuadros de firma de tipo Firmante y 10 de tipo Emisor por cada PDF distribuidos por el documento como desee, 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. También de forma alterna, si el primer canal no le llega al firmante por cualquier cosa (ejemplo se ha seleccionado whatsapp y el firmante no lo tiene instalado) el sistema seguirá con el siguiente canal configurado.
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).



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, sin prisas o sólo si necesita alguna de las nuevas funcionalidades.

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 . Soporta dos formatos para los parámetros y los aceptará en ambos formatos:

1.- Puedes hacerlas en formato JSON en el body. La cabecera debe incluir Content-Type: application/json. 2.- Puedes hacerlas como Form Data. En este caso la cabecera debe incluir Content-Type: application/x-www-form-urlencoded.



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 o un dominio propio validado en su cuenta en la sección 'Email Transaccional'.
  • 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 (teléfono dado de baja, 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 se utilizó 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 de la api 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 los canales configurados para 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.

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

En v3 cada PDF aceptaba un único recuadro de firma por documento para el firmante (STAMPFIRMAFIRMANTE) y otro para el emisor (STAMPFIRMAEMISOR). En v4 puede definir hasta 10 recuadros de cada tipo en cada documento 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 (webhooks).


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) Tiene dos modos:
    (A) Dominio propio — p.ej. su-dominio.com. Para usarlo es IMPRESCINDIBLE que ese dominio esté dado de alta y validado en el servicio de Email Transaccional de su panel (proceso DNS + verificación). Si el dominio no está validado el envío fallará con código -25. Esta opción permite que el destinatario reciba el email desde su marca y mejora la entregabilidad.
    (B) Dominio por defecto — token literal pordefecto. Usa el dominio genérico configurado por su distribuidor (típicamente contratos.distribuidor.com). NO requiere validación previa ni configuración. Úselo cuando no quiera/pueda validar dominio propio.
  REMITENTE: (Obligatorio si DOMINIO es un dominio propio, p.ej. su-dominio.com) Email completo del emisor; la parte tras @ DEBE coincidir EXACTAMENTE con DOMINIO. P.ej. si DOMINIO=su-dominio.com, REMITENTE debe ser algo@su-dominio.com. (Opcional si DOMINIO=pordefecto: si lo omite, el sistema usa el remitente por defecto del distribuidor.)
  IDPLANTILLA: (Obligatorio si DOMINIO es un dominio propio) ID numérico de la plantilla email transaccional creada en el panel; debe contener {{LINK}}. (Opcional con pordefecto: si lo omite, se usa la plantilla predeterminada del sistema con el cuerpo de MENSAJEEMAIL.)
  ASUNTOEMAIL: (Opcional) Asunto del email.
  MENSAJEEMAIL: (Opcional, recomendado solo si DOMINIO=pordefecto sin plantilla) Cuerpo libre del email cuando no usa una plantilla del usuario.



⚠ Recordatorio importante sobre el dominio Email: use SIEMPRE el token pordefecto para el dominio genérico del distribuidor. NO use otros tokens internos (como mensatek) — están deprecados para integradores nuevos y existen únicamente por compatibilidad con datos antiguos. Si va a enviar desde su propio dominio (su-dominio.com), valídelo primero en su panel » Email Transaccional » Dominios.



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 propio validado) → WhatsApp
Aquí su-dominio.com debe estar previamente validado en su panel de Email Transaccional. Si NO lo tiene validado y solo quiere enviar desde el dominio genérico del distribuidor, sustituya el bloque EMAIL por el del siguiente ejemplo (con pordefecto).


                       ["CANALESFIRMA": [
                          {
                            "TIPO":      "SMS",
                            "REMITENTE": "FIRMA",
                            "MENSAJE":   "Hola {{NOMBRE}}, firma aquí: {{LINK}}"
                          },
                          {
                            "TIPO":         "EMAIL",
                            "DOMINIO":      "su-dominio.com",          // dominio propio — DEBE estar validado
                            "REMITENTE":    "contratos@su-dominio.com", // parte tras @ ha de coincidir con DOMINIO
                            "IDPLANTILLA":  12345,                       // ID plantilla del panel; debe contener {{LINK}}
                            "ASUNTOEMAIL":  "Solicitud de firma"
                          },
                          {
                            "TIPO":        "WHATSAPP",
                            "IDTELEFONO":  "123456789012345",
                            "IDPLANTILLA": "firma_contrato_es"
                          }
                        ]


Variante con dominio por defecto del distribuidor (no requiere validación de DNS):


                          {
                            "TIPO":         "EMAIL",
                            "DOMINIO":      "__pordefecto__",  // dominio genérico del distribuidor (sin validación)
                            "ASUNTOEMAIL":  "Solicitud de firma",
                            "MENSAJEEMAIL": "Pulse aquí para firmar: {{LINK}}"
                          }
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 (dominio propio validado) simultáneamente
El bloque EMAIL usa su-dominio.com: ese dominio DEBE estar validado en su panel de Email Transaccional. Si no lo tiene validado, sustitúyalo por pordefecto (ver variante debajo).


                       ["CANALESOTP": [
                          {
                            "TIPO":      "SMS",
                            "REMITENTE": "FIRMA",
                            "MENSAJE":   "Tu código OTP es: {{CODE}}"
                          },
                          {
                            "TIPO":         "EMAIL",
                            "DOMINIO":      "su-dominio.com",         // dominio propio — DEBE estar validado
                            "REMITENTE":    "otp@su-dominio.com",     // parte tras @ ha de coincidir con DOMINIO
                            "IDPLANTILLA":  67890,                     // plantilla del panel; debe contener {{CODE}}
                            "ASUNTOEMAIL":  "Tu código OTP"
                          }
                        ]


Variante con dominio por defecto (sin validación):


                          {
                            "TIPO":         "EMAIL",
                            "DOMINIO":      "__pordefecto__",   // dominio genérico del distribuidor
                            "ASUNTOEMAIL":  "Tu código OTP",
                            "MENSAJEEMAIL": "Tu código es {{CODE}}"
                          }
Validarcanales
string
Example: Validarcanales=NO

NUEVO v4. Activa la validación profunda de los canales (CANALESFIRMA y CANALESOTP) antes de crear el contrato. Posibles valores:
  NO (default, recomendado en PRODUCCIÓN): solo se hace la validación estructural rápida (tipos, IDs presentes, formato de remitente). El sistema NO consulta servicios externos.
  SI (recomendado en PREPRODUCCIÓN): además de la estructural, valida cada canal contra fuentes externas:
    • EMAIL: comprueba que la plantilla email existe en BD y que su HTML contiene {{LINK}} (firma) o {{CODE}} (OTP).
    • RCS: verifica la plantilla RCS en BD y que contenga el placeholder requerido.
    • WHATSAPP: llama a Meta/Facebook para confirmar que la plantilla está aprobada en su cuenta WABA, que el botón URL apunta a https://firma.ws/ (firma), o que el BODY contiene literalmente {{CODE}} (OTP).

⚠️ AVISO IMPORTANTE:
1. Esta validación añade latencia significativa (especialmente WhatsApp por la llamada externa a Meta). En envíos masivos puede traducirse en segundos extra por contrato.
2. Si lanza envíos masivos con VALIDARCANALES=SI, el alto volumen de peticiones a servicios de terceros podría provocar que esos servicios bloqueen temporalmente su conexión (rate limiting). Por ello, cuando confirme que la configuración de canales es correcta, vuelva a NO.
3. Use SI únicamente durante la integración o pruebas en preproducción para detectar errores en la configuración de canales (plantillas inexistentes, sin placeholders, no aprobadas, etc.) antes de pasar a producción.

🛡️ Rate limit de protección: para evitar que el uso accidental de SI en producción tumbe su acceso a Meta/RCS, la API impone un límite de 10 peticiones con VALIDARCANALES=SI por minuto y por usuario. Si lo supera, la API devuelve Res=-29 con los campos Reintentar (segundos restantes hasta resetear el contador) y Limite (peticiones permitidas por minuto). Sus peticiones con VALIDARCANALES=NO no cuentan en este contador y siguen funcionando con normalidad.

Si la validación profunda detecta un problema, la API responde con Res=-24 y un campo Error que describe exactamente qué canal y qué problema tiene.

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 certificado del contrato firmado o la copia del firmante. Se ejecuta normalmente como respuesta a la recepción del report con estado 101/1014 (Firmado y Certificado).

Tipo de fichero devuelto según DOC:

  • DOC=CERTIFICADO → SIEMPRE devuelve un PDF (certificado_S.pdf) con las evidencias completas del proceso. Content-Type: application/pdf, nombre sugerido contrato.pdf.
  • DOC=FIRMANTE → puede devolver PDF o ZIP según el contrato:
    • Si NO hay grupos de autorización → PDF (copiafirmantes.pdf), un único documento con el contrato firmado. Content-Type: application/pdf, nombre contrato.pdf.
    • Si HAY grupos de autorización → ZIP (copiafirmantes.zip) con un PDF por cada grupo de autorización (grupo_autorizacion_N_certificado.pdf) más el PDF del contrato (contrato_certificado.pdf). Content-Type: application/zip, nombre contrato.zip.
Detección por el integrador: revise el header Content-Type de la respuesta para saber si recibió application/pdf o application/zip y procese en consecuencia. El cliente API debe estar preparado para ambos formatos.
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 (siempre PDF).
FIRMANTE — Copia para firmantes (solo documento firmado con firmas estampadas). PDF si el contrato no tiene grupos de autorización; ZIP si los tiene (con un PDF por cada grupo + el PDF del contrato).

Resp
string
Example: Resp=JSON

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

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 o copia firmante sin grupos).

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 Validación profunda de canal fallóSolo si VALIDARCANALES=SI. Indica que un canal pasó la validación estructural pero falló al validar contra fuentes externas (plantilla inexistente en BD, sin {{LINK}}/{{CODE}}, plantilla WhatsApp no aprobada en Meta, etc.). El campo Error dice qué canal y qué problema concreto.
-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.
-29NUEVO v4 Rate limit VALIDARCANALESSolo si VALIDARCANALES=SI. Ha superado las 10 peticiones por minuto y por usuario. La respuesta incluye Reintentar (segundos hasta poder reintentar) y Limite (peticiones/min permitidas). Vuelva a VALIDARCANALES=NO para envíos masivos.

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"}]
}

2a. Cascada SMS → Email (dominio propio validado)

Importante: el dominio su-dominio.com debe estar dado de alta y validado en su panel de Email Transaccional. Si no lo tiene validado el envío fallará con Res=-25; en ese caso use el ejemplo 2b con __pordefecto__.

{
  "RESP": "JSON",
  "TIPOFIRMA": "BIOMETRICA",
  "CANALESFIRMA": [
    {"TIPO":"SMS","REMITENTE":"FIRMA","MENSAJE":"Firma: {{LINK}}"},
    {"TIPO":"EMAIL","DOMINIO":"su-dominio.com","REMITENTE":"contratos@su-dominio.com","IDPLANTILLA":12345,"ASUNTOEMAIL":"Firma"}
  ],
  "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"}]
}

2b. Cascada SMS → Email (dominio por defecto, sin validación)

Use el token __pordefecto__ cuando NO disponga de un dominio propio validado. El sistema enviará desde el dominio genérico configurado por su distribuidor (no requiere DNS/validación previa).

{
  "RESP": "JSON",
  "TIPOFIRMA": "BIOMETRICA",
  "CANALESFIRMA": [
    {"TIPO":"SMS","REMITENTE":"FIRMA","MENSAJE":"Firma: {{LINK}}"},
    {"TIPO":"EMAIL","DOMINIO":"__pordefecto__","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 (dominio propio validado)

Recordatorio: el dominio su-dominio.com debe estar validado en su panel de Email Transaccional. Si no lo está, sustituya el bloque EMAIL por {"TIPO":"EMAIL","DOMINIO":"__pordefecto__","ASUNTOEMAIL":"OTP","MENSAJEEMAIL":"Tu código es {{CODE}}"} para usar el dominio genérico del distribuidor.

{
  "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":"su-dominio.com","REMITENTE":"otp@su-dominio.com","IDPLANTILLA":67890,"ASUNTOEMAIL":"OTP"}
  ],
  "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).