Webhooks notify your server when envelopes are completed, declined, or voided.

Notification channels

Choose how Abundera Sign tells you about activity on your envelopes.

Your Webhooks

Loading webhooks…

Add Webhook

Webhook Events

Subscribe to specific events via the notify_events array when creating envelopes. If omitted, all events are delivered to your callback_url.

EventTriggerPayload
signer.viewedSigner opens the signing pageEnvelope ID, signer email, view count, IP, user agent
signer.signedIndividual signer completes signingEnvelope ID, signer details, signature type, signed_at
signer.declinedSigner declines to signEnvelope ID, signer email, decline reason
signer.delegatedSigner delegates to another personEnvelope ID, original signer, delegate email/name, reason
envelope.completedAll signers have signed (document sealed)Envelope ID, all signer details, download URL
envelope.voidedSender voids the documentEnvelope ID, void reason, voided_by
envelope.expiredDocument passes its expiration dateEnvelope ID, expired_at, unsigned signers
envelope.extendedSender extends the signing deadline (revives expired documents)Envelope ID, previous status, old and new deadline
payment.completedSigner completes Stripe paymentEnvelope ID, signer email, amount, currency
clause.flaggedSigner flags a clause for negotiationEnvelope ID, clause text, signer email, reason
clause.respondedSender responds to a flagged clauseEnvelope ID, clause text, response, status
clause.acceptedCounter-proposal accepted by signer
clause.appliedAgreed clause text applied; signatures re-collectedEnvelope ID, clause text, accepted terms
clause.counter_proposedSender sends a counter-proposalEnvelope ID, clause text, counter-proposal text
clause.withdrawnSigner withdrew their own open clause flagEnvelope ID, clause text, counter-proposal text
notarization.completedRemote online notarization session completesEnvelope ID, notarization ID, notarized PDF URL
notarization.failedRemote online notarization session failsEnvelope ID, notarization ID, failure reason
notarization.expiredNotarization session expires before completionEnvelope ID, notarization ID, expired_at
signer.idv_verifiedSigner passes provider ID verificationEnvelope ID, signer email, document type, country
signer.idv_failedSigner's ID verification is declined or not approvedEnvelope ID, signer email, status, reason
signer.kba_failedSigner fails the knowledge-based identity quizEnvelope ID, signer email, attempts
signer.otp_lockedSigner is locked out after repeated SMS code failuresEnvelope ID, signer email, locked_until
signer.blockedSigner is blocked by a signing gate (location, access code, SMS cap, identity checks, or credits)Envelope ID, signer email, gate, reason
signer.email_bouncedAn email to the signer bounces or draws a spam complaintEnvelope ID, signer email, bounce_type, template_alias
envelope.retention_expiringA completed document's evidence purges within 30 days (retention warning)Envelope ID, purge_date, retention_years
envelope.purgedRetention period completed; evidence and signer data permanently erasedEnvelope ID, retention_years, completed_at
signer.attachment_uploadedSigner uploads a supporting attachmentEnvelope ID, signer email, filename, size
payment.declinedA pay-to-sign or overage charge is declinedEnvelope ID, amount, currency, reason
envelope.expiringEnvelope is approaching its expiration date without completingEnvelope ID, expires_at, days_remaining

HMAC Verification

Deliveries are signed with the Standard Webhooks scheme. Each request carries three headers: webhook-id (unique per delivery, use it to deduplicate), webhook-timestamp (unix seconds), and webhook-signature. The signature is v1,<base64(HMAC-SHA256)> over the signed content {id}.{timestamp}.{rawBody}, keyed by the base64 bytes of your whsec_ secret. The header may hold several space-delimited signatures during secret rotation — accept the delivery if any one verifies.

Easiest path: use an official Standard Webhooks library — npm install standardwebhooks or pip install standardwebhooks. Pass the raw body and headers to wh.verify(body, headers) and it checks the signature and the ±5 min replay window for you. The snippets below are the equivalent manual verification if you'd rather not add a dependency.

Replay protection: reject deliveries where the timestamp differs from now by more than 300 s.

Sample Payload

All webhook payloads follow this structure. The data object varies by event type.

{
  "id":        "msg_7f3a9c12-0b4e-4d8f-a1c2-3e5f7a9b0d1e",
  "type":      "envelope.completed",
  "timestamp": "2026-06-07T12:00:00.000Z",
  "data": {
    "envelope_id":   "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "template_id":   "nda-simple",
    "template_name": "Non-Disclosure Agreement",
    "status":        "completed",
    "completed_at":  "2026-06-07T12:00:00.000Z",
    "signers": [
      {
        "id":     "sgr_9b0d1e3e5f7a",
        "email":  "signer@example.com",
        "name":   "Jane Doe",
        "status": "signed"
      }
    ]
  }
}

Verify Signature

Paste your webhook secret, the webhook-id and webhook-timestamp headers, and the raw request body to compute the expected Standard Webhooks signature.