SignRapide

API

Une API REST simple : une demande (enveloppe) contient jusqu'à 10 PDF et 10 signataires. L'accès est réservé aux organisations clientes ; la clé est fournie à l'ouverture du compte.

Authentification

Authorization: Bearer <votre clé>

Créer une demande

POST https://signrapide.fr/v1/envelopes
{
  "title": "Constitution ATELIER LAVANDE SAS",
  "locale": "fr",
  "documents": [
    { "name": "Statuts", "pdf": "<PDF en base64>" },
    { "name": "Déclaration de non-condamnation", "pdf": "<PDF en base64>" }
  ],
  "signers": [
    { "name": "Ada Martin",  "email": "ada@exemple.fr",   "documents": [0, 1] },
    { "name": "Jean Durand", "email": "jean@exemple.fr",  "documents": [0] }
  ],
  "redirect_url": "https://votre-site.fr/dossier",
  "send_email": true
}

Réponse 201 : l'identifiant de la demande, les documents et, pour chaque signataire, son lien personnel (signers[].url). Avec "send_email": false, aucune invitation n'est envoyée : affichez le lien dans votre propre parcours.

Suivre et récupérer

MéthodeChemin
GET/v1/envelopes/{id}Statut de la demande, des documents et des signataires
GET/v1/envelopes/{id}/documents/{doc}Le PDF signé d'un document (409 tant qu'il n'est pas signé par tous ses signataires)
GET/v1/envelopes/{id}/auditLe journal des événements
POST/v1/envelopes/{id}/cancelAnnuler une demande en cours

Notifications

À chaque signature (signer.signed) et quand tous les documents sont signés (envelope.completed), SignRapide envoie un POST JSON à l'adresse de notification de votre compte. La notification de fin est renvoyée jusqu'à ce que votre serveur réponde 2xx.

Vérifiez l'en-tête X-SignRapide-Signature: t=<horodatage>,v1=<hmac> : HMAC-SHA256 de "<t>.<corps>" avec votre secret. Refusez un horodatage de plus de 5 minutes.

import { createHmac, timingSafeEqual } from "node:crypto";
const [, t, v1] = header.match(/^t=(\d+),v1=([0-9a-f]{64})$/);
const ok = Math.abs(Date.now() / 1000 - t) < 300 &&
  timingSafeEqual(Buffer.from(v1, "hex"), createHmac("sha256", secret).update(`${t}.${body}`).digest());

Limites