JuriSign

Guide d'intégration API

Intégrez la signature électronique dans vos applications

Introduction

L'API REST JuriSign vous permet d'intégrer la signature électronique conforme eIDAS (SES) directement dans votre back-office ou votre application. Vous pouvez :

  • Télécharger des documents PDF
  • Créer des demandes de signature avec un ou plusieurs signataires
  • Valider l'identité par code OTP email ou SMS
  • Suivre l'avancement en temps réel via webhooks
  • Télécharger les documents signés et les preuves d'audit

REST

API JSON standard

eIDAS SES

Signature conforme

OTP Email / SMS

Vérification d'identité

URL de base : https://www.jurisign.fr/api/v1

Centre d'essai : https://test-api.jurisign.fr/api/v1 — voir ci-dessous

Format : JSON (Content-Type: application/json)

Auth : Bearer Token (Sanctum)

Authentification

L'API utilise l'authentification par Bearer Token (Laravel Sanctum). Obtenez un token avec vos identifiants :

POST /api/v1/auth/token

// Requête
curl -X POST https://www.jurisign.fr/api/v1/auth/token \
  -H "Content-Type: application/json" \
  -d '{
    "email": "votre@email.com",
    "password": "votre_mot_de_passe",
    "device_name": "mon-backoffice"
  }'

// Réponse
{
  "token": "1|abc123def456...",
  "token_type": "Bearer",
  "user": {
    "id": "uuid-...",
    "name": "Christophe Duval",
    "email": "christophe.duval@trimaran.com",
    "organization": {
      "id": "uuid-...",
      "name": "Trimaran"
    }
  }
}

Important

Conservez ce token en sécurité. Utilisez-le dans l'en-tete Authorization de toutes vos requêtes :

Authorization: Bearer 1|abc123def456...

Centre d'essai ou production : deux environnements séparés

Centre d'essai

https://test-api.jurisign.fr/api/v1

  • Votre jeton : bouton « Générer un jeton pour mon code » de la console, ou POST /auth/sandbox-token avec l'e-mail et le mot de passe de votre compte d'essai (pas ceux de jurisign.fr).
  • Il commence par sandbox_ : envoyez-le tel quel, préfixe compris.
  • Rien n'est facturé, et rien de ce que vous y créez n'apparaît sur jurisign.fr : le centre a sa propre base.

Production

https://www.jurisign.fr/api/v1

  • Votre jeton : POST /auth/token avec les identifiants de votre compte jurisign.fr.
  • Les documents et demandes créés par l'API apparaissent dans votre espace jurisign.fr.
  • Une signature effective consomme un crédit.

Pour démarrer en deux minutes : un script Python prêt à lancer enchaîne les quatre appels (jeton, dépôt du PDF, demande, envoi) et affiche le lien de signature.

Flux complet de signature

Voici le processus en 4 étapes pour envoyer un document à la signature via l'API :

1

Upload PDF

POST /documents

→
2

Créer demande

POST /sign-requests

→
3

Envoyer

POST /sign-requests/{id}/send

→
4

Suivi & DL

GET + webhooks

Pas encore de clé ?

Obtenez un accès bac à sable gratuit — aucune signature réelle, aucun crédit décompté.

Obtenir ma clé de test
1

Télécharger un document PDF

POST /api/v1/documents

Envoyez le PDF en multipart/form-data. Taille max : 20 Mo.

curl -X POST https://www.jurisign.fr/api/v1/documents \
  -H "Authorization: Bearer VOTRE_TOKEN" \
  -F "file=@contrat.pdf" \
  -F "title=Contrat de bail 2026"

// Réponse 201
{
  "data": {
    "id": "doc-uuid-...",
    "title": "Contrat de bail 2026",
    "original_filename": "contrat.pdf",
    "status": "draft",
    "page_count": 5,
    "file_size": 245760,
    "created_at": "2026-03-31T10:00:00+02:00"
  }
}

Plusieurs fichiers en un seul appel

Un contrat et ses annexes ? Envoyez-les dans files[] plutôt que dans file : JuriSign les fusionne en un seul PDF, dans l'ordre d'envoi, et vous renvoie un document unique. Jusqu'à 10 fichiers par appel (PDF, images, Word).

curl -X POST https://www.jurisign.fr/api/v1/documents   -H "Authorization: Bearer VOTRE_TOKEN"   -F "files[]=@contrat.pdf"   -F "files[]=@annexe1.pdf"   -F "files[]=@annexe2.pdf"   -F "title=Contrat + annexes"

// Réponse 201 — un seul document, la somme des pages
{
  "data": {
    "id": "doc-uuid-...",
    "title": "Contrat + annexes",
    "page_count": 11,
    "merged_from": 3
  }
}

merged_from vous confirme le nombre de fichiers effectivement fusionnés. Le champ file au singulier continue de fonctionner à l'identique : rien à changer dans une intégration existante.

Note : Conservez l'id du document, il sera nécessaire pour créer la demande de signature.

2

Créer une demande de signature

POST /api/v1/sign-requests

Définissez les signataires, le canal OTP (email ou SMS), les zones de signature et la durée de validité.

curl -X POST https://www.jurisign.fr/api/v1/sign-requests \
  -H "Authorization: Bearer VOTRE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "document_id": "doc-uuid-...",
    "subject": "Signature du contrat de bail",
    "message": "Merci de bien vouloir signer ce document.",
    "signing_order_type": 0,
    "expiry_hours": 168,
    "signers": [
      {
        "prenom": "Jean",
        "nom": "Dupont",
        "email": "jean.dupont@email.com",
        "otp_channel": "sms",
        "telephone": "+33612345678"
      },
      {
        "prenom": "Marie",
        "nom": "Martin",
        "email": "marie.martin@email.com",
        "otp_channel": "email"
      }
    ],
    "zones": [
      {
        "signer_index": 0,
        "page": 5,
        "x": 10,
        "y": 75,
        "width": 35,
        "height": 10
      },
      {
        "signer_index": 1,
        "page": 5,
        "x": 55,
        "y": 75,
        "width": 35,
        "height": 10
      }
    ]
  }'

Paramètres de la demande

document_idUUID du document (requis)
subjectObjet de la demande (requis)
messageMessage pour les signataires
signing_order_type0 = simultané, 1 = séquentiel
expiry_hoursDurée de validité (1 à 720 h)
remindersRelances automatiques par e-mail (J+1, J+3, J+5, veille de l’expiration) : false pour les désactiver. Par défaut true.
sender_nameFacultatif, 100 caractères au plus : le nom présenté aux signataires pour cette demande, par exemple votre propre client. Affiché « sender_name, via votre organisation » dans l’e-mail d’invitation et sur la page de signature, et consigné au dossier de preuve. Ni adresse web ni balise HTML.

Paramètres signataire

prenomPrénom (requis)
nomNom (requis)
emailEmail (requis)
otp_channel"email" ou "sms"
telephoneRequis si otp_channel = "sms"

Zones de signature (coordonnées)

Les coordonnées x, y, width, height sont en pourcentage de la page (0 à 100). Le point (0,0) est en haut à gauche. signer_index correspond à l'index du signataire (0, 1, 2...).

Erreur courante : aucun email/SMS recu apres la creation

La creation d'une demande de signature (etape 2) ne declenche pas l'envoi des notifications. La demande est creee en statut draft.

Vous devez appeler l'etape 3 (POST /sign-requests/{uuid}/send) pour envoyer les emails d'invitation aux signataires.

Ce fonctionnement en 2 temps permet de verifier la demande avant envoi, ou de l'annuler si necessaire.

3

Envoyer aux signataires

POST /api/v1/sign-requests/{uuid}/send

Déclenche l'envoi des invitations par email à chaque signataire. Le signataire reçoit un lien sécurisé unique pour signer.

curl -X POST https://www.jurisign.fr/api/v1/sign-requests/sr-uuid-.../send \
  -H "Authorization: Bearer VOTRE_TOKEN"

// Réponse 200
{
  "message": "Demande envoyée aux signataires.",
  "data": {
    "id": "sr-uuid-...",
    "status": "pending",
    "sent_at": "2026-03-31T10:05:00+02:00"
  }
}

Processus côté signataire :

  1. Le signataire reçoit un email avec un lien sécurisé
  2. Il visualise le document PDF et les zones de signature
  3. Il trace sa signature, à la souris ou au doigt, ou fait écrire son nom en écriture manuscrite et l'adopte comme signature
  4. Il reçoit un code OTP (par email ou SMS) pour valider
  5. Le document est signé et un dossier de preuve est généré
4

Suivi et téléchargement

Consulter le statut

GET /api/v1/sign-requests/{uuid}

// Réponse - statuts possibles : draft, pending, partially_signed, completed, expired, cancelled
{
  "data": {
    "id": "sr-uuid-...",
    "status": "completed",
    "subject": "Contrat de bail",
    "progress": 100,
    "signers": [
      {
        "id": "signer-uuid-...",
        "name": "Jean Dupont",
        "email": "jean.dupont@email.com",
        "status": "signed",
        "otp_channel": "sms",
        "signed_at": "2026-03-31T14:30:00+02:00"
      }
    ]
  }
}

Télécharger le PDF signé

GET /api/v1/sign-requests/{uuid}/download

Retourne le fichier PDF signé (Content-Type: application/pdf). Disponible uniquement quand le statut est completed.

Télécharger la preuve d'audit

GET /api/v1/sign-requests/{uuid}/proof

Retourne le dossier de preuve PDF (horodatage, IP, empreintes, captures de signature).

Webhooks

Recevez des notifications en temps réel sur votre serveur lorsqu'un événement se produit :

sign_request.sent

Demande envoyée aux signataires

sign_request.completed

Tous les signataires ont signé

sign_request.cancelled

Demande annulée

signer.signed

Un signataire a signé

signer.declined

Un signataire a refusé

Enregistrer un webhook

POST /api/v1/webhooks

curl -X POST https://www.jurisign.fr/api/v1/webhooks \
  -H "Authorization: Bearer VOTRE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://votre-serveur.com/webhooks/jurisign",
    "events": ["sign_request.completed", "signer.signed"]
  }'

// Réponse 201 - conservez le secret !
{
  "data": {
    "id": 1,
    "url": "https://votre-serveur.com/webhooks/jurisign",
    "events": ["sign_request.completed", "signer.signed"],
    "secret": "wh_sec_abc123..."
  }
}

Vérification de signature

Chaque webhook est signé avec le secret fourni. Vérifiez l'en-tête X-Signature pour vous assurer de l'authenticité. En cas d'échec de livraison, 3 tentatives automatiques sont effectuées (1min, 5min, 30min).

Redirection après signature et domaine déclaré

Le champ redirect_url affiche au signataire, une fois sa signature faite, un bouton « Revenir sur votre-site.fr ». Il est facultatif : sans lui, l'API fonctionne entièrement et le signataire voit la page de confirmation JuriSign.

Pour l'utiliser, votre nom de domaine doit être déclaré au préalable auprès du support. Tant qu'aucun domaine n'est déclaré, toute redirect_url est refusée (HTTP 422), et la demande n'est pas créée.

Pourquoi un vrai domaine, déclaré à l'avance ?

  • Protéger vos signataires contre l'hameçonnage. Le signataire fait confiance au lien jurisign.fr qu'il vient de recevoir. Si n'importe quelle adresse était acceptée, quiconque ouvre un compte pourrait renvoyer ce signataire vers une copie de votre site, avec la caution de jurisign.fr : c'est une « redirection ouverte », une faille classique.
  • Un domaine qui vous appartient. Vos sous-domaines sont acceptés automatiquement. Déclarer une adresse IP, localhost ou le domaine partagé d'un hébergeur (dont d'autres clients utilisent des sous-domaines) autoriserait des sites qui ne sont pas les vôtres.
  • https obligatoire, pour que le retour vers votre site ne puisse pas être intercepté.
  • Un contrôle humain : c'est ce qui permet de s'assurer que le domaine est bien le vôtre avant de l'accepter.

Pour déclarer votre domaine : écrivez au support en indiquant le nom de votre organisation et le domaine (par exemple votre-site.fr). Pendant vos essais, ou en développement local, envoyez simplement vos demandes sans redirect_url.

Validation OTP / SMS

JuriSign supporte deux canaux de validation OTP pour vérifier l'identité du signataire :

Email

Inclus dans tous les plans

Le code OTP à 6 chiffres est envoyé par email au signataire. Valable 5 minutes, 3 tentatives max.

"otp_channel": "email"

SMS

Plan Professionnel et supérieur

Le code OTP est envoyé par SMS au numéro du signataire. Plus sécurisé, recommandé pour les documents sensibles.

"otp_channel": "sms"

"telephone": "+33612345678"

Format téléphone : Format international avec indicatif pays (ex: +33612345678 pour la France).

Tous les endpoints

Méthode Endpoint Description
Authentification
POST/auth/tokenObtenir un token d'accès
DELETE/auth/tokenRévoquer le token courant
Documents
GET/documentsLister les documents
POST/documentsTélécharger un document PDF
GET/documents/{uuid}Détails d'un document
DELETE/documents/{uuid}Supprimer un document (brouillon)
GET/documents/{uuid}/downloadTélécharger le fichier PDF
Demandes de signature
GET/sign-requestsLister les demandes
POST/sign-requestsCréer une demande de signature
GET/sign-requests/{uuid}Détails et statut d'une demande
POST/sign-requests/{uuid}/sendEnvoyer aux signataires
POST/sign-requests/{uuid}/cancelAnnuler une demande
POST/sign-requests/{uuid}/remindRelancer par e-mail les signataires dont c’est le tour, ou un seul (signer_id). Une relance par signataire et par 24 h (1 minute en bac à sable).
GET/sign-requests/{uuid}/downloadPDF signé (après complétion)
GET/sign-requests/{uuid}/proofPreuve d'audit PDF
Webhooks
GET/webhooksLister les webhooks configurés
POST/webhooksCréer un endpoint webhook
PUT/webhooks/{id}Modifier un webhook
DELETE/webhooks/{id}Supprimer un webhook

Gestion des erreurs

L'API retourne des codes HTTP standards avec un corps JSON décrivant l'erreur :

CodeSignification
200Succès
201Ressource créée
401Token invalide ou expiré
403Action non autorisée (organisation suspendue, plan insuffisant)
404Ressource non trouvée
422Erreur de validation (champs manquants ou invalides)
429Rate limit dépassé (trop de requetes)
500Erreur serveur interne
// Exemple d'erreur 422
{
  "message": "Les données fournies ne sont pas valides.",
  "errors": {
    "document_id": ["Le champ document id est requis."],
    "signers.0.email": ["L'adresse email est invalide."]
  }
}

Support

Documentation interactive

Explorez et testez tous les endpoints en direct avec notre interface Swagger :

Ouvrir Swagger UI

Contact technique

Pour toute question sur l'intégration :

© 2026 PCFRANCE. Logiciel protégé, code source déposé à l'INPI (e-Soleau n° DSO2026035022). Toute contrefaçon sera poursuivie.