Skip to main content
GET
Get Many Contacts

Query modes

This endpoint supports the following query modes: A request uses one lookup at most: idsOrEmails takes precedence over crmIds. A lookup ignores the search filters and the pagination.

Response shapes

  • A lookup (idsOrEmails, crmIds) returns full Contact objects: fields under fields, campaigns with their lead id, and crmSync when the contact has a record in the connected CRM.
  • The list returns ContactListItem objects.
When nothing matches, idsOrEmails answers 404 and crmIds answers 200 with an empty array.

Finding a contact from your CRM

Use crmIds (up to 100, comma-separated) with the record ids of your connected CRM, for example GET /contacts?crmIds=123456789 with a HubSpot contact id; for Salesforce, pass the 18-character Contact or Lead id. Each contact found carries the matched id under crmSync.crmRecordId; ids that match nothing are skipped.

Filtering by contact list

Use the listId parameter to retrieve contacts belonging to a specific list. Get valid list IDs from GET /contacts/lists. You can combine listId with search or email to further narrow results within a list.

Filtering contacts not in any campaign

Use notInAnyCampaign=true to find contacts that are not part of any campaign (orphan contacts). This can be used alone or combined with other filters like search, email, or listId.

Authorizations

Authorization
string
header
required

Basic authentication header of the form Basic <encoded-value>, where <encoded-value> is the base64-encoded string username:password.

Query Parameters

idsOrEmails
string

A comma separated string of either valid contact IDs (MongoDB ObjectId) or valid email addresses. Optional — when omitted, returns the paginated list of all contacts of the team. Maximum 100 values.

crmIds
string

Comma-separated record ids of contacts in the CRM connected to the team (HubSpot, Salesforce, or Pipedrive); for Salesforce, the 18-character Contact or Lead id. Returns an array of the contacts found, each with the matched id under crmSync.crmRecordId; ids that match nothing are skipped, and the array is empty when no CRM is connected. Duplicates are removed; an empty value is ignored. Maximum 100 values (TOO_MANY_CRM_IDS); a value over 25 characters answers INVALID_CRM_ID. Ignored when idsOrEmails is provided.

Search contacts by name or other text fields. Must be at least 2 characters.

email
string<email>

Search contacts by exact email address.

listId
string

Filter contacts by contact list ID (clt_xxx format). Can be combined with search or email, or used alone to list all contacts in a list. Get valid IDs from GET /contacts/lists.

Pattern: ^clt_[a-zA-Z0-9]+$
notInAnyCampaign
boolean

When set to true, only returns contacts that are not part of any campaign (orphan contacts). Can be used alone or combined with other filters such as search, email, or listId.

companyId
string

Filter contacts by attached company ID (cpn_xxx format). Use this when you already know the lemlist company id (for example after fetching GET /companies?crmSyncStatus=unique_index_error_company). Mutually exclusive with companyDomain, companyLinkedinUrl, and companySalesnavUrl.

Pattern: ^cpn_[a-zA-Z0-9]+$
companyDomain
string

Filter contacts by their company's website domain. Resolved to a companyId against the Companies collection. If no company matches, the endpoint returns an empty list (total: 0). Mutually exclusive with the other company* filters.

companyLinkedinUrl
string

Filter contacts by their company's LinkedIn URL. Resolved to a companyId against the Companies collection. If no company matches, the endpoint returns an empty list (total: 0). Mutually exclusive with the other company* filters.

companySalesnavUrl
string

Filter contacts by their company's LinkedIn Sales Navigator URL. Resolved to a companyId against the Companies collection. If no company matches, the endpoint returns an empty list (total: 0). Mutually exclusive with the other company* filters.

withPrimaryCompany
boolean

When set to true, only returns contacts linked to a company; when set to false, only returns contacts without a company. Omit for no filter. Mutually exclusive with the company* filters (companyId, companyDomain, companyLinkedinUrl, companySalesnavUrl).

fieldRejectionReason
enum<string>

Filter contacts to those carrying a field rejection with this reason — a value lemlist refused to write, prefixed by its origin (enrichment_* while enriching, crm_sync_* during CRM sync). Returns an empty list (total: 0) when no contact matches. Each returned contact exposes the full detail under fieldRejections[] (which field, why, and conflictingRecordId for duplicates). Only applies to the paginated list — ignored when idsOrEmails is provided (that path returns the exact contacts requested, unfiltered).

Available options:
enrichment_duplicate_linkedin_url,
enrichment_duplicate_linkedin_url_sales_nav,
enrichment_duplicate_email,
crm_sync_duplicate_linkedin_url,
crm_sync_duplicate_linkedin_url_sales_nav,
crm_sync_invalid_linkedin_url,
crm_sync_invalid_url,
crm_sync_invalid_email,
crm_sync_invalid_phone,
crm_sync_linkedin_url_not_contact,
crm_sync_duplicate_contact_blocked,
crm_sync_duplicate_company_blocked,
crm_sync_company_data_rejected,
crm_sync_unsub_state_protected,
crm_sync_value_oscillating,
crm_sync_owner_sync_loop,
crm_sync_unmapped_user,
crm_sync_value_incompatible,
crm_sync_unknown_error
limit
integer
default:100

Maximum number of contacts to return (1–500). Defaults to 100.

Required range: 1 <= x <= 500
offset
integer
default:0

Number of contacts to skip for pagination. Defaults to 0.

Required range: x >= 0

Response

Success. When using idsOrEmails or crmIds, returns an array of contacts (empty when no crmIds value matches). Otherwise, returns a paginated object with data (ContactListItem items), total, limit, and offset.

A contact record in your CRM, as the lookups (GET /contacts?idsOrEmails=, GET /contacts?crmIds=, GET /contacts/{idOrEmail}) return it. Not to be confused with a lead which is a contact specifically added to a campaign.

_id
string

Unique contact identifier

teamId
string

Team identifier the contact belongs to

fullName
string

Contact's calculated full name

email
string<email>

Contact's primary email address

fields
object

Contact fields, standard (firstName, lastName, phone, jobTitle...) and custom

campaigns
object[]

List of campaigns the contact is associated with

linkedinUrl
string

Contact's LinkedIn profile URL

linkedinUrlSalesNav
string

Contact's LinkedIn Sales Navigator URL

ownerId
string

ID of the user who owns this contact

createdAt
string<date-time>

Contact creation timestamp

createdBy
string

ID of the user who created the contact

unsubscribed
boolean

Whether the contact is globally unsubscribed. When true, no outreach will be sent to this contact.

phonesStatuses
object[]

Verification status of each verified phone number.

crmSync
object

CRM sync status for the contact, resolved against the team's active CRM provider (Hubspot, Salesforce, or Pipedrive). Only present when a CRM is connected and the contact has a record in it. crmRecordId maps a crmIds lookup back to the ids sent.

fieldRejections
object[]

Values lemlist refused to write on this contact, each with its reason. Empty when none. Filter the list endpoint to only flagged contacts via GET /contacts?fieldRejectionReason=....