API REST e-Signature.eu — signatures électroniques (SES, AES, QES)
1. Présentation
L’API REST d’e-Signature.eu permet à votre application d’envoyer des documents en signature électronique (simple SES, avancée AES ou qualifiée QES selon eIDAS) sans passer par notre site. Vous envoyez le PDF et les signataires ; nous gérons la vérification d’identité, la signature et le suivi ; vous récupérez le document signé via l’API ou un callback.
| URL de base | https://api.e-signature.eu/v3/signature/ |
Cette documentation décrit l’API v3. Vous utilisez déjà l’API v2 (https://api.e-signature.eu/v2/signature/) ? Consultez le Changelog.
2. Authentification
Vos identifiants sont disponibles dans Mon compte > Signatures API une fois connecté sur e-signature.eu :
- User ID : envoyé dans l’URL, paramètre
useridde chaque appel ; - API token : envoyé dans l’en-tête HTTP
x-api-keyde chaque appel.
curl -X GET "https://api.e-signature.eu/v3/signature/requestBalance?userid=123" \
-H "x-api-key: YOUR_API_TOKEN"
Gardez votre token secret : il donne un accès complet à votre compte via l’API. Les appels doivent partir de votre serveur, jamais d’un navigateur ou d’une application mobile.
3. Conventions
Requêtes et réponses
- HTTPS uniquement. Les corps de requête sont en JSON (
Content-Type: application/json). - Chaque réponse est en JSON, sous l’une de ces deux formes :
{ "success": true, "result": { ... } }
{ "success": false, "error": "Readable error message" }
Limites
| Limite | Valeur |
|---|---|
| Requêtes | 10 par minute par compte et adresse IP (HTTP 403 au-delà, réessayer après une minute) |
| Document | Un PDF par demande, 30 Mo maximum, non chiffré / sans mot de passe |
| Téléchargement des documents signés | 30 jours après la finalisation (voir Conservation) |
4. Crédits
Les demandes sont payées avec vos crédits prépayés e-signature.eu. Le prix d’une méthode s’obtient avec getMethods (vos prix spécifiques sont pris en compte). Votre solde est renvoyé par requestBalance et dans chaque objet demande (credits_balance).
Recharge automatique des crédits
Pour ne jamais manquer de crédits, votre compte peut se recharger automatiquement. Cela se configure une fois dans Mon compte > Signatures API, et non via l’API :
- Choisissez un seuil (en crédits) et le pack de crédits à commander.
- Enregistrez un moyen de paiement chez notre prestataire de paiement Mollie (carte, ou domiciliation SEPA via Bancontact, iDEAL…). Un paiement de vérification de 0,01 € est demandé une seule fois.
- Chaque fois que des crédits sont débités et que votre solde passe sous le seuil, une commande du pack choisi est créée et payée automatiquement avec le moyen de paiement enregistré. La facture vous est envoyée par email.
| Recharge automatique | |
|---|---|
| Déclenchement | Un débit de crédits (par ex. une nouvelle demande) qui fait passer le solde sous le seuil |
| Ajout des crédits | Dès la confirmation du paiement : immédiatement par carte, après quelques jours ouvrables par domiciliation SEPA |
| Recharges en cours | Une seule à la fois |
| Limite de sécurité | Un nombre maximal de recharges automatiques sur 30 jours |
| Échec du paiement | La commande est marquée comme échouée, la recharge automatique est désactivée et vous êtes prévenu par email |
You do not have enough credits) et ne déclenche pas de recharge : choisissez un seuil supérieur au coût de vos plus grosses demandes, et gardez une marge si vous payez par domiciliation SEPA. Votre solde reste disponible à tout moment via requestBalance et credits_balance.5. Fonctionnement d’une demande de signature
- Vous créez la demande avec le PDF, les signataires et les méthodes de signature acceptées. Les crédits sont débités.
- Chaque signataire reçoit un email avec un lien de signature personnel (ou vous envoyez vous-même le
signature_linklorsquesend_emailvautfalse). - Le signataire vérifie son identité avec l’une des méthodes acceptées (itsme®, Evrotrust, Veriff, OTP…) et signe.
- Quand tout le monde a signé, la demande est
finished: le PDF signé (PAdES) est disponible viagetRequestet envoyé dans le callback.
Ordre de signature
Par défaut, tous les signataires signent en parallèle. Pour définir un ordre, indiquez sign_first: true pour les signataires du premier groupe : ils sont invités immédiatement, éventuellement à plusieurs en parallèle. Les autres signataires ne sont invités que lorsque tout le premier groupe a signé. Deux groupes au maximum.
Deux modes d’intégration
| Mode | Fonctionnement |
|---|---|
Mode email (send_email: true, par défaut) |
Nous envoyons en votre nom aux signataires les invitations, les rappels et les emails de finalisation. |
Mode intégré (send_email: false) |
Aucun email n’est envoyé à la création : le signature_link de chaque signataire est renvoyé dans la réponse, et vous y redirigez vos utilisateurs depuis votre propre interface. |
send_email: false, un rappel ou une annulation lancé depuis le tableau de bord en ligne envoie un email aux signataires en attente.N’interrogez pas l’API en boucle
N’appelez pas getRequest à répétition pour suivre l’état d’une demande : utilisez les callbacks, envoyés automatiquement à chaque changement. Des appels excessifs déclenchent une limitation automatique qui suspend temporairement le traitement de vos requêtes.
6. Créer une demande de signature
{
"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éthodes de signature
| Méthode | Niveau | Couverture | Prix |
|---|---|---|---|
itsme-qes-signature — itsme® |
QES (qualifiée) | 32 pays européens | 1 crédit / signataire |
evrotrust-signature — Evrotrust |
QES (qualifiée) | 69 pays | 1 crédit / signataire |
veriff-advanced-signature — Veriff |
AES (avancée) | 198 pays | 0,7 crédit / signataire |
otp-email-non-qualified — OTP par email ou SMS |
SES (simple) | Monde entier | 0,4 crédit / signataire |
Ce sont les prix standards : getMethods renvoie les méthodes disponibles et les prix de votre compte. Seule une signature électronique qualifiée (QES) équivaut légalement à une signature manuscrite selon le règlement eIDAS. otp-email-non-qualified couvre l’email et le SMS : le code est envoyé par SMS si le signataire a un phone, sinon par email, au même prix.
Champs du corps de la requête
| Champ | Obligatoire | Type | Description |
|---|---|---|---|
title |
oui | string | Nom du document. Les lettres, chiffres et tirets sont conservés ; un suffixe -1, -2… est ajouté si le nom existe déjà dans votre compte. |
lang |
oui | string | Langue des emails et des pages de signature : fr, nl, en, de, es. |
methods |
oui | array | Méthodes de signature acceptées, voir Méthodes de signature. Si plusieurs sont acceptées, chaque signataire choisit. |
signers |
oui | array | Signataires, voir ci-dessous. |
pdf_file_base64 |
oui | string | Le PDF, encodé en base64. Un seul fichier, 30 Mo maximum, non chiffré. |
signature_place |
non | string | position_auto (par défaut) ou position_manual, voir Positionnement des signatures. |
reminder |
non | number | Rappel automatique tous les N jours, de 0 à 14. Par défaut 0 (aucun rappel). |
send_email |
non | boolean | Par défaut true (mode email). Avec false (mode intégré), aucun email d’invitation ni de finalisation n’est envoyé : transmettez vous-même le signature_link. Incompatible avec sign_first: true. |
email_notification |
non | boolean | Par défaut false. Avec true, vous recevez un email à chaque signature. |
note_html |
non | string | Message ajouté aux emails envoyés aux signataires (mode email). Les balises HTML sont acceptées, par ex. Note with <strong>HTML</strong>. |
signature_redirect |
non | string (URL) | Page affichée au signataire après la signature. URL valide obligatoire (chaîne vide refusée). Par défaut : page de confirmation sur e-signature.eu. |
external_reference |
non | string | Votre propre identifiant (devis, contrat…), 255 caractères maximum. Renvoyé dans chaque réponse et callback. |
metadata |
non | object | Objet JSON libre, 4 Ko maximum, renvoyé tel quel. |
callback_url |
non | string (URL) | URL de callback pour cette demande uniquement (HTTPS public). Par défaut : l’URL de votre compte. |
Champs d’un signataire
| Champ | Obligatoire | Type | Description |
|---|---|---|---|
lastname |
oui | string | |
email |
oui | string | Adresse email valide |
firstname |
non | string | |
phone |
non | string | Format international commençant par + et l’indicatif du pays (+32…) ; les espaces sont supprimés. Un numéro invalide est ignoré. Avec la méthode OTP, le code est envoyé par SMS si un numéro est indiqué, sinon par email. |
sign_first |
non | boolean | Par défaut false. Voir Ordre de signature. |
sign_page, sign_left, sign_bottom |
avec position_manual |
number | Voir Positionnement des signatures. |
Coût
Prix de la méthode la plus chère de methods × nombre de signataires. Les crédits sont débités à la création de la demande. Ceux des signataires qui n’ont pas signé sont remboursés si la demande est annulée ou arrêtée.
Réponse 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. Positionnement des signatures
position_auto (par défaut)
Placez les marqueurs #SIG01, #SIG02… (également accepté : #SIG01#) sous forme de texte dans votre document, là où chaque signataire doit signer (#SIG01 = premier signataire du tableau signers). La signature est placée en haut à gauche du marqueur. Si un même marqueur apparaît plusieurs fois, sa première occurrence est utilisée. Un marqueur est ignoré si sa zone de signature recouvrirait une signature déjà placée (ou une signature existante) : le signataire prend alors le marqueur libre suivant. Un marqueur si proche du bord de la page que la signature doit être décalée n’est utilisé qu’en dernier recours.
Document non encore signé
Si le document ne contient aucun marqueur, ou si le marqueur d’un signataire est absent, une page de signatures contenant les marqueurs est ajoutée à la fin du document et toutes les signatures sont placées sur cette page (6 signataires sur la première page ajoutée, puis 10 par page supplémentaire).
Document déjà signé
Aucune page ne peut être ajoutée à un PDF déjà signé électroniquement : cela invaliderait les signatures existantes. Avec position_auto, les signatures sont placées sur les marqueurs libres, c’est-à-dire les marqueurs dont la zone de signature ne recouvre aucune signature existante. Les marqueurs libres sont attribués aux signataires dans l’ordre (#SIG01, #SIG02…).
position_manual.position_manual
Indiquez la position de la signature, en centimètres, pour chaque signataire :
| Champ | Valeur |
|---|---|
sign_page |
Numéro de page, à partir de 1 (entier) |
sign_left |
Distance entre le bord gauche de la page et la gauche de la signature, en cm (décimales autorisées) |
sign_bottom |
Distance entre le bas de la page et le haut de la signature, en cm (décimales autorisées) |
{ "lastname": "Peeters", "email": "[email protected]", "sign_page": 3, "sign_left": 2.5, "sign_bottom": 6 }
sign_left et sign_bottom indiquent le coin supérieur gauche de la signature. La signature est placée en dessous et à droite de ce point.
Les limites dépendent de la taille réelle de la page et de la taille du cachet visuel : toute la signature doit rester à au moins 2 cm de chaque bord de la page. Si plusieurs méthodes de signature sont acceptées, le plus grand cachet est pris en compte. Si une valeur est hors limites, le message d’erreur indique la plage autorisée pour cette page.
Une signature ne peut pas recouvrir une autre signature de la demande, ni une signature existante si le document est déjà signé.
8. L’objet demande de signature
Renvoyé par request, getRequest, cancel, skip, remind, delete et envoyé dans les callbacks.
| Champ | Description |
|---|---|
id_sign |
Identifiant de la demande |
doc_name |
Nom du document |
status_id |
pending en cours · finished signé par tous · skipped arrêté, partiellement signé · cancelled · deleted |
signers |
Objet des signataires, par clé ("1", "2"…) — voir ci-dessous |
lang, send_email, signature_redirect, timezone |
Tels que définis à la création |
from_api |
true si la demande a été créée via l’API |
date_status |
Date du dernier changement de statut (fuseau horaire de la demande) |
last_reminder |
Date du dernier rappel, ou null |
credits |
Crédits de la demande (réservés tant qu’elle est en cours, utilisés une fois terminée) |
credits_balance |
Solde actuel de votre compte |
pdf_file_base64 |
PDF signé, lorsque la demande n’est plus en cours |
external_reference, metadata |
Tels qu’envoyés à la création |
Signataire
| Champ | Description |
|---|---|
firstname, lastname, email, phone, sign_first |
Tels qu’envoyés à la création |
status |
pending · signed · skipped |
signature_link |
Lien de signature personnel, tant que le signataire n’a pas signé |
signing_time, signing_method |
Après signature : date et méthode utilisée |
verified_firstname, verified_lastname |
Après signature : identité vérifiée par la méthode de signature |
{
"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. Autres endpoints
Tous les endpoints reçoivent userid dans l’URL et x-api-key dans les en-têtes. id_sign est passé dans l’URL.
Lister les demandes
status_id (facultatif) : pending, finished ou skipped. external_reference (facultatif) : uniquement les demandes ayant cette référence.
{
"success": true,
"result": [
{
"id_sign": 4521,
"status_id": "pending",
"external_reference": "QUOTE-2026-114"
},
{
"id_sign": 4498,
"status_id": "finished"
}
]
}
Obtenir une demande
Renvoie l’objet demande de signature, avec le PDF signé une fois la demande terminée. Pour suivre l’état d’une demande, utilisez les callbacks plutôt que des appels répétés.
Envoyer un rappel
Envoie un email de rappel aux signataires status: pending du groupe actuellement invité (le groupe sign_first d’abord). Demande pending uniquement. Fonctionne aussi pour les demandes créées avec send_email: false.
Arrêter une demande (en gardant les signatures déjà faites)
Possible lorsqu’au moins un signataire a signé et qu’au moins un autre ne l’a pas fait. La demande devient skipped, le PDF partiellement signé est disponible et les crédits des signataires qui n’ont pas signé sont remboursés.
Annuler une demande
Possible tant que personne n’a signé ; pour terminer une demande partiellement signée, utilisez skip. La réponse contient la demande avec status_id: cancelled ; la demande et son document sont ensuite retirés de votre tableau de bord, les liens de signature ne fonctionnent plus et les crédits sont remboursés.
Supprimer une demande
Demandes finished ou skipped uniquement. Supprime les documents et la demande. La réponse contient la demande une dernière fois, avec status_id: deleted : téléchargez le PDF signé avant de supprimer.
Télécharger l’audit trail
Indisponible tant que la demande est en cours (HTTP 412). Renvoie l’objet demande avec audit_trail_base64 : un PDF retraçant l’historique de la demande (dates, méthodes, identités vérifiées).
Obtenir le solde de crédits
{ "success": true, "result": { "credits_balance": 38.4 } }
Lister les méthodes de signature
Méthodes acceptées dans methods, avec le prix en crédits par signataire pour votre compte. lang (facultatif) traduit les libellés.
{
"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)
Définissez votre URL de callback dans Mon compte > Signatures API (HTTPS, accessible publiquement). Vous pouvez aussi définir une callback_url par demande. Le callback est un POST dont le corps JSON contient l’état complet actuel de la demande (même format que getRequest), envoyé pour les demandes créées via l’API.
Champs de l’événement
| Champ | Description |
|---|---|
event |
Type d’événement (voir ci-dessous) |
event_id |
Identifiant unique de l’événement (evt_…). Identique à chaque nouvel essai du même événement : utilisez-le pour ignorer les doublons. |
event_at |
Date de l’événement (UTC, ISO 8601) |
changes |
Changements de statut des signataires, par ex. [{"signer_key": 1, "from": "pending", "to": "signed"}] (uniquement si un signataire a changé) |
external_reference, metadata |
Tels qu’envoyés à la création de la demande |
Types d’événements
| Événement | Quand |
|---|---|
signer.signed |
Un signataire a signé, la demande est toujours en cours |
signer.declined, signer.skipped, signer.expired |
Un signataire a refusé, a été ignoré ou a expiré |
request.completed |
Tous les signataires ont signé : le PDF signé est inclus (pdf_file_base64) |
request.stopped |
La demande a été arrêtée : le PDF partiellement signé est inclus |
request.cancelled |
La demande a été annulée |
request.deleted |
La demande a été supprimée |
request.expired |
La demande a expiré |
request.declined |
Recommandé refusé par le destinataire |
request.updated |
Tout autre changement : rappel envoyé, signataire modifié, nouveaux liens de signature… |
Le corps contient toujours l’état complet actuel : votre intégration peut se baser sur status_id et sur le statut de chaque signataire plutôt que sur le seul type d’événement.
En-têtes
| En-tête | Exemple |
|---|---|
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… |
Vérifier la signature
Votre secret de signature est affiché dans Mon compte > Signatures API, où vous pouvez aussi le régénérer. v1 est le HMAC-SHA256 de "<t>.<raw request body>" avec votre secret, encodé en hexadécimal. Utilisez le corps brut, avant toute lecture JSON, et refusez les callbacks de plus de 5 minutes.
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));
}
Réponses et nouveaux essais
- Répondez HTTP 2xx dès réception du callback, et traitez-le de manière asynchrone si nécessaire.
- En cas d’erreur réseau, de délai dépassé (30 s), de HTTP 429 ou 5xx, le callback est renvoyé toutes les heures avec le même
event_id, jusqu’à 24 tentatives. Les autres réponses 4xx sont considérées comme définitives. Si la demande change à nouveau avant une livraison réussie, le callback suivant porte un nouvel événement et l’état complet actuel. L’état actuel reste disponible à tout moment viagetRequest. - Les redirections sont suivies (la méthode
POSTest conservée).localhostet les adresses privées ne peuvent pas être utilisés.
11. Erreurs
Les erreurs sont renvoyées avec "success": false et un message error lisible. Basez votre logique sur le code HTTP : les messages peuvent évoluer.
| Code HTTP | Signification |
|---|---|
| 200 / 201 | OK / demande créée |
| 400 | Champ manquant ou invalide (le message indique le champ) |
| 400 | id_sign manquant, ou filtre status_id invalide |
| 401 | userid ou x-api-key invalide |
| 403 | Crédits insuffisants, ou limite de requêtes atteinte (10 par minute) |
| 404 | id_sign inconnu pour ce compte |
| 412 | Action impossible dans l’état actuel (par ex. annuler après une signature, supprimer une demande en cours) |
Erreurs par endpoint
| Endpoint | Code HTTP | Message | Cause |
|---|---|---|---|
| Tous les endpoints | 401 | Please provide a valid x-api-key in headers & userid in url parameters. |
userid ou x-api-key invalide |
| Tous les endpoints | 403 | Rate limit exceeded: 10 requests per minute is allowed. Please try again after a minute. |
Plus de 10 requêtes par minute |
request |
400 | Voir Messages de validation | Champ, PDF ou position manquant ou invalide |
request |
403 | You do not have enough credits |
Solde inférieur au coût de la demande |
list |
400 | Incorrect value for status_id. |
Filtre status_id inconnu |
getRequest, remind, skip, cancel, delete, requestAuditTrail |
400 | please provide id_sign parameter. |
id_sign manquant |
getRequest, remind, skip, cancel, delete, requestAuditTrail |
404 | invalid id_sign value. |
id_sign inconnu pour ce compte |
remind |
412 | request can not be remind to user(s): wrong status |
La demande n’est pas en cours |
skip |
412 | request can not be skipped: wrong status |
Personne n’a encore signé, tout le monde a signé, ou la demande n’est plus en cours |
cancel |
412 | request can not be cancelled: someone already signed the PDF |
Au moins un signataire a signé |
delete |
412 | request can not be deleted: wrong status_id |
La demande est encore en cours |
requestAuditTrail |
412 | Can not download Audit Trail while the signature request is pending |
La demande est encore en cours |
Messages de validation à la création (request, HTTP 400)
Le message indique le champ ou le problème ; … représente une valeur de votre requête. Basez votre code sur le code HTTP, et affichez le message pour aider à corriger la requête.
Afficher tous les messages de validation
Corps de la requête
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
Options
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
Positionnement des signatures
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
Document déjà signé (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).
Traitement
Couldn't extract markers from PDF document: …Unknown error: Request could not be saved into the Database- Message d’erreur renvoyé par le prestataire de signature (eID Easy)
12. Conservation
Les documents signés sont téléchargeables pendant 30 jours après la finalisation, via getRequest ou le callback request.completed. L’audit trail est conservé pendant la durée définie dans notre DPA. Archivez le document signé et l’audit trail de votre côté dans les 30 jours.
13. Changelog
API v3 — différences avec l’API v2
L’API v2 (https://api.e-signature.eu/v2/signature/) reste disponible et inchangée. Les endpoints, paramètres et l’authentification sont identiques dans les deux versions : pour passer à l’API v3, remplacez l’URL de base par https://api.e-signature.eu/v3/signature/. Vous pouvez migrer endpoint par endpoint.
Les anciennes URL (https://www.e-signature.eu/wp-json/signature/ pour l’API v2 et https://www.e-signature.eu/wp-json/esig/v3/signature/ pour l’API v3) restent valables. Nous recommandons d’utiliser les URL api.e-signature.eu.
| Sujet | API v2 | API v3 |
|---|---|---|
| URL de base | /v2/signature/ |
/v3/signature/ |
| Vos propres références | — | Nouveaux champs external_reference et metadata, renvoyés dans chaque réponse et callback ; filtre list par external_reference |
| URL de callback | Une URL par compte | Aussi par demande (callback_url) |
| Contenu du callback | État complet de la demande | État complet de la demande + event, event_id, event_at, changes |
| Sécurité du callback | — | Signature HMAC-SHA256 dans l’en-tête X-Esig-Signature |
| Nouveaux essais du callback | Toutes les heures en cas d’erreur réseau, jusqu’à réception | Toutes les heures en cas d’erreur réseau, de délai dépassé, de HTTP 429 ou 5xx, jusqu’à 24 tentatives, même event_id |
id_sign manquant, filtre status_id invalide |
HTTP 401 | HTTP 400 |
id_sign inconnu |
HTTP 401 | HTTP 404 |
| Audit trail d’une demande en cours | HTTP 401 | HTTP 412 |
Placement manuel : sign_left / sign_bottom |
Limites fixes pour une page A4 portrait (0 à 15 cm / 4 à 28,7 cm), hauteur de signature 2,5 cm | Limites calculées selon la taille réelle de la page et du cachet des méthodes acceptées, marge de 2 cm ; décimales acceptées ; le message d’erreur indique la plage autorisée |
| Placement manuel : recouvrements | Non vérifiés | Refusé si une signature recouvre une autre signature de la demande ou une signature existante du document |
Placement manuel : sign_page |
Un numéro de page supérieur d’une unité à la dernière page n’était pas refusé | Toute page inexistante est refusée |
Les callbacks suivent la version utilisée pour créer la demande : une demande créée avec l’API v2 continue de recevoir les callbacks de l’API v2.