Skip to main content

Contacts API

Create, update, and manage your contact directory Base path: /api/v1/contacts Endpoint count: 26

List contacts

GET /api/v1/contacts/
Retrieve contacts with cursor-based pagination, search, and filtering.
string
Opaque cursor for the next page (from previous response meta.pagination.cursor)
integer
Number of items per page (1–200, default 25)
Free-text search across name, phone, email
string
Filter by lifecycle stage
string
Filter by country code
string
Comma-separated tag filter
boolean
Only contacts with a phone number
boolean
Only contacts with an email address
string
Created after this date
string
Created before this date

Get a contact by ID

GET /api/v1/contacts/{id}
Retrieve a single contact by its ID. Returns the full contact record — identifiers, profile fields, tags, lifecycle stage, and custom attributes — with any redacted fields following your workspace’s PII-visibility rules. Responds with 404 when no contact matches the ID.
string
required
Contact ID

Get the enabled frequency-cap config rule rows (grouped_by_channel + global_caps) that apply to a contact

GET /api/v1/contacts/{id}/frequency-caps
string
required

Unified customer-journey timeline for a contact

GET /api/v1/contacts/{id}/journey
string
required

Export the contact journey timeline as CSV

GET /api/v1/contacts/{id}/journey.csv
string
required

Predictive next-best-action suggestions for a contact

GET /api/v1/contacts/{id}/next-best-action
string
required

List notes for a contact

GET /api/v1/contacts/{id}/notes
string
required

GET /api/v1/contacts/{id}/preferences
string
required

Customer 360 unified profile for a contact

GET /api/v1/contacts/{id}/profile
string
required

Unified chronological contact timeline (messages + calls + tickets + events)

GET /api/v1/contacts/{id}/timeline
string
required

List currently-blocked contacts (audit #INX-F-011).

GET /api/v1/contacts/blocked

List recent contact import jobs

GET /api/v1/contacts/import-jobs

Download skipped-rows CSV for a contact import job

GET /api/v1/contacts/import-jobs/{id}/skipped.csv
string
required

Create a contact

POST /api/v1/contacts/
Create a new contact. At least one of phone or email is required.
string
Phone number in international (E.164) format, e.g. +14155552671. Display formats (+1 (415) 555-1234) and PBX-extension suffixes (+14155551234 x1234) are accepted and normalized server-side to E.164 before insert. Optional when an email (or other identifier) is supplied — a blank/empty string is treated as omitted; a non-empty value must be at least 3 characters (the E.164 floor).
string
Email address
string
First name
string
Last name
string
Display name
string
Company or organization
string
ISO 3166-1 alpha-2 country code
string
IANA timezone identifier
string
ISO 639-1 language code
string[]
Contact tags
object
Custom attributes

Block a contact. Outbound sends are rejected; inbound still arrives.

POST /api/v1/contacts/{id}/block
Blocking a contact only stops outbound messages: any send to a blocked contact is rejected with CONTACT_BLOCKED. Inbound messages from a blocked contact continue to arrive as normal — they are not auto-routed to a Spam folder and their conversation folder is not changed. If content looks like spam, the inbound classifier may add a “Suspected spam” badge for your agents to review, but no routing or folder move happens automatically.
string
required

Create a note on a contact

POST /api/v1/contacts/{id}/notes
string
required
Contact ID
string
required
Note content (1-10000 characters)
boolean
Whether the note should be pinned (default: false)

Unblock a contact.

POST /api/v1/contacts/{id}/unblock
string
required

Bulk contact actions

POST /api/v1/contacts/actions
string (enum: tag|untag|stage_change|delete|add_to_list)
required
Action to apply to all contacts in the request
string[]
required
Array of contact IDs to apply the action to (1-10000 items)
string
Tag name (required when action is tag or untag; 1-50 characters)
string (enum: lead|contacted|prospect|in_progress|active|customer|re_engagement|inactive|churned|archived)
Lifecycle stage to move contacts to (required when action is stage_change)
string
Contact list ID (required when action is add_to_list)

Bulk import contacts

POST /api/v1/contacts/bulk
Import up to 10,000 contacts in a single request. Each contact must have at least a phone (E.164-ish) or email. Returns inserted/skipped counts plus an import_batch_id that can be used to download the skipped-rows CSV (GET /import-jobs/{id}/skipped.csv) and to roll back within 24 hours.
object[]
required
object[]
object[]
integer

Bulk delete contacts (soft delete)

POST /api/v1/contacts/bulk-delete
string[]
required
Array of contact IDs to delete (soft delete, 1-1000 items)

Export contacts

POST /api/v1/contacts/export

Update a contact

PUT /api/v1/contacts/{id}
Update an existing contact. Send only the fields you want to change — omitted fields are left untouched. For phone, email, and country_code, send null (or an empty string) to clear the stored value. Returns the updated contact.
string
required
Contact ID
string
Phone number in E.164 format, e.g. +14155552671. Send null or an empty string to clear it.
string
Email address. Send null or an empty string to clear it.
string
First name (max 100 characters).
string
Last name (max 100 characters).
string
Display name (max 200 characters).
string
Company or organization (max 200 characters).
string
ISO 3166-1 alpha-2 country code. Send null or an empty string to clear it.
string
IANA timezone identifier.
string
ISO 639-1 language code.
string[]
Contact tags (max 50).
string (enum: lead|contacted|prospect|in_progress|active|customer|re_engagement|inactive|churned|archived)
Lifecycle stage. Moving an archived contact to another stage also requires unarchive: true.
object
Custom attributes.

Update a contact note

PATCH /api/v1/contacts/{id}/notes/{noteId}
string
required
string
required

Delete a contact

DELETE /api/v1/contacts/{id}
Delete a contact by its ID. This is a soft delete — the contact is removed from your active directory. Responds with 204 No Content on success.
string
required
Contact ID

Delete a contact note

DELETE /api/v1/contacts/{id}/notes/{noteId}
string
required
string
required

Revert a contact merge

POST /api/v1/contacts/unmerge/{mergeId}
Reverse a contact merge within a 30-minute window using the merge_id returned by the merge that folded the contacts together. Within the window the folded-in contacts are restored and the response returns restored_primary_id, the list of restored_secondary_ids that were brought back, undo_path: "fast", and age_seconds (how long after the merge the revert ran). After 30 minutes this endpoint no longer reverts the merge and responds with 410 (UNDO_EXPIRED). To revert an older merge, contact support for the 30-day manual revert path. Other error responses:
  • 404 (UNDO_NOT_FOUND) — no undo record exists for this mergeId (for example, a merge made before fast-undo was available, or one that has already been rolled off the window).
  • 410 (UNDO_ALREADY_USED) — the merge has already been reverted.
  • 422 (DEDUP_FAILED) — the revert could not be completed. Refresh the contact list and retry within the remaining window, or contact support if the problem persists.
string
required
The merge_id of the merge to revert.