API REST & webhooks
Intégrez la signature électronique dans vos logiciels : création d'enveloppes, documents, destinataires, champs, envoi, suivi, téléchargement des preuves. Spécification OpenAPI 3.1 : /api/v1/openapi.json.
Authentification
Créez une clé dans Paramètres → API & webhooks. Les clés zs_test_… (bac à sable) sont gratuites : documents filigranés, sans valeur juridique. Les clés zs_live_… nécessitent le plan Business.
curl https://www.zenipact.com/api/v1/envelopes \
-H "Authorization: Bearer zs_test_xxx" \
-H "Idempotency-Key: order-1234" \
-H "Content-Type: application/json" \
-d '{"title":"Devis 1234","recipients":[{"name":"Jean Peeters","email":"jean@example.com","phone":"+32470000000","level":"advanced"}]}'
Cycle complet
POST /envelopes— créer un brouillon (avec destinataires).POST /envelopes/{id}/documents— ajouter un PDF (multipartfileoucontent_base64).POST /envelopes/{id}/fields— placer les champs (positions relatives 0-1 sur la page).POST /envelopes/{id}/send— envoyer. Ou en une seule requête depuis un modèle :POST /templates/{id}/envelopesavec"send": true.- Recevez les webhooks
recipient.signed,envelope.completed… puisGET /envelopes/{id}/download/signed.
Webhooks signés
Chaque livraison porte X-Zenisign-Signature: v1=<hex>, un HMAC-SHA256 du message <timestamp>.<corps> avec le secret du webhook, et X-Zenisign-Timestamp pour bloquer le rejeu. Réessais exponentiels pendant 24 h, rejeu manuel depuis l'interface.
$expected = hash_hmac('sha256', $_SERVER['HTTP_X_ZENISIGN_TIMESTAMP'].'.'.file_get_contents('php://input'), $secret);
if (!hash_equals('v1='.$expected, $_SERVER['HTTP_X_ZENISIGN_SIGNATURE'])) { http_response_code(401); exit; }
Événements
envelope.sent, envelope.completed, envelope.declined, envelope.expired, envelope.cancelled, recipient.viewed, recipient.signed, recipient.declined, anchor.confirmed, pact.created, pact.identity_pending, pact.identity_verified, pact.signing, pact.signed, pact.payment_pending, pact.active, pact.released, pact.rejected, pact.disputed, pact.cancelled, pact.expired
Limites
600 requêtes par minute et par clé (en-têtes X-RateLimit-*). Fichiers : 50 Mo, 100 pages. Vérification publique : POST /api/v1/verify avec {"hash": "…"}.