> ## Documentation Index
> Fetch the complete documentation index at: https://webhooks.docs.growcrm.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Contracts

> Payload reference for contract.created, contract.updated, contract.sundry and contract.deleted webhooks.

# Contracts

> New to webhooks? Start with **[Getting started](/getting-started)** (envelope, delivery, retries)
> and **[Verification](/verification)** (confirming a request came from Grow CRM). Those conventions
> apply to every event below and are not repeated here.

Contracts expose four keys: `contract.created`, `contract.updated`, `contract.deleted`,
`contract.sundry`. There is **no `contract.activity`** — contracts have no comments, attachments, or
logs in core.

## The contract object

Every key except `.deleted` carries this shape, either flat (`.created`) or nested under `contract`
(`.updated`/`.sundry`):

```json theme={null}
{
  "id": 33,
  "title": "Website Redesign Contract",
  "status": "draft",
  "value": "5000.00",
  "client": { "id": 12, "name": "Acme Inc" },
  "category": { "id": 1, "name": "Default" },
  "project_id": null,
  "dates": {
    "start": "2026-07-16",
    "end": "2027-07-16",
    "created": "2026-07-16T08:00:00.000000Z",
    "published": null
  },
  "signing": { "client_status": "unsigned", "provider_status": "unsigned" },
  "tags": []
}
```

| Field        | Type             | Notes                                                                                                                                               |
| ------------ | ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
| `id`         | integer          | `doc_id`.                                                                                                                                           |
| `title`      | string           |                                                                                                                                                     |
| `status`     | string           | `draft`, `awaiting_signatures`, `active`, or `expired` — the raw status value, no title/color object on this transformer.                           |
| `value`      | string           | Decimal as string.                                                                                                                                  |
| `client`     | object           | `{ id, name }`.                                                                                                                                     |
| `category`   | object           | `{ id, name }`.                                                                                                                                     |
| `project_id` | integer\|null    |                                                                                                                                                     |
| `dates`      | object           | `start`, `end`, `published` are raw dates (date only); `created` is ISO 8601 with microseconds (`Contract` recasts `doc_created` via `CREATED_AT`). |
| `signing`    | object           | `client_status`, `provider_status` — each the raw signature status string for that side.                                                            |
| `tags`       | array of strings |                                                                                                                                                     |

## `contract.created`

Fires when a contract is created, **including via clone**. `data` is the full contract object above.

```json theme={null}
{
  "event": "contract.created",
  "id": 33,
  "created": "2026-07-16T08:00:00+00:00",
  "data": { "id": 33, "title": "Website Redesign Contract", "status": "draft", "...": "..." }
}
```

## `contract.updated`

Fires on a significant change. `data.change` tells you which; `data.contract` is the full object.
There is no `edited` change for contracts — core has no `ContractUpdated` event.

| `change`            | Fires when                                              |
| ------------------- | ------------------------------------------------------- |
| `status`            | The contract's status changes.                          |
| `published`         | The contract is published.                              |
| `sent`              | The contract email is (re)sent.                         |
| `signed`            | The client signs the contract.                          |
| `team_signed`       | The provider/team side signs the contract.              |
| `signature_removed` | A signature is removed from the contract.               |
| `automation`        | The contract's automation settings are updated.         |
| `project`           | The contract is attached to or detached from a project. |

```json theme={null}
{
  "event": "contract.updated",
  "id": 33,
  "created": "2026-07-16T08:05:00+00:00",
  "data": {
    "change": "signed",
    "contract": { "id": 33, "signing": { "client_status": "signed", "provider_status": "unsigned" }, "...": "..." }
  }
}
```

## `contract.sundry`

Fires on a minor, cosmetic field edit. `data.field` names it; `data.contract` is the full object
(same shape as `.updated`, just a lower-significance discriminator).

| `field`    | Fires when                          |
| ---------- | ----------------------------------- |
| `category` | The contract's category is changed. |

```json theme={null}
{
  "event": "contract.sundry",
  "id": 33,
  "created": "2026-07-16T08:07:00+00:00",
  "data": {
    "field": "category",
    "contract": { "id": 33, "category": { "id": 2, "name": "Legal" }, "...": "..." }
  }
}
```

## `contract.deleted`

Fires after the contract is deleted. `data` is just the id — the record no longer exists to
describe.

```json theme={null}
{
  "event": "contract.deleted",
  "id": 33,
  "created": "2026-07-16T08:15:00+00:00",
  "data": { "id": 33 }
}
```
