Skip to main content
Contacts represent the people in your CRM — leads, customers, prospects, and anyone else captured by your agents or imported from another system. Every contact belongs to a specific agent (bot_id) and inherits the workspace from your API key.

The Contact object

string
Unique contact identifier.
string
The workspace this contact belongs to.
string
The agent that owns this contact.
string | null
string | null
array
Array of { email, is_primary } objects. The first item is treated as primary if no is_primary flag is set.
array
Array of { phone_number, is_primary } objects.
string | null
Free-text company name. Use company_id to link to a structured Company record.
string | null
Foreign key to a Company.
string | null
string | null
string[]
number | null
Estimated deal value as a number (currency assumed to match workspace settings).
string | null
Current stage in a sales pipeline.
string | null
Free-form classification (e.g. "lead", "customer").
string | null
string | null
string | null
string | null
string | null
string | null
string | null
string | null
object
Workspace-defined custom fields, stored as a free-form JSON object.
string | null
ISO 8601 timestamp of the most recent activity.
string
ISO 8601 timestamp.
string
ISO 8601 timestamp.

List contacts

GET
GET /api/v1/contacts
Returns a paginated list of contacts in the workspace.

Query parameters

Example


Get contact by email

GET
GET /api/v1/contacts/by-email
Looks up a single contact by primary email address. Returns 404 not_found if no contact matches.

Query parameters

Example


Get a contact

GET
GET /api/v1/contacts/{id}

Example


Create a contact

POST
POST /api/v1/contacts
Requires a key with the write scope.

Body fields

Example


Update a contact

PATCH
PATCH /api/v1/contacts/{id}
Updates the listed fields and leaves everything else untouched. Same fields as Create a contact, except bot_id cannot be changed.

Example


Delete a contact

DELETE
DELETE /api/v1/contacts/{id}
Returns 204 No Content with an empty body on success.

Example

Deletion is permanent — there’s no undo.

Bulk upsert contacts

POST
POST /api/v1/contacts/upsert
Insert or update up to 200 contacts in a single request. Each input contact is matched against existing contacts in this order:
  1. Primary email (if provided)
  2. Primary phone number (if no email match)
If a match is found, the existing contact is updated. If not, a new contact is created.

Body fields

Example

Response

Contact[]
Contacts that were newly inserted.
Contact[]
Contacts that matched an existing record and were updated.
array
Per-row failures as { index, message }. The numeric index is the position of the failing item in the input contacts array. The rest of the batch still succeeds.
Upsert counts as a single write against your rate limit regardless of how many contacts are in the batch — much more efficient than a loop of POST /contacts calls.