Producer Profile API: Webhook Events
The Producer Profile API publishes webhook events when producer identity, contact, financial, or E&O data changes. 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
| Event Type | When It Fires |
|---|---|
id.producer.updated | A producer profile record is created or updated |
id.producer.deleted | A producer profile record is deleted |
id.producer.address.updated | A producer's address record is created or updated |
id.producer.address.deleted | A producer's address record is deleted |
id.producer.bank_account.updated | A producer's bank account record is created or updated |
id.producer.bank_account.deleted | A producer's bank account record is deleted |
id.producer.errors_and_omissions.updated | A producer's E&O policy record is created or updated |
id.producer.errors_and_omissions.deleted | A producer's E&O policy record is deleted |
id.producer.phone.updated | A producer's phone record is created or updated |
id.producer.phone.deleted | A producer's phone record is deleted |
Event Schema
All Producer Profile API webhook events share the same envelope:
{
"id": "whe_01je7babqteg8v9p30k8zpg3ga",
"type": "id.producer.updated",
"timestamp": "2024-09-30T17:33:00Z",
"data": {}
}
| Field | Type | Description |
|---|---|---|
id | string | Unique identifier for this event. Uses the whe_ prefix. Repeated on retries — use for deduplication. |
type | string | The specific event type (see table above) |
timestamp | string (ISO 8601) | UTC time the event was generated |
data | object | Event-specific payload (see examples below) |
Example Payloads
Note on field names: Webhook event payloads are serialized independently from the REST API. Some field names in event payloads may differ from their REST API equivalents — for example, a field named
expiryin a REST response may appear asexpirationDatein a webhook event. Where known differences exist, they are called out in the event documentation below.
id.producer.updated
Fires when a producer profile record is created or updated. The shape of data differs between individual producers and firm producers.
| Field | Type | Applies to |
|---|---|---|
id | UUID | Both |
npn | String | Both |
type | String | Both (INDIVIDUAL or FIRM) |
firstName | String | Individual only |
lastName | String | Individual only |
middleName | String | Individual only |
suffix | String | Individual only |
gender | String | Individual only |
dateOfBirth | Date | Individual only |
ssn | String | Individual only |
primaryEmail | String | Individual only |
secondaryEmail | String | Individual only |
finraCrdNumber | String | Both |
businessName | String | Firm only |
businessType | String | Firm only |
fein | String | Firm only |
Individual example:
{
"id": "whe_01je7babqteg8v9p30k8zpg3ga",
"type": "id.producer.updated",
"data": {
"dateOfBirth": "1987-01-01",
"finraCrdNumber": "2523523",
"firstName": "Richard",
"gender": "MALE",
"id": "18de9286-2ad9-4b83-96c7-6d4d63a085b1",
"lastName": "Rogers",
"middleName": "Person",
"npn": "444444",
"primaryEmail": "richard@example.com",
"secondaryEmail": "",
"ssn": "123456788",
"suffix": "",
"type": "INDIVIDUAL"
}
}
Firm example:
{
"id": "whe_01je7babqteg8v9p30k8zpg3ga",
"type": "id.producer.updated",
"data": {
"businessName": "RDRR LLC",
"businessType": "LLC",
"finraCrdNumber": "",
"id": "18de9286-2ad9-4b83-96c7-6d4d63a085b0",
"npn": "222222",
"primaryEmail": "rdrr@example.com",
"type": "FIRM"
}
}
id.producer.deleted
Fires when a producer profile record is deleted.
| Field | Type | Description |
|---|---|---|
id | UUID | The producer's record ID |
npn | String | The producer's NPN |
{
"id": "whe_01je7babqteg8v9p30k8zpg3ga",
"type": "id.producer.deleted",
"data": {
"id": "18de9286-2ad9-4b83-96c7-6d4d63a085b0",
"npn": "222222"
}
}
id.producer.address.updated
Fires when a producer's address record is created or updated.
| Field | Type | Description |
|---|---|---|
addressId | UUID | Unique identifier for the address record |
addressLine1 | String | First line of the street address |
addressLine2 | String | Second line of the street address (optional) |
addressType | String | Type of address (e.g. MAILING) |
city | String | City |
country | String | Country code (e.g. USA) |
county | String | County |
moveInDate | Date | Date the producer moved to this address |
producerId | UUID | The producer's record ID |
producerNpn | String | The producer's NPN |
state | String | Two-letter state code |
updatedAt | Date-Time | When the record was last updated |
zip | String | ZIP code |
preferred | boolean | Whether this is the preferred address |
{
"id": "whe_01je7babqteg8v9p30k8zpg3ga",
"type": "id.producer.address.updated",
"data": {
"addressId": "5025c204-5c07-47c6-b9d3-11ad09c35f43",
"addressLine1": "123 Easy Street",
"addressLine2": "Suite 500",
"addressType": "MAILING",
"city": "Athens",
"country": "USA",
"county": "Clarke",
"createdAt": "2024-12-05T00:03:37Z",
"moveInDate": "2024-12-02",
"producerId": "be941609-884a-466b-8a87-2f158d79ebec",
"producerNpn": "1234",
"state": "GA",
"updatedAt": "2024-12-05T00:03:37Z",
"zip": "30606"
}
}
id.producer.address.deleted
Fires when a producer's address record is deleted.
| Field | Type | Description |
|---|---|---|
addressId | UUID | Unique identifier for the deleted address |
producerId | UUID | The producer's record ID |
producerNpn | String | The producer's NPN |
{
"id": "whe_01je7babqteg8v9p30k8zpg3ga",
"type": "id.producer.address.deleted",
"data": {
"addressId": "5025c204-5c07-47c6-b9d3-11ad09c35f43",
"producerId": "be941609-884a-466b-8a87-2f158d79ebec",
"producerNpn": "1234"
}
}
id.producer.bank_account.updated
Fires when a producer's bank account record is created or updated.
| Field | Type | Description |
|---|---|---|
bankAccountId | UUID | Unique identifier for the bank account record |
name | String | Name or label for the bank account |
number | String | Bank account number — masked in practice (e.g. ****4321) |
producerId | UUID | The producer's record ID |
npn | String | The producer's NPN |
routingNumber | String | Bank routing number |
type | String | Account type (e.g. CHECKING) |
updatedAt | Date-Time | When the record was last updated |
Note: The account number is returned masked (e.g.
****4321). Additionally,primaryAccounthas been observed in sandbox responses but is not listed in the source schema — treat it as undocumented until confirmed.
{
"id": "whe_01je7babqteg8v9p30k8zpg3ga",
"type": "id.producer.bank_account.updated",
"data": {
"bankAccountId": "5025c204-5c07-47c6-b9d3-11ad09c35f43",
"name": "Wells Fargo",
"number": "****4321",
"producerId": "00283595-fc7b-4999-80ab-fb4a70c21b04",
"producerNpn": "1234",
"routingNumber": "123456789",
"type": "CHECKING",
"updatedAt": "2024-12-05T00:03:37Z"
}
}
id.producer.bank_account.deleted
Fires when a producer's bank account record is deleted.
| Field | Type | Description |
|---|---|---|
bankAccountId | UUID | Unique identifier for the deleted bank account |
producerId | UUID | The producer's record ID |
npn | String | The producer's NPN |
{
"id": "whe_01je7babqteg8v9p30k8zpg3ga",
"type": "id.producer.bank_account.deleted",
"data": {
"bankAccountId": "5025c204-5c07-47c6-b9d3-11ad09c35f43",
"producerId": "00283595-fc7b-4999-80ab-fb4a70c21b04",
"producerNpn": "1234"
}
}
id.producer.errors_and_omissions.updated
Fires when a producer's errors and omissions (E&O) policy record is created or updated.
| Field | Type | Description |
|---|---|---|
producerId | UUID | The producer's record ID |
npn | String | The producer's NPN |
policyId | UUID | Unique identifier for the E&O policy |
policyType | String | Type of policy (e.g. INDIVIDUAL) |
policyNumber | String | Policy number |
providerName | String | Name of the E&O insurance provider |
totalLimit | Decimal | Total coverage limit |
effectiveDate | Date | When the policy became effective |
expirationDate | Date | When the policy expires |
certificateNumber | String | Certificate number |
createdAt | Date-Time | When the record was created |
updatedAt | Date-Time | When the record was last updated |
{
"id": "whe_01je7babqteg8v9p30k8zpg3ga",
"type": "id.producer.errors_and_omissions.updated",
"data": {
"producerId": "fcd7c256-2cdc-43ad-b4ce-6c52c0e1cf20",
"npn": "2523523",
"policyId": "c2e7c7ac-c994-4989-a703-7eec29a9038b",
"policyType": "INDIVIDUAL",
"policyNumber": "18de9286-2ad9-4b83-96c7-6d4d63a085b1",
"providerName": "EZLandC",
"totalLimit": "1000000",
"effectiveDate": "2024-12-04",
"expirationDate": "2026-12-04",
"certificateNumber": "4524524",
"createdAt": "2024-12-05T00:03:37Z",
"updatedAt": "2024-12-05T00:03:37Z"
}
}
id.producer.errors_and_omissions.deleted
Fires when a producer's E&O policy record is deleted.
| Field | Type | Description |
|---|---|---|
producerId | UUID | The producer's record ID |
producerNpn | String | The producer's NPN |
policyId | UUID | Unique identifier for the deleted E&O policy |
{
"id": "whe_01je7babqteg8v9p30k8zpg3ga",
"type": "id.producer.errors_and_omissions.deleted",
"data": {
"producerId": "18de9286-2ad9-4b83-96c7-6d4d63a085b0",
"producerNpn": "123456",
"policyId": "18de9286-2ad9-4b83-96c7-6d4d63a085b0"
}
}
id.producer.phone.updated
Fires when a producer's phone record is created or updated.
| Field | Type | Description |
|---|---|---|
producerId | UUID | The producer's record ID |
producerNpn | String | The producer's NPN |
phoneId | UUID | Unique identifier for the phone record |
preferred | Boolean | Whether this is the preferred phone number |
phoneType | String | Type of phone number (e.g. CELL) |
number | String | The phone number |
updatedAt | Date-Time | When the record was last updated |
{
"id": "whe_01je7babqteg8v9p30k8zpg3ga",
"type": "id.producer.phone.updated",
"data": {
"producerId": "fcd7c256-2cdc-43ad-b4ce-6c52c0e1cf20",
"producerNpn": "2523523",
"phoneId": "c2e7c7ac-c994-4989-a703-7eec29a9038b",
"preferred": true,
"phoneType": "CELL",
"number": "7065554444",
"updatedAt": "2024-12-05T00:03:37Z"
}
}
id.producer.phone.deleted
Fires when a producer's phone record is deleted.
| Field | Type | Description |
|---|---|---|
producerId | UUID | The producer's record ID |
producerNpn | String | The producer's NPN |
phoneId | UUID | Unique identifier for the deleted phone record |
{
"id": "whe_01je7babqteg8v9p30k8zpg3ga",
"type": "id.producer.phone.deleted",
"data": {
"producerId": "18de9286-2ad9-4b83-96c7-6d4d63a085b0",
"producerNpn": "123456",
"phoneId": "18de9286-2ad9-4b83-96c7-6d4d63a085b0"
}
}
Subscribing to Events
When registering your endpoint in the Svix webhook portal, subscribe to the id high-level event group to receive all producer profile events, or subscribe to specific event types if you only need a subset.
See the Webhooks Quick Start Guide for step-by-step registration instructions.
Processing Recommendations
- Use
idfor deduplication — if an event is retried, theidstays the same. Store processed event IDs to avoid duplicate processing. - Respond quickly — your endpoint must return
2xxwithin 5 seconds. Offload heavy processing to a queue or background job. - Validate signatures — verify the
webhook-signatureheader against your signing secret before processing. See Webhooks Quick Start Guide for details. - Log all receipts — log the full event payload and
idbefore processing so you can replay or debug later. - Use
updatedAtfor ordering — if you receive multiple events for the same resource in quick succession, usedata.updatedAtto determine the most recent state.