API REST e-Signature.eu — recommandé électronique

1. Présentation

L’API REST d’e-Signature.eu permet à votre application d’envoyer des recommandés électroniques sans passer par notre site. Vous envoyez le PDF, une adresse expéditeur vérifiée et le destinataire ; le document reçoit un horodatage électronique qualifié, et le destinataire signe un accusé de réception après avoir vérifié son identité. Vous récupérez le résultat via l’API ou un callback.

URL de base https://api.e-signature.eu/v3/regis/
Postman Documentation et collection Postman

L’ancienne URL de base https://www.e-signature.eu/wp-json/esig/v3/regis/ reste valable. Nous recommandons d’utiliser l’URL api.e-signature.eu.

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 userid de chaque appel ;
  • API token : envoyé dans l’en-tête HTTP x-api-key de chaque appel.
curl -X GET "https://api.e-signature.eu/v3/regis/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 :

  1. Choisissez un seuil (en crédits) et le pack de crédits à commander.
  2. 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.
  3. 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
La recharge est déclenchée par un débit. Une demande qui coûte plus que votre solde actuel est refusée (HTTP 403, 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’un recommandé

  1. Vous envoyez le PDF, une adresse expéditeur vérifiée et le destinataire. Le document reçoit un horodatage électronique qualifié et les crédits sont débités.
  2. Le destinataire reçoit un email avec deux liens : l’un pour signer l’accusé de réception et accéder au document, l’autre pour refuser.
  3. Pour signer, le destinataire vérifie son identité avec l’une des méthodes acceptées (itsme®, Evrotrust, OTP…).
  4. Le recommandé devient finished (signé), declined (refusé), ou expired sans réaction après 14 jours.

Un expéditeur, un destinataire par recommandé. Comme sur le site, un rappel automatique est envoyé tous les 4 jours (non paramétrable) ; il n’y a ni rappel manuel ni annulation.

6. Adresse expéditeur

Comme sur le site, l’adresse expéditeur (sender_email) doit être vérifiée avant de pouvoir être utilisée :

  1. Appelez verifySender : un email avec un lien de vérification est envoyé à l’adresse (réponse 202). Si l’adresse est déjà vérifiée, la réponse est 200 avec "verified": true.
  2. Le titulaire de l’adresse clique sur le lien.
  3. L’adresse peut alors être utilisée dans request.
POST/v3/regis/verifySender?userid={userid}
{ "email": "[email protected]", "lang": "en" }
{
  "success": true,
  "result": {
    "email": "[email protected]",
    "verified": false,
    "message": "A verification email has been sent to [email protected]. The address can be used as sender_email once the link in this email has been clicked."
  }
}
GET/v3/regis/senders?userid={userid}

Liste les adresses expéditeur de votre compte avec leur état.

{
  "success": true,
  "result": [
    {
      "email": "[email protected]",
      "verified": true
    },
    {
      "email": "[email protected]",
      "verified": false
    }
  ]
}

7. Envoyer un recommandé

POST/v3/regis/request?userid={userid}
{
  "title": "Formal notice rent October",
  "lang": "en",
  "sender_email": "[email protected]",
  "recipient": {
    "firstname": "Ann",
    "lastname": "Peeters",
    "email": "[email protected]",
    "phone": "+32475111222"
  },
  "methods": [
    "itsme-qes-signature",
    "evrotrust-signature"
  ],
  "send_email": true,
  "note_html": "Please acknowledge receipt.",
  "signature_redirect": "https://www.example.com/thank-you",
  "external_reference": "INV-2026-0042",
  "metadata": {
    "customer_id": 311
  },
  "pdf_file_base64": "JVBERi0xLjcKJeLjz9MK..."
}
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à.
lang oui string Langue des emails et des pages : fr, nl, en, de, es.
sender_email oui string Adresse expéditeur vérifiée, voir Adresse expéditeur.
recipient.lastname, recipient.email oui string
recipient.firstname non string
recipient.phone non string Format international (+32…). Un numéro invalide est ignoré.
methods oui array Méthodes acceptées pour signer l’accusé de réception, voir getMethods.
pdf_file_base64 oui string Le PDF, encodé en base64. Un seul fichier, 30 Mo maximum, non chiffré.
send_email non boolean Par défaut true. Avec false, aucun email n’est envoyé au destinataire ni à l’expéditeur : transmettez vous-même signature_link et declined_link.
note_html non string Message ajouté à l’email envoyé au destinataire.
signature_redirect non string (URL) Page affichée au destinataire après la signature.
external_reference non string Votre propre identifiant (facture, dossier…), 255 caractères maximum.
metadata non object Objet JSON libre, 4 Ko maximum, renvoyé tel quel.
callback_url non string (URL) URL de callback pour ce recommandé uniquement (HTTPS public). Par défaut : l’URL de votre compte.

Coût

Prix de la méthode la plus chère de methods, pour un destinataire. Débité à la création du recommandé.

Réponse 201 Created

{
  "success": true,
  "result": {
    "type": "regis",
    "id_sign": 123,
    "doc_name": "Formal-notice-rent-October",
    "lang": "en",
    "sender_email": "[email protected]",
    "status_id": "pending",
    "date_added": "2026-10-20 11:50:00",
    "date_status": "2026-10-20 11:50:00",
    "date_expired": "2026-11-03 11:50:00",
    "timezone": "Europe/Brussels",
    "methods": [
      "itsme-qes-signature",
      "evrotrust-signature"
    ],
    "reminder": 4,
    "last_reminder": null,
    "send_email": true,
    "from_api": true,
    "credits": 1,
    "credits_balance": 41,
    "recipient": {
      "firstname": "Ann",
      "lastname": "Peeters",
      "email": "[email protected]",
      "phone": "+32475111222",
      "status": "pending",
      "signing_time": "",
      "signing_method": "",
      "verified_firstname": "",
      "verified_lastname": "",
      "signature_link": "https://www.e-signature.eu/en/sign-regis/?key=…",
      "declined_link": "https://www.e-signature.eu/en/sign-regis/?key=…"
    },
    "external_reference": "INV-2026-0042",
    "metadata": {
      "customer_id": 311
    }
  }
}

8. L’objet recommandé

Renvoyé par request, getRequest, modifyRecipient, delete et envoyé dans les callbacks. Le champ "type": "regis" le distingue d’une demande de signature lorsque les deux utilisent la même URL de callback.

Champ Description
id_sign Identifiant du recommandé
status_id pending en attente du destinataire · finished accusé signé · declined refusé par le destinataire · expired non signé après 14 jours · deleted
date_added, date_status, date_expired Création, dernier changement de statut, expiration (fuseau horaire du recommandé)
sender_email, lang, methods, reminder, send_email Tels que définis à la création
last_reminder Date du dernier rappel, ou null
credits, credits_balance Crédits du recommandé, solde actuel de votre compte
recipient firstname, lastname, email, phone, status ; après signature signing_time, signing_method, verified_firstname, verified_lastname ; tant qu’il est en attente signature_link et declined_link
pdf_file_base64 Document horodaté, une fois que le recommandé n’est plus en attente
receipt_file_base64 Accusé de réception signé, lorsque finished
external_reference, metadata Tels qu’envoyés à la création

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 recommandés

GET/v3/regis/list?userid={userid}&status_id=pending

status_id (facultatif) : pending, finished, declined ou expired. external_reference (facultatif) : uniquement les recommandés ayant cette référence.

{
  "success": true,
  "result": [
    {
      "id_sign": 123,
      "status_id": "pending",
      "doc_name": "Formal-notice-rent-October",
      "date_added": "2026-10-20 11:50:00",
      "external_reference": "INV-2026-0042"
    }
  ]
}

Obtenir un recommandé

GET/v3/regis/getRequest?userid={userid}&id_sign=123

Modifier le destinataire

PATCH/v3/regis/modifyRecipient?userid={userid}&id_sign=123
{ "email": "[email protected]", "phone": "+32475333444" }

Recommandé pending uniquement. Envoyez seulement les champs à modifier parmi firstname, lastname, email, phone. Si l’email change, l’ancien destinataire est informé de l’annulation et le nouveau reçoit le recommandé.

Supprimer un recommandé

DELETE/v3/regis/delete?userid={userid}&id_sign=123

Statut finished, declined ou expired uniquement. Supprime les fichiers et l’historique ; la réponse contient le recommandé une dernière fois (status_id: deleted) : téléchargez les documents avant de supprimer.

Télécharger l’audit trail

GET/v3/regis/requestAuditTrail?userid={userid}&id_sign=123

Indisponible tant qu’il est en attente. Renvoie le recommandé avec audit_trail_base64 : un PDF horodaté avec l’historique complet.

Obtenir le solde de crédits

GET/v3/regis/requestBalance?userid={userid}

Lister les méthodes

GET/v3/regis/getMethods?userid={userid}&lang=en

Méthodes acceptées dans methods pour le recommandé, avec le prix pour votre compte. La liste peut différer de celle de l’API des signatures.

{
  "success": true,
  "result": [
    {
      "id": "itsme-qes-signature",
      "label": "itsme® | QES",
      "credits": 1
    },
    {
      "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 Changement de statut du destinataire, par ex. [{"signer_key": 1, "from": "pending", "to": "signed"}] (uniquement en cas de changement)
changes (signer.email_failed) Email non délivré, par ex. [{"signer_key": 2, "email": "[email protected]", "bounce_type": "permanent", "reason": "smtp; 550 5.1.1 user unknown"}]
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
signer.email_failed Un email envoyé à un signataire n’a pas pu être délivré, voir Emails non délivrés
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.

Emails non délivrés

Lorsqu’un email envoyé par e-Signature.eu à un signataire (ou au destinataire d’un recommandé) est renvoyé par son serveur de messagerie (adresse inconnue, boîte pleine, serveur qui refuse le message…), vous recevez le callback signer.email_failed. Le statut de la demande et du signataire ne change pas.

Champ de changes Description
signer_key Clé du signataire dans signers (toujours 1 pour un recommandé)
email Adresse en erreur
bounce_type permanent : l’adresse n’existe pas ou refuse les messages · transient : problème temporaire (boîte pleine, serveur indisponible), distribution abandonnée après plusieurs tentatives · undetermined : raison inconnue
reason Message technique du serveur de messagerie du destinataire, s’il est disponible

Corrigez l’adresse avec modifySigner (demande de signature) ou modifyRecipient (recommandé) : l’invitation est envoyée à la nouvelle adresse, et aucun email d’annulation n’est envoyé à l’adresse en erreur. Le titulaire du compte est aussi prévenu par email, et le signataire est signalé Email non délivré dans le tableau de bord en ligne.

permanent : plus aucun email n’est envoyé à cette adresse pour cette demande (rappels compris) jusqu’à sa correction. transient ou undetermined : les emails ne sont pas bloqués ; le prochain rappel part normalement et, s’il échoue à nouveau, vous recevez un nouveau callback signer.email_failed.

Seules les demandes en cours et les signataires qui n’ont pas encore signé sont concernés. Avec send_email: false, e-Signature.eu n’envoie aucun email aux signataires : cet événement ne se produit donc pas.

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 via getRequest.
  • Les redirections sont suivies (la méthode POST est conservée). localhost et les adresses privées ne peuvent pas être utilisés.

Pour le recommandé, le callback est envoyé quand l’accusé est signé, refusé ou expiré, à chaque rappel automatique et quand le destinataire est modifié (sur le site ou via l’API). Le destinataire correspond à signer_key 1 dans changes.

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 / 202 OK / recommandé créé / email de vérification envoyé
400 Champ manquant ou invalide (le message indique le champ)
401 userid ou x-api-key invalide
403 Crédits insuffisants, ou limite de requêtes atteinte (10 par minute)
404 id_sign manquant, ou inconnu pour ce compte
412 Action impossible dans l’état actuel (adresse expéditeur non vérifiée, mauvais statut)

12. Conservation

Le document horodaté et l’accusé de réception signé sont téléchargeables pendant 30 jours, via getRequest ou le callback. L’audit trail est conservé pendant la durée définie dans notre DPA. Archivez les documents de votre côté dans les 30 jours.

Panier d’achat

0
image/svg+xml

No products in the cart.

Continuer vos achats