Contracting API: Webhook Events

The Contracting API publishes webhook events when contracts and contract assignments change. Use these events to keep downstream systems synchronized without polling.

For instructions on how to register an endpoint, verify delivery, and validate signatures, see the Webhooks Quick Start Guide.

Available Events

Contracting Events

Event TypeWhen It Fires
contract.updatedA contract record is created or updated
contract.deletedA contract record is deleted
contract.assignment.updatedA contract assignment is created or updated
contract.assignment.deletedA contract assignment is deleted
contract.assignment_change.updatedA contract assignment change (workflow task) is created or updated
contract.assignment_change.deletedA contract assignment change is deleted
contract.packet.submittedA contract packet is submitted
contract.producer_status.updatedA producer's status within an organization is created or updated
contract.responsible_party.updatedA contract's responsible party is created or updated
contract.responsible_party.deletedA contract's responsible party is deleted
hierarchy.producer.addedA producer is newly placed under an upline in a hierarchy
hierarchy.producer.changedAn existing producer's hierarchy position (upline and/or commission level) changes
hierarchy.producer.relationship.terminatedA producer's hierarchy relationship ends — its contract assignment transitions into a terminal status

Producer Profile Events

Producer profile events (id.producer.*) are published by the Producer Profile API, not the Contracting API. See Producer Profile API Webhook Events for the full event catalog and payload schemas.

Event Schema

All Contracting API webhook events share the same envelope:

{
  "id": "whe_01je7babqteg8v9p30k8zpg3ga",
  "type": "contract.updated",
  "timestamp": "2024-09-30T17:33:00Z",
  "data": {}
}
FieldTypeDescription
idstringUnique identifier for this event. Uses the whe_ prefix. Repeated on retries — use for deduplication.
typestringThe specific event type (see table above)
timestampstring (ISO 8601)UTC time the event was generated
dataobjectEvent-specific payload (see examples below)

Note: The timestamp field is present in observed webhook deliveries but is not listed in the source schema definition. Verify whether it is guaranteed to be present before relying on it.

Example Payloads

contract.updated

Fires when a contract record is created or updated. Includes the full current state of the contract.

FieldTypeDescription
contractIdUUIDUnique identifier for the contract
agencyOrganizationId / toOrganizationIdUUIDThe agency organization — see note below
agencyOrganizationName / toOrganizationNameStringName of the agency organization — see note below
carrierOrganizationId / fromOrganizationIdUUIDThe carrier organization — see note below
carrierOrganizationName / fromOrganizationNameStringName of the carrier organization — see note below
personIdUUIDThe producer person record ID
personNpnStringThe producer's NPN
firmIdUUIDThe firm record ID
firmNpnStringThe firm's NPN
responsibleUplineFirmIdUUIDID of the upline firm responsible for this contract
responsibleUplineFirmNpnStringNPN of the upline firm responsible for this contract
assignmentStatusIdUUIDID of the assignment status
assignmentStatusNameStringName of the assignment status
activebooleanWhether the contract is currently active
effectiveDateDateWhen the contract became effective
endDateDateWhen the contract ends (if applicable)
contractCompletionDateDateWhen contracting completed, from the contract's latest active contract assignment
statesStringState abbreviations covered by the contract's active contract assignments; empty when there are no active assignments
createdAtDate-TimeWhen the record was created
updatedAtDate-TimeWhen the record was last updated
displayNumberStringHuman-readable contract number
parentContractIdUUIDID of the parent contract, if this is a subsidiary contract
parentContractDisplayNumberStringDisplay number of the parent contract, if this is a subsidiary contract
userDefined1userDefined10StringConfigurable custom fields

Note: The source document's field table lists agencyOrganizationId/Name and carrierOrganizationId/Name, but the example payload uses toOrganizationId/toOrganizationName and fromOrganizationId/fromOrganizationName. Both naming conventions are included above. Treat the payload field names as the runtime values until this inconsistency is resolved.

{
  "id": "whe_01je7babqteg8v9p30k8zpg3ga",
  "type": "contract.updated",
  "data": {
    "contractId": "2ba59c5c-1690-49e7-8ee7-69aec9c0cdf5",
    "toOrganizationId": "455cd571-abd6-4a0c-950b-28db750e9115",
    "toOrganizationName": "Erin Carrier",
    "fromOrganizationId": "391b9b70-ed4b-4bbc-9eed-a5dff738bb8d",
    "fromOrganizationName": "Independent Insurance Agency",
    "personId": "ed2f7724-947c-4b97-bf1f-2a7ce9c9c1ab",
    "personNpn": "2337860",
    "firmId": "ed2f7724-947c-4b97-bf1f-2a7ce9c9c1ab",
    "firmNpn": "2337860",
    "responsibleUplineFirmNpn": "7654321",
    "assignmentStatus": "APPROVED",
    "active": true,
    "effectiveDate": "2024-09-26",
    "contractCompletionDate": "2024-10-01",
    "states": ["AL", "NE"],
    "createdAt": "2024-09-26T14:14:14Z",
    "updatedAt": "2024-09-30T17:33:00Z",
    "displayNumber": "CON-1234"
  }
}

contract.deleted

Fires when a contract record is deleted. Only the contractId is included, since no other state is meaningful once the record is gone.

FieldTypeDescription
contractIdUUIDUnique identifier for the deleted contract
{
  "id": "whe_01je7babqteg8v9p30k8zpg3ga",
  "type": "contract.deleted",
  "data": {
    "contractId": "2ba59c5c-1690-49e7-8ee7-69aec9c0cdf5"
  }
}

contract.assignment.updated

Fires when a contract assignment is created or updated. Contains the full current state of the assignment including commission level, upline, and states.

FieldTypeDescription
contractAssignmentIdUUIDUnique identifier for the contract assignment
contractIdUUIDThe parent contract ID
agencyOrganizationIdUUIDThe agency organization ID
agencyOrganizationNameStringName of the agency organization
carrierOrganizationIdUUIDThe carrier organization ID
carrierOrganizationNameStringName of the carrier organization
productNameStringName of the product
productIdUUIDProduct ID
statesStringStates covered by this assignment
personIdUUIDThe producer person record ID
personNpnStringThe producer's NPN
firmIdUUIDThe firm record ID
firmNpnStringThe firm's NPN
writingNumberStringThe writing number for this assignment
commissionLevelIdUUIDCommission level ID
commissionLevelNameStringCommission level name
assignmentStatusStringCurrent status (SCREAMING_SNAKE_CASE, e.g. PENDING_WITH_CARRIER)
effectiveDateDateWhen the assignment became effective
expirationDateDateWhen the assignment expires (if applicable)
requestedEffectiveDateDateThe requested effective date
submittedDateDateDate the assignment was submitted
referralCodesStringAny referral codes attached to the assignment
uplineNpnStringNPN of the upline producer
uplineIdUUIDID of the upline record
annualizationDecimalAnnualization period in integer months (e.g. 12) — see note below
createdAtDate-TimeWhen the record was created
updatedAtDate-TimeWhen the record was last updated
responsiblePartyIdUUIDResponsible party record ID
responsibleUplineFirmIdUUIDID of the upline firm responsible for this contract assignment
responsibleUplineFirmNpnStringNPN of the upline firm responsible for this contract assignment
responsiblePartyStartDateDateWhen the responsible party relationship started
responsiblePartyEndDateDateWhen the responsible party relationship ended (if applicable)
displayNumberStringHuman-readable assignment number
contractDisplayNumberStringDisplay number of the contract the assignment belongs to
contractAssignmentChangeIdsUUIDIDs of the assignment's non-terminal (open) contract assignment
uplineContractAssignmentObjectCurated identity of the assignment's upline (id, displayNumber, firmName, personName); null when there is no upline
externalNotesStringExternal notes on the contract assignment
debitBalanceDecimalDebit balance of the contract assignment (up to 12 digits, 2 decimal places)
userDefined1userDefined10StringConfigurable custom fields

Note: The annualization field in this event is an integer representing months (e.g. 12). The /v1/annualizations REST endpoint returns a proportion decimal field with no numeric months representation — the two cannot be directly mapped without a lookup.

Note: The assignmentStatus value uses SCREAMING_SNAKE_CASE (e.g. "PENDING_WITH_CARRIER"), consistent with assignmentStatuses.name returned by the REST API. Earlier documentation used human-readable values such as "Active" — these are incorrect.

{
  "id": "whe_01je7babqteg8v9p30k8zpg3ga",
  "type": "contract.assignment.updated",
  "data": {
    "contractAssignmentId": "2ba59c5c-1690-49e7-8ee7-69aec9c0cdf5",
    "toOrganizationId": "455cd571-abd6-4a0c-950b-28db750e9115",
    "toOrganizationName": "Erin Carrier",
    "fromOrganizationId": "391b9b70-ed4b-4bbc-9eed-a5dff738bb8d",
    "fromOrganizationName": "Independent Insurance Agency",
    "productName": "P1",
    "productId": "4008f480-c668-4a2f-ab50-e20bddde8bbf",
    "states": ["AL", "NE"],
    "personId": "ed2f7724-947c-4b97-bf1f-2a7ce9c9c1ab",
    "personNpn": "2337860",
    "firmId": "ed2f7724-947c-4b97-bf1f-2a7ce9c9c1ab",
    "firmNpn": "2337860",
    "writingNumber": "2337860",
    "commissionLevelId": "424183aa-ead8-4a08-b26b-320d00098ba6",
    "commissionLevelName": "Agent - $611",
    "assignmentStatus": "PENDING_WITH_CARRIER",
    "effectiveDate": "2024-09-26",
    "requestedEffectiveDate": "2024-09-26",
    "submittedDate": "2024-09-30",
    "referralCodes": ["XC-555"],
    "uplineNpn": "19785551",
    "uplineId": "dd5c2a40-9166-490d-9ed5-b5cb590a5944",
    "annualization": 0,
    "createdAt": "2024-09-26T14:14:14Z",
    "updatedAt": "2024-09-30T17:33:00Z",
    "responsiblePartyId": "dd5c2a40-9166-490d-9ed5-b5cb590a5944",
    "responsibleUplineFirmNpn": "7654321",
    "responsiblePartyStartDate": "2024-10-02",
    "displayNumber": "CA-1234",
    "contractDisplayNumber": "CON-1234",
    "contractAssignmentChangeIds": ["dd0e8400-e29b-41d4-a716-446655440007"],
    "uplineContractAssignment": {
      "id": "cc0e8400-e29b-41d4-a716-446655440008",
      "displayNumber": "CA-00009",
      "firmName": "Upline Agency LLC",
      "personName": "Jane Doe"
    }
  }
}

contract.assignment.deleted

Fires when a contract assignment is deleted.

FieldTypeDescription
contractAssignmentIdUUIDUnique identifier for the deleted contract assignment
displayNumberStringHuman-readable assignment number
{
  "id": "whe_01je7babqteg8v9p30k8zpg3ga",
  "type": "contract.assignment.deleted",
  "data": {
    "contractAssignmentId": "2ba59c5c-1690-49e7-8ee7-69aec9c0cdf5",
    "displayNumber": "CA-1234"
  }
}

contract.assignment_change.updated

Fires when a contract assignment change (a workflow task representing a status transition or update to an assignment) is created or updated.

Note: The correct event type name is contract.assignment_change.updated (underscore before change). Earlier documentation incorrectly listed this as contract.assignment.change.updated (dot-separated).

Getting Previous Values (Callback Required)

The payload for this event includes the new state of each changed field (indicated by the new prefix, e.g. newCommissionLevelId, newCommissionLevelName). It does not include the previous values.

To determine what a field was before the change, call:

GET /v1/contractAssignmentChanges/{contractAssignmentChangeId}

The API response includes the previous values. Combined with the new* fields in the webhook payload, you have the full before/after picture.

This pattern applies to all change-type webhook events — not just commission changes. If you need to track deltas (e.g. "commission changed from X to Y", "upline changed from A to B"), plan for this callback as part of your event processing.

FieldTypeDescription
contractAssignmentChangeIdUUIDUnique identifier for this assignment change record
contractAssignmentIdUUIDThe associated contract assignment ID
contractIdUUIDThe parent contract ID
agencyOrganizationIdUUIDThe agency organization ID
agencyOrganizationNameStringName of the agency organization
carrierOrganizationIdUUIDThe carrier organization ID
carrierOrganizationNameStringName of the carrier organization
productNameStringName of the product
productIdUUIDProduct ID
statesStringStates covered by this assignment change
personIdUUIDThe producer person record ID
personNpnStringThe producer's NPN
firmIdUUIDThe firm record ID
firmNpnStringThe firm's NPN
writingNumberStringThe writing number
taskTypeNameStringThe type of workflow task (e.g. New Business)
referralCodesStringAny referral codes
titleStringHuman-readable title of the assignment change
contractPacketIdUUIDAssociated contract packet ID (if any)
newUplineContractAssignmentIdUUIDNew upline assignment ID
newCommissionLevelIdUUIDNew commission level ID
newCommissionLevelNameStringNew commission level name
newAssignmentStatusNameStringNew assignment status (SCREAMING_SNAKE_CASE)
effectiveDateDateEffective date of the change
expirationDateDateExpiration date (if applicable)
newUplineNpnStringNPN of the new upline producer
uplineContractAssignmentChangeIdUUIDID of the upline assignment change record
uplineContractAssignmentChangeDisplayNumberStringDisplay number of the upline assignment change
uplineContractAssignmentChangeObjectCurated identity of the upline assignment change (id, displayNumber, firmName, personName); null when there is no upline
responsibleUplineFirmNpnStringNPN of the upline firm responsible for this contract assignment
newAnnualizationDecimalNew annualization period in integer months
createdAtDate-TimeWhen the record was created
updatedAtDate-TimeWhen the record was last updated
contractAssignmentChangeDisplayNumberStringHuman-readable assignment change number
userDefined1userDefined10StringConfigurable custom fields
{
  "id": "whe_01je7babqteg8v9p30k8zpg3ga",
  "type": "contract.assignment_change.updated",
  "data": {
    "contractAssignmentChangeId": "2ba59c5c-1690-49e7-8ee7-69aec9c0cdf5",
    "contractAssignmentId": "3ba5965d-1690-49e7-8ee7-69aec9c0cdf5",
    "contractId": "110e8400-e29b-41d4-a716-446655440009",
    "toOrganizationId": "455cd571-abd6-4a0c-950b-28db750e9115",
    "toOrganizationName": "Erin Carrier",
    "fromOrganizationId": "391b9b70-ed4b-4bbc-9eed-a5dff738bb8d",
    "fromOrganizationName": "Independent Insurance Agency",
    "productName": "P1",
    "productId": "4008f480-c668-4a2f-ab50-e20bddde8bbf",
    "states": ["AL", "NE"],
    "personId": "ed2f7724-947c-4b97-bf1f-2a7ce9c9c1ab",
    "personNpn": "2337860",
    "firmId": "ed2f7724-947c-4b97-bf1f-2a7ce9c9c1ab",
    "firmNpn": "2337860",
    "writingNumber": "2337860",
    "newCommissionLevelId": "424183aa-ead8-4a08-b26b-320d00098ba6",
    "newCommissionLevelName": "Agent - $611",
    "newAssignmentStatus": "PENDING_WITH_CARRIER",
    "effectiveDate": "2024-09-26",
    "expirationDate": "2024-09-26",
    "newUplineNpn": "19785551",
    "uplineContractAssignmentChangeId": "dd5c2a40-9166-490d-9ed5-b5cb590a5944",
    "uplineContractAssignmentChangeDisplayNumber": "CAC-1235",
    "uplineContractAssignmentChange": {
      "id": "dd5c2a40-9166-490d-9ed5-b5cb590a5944",
      "displayNumber": "CAC-1235",
      "firmName": "Upline Agency LLC",
      "personName": "Jane Doe"
    },
    "responsibleUplineFirmNpn": "7654321",
    "newAnnualization": 0,
    "createdAt": "2024-09-26T14:14:14Z",
    "updatedAt": "2024-09-30T17:33:00Z",
    "displayNumber": "CAC-1234",
    "userDefined1": "Region West"
  }
}

contract.assignment_change.deleted

Fires when a contract assignment change record is deleted.

FieldTypeDescription
contractAssignmentChangeIdUUIDUnique identifier for the deleted assignment change
contractAssignmentChangeDisplayNumberStringHuman-readable assignment change number
{
  "id": "whe_01je7babqteg8v9p30k8zpg3ga",
  "type": "contract.assignment_change.deleted",
  "data": {
    "contractAssignmentChangeId": "2ba59c5c-1690-49e7-8ee7-69aec9c0cdf5",
    "displayNumber": "CAC-1234"
  }
}

contract.packet.submitted

Fires when a contract packet is submitted for processing.

FieldTypeDescription
contractPacketIdUUIDUnique identifier for the contract packet
submittedByPersonIdUUIDID of the person who submitted the packet
submittedByNameStringName of the person who submitted the packet
submissionDateDate-TimeWhen the packet was submitted
submissionMethodStringHow the packet was submitted (e.g. EMAIL)
contractIdUUIDThe associated contract ID
contractNumberStringHuman-readable contract number
submissionUrlStringURL to the submitted packet (e.g. PDF link)
attachmentsJSONAny attachments included with the submission
{
  "id": "whe_01je7babqteg8v9p30k8zpg3ga",
  "type": "contract.packet.submitted",
  "data": {
    "contractPacketId": "2ba59c5c-1690-49e7-8ee7-69aec9c0cdf5",
    "submittedByPersonId": "abc12345-d678-90ef-gh12-ijkl34567890",
    "submittedByName": "Sarah Adams",
    "submissionDate": "2024-10-28T16:30:00Z",
    "submissionMethod": "EMAIL",
    "contractId": "abc12345-d678-90ef-gh12-ijkl34567890",
    "contractNumber": "CON-1234",
    "submissionUrl": "https://example.com/submission-pdf"
  }
}

contract.producer_status.updated

Fires when a producer's status within an organization is created or updated.

FieldTypeDescription
producerIdUUIDUnique identifier for the producer
npnStringThe producer's NPN
organizationIdUUIDThe organization ID
organizationNameStringName of the organization
startDateDateWhen the producer status became effective
endDateDateWhen the producer status ends (if applicable)
statusIdUUIDID of the status record
statusNameStringName of the status
activebooleanWhether the status is currently active
updatedAtDate-TimeWhen the record was last updated
{
  "id": "whe_01je7babqteg8v9p30k8zpg3ga",
  "type": "contract.producer_status.updated",
  "data": {
    "producerId": "5025c204-5c07-47c6-b9d3-11ad09c35f43",
    "npn": "3654698",
    "organizationId": "7119ddf8-4095-495c-ab59-b2998d72697c",
    "organizationName": "Independent Insurance Agency",
    "startDate": "2024-12-02",
    "endDate": "2025-12-02",
    "statusId": "f19c9ba8-f954-484c-bbf5-442241b14935",
    "statusName": "Active",
    "updatedAt": "2024-12-05T00:03:37Z",
    "active": true
  }
}

contract.responsible_party.updated

Fires when a contract's responsible party is created or updated.

FieldTypeDescription
idUUIDUnique identifier of the contract responsible party
contractIdUUIDThe contract the responsible party belongs to
contractDisplayNumberStringDisplay number of the contract
responsiblePartyIdUUIDThe party responsible for the contract
startDateDateWhen the responsible-party window begins
endDateDateWhen the responsible-party window ends; null when open-ended
{
  "id": "whe_01je7babqteg8v9p30k8zpg3ga",
  "type": "contract.responsible_party.updated",
  "data": {
    "id": "2ba59c5c-1690-49e7-8ee7-69aec9c0cdf5",
    "contractId": "110e8400-e29b-41d4-a716-446655440009",
    "contractDisplayNumber": "CON-1234",
    "responsiblePartyId": "dd5c2a40-9166-490d-9ed5-b5cb590a5944",
    "startDate": "2026-05-01",
    "endDate": null
  }
}

contract.responsible_party.deleted

Fires when a contract's responsible party is deleted. Carries the same payload shape as contract.responsible_party.updated.

{
  "id": "whe_01je7babqteg8v9p30k8zpg3ga",
  "type": "contract.responsible_party.deleted",
  "data": {
    "id": "2ba59c5c-1690-49e7-8ee7-69aec9c0cdf5",
    "contractId": "110e8400-e29b-41d4-a716-446655440009",
    "contractDisplayNumber": "CON-1234",
    "responsiblePartyId": "dd5c2a40-9166-490d-9ed5-b5cb590a5944",
    "startDate": "2026-05-01",
    "endDate": "2026-08-01"
  }
}

hierarchy.producer.added

Fires when a producer is newly placed under an upline in a hierarchy. Derived from a contract assignment change. The upline and commission values reflect the new placement — there is no prior-value diff.

FieldTypeDescription
contractAssignmentChangeIdUUIDThe contract assignment change that drove this hierarchy event
contractAssignmentIdUUIDThe contract assignment the producer holds in the hierarchy
contractIdUUIDThe contract the assignment belongs to
personIdUUIDThe individual producer whose placement changed
personNpnStringThe producer's NPN
firmIdUUIDThe firm the producer is contracted under, if any
firmNpnStringThe firm's NPN, if any
agencyOrganizationIdUUIDThe agency organization the contract is sent from
carrierOrganizationIdUUIDThe carrier organization the contract is sent to
productIdUUIDThe carrier product the producer is contracted for
writingNumberStringThe writing number of the producer's contract assignment
uplineContractAssignmentIdUUIDThe upline contract assignment the producer is placed under
uplineNpnStringNPN of the upline producer
uplineFirmIdUUIDThe upline firm, if any
uplineFirmNpnStringNPN of the upline firm, if any
uplineContractAssignmentChangeObjectCurated upline identity (id, displayNumber, firmName, personName), if the placement has an upline
commissionLevelIdUUIDThe producer's commission level
commissionLevelNameStringName of the producer's commission level
assignmentStatusNameStringName of the producer's assignment status
effectiveDateDateEffective date of the placement
createdAtDate-TimeWhen the underlying change was created
updatedAtDate-TimeWhen the underlying change was last updated
{
  "id": "whe_01je7babqteg8v9p30k8zpg3ga",
  "type": "hierarchy.producer.added",
  "data": {
    "contractAssignmentChangeId": "550e8400-e29b-41d4-a716-446655440000",
    "contractAssignmentId": "660e8400-e29b-41d4-a716-446655440001",
    "contractId": "110e8400-e29b-41d4-a716-446655440009",
    "personId": "990e8400-e29b-41d4-a716-446655440004",
    "personNpn": "1234567",
    "agencyOrganizationId": "770e8400-e29b-41d4-a716-446655440002",
    "carrierOrganizationId": "880e8400-e29b-41d4-a716-446655440003",
    "productId": "aa0e8400-e29b-41d4-a716-446655440005",
    "uplineContractAssignmentId": "dd0e8400-e29b-41d4-a716-446655440007",
    "uplineNpn": "7654321",
    "uplineContractAssignmentChange": {
      "id": "cc0e8400-e29b-41d4-a716-446655440008",
      "displayNumber": "CAC-00009",
      "firmName": "Upline Agency LLC",
      "personName": "Jane Doe"
    },
    "commissionLevelId": "ee0e8400-e29b-41d4-a716-446655440010",
    "commissionLevelName": "Level A",
    "assignmentStatusName": "Active",
    "effectiveDate": "2026-06-18",
    "createdAt": "2026-06-18T09:15:00Z",
    "updatedAt": "2026-06-18T09:15:00Z"
  }
}

hierarchy.producer.changed

Fires when an existing producer's hierarchy position changes — its upline and/or commission level. Shares the hierarchy.producer.added payload, plus a changedFields array listing which dimensions changed. The values reflect the new placement — there is no prior-value diff.

FieldTypeDescription
(all fields from hierarchy.producer.added)
changedFieldsStringThe hierarchy dimensions this change affected (upline, commissionLevel). Present only on hierarchy.producer.changed
{
  "id": "whe_01je7babqteg8v9p30k8zpg3ga",
  "type": "hierarchy.producer.changed",
  "data": {
    "contractAssignmentChangeId": "550e8400-e29b-41d4-a716-446655440000",
    "contractAssignmentId": "660e8400-e29b-41d4-a716-446655440001",
    "contractId": "110e8400-e29b-41d4-a716-446655440009",
    "personId": "990e8400-e29b-41d4-a716-446655440004",
    "personNpn": "1234567",
    "agencyOrganizationId": "770e8400-e29b-41d4-a716-446655440002",
    "carrierOrganizationId": "880e8400-e29b-41d4-a716-446655440003",
    "productId": "aa0e8400-e29b-41d4-a716-446655440005",
    "uplineContractAssignmentId": "dd0e8400-e29b-41d4-a716-446655440007",
    "uplineNpn": "7654321",
    "commissionLevelId": "ee0e8400-e29b-41d4-a716-446655440010",
    "commissionLevelName": "Level B",
    "assignmentStatusName": "Active",
    "effectiveDate": "2026-06-20",
    "changedFields": ["upline", "commissionLevel"],
    "createdAt": "2026-06-18T09:15:00Z",
    "updatedAt": "2026-06-20T14:45:00Z"
  }
}

hierarchy.producer.relationship.terminated

Fires when a producer's hierarchy relationship ends — its contract assignment transitions into a terminal status. The values reflect the placement as it existed when the relationship ended.

FieldTypeDescription
contractAssignmentIdUUIDThe contract assignment whose hierarchy relationship ended
contractIdUUIDThe contract the assignment belongs to
personIdUUIDThe individual producer whose relationship ended
personNpnStringThe producer's NPN
firmIdUUIDThe firm the producer is contracted under, if any
firmNpnStringThe firm's NPN, if any
agencyOrganizationIdUUIDThe agency organization the contract is sent from
carrierOrganizationIdUUIDThe carrier organization the contract is sent to
productIdUUIDThe carrier product the producer is contracted for
writingNumberStringThe writing number of the producer's contract assignment
uplineContractAssignmentIdUUIDThe upline contract assignment the producer was placed under
uplineNpnStringNPN of the upline producer
uplineFirmIdUUIDThe upline firm, if any
uplineFirmNpnStringNPN of the upline firm, if any
uplineContractAssignmentObjectCurated upline identity (id, displayNumber, firmName, personName), if the placement had an upline
commissionLevelIdUUIDThe producer's commission level
commissionLevelNameStringName of the producer's commission level
terminationReasonStringThe name of the terminal assignment status (e.g. Terminated, Expired, Declined, Withdrawn, Transferred, Released)
terminationDateDateThe date the relationship ended
createdAtDate-TimeWhen the contract assignment was created
updatedAtDate-TimeWhen the contract assignment was last updated
{
  "id": "whe_01je7babqteg8v9p30k8zpg3ga",
  "type": "hierarchy.producer.relationship.terminated",
  "data": {
    "contractAssignmentId": "660e8400-e29b-41d4-a716-446655440001",
    "contractId": "110e8400-e29b-41d4-a716-446655440009",
    "personId": "990e8400-e29b-41d4-a716-446655440004",
    "personNpn": "1234567",
    "agencyOrganizationId": "770e8400-e29b-41d4-a716-446655440002",
    "carrierOrganizationId": "880e8400-e29b-41d4-a716-446655440003",
    "productId": "aa0e8400-e29b-41d4-a716-446655440005",
    "uplineContractAssignmentId": "dd0e8400-e29b-41d4-a716-446655440007",
    "uplineNpn": "7654321",
    "uplineContractAssignment": {
      "id": "dd0e8400-e29b-41d4-a716-446655440007",
      "displayNumber": "CA-00009",
      "firmName": "Upline Agency LLC",
      "personName": "Jane Doe"
    },
    "commissionLevelId": "ee0e8400-e29b-41d4-a716-446655440010",
    "commissionLevelName": "Level A",
    "terminationReason": "Terminated",
    "terminationDate": "2026-07-01",
    "createdAt": "2026-06-18T09:15:00Z",
    "updatedAt": "2026-07-01T14:45:00Z"
  }
}

Subscribing to Events

When registering your endpoint in the Svix webhook portal, subscribe to the contract high-level event group to receive all contracting events, or subscribe to specific event types if you only need a subset. To receive producer profile events, subscribe separately — see Producer Profile API Webhook Events.

See the Webhooks Quick Start Guide for step-by-step registration instructions.

Processing Recommendations

  • Use id for deduplication — if an event is retried, the id stays the same. Store processed event IDs to avoid duplicate processing.
  • Respond quickly — your endpoint must return 2xx within 5 seconds. Offload heavy processing to a queue or background job.
  • Validate signatures — verify the webhook-signature header against your signing secret before processing. See Webhooks Quick Start Guide for details.
  • Log all receipts — log the full event payload and id before processing so you can replay or debug later.
  • Use updatedAt for ordering — if you receive multiple events for the same resource in quick succession, use data.updatedAt to determine the most recent state.
  • Expect callbacks for change events — change-type events (e.g. contract.assignment_change.updated) include the new state in the payload but not the previous state. To reconstruct a full before/after diff, call GET /v1/contractAssignmentChanges/{contractAssignmentChangeId} to retrieve the previous values. Design your event processing to accommodate this additional request.