Skip to content
Pathbound DOCS

Contacts API

Contacts represent people in your Pathbound CRM. Each contact has a unified profile, an event timeline, conversation history, and a list of notes. Contacts can be associated with a company, targeted by agents, and grouped by segments.

POST /v1/contacts

Required scope: contacts:write

FieldTypeRequiredDescription
emailstringyesContact email address (must be unique).
propertiesobjectnoArbitrary key-value properties for the contact.
visitor_idstring | string[]noWebsite visitor ID(s) from the tracker to associate.
{
"status": "success",
"contact": { /* contact object */ }
}

Returns 409 Conflict if a contact with the same email already exists.


GET /v1/contacts

Required scope: contacts:read

ParameterTypeDefaultDescription
pagenumber1Page number.
limitnumber20Results per page (1–100).
statusstringFilter: enriched or not_enriched.
lifecycle_stagestringFilter by lifecycle stage (lead, prospect, mql, sql, opportunity, customer, evangelist, subscriber, other).
lead_statusstringFilter by lead status.
countrystringFilter by country.
industrystringFilter by industry.
citystringFilter by city.
statestringFilter by state/region.
job_titlestringFilter by job title (case-insensitive match).
has_linkedinbooleanFilter contacts with/without a LinkedIn profile.
company_idstringFilter by associated company ID.
created_afterstringOnly contacts created after this ISO 8601 date.
created_beforestringOnly contacts created before this ISO 8601 date.
searchstringFree-text search across name, email, company, job title.
sort_bystringField to sort by (email, firstname, lastname, company, createdate).
sort_dirstringdescSort direction (asc or desc).
count_onlybooleanfalseIf true, return only { count } — no records.
fieldsstringSet to summary for a compact ~200 byte/contact response.
{
"status": "success",
"contacts": [ /* contact objects */ ],
"pagination": {
"page": 1,
"limit": 20,
"total_pages": 5,
"total_items": 100
}
}

For a “how many” question, prefer count_only=true. For multi-entity lookups, use the batch API instead of paginating with filters.


GET /v1/contacts/:contact_id

Required scope: contacts:read

Returns the contact along with its unified profile, recent actions, and recent events.

{
"status": "success",
"contact": { /* contact object */ },
"unified_profile": { /* profile data */ },
"actions": [ /* recent actions */ ],
"events": [ /* recent events */ ]
}

PUT /v1/contacts/:contact_id

Required scope: contacts:write

FieldTypeRequiredDescription
propertiesobjectnoProperties to update or add (merge).
visitor_idstring | string[]noVisitor ID(s) to associate.

To change a contact’s lifecycle stage, set properties.lifecyclestage to one of the allowed values. For audited stage transitions (with a reason), use the update_lifecycle_stage action — see Actions.

lead, prospect, mql, sql, opportunity, customer, evangelist, subscriber, other.


DELETE /v1/contacts/:contact_id

Required scope: contacts:write

Permanently removes the contact and its notes. Events and actions remain in the audit log.


GET /v1/contacts/events/:contact_id

Required scope: contacts:read

Returns all events associated with a contact. For aggregate event queries (across many contacts), use the Events API directly.

ParameterTypeDefaultDescription
event_typestringFilter by event type.
sort_dirstringdescSort direction (asc or desc).
{
"status": "success",
"events": [ /* event objects */ ]
}

GET /v1/contacts/:contact_id/conversations

Required scope: contacts:read

Returns the contact’s email (Gmail) and Intercom conversation history.

ParameterTypeDefaultDescription
include_messagesbooleanfalseInclude the full message bodies, not just thread metadata.
messages_per_threadnumber5Max messages per thread when include_messages=true.
limitnumber20Total threads to return.

GET /v1/contacts/:contact_id/email-threads

Required scope: contacts:read

Returns a compact list of Gmail threads for the contact. Use this when drafting a follow-up via the Actions API: pass the returned thread_id into email_message action params to keep the message in the existing thread.


Each contact can have an unlimited list of free-form notes. Notes are written directly (no approval flow) and are visible to anyone with contacts:read.

GET /v1/contacts/:contact_id/notes

Required scope: contacts:read

POST /v1/contacts/:contact_id/notes

Required scope: contacts:write

FieldTypeRequiredDescription
contentstringyesNote body (markdown).
PATCH /v1/contacts/:contact_id/notes/:note_id

Required scope: contacts:write

DELETE /v1/contacts/:contact_id/notes/:note_id

Required scope: contacts:write