Webhook events
Register an endpoint with POST /v1/webhooks (an
https:// URL and an optional list of event types; an empty
list subscribes to everything). Each delivery is a POST with
a JSON body and the headers below.
Event types
| Type | When |
|---|---|
document.bounced | A signing email could not be delivered to a recipient. |
document.completed | Every recipient has signed. Sealing starts. |
document.created | A document was created (draft or finalized). |
document.expired | The document's expiry passed before every recipient signed. |
document.opened | A recipient opened their signing link for the first time. One event per recipient. |
document.rejected | A recipient declined, which closes the document. |
document.sealed | The sealed PDF, with its Certificate of Completion, is ready to download. |
document.sent | The document was sent and signing links were issued. Also fires on re-send. |
document.signed | A recipient completed all of their fields. |
Payload
{
"id": "evt_outbox_1234",
"type": "document.signed",
"created_at": "2026-08-22T12:00:00+00:00",
"document": "doc_...",
"mode": "live",
"data": {
"seq": 4,
"engine_event_type": "recipient_completed",
"actor": "ada@example.com"
}
} id | Unique per event, stable across redeliveries. Use it to deduplicate. |
|---|---|
type | One of the types above. |
created_at | When the event happened, ISO 8601 UTC. |
document | The document id, as returned by the API. |
mode | live or test. Endpoints are workspace-level and receive both; a handler that must ignore test traffic checks this member. |
data | The audit-trail event behind this type: its sequence number in the document's chain, the engine event name, and the actor. |
Test pings
POST /v1/webhooks/{id}/ping (or "Send a test ping" in the
dashboard) queues one delivery of type ping to that endpoint.
It is signed and retried like every other delivery, so it is the way to
check a handler end to end before any document exists. ping
is not an event type: it cannot be subscribed to, and an endpoint's event
filter does not apply to it. The body has no document or
data member.
{
"id": "evt_ping_3f9a1c2b7d4e8f01",
"type": "ping",
"created_at": "2026-08-23T12:00:00+00:00",
"mode": "live"
} Headers
X-SignEnvoy-Event | The event type, repeated from the body (ping for a test ping). |
|---|---|
X-SignEnvoy-Signature | HMAC signature of the body; see verifying signatures. |
Content-Type | application/json |
User-Agent | SignEnvoy-Webhooks/1.0 |
Delivery and retries
A delivery succeeds on any 2xx response within
10 seconds. Anything else is retried
3 times, after 30 s, 5 min, 30 min;
after 4 attempts the delivery is marked dead.
Every attempt is listed under GET /v1/webhooks/{id}/deliveries,
and a dead or failed delivery can be queued again with
POST /v1/webhooks/{id}/deliveries/{delivery_id}/redeliver.
Deliveries are not guaranteed to arrive in order; use created_at
and data.seq to order events for one document.