Contact lists
Who to call, and what the platform knows about them.
A contact list carries its own schema. You declare the fields once, and every contact imported into the list is checked against them, so a campaign reading memberId can rely on it being there.
A field is { fieldName, displayName, dataType, isRequired }. dataType is one of string, number, boolean, date, object or array. Every list also has two system fields, phoneNumber and fullName: always present, always required, and not yours to remove or demote. Only their displayName can change.
Contacts go in through /api/v1/contact-lists/{id}/contacts (see Contacts). Imports run in the background and are tracked as an import job.
List contact lists#
Every contact list in the key's organization that the key can read. Not paginated.
/api/v1/contact-listsResponses
The contact lists.
curl -X GET "https://voice.evryhealth.com/api/v1/contact-lists" \-H "Authorization: Bearer YOUR_API_KEY"
{"contactLists": [{"id": "6d1f3c2a-8b4e-4f7a-9c1d-2e5b7a9f0c13","name": "Healthcare Providers","description": "Q1 outreach","totalContacts": 500,"status": "active","schema": {"fields": [{"fieldName": "phoneNumber","displayName": "Phone Number","dataType": "string","isRequired": true,"isSystem": true},{"fieldName": "fullName","displayName": "Full Name","dataType": "string","isRequired": true,"isSystem": true},{"fieldName": "memberId","displayName": "Member ID","dataType": "string","isRequired": true,"isSystem": false},{"fieldName": "renewalDate","displayName": "Renewal date","dataType": "date","isRequired": false,"isSystem": false}]},"createdAt": "2026-01-15T10:30:00.000Z","updatedAt": "2026-01-20T08:00:00.000Z"}]}
Create a contact list#
Creates a list with the fields you declare. `phoneNumber` and `fullName` are added as required system fields; declaring them yourself has no effect.
/api/v1/contact-listsBody
application/jsonname- string
- required
description- string
schema- { fields: { fieldName, displayName, dataType, isRequired? }[] }
- required
Responses
The created list.
curl -X POST "https://voice.evryhealth.com/api/v1/contact-lists" \-H "Authorization: Bearer YOUR_API_KEY" \-H "Content-Type: application/json" \-d '{"name": "Healthcare Providers","description": "Q1 outreach","schema": {"fields": [{"fieldName": "memberId","displayName": "Member ID","dataType": "string","isRequired": true},{"fieldName": "renewalDate","displayName": "Renewal date","dataType": "date"}]}}'
{"id": "6d1f3c2a-8b4e-4f7a-9c1d-2e5b7a9f0c13","name": "Healthcare Providers","description": "Q1 outreach","totalContacts": 0,"status": "active","schema": {"fields": [{"fieldName": "phoneNumber","displayName": "Phone Number","dataType": "string","isRequired": true,"isSystem": true},{"fieldName": "fullName","displayName": "Full Name","dataType": "string","isRequired": true,"isSystem": true},{"fieldName": "memberId","displayName": "Member ID","dataType": "string","isRequired": true,"isSystem": false},{"fieldName": "renewalDate","displayName": "Renewal date","dataType": "date","isRequired": false,"isSystem": false}]},"createdAt": "2026-01-15T10:30:00.000Z","updatedAt": "2026-01-20T08:00:00.000Z"}
Get a contact list#
One list, with its schema and how many contacts it holds.
/api/v1/contact-lists/{id}Path parameters
idstringrequired- Contact list id.
Responses
The contact list.
curl -X GET "https://voice.evryhealth.com/api/v1/contact-lists/{id}" \-H "Authorization: Bearer YOUR_API_KEY"
{"id": "6d1f3c2a-8b4e-4f7a-9c1d-2e5b7a9f0c13","name": "Healthcare Providers","description": "Q1 outreach","totalContacts": 500,"status": "active","schema": {"fields": [{"fieldName": "phoneNumber","displayName": "Phone Number","dataType": "string","isRequired": true,"isSystem": true},{"fieldName": "fullName","displayName": "Full Name","dataType": "string","isRequired": true,"isSystem": true},{"fieldName": "memberId","displayName": "Member ID","dataType": "string","isRequired": true,"isSystem": false},{"fieldName": "renewalDate","displayName": "Renewal date","dataType": "date","isRequired": false,"isSystem": false}]},"createdAt": "2026-01-15T10:30:00.000Z","updatedAt": "2026-01-20T08:00:00.000Z"}
Update the schema#
Replaces the list's fields with the ones you send, so send the whole schema: the simplest way is to edit the fields `get` returned and send them back. `phoneNumber` and `fullName` stay system fields whether or not you include them, and `isSystem` in the request is ignored. Once a list has contacts, removing a required field is rejected. Existing contacts are not rewritten to match. Refused with 409 while an import is running into the list.
/api/v1/contact-lists/{id}/schemaPath parameters
idstringrequired- Contact list id.
Body
application/jsonfields- { fieldName, displayName, dataType, isRequired? }[]
- required
Responses
The list with its new schema.
curl -X PATCH "https://voice.evryhealth.com/api/v1/contact-lists/{id}/schema" \-H "Authorization: Bearer YOUR_API_KEY" \-H "Content-Type: application/json" \-d '{"fields": [{"fieldName": "phoneNumber","displayName": "Mobile","dataType": "string"},{"fieldName": "memberId","displayName": "Member ID","dataType": "string","isRequired": true},{"fieldName": "renewalDate","displayName": "Renewal date","dataType": "date"},{"fieldName": "planTier","displayName": "Plan tier","dataType": "string"}]}'
{"id": "6d1f3c2a-8b4e-4f7a-9c1d-2e5b7a9f0c13","name": "Healthcare Providers","description": "Q1 outreach","totalContacts": 500,"status": "active","schema": {"fields": [{"fieldName": "phoneNumber","displayName": "Mobile","dataType": "string","isRequired": true,"isSystem": true},{"fieldName": "fullName","displayName": "Full Name","dataType": "string","isRequired": true,"isSystem": true},{"fieldName": "memberId","displayName": "Member ID","dataType": "string","isRequired": true,"isSystem": false},{"fieldName": "renewalDate","displayName": "Renewal date","dataType": "date","isRequired": false,"isSystem": false},{"fieldName": "planTier","displayName": "Plan tier","dataType": "string","isRequired": false,"isSystem": false}]},"createdAt": "2026-01-15T10:30:00.000Z","updatedAt": "2026-01-20T08:00:00.000Z"}