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

  • id
  • externalId - optional; may be null
  • name
  • status
  • signingOrder
  • createdAt
  • updatedAt
  • completedAt
  • expiresAt

recipient

  • id
  • name
  • email
  • roleLabel
  • status
  • signedAt

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.document and data.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.document and data.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.document and data.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.document and data.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.document and data.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.document and data.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
    }
}