# The event body

What a webhook endpoint receives: one POST per event, with a JSON body that names the event and carries the pact as it was at that moment.

The same body is kept as the delivery's `payload`, so what you see in [Get a delivery](/api-reference/webhooks/get-delivery) is byte for byte what was posted and signed. The headers that come with it are described in the [guide](/webhooks#the-request).

## Attributes

- `id` (string): The event's id, 16 letters and digits. The same event delivered to two endpoints has the same `id`.
- `type` (string): What happened. See [the events](/webhooks#events). One of: `pact.sent`, `pact.viewed`, `pact.signed`, `pact.declined`, `pact.voided`, `pact.sealed`, `pact.lapsed`, `ping`.
- `created` (string (date-time)): When it happened.
- `data` (object): What it is about.
  - `pact` (object): The [pact](/api-reference/objects/pact) as it was at that instant, without `fields` and `events`; [get the pact](/api-reference/pacts/get-pact) for those. Not on a `ping`.
    - `uid` (string): The pact's id: 8 letters and digits.
    - `title` (string): Shown to signers and in emails (150 characters at most).
    - `status` (string): See [Pact lifecycle](/concepts/pacts). One of: `draft`, `sent`, `sealed`, `declined`, `voided`, `lapsed`.
    - `message` (string | null): Your note in the invitation email.
    - `page_count` (integer): Pages in the document.
    - `created_by` (string): Where it was created: the dashboard, the API or the MCP server. One of: `web`, `api`, `mcp`.
    - `current_signer` (integer | null): The `order` of the signer whose turn it is while the pact is `sent`; otherwise `null`.
    - `date_created` (string (date-time)): When the draft was created.
    - `date_sent` (string (date-time) | null): When it was sent.
    - `date_lapses` (string (date-time) | null): When it lapses if it is not sealed first.
    - `date_sealed` (string (date-time) | null): When the last signer signed.
    - `date_updated` (string (date-time)): When anything about it last changed.
    - `documents_charged` (integer | null): Documents it used when it was sent. `null` on a draft.
    - `documents_cost` (integer | null): What sending this draft will use: one document per 3 signers, rounded up. Only set on a draft.
    - `sent_sha256` (string): SHA-256 (lowercase hex) of the PDF as sent. The sigil records it too.
    - `signed_sha256` (string | null): SHA-256 of the signed PDF, once sealed.
    - `recipients` (array of objects): Signers in order, then CCs.
      - `order` (integer): Position, starting at 1. Signers come first, numbered in the order you gave them; CCs follow.
      - `role` (string): Signers sign in order; a CC gets the finished copy. One of: `signer`, `cc`.
      - `name` (string): The recipient's name.
      - `email` (string): The recipient's address, lowercased.
      - `status` (string): Where this recipient is. One of: `pending`, `viewed`, `signed`, `declined`.
      - `date_viewed` (string (date-time) | null): When they first opened their signing link.
      - `date_signed` (string (date-time) | null): When they signed.
      - `typed_name` (string | null): The full name they typed when signing.
      - `decline_reason` (string | null): Their reason, if they declined.
      - `signing_url` (string): The private link for the signer whose turn it is. Anyone with it can sign as that person, so only give it to them. Only with `include_links=1`, and only on the waiting signer.
    - `links` (object): Where to get the files.
      - `document` (string (URL)): The document as sent ([download](/api-reference/pacts/download-document)).
      - `signed` (string (URL) | null): The signed PDF, once sealed ([download](/api-reference/pacts/download-signed)).
      - `sigil` (string (URL) | null): The sigil (certificate of completion), once sealed ([download](/api-reference/pacts/download-sigil)).
      - `dashboard` (string (URL)): The pact's page on the dashboard (needs a login).
  - `recipient` (object): The signer the event is about, as in the pact's `recipients`. Only on `pact.viewed`, `pact.signed` and `pact.declined`.
    - `order` (integer): Position, starting at 1. Signers come first, numbered in the order you gave them; CCs follow.
    - `role` (string): Signers sign in order; a CC gets the finished copy. One of: `signer`, `cc`.
    - `name` (string): The recipient's name.
    - `email` (string): The recipient's address, lowercased.
    - `status` (string): Where this recipient is. One of: `pending`, `viewed`, `signed`, `declined`.
    - `date_viewed` (string (date-time) | null): When they first opened their signing link.
    - `date_signed` (string (date-time) | null): When they signed.
    - `typed_name` (string | null): The full name they typed when signing.
    - `decline_reason` (string | null): Their reason, if they declined.
  - `endpoint` (object): The endpoint pinged: its `uid` and `url`. Only on a `ping`.

## Example

```json
{
  "id": "EV3QK9WT7PZMXDH4",
  "type": "pact.sealed",
  "created": "2026-10-21T09:12:45Z",
  "data": {
    "pact": {
      "uid": "K4TQ7MZE",
      "title": "Consulting agreement with Acme",
      "status": "sealed",
      "message": "Please sign by Friday.",
      "page_count": 3,
      "created_by": "api",
      "current_signer": null,
      "date_created": "2026-10-20T14:05:00Z",
      "date_sent": "2026-10-20T14:05:01Z",
      "date_lapses": "2026-11-03T14:05:01Z",
      "date_sealed": "2026-10-21T09:12:44Z",
      "date_updated": "2026-10-21T09:12:44Z",
      "documents_charged": 1,
      "documents_cost": null,
      "sent_sha256": "9f2c4e81b07d5a3c6e1f0b9a8d7c6e5f4a3b2c1d0e9f8a7b6c5d4e3f2a1b0c9d",
      "signed_sha256": "3b7e1d9c5a8f2e4b6d0c1a9f8e7d6c5b4a3f2e1d0c9b8a7f6e5d4c3b2a1f0e9d",
      "recipients": [
        {
          "order": 1,
          "role": "signer",
          "name": "Avery Lane",
          "email": "avery@example.com",
          "status": "signed",
          "date_viewed": "2026-10-20T15:28:02Z",
          "date_signed": "2026-10-20T15:31:40Z",
          "typed_name": "Avery Lane",
          "decline_reason": null
        },
        {
          "order": 2,
          "role": "signer",
          "name": "Sam Ortiz",
          "email": "sam@example.com",
          "status": "signed",
          "date_viewed": "2026-10-21T09:10:15Z",
          "date_signed": "2026-10-21T09:12:44Z",
          "typed_name": "Sam Ortiz",
          "decline_reason": null
        },
        {
          "order": 3,
          "role": "cc",
          "name": "Records",
          "email": "records@example.com",
          "status": "pending",
          "date_viewed": null,
          "date_signed": null,
          "typed_name": null,
          "decline_reason": null
        }
      ],
      "links": {
        "document": "https://api.signwithsigil.com/v1/pacts/K4TQ7MZE/document.pdf",
        "signed": "https://api.signwithsigil.com/v1/pacts/K4TQ7MZE/signed.pdf",
        "sigil": "https://api.signwithsigil.com/v1/pacts/K4TQ7MZE/sigil.pdf",
        "dashboard": "https://www.signwithsigil.com/pacts/K4TQ7MZE"
      }
    }
  }
}
```
