Lists and contact upload
Create dialer lists and upload contacts through the Public API.
Use list endpoints when an external system needs to create a Sonik dialer list and add contacts to it.
The flow is:
- Call
GET /usersand choose the workspace user who should own the list. - Call
POST /listswith anameand that user'sownerUserId. - Call
POST /lists/{listId}/contactswith contacts to add to the list. - Call
DELETE /lists/{listId}/contactswith anemailorphoneNumberquery parameter to remove contacts from the list. - Call
GET /listslater to verify list metadata and current prospect count. - Call
DELETE /lists/{listId}when the list is no longer needed.
Clients do not send workspaceId. The API key determines the workspace for every list and contact upload.
Create a List
POST /lists creates an empty dialer list in the authenticated workspace.
Request body:
{
"name": "September outbound list",
"ownerUserId": "22222222-2222-4222-8222-222222222222"
}ownerUserId must be an existing non-deleted user in the same workspace as the API key. Use GET /users to discover valid user IDs.
Response body:
{
"list": {
"id": "11111111-1111-4111-8111-111111111111",
"name": "September outbound list",
"source": "CSV",
"ownerUserId": "22222222-2222-4222-8222-222222222222",
"createdAt": "2026-09-07T09:00:00.000Z",
"updatedAt": "2026-09-07T09:00:00.000Z",
"prospectsCount": 0
}
}Upload Contacts
POST /lists/{listId}/contacts adds up to 100 contacts per request.
Request body:
{
"contacts": [
{
"firstName": "Alex",
"lastName": "Morgan",
"phoneNumber": "+49 151 12345678",
"email": "[email protected]",
"companyName": "Example GmbH",
"companyDomain": "example.com",
"jobTitle": "Head of Sales",
"linkedinUrl": "https://www.linkedin.com/in/alex-morgan",
"customProperties": {
"Favorite tool": "Apollo",
"Customer tier": "Enterprise"
}
}
]
}Each contact must include at least one supported field. Supported standard fields are firstName, lastName, phoneNumber, email, companyName, companyDomain, jobTitle, and linkedinUrl. A contact with at least one non-empty customProperties entry is also accepted without a standard field.
customProperties is an optional object containing string values. Property names and values are trimmed, blank values are ignored, and property names are case-sensitive. These properties are available as filters on the uploaded list and are displayed as read-only fields whenever the contact's battle card is opened, regardless of whether the active context is a manual, CSV, HubSpot, or Salesforce list.
Response body:
{
"listId": "11111111-1111-4111-8111-111111111111",
"acceptedContacts": 1,
"totalProspects": 1
}The upload endpoint reuses existing workspace prospects when a safe email or phone match already exists. Incoming custom properties are merged into the existing prospect, with incoming values taking precedence for matching property names. If a LinkedIn URL conflicts with the existing matched prospect, Sonik creates a separate prospect instead.
Remove Contacts
DELETE /lists/{listId}/contacts removes contacts from a dialer list by email or phone number.
Send exactly one query parameter:
| Parameter | Description |
|---|---|
email | Email address to match case-insensitively. |
phoneNumber | Raw or normalized phone number to match. |
Examples:
DELETE /lists/11111111-1111-4111-8111-111111111111/[email protected]
DELETE /lists/11111111-1111-4111-8111-111111111111/contacts?phoneNumber=%2B49%20151%2012345678Response body:
{
"listId": "11111111-1111-4111-8111-111111111111",
"removedContacts": 1,
"totalProspects": 0
}If no attached contact matches the identifier, the endpoint returns removedContacts: 0. Removing a contact detaches it from the selected list only; it does not delete the workspace prospect record or remove it from other lists.
Delete a List
DELETE /lists/{listId} deletes the list and detaches all contacts from it. Contact records are preserved.
The endpoint returns 204 No Content after deletion.
List Existing Lists
GET /lists returns dialer lists newest first.
| Parameter | Default | Allowed values |
|---|---|---|
page | 1 | Positive integer |
pageSize | 50 | 50 or 100 |
Use the API Reference for complete schemas, response headers, and error details.
Updated 23 days ago
