Skip to main content
Due to the complexity of advanced filtering, updates may take a few seconds to appear in search results.
The Contacts Search API lets you search for contacts using extensive filtering, sorting, and pagination options.

Endpoint

POST /contacts/search

Request body

ParameterTypeRequiredDescription
locationIdstringYesLocation ID to search within.
pagenumberNoPage number for standard pagination. Do not use with searchAfter.
pageLimitnumberYesResults per page (max 500).
searchAfterarrayNoCursor for pagination beyond 10,000 records. Value returned in each response.
filtersarrayNoFilter criteria — see Filters below.
sortarrayNoSort criteria — see Sort below.
querystringNoFull-text search string (max 75 characters). Runs against searchable fields configured in Custom Field Settings.

Sample request

{
  "locationId": "5DP41231LkQsiKESj6rh",
  "page": 1,
  "pageLimit": 20,
  "filters": [
    { "field": "dnd", "operator": "eq", "value": true },
    {
      "group": "OR",
      "filters": [
        { "field": "firstNameLowerCase", "operator": "eq", "value": "alex" },
        { "field": "lastNameLowerCase", "operator": "eq", "value": "peter" }
      ]
    }
  ],
  "sort": [{ "field": "firstNameLowerCase", "direction": "desc" }],
  "query": "tom"
}

Pagination

Standard pagination (page + pageLimit)

  • Fetches up to 10,000 records total.
  • Maximum 500 records per request.
  • Use page and pageLimit to paginate through results.

Cursor-based pagination (searchAfter + pageLimit)

  • Required for more than 10,000 records.
  • Use the searchAfter value returned in each response as the start point for the next page.
  • Do not include page when using searchAfter.

Filters

Filters can be applied individually or grouped with AND / OR logical operators. Each filter has three components:
  • Field — the contact attribute to filter on.
  • Operator — the comparison to apply.
  • Value — the value to compare against.
By default, all filters in the filters array are combined with AND logic.

Sample filter payload

{
  "filters": [
    {
      "group": "AND",
      "filters": [
        { "field": "firstNameLowerCase", "operator": "contains", "value": "John" },
        { "field": "email", "operator": "exists" }
      ]
    },
    {
      "group": "OR",
      "filters": [
        { "field": "city", "operator": "eq", "value": "New York" },
        { "field": "state", "operator": "eq", "value": "California" }
      ]
    }
  ]
}

Supported operators

OperatorDefinitionValue typeCharacter limit
eqEqualsNumber, String, Boolean75
not_eqNot equalsNumber, String, Boolean75
containsContains (no special characters)String75
not_containsNot contains (no special characters)String75
existsHas a value— (omit value)
not_existsHas no value— (omit value)
rangeRange (gte/lte/gt/lt)Object75

Supported filter fields

Contact information

Display nameField nameSupported operators
Contact IDideq, not_eq
Contact NamecontactNameeq, not_eq, exists, not_exists
Addressaddresseq, not_eq, contains, not_contains, exists, not_exists
Assigned ToassignedToeq, not_eq, exists, not_exists
Business NamebusinessNameeq, not_eq, contains, not_contains, exists, not_exists
Citycityeq, not_eq, contains, not_contains, exists, not_exists
Countrycountryeq, not_eq, exists, not_exists
Company NamecompanyNameeq, not_eq, contains, not_contains, exists, not_exists
Created AtdateAddedrange, exists, not_exists
Updated AtdateUpdatedrange, exists, not_exists
DNDdndeq, not_eq, exists, not_exists
Emailemaileq, not_eq, exists, not_exists
Followersfollowerseq, not_eq, exists, not_exists
First Name (lowercase)firstNameLowerCaseeq, not_eq, contains, not_contains, exists, not_exists
Last Name (lowercase)lastNameLowerCaseeq, not_eq, contains, not_contains, exists, not_exists
Is Valid WhatsAppisValidWhatsappeq, not_eq, exists, not_exists
Last Email ClickedlastEmailClickedDaterange, exists, not_exists
Last Email OpenedlastEmailOpenedDaterange, exists, not_exists
Phonephoneeq, not_eq, contains, not_contains, exists, not_exists
Postal CodepostalCodeeq, not_eq, contains, not_contains, exists, not_exists
Sourcesourceeq, not_eq, contains, not_contains, exists, not_exists
Statestateeq, not_eq, contains, not_contains, exists, not_exists
Tagstagseq, not_eq, contains, not_contains, exists, not_exists
Timezonetimezoneeq, not_eq, exists, not_exists
Contact Typetypeeq, not_eq, exists, not_exists
Is Valid EmailvalidEmaileq, not_eq, exists, not_exists
Websitewebsiteeq, not_eq, exists, not_exists
Date of BirthdateOfBirthrange, exists, not_exists

Contact activity

Display nameField nameSupported operators
Last AppointmentlastAppointmentrange, exists, not_exists
Workflow (Active)activeWorkflowseq, not_eq, exists, not_exists
Workflow (Finished)finishedWorkflowseq, not_eq, exists, not_exists

Opportunity (nested filter)

Display nameField + Sub-fieldOperators
Pipelineopportunities + pipelineIdeq, not_eq, exists, not_exists
Pipeline Stageopportunities + pipelineStageIdeq, not_eq, exists, not_exists
Pipeline Statusopportunities + statuseq, not_eq, exists, not_exists

Custom fields

Field typeField name formatOperators
Text, Large Text, Single Option, Radio, PhonecustomFields.{custom_field_id}eq, not_eq, contains, not_contains, exists, not_exists
Checkbox, Multiple OptionscustomFields.{custom_field_id}eq, not_eq, exists, not_exists
Numerical, MonetarycustomFields.{custom_field_id}range, eq, not_eq, exists, not_exists
DatecustomFields.{custom_field_id}range, exists, not_exists
Textbox ListcustomFields.{field_id}.{option_id}eq, not_eq, contains, not_contains, exists, not_exists

Sort

You can combine up to 2 sort criteria.
[
  { "field": "dateAdded", "direction": "desc" },
  { "field": "firstNameLowerCase", "direction": "asc" }
]

Supported sort fields

Display nameField name
First Name (lowercase)firstNameLowerCase
Last Name (lowercase)lastNameLowerCase
Business NamebusinessName
Date CreateddateAdded
Date UpdateddateUpdated
Emailemail
DNDdnd
Sourcesource
Last modified on March 7, 2026