zenipact
FonctionnalitésTarifsDéveloppeursVérifier un documentContact

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

  1. POST /envelopes — créer un brouillon (avec destinataires).
  2. POST /envelopes/{id}/documents — ajouter un PDF (multipart file ou content_base64).
  3. POST /envelopes/{id}/fields — placer les champs (positions relatives 0-1 sur la page).
  4. POST /envelopes/{id}/send — envoyer. Ou en une seule requête depuis un modèle : POST /templates/{id}/envelopes avec "send": true.
  5. Recevez les webhooks recipient.signed, envelope.completed… puis GET /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": "…"}.