Skip to main content
A contact list holds the phone numbers a campaign calls. You build a list by uploading a CSV file: create the list to get a presigned upload URL, upload the file, wait for validation, then confirm the upload to import the contacts.

Base URL

These endpoints are served under the public /v1 prefix.

Authentication

Every request requires a workspace API key in the X-API-Key header.

Endpoints

List contact lists

GET /v1/calls/contact-lists — page through contact lists.

Create contact list

POST /v1/calls/contact-lists — create a list and get a presigned upload URL.

Get contact list

GET /v1/calls/contact-lists/{id} — retrieve a list and its upload status.

Update contact list

PATCH /v1/calls/contact-lists/{id} — change a list name or type.

Delete contact list

DELETE /v1/calls/contact-lists/{id} — delete a list.

List contact list items

GET /v1/calls/contact-lists/{id}/items — page through the phone numbers in a list.

Create upload URL

POST /v1/calls/contact-lists/{id}/get-presign-url — get a presigned URL for a new file.

Confirm upload

POST /v1/calls/contact-lists/{id}/uploads/{uploadID}/confirm — import a validated upload.

Stream upload status

GET /v1/calls/contact-lists/{id}/uploads/{uploadID}/events — follow upload progress over SSE.

Upload a contact list

1

Create the list

Send POST /v1/calls/contact-lists with name, type, and the fileName of the CSV you intend to upload. The response returns the new list along with uploadUrl, uploadHeaders, and s3Key, plus an uploadDetails object whose id is the uploadID used by the remaining steps.
2

Upload the file

Send the CSV file directly to uploadUrl, including every header returned in uploadHeaders. This request goes to the storage provider, so do not send your API key with it.
3

Wait for validation

After the file lands, the upload moves through the statuses below. Follow the progress with GET /v1/calls/contact-lists/{id}/uploads/{uploadID}/events, or poll GET /v1/calls/contact-lists/{id} and read uploadDetails.status.
4

Confirm the upload

Once the upload reaches validated, call POST /v1/calls/contact-lists/{id}/uploads/{uploadID}/confirm to import the rows into the list. Confirming before validation completes returns a 409.
To replace or extend the contents of an existing list, start at step 2 by requesting a fresh URL from POST /v1/calls/contact-lists/{id}/get-presign-url.

Contact list fields

Use contacts for the audience a campaign calls and dnd for numbers a campaign must skip.

Upload fields

uploadDetails describes the state of a file upload. metadata reports totalRows, validRows, invalidRows, duplicateRows, and importedRows.

Upload statuses

When validation fails, errorReportUrl points to a report describing the rejected rows.

Track upload progress

GET /v1/calls/contact-lists/{id}/uploads/{uploadID}/events returns a server-sent event stream. Each event carries an eventId, an eventType, the current upload in data, and errorReportUrl when a report is available.
The interactive playground on this page sends a normal request and shows a single event body. Use a client that supports server-sent events to consume the stream.

Pagination and filtering

GET /v1/calls/contact-lists accepts these query parameters. GET /v1/calls/contact-lists/{id}/items accepts page and perPage. Both endpoints return a paged object containing items, page, perPage, totalCount, column, order, and searchText. Each item in a list has a phoneNumber and a metadata object holding the other columns imported from the CSV file.

Errors

Errors return a code and an error message.