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.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.assignment_changed.updatedA license record is updated as a result of a contract assignment change

Note: contract.assignment_changed.updated is not listed in the primary reference document — confirm whether it is still active before subscribing.

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
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)
createdAtDate-TimeWhen the record was created
updatedAtDate-TimeWhen the record was last updated
displayNumberStringHuman-readable contract number
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",
    "assignmentStatus": "APPROVED",
    "effectiveDate": "2024-09-26",
    "createdAt": "2024-09-26T14:14:14Z",
    "updatedAt": "2024-09-30T17:33:00Z",
    "displayNumber": "CON-1234"
  }
}

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
updatedAtDate-TimeWhen the record was last updated
responsiblePartyIdUUIDResponsible party record ID
responsiblePartyUplineFirmIdUUIDResponsible party's upline firm ID
responsiblePartyStartDateDateWhen the responsible party relationship started
responsiblePartyEndDateDateWhen the responsible party relationship ended (if applicable)
displayNumberStringHuman-readable assignment number
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",
    "responsiblePartyStartDate": "2024-10-02",
    "displayNumber": "CA-1234"
  }
}

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).

FieldTypeDescription
contractAssignmentChangeIdUUIDUnique identifier for this assignment change record
contractAssignmentIdUUIDThe associated contract assignment 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
newAnnualizationDecimalNew annualization period in integer months
createdAtDate-TimeWhen the record was created
updatedAtDate-TimeWhen the record was last updated
contractAssignmentChangeDisplayNumberStringHuman-readable assignment change number
{
  "id": "whe_01je7babqteg8v9p30k8zpg3ga",
  "type": "contract.assignment_change.updated",
  "data": {
    "contractAssignmentChangeId": "2ba59c5c-1690-49e7-8ee7-69aec9c0cdf5",
    "contractAssignmentId": "3ba5965d-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",
    "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",
    "newAnnualization": 0,
    "createdAt": "2024-09-26T14:14:14Z",
    "updatedAt": "2024-09-30T17:33:00Z",
    "displayNumber": "CAC-1234"
  }
}

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.assignment_changed.updated

Note: This event type is not listed in the primary reference document — confirm whether it is still active before subscribing.

Fires when a license record is updated as a result of a contract assignment change. The data payload contains the updated license record and its lines of authority.

{
  "id": "whe_01je7babqteg8v9p30k8zpg3ga",
  "type": "contract.assignment_changed.updated",
  "data": {
    "active": true,
    "adhsHomeState": "CO",
    "agentTypes": ["LIFE"],
    "branchId": null,
    "expirationDate": "2028-01-01",
    "forState": "CO",
    "id": 9842341,
    "licenseClass": "Individual",
    "licenseClassCode": "IND",
    "licenseLoas": [
      {
        "ceCompliance": "Compliant",
        "ceCreditsNeeded": 0,
        "ceRenewalDate": "2028-01-01",
        "id": 1234567,
        "issueDate": "2022-06-01",
        "licenseId": 9842341,
        "loa": "Life",
        "loaCode": "LI",
        "loaMapping": {
          "categories": ["Life", null]
        },
        "niprDeleted": false,
        "status": "Active",
        "statusReason": null,
        "statusReasonDate": null,
        "updatedAt": "2026-03-17"
      }
    ],
    "licenseNum": "CO-12345678",
    "niprDateUpdated": "2026-03-17",
    "niprDeleted": false,
    "npn": "15645555",
    "originalIssueDate": "2022-06-01",
    "residencyStatus": "Resident",
    "updatedAt": "2026-03-17"
  }
}

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.