API REST SignSpry v1

URL de base https://signspry.com/api/v1 · JSON en entrée, JSON en sortie · les erreurs renvoient {"error": "…"} avec un code 4xx/5xx.

Authentification

Créez une clé dans la console développeur et envoyez-la avec chaque requête :

curl https://signspry.com/api/v1/account \
  -H "Authorization: Bearer sk_live_YOUR_KEY"

Une clé ne dispose que des portées cochées lors de sa création — envelopes:read (liste, statut, journal d'audit, PDF scellé), envelopes:write (créer, envoyer, relancer, annuler, liens de signature et d'intégration), templates:read, account:read. Un appel hors des portées de la clé renvoie 403 en indiquant la portée manquante. Les clés expirent (30 jours, 90 jours, un an ou jamais — vous êtes prévenu par e-mail une semaine avant) et renvoient ensuite 401 ; elles peuvent aussi être limitées à une liste d'adresses IP autorisées (adresses ou plages CIDR) et renvoient 403 depuis toute autre adresse. Donnez à chaque intégration sa propre clé avec les portées les plus restreintes possible, afin que la révocation de l'une n'affecte jamais les autres.

Créer et envoyer une enveloppe

Un seul appel importe les documents (PDF en base64), ajoute les destinataires et les champs, puis envoie. Les coordonnées sont des fractions de la page (0–1) à partir du coin supérieur gauche ; recipient est un index dans le tableau des destinataires ; status: "sent" envoie immédiatement les invitations par e-mail (omettez-le pour conserver un brouillon).

curl -X POST https://signspry.com/api/v1/envelopes \
  -H "Authorization: Bearer sk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Service Agreement",
    "message": "Please sign by Friday.",
    "expires_days": 15,
    "reminder_days": 2,
    "status": "sent",
    "documents": [{"name": "agreement.pdf", "content_b64": "'"$(base64 -w0 agreement.pdf)"'"}],
    "recipients": [
      {"name": "Asha Vendor", "email": "asha@vendor.in", "routing_order": 1},
      {"name": "Manu Shekhar", "email": "manu@signspry.com", "routing_order": 2},
      {"name": "Accounts",  "email": "accounts@signspry.com", "role": "cc"}
    ],
    "fields": [
      {"recipient": 0, "type": "signature", "page": 0, "x": 0.10, "y": 0.72, "w": 0.25, "h": 0.05},
      {"recipient": 0, "type": "text", "page": 0, "x": 0.10, "y": 0.60, "w": 0.20, "h": 0.04,
       "label": "PAN", "validation": {"type": "pan"}},
      {"recipient": 1, "type": "signature", "page": 1, "x": 0.10, "y": 0.72, "w": 0.25, "h": 0.05}
    ]
  }'

Types de champs : signature initials text date checkbox dropdown (avec options) radio (avec group_name) formula. Validations : email numbers letters date phone_in pincode pan gstin {"type":"custom","regex":"…"}.

Signature intégrée

Au lieu des invitations par e-mail (ou en complément), récupérez une URL de signature et ouvrez-la dans votre propre application — en iframe ou par redirection. Lorsque le signataire a terminé, il est redirigé vers votre return_url avec ?envelope=…&event=signed (ou declined).

curl -X POST https://signspry.com/api/v1/envelopes/ENV_ID/recipients/RECIPIENT_ID/signing-link \
  -H "Authorization: Bearer sk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"return_url": "https://yourapp.com/signing-done"}'

#  {"url": "https://signspry.com/sign/…", "recipient": {…}}

Les ID de destinataire proviennent des réponses de création et de détail. Chaque appel génère un nouveau lien et invalide les anciens pour ce destinataire. L'ordre de signature s'applique toujours — un signataire bloqué voit une page « en attente des autres ».

Webhooks

Ajoutez un point de terminaison dans la console ; chaque événement correspondant y envoie du JSON en POST :

POST https://yourapp.com/webhooks/signet
X-Signet-Event: envelope.completed
X-Signet-Signature: sha256=<hex HMAC-SHA256 of raw body, keyed with your whsec_… secret>

{"id":"…","event":"envelope.completed","created_at":1787480000.1,
 "data":{"envelope":{"id":"…","title":"…","status":"completed","recipients":[…]}}}

Vérification (Python) : hmac.new(secret, raw_body, hashlib.sha256).hexdigest() == header.split("sha256=")[1]. Les livraisons échouées sont retentées deux fois ; les résultats récents s'affichent dans la console. Événements : envelope.sent recipient.viewed recipient.signed recipient.declined recipient.reassigned envelope.completed envelope.voided envelope.expired reminder.sent

Référence

Point de terminaisonDescription
GET /accountPropriétaire de la clé + utilisation.
POST /envelopesCréer (et éventuellement envoyer) une enveloppe.
GET /envelopes?status=&limit=&offset=Lister vos enveloppes.
GET /envelopes/:idDétail complet, destinataires et champs compris.
POST /envelopes/:id/sendEnvoyer un brouillon.
POST /envelopes/:id/voidAnnuler avec un motif.
POST /envelopes/:id/remindRelancer par e-mail les signataires en attente.
POST /envelopes/:id/recipients/:rid/signing-linkURL de signature intégrée (+ return_url).
GET /envelopes/:id/documentTélécharger le PDF signé et scellé.
GET /envelopes/:id/auditJournal d'audit chaîné par hachage, en JSON.