Webhook events
Every event Signclad emits, what makes it fire, how often, and what arrives in the payload.
Updated
On this page
This page is generated from openapi/signclad.v1.yaml at build time — the same
document that validates requests, generates the SDKs, and defines the MCP tool schemas.
19 events, from API version 1.0.0. If the API
gains or loses an event and this page is not updated with it, the site fails to build.
For signature verification, retries, health states, the delivery log, and replay, see the webhooks guide. This page is the catalog.
Compatibility
Preserved means the event name and payload match the compatibility target, so a existing receiver keeps working unchanged. Extension means Signclad emits it and the target has no equivalent; a compatibility receiver simply never subscribed to it.
Document events
| Event | Fires when | Cadence | data.object | Compatibility |
|---|---|---|---|---|
| document_created | A document was created, whether or not it was sent. | — | Document | Preserved |
| document_sent | The document went out to its first recipients. | Once per document, or once per signing-order step. | Document | Preserved |
| document_viewed | A recipient opened the document. | Every view, not just the first. | Document | Preserved |
| document_in_progress | A recipient saved a value for the first time. | Once per document, however many values follow. | Document | Preserved |
| document_recipients_updated | Recipients changed on a draft, or a reassignment moved the document to somebody else. | — | Document | Preserved |
| document_signed | A recipient finished signing. | Once per recipient, so a two-signer document emits it twice. | Document | Preserved |
| document_completed | Every signer finished and the artifacts are sealed. completed_pdf_url and audit_trail_url are on the object. | — | Document | Preserved |
| document_expired | The expiry passed with signatures still outstanding. The links stopped working. | — | Document | Preserved |
| document_canceled | Somebody cancelled the document. The audit trail records who and why. | — | Document | Preserved |
| document_declined | A recipient declined. The reason is on the recipient. | — | Document | Preserved |
| document_bounced | An invitation could not be delivered. The recipient carries bounced: true and bounced_details. | — | Document | Preserved |
| document_error | Processing failed. error_message on the object says why. | — | Document | Preserved |
| ping | A test delivery. Produced when an endpoint is created, and by the "send test event" action — never by anything a document does. data.object is a sample document, shaped like a real one down to the wire quirks, so a receiver can be written against it. | — | Document | Extension |
Template events
| Event | Fires when | Cadence | data.object | Compatibility |
|---|---|---|---|---|
| template_created | A template finished processing and reached Available. | — | Template | Preserved |
| template_updated | A published template changed — its fields, placeholders, files, or settings. Carries the new current_revision. | — | Template | Extension |
| template_error | Template processing failed. | — | Template | Preserved |
| template_deleted | A template was deleted. Documents already created from it are unaffected and keep their own frozen revision. | — | Template | Extension |
| template_link_used | Somebody opened a public template link and started their own copy. The new document arrives with its own document_created. | Every use of the link. | Template | Extension |
Bulk send events
| Event | Fires when | Cadence | data.object | Compatibility |
|---|---|---|---|---|
| bulk_send_completed | Every document in a bulk send has been generated and dispatched. The per-document events fire separately, as they always do. | Once per batch, however many documents it produced. | Bulk send | Extension |
The event header
Every payload is {event, data}. These are the fields on
event, as the spec defines them.
| Field | Meaning | Compatibility |
|---|---|---|
| id | Stable event id. Identical across every retry and replay of this event, so it is the right key to dedupe on. | Extension |
| hash | Compatibility HMAC over ", keyed by the hook id. | Preserved |
| time | Unix timestamp of when the event happened. | Preserved |
| type | See EventType. | Preserved |
| sequence | Monotonic per document. Deliveries are dispatched in this order but retried independently, so a receiver that cares about order sorts by it. | Extension |
| related_signer | See RelatedSigner. | Preserved |
| related_recipient | See RelatedRecipient. | Preserved |
data carries object — the full document or template in the same shape
the API returns, snapshotted when the event happened — plus account_id and
workspace_id. Later edits never rewrite a snapshot.
Examples
document_completed
{
"event": {
"id": "evt_01j9k3p2s5n7q8r1t2v3w4x5",
"hash": "6f4a9c2e8b1d3f5a7c9e0b2d4f6a8c1e3b5d7f9a0c2e4b6d8f0a2c4e6b8d0f2a",
"time": 1789050255,
"type": "document_completed",
"sequence": 9
},
"data": {
"account_id": "9e0f1a2b-3c4d-5e6f-7a8b-9c0d1e2f3a4b",
"workspace_id": "4d5e6f7a-8b9c-0d1e-2f3a-4b5c6d7e8f9a",
"object": {
"id": "8f14e45f-ea8f-4b2c-9f0e-1b2c3d4e5f60",
"status": "Completed",
"name": "Loan agreement",
"archived": false,
"error_message": null,
"completed_at": "2026-09-09T17:44:15Z",
"completed_pdf_url": null,
"audit_trail_url": null,
"recipients": [
{
"id": "signer-1",
"name": "Jane Doe",
"email": "[email protected]",
"status": "completed",
"signed_at": "2026-09-09T17:44:12Z",
"bounced": false,
"bounced_details": null
}
],
"fields": [
[
{
"api_id": "borrower_consent",
"type": "checkbox",
"recipient_id": "signer-1",
"page": 1,
"x": 100,
"y": 300,
"width": "20.0",
"height": "20.0",
"value": "t"
}
]
]
}
}
} template_created
{
"event": {
"id": "evt_01J9K3P2S5N7Q8R1T2V3W4X6",
"hash": "9a0c2e4b6d8f0a2c4e6b8d0f2a6f4a9c2e8b1d3f5a7c9e0b2d4f6a8c1e3b5d7f",
"time": 1789050100,
"type": "template_created",
"sequence": 1
},
"data": {
"account_id": "9e0f1a2b-3c4d-5e6f-7a8b-9c0d1e2f3a4b",
"workspace_id": "4d5e6f7a-8b9c-0d1e-2f3a-4b5c6d7e8f9a",
"object": {
"id": "3f1c9a2e-6b7d-4c8e-9a0b-1c2d3e4f5a6b",
"name": "Onboarding agreement",
"status": "Available",
"archived": false
}
}
} Subscribing
Pass the names you want in event_types when you create or update an endpoint. Omit
it to subscribe to everything, including events added later.
POST /webhook_endpoints
{
"url": "https://app.example.com/webhooks/signclad",
"event_types": ["document_created", "document_sent", "document_viewed"],
"include_test_mode": false
}
Test-mode documents produce deliveries only on endpoints with
include_test_mode: true.
Related
- Webhooks — verification, retry, health, and replay.
- API reference — the full schemas behind each object.
- Migrating to Signclad — running both signature schemes during the overlap.