Webhook Reference
This reference documents every webhook event Papyrus can send. For related document and template operations, use the API Reference.
Envelope
Every webhook request uses this top-level envelope:
{
"id": "01JQZXA7Y6J5P2N5Q2M6A2R8F9",
"event": "document.completed",
"occurredAt": "2026-03-25T18:15:00Z",
"data": {}
}
Shared Objects
document
idexternalId- optional; may benullnamestatussigningOrdercreatedAtupdatedAtcompletedAtexpiresAt
recipient
idnameemailroleLabelstatussignedAt
recipients
For document.* events, data.recipients contains the full current recipient array.
Use the webhook envelope id, data.document.id, and data.recipient.id for
core processing and idempotency. externalId is optional metadata for mapping
Papyrus documents back to your own records.
Papyrus always returns both data.recipient and data.recipients. The field
that does not apply to the current event is null.
The ping test request from the dashboard is documented in the webhook guide,
not below, because it is a connectivity check rather than a lifecycle event.
document.sent
A document has been sent and signer invitations are active.
- Trigger: Fires when a document is sent for signature.
- Payload includes:
data.documentanddata.recipients
{
"id": "01JQZXA7Y6J5P2N5Q2M6A2R8F9",
"event": "document.sent",
"occurredAt": "2026-03-25T18:15:00Z",
"data": {
"document": {
"id": 42,
"externalId": "order-123",
"name": "Sales Agreement",
"status": "sent",
"signingOrder": "parallel",
"createdAt": "2026-03-24T15:00:00Z",
"updatedAt": "2026-03-25T18:15:00Z",
"completedAt": null,
"expiresAt": "2026-04-24T15:00:00Z"
},
"recipient": null,
"recipients": [
{
"id": 101,
"name": "Jane Smith",
"email": "jane@example.com",
"roleLabel": "Client",
"status": "sent",
"signedAt": "2026-03-25T18:10:00Z"
},
{
"id": 102,
"name": "John Smith",
"email": "john@example.com",
"roleLabel": "Approver",
"status": "sent",
"signedAt": "2026-03-25T18:15:00Z"
}
]
}
}
recipient.signed
A signer has completed their portion of the document.
- Trigger: Fires immediately after an individual signer submits their signature.
- Payload includes:
data.documentanddata.recipient
{
"id": "01JQZXB3M9V8B6P7H1N4C3T5D2",
"event": "recipient.signed",
"occurredAt": "2026-03-25T18:15:00Z",
"data": {
"document": {
"id": 42,
"externalId": "order-123",
"name": "Sales Agreement",
"status": "sent",
"signingOrder": "parallel",
"createdAt": "2026-03-24T15:00:00Z",
"updatedAt": "2026-03-25T18:15:00Z",
"completedAt": null,
"expiresAt": "2026-04-24T15:00:00Z"
},
"recipient": {
"id": 101,
"name": "Jane Smith",
"email": "jane@example.com",
"roleLabel": "Client",
"status": "signed",
"signedAt": "2026-03-25T18:15:00Z"
},
"recipients": null
}
}
recipient.declined
A signer declined to sign the document.
- Trigger: Fires when an individual signer explicitly declines the signing request.
- Payload includes:
data.documentanddata.recipient
{
"id": "01JQZXB3M9V8B6P7H1N4C3T5D2",
"event": "recipient.declined",
"occurredAt": "2026-03-25T18:15:00Z",
"data": {
"document": {
"id": 42,
"externalId": "order-123",
"name": "Sales Agreement",
"status": "sent",
"signingOrder": "parallel",
"createdAt": "2026-03-24T15:00:00Z",
"updatedAt": "2026-03-25T18:15:00Z",
"completedAt": null,
"expiresAt": "2026-04-24T15:00:00Z"
},
"recipient": {
"id": 101,
"name": "Jane Smith",
"email": "jane@example.com",
"roleLabel": "Client",
"status": "declined",
"signedAt": null
},
"recipients": null
}
}
document.completed
All required signers have finished and the document is complete.
- Trigger: Fires when Papyrus finalizes a fully signed document.
- Payload includes:
data.documentanddata.recipients
{
"id": "01JQZXA7Y6J5P2N5Q2M6A2R8F9",
"event": "document.completed",
"occurredAt": "2026-03-25T18:15:00Z",
"data": {
"document": {
"id": 42,
"externalId": "order-123",
"name": "Sales Agreement",
"status": "completed",
"signingOrder": "parallel",
"createdAt": "2026-03-24T15:00:00Z",
"updatedAt": "2026-03-25T18:15:00Z",
"completedAt": "2026-03-25T18:15:00Z",
"expiresAt": "2026-04-24T15:00:00Z"
},
"recipient": null,
"recipients": [
{
"id": 101,
"name": "Jane Smith",
"email": "jane@example.com",
"roleLabel": "Client",
"status": "signed",
"signedAt": "2026-03-25T18:10:00Z"
},
{
"id": 102,
"name": "John Smith",
"email": "john@example.com",
"roleLabel": "Approver",
"status": "signed",
"signedAt": "2026-03-25T18:15:00Z"
}
]
}
}
document.voided
A sender has voided the document.
- Trigger: Fires when a document is voided and can no longer be signed.
- Payload includes:
data.documentanddata.recipients
{
"id": "01JQZXA7Y6J5P2N5Q2M6A2R8F9",
"event": "document.voided",
"occurredAt": "2026-03-25T18:15:00Z",
"data": {
"document": {
"id": 42,
"externalId": "order-123",
"name": "Sales Agreement",
"status": "voided",
"signingOrder": "parallel",
"createdAt": "2026-03-24T15:00:00Z",
"updatedAt": "2026-03-25T18:15:00Z",
"completedAt": null,
"expiresAt": "2026-04-24T15:00:00Z"
},
"recipient": null,
"recipients": [
{
"id": 101,
"name": "Jane Smith",
"email": "jane@example.com",
"roleLabel": "Client",
"status": "sent",
"signedAt": "2026-03-25T18:10:00Z"
},
{
"id": 102,
"name": "John Smith",
"email": "john@example.com",
"roleLabel": "Approver",
"status": "sent",
"signedAt": "2026-03-25T18:15:00Z"
}
]
}
}
reminder.sent
A reminder email has been sent to an outstanding signer.
- Trigger: Fires after Papyrus sends either a manual or automatic reminder.
- Payload includes:
data.documentanddata.recipient
{
"id": "01JQZXB3M9V8B6P7H1N4C3T5D2",
"event": "reminder.sent",
"occurredAt": "2026-03-25T18:15:00Z",
"data": {
"document": {
"id": 42,
"externalId": "order-123",
"name": "Sales Agreement",
"status": "sent",
"signingOrder": "parallel",
"createdAt": "2026-03-24T15:00:00Z",
"updatedAt": "2026-03-25T18:15:00Z",
"completedAt": null,
"expiresAt": "2026-04-24T15:00:00Z"
},
"recipient": {
"id": 101,
"name": "Jane Smith",
"email": "jane@example.com",
"roleLabel": "Client",
"status": "sent",
"signedAt": null
},
"recipients": null
}
}
