curl --request GET \
--url https://api.lemlist.com/api/companies \
--header 'Authorization: Basic <encoded-value>'import requests
url = "https://api.lemlist.com/api/companies"
headers = {"Authorization": "Basic <encoded-value>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Basic <encoded-value>'}};
fetch('https://api.lemlist.com/api/companies', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));require 'uri'
require 'net/http'
url = URI("https://api.lemlist.com/api/companies")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Basic <encoded-value>'
response = http.request(request)
puts response.read_body<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.lemlist.com/api/companies",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Basic <encoded-value>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}Get Many Companies
Retrieves companies from your CRM. Use idsOrDomains to fetch specific companies by ID or domain in a single request (max 100), crmIds to find them from their record id in your connected CRM, or omit them to get a paginated list of all companies.
curl --request GET \
--url https://api.lemlist.com/api/companies \
--header 'Authorization: Basic <encoded-value>'import requests
url = "https://api.lemlist.com/api/companies"
headers = {"Authorization": "Basic <encoded-value>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Basic <encoded-value>'}};
fetch('https://api.lemlist.com/api/companies', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));require 'uri'
require 'net/http'
url = URI("https://api.lemlist.com/api/companies")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Basic <encoded-value>'
response = http.request(request)
puts response.read_body<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.lemlist.com/api/companies",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Basic <encoded-value>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}Finding a company from your CRM
UsecrmIds (up to 100, comma-separated) with the record ids of your connected CRM, for example GET /companies?crmIds=123456789 with a HubSpot company id; for Salesforce, pass the 18-character Account id. The answer is the same as with idsOrDomains: the companies found in data, each with the matched id under crmSync.crmRecordId; ids that match nothing are skipped.
idsOrDomains takes precedence over crmIds; a lookup ignores the list filters and the pagination.Authorizations
Basic authentication header of the form Basic <encoded-value>, where <encoded-value> is the base64-encoded string username:password.
Query Parameters
Comma-separated list of company IDs or domains to fetch. When provided, returns only matching companies (no pagination). Each value is classified as a company ID (e.g. cpn_xxx) or a domain (e.g. example.com). URLs are normalized automatically (e.g. https://example.com/path → example.com). Invalid values are silently skipped. Maximum 100 values.
Comma-separated record ids of companies in the CRM connected to the team (HubSpot, Salesforce, or Pipedrive); for Salesforce, the 18-character Account id. Returns the companies found in data, with total and no pagination, each with the matched id under crmSync.crmRecordId; ids that match nothing are skipped, and data 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 idsOrDomains is provided.
Number of companies to skip for pagination. Defaults to 0. Ignored when idsOrDomains is provided.
x >= 0The field by which to sort. Currently, only 'createdAt' is supported.
createdAt The sort direction. Use 'desc' for descending order; any other value (or omission) will sort in ascending order.
asc, desc Search by company name (case insensitive)
Returns selected fields. Returns all fields if empty. Each field is separated by a comma (e.g., '_id,fields.name,domain')
Number of companies to retrieve. Default: 100. Maximum: 500
1 <= x <= 500Filter companies to the members of a static CRM company list (clt_xxx format). Combines with every other filter. Ignored when idsOrDomains is provided.
^clt_[a-zA-Z0-9]+$Filter companies by their CRM sync state against the team's active CRM provider. Requires a CRM (Hubspot, Salesforce, or Pipedrive) to be connected — otherwise the request returns 400 NO_CRM_CONNECTED. Common values:
synced— the company has a CRM record and no sync errors.not_synced— the company has no CRM record yet.error— at least one sync error is currently raised.- A specific error reason (lowercase form), to filter by root cause:
unique_index_error_company,property_doesnt_exist,required_field_missing,company_already_exists_with_name,company_already_exists_with_linkedin_url.
For each returned company, see crmSync.errors[].metadata.alreadyExistingCompanyId to identify the lemlist company that already occupies the conflicting CRM record (useful to remap contacts before deleting the duplicate).
synced, not_synced, error, unique_index_error_company, property_doesnt_exist, required_field_missing, company_already_exists_with_name, company_already_exists_with_linkedin_url Filter companies to those carrying a field rejection with this reason — a value lemlist refused to write, raised during CRM sync (crm_sync_*). Returns an empty list (total: 0) when no company matches. Each returned company exposes the full detail under fieldRejections[] (which field, why, and conflictingRecordId for duplicates). Independent of crmSyncStatus (which keys off the live provider errors); this filter reads the stored field rejections. Only applies to the paginated list — ignored when idsOrDomains is provided (that path returns the exact companies requested, unfiltered).
crm_sync_duplicate_company, crm_sync_duplicate_company_domain, crm_sync_duplicate_company_name, crm_sync_invalid_domain, crm_sync_duplicate_linkedin_url, crm_sync_duplicate_linkedin_url_sales_nav, crm_sync_invalid_linkedin_url, crm_sync_linkedin_url_not_company, crm_sync_invalid_url, crm_sync_value_oscillating, enrichment_company_duplicate_core_signal_id, enrichment_company_duplicate_domain, enrichment_company_duplicate_linkedin_url, enrichment_company_duplicate_linkedin_url_sales_nav, enrichment_company_duplicate_name, crm_sync_owner_sync_loop, crm_sync_unmapped_user, crm_sync_value_incompatible, crm_sync_unknown_error Was this page helpful?