> ## Documentation Index
> Fetch the complete documentation index at: https://alpha.developer.tomorro.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Webhooks

> Receive real-time HTTP notifications when events happen in Tomorro

Webhooks let Tomorro notify your systems in real time when something happens in your
organization — instead of polling the API. When a subscribed event occurs, Tomorro sends an
HTTP `POST` request to a URL you control, with the event details in the body.

## Available events

A webhook can be triggered by any of the following actions:

| Event type              | Triggered when              |
| ----------------------- | --------------------------- |
| `contractCreated`       | A contract is created       |
| `contractDeleted`       | A contract is deleted       |
| `contractSigned`        | A contract is fully signed  |
| `contractStatusUpdated` | A contract's status changes |
| `reminderEventCreated`  | A reminder is triggered     |

<Note>
  **Webhooks are personal.** A webhook only fires for events that concern the member who
  created it.

  * The `contractCreated` webhook only triggers if you are a participant of the contract.
  * The `reminderEventCreated` webhook only triggers if the reminder is intended for you.
</Note>

## Create a webhook

<Steps>
  <Step title="Open the Webhooks settings">
    Go to **My account → Integrations → Webhooks**, or open it directly:

    <Card title="Open Webhooks settings" icon="gear" href="https://app.tomorro.com/settings/integrations?integration=webhook">
      app.tomorro.com → Settings → Integrations → Webhooks
    </Card>
  </Step>

  <Step title="Add a webhook">
    Click **Add a webhook**.
  </Step>

  <Step title="Configure it">
    1. **Name** your webhook.
    2. Paste the **URL** that will receive the events.
    3. Select one or more **triggers** (the events that activate it).
    4. Click **Create webhook**.
  </Step>

  <Step title="Save your signing secret">
    A secret is generated for the webhook. Tomorro uses it to sign every event so you can
    verify authenticity — keep it safe and use it to check the
    [`Leeway-Signature`](/webhooks/technical-documentation#signature-header) header.
  </Step>
</Steps>

## Event payloads

Every webhook is delivered as an HTTP `POST` with a JSON body. All events share the same
top-level envelope; the event-specific content lives under `data`.

### Envelope

| Field       | Type     | Description                                               |
| ----------- | -------- | --------------------------------------------------------- |
| `eventId`   | `string` | Unique identifier of this event delivery (UUID).          |
| `webhookId` | `string` | Identifier of the webhook that produced the event (UUID). |
| `createdAt` | `string` | ISO 8601 timestamp of when the event was created.         |
| `eventType` | `string` | One of the [available event types](#available-events).    |
| `data`      | `object` | The event-specific payload (see examples below).          |

<Note>
  The `data` shape depends on `eventType`. Contract events wrap the contract under
  `data.contract`. Always branch on `eventType` before reading `data`.
</Note>

### Examples

<AccordionGroup>
  <Accordion title="contractCreated" icon="file-plus">
    ```json theme={null}
    {
      "eventId": "b21213e3-8a9a-4e04-9bfc-c4e53f123xxx",
      "webhookId": "2a76094c-1f2e-48c8-a47f-1add41234xxx",
      "createdAt": "2025-03-25T14:55:16.280Z",
      "eventType": "contractCreated",
      "data": {
        "contract": {
          "id": "6954ad41-19f3-446f-b0db-fcc661234xxx",
          "name": "TestWebhook",
          "organizationId": "115e926b-9c61-4172-8609-02212344exxx",
          "author": {
            "id": "974d2a1c-eb63-4237-877e-37d12341axxx",
            "user": {
              "id": "fd61234d-a4e1-4103-8d31-59e351d2bxxx",
              "username": "user@example.com",
              "firstname": "John",
              "lastname": "Doe"
            }
          },
          "referent": {
            "id": "974d2a1c-eb63-4237-877e-37123451axxx",
            "user": {
              "id": "fd61234d-a4e1-4103-8d31-59e351d2bxxx",
              "username": "user@example.com",
              "firstname": "John",
              "lastname": "Doe"
            }
          },
          "referentId": "974d2a1c-eb63-4237-877e-37123451axxx",
          "supervisorId": null,
          "externalCompany": {
            "id": "01611234-7cdf-4785-966e-ee06b74ccxxx",
            "name": "My external company"
          },
          "priorNoticeDuration": "undefined",
          "priorNoticeValue": null,
          "renewal": "no",
          "signatureDate": null,
          "status": "draft",
          "createdAt": "2025-03-25T14:55:14.690Z",
          "updatedAt": "2025-03-25T14:55:14.000Z",
          "documentId": null,
          "typeId": null,
          "templateId": null,
          "contractAttributes": [
            { "attributeDefinition": { "name": "durationType" }, "value": "PERMANENT" },
            { "attributeDefinition": { "name": "endAt" }, "value": null },
            { "attributeDefinition": { "name": "externalPartyName" }, "value": "My external company" },
            { "attributeDefinition": { "name": "initialDuration" }, "value": null },
            { "attributeDefinition": { "name": "internalPartyName" }, "value": "John Doe" },
            { "attributeDefinition": { "name": "language" }, "value": "fr" },
            { "attributeDefinition": { "name": "nextRenewalDate" }, "value": null },
            { "attributeDefinition": { "name": "priorNotice" }, "value": null },
            { "attributeDefinition": { "name": "renewalDuration" }, "value": null },
            { "attributeDefinition": { "name": "renewalType" }, "value": "no" },
            { "attributeDefinition": { "name": "signatureDate" }, "value": null },
            { "attributeDefinition": { "name": "startAt" }, "value": null }
          ],
          "attributes": {
            "durationType": { "value": "PERMANENT", "name": "durationType", "attributeDefinitionId": "durationType" },
            "endAt": { "value": null, "name": "endAt", "attributeDefinitionId": "endAt" },
            "externalPartyName": { "value": "My external company", "name": "externalPartyName", "attributeDefinitionId": "externalPartyName" },
            "initialDuration": { "value": null, "name": "initialDuration", "attributeDefinitionId": "initialDuration" },
            "internalPartyName": { "value": "John Doe", "name": "internalPartyName", "attributeDefinitionId": "internalPartyName" },
            "language": { "value": "fr", "name": "language", "attributeDefinitionId": "language" },
            "nextRenewalDate": { "value": null, "name": "nextRenewalDate", "attributeDefinitionId": "nextRenewalDate" },
            "priorNotice": { "value": null, "name": "priorNotice", "attributeDefinitionId": "priorNotice" },
            "renewalDuration": { "value": null, "name": "renewalDuration", "attributeDefinitionId": "renewalDuration" },
            "renewalType": { "value": "no", "name": "renewalType", "attributeDefinitionId": "renewalType" },
            "signatureDate": { "value": null, "name": "signatureDate", "attributeDefinitionId": "signatureDate" },
            "startAt": { "value": null, "name": "startAt", "attributeDefinitionId": "startAt" }
          }
        }
      }
    }
    ```
  </Accordion>

  <Accordion title="contractStatusUpdated" icon="arrows-rotate">
    Status-update events include the contract's lifecycle fields (`status`, `dateStatus`,
    `realEndDate`, …) and the resolved `attributes`, where each attribute carries a human-readable
    `valueLabel` in addition to its raw `value`.

    ```json theme={null}
    {
      "eventId": "dcdfce0c-5914-42b2-bcda-ce53b0afbed7",
      "webhookId": "a6493b01-0a87-4fd6-a851-8def5a76c9a1",
      "createdAt": "2026-06-10T13:08:43.801Z",
      "eventType": "contractStatusUpdated",
      "data": {
        "contract": {
          "id": "b9ce25f0-9b85-4c31-acf4-e6311e95xxxc",
          "name": "NDA - Adobe",
          "organizationId": "392ef54d-dc59-41f6-8ef9-37c6a1b7xxx3",
          "author": {
            "id": "53a9760f-ad03-4f18-b7e0-a52fe303xxx7",
            "user": {
              "id": "b30bb4d4-007c-4a93-b2e7-0be8b0bxxx9f",
              "username": "user@example.com",
              "firstname": "John",
              "lastname": "Doe"
            }
          },
          "referent": {
            "id": "53a9760f-ad03-4f18-b7e0-a52fe303xxx7",
            "user": {
              "id": "b30bb4d4-007c-4a93-b2e7-0be8b0xxx59f",
              "username": "user@example.com",
              "firstname": "John",
              "lastname": "Doe"
            }
          },
          "referentId": "53a9760f-ad03-4f18-b7e0-a52fe303xxx7",
          "supervisor": null,
          "supervisorId": null,
          "externalCompany": {
            "id": "e7d3d7d6-0f0b-4bdf-9233-7b7188aaxxx4",
            "name": "Adobe"
          },
          "durationType": "FIXED_TERM",
          "startAt": "2026-01-01T00:00:00.000Z",
          "endAt": "2026-01-31T00:00:00.000Z",
          "terminatedAt": null,
          "priorNoticeDuration": "undefined",
          "priorNoticeValue": null,
          "renewal": "no",
          "renewalType": "no",
          "renewalDuration": null,
          "renewalDurationUnit": null,
          "isRenewable": false,
          "signatureDate": null,
          "status": "negotiating",
          "dateStatus": "negotiating",
          "nextRenewedDate": null,
          "realEndDate": "2026-01-31T00:00:00.000Z",
          "createdAt": "2026-06-10T13:07:40.997Z",
          "updatedAt": "2026-06-10T13:08:43.000Z",
          "typeId": "7591d403-53df-41d4-8d5d-ec56aad4e375",
          "templateId": "74829184-734a-4f08-b0d5-9e36f67db126",
          "contractAttributes": [
            { "attributeDefinition": { "name": "Adresse du cocontractant" }, "value": "a" },
            { "attributeDefinition": { "name": "Département" }, "value": "a05e7e8d-a149-4c38-85e2-12cfc79674de" },
            { "attributeDefinition": { "name": "Loi applicable" }, "value": "915a2d5f-b6ba-4b2d-a01e-c63932a4c783" },
            { "attributeDefinition": { "name": "Forme juridique du cocontractant" }, "value": "6917969e-3e7f-4cc8-a027-4f54cfce32ee" },
            { "attributeDefinition": { "name": "Richtext" }, "value": "[{\"type\":\"paragraph\",\"children\":[{\"text\":\"Sample text\"}]}]" },
            { "attributeDefinition": { "name": "Équipe" }, "value": "396c1bd9-7740-411f-bab4-854b995c2734" },
            { "attributeDefinition": { "name": "Montant" }, "value": "12000" },
            { "attributeDefinition": { "name": "Type de durée" }, "value": "FIXED_TERM" },
            { "attributeDefinition": { "name": "Date de fin" }, "value": "2026-01-31" },
            { "attributeDefinition": { "name": "Counterparty name" }, "value": "Adobe" },
            { "attributeDefinition": { "name": "Durée " }, "value": "1:month" },
            { "attributeDefinition": { "name": "Dénomination sociale de votre organisation" }, "value": "Acme Corp" },
            { "attributeDefinition": { "name": "Language of the document" }, "value": "fr" },
            { "attributeDefinition": { "name": "général Tomorro - Prochaine date de reconduction" }, "value": null },
            { "attributeDefinition": { "name": "Préavis" }, "value": null },
            { "attributeDefinition": { "name": "ID du projet" }, "value": "260600003" },
            { "attributeDefinition": { "name": "général Tomorro - Durée de reconduction" }, "value": null },
            { "attributeDefinition": { "name": "Type de reconduction" }, "value": "no" },
            { "attributeDefinition": { "name": "Date de signature du contrat-cadre" }, "value": null },
            { "attributeDefinition": { "name": "Start date" }, "value": "2026-01-01" }
          ],
          "attributes": {
            "0144e4a2-75ed-4893-954f-84686eb94ad6": { "value": "a", "name": "Adresse du cocontractant", "attributeDefinitionId": "0144e4a2-75ed-4893-954f-84686eb94ad6", "valueLabel": "a" },
            "12caf9df-d15d-4267-88b6-29b0ca9e4659": { "value": "a05e7e8d-a149-4c38-85e2-12cfc79674de", "name": "Département", "attributeDefinitionId": "12caf9df-d15d-4267-88b6-29b0ca9e4659", "valueLabel": "Comptabilité / Finances" },
            "14862943-7b0f-49ed-aa0a-33d1084fe1b6": { "value": "915a2d5f-b6ba-4b2d-a01e-c63932a4c783", "name": "Loi applicable", "attributeDefinitionId": "14862943-7b0f-49ed-aa0a-33d1084fe1b6", "valueLabel": "FR" },
            "32dc2fd1-6048-43aa-bbde-bb9e2b19f740": { "value": "6917969e-3e7f-4cc8-a027-4f54cfce32ee", "name": "Forme juridique du cocontractant", "attributeDefinitionId": "32dc2fd1-6048-43aa-bbde-bb9e2b19f740", "valueLabel": "EI" },
            "6dd82116-95a4-40a7-8100-4e9776d01d7f": { "value": "[{\"type\":\"paragraph\",\"children\":[{\"text\":\"Sample text\"}]}]", "name": "Richtext", "attributeDefinitionId": "6dd82116-95a4-40a7-8100-4e9776d01d7f", "valueLabel": "[{\"type\":\"paragraph\",\"children\":[{\"text\":\"Sample text\"}]}]" },
            "96864b82-de02-43ad-8d68-1f60273d8aa5": { "value": "396c1bd9-7740-411f-bab4-854b995c2734", "name": "Équipe", "attributeDefinitionId": "96864b82-de02-43ad-8d68-1f60273d8aa5", "valueLabel": "Tech" },
            "d6cf7bb4-c897-498c-85ec-cf02251e6f9d": { "value": "12000", "name": "Montant", "attributeDefinitionId": "d6cf7bb4-c897-498c-85ec-cf02251e6f9d", "valueLabel": "12000" },
            "durationType": { "value": "FIXED_TERM", "name": "Type de durée", "attributeDefinitionId": "durationType", "valueLabel": "FIXED_TERM" },
            "endAt": { "value": "2026-01-31", "name": "Date de fin", "attributeDefinitionId": "endAt", "valueLabel": "2026-01-31" },
            "externalPartyName": { "value": "Adobe", "name": "Counterparty name", "attributeDefinitionId": "externalPartyName", "valueLabel": "Adobe" },
            "initialDuration": { "value": "1:month", "name": "Durée ", "attributeDefinitionId": "initialDuration", "valueLabel": "1:month" },
            "internalPartyName": { "value": "Acme Corp", "name": "Dénomination sociale de votre organisation", "attributeDefinitionId": "internalPartyName", "valueLabel": "Acme Corp" },
            "language": { "value": "fr", "name": "Language of the document", "attributeDefinitionId": "language", "valueLabel": "fr" },
            "nextRenewalDate": { "value": null, "name": "général Tomorro - Prochaine date de reconduction", "attributeDefinitionId": "nextRenewalDate", "valueLabel": null },
            "priorNotice": { "value": null, "name": "Préavis", "attributeDefinitionId": "priorNotice", "valueLabel": null },
            "projectIdentifier": { "value": "260600003", "name": "ID du projet", "attributeDefinitionId": "projectIdentifier", "valueLabel": "260600003" },
            "renewalDuration": { "value": null, "name": "général Tomorro - Durée de reconduction", "attributeDefinitionId": "renewalDuration", "valueLabel": null },
            "renewalType": { "value": "no", "name": "Type de reconduction", "attributeDefinitionId": "renewalType", "valueLabel": "no" },
            "signatureDate": { "value": null, "name": "Date de signature du contrat-cadre", "attributeDefinitionId": "signatureDate", "valueLabel": null },
            "startAt": { "value": "2026-01-01", "name": "Start date", "attributeDefinitionId": "startAt", "valueLabel": "2026-01-01" }
          }
        }
      }
    }
    ```
  </Accordion>
</AccordionGroup>
