Base URL
These endpoints are served under the public
/v1 prefix.Authentication
Every request requires a workspace API key in theX-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.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 acode and an error message.