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.
It is not sent when a claim is created: every claim starts
open. A closure also sends claim.collection_stage_changed (to closed); the two are enqueued together, the stage event first.
Payload
id, type, created_at, api_version) is the same as for every event — see Collection Stage Events → Envelope fields.
data fields
uuid
required
ID of the claim. Look up the full claim via
GET /openapi/claims/{id}.string | null
The
partner_reference you provided when creating the claim through the API; for a claim created by incaseof.law, its external_reference.enum
required
The case status before the change:
open, disputed or closed.enum
required
The case status now:
open, disputed or closed.enum | null
required
Why the claim was closed — set when
to_status is closed, null otherwise. See the reference below.string (RFC 3339)
required
When the change was persisted server-side.
Case status
Closure reasons
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} and GET /openapi/claims return case_status and closure_reason. Failed deliveries are not re-sent — compare them with your mirror once a day (see Webhooks Overview). Claims closed before this event existed have closure_reason: null.
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.