Contacts API

Endpoints for listing, creating, updating, assigning and deleting contacts, plus activity timelines and follow-ups.

Contacts

GET/api/contacts

Every contact in the organization.

Auth: SessionPermission: contacts:read

Returns. An array of contacts. Restricted lead visibility narrows this to the caller's assigned leads.

GET/api/contacts/paginated

One page of contacts, with search and filters applied.

Auth: SessionPermission: contacts:read

Query parameters

pagenumber1-based page number. Defaults to 1.
limitnumberRecords per page. Defaults to 10.
searchQuerystringMatches name, company, email or phone.
filtersjsonA JSON array of filter rows. Supported fields: status, source, stage, assignment, assignedTo, month, deals.

Returns. { contacts, totalPages, currentPage }

GET/api/contacts/recents/{limit}

The most recently created contacts.

Auth: SessionPermission: contacts:read

Returns. An array of contacts, newest first.

GET/api/contacts/{contactId}

A single contact.

Auth: SessionPermission: contacts:read

Returns. { contact }

PUT/api/contacts/{contactId}

Update a contact.

Auth: SessionPermission: contacts:write

Body

any contact fieldvariesSend only the fields you are changing.

Returns. The updated contact. The change is recorded on the contact's activity timeline.

DELETE/api/contacts/{contactId}

Delete a contact.

Auth: SessionPermission: contacts:delete
DELETE/api/contacts/bulk-delete

Delete several contacts at once.

Auth: SessionPermission: contacts:delete

Body

(body)*string[]An array of contact ids.

Returns. { deletedCount }

PUT/api/contacts

Bulk import contacts.

Auth: Session — administrators onlyPermission: contacts:write

Body

(body)*Contact[]An array of contacts, each validated the same way the form is, including your organization's required custom fields.

Returns. { success, failed, errors, failures, imported } so partially successful imports report exactly which rows were rejected and why. `failures` gives a { row, reason } entry per rejected row, numbered against the array you sent.

GET/api/contacts/{contactId}/activity

The activity timeline for a contact.

Auth: SessionPermission: contacts:read

Returns. Entries describing what changed, who changed it and when — covering created, updated, deleted, assigned, unassigned and enquiry_added, for both the contact and its deals.

POST/api/contacts/{contactId}/assign

Assign a contact to a team member.

Auth: SessionPermission: team:write

Body

assignedTo*stringThe id of the member to assign the contact to.

Returns. The updated contact. The assignee is notified.

DELETE/api/contacts/{contactId}/assign

Remove the current assignment.

Auth: SessionPermission: team:write
GET/api/contacts/refresh-state

A lightweight signal the interface uses to tell whether the contact list has changed.

Auth: SessionPermission: contacts:read

Follow-ups

GET/api/contacts/{contactId}/followups

Follow-ups scheduled for a contact.

Auth: Session

Returns. An array of follow-ups with their due date, message and status.

POST/api/contacts/{contactId}/followups

Schedule a follow-up.

Auth: Session

Body

dueAt*stringWhen the reminder is due, as an ISO date.
message*stringThe reminder text.

Returns. The created follow-up, starting in the pending state.

PUT/api/contacts/{contactId}/followups/{followupId}

Update a follow-up, for example to reschedule it or mark it completed.

Auth: Session
PATCH/api/contacts/{contactId}/followups/{followupId}

Mark a pending follow-up done, dismiss it, or snooze it.

Auth: Session

Body

action*stringdone, dismiss or snooze. Done and dismiss count as activity on the lead.
daysnumberFor snooze: 1, 3 or 7. The follow-up moves to 9:00 AM IST that many days from today.

Returns. The updated follow-up.

DELETE/api/contacts/{contactId}/followups/{followupId}

Delete a follow-up.

Auth: Session
GET/api/followups/dashboard

Follow-ups for the dashboard.

Auth: SessionPermission: contacts:read

Returns. { upcoming, recentProcessed }. Automatic follow-ups have source "auto", a reason and an owner.

GET/api/dashboard/priority-leads

Leads ranked by open deal value and recent team activity.

Auth: SessionPermission: contacts:read

Returns. { leads, goingCold, windowDays, goingColdDays }. Accepts ?limit= (default 8, max 50).