Centre de Documentation

Guides d'intégration et référence API complète pour les développeurs.

Intégrez la signature électronique ESIGNGO directement dans vos applications métiers, CRM ou sites web.

Introduction

L'API ESIGNGO est une API RESTful qui utilise le format JSON pour les requêtes et les réponses. Elle permet de créer des demandes de signature, de gérer des documents et de récupérer des preuves légales.

Base URL : https://esigngo.com/api/v1

Les endpoints de gestion (contacts, workflows, équipe) utilisent la base https://esigngo.com/api.

Authentification

Toutes les requêtes API doivent être authentifiées à l'aide d'une clé API transmise dans l'en-tête Authorization.

Authorization: Bearer YOUR_API_KEY

Vous pouvez générer et gérer vos clés API depuis l'espace Développeurs.

Mode Sandbox (Test)

L'API supporte un mode test complet qui vous permet d'intégrer sans consommer de crédits et sans envoyer de vrais emails.

Pour activer le mode sandbox, ajoutez l'en-tête suivant à vos requêtes :

X-Test-Mode: true
En mode sandbox, les emails ne sont pas envoyés (simulés uniquement), les documents sont marqués "is_test": true dans les réponses, et aucun crédit n'est débité.

Format des Erreurs

Toutes les erreurs retournent un JSON structuré avec un code HTTP approprié (400, 401, 403, 500) :

{
    "success": false,
    "message": "Description de l'erreur en clair"
}
Code HTTPSignification
400Données manquantes ou invalides
401Clé API manquante ou invalide
403Permission refusée (plan insuffisant, rôle)
500Erreur serveur interne

Endpoints

Documents

POST /api/v1/create_request

Crée une nouvelle demande de signature. Le document est reçu en Base64 et stocké de façon sécurisée.

Paramètres de la requête
ChampTypeRequisDescription
filenamestringNom du fichier PDF (ex: contrat.pdf)
file_contentstringContenu du PDF encodé en Base64
signersarrayListe des signataires (voir structure ci-dessous)
auto_sendbooleanSi true, envoie les emails immédiatement et passe le statut en sent. Si false (défaut), le document reste en draft.
kyc_requiredbooleanForce la vérification d'identité de chaque signataire avant signature.
kyc_manual_verifybooleanSi true, le KYC est validé manuellement par un superviseur (non automatique).
tagsarrayTags pour déclencher des workflows. Ex: ["contrat", "hr"]
webhook_urlstringURL de callback spécifique à ce document (surcharge le webhook global).
remindersobjectConfiguration des relances automatiques (voir ci-dessous)
Objet reminders (relances automatiques)
{
    "reminders": {
        "enabled": true,
        "frequency": 3,         // Tous les N jours
        "max_retries": 3,       // Nombre max de relances
        "channels": "email",    // "email" ou "sms" ou "email,sms"
        "time": "09:00"         // Heure d'envoi (HH:MM)
    }
}
Structure d'un Signataire
{
    "name": "Jean Dupont",          // OU utiliser first_name + last_name
    "first_name": "Jean",
    "last_name": "Dupont",
    "email": "jean@example.com",
    "phone": "+33612345678",        // Requis si auth_mode = "otp"
    "auth_mode": "otp",             // "otp" (SMS) ou "email" (lien simple)
    "signing_order": 1,             // Ordre de passage (1, 2, 3...)
    "color": "#dbeafe",             // Couleur d'annotation (Hex)
    "fields": [ ... ]               // Voir section Champs ci-dessous
}
Définition des Champs (Fields)

Chaque champ est positionné en pourcentage (0-100) par rapport à la page.

{
    "type": "signature",  // Voir types supportés
    "page": 1,            // Numéro de page (commence à 1)
    "x": 50, "y": 80,     // Position % depuis le coin supérieur gauche
    "width": 20,          // Largeur %
    "height": 5,          // Hauteur %
    "config": { ... }     // Config spécifique au type
}
Types de Champs Supportés
TypeDescriptionConfiguration (JSON)
signatureZone de signature manuscrite{"required": true}
initialsParaphe{"required": true}
dateDate automatique au moment de la signature{"format": "DD/MM/YYYY"}
textChamp texte libre à remplir par le signataire{"text_content": "Label", "required": true}
checkboxCase à cocher{"required": true}
labelTexte fixe (lecture seule, non éditable){"text_content": "Texte affiché", "font_size": 12, "color": "#000"}
attachmentUpload de pièce jointe par le signataire{"text_content": "Intitulé", "required": true}
Logique Conditionnelle (Champs)

Vous pouvez masquer/afficher des champs selon la valeur d'un autre champ "Maître".

// 1. Champ Maître (celui qui contrôle)
{
    "type": "checkbox",
    "config": { "uuid": "master_1" } // UUID unique requis
}

// 2. Champ Conditionnel (masqué par défaut)
{
    "type": "text",
    "config": {
        "condition": {
            "enabled": true,
            "master_field_uuid": "master_1",  // Référence le maître
            "operator": "checked",            // "equals", "not_equals", "contains", "checked"
            "value": "true"                   // Valeur déclencheur
        }
    }
}
Options Avancées & Sécurité
  • KYC (Vérification d'identité) : Ajoutez "kyc_required": true pour forcer la vérification d'identité. Ajoutez "kyc_manual_verify": true pour qu'un superviseur valide manuellement.
  • Tags (Workflows) : Ajoutez "tags": ["contrat", "hr"] pour déclencher automatiquement les workflows associés à ces tags.
  • Webhook par document : Ajoutez "webhook_url": "https://..." pour recevoir les événements de ce document spécifique, indépendamment du webhook global.
  • Relances automatiques : Utilisez l'objet reminders pour configurer des relances périodiques sans intervention manuelle.
Exemple Complet
curl -X POST https://esigngo.com/api/v1/create_request \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
    "filename": "contrat.pdf",
    "file_content": "JVBERi0x...",
    "auto_send": true,
    "kyc_required": true,
    "kyc_manual_verify": false,
    "tags": ["urgent"],
    "reminders": { "enabled": true, "frequency": 3, "max_retries": 2 },
    "signers": [
        {
            "name": "Client",
            "email": "client@email.com",
            "phone": "+33612345678",
            "auth_mode": "otp",
            "signing_order": 1,
            "fields": [
                { "type": "signature", "page": 1, "x": 10, "y": 80, "width": 20, "height": 5 },
                { "type": "date", "page": 1, "x": 10, "y": 90, "width": 15, "height": 4 }
            ]
        }
    ]
}'
Réponse (succès)
{
    "success": true,
    "message": "Document créé avec succès",
    "data": {
        "document_id": 123,
        "status": "sent",           // "draft" si auto_send=false
        "is_test": false,
        "prepare_url": "https://esigngo.com/prepare?id=123",
        "signers": [
            { "email": "client@email.com", "signing_order": 1 }
        ]
    }
}
POST /api/cancel_document

Annule ou archive un document. Le comportement dépend du statut des signatures.

Annulation (action: "cancel") : Possible uniquement si aucun signataire n'a encore signé. Les crédits consommés sont automatiquement remboursés.
Archivage (action: "archive") : Requis si au moins un signataire a déjà signé. Les signatures existantes sont conservées.
{
    "document_id": 123,
    "action": "cancel"    // "cancel" ou "archive"
}
Réponse
{
    "success": true,
    "message": "Document annulé. (0.40€ re-crédités)",
    "refund": 0.40
}
POST /api/resend_all

Relance tous les signataires en attente d'un document en une seule requête, par email et/ou SMS.

{
    "document_id": 123,
    // Optionnel : cibler des signataires spécifiques par canal
    "signers": {
        "89": ["email"],          // signataire ID 89 → email uniquement
        "90": ["email", "sms"]    // signataire ID 90 → email + SMS
    }
    // Si "signers" est omis, tous les signataires reçoivent un email
}
L'envoi SMS consomme des crédits (0.05–0.10€/SMS selon votre plan).
Réponse
{
    "success": true,
    "count": 2,
    "details": { "email": 2, "sms": 0, "sms_failed": 0 },
    "message": "Relances envoyées : 2 Email(s), 0 SMS"
}

Contacts

Gérez votre carnet d'adresses de signataires.

POST /api/add_contact

Ajoute un nouveau contact.

{
    "first_name": "Jean",
    "last_name": "Dupont",
    "email": "jean@example.com",
    "phone": "+33612345678"
}
POST /api/update_contact

Met à jour un contact existant.

{
    "id": 12,
    "first_name": "Jean",
    "last_name": "Dupont-Nouveau",
    "email": "jean@example.com"
}
POST /api/delete_contact

Supprime un contact. Envoyer en form-data (pas JSON).

id=12

Content-Type : application/x-www-form-urlencoded

Notifications & Preuves

Téléchargez vos preuves légales et relancez vos signataires.

GET /api/download_proof?id={document_id}

Télécharge le dossier de preuve (PDF) d'un document signé. Retourne le fichier PDF en binaire.

POST /api/resend_notification

Renvoie une relance à un signataire spécifique, par email ou SMS.

{
    "signer_id": 89,
    "method": "email"   // "email" (défaut) ou "sms" — SMS consomme des crédits
}
Coût SMS : 0.10€ (free), 0.05€ (plan Complète), 0.06€ (plan Illimité). Nécessite un numéro de téléphone sur le signataire.

Équipe

Gérez les membres de votre équipe.

GET /api/team/get_members

Récupère la liste des membres de votre équipe avec leurs rôles.

POST /api/team/invite_member

Invite ou crée un membre dans l'équipe. Deux modes disponibles selon si l'utilisateur a déjà un compte.

{
    "email": "collegue@entreprise.com",
    "role": "member",   // "member", "admin" ou "observer"
    "mode": "invite",   // "invite" (email d'invitation) ou "create" (compte créé immédiatement)
    "name": "Prénom Nom"  // Requis si mode = "create"
}
Limites par plan : Free = 1 membre, Illimité = 2, Complète = 5. Des sièges supplémentaires peuvent être achetés.
Si l'email correspond à un compte existant, le membre est ajouté directement sans email.
POST /api/team/remove_member

Retire un membre de l'équipe. Réservé à l'administrateur. Ajuste automatiquement la facturation Stripe si des sièges supplémentaires avaient été achetés.

{
    "user_id": 150,
    "team_id": 3   // Optionnel — utilise l'équipe active de la session si omis
}
Le membre retiré repasse automatiquement au plan free. Un crédit au prorata est appliqué si des sièges payants sont libérés.

Workflows (Automatisations)

Gérez vos workflows pour automatiser les actions après signature (archivage, email, webhook).

POST /api/workflow/create

Crée un nouveau workflow d'automatisation. Nécessite le plan Complète. Le workflow se déclenche automatiquement sur l'événement document.signed.

{
    "name": "Archivage Drive",
    "condition_tag": "archive_drive",   // Optionnel : se déclenche si le doc a ce tag
    "condition_attachments": 1,          // Optionnel : déclencher uniquement si le doc a des pièces jointes
    "condition_kyc": 0,                  // Optionnel : déclencher uniquement si le doc a un KYC
    "actions": [
        {
            "type": "send_email",
            "config": { "recipient": "archive@entreprise.com", "subject": "Nouveau contrat signé" }
        }
        // Autres types : "archive_s3", "webhook", "ftp_upload"
    ]
}
Les conditions sont cumulatives (ET). Un workflow sans condition_tag se déclenche sur tous les documents signés.
GET /api/workflow/list

Récupère la liste de tous vos workflows configurés.

GET /api/workflow/read?id={workflow_id}

Récupère le détail d'un workflow (configuration et actions).

Réponse
{
    "success": true,
    "workflow": { "id": 15, "name": "Archivage Drive", "is_active": true, ... },
    "actions": [
        { "type": "send_email", "config": { "recipient": "..." }, "sort_order": 1 }
    ]
}
GET /api/workflow/get_logs?id={workflow_id}

Récupère les 50 dernières exécutions d'un workflow (avec le nom du document associé).

POST /api/workflow/update

Met à jour un workflow existant. Toutes les actions existantes sont remplacées par celles fournies.

{
    "id": 15,
    "name": "Archivage Drive V2",
    "condition_tag": "archive_drive_v2",
    "condition_attachments": 0,
    "condition_kyc": 0,
    "actions": [ ... ]
}
POST /api/workflow/toggle

Active ou désactive un workflow.

{ "id": 10, "is_active": true }
POST /api/workflow/delete

Supprime un workflow.

{ "id": 10 }

Modèles

POST /api/use_template

Crée un nouveau document à partir d'un modèle existant. Les champs sont pré-positionnés. Les signataires sont assignés par index selon l'ordre des rôles du modèle.

{
    "templateId": 5,                      // ID du modèle (requis)
    "docName": "Contrat Client - Juin",   // Nom du document (optionnel)
    "auto_send": true,                    // Envoyer les emails immédiatement (optionnel)
    "signers": [                          // Optionnel : assigner les signataires par index
        {
            "first_name": "Jean",
            "last_name": "Dupont",
            "email": "jean@example.com",
            "phone": "+33612345678",
            "auth_mode": "otp"
        }
    ]
}
Si signers est omis, les emplacements de signataires sont créés en mode "placeholder" (à remplir depuis l'interface).
Réponse
{
    "success": true,
    "docId": 456,
    "status": "sent"   // "draft" si auto_send=false ou omis
}
POST /api/delete_template

Supprime un modèle existant.

{ "id": 5 }

Webhooks

Les webhooks vous permettent d'être notifié automatiquement lorsque des événements surviennent sur vos documents. Configurez votre URL de webhook dans l'espace Développeurs.

Événements supportés
ÉvénementDéclenché quand
document.sentLe document est envoyé aux signataires (via auto_send: true)
signer.signedUn signataire a complété sa signature
document.completedTous les signataires ont signé — le document est finalisé
document.cancelledLe document a été annulé ou archivé
Format du Payload (POST)
{
    "event": "document.completed",
    "timestamp": 1634567890,
    "is_test": false,
    "data": {
        "document_id": 123,
        "status": "completed",
        "download_url": "https://esigngo.com/download?id=123&type=final"
    }
}
Sécurité

Chaque requête webhook inclut un header X-Esigngo-Signature qui est un HMAC SHA256 du payload JSON signé avec votre clé secrète de webhook. Vérifiez toujours cette signature côté serveur pour authentifier les requêtes entrantes.

// Exemple de vérification (PHP)
$payload = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_ESIGNGO_SIGNATURE'] ?? '';
$expected = hash_hmac('sha256', $payload, YOUR_WEBHOOK_SECRET);

if (!hash_equals($expected, $signature)) {
    http_response_code(401);
    exit('Invalid signature');
}