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:

Restricción de Localización (l10n): Las claves (keys) de los parámetros JSON deben enviarse estrictamente en el formato documentado. No traducir las keys bajo ningún concepto, independientemente de su localización.

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.

POST https://app.firmafy.com/ApplicationProgrammingInterface.php

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:

JSON
{
    "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.

POST https://app.firmafy.com/ApplicationProgrammingInterface.php

Modalidades de envío del PDF

Existen otras opciones además de cURL para enviar el documento PDF. Debes utilizar EXCLUSIVAMENTE UNA de las cuatro opciones por cada petición. Mezclar parámetros invalidará la llamada. Si se envía 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:

JSON
[
  {
    "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:

Ejemplo de Maquetación de un PDF de 3 páginas:

JSON
[
    [
        {
            "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

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.

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:

JSON
[
    {
        "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):

JSON
[
    [
        [
            { "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.
JSON
{
    "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.

POST https://app.firmafy.com/ApplicationProgrammingInterface.php

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:

JSON
{
  "name":"Jhon Smith",
  "email": "soporte@firmafy.com"
}

Ejemplo 4.2 de archivo adjunto (Opción 1 — cURL File):

cURL
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):

JSON
[
  {"filename": "Doc1.pdf","url": "xxxxx"},
  {"filename": "Doc2.pdf","base64": "base64"}
]

Payload Mínimo Completo (Estructura Base):

JSON
{
  "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.

POST https://app.firmafy.com/ApplicationProgrammingInterface.php

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:

JSON
{
  "name":"Jhon Smith",
  "country":34,
  "phone":612345678
}

Payload Mínimo (Estructura Base):

JSON
{
  "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.

POST https://app.firmafy.com/ApplicationProgrammingInterface.php

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:

JSON
{
 "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):

JSON
{
  "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.

POST https://app.firmafy.com/ApplicationProgrammingInterface.php

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):

JSON
{
  "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.

POST https://app.firmafy.com/ApplicationProgrammingInterface.php

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:

JSON
{
    "error": false,
    "message": "Disponibles",
    "credits": 50,
    "sms": 25,
    "mb": 20.331583,
    "days": 23
}
Control de Cuotas: En caso de realizar una solicitud de firma a la API y no disponer de créditos disponibles, se devuelve un mensaje de error:
{"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.