Skip to main content

Webhook events

Every event below can be subscribed to individually, by domain wildcard (envelope.*), or all at once (*). See Managing endpoints for how selectors work.

Events marked ⚠️ can carry personal data — names, email addresses, or the values typed into a signed document. Subscribe to those deliberately.

Document lifecycle

EventFires on
envelope.createdA new envelope record was created.
envelope.sentThe envelope was sent to its signers.
envelope.viewedThe first signer opened the document (fires once, on sent -> viewed).
envelope.completed ⚠️All parties signed. Carries the filled-in field values.
envelope.declinedA signer declined to sign.
envelope.voidedThe envelope was voided before completion.
envelope.recalledThe sender recalled the envelope. Also fires envelope.voided with recalled:true for one release.
envelope.expiredThe envelope passed its expiry date without completing.
envelope.reminder_sentA signing reminder was emailed.
envelope.deletedThe envelope was soft-deleted.

Signer lifecycle

EventFires on
signer.viewedA signer opened the document (fires on every view).
signer.startedA signer began filling the document.
signer.completedOne signer finished; others may remain.
signer.declinedA specific signer declined.

Vault & compliance

EventFires on
vault.storedThe authoritative copy was stored and hashed.
vault.compliance.passedUCC 9-105 evaluation scored 100.
vault.compliance.failedUCC 9-105 evaluation scored below 100.
vault.releasedVault-out: the authoritative copy was irreversibly released.
vault.document.accessedA vaulted document was downloaded.
vault.document.tamper_detectedA stored document failed hash re-verification.
vault.integrity.verifiedThe scheduled integrity sweep re-verified the document hash.

Custody

EventFires on
custodian.transferA custody transfer was requested and is pending acceptance.
custodian.acceptedThe target custodian accepted custody.
custodian.rejectedThe target custodian rejected custody.
custodian.revokedAn existing custodian permission was revoked.

Customers

EventFires on
customer.created ⚠️A customer record was created.
customer.updated ⚠️A customer record changed. Carries changed keys, not the full record.
customer.archived ⚠️A customer was archived.
customer.restored ⚠️An archived customer was restored.
customer.deleted ⚠️A customer record was deleted.

Invoices

EventFires on
invoice.createdAn invoice was created on the org billing rail.
invoice.paidAn invoice was paid in full.
invoice.payment_failedA payment attempt on the invoice failed.
invoice.voidedAn invoice was voided.
invoice.reminder_sentA payment reminder was emailed.

Subscriptions

EventFires on
subscription.createdA recurring subscription was provisioned.
subscription.cancelledA recurring subscription was cancelled.

Proposals

EventFires on
proposal.sentA proposal was sent to the customer.
proposal.acceptedThe customer accepted the proposal.
proposal.declinedThe customer declined the proposal.

Webhook meta

EventFires on
webhook.testFired by the "Send test" action on an endpoint.

Envelope payloads

envelope.created

{
"event_type": "envelope.created",
"event_id": "evt_1a2b3c4d5e6f7a8b9c0d1e2f",
"org_id": "org_abc123",
"envelope_id": "env_x7k9m2p4q1w3",
"timestamp": "2026-08-27T09:50:00.000Z",
"data": { "envelope_id": "env_x7k9m2p4q1w3", "customer_id": "cust_abc123" }
}

envelope.sent

{
"event_type": "envelope.sent",
"event_id": "evt_2b3c4d5e6f7a8b9c0d1e2f3a",
"org_id": "org_abc123",
"envelope_id": "env_x7k9m2p4q1w3",
"timestamp": "2026-08-27T10:00:00.000Z",
"data": {
"envelope_id": "env_x7k9m2p4q1w3",
"sent_at": "2026-08-27T10:00:00.000Z",
"submission_id": "sub_123"
}
}

envelope.completed ⚠️

The headline event: fired once every party has signed, carrying the values filled into the document. The data.fields contract is documented in full on Signed document field data.

{
"event_type": "envelope.completed",
"event_id": "evt_9f3a2b1c4d5e6f7a8b9c0d1e",
"org_id": "org_abc123",
"envelope_id": "env_x7k9m2p4q1w3",
"timestamp": "2026-08-27T15:04:05.000Z",
"data": {
"envelope_id": "env_x7k9m2p4q1w3",
"envelope_name": "Monitoring Agreement",
"customer_id": "cust_abc123",
"completed_at": "2026-08-27T15:04:05.000Z",
"docuseal_submission_id": "1234",
"signers": [
{ "email": "[email protected]", "name": "Ada Lovelace", "role": "Buyer", "completed_at": "2026-08-27T15:03:58.000Z" }
],
"fields": [
{ "name": "Monthly Rate", "type": "number", "value": 49.99, "signer_email": "[email protected]", "signer_role": "Buyer", "field_id": null, "submitter_uuid": "8f14e45f-..." }
],
"fields_truncated": false
}
}

envelope.declined

{
"event_type": "envelope.declined",
"event_id": "evt_4d5e6f7a8b9c0d1e2f3a4b5c",
"org_id": "org_abc123",
"envelope_id": "env_x7k9m2p4q1w3",
"timestamp": "2026-08-27T11:30:00.000Z",
"data": {
"envelope_id": "env_x7k9m2p4q1w3",
"signer": "Ada Lovelace",
"signer_email": "[email protected]",
"decline_reason": "Pricing needs review"
}
}

envelope.voided and envelope.recalled

A void cancels an envelope outright. A recall pulls back an envelope that was already sent.

Deprecation in progress

Recall historically fired envelope.voided with "recalled": true. It now fires both envelope.voided (with that flag, unchanged) and the new envelope.recalled. The duplicate envelope.voided will be removed in a future release — migrate any recall handling to envelope.recalled, and deduplicate on event_id in the meantime.

{
"event_type": "envelope.recalled",
"event_id": "evt_3c4d5e6f7a8b9c0d1e2f3a4b",
"org_id": "org_abc123",
"envelope_id": "env_x7k9m2p4q1w3",
"timestamp": "2026-08-27T11:00:00.000Z",
"data": { "envelope_id": "env_x7k9m2p4q1w3", "previous_status": "sent" }
}

Signer payloads

signer.* events are per participant; envelope.* are the document-level rollups. On a two-signer document you receive two signer.completed events and then one envelope.completed.

envelope.viewed fires once, on the real sent → viewed transition. signer.viewed fires on every view, including repeats by the same person.

{
"event_type": "signer.completed",
"event_id": "evt_5e6f7a8b9c0d1e2f3a4b5c6d",
"org_id": "org_abc123",
"envelope_id": "env_x7k9m2p4q1w3",
"timestamp": "2026-08-27T14:12:00.000Z",
"data": {
"envelope_id": "env_x7k9m2p4q1w3",
"signer": "Ada Lovelace",
"signer_email": "[email protected]"
}
}

Vault payloads

vault.stored

{
"event_type": "vault.stored",
"event_id": "evt_6f7a8b9c0d1e2f3a4b5c6d7e",
"org_id": "org_abc123",
"envelope_id": "env_x7k9m2p4q1w3",
"timestamp": "2026-08-27T15:10:00.000Z",
"data": {
"path": "ucc-vault/org_abc123/env_x7k9m2p4q1w3/signed.pdf",
"hash": "a1b2c3d4...",
"source": "esign"
}
}

vault.released

Vault-out. The authoritative copy has been irreversibly released — the most consequential event in the vault lifecycle.

{
"event_type": "vault.released",
"event_id": "evt_7a8b9c0d1e2f3a4b5c6d7e8f",
"org_id": "org_abc123",
"envelope_id": "env_x7k9m2p4q1w3",
"timestamp": "2026-08-27T16:00:00.000Z",
"data": {
"envelope_id": "env_x7k9m2p4q1w3",
"customer_id": "cust_abc123",
"released_by_user_id": "usr_abc123",
"released_at": "2026-08-27T16:00:00.000Z"
}
}

vault.document.tamper_detected

The daily integrity sweep re-downloads each vaulted object, re-hashes it, and compares against the stored hash. A mismatch fires this event and vault.compliance.failed, so subscribers written against the older behaviour keep working.

{
"event_type": "vault.document.tamper_detected",
"event_id": "evt_8b9c0d1e2f3a4b5c6d7e8f9a",
"org_id": "org_abc123",
"envelope_id": "env_x7k9m2p4q1w3",
"timestamp": "2026-08-27T04:00:00.000Z",
"data": {
"envelope_id": "env_x7k9m2p4q1w3",
"reason": "integrity_check_failed",
"stored_hash": "a1b2c3d4...",
"computed_hash": "9f8e7d6c...",
"compliance_score": 85,
"check_id": "ichk_abc123"
}
}

Customer payloads

Customer events carry identifiers and changed keys — never the full record. customer.updated tells you what changed so you can re-fetch; it does not push addresses or contact details to your endpoint.

{
"event_type": "customer.updated",
"event_id": "evt_9c0d1e2f3a4b5c6d7e8f9a0b",
"org_id": "org_abc123",
"envelope_id": null,
"timestamp": "2026-08-27T12:00:00.000Z",
"data": { "customer_id": "cust_abc123", "changed_keys": ["phone", "address_line1"] }
}

webhook.test

Fired by the Send test action on an endpoint. envelope_id is null.

{
"event_type": "webhook.test",
"event_id": "evt_test_1a2b3c4d5e6f7a8b",
"org_id": "org_abc123",
"envelope_id": null,
"timestamp": "2026-08-27T10:00:00.000Z",
"data": { "message": "This is a test delivery from Loyva. Your endpoint is configured correctly." }
}

Next steps