Referencia de la API
La API de FIRMAFY expone interfaces de arquitectura REST orientadas a la integración multiplataforma. Permite a los sistemas cliente solicitar flujos de firma electrónica y escuchar eventos asíncronos del proceso.
Para facilitar las pruebas de integración en entornos de desarrollo, proporcionamos una colección interactiva:
1. Obtención del Token de Sesión
El protocolo de autenticación inicial requiere la generación de un JWT/Token de acceso. Recomendamos antes de iniciar el proceso, ponerse en contacto con el equipo de soporte técnico de Firmafy a través del chat, para confirmar que se disponen de permisos de llamada.
Parámetros de la Petición (Payload):
| Parámetro | Descripción |
|---|---|
|
action
string
Obligatorio
|
Definición del controlador. Valor estático: "login" |
|
usuario
string
Obligatorio
|
Credencial de identificación (Usuario Firmafy) registrada en la plataforma. |
|
password
string
Obligatorio
|
Clave de acceso alfanumérica (Clave Firmafy). |
Respuesta
| Parámetro | Descripción |
|---|---|
|
error
bool
|
Indica si ocurrió algún error en el proceso (true/false). |
|
data
string
|
Devuelve el hash del token generado si la autenticación es correcta. |
Ejemplo de respuesta con Login correcto:
{
"error": false,
"data": "xxxxxxxxxxxxxxxxTOKENxxxxxxxxxxxxxxxx"
}
2. Obtener Public Key (id_show)
El siguiente paso es obtener el public_key (id_show) para enviar solicitudes desde la API.
Este hash actúa como la Llave Pública (Public Key) que vincula la solicitud entrante con su cuenta de
cliente (Tenant ID). Para usuarios registrados en Firmafy podrás ubicarlo en el menú "Configuración" de
tu Panel Cliente.
3. Solicitud de Firma Electrónica
Con el Token y el id_show ya se puede realizar la solicitud de firma. Soporta firmas simples, avanzadas con OTP y biométricas.
Modalidades de envío del PDF
attachment, los
parámetros pdf, pdf_url, pdf_base64 y pdf_name se
ignoran.
| Opción | Parámetro a usar | Descripción Técnica y Requisitos |
|---|---|---|
| Opción 1: Multipart File |
pdf
CURLFile
|
Envío del fichero físico original adjunto en el body de la petición usando codificación
multipart/form-data.
|
| Opción 2: URL Pública |
pdf_url
string pdf_name
string
|
Enviar a través de una url pública. Url del documento PDF. Nota: Si se omitió el parámetro pdf físico, es obligatorio pasar el parámetro
pdf_name indicando el nombre del archivo.
|
| Opción 3: Base64 Buffer |
pdf_base64
string pdf_name
string
|
Enviar en base64. PDF codificado en base64. Nota: Requiere obligatoriamente que envíes en conjunto el parámetro pdf_name con el nombre del archivo.
|
| Opción 4: Multidocumento |
attachment
JSON String force_flatten
bool
|
Envío de varios PDF en una misma solicitud de firma, cada uno por URL pública o en base64.
Con force_flatten se decide si los documentos se firman por separado o se unen
en un único PDF. Ver Envío Multidocumento.
|
Resto de Parámetros de la Transacción:
| Parámetro | Descripción Técnica |
|---|---|
|
action
string
Oblig.
|
Valor estático: "request" |
|
token
string
Oblig.
|
Su token obtenido en la autenticación. |
|
id_show
string
Oblig.
|
Identificador id_show de tu cuenta. |
|
signer
JSON String
Oblig.
|
Array de firmantes estructurado en JSON Stringify. |
|
template_name
string
Opc.
|
Nombre de la plantilla creada en la plataforma para heredar Asunto, Mensaje y maquetación de firmas. Muy importante: siempre que se utilice una plantilla, el número de hojas del documento a enviar tiene que coincidir con el número de hojas de la plantilla. Si no se indica, se usarán los valores predeterminados y las firmas se ubicarán en el lateral izquierdo de todas las páginas. |
|
coordenadas
JSON String
Opc.
|
JSON String con la ubicación explícita de las firmas de forma manual. Requiere que
template_name no esté definido (sea nulo). En envíos multidocumento la
estructura cambia: ver Coordenadas en multidocumento.
|
|
subject
string
Opc.
|
Asunto del Email. Sobreescribe al de la plantilla si se envía en conjunto. |
|
message
string
Opc.
|
Mensaje del Email. Sobreescribe al de la plantilla si se envía en conjunto. |
|
cco
string
Opc.
|
Indica los emails donde requiere enviar copia oculta del PDF firmado al finalizar el proceso
(separados por punto y coma ;). |
|
signer_priority
bool
Opc.
|
Activa la firma en orden o de manera secuencial (prioridad de notificación para más de 1 firmante). |
|
mail_notification
bool
Opc.
|
[Default: true]. 1/0. Permite omitir el envío de la notificación de solicitud de firma desde el servidor de correos de Firmafy. |
|
fecha_vencimiento
datetime
Opc.
|
Formato Y-m-d H:i:s. Fecha y hora máxima en la que estará disponible el enlace
para firmar. |
|
reply-to
string
Opc.
|
Dirección de retorno. Por defecto toma el email del emisor. |
|
document_lang
string
Opc.
|
Opcional - idioma de la solicitud y notificaciones. Valores soportados: EN
(Inglés), IT (Italiano), CA (Catalán), FR (Francés).
Por defecto Español (no hace falta indicarlo). |
Estructura del Objeto: signer (Array de Firmantes)
Contiene la estructura del o de los firmantes para los que se realiza la solicitud de firma, aportando los datos necesarios para garantizar la integridad legal del proceso.
| Campo JSON | Tipo | Estado | Descripción Técnica y Lógica de Negocio |
|---|---|---|---|
|
nombre
|
string | Oblig. | Especifica el Nombre Completo de la persona física que va a realizar la firma del documento. |
|
nif
|
string | Oblig. | Documento de identidad oficial del firmante: DNI, NIE o pasaporte válido. |
|
cargo
|
string | Oblig. | Etiqueta identificativa del rol o cargo del firmante (ej. "Trabajador", "Gerente", "Responsable"). |
|
email
|
string | Condicional | Dirección de correo electrónico para notificar al firmante. Es obligatorio para los flujos
estándar. Excepción: Si se define un canal alternativo en
type_notifications, este parámetro puede viajar vacío. |
|
telefono
|
int / string | Opcional | Número de teléfono móvil del firmante. Nota lógica: Si no se indica explícitamente el teléfono, el sistema omitirá el paso de verificación y no se enviará el código OTP (Firma en dos pasos). |
|
otp
|
int | Opcional | Activa o desactiva la verificación por código OTP de este firmante. Valores:
1 (activado) o 0 (desactivado, aunque se indique su
telefono). Comportamiento por defecto: 1
(activado). Sin teléfono, el OTP queda desactivado con independencia de este valor. |
|
type_notifications
|
string | Opcional | Canal para recibir el aviso de solicitud de firma y la posterior copia del documento final.
Valores: "email", "sms" o "email,sms".
Comportamiento por defecto: Si se omite, se envía de forma predeterminada
al correo electrónico (email). |
|
empresa
|
string | Opcional | Nombre de la entidad o empresa comercial. Obligatorio si el firmante actúa en representación de una Persona Jurídica. |
|
cif
|
string | Opcional | Código de Identificación Fiscal (CIF) de la empresa. Obligatorio si el firmante actúa en representación de una Persona Jurídica. |
Ejemplo de inicialización del parámetro signer:
[
{
"nombre": "Wence Criado",
"nif": "12345678A",
"cargo": "Trabajador",
"email": "soporte@firmafy.com",
"telefono": 600000000,
"type_notifications": "email"
},
{
"nombre": "Fran Cortes",
"nif": "98765432B",
"cargo": "Responsable",
"email": "hola@firmafy.com",
"telefono": 777777777,
"empresa": "FIRMAFY",
"cif": "B11111111",
"type_notifications": "email,sms"
}
]
Especificación Técnica del Parámetro: coordenadas
Si opta por indicar manualmente la ubicación exacta de los cuadros de firma omitiendo las plantillas preestablecidas, debe estructurar un mapa bidimensional respetando las siguientes directrices criptográficas y de maquetación:
- Escala y Dimensiones: Se toma como referencia un lienzo físico estándar A4, medido
en milímetros (mm), con dimensiones tope de
210mm x 297mm(ejes x, y). - Punto de Origen: El punto de anclaje de referencia es la esquina superior izquierda del folio (coordenadas 0,0). El dibujo del contenedor se renderiza hacia abajo y hacia la derecha.
- Dimensiones Recomendadas: El cuadro técnico de firma posee un estándar óptimo de
40mm x 15mm(ancho x alto). - Indexación de Firmantes: El parámetro
signerdentro del objeto debe coincidir estrictamente con el orden de asignación declarado en el array principal de firmantes (empezando en index 1). - Propiedad
side(Giro): Admite valores numéricos booleanos (1o0). Indican una rotación matemática de 90 grados en el cuadro de firma, utilizado comúnmente para la incrustación limpia de firmas en los márgenes laterales del documento. - Tratamiento por Hojas: Cada página del documento original se representa mediante un
array independiente que encapsula sus respectivos cuadros de firma. Se debe enviar un array por cada
página del PDF de forma secuencial, dejando elementos vacíos (
[]) si una hoja no requiere firma visual.
Ejemplo de Maquetación de un PDF de 3 páginas:
[
[
{
"signer": 1,
"x": 5,
"y": 120,
"side": 1,
"width": 40,
"height": 10
},
{
"signer": 2,
"x": 5,
"y": 170,
"side": 1,
"width": 45,
"height": 15
}
],
[],
[
{
"signer": 2,
"x": 80,
"y": 210,
"side": 0,
"width": 45,
"height": 15
}
]
]
Envío Multidocumento: attachment y force_flatten
Permite enviar varios PDF en una única solicitud de firma. Los firmantes, el asunto, el mensaje y el resto de parámetros de la transacción son comunes a todos los documentos.
Estructura del parámetro attachment
Array JSON (o JSON String) con un objeto por documento. El orden del array es el orden de los documentos.
| Campo JSON | Tipo | Estado | Descripción |
|---|---|---|---|
|
filename
|
string | Oblig. | Nombre del documento. Si no termina en .pdf se añade la extensión. Se eliminan
tildes y caracteres especiales. |
|
url
|
string | Condicional | URL pública del PDF. Obligatorio si no se envía base64. |
|
base64
|
string | Condicional | PDF codificado en base64. Obligatorio si no se envía url. |
|
id
|
string | Opcional | Identificador propio del documento en su sistema. Se guarda como etiqueta del documento (sin tildes ni caracteres especiales). Sólo aplica cuando los documentos se firman por separado. |
Parámetro force_flatten
Define cómo se tratan los documentos de attachment. Sólo tiene efecto junto a
attachment.
| Valor | Comportamiento |
|---|---|
false (por defecto) |
Multidocumento. Cada PDF se mantiene como un documento independiente dentro de la misma solicitud. |
true |
Documento único. Todos los PDF se unen en uno solo, en el orden de
attachment, y la solicitud se procesa como un envío de un único documento: las
coordenadas y las plantillas funcionan igual que con pdf, contando las páginas
del PDF resultante. El campo id de cada adjunto no se conserva. |
Criterios comunes
- Cada adjunto se descarga o decodifica y se valida como PDF. Si alguno falla, se rechaza toda la solicitud.
- El tamaño que se compara con el almacenamiento disponible del plan es la suma de todos los adjuntos.
- En modo multidocumento,
template_nameno se aplica. Sí se aplicansubject,messageysigner_priority. - En modo multidocumento sin
coordenadas, se coloca un cuadro de firma por firmante en el lateral izquierdo de todas las páginas de todos los documentos.
Coordenadas en multidocumento
Cuando los documentos se firman por separado, coordenadas añade un nivel más: un array por
documento, que contiene un array por página, que contiene los cuadros de firma.
- El número de elementos del primer nivel debe coincidir exactamente con el número de adjuntos.
- Cada documento debe incluir exactamente un array por cada una de sus páginas.
- Cada cuadro de firma debe incluir, como mínimo,
signer,side,xey. Las medidas y el resto de propiedades son las mismas que en el envío de un único documento. - Diferencia importante: una página enviada vacía (
[]) no queda sin firma, sino que recibe los cuadros de firma por defecto en el lateral izquierdo.
Errores específicos del envío multidocumento
| Mensaje | Causa |
|---|---|
No hemos podido descargar el archivo adjunto desde la URL. |
La url de un adjunto no es accesible. Se devuelve con
error_code: emailc_error_attachment_download. |
Error al decodificar el documento original. |
Algún adjunto no es un PDF válido o no tiene páginas. |
El formato del parámetro "coordenadas" no es un JSON válido. |
coordenadas no se puede decodificar. |
La estructura de coordenadas no es correcta. Se esperaban N elementos (uno por
documento), pero se recibieron M. |
El número de documentos en coordenadas no coincide con el de adjuntos. |
Inconsistencia en el documento N. Se esperaban coordenadas para X paginas, pero se
recibieron Y. |
El número de páginas indicado para un documento no coincide con sus páginas reales. |
El formato para la página X del documento N es incorrecto. Se esperaba un array de
coordenadas. |
Una página no se ha enviado como array. |
Faltan propiedades esenciales (signer, side, x, y) en una de las firmas de la página X
del documento N. |
Un cuadro de firma no incluye alguna de las propiedades mínimas. |
Ejemplo de attachment con dos documentos:
[
{
"id": "contrato",
"filename": "Contrato.pdf",
"url": "https://www.ejemplo.com/contrato.pdf"
},
{
"id": "anexo",
"filename": "Anexo.pdf",
"base64": "JVBERi0xLjQKJ..."
}
]
Ejemplo de coordenadas para esos dos documentos (2 y 1 páginas):
[
[
[
{ "signer": 1, "x": 5, "y": 120, "side": 1, "width": 40, "height": 15 }
],
[
{ "signer": 1, "x": 30, "y": 250, "side": 0, "width": 40, "height": 15 },
{ "signer": 2, "x": 120, "y": 250, "side": 0, "width": 40, "height": 15 }
]
],
[
[
{ "signer": 2, "x": 80, "y": 210, "side": 0, "width": 40, "height": 15 }
]
]
]
Respuesta de Solicitud Correcta:
| Nombre Parámetro | Tipo Parámetro | Valor Parámetro |
|---|---|---|
error |
bool | true/false |
message |
string | (Mensaje informativo de control adicional) |
data |
string | Hash correspondiente al CSV identificador único del documento. |
{
"error": false,
"message": "Documento Enviado",
"data": "xxxxxxx"
}
4. Solicitud Email Certificado
Endpoint para el despacho de correos electrónicos con certificación criptográfica de entrega y trazabilidad de lectura, sin requerimiento de intervención de firma manuscrita por parte del receptor. Requiere el Token y el id_show obtenidos previamente.
Parámetros de la Petición:
| Parámetro | Descripción Técnica |
|---|---|
|
action
string
Oblig.
|
Valor estático: "emailrequest" |
|
token
string
Oblig.
|
Token JWT devuelto en el inicio de sesión. |
|
id_show
string
Oblig.
|
Llave pública de la API asignada a su cuenta. |
|
subject
string
Oblig.
|
Asunto (Subject) del correo electrónico a certificar. |
|
body
string
Oblig.
|
Cuerpo del mensaje. Soporta inyección de código HTML. |
|
to
JSON String
Oblig.
|
Datos del destinatario estructurados en un objeto JSON Stringify. |
|
lang
char
Opc.
|
Opcional - Idioma de la solicitud, notificaciones y Auditoría. Valores admitidos:
ES (Por defecto), EN, IT, FR,
CA.
|
|
attachment
file / array
Opc.
|
Opcional - Archivo adjunto a la solicitud. Puede enviarse como un cUrl object (Opción 1) o como un array estructurado conteniendo rutas públicas o ficheros mapeados en base64 (Opción 2). |
|
reply-to
string
Opc.
|
Dirección de correo para respuestas. Por defecto toma el email del emisor. |
Ejemplo 4.1 de datos del destinatario:
{
"name":"Jhon Smith",
"email": "soporte@firmafy.com"
}
Ejemplo 4.2 de archivo adjunto (Opción 1 — cURL File):
curl -X POST https://app.firmafy.com/ApplicationProgrammingInterface.php \
-F "action=emailrequest" \
-F "token=tu_token_de_sesion" \
-F "id_show=tu_public_key" \
-F "subject=Asunto del email" \
-F "body=Cuerpo del mensaje" \
-F "to={\"name\":\"Jhon Smith\",\"email\":\"soporte@firmafy.com\"}" \
-F "attachment=@/ruta/al/archivo.pdf"
Ejemplo 4.3 de tratamiento de archivos adjuntos (Opción 2):
[
{"filename": "Doc1.pdf","url": "xxxxx"},
{"filename": "Doc2.pdf","base64": "base64"}
]
Payload Mínimo Completo (Estructura Base):
{
"action": "emailrequest",
"token": "tu_token_de_sesion",
"id_show": "tu_public_key",
"subject": "Notificación Importante",
"body": "<h1>Hola</h1><p>Este es un email certificado.</p>",
"to": "{\"name\":\"Jhon Smith\",\"email\":\"soporte@firmafy.com\"}"
}
5. Solicitud SMS Certificado
Endpoint para el despacho de mensajes cortos (SMS) con valor probatorio legal (certificación de entrega). Requiere el Token y el id_show obtenidos previamente.
Parámetros de la Petición:
| Parámetro | Descripción Técnica |
|---|---|
|
action
string
Oblig.
|
Valor estático: "smsrequest" |
|
token
string
Oblig.
|
Token JWT devuelto en el inicio de sesión. |
|
id_show
string
Oblig.
|
Llave pública de la API. |
|
body
string
Oblig.
|
Texto del mensaje, máximo 160 caracteres. |
|
to
JSON String
Oblig.
|
Datos del destinatario formateados en un objeto JSON Stringify. |
|
lang
char
Opc.
|
Opcional - Idioma de la auditoría generado tras el envío. Soportados: ES (Por
defecto), EN, IT, FR, CA. |
Ejemplo 5.1 de datos del destinatario:
{
"name":"Jhon Smith",
"country":34,
"phone":612345678
}
Payload Mínimo (Estructura Base):
{
"action": "smsrequest",
"token": "tu_token_de_sesion",
"id_show": "tu_public_key",
"body": "Recuerde su cita mañana a las 10:00H.",
"to": "{\"name\":\"Jhon Smith\",\"country\":34,\"phone\":612345678}"
}
6. Suscripción a Eventos (Webhooks)
Para obtener los cambios de estado que se produzcan en la solicitudes, es necesario estar suscrito a los eventos de Webhook. Elimina la necesidad de hacer *polling* continuo.
Parámetros de Suscripción:
| Parámetro | Descripción Técnica |
|---|---|
|
action
string
Oblig.
|
Valor estático: "webhook" |
|
id_show
string
Oblig.
|
Identificador del usuario. |
|
token
string
Oblig.
|
Token de inicio de sesion. |
|
type
int
Oblig.
|
Evento al que se desea suscribir:1 : Documento Firmado (Cuando todos los firmantes han firmado el documento)2 : Aviso de Firma Completada (Cuando alguno de los firmantes ha firmado el
documento)5 : Reintento de Entrega (Webhook Fallido) 6.1.1
|
|
method
int
Oblig.
|
Método de envío de datos: 1 (Array POST tradicional) ó 2 (JSON).
|
|
url_webhook
string
Oblig.
|
Url donde Firmafy enviará la respuesta. |
6.1.1 Control de Reintentos: Firmafy escucha los códigos de respuesta HTTP de su servidor para determinar que la entrega del webhook es exitosa o no. Todas las notificaciones que reciban como respuesta un status http 4xx o 5xx se registran como fallidas. Firmafy intentará entregar nuevamente la notificación hasta en 2 ocasiones más, cada 30 minutos.
Nota: No es necesario suscribirse al evento por cada solicitud, ya que si la URL a notificar es la misma en todas las solicitudes, bastaría con hacerlo solo 1 vez.
Ejemplo del POST en HTTP que se devuelve:
{
"type":"Firmar Documento",
"daterequest":"2021-02-09 16:02:34",
"datesign":"2021-02-09 16:07:25",
"status":"FIRMADO",
"subject":"Firmafy | Solicitud de Firma",
"csv":"xxxxxxxxxxxxxx",
"size":"35687",
"sender":"SYSTEM TEST",
"filename":"Documento.pdf",
"docoriginal": "pdf (multipart form-data)",
"docsigned": "pdf (multipart form-data)",
"docaudit": "pdf (multipart form-data)",
"signer":[
{
"name":"xxxxxx",
"phone":"xxxxx",
"nif":"xxxxxxx",
"email":"soporte@firmafy.com",
"status":"ACTIVO",
"compliance":"true/false",
"datesign":"2021-02-09 16:06:32"
}
]
}
Payload Mínimo para Suscribirse (Ejemplo):
{
"action": "webhook",
"token": "tu_token_de_sesion",
"id_show": "tu_public_key",
"type": 1,
"method": 2,
"url_webhook": "https://api.tu-servidor.com/firmafy-listener"
}
7. Invalidar una Solicitud de Firma
Esta acción desactiva los enlaces de los firmantes que haya pendientes de firma, bloqueando el acceso al documento.
Parámetros de la Petición:
| Parámetro | Descripción Técnica |
|---|---|
|
action
string
Oblig.
|
Valor estático: "invalidar_documento" |
|
token
string
Oblig.
|
Su token de sesión activo. |
|
csv
string
Oblig.
|
CSV del documento original. |
Payload Mínimo (Estructura Base):
{
"action": "invalidar_documento",
"token": "tu_token_de_sesion",
"csv": "xXXXXXXXXXX"
}
8. Obtener Consumo Disponible (Balance)
Este endpoint permite obtener el consumo disponible de tu cuenta.
Parámetros de la Petición:
| Parámetro | Descripción Técnica |
|---|---|
|
action
string
Oblig.
|
Valor estático: "balance" |
|
id_show
string
Oblig.
|
Identificador de tu cuenta de usuario. |
|
token
string
Oblig.
|
Token de inicio de sesion. |
Ejemplo de Respuesta:
{
"error": false,
"message": "Disponibles",
"credits": 50,
"sms": 25,
"mb": 20.331583,
"days": 23
}
{"error": true, "message": "Se ha alcanzado el numero máximo de envios disponibles en su plan. En caso de querer adquirir un nuevo plan, visite www.firmafy.com/tarifas y pongase en contacto con su proveedor"}
Recomendamos que para la integración de la API, se pongan en contacto con nuestro servicio de soporte técnico soporte@firmafy.com y así formar parte de la comunidad de Dev's en nuestro canal de SLACK.