Events & Payloads
The careCycle webhook event catalog and example payloads for each event.
These are the events careCycle can deliver. When you add an endpoint you can subscribe to all events or only the ones you care about.
| Event | Fires when |
|---|---|
customer.created | A customer is created (manual entry, inbound call, lead capture, or an integration). Bulk CSV imports do not emit this event. |
customer.updated | A customer's details are edited. |
call.completed | A call finishes and its details (transcript, duration, disposition) are finalized. |
Every payload includes a top-level event_type field (e.g.
"customer.created") — switch on it to route events. This matters most for
customer.created and customer.updated, which are otherwise identical in
shape. The same value is also sent as the Svix event type for endpoint-level
subscription filtering.
All IDs are UUIDs, timestamps are ISO 8601, and any field with no value is
null. Phone numbers are E.164.
customer.created
Sent when a new customer record is created. The payload is the full customer object.
{
"event_type": "customer.created",
"id": "b1f7c0e2-3a4d-4e5f-8a9b-0c1d2e3f4a5b",
"createdAt": "2026-06-17T19:07:23.709Z",
"updatedAt": "2026-06-17T19:07:23.709Z",
"externalId": "CRM-48213",
"status": "Lead",
"firstName": "Marcus",
"middleName": null,
"lastName": "Delacroix",
"salutation": null,
"suffix": null,
"preferredName": null,
"phoneNumber": "+13128471928",
"lineType": "mobile",
"email": "marcus.delacroix@example.com",
"dateOfBirth": "1958-04-12",
"language": "en",
"ethnicity": null,
"gender": "Male",
"maritalStatus": "Married",
"address": "4427 Westbrook Ave",
"address2": "Apt 3B",
"city": "Mesa",
"county": "Maricopa",
"state": "AZ",
"postalCode": "85204",
"timezone": "America/Phoenix",
"mbiNumber": "1EG4TE5MK73",
"medicareCard": true,
"medicarePartADate": "2023-05-01",
"medicarePartBDate": "2023-05-01",
"hasMedicaid": false,
"medicaidNumber": null,
"socialSecurityDisability": false,
"veteran": true,
"vaNumber": null,
"householdIncome": 42000,
"annualIncome": 42000,
"filingStatus": "married_joint",
"dependentCount": 0,
"subsidyEligible": true,
"subsidyAmount": 148,
"carrierAssignedCustomerId": null,
"agentName": null,
"agentNpn": null,
"assignedUser": {
"id": "b396018f-7d49-4a55-abe5-544174abcaaa",
"name": "Priya Raman",
"email": "priya@youragency.com",
"npn": "8419302",
"role": "agent",
"licensedStates": ["AZ", "AR"]
},
"doNotCall": false,
"doNotSMS": false,
"doNotEmail": false,
"doNotMail": false,
"testCustomer": false
}Every field below is present on customer.created and customer.updated. Any
field without a value is null.
Identifiers & status
| Field | Type | Description |
|---|---|---|
event_type | string | The webhook event — customer.created or customer.updated. Switch on this to route the event |
id | UUID | careCycle customer ID |
createdAt / updatedAt | ISO 8601 | When the record was created / last updated |
externalId | string | Your own identifier for the customer, if one was provided |
status | enum | Lifecycle status — one of Lead, Active, Inactive |
carrierAssignedCustomerId | string | The carrier's identifier for the customer, if known |
testCustomer | boolean | true for test records — filter these out in production |
Identity & contact
| Field | Type | Description |
|---|---|---|
firstName / middleName / lastName | string | Legal name parts |
salutation / suffix / preferredName | string | Optional name extras |
phoneNumber | string | Primary phone number (E.164) |
lineType | enum | Carrier line type — landline, mobile, fixedVoip, nonFixedVoip, personal, tollFree, premium, sharedCost, uan, voicemail, pager, or unknown |
email | string | Email address |
dateOfBirth | date | YYYY-MM-DD (a date, not a timestamp) |
language | string | ISO 639-1 language code (e.g. en, es) |
ethnicity | string | Free-text ethnicity, if collected |
gender | enum | Male, Female, Non-Binary, Other, or Prefer Not to Say |
maritalStatus | enum | Single, Married, Divorced, Widowed, Separated, or Domestic Partnership |
Address
| Field | Type | Description |
|---|---|---|
address / address2 | string | Street address lines |
city / county / state / postalCode | string | Locality fields; state is the 2-letter US abbreviation |
timezone | string | IANA timezone (e.g. America/Phoenix) |
Medicare & Medicaid
| Field | Type | Description |
|---|---|---|
mbiNumber | string | Medicare Beneficiary Identifier |
medicareCard | boolean | Whether the customer has their Medicare card |
medicarePartADate / medicarePartBDate | date | YYYY-MM-DD Part A / Part B effective dates |
hasMedicaid | boolean | Whether the customer has Medicaid |
medicaidNumber | string | Medicaid ID, if applicable |
socialSecurityDisability | boolean | Receiving SSDI |
veteran | boolean | Veteran status |
vaNumber | string | VA identifier, if applicable |
Financial & subsidy
| Field | Type | Description |
|---|---|---|
householdIncome / annualIncome | integer | Whole US dollars (no cents) |
filingStatus | string | Tax filing status (e.g. single, married_joint, head_of_household) |
dependentCount | integer | Number of dependents |
subsidyEligible | boolean | Eligible for a premium subsidy |
subsidyAmount | integer | Estimated monthly subsidy in whole US dollars |
Assignment
| Field | Type | Description |
|---|---|---|
agentName / agentNpn | string | Externally-supplied agent name and NPN, if provided |
assignedUser | object | The careCycle member assigned to the customer, or null if unassigned. Contains id, name, email, npn, role, and licensedStates (array of 2-letter US state codes) |
Consent flags
| Field | Type | Description |
|---|---|---|
doNotCall / doNotSMS / doNotEmail / doNotMail | boolean | Per-channel contact suppression — respect these before reaching out |
customer.updated
Sent when a customer is edited. The payload is identical in shape to
customer.created and reflects the customer's state after
the update. updatedAt changes on every update.
{
"event_type": "customer.updated",
"id": "b1f7c0e2-3a4d-4e5f-8a9b-0c1d2e3f4a5b",
"updatedAt": "2026-06-18T14:22:09.120Z",
"status": "Active",
"phoneNumber": "+13128471928",
"firstName": "Marcus",
"lastName": "Delacroix",
"...": "all other customer fields, same shape as customer.created"
}call.completed
Sent once a call has finished and its details are finalized. The payload
includes the call outcome, the full transcript and summary, the campaign it
belonged to, and the associated customer (the same object as
customer.created).
{
"event_type": "call.completed",
"id": "dca4a483-af54-4899-a804-766ee5812537",
"createdAt": "2026-06-17T19:07:23.709Z",
"phoneNumber": "+13128471928",
"callSid": "f2a91c0b-7d2e-4c8a-9f31-6b5d0a4e1c77",
"direction": "inbound",
"disposition": "Enrolled",
"durationMs": 247000,
"startTime": "2026-06-17T19:03:16.001Z",
"endTime": "2026-06-17T19:07:23.001Z",
"endedReason": "completed",
"summary": "Caller confirmed eligibility and enrolled in a Medicare Advantage plan effective July 1.",
"transcript": "Agent: Thanks for calling careCycle...\nCaller: Hi, I'd like to review my options...",
"campaign": {
"id": "4f952597-5c04-4d2c-851e-30f518e2c761",
"name": "MA Inbound Receptionist",
"slug": null,
"description": null,
"status": "active",
"vertical": "medicare",
"suite": "receptionist",
"direction": "inbound",
"kind": "voice_ai",
"tags": [],
"startDate": "2026-03-06T00:11:35.256Z",
"endDate": null
},
"customer": {
"id": "b1f7c0e2-3a4d-4e5f-8a9b-0c1d2e3f4a5b",
"...": "full customer object, same shape as customer.created"
}
}| Field | Description |
|---|---|
event_type | The webhook event — always call.completed |
id | careCycle call ID |
phoneNumber | The customer's phone number (E.164) |
direction | inbound or outbound |
disposition | Final outcome of the call |
durationMs | Call duration in milliseconds |
endedReason | Why the call ended (e.g. completed, no-answer) |
summary | AI-generated summary of the call |
transcript | Full call transcript |
campaign | The campaign the call belonged to (null if none) |
customer | The associated customer (null if the call wasn't linked to one) |
call.completed fires for every terminal call — including no-answer, busy,
and failed. Use disposition and endedReason to distinguish outcomes.