API REST de e-Signature.eu — firmas electrónicas (SES, AES, QES)
1. Presentación
La API REST de e-Signature.eu permite a su aplicación enviar documentos para firma electrónica (simple SES, avanzada AES o cualificada QES según eIDAS) sin pasar por nuestra web. Usted envía el PDF y los firmantes; nosotros gestionamos la verificación de identidad, la firma y el seguimiento; usted recibe el documento firmado mediante la API o un callback.
| URL base | https://api.e-signature.eu/v3/signature/ |
Esta documentación describe la API v3. ¿Ya usa la API v2 (https://api.e-signature.eu/v2/signature/)? Consulte el Changelog.
2. Autenticación
Sus credenciales están en Mi cuenta > Firmas API una vez conectado en e-signature.eu:
- User ID: en la URL, como parámetro
useridde cada llamada; - API token: en la cabecera HTTP
x-api-keyde cada llamada.
curl -X GET "https://api.e-signature.eu/v3/signature/requestBalance?userid=123" \
-H "x-api-key: YOUR_API_TOKEN"
Mantenga su token en secreto: da acceso completo a su cuenta mediante la API. Las llamadas deben hacerse desde su servidor, nunca desde un navegador o una app móvil.
3. Convenciones
Peticiones y respuestas
- Solo HTTPS. Los cuerpos de las peticiones son JSON (
Content-Type: application/json). - Cada respuesta es JSON, en una de estas dos formas:
{ "success": true, "result": { ... } }
{ "success": false, "error": "Readable error message" }
Límites
| Límite | Valor |
|---|---|
| Peticiones | 10 por minuto por cuenta y dirección IP (por encima, HTTP 403; reintente tras un minuto) |
| Documento | Un PDF por solicitud, 30 MB como máximo, sin cifrar / sin contraseña |
| Descarga de documentos firmados | 30 días tras la finalización (ver Conservación) |
4. Créditos
Las solicitudes se pagan con sus créditos prepago de e-signature.eu. El precio de un método se obtiene con getMethods (tiene en cuenta sus precios específicos). Su saldo lo devuelven requestBalance y cada objeto solicitud (credits_balance).
Recarga automática de créditos
Para no quedarse nunca sin créditos, su cuenta puede recargarse automáticamente. Se configura una vez en Mi cuenta > Firmas API, no mediante la API:
- Elija un umbral (en créditos) y el paquete de créditos que se pedirá.
- Guarde un método de pago con nuestro proveedor de pagos Mollie (tarjeta, o adeudo directo SEPA mediante Bancontact, iDEAL…). Se solicita una sola vez un pago de verificación de 0,01 €.
- Cada vez que se descuentan créditos y su saldo baja del umbral, se crea un pedido del paquete elegido y se paga automáticamente con el método de pago guardado. La factura se le envía por email.
| Recarga automática | |
|---|---|
| Activación | Un cargo de créditos (p. ej. una nueva solicitud) que hace bajar el saldo por debajo del umbral |
| Abono de los créditos | En cuanto se confirma el pago: inmediatamente con tarjeta, tras unos días hábiles con adeudo directo SEPA |
| Recargas en curso | Una a la vez |
| Límite de seguridad | Un número máximo de recargas automáticas por 30 días |
| Pago fallido | El pedido se marca como fallido, la recarga automática se desactiva y se le informa por email |
You do not have enough credits) y no activa ninguna recarga: elija un umbral superior al coste de sus solicitudes más grandes y mantenga un margen si paga con adeudo directo SEPA. Su saldo está disponible en todo momento con requestBalance y credits_balance.5. Cómo funciona una solicitud de firma
- Usted crea la solicitud con el PDF, los firmantes y los métodos de firma aceptados. Se descuentan los créditos.
- Cada firmante recibe un email con un enlace de firma personal (o usted envía el
signature_linkcuandosend_emailesfalse). - El firmante verifica su identidad con uno de los métodos aceptados (itsme®, Evrotrust, Veriff, OTP…) y firma.
- Cuando todos han firmado, la solicitud pasa a
finished: el PDF firmado (PAdES) está disponible congetRequesty se envía en el callback.
Orden de firma
Por defecto, todos los firmantes firman en paralelo. Para definir un orden, indique sign_first: true en los firmantes del primer grupo: se les invita de inmediato, varios en paralelo si es necesario. Los demás firmantes solo se invitan cuando todo el primer grupo ha firmado. Dos grupos como máximo.
Dos modos de integración
| Modo | Funcionamiento |
|---|---|
Modo email (send_email: true, por defecto) |
Enviamos en su nombre a los firmantes las invitaciones, los recordatorios y los emails de finalización. |
Modo integrado (send_email: false) |
No se envía ningún email al crear la solicitud: el signature_link de cada firmante se devuelve en la respuesta y usted redirige a sus usuarios desde su propia interfaz. |
send_email: false, un recordatorio o una cancelación lanzados desde el panel en línea envían un email a los firmantes pendientes.No consulte la API en bucle
No llame a getRequest repetidamente para seguir el estado de una solicitud: utilice los callbacks, enviados automáticamente en cada cambio. Las llamadas excesivas activan una limitación automática que suspende temporalmente el tratamiento de sus peticiones.
6. Crear una solicitud de firma
{
"title": "Sales agreement 2026-114",
"lang": "en",
"methods": [
"itsme-qes-signature",
"evrotrust-signature"
],
"signature_place": "position_auto",
"reminder": 3,
"send_email": true,
"email_notification": false,
"note_html": "Please sign the agreement before Friday.",
"signature_redirect": "https://www.example.com/thank-you",
"external_reference": "QUOTE-2026-114",
"metadata": {
"crm_deal_id": 8812
},
"callback_url": "https://erp.example.com/hooks/esignature",
"signers": [
{
"firstname": "Ann",
"lastname": "Peeters",
"email": "[email protected]",
"phone": "+32475111222",
"sign_first": true
},
{
"firstname": "Marc",
"lastname": "Dubois",
"email": "[email protected]",
"sign_first": false
}
],
"pdf_file_base64": "JVBERi0xLjcKJeLjz9MK..."
}
Métodos de firma
| Método | Nivel | Cobertura | Precio |
|---|---|---|---|
itsme-qes-signature — itsme® |
QES (cualificada) | 32 países europeos | 1 crédito / firmante |
evrotrust-signature — Evrotrust |
QES (cualificada) | 69 países | 1 crédito / firmante |
veriff-advanced-signature — Veriff |
AES (avanzada) | 198 países | 0,7 créditos / firmante |
otp-email-non-qualified — OTP por email o SMS |
SES (simple) | Todo el mundo | 0,4 créditos / firmante |
Son los precios estándar: getMethods devuelve los métodos disponibles y los precios de su cuenta. Solo una firma electrónica cualificada (QES) equivale legalmente a una firma manuscrita según el Reglamento eIDAS. otp-email-non-qualified cubre email y SMS: el código se envía por SMS si el firmante tiene phone, si no por email, al mismo precio.
Campos del cuerpo de la petición
| Campo | Obligatorio | Tipo | Descripción |
|---|---|---|---|
title |
sí | string | Nombre del documento. Se conservan letras, cifras y guiones; si el nombre ya existe en su cuenta, se añade un sufijo -1, -2… |
lang |
sí | string | Idioma de los emails y de las páginas de firma: fr, nl, en, de, es. |
methods |
sí | array | Métodos de firma aceptados, ver Métodos de firma. Si se aceptan varios, cada firmante elige. |
signers |
sí | array | Firmantes, ver más abajo. |
pdf_file_base64 |
sí | string | El PDF, codificado en base64. Un solo archivo, 30 MB como máximo, sin cifrar. |
signature_place |
no | string | position_auto (por defecto) o position_manual, ver Colocación de las firmas. |
reminder |
no | number | Recordatorio automático cada N días, de 0 a 14. Por defecto 0 (sin recordatorio). |
send_email |
no | boolean | Por defecto true (modo email). Con false (modo integrado) no se envía ningún email de invitación ni de finalización: envíe usted el signature_link. No compatible con sign_first: true. |
email_notification |
no | boolean | Por defecto false. Con true, recibe un email en cada firma. |
note_html |
no | string | Mensaje añadido a los emails enviados a los firmantes (modo email). Se aceptan etiquetas HTML, p. ej. Note with <strong>HTML</strong>. |
signature_redirect |
no | string (URL) | Página mostrada al firmante tras la firma. Debe ser una URL válida (no se aceptan cadenas vacías). Por defecto: página de confirmación en e-signature.eu. |
external_reference |
no | string | Su propio identificador (presupuesto, contrato…), 255 caracteres como máximo. Se devuelve en cada respuesta y callback. |
metadata |
no | object | Objeto JSON libre, 4 KB como máximo, devuelto tal cual. |
callback_url |
no | string (URL) | URL de callback solo para esta solicitud (HTTPS público). Por defecto: la URL de su cuenta. |
Campos de un firmante
| Campo | Obligatorio | Tipo | Descripción |
|---|---|---|---|
lastname |
sí | string | |
email |
sí | string | Dirección de email válida |
firstname |
no | string | |
phone |
no | string | Formato internacional que empieza por + y el prefijo del país (+32…); se eliminan los espacios. Un número no válido se ignora. Con el método OTP, el código se envía por SMS si se indica un número, si no por email. |
sign_first |
no | boolean | Por defecto false. Ver Orden de firma. |
sign_page, sign_left, sign_bottom |
con position_manual |
number | Ver Colocación de las firmas. |
Coste
Precio del método más caro de methods × número de firmantes. Los créditos se descuentan al crear la solicitud. Los de los firmantes que no hayan firmado se reembolsan si la solicitud se cancela o se detiene.
Respuesta 201 Created
{
"success": true,
"result": {
"id_sign": 4521,
"lang": "en",
"doc_name": "Sales-agreement-2026-114",
"send_email": true,
"from_api": true,
"signature_redirect": "https://www.example.com/thank-you",
"status_id": "pending",
"date_status": "2026-10-20 10:15:02",
"last_reminder": null,
"timezone": "Europe/Brussels",
"credits": 2,
"credits_balance": 38.4,
"signers": {
"1": {
"firstname": "Ann",
"lastname": "Peeters",
"email": "[email protected]",
"phone": "+32475111222",
"sign_first": true,
"status": "pending",
"signature_link": "https://www.e-signature.eu/en/sign/?key=…"
},
"2": {
"firstname": "Marc",
"lastname": "Dubois",
"email": "[email protected]",
"sign_first": false,
"status": "pending",
"signature_link": "https://www.e-signature.eu/en/sign/?key=…"
}
},
"external_reference": "QUOTE-2026-114",
"metadata": {
"crm_deal_id": 8812
}
}
}
7. Colocación de las firmas
position_auto (por defecto)
Coloque los marcadores #SIG01, #SIG02… (también se acepta #SIG01#) como texto en su documento, donde cada firmante debe firmar (#SIG01 = primer firmante del array signers). La firma se coloca arriba a la izquierda del marcador. Si un mismo marcador aparece varias veces, se usa su primera aparición. Un marcador se omite si su zona de firma cubriría una firma ya colocada (o una firma existente): el firmante toma entonces el siguiente marcador libre. Un marcador tan cerca del borde de la página que la firma deba desplazarse solo se usa como último recurso.
Documento aún no firmado
Si el documento no contiene ningún marcador, o falta el marcador de un firmante, se añade al final del documento una página de firmas con los marcadores y todas las firmas se colocan en esa página (6 firmantes en la primera página añadida, luego 10 por página adicional).
Documento ya firmado
No se puede añadir ninguna página a un PDF ya firmado electrónicamente: invalidaría las firmas existentes. Con position_auto, las firmas se colocan en los marcadores libres, es decir, los marcadores cuya zona de firma no cubre ninguna firma existente. Los marcadores libres se asignan a los firmantes por orden (#SIG01, #SIG02…).
position_manual.position_manual
Indique la posición de la firma, en centímetros, para cada firmante:
| Campo | Valor |
|---|---|
sign_page |
Número de página, a partir de 1 (entero) |
sign_left |
Distancia del borde izquierdo de la página a la izquierda de la firma, en cm (se admiten decimales) |
sign_bottom |
Distancia del borde inferior de la página a la parte superior de la firma, en cm (se admiten decimales) |
{ "lastname": "Peeters", "email": "[email protected]", "sign_page": 3, "sign_left": 2.5, "sign_bottom": 6 }
sign_left y sign_bottom indican la esquina superior izquierda de la firma. La firma se coloca debajo y a la derecha de este punto.
Los límites dependen del tamaño real de la página y del tamaño del sello visual: toda la firma debe quedar al menos a 2 cm de cada borde de la página. Si se aceptan varios métodos de firma, se toma el sello más grande. Si un valor está fuera de los límites, el mensaje de error indica el rango permitido para esa página.
Una firma no puede cubrir otra firma de la solicitud, ni una firma existente si el documento ya está firmado.
8. El objeto solicitud de firma
Devuelto por request, getRequest, cancel, skip, remind, delete y enviado en los callbacks.
| Campo | Descripción |
|---|---|
id_sign |
Identificador de la solicitud |
doc_name |
Nombre del documento |
status_id |
pending en curso · finished firmado por todos · skipped detenido, firmado parcialmente · cancelled · deleted |
signers |
Objeto de los firmantes, por clave ("1", "2"…) — ver más abajo |
lang, send_email, signature_redirect, timezone |
Tal como se definieron al crear |
from_api |
true si la solicitud se creó mediante la API |
date_status |
Fecha del último cambio de estado (zona horaria de la solicitud) |
last_reminder |
Fecha del último recordatorio, o null |
credits |
Créditos de la solicitud (reservados mientras está en curso, consumidos al finalizar) |
credits_balance |
Saldo actual de su cuenta |
pdf_file_base64 |
PDF firmado, cuando la solicitud ya no está en curso |
external_reference, metadata |
Tal como se enviaron al crear |
Firmante
| Campo | Descripción |
|---|---|
firstname, lastname, email, phone, sign_first |
Tal como se enviaron al crear |
status |
pending · signed · skipped |
signature_link |
Enlace de firma personal, mientras el firmante no haya firmado |
signing_time, signing_method |
Tras la firma: fecha y método utilizado |
verified_firstname, verified_lastname |
Tras la firma: identidad verificada por el método de firma |
{
"1": {
"firstname": "Ann",
"lastname": "Peeters",
"email": "[email protected]",
"status": "signed",
"signing_time": "2026-10-20 11:02:47",
"signing_method": "itsme-qes-signature",
"verified_firstname": "Ann",
"verified_lastname": "Peeters"
}
}
9. Otros endpoints
Todos los endpoints reciben userid en la URL y x-api-key en las cabeceras. id_sign se pasa en la URL.
Listar las solicitudes
status_id (opcional): pending, finished o skipped. external_reference (opcional): solo las solicitudes con esta referencia.
{
"success": true,
"result": [
{
"id_sign": 4521,
"status_id": "pending",
"external_reference": "QUOTE-2026-114"
},
{
"id_sign": 4498,
"status_id": "finished"
}
]
}
Obtener una solicitud
Devuelve el objeto solicitud de firma, con el PDF firmado una vez finalizada la solicitud. Para seguir el estado, use los callbacks en lugar de llamadas repetidas.
Enviar un recordatorio
Envía un email de recordatorio a los firmantes con status: pending del grupo invitado actualmente (primero el grupo sign_first). Solo solicitudes pending. Funciona también con solicitudes creadas con send_email: false.
Detener una solicitud (conservando las firmas ya realizadas)
Posible cuando al menos un firmante ha firmado y al menos otro no. La solicitud pasa a skipped, el PDF firmado parcialmente está disponible y se reembolsan los créditos de los firmantes que no firmaron.
Cancelar una solicitud
Posible mientras nadie haya firmado; para terminar una solicitud firmada parcialmente, use skip. La respuesta contiene la solicitud con status_id: cancelled; después, la solicitud y su documento se eliminan de su panel, los enlaces de firma dejan de funcionar y se reembolsan los créditos.
Eliminar una solicitud
Solo solicitudes finished o skipped. Elimina los documentos y la solicitud. La respuesta contiene la solicitud una última vez, con status_id: deleted: descargue el PDF firmado antes de eliminar.
Descargar el audit trail
No disponible mientras la solicitud está en curso (HTTP 412). Devuelve el objeto solicitud con audit_trail_base64: un PDF con el historial de la solicitud (fechas, métodos, identidades verificadas).
Obtener el saldo de créditos
{ "success": true, "result": { "credits_balance": 38.4 } }
Listar los métodos de firma
Métodos aceptados en methods, con el precio en créditos por firmante para su cuenta. lang (opcional) traduce las etiquetas.
{
"success": true,
"result": [
{
"id": "itsme-qes-signature",
"label": "itsme® | QES",
"credits": 1
},
{
"id": "evrotrust-signature",
"label": "Evrotrust | QES",
"credits": 1
},
{
"id": "veriff-advanced-signature",
"label": "Veriff | AES",
"credits": 0.7
},
{
"id": "otp-email-non-qualified",
"label": "OTP by Email/SMS | SES",
"credits": 0.4
}
]
}
10. Callbacks (webhooks)
Defina su URL de callback en Mi cuenta > Firmas API (HTTPS, accesible públicamente). También puede indicar una callback_url por solicitud. El callback es un POST con un cuerpo JSON que contiene el estado completo actual de la solicitud (mismo formato que getRequest), enviado para las solicitudes creadas mediante la API.
Campos del evento
| Campo | Descripción |
|---|---|
event |
Tipo de evento (ver más abajo) |
event_id |
Identificador único del evento (evt_…). Idéntico en cada reintento del mismo evento: úselo para ignorar duplicados. |
event_at |
Fecha del evento (UTC, ISO 8601) |
changes |
Cambios de estado de los firmantes, p. ej. [{"signer_key": 1, "from": "pending", "to": "signed"}] (solo si un firmante cambió) |
external_reference, metadata |
Tal como se enviaron al crear la solicitud |
Tipos de eventos
| Evento | Cuándo |
|---|---|
signer.signed |
Un firmante ha firmado, la solicitud sigue en curso |
signer.declined, signer.skipped, signer.expired |
Un firmante rechazó, fue omitido o expiró |
request.completed |
Todos los firmantes han firmado: el PDF firmado está incluido (pdf_file_base64) |
request.stopped |
La solicitud se detuvo: el PDF firmado parcialmente está incluido |
request.cancelled |
La solicitud fue cancelada |
request.deleted |
La solicitud fue eliminada |
request.expired |
La solicitud expiró |
request.declined |
Correo certificado rechazado por el destinatario |
request.updated |
Cualquier otro cambio: recordatorio enviado, firmante modificado, nuevos enlaces de firma… |
El cuerpo contiene siempre el estado completo actual: su integración puede basarse en status_id y en el estado de cada firmante en lugar de solo en el tipo de evento.
Cabeceras
| Cabecera | Ejemplo |
|---|---|
X-Esig-Api-Version |
3 |
X-Esig-Event |
signer.signed |
X-Esig-Event-Id |
evt_4f0c2b9e1d7a3c55e8b1a2f0 |
X-Esig-Delivery-Attempt |
1, 2, … |
X-Esig-Signature |
t=1792407600,v1=5d41402abc4b2a76b9719d911017c592… |
Verificar la firma
Su secreto de firma aparece en Mi cuenta > Firmas API, donde también puede regenerarlo. v1 es el HMAC-SHA256 de "<t>.<raw request body>" con su secreto, codificado en hexadecimal. Use el cuerpo bruto, antes de cualquier lectura JSON, y rechace los callbacks de más de 5 minutos.
PHP
$body = file_get_contents( 'php://input' );
$header = $_SERVER['HTTP_X_ESIG_SIGNATURE'] ?? '';
preg_match( '/t=(\d+),v1=([a-f0-9]{64})/', $header, $m );
$valid = $m
&& abs( time() - (int) $m[1] ) <= 300
&& hash_equals( hash_hmac( 'sha256', $m[1] . '.' . $body, $secret ), $m[2] );
Node.js
const crypto = require('crypto');
function verify(rawBody, header, secret) {
const m = /t=(\d+),v1=([a-f0-9]{64})/.exec(header || '');
if (!m || Math.abs(Date.now() / 1000 - Number(m[1])) > 300) return false;
const expected = crypto.createHmac('sha256', secret).update(`${m[1]}.${rawBody}`).digest('hex');
return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(m[2]));
}
C# (.NET)
using System.Security.Cryptography; using System.Text; using System.Text.RegularExpressions;
static bool Verify(string rawBody, string header, string secret) {
var m = Regex.Match(header ?? "", @"t=(\d+),v1=([a-f0-9]{64})");
if (!m.Success || Math.Abs(DateTimeOffset.UtcNow.ToUnixTimeSeconds() - long.Parse(m.Groups[1].Value)) > 300) return false;
using var h = new HMACSHA256(Encoding.UTF8.GetBytes(secret));
var expected = Convert.ToHexString(h.ComputeHash(Encoding.UTF8.GetBytes(m.Groups[1].Value + "." + rawBody))).ToLowerInvariant();
return CryptographicOperations.FixedTimeEquals(Encoding.ASCII.GetBytes(expected), Encoding.ASCII.GetBytes(m.Groups[2].Value));
}
Respuestas y reintentos
- Responda HTTP 2xx en cuanto reciba el callback y trátelo de forma asíncrona si es necesario.
- En caso de error de red, tiempo agotado (30 s), HTTP 429 o 5xx, el callback se reenvía cada hora con el mismo
event_id, hasta 24 intentos. Las demás respuestas 4xx se consideran definitivas. Si la solicitud vuelve a cambiar antes de una entrega correcta, el siguiente callback lleva un nuevo evento y el estado completo actual. El estado actual sigue disponible en todo momento congetRequest. - Se siguen las redirecciones (se mantiene el método
POST). No se pueden usarlocalhostni direcciones privadas.
11. Errores
Los errores se devuelven con "success": false y un mensaje error legible. Base su lógica en el código HTTP: los mensajes pueden mejorar con el tiempo.
| Código HTTP | Significado |
|---|---|
| 200 / 201 | OK / solicitud creada |
| 400 | Campo ausente o no válido (el mensaje indica el campo) |
| 400 | id_sign ausente, o filtro status_id no válido |
| 401 | userid o x-api-key no válidos |
| 403 | Créditos insuficientes, o límite de peticiones alcanzado (10 por minuto) |
| 404 | id_sign desconocido para esta cuenta |
| 412 | Acción no posible en el estado actual (p. ej. cancelar tras una firma, eliminar una solicitud en curso) |
Errores por endpoint
| Endpoint | Código HTTP | Mensaje | Causa |
|---|---|---|---|
| Todos los endpoints | 401 | Please provide a valid x-api-key in headers & userid in url parameters. |
userid o x-api-key no válidos |
| Todos los endpoints | 403 | Rate limit exceeded: 10 requests per minute is allowed. Please try again after a minute. |
Más de 10 peticiones por minuto |
request |
400 | Ver Mensajes de validación | Campo, PDF o posición ausente o no válido |
request |
403 | You do not have enough credits |
Saldo inferior al coste de la solicitud |
list |
400 | Incorrect value for status_id. |
Filtro status_id desconocido |
getRequest, remind, skip, cancel, delete, requestAuditTrail |
400 | please provide id_sign parameter. |
id_sign ausente |
getRequest, remind, skip, cancel, delete, requestAuditTrail |
404 | invalid id_sign value. |
id_sign desconocido para esta cuenta |
remind |
412 | request can not be remind to user(s): wrong status |
La solicitud no está en curso |
skip |
412 | request can not be skipped: wrong status |
Nadie ha firmado todavía, todos han firmado, o la solicitud ya no está en curso |
cancel |
412 | request can not be cancelled: someone already signed the PDF |
Al menos un firmante ha firmado |
delete |
412 | request can not be deleted: wrong status_id |
La solicitud sigue en curso |
requestAuditTrail |
412 | Can not download Audit Trail while the signature request is pending |
La solicitud sigue en curso |
Mensajes de validación al crear (request, HTTP 400)
El mensaje indica el campo o el problema; … representa un valor de su petición. Base su código en el código HTTP y muestre el mensaje para ayudar a corregir la petición.
Mostrar todos los mensajes de validación
Cuerpo de la petición
Request body can not be empty
title, lang
Field 'title' must be of type string and can not be emptyField 'lang' is an invalid language code
signers
field 'signers' is omitted or is emptyFirstname, Lastname & email address must be of type string and can not be empty… is not an email addressfield 'sign_first' is not a boolean valuefield 'sign_first' can not be 'true' when field 'send_email' is 'false'
methods
You must set at least one signing method… is not a valid method
Opciones
Field 'reminder' should be of type numeric between 0 & 14 (days)Field 'send_email' should be of type booleanField 'email_notification' should be of type booleanField 'note_html' should be of type stringField 'signature_redirect' is not a valid url
external_reference, metadata, callback_url
Field 'external_reference' must be a stringField 'external_reference' can not exceed 255 charactersField 'metadata' must be a JSON objectField 'metadata' can not exceed 4096 bytesField 'callback_url' must be a publicly reachable HTTPS URL
Field 'pdf_file_base64' should be of type string and not emptyField 'pdf_file_base64' doesn't contains a base64 encoded stringField 'pdf_file_base64' doesn't contains a base64 encoded PDF fileYour file is too big > 30 MBCouldn't load your PDF documentPDF file is encrypted and password protected. Please unprotected your PDF file.Couldn't get pages from PDF document
Colocación de las firmas
field 'signature_place' is incorrectfield 'sign_page' is empty or is not an integerfield 'sign_left' is empty or is not a number (cm)field 'sign_bottom' is empty or is not a number (cm)Field 'sign_left' for signer … must be between … and … cm (page … is … x … cm, signature … x … cm, margin … cm)Field 'sign_bottom' for signer … must be between … and … cm (…)Field 'sign_page' for signer … is too big: the document has … page(s)Page … is too small for the signature of … (…)The signature of … on page … overlaps an existing signature of the document (…)The signatures of … and … overlap on page … (…)The existing signatures of the document could not be read: the position of the signature of … can not be checked
Documento ya firmado (position_auto)
Your PDF file is already signed: pages can not be added without invalidating the existing signatures. It contains … free marker(s) for … signer(s): place the signatures manually (signature_place: position_manual).Your PDF file is already signed: pages can not be added without invalidating the existing signatures. The free markers could not be determined: place the signatures manually (signature_place: position_manual).
Procesamiento
Couldn't extract markers from PDF document: …Unknown error: Request could not be saved into the Database- Mensaje de error devuelto por el proveedor de firma (eID Easy)
12. Conservación
Los documentos firmados pueden descargarse durante 30 días tras la finalización, con getRequest o el callback request.completed. El audit trail se conserva durante el periodo definido en nuestro DPA. Archive el documento firmado y el audit trail por su parte en un plazo de 30 días.
13. Changelog
API v3 — diferencias con la API v2
La API v2 (https://api.e-signature.eu/v2/signature/) sigue disponible y sin cambios. Los endpoints, parámetros y la autenticación son idénticos en ambas versiones: para pasar a la API v3, sustituya la URL base por https://api.e-signature.eu/v3/signature/. Puede migrar endpoint por endpoint.
Las URL anteriores (https://www.e-signature.eu/wp-json/signature/ para la API v2 y https://www.e-signature.eu/wp-json/esig/v3/signature/ para la API v3) siguen siendo válidas. Recomendamos utilizar las URL de api.e-signature.eu.
| Tema | API v2 | API v3 |
|---|---|---|
| URL base | /v2/signature/ |
/v3/signature/ |
| Sus propias referencias | — | Nuevos campos external_reference y metadata, devueltos en cada respuesta y callback; filtro list por external_reference |
| URL de callback | Una URL por cuenta | También por solicitud (callback_url) |
| Contenido del callback | Estado completo de la solicitud | Estado completo de la solicitud + event, event_id, event_at, changes |
| Seguridad del callback | — | Firma HMAC-SHA256 en la cabecera X-Esig-Signature |
| Reintentos del callback | Cada hora en caso de error de red, hasta su recepción | Cada hora en caso de error de red, tiempo agotado, HTTP 429 o 5xx, hasta 24 intentos, mismo event_id |
id_sign ausente, filtro status_id no válido |
HTTP 401 | HTTP 400 |
id_sign desconocido |
HTTP 401 | HTTP 404 |
| Audit trail de una solicitud en curso | HTTP 401 | HTTP 412 |
Colocación manual: sign_left / sign_bottom |
Límites fijos para una página A4 vertical (0 a 15 cm / 4 a 28,7 cm), altura de firma 2,5 cm | Límites calculados según el tamaño real de la página y del sello de los métodos aceptados, margen de 2 cm; se admiten decimales; el mensaje de error indica el rango permitido |
| Colocación manual: solapamientos | No se comprueban | Rechazado si una firma cubre otra firma de la solicitud o una firma existente del documento |
Colocación manual: sign_page |
No se rechazaba un número de página superior en uno a la última página | Se rechaza cualquier página inexistente |
Los callbacks siguen la versión usada para crear la solicitud: una solicitud creada con la API v2 sigue recibiendo callbacks de la API v2.