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.