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

# Case Status Events

> Fired when a claim is closed (with the reason), disputed or reopened.

Sent when the **case status** of a claim changes — and when a closed claim's closure reason changes. The case status has three values: `open`, `disputed`, `closed`. A closure carries its reason, so you can tell a claim paid in full from one written off.

The event `type` you'll see in the body and in the `X-IcoLaw-Event` header is **`claim.status_changed`**.

| Property        | Value                                                         |
| --------------- | ------------------------------------------------------------- |
| **Event type**  | `claim.status_changed`                                        |
| **HTTP method** | `POST`                                                        |
| **Target URL**  | Your configured webhook URL                                   |
| **Headers**     | See [Webhooks Overview → Headers](/webhooks/overview#headers) |
| **API version** | `2026-05-14`                                                  |

It is not sent when a claim is created: every claim starts `open`. A closure also sends [`claim.collection_stage_changed`](/webhooks/claim-collection-stage-changed) (to `closed`); the two are enqueued together, the stage event first.

***

## Payload

```json theme={null}
{
  "id": "evt_01HXYZ8K9MGV9C3K3F2K8AB13A",
  "type": "claim.status_changed",
  "created_at": "2026-09-22T10:15:02.000Z",
  "api_version": "2026-05-14",
  "data": {
    "claim_id": "5f3c1b22-3f4b-4d2e-9b1a-7c8e9d0f1a2b",
    "partner_reference": "INV-2024-00891",
    "from_status": "open",
    "to_status": "closed",
    "closure_reason": "paid",
    "changed_at": "2026-09-22T10:15:00.000Z"
  }
}
```

The envelope (`id`, `type`, `created_at`, `api_version`) is the same as for every event — see [Collection Stage Events → Envelope fields](/webhooks/claim-collection-stage-changed#envelope-fields).

### `data` fields

<ResponseField name="data.claim_id" type="uuid" required>
  ID of the claim. Look up the full claim via [`GET /openapi/claims/{id}`](/api-reference/claims/get-claim).
</ResponseField>

<ResponseField name="data.partner_reference" type="string | null">
  The `partner_reference` you provided when creating the claim through the API; for a claim created by incaseof.law, its `external_reference`.
</ResponseField>

<ResponseField name="data.from_status" type="enum" required>
  The case status before the change: `open`, `disputed` or `closed`.
</ResponseField>

<ResponseField name="data.to_status" type="enum" required>
  The case status now: `open`, `disputed` or `closed`.
</ResponseField>

<ResponseField name="data.closure_reason" type="enum | null" required>
  Why the claim was closed — set when `to_status` is `closed`, `null` otherwise. See the [reference](#closure-reasons) below.
</ResponseField>

<ResponseField name="data.changed_at" type="string (RFC 3339)" required>
  When the change was persisted server-side.
</ResponseField>

***

## Case status

| Value      | Meaning                                                                                |
| ---------- | -------------------------------------------------------------------------------------- |
| `open`     | Collection is running (any `collection_stage` other than `closed`).                    |
| `disputed` | The claim is disputed (`claim_disputed`) and not closed.                               |
| `closed`   | The claim is closed (`collection_stage` is `closed`) — whether or not it was disputed. |

| `from_status` → `to_status`    | When                                                                                                                                   |
| ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- |
| `open` → `closed`              | Paid in full, or closed without payment                                                                                                |
| `open` → `disputed`            | The debtor disputes the claim — or you set `claim_disputed` through [`PATCH /openapi/claims/{id}`](/api-reference/claims/update-claim) |
| `disputed` → `open`            | The dispute flag is cleared                                                                                                            |
| `disputed` → `closed`          | A disputed claim is closed                                                                                                             |
| `closed` → `open` / `disputed` | The claim is reopened                                                                                                                  |
| `closed` → `closed`            | The closure reason changed — a claim closed without payment was paid in full after all (`closure_reason: paid`)                        |

## Closure reasons

| Value              | Meaning                                  |
| ------------------ | ---------------------------------------- |
| `paid`             | Paid in full.                            |
| `installment_plan` | Paid in full through an instalment plan. |
| `written_off`      | Closed without payment as uncollectable. |
| `withdrawn`        | The creditor called the case off.        |
| `disputed`         | Closed because the claim is disputed.    |

`paid` and `installment_plan` follow from the payments; the other three are recorded by the incaseof.law team when they close a claim that was not paid.

***

## Reconciliation

The same two values are on the claim itself: [`GET /openapi/claims/{id}`](/api-reference/claims/get-claim) and [`GET /openapi/claims`](/api-reference/claims/list-claims) return `case_status` and `closure_reason`. Failed deliveries are not re-sent — compare them with your mirror once a day (see [Webhooks Overview](/webhooks/overview)). Claims closed before this event existed have `closure_reason: null`.

<Note>
  The claim's `status` field is an internal workflow value — a claim paid in full reads `paid` there, a claim closed without payment may still read `open`. Use `case_status` and `closure_reason`.
</Note>

***

## Example: the debtor disputes the claim

```json theme={null}
{
  "id": "evt_01HXYZ8K9MGV9C3K3F2K8AB13B",
  "type": "claim.status_changed",
  "created_at": "2026-09-22T08:00:01.000Z",
  "api_version": "2026-05-14",
  "data": {
    "claim_id": "5f3c1b22-3f4b-4d2e-9b1a-7c8e9d0f1a2b",
    "partner_reference": "INV-2024-00891",
    "from_status": "open",
    "to_status": "disputed",
    "closure_reason": null,
    "changed_at": "2026-09-22T08:00:00.000Z"
  }
}
```

## Example: the creditor withdraws a disputed claim

```json theme={null}
{
  "id": "evt_01HXYZ8K9MGV9C3K3F2K8AB13C",
  "type": "claim.status_changed",
  "created_at": "2026-09-25T14:10:00.000Z",
  "api_version": "2026-05-14",
  "data": {
    "claim_id": "5f3c1b22-3f4b-4d2e-9b1a-7c8e9d0f1a2b",
    "partner_reference": "INV-2024-00891",
    "from_status": "disputed",
    "to_status": "closed",
    "closure_reason": "withdrawn",
    "changed_at": "2026-09-25T14:09:58.000Z"
  }
}
```
