curl --request GET \
--url https://api.enrik.ai/v1/companies \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.enrik.ai/v1/companies"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.enrik.ai/v1/companies', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.enrik.ai/v1/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: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.enrik.ai/v1/companies"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.enrik.ai/v1/companies")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.enrik.ai/v1/companies")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "0199a1b2-0000-7000-8000-00000000d101",
"workspaceId": "0199a1b2-0000-7000-8000-00000000b001",
"name": "Analytical Engines",
"domain": "example.com",
"website": "https://example.com",
"industry": "Software",
"employeeCount": 120,
"annualRevenue": 12500000,
"address": {
"city": "Vienna",
"country": "AT"
},
"linkedinUrl": null,
"country": "Austria",
"summary": "Builds engines that compute.",
"city": "Vienna",
"legalForm": "GmbH",
"registerNumber": "FN 123456a",
"buildingEnergyTags": null,
"ownerUserId": "0199a1b2-0000-7000-8000-00000000c001",
"customFields": {
"segment": "enterprise"
},
"canonicalCompanyId": null,
"enrikUpdateAvailable": false,
"enrikSnapshotVersion": null,
"createdBy": "0199a1b2-0000-7000-8000-00000000c001",
"updatedBy": "0199a1b2-0000-7000-8000-00000000c001",
"createdAt": "2026-09-29T08:00:00.000Z",
"updatedAt": "2026-09-29T08:00:00.000Z",
"deletedAt": null,
"signalSummary": {
"companyId": "0199a1b2-0000-7000-8000-00000000d101",
"latestSignalTitle": "Hiring five engineers",
"latestSignalCategory": "hiring",
"latestSignalDate": "2026-09-20",
"latestSignalStrength": "strong",
"latestSignalConfidence": "high",
"latestSignalRelevanceScore": 82,
"activeSignalCount": 3,
"strongSignalCount": 1,
"signalPriorityScore": 82,
"scoringVersion": "v1"
}
}
],
"pageInfo": {
"hasNextPage": false,
"endCursor": null,
"limit": 50
},
"contextualRanking": {
"available": false
}
}{
"error": {
"code": "malformed_json",
"message": "Bad Request",
"requestId": "5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"
}
}{
"error": {
"code": "unauthenticated",
"message": "Unauthorized",
"requestId": "5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"
}
}{
"error": {
"code": "insufficient_scope",
"message": "Forbidden",
"requestId": "5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"
}
}{
"error": {
"code": "not_found",
"message": "Not Found",
"requestId": "5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"
}
}{
"error": {
"code": "conflict",
"message": "Conflict",
"requestId": "5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"
}
}{
"error": {
"code": "validation_error",
"message": "Unprocessable Entity",
"requestId": "5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"
}
}{
"error": {
"code": "rate_limited",
"message": "Too many requests",
"requestId": "5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"
}
}{
"error": {
"code": "internal_error",
"message": "Internal Server Error",
"requestId": "5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"
}
}{
"error": {
"code": "service_unavailable",
"message": "Service Unavailable",
"requestId": "5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"
}
}{
"error": {
"code": "not_found",
"message": "Not found",
"requestId": "5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"
}
}List companies
Pages through the workspace’s live companies, newest first unless sort says otherwise. Pass pageInfo.endCursor as cursor to fetch the next page, with the same query. With rankingMode (and sort=contextual_priority) the companies are ranked by recommendation and each carries it; ranking reads the workspace’s ICP profile (and the brief), so an API key also needs discovery:read for it, or the request is refused with 403 insufficient_scope. A sort by a custom field, or by a field the list cannot sort by, is refused with 400 invalid_sort.
curl --request GET \
--url https://api.enrik.ai/v1/companies \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.enrik.ai/v1/companies"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.enrik.ai/v1/companies', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.enrik.ai/v1/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: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.enrik.ai/v1/companies"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.enrik.ai/v1/companies")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.enrik.ai/v1/companies")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "0199a1b2-0000-7000-8000-00000000d101",
"workspaceId": "0199a1b2-0000-7000-8000-00000000b001",
"name": "Analytical Engines",
"domain": "example.com",
"website": "https://example.com",
"industry": "Software",
"employeeCount": 120,
"annualRevenue": 12500000,
"address": {
"city": "Vienna",
"country": "AT"
},
"linkedinUrl": null,
"country": "Austria",
"summary": "Builds engines that compute.",
"city": "Vienna",
"legalForm": "GmbH",
"registerNumber": "FN 123456a",
"buildingEnergyTags": null,
"ownerUserId": "0199a1b2-0000-7000-8000-00000000c001",
"customFields": {
"segment": "enterprise"
},
"canonicalCompanyId": null,
"enrikUpdateAvailable": false,
"enrikSnapshotVersion": null,
"createdBy": "0199a1b2-0000-7000-8000-00000000c001",
"updatedBy": "0199a1b2-0000-7000-8000-00000000c001",
"createdAt": "2026-09-29T08:00:00.000Z",
"updatedAt": "2026-09-29T08:00:00.000Z",
"deletedAt": null,
"signalSummary": {
"companyId": "0199a1b2-0000-7000-8000-00000000d101",
"latestSignalTitle": "Hiring five engineers",
"latestSignalCategory": "hiring",
"latestSignalDate": "2026-09-20",
"latestSignalStrength": "strong",
"latestSignalConfidence": "high",
"latestSignalRelevanceScore": 82,
"activeSignalCount": 3,
"strongSignalCount": 1,
"signalPriorityScore": 82,
"scoringVersion": "v1"
}
}
],
"pageInfo": {
"hasNextPage": false,
"endCursor": null,
"limit": 50
},
"contextualRanking": {
"available": false
}
}{
"error": {
"code": "malformed_json",
"message": "Bad Request",
"requestId": "5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"
}
}{
"error": {
"code": "unauthenticated",
"message": "Unauthorized",
"requestId": "5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"
}
}{
"error": {
"code": "insufficient_scope",
"message": "Forbidden",
"requestId": "5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"
}
}{
"error": {
"code": "not_found",
"message": "Not Found",
"requestId": "5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"
}
}{
"error": {
"code": "conflict",
"message": "Conflict",
"requestId": "5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"
}
}{
"error": {
"code": "validation_error",
"message": "Unprocessable Entity",
"requestId": "5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"
}
}{
"error": {
"code": "rate_limited",
"message": "Too many requests",
"requestId": "5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"
}
}{
"error": {
"code": "internal_error",
"message": "Internal Server Error",
"requestId": "5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"
}
}{
"error": {
"code": "service_unavailable",
"message": "Service Unavailable",
"requestId": "5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"
}
}{
"error": {
"code": "not_found",
"message": "Not found",
"requestId": "5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"
}
}Authorizations
An Enrik API key, sent as Authorization: Bearer <key>. A key reaches public operations only, and only those whose scopes it holds. A few parameters need a scope beyond their operation’s, which the parameter names. The scopes:
setup:read: Read the workspace setup and its company profile.setup:run: Change the setup: confirm the company profile, authorize sponsored drafting and background company research, choose what to set up and complete setup.workspace:read: Read the workspace’s own profile: its health summary and setup state.crm:read: Read companies with their signals, contacts and the saved views over them.crm:write: Create, update and restore companies and contacts, and create, update and delete saved views.crm:delete: Delete companies and contacts.twin:read: Read the Company Twin: structured company knowledge and its signals.discovery:read: Read ICP profiles, ICP assessments, discovery briefs, discovery jobs, candidates and the signal library.discovery:write: Create and change ICP profiles, discovery briefs and signal-definition drafts, and review discovery candidates.discovery:run: Create, start and cancel discovery jobs, and edit a draft one. Uses provider budget.enrichment:read: Read the enrichment configuration and its results, including a record’s enrichment, formula and custom-API cells.enrichment:run: Launch and cancel enrichment. Spends enrichment credits.automation:read: Read workflows and agents with their run history, including a record’s agent cells.automation:run: Run existing workflows and agents.exports:read: Read export jobs and the fields an export can carry.exports:run: Create, preview, start, cancel and archive CSV exports of companies, contacts and candidates, and download the file. Also needscrm:read. Delivering an export to a webhook destination stays in the app.integrations:read: Read connections, field mappings, CRM sync jobs and webhook destinations.webhooks:read: Read webhook subscriptions, the event types they can name and their delivery log.webhooks:write: Subscribe a receiver URL to webhook events; edit, test, pause, resume and archive a subscription and rotate its signing secret; redeliver an event. Only workspace owners and admins can grant it.reporting:read: Read analytics and dashboards.assistant:read: Read the Assistant: its threads, messages and pending approvals.assistant:run: Converse with the Assistant. Uses the workspace’s AI quota.assistant:write: Approve or reject the changes the Assistant proposes.
Headers
The ETag of an answer you kept. While the answer is still the same, the API answers 304 Not Modified with no body. Several tags, separated by commas, a weak tag (W/"…") and * are accepted.
Query Parameters
Where to resume a list: the previous page’s pageInfo.endCursor. Opaque.
1How many items to return: 1 to 200, 50 when absent.
1 <= x <= 200The conditions a company must meet, as JSON text: an array of { field, operator, value } objects, every one of which must hold (AND). At most 50. The fields: name, domain, website, industry, linkedinUrl, country, city, legalForm, registerNumber and summary (text); employeeCount and annualRevenue (numbers); id and ownerUserId (ids); createdAt and updatedAt (ISO 8601 instants); and a custom field as customFields.<key>. contains and startsWith compare text only. id with in reads several records at once, at most 100 ids (with limit 100 they fit on one page): an id that is not found is left out. nameOrDomain matches the name or the domain, with contains or eq. The signal fields take eq and read the company’s active signals: hasActiveSignals (true or false); minSignalRelevanceScore (a number the highest relevance must reach); signalCategory, signalStrength and signalConfidence (a value one of the signals has); signalFreshness (fresh or stale: the latest signal is at most, or more than, 90 days old).
The sort order. Without rankingMode: JSON text, an array of { field, direction } objects (name, domain, createdAt or updatedAt; asc or desc). With rankingMode: the plain string contextual_priority.
The visible columns, as JSON text: an array of field paths. A display hint; it changes no result.
The per-column cell states to add to each company, comma-separated: enrichmentCells, formulaCells, customApiCells and agentCells. Other values are ignored. Each cell map is read with its own permission: an API key needs enrichment:read for the first three and automation:read for agentCells, or the whole request is refused with 403 insufficient_scope.
Search, as plain text of 1 to 200 characters, split on whitespace: every term must appear, ignoring case, in the name or the domain; different terms may match different fields. ANDed with filters. No ranking: the list keeps its sort, and a cursor is valid only with the same q (another q answers 422 with error.details.code invalid_cursor). % and _ match themselves. Not available with rankingMode.
1 - 200Rank the companies by recommendation: icp_only (fit to the ideal customer profile) or contextual (fit to a discovery brief, with briefId and briefVersionId). Needs sort=contextual_priority. Ranking reads the ICP profile and the brief, so an API key also needs discovery:read.
icp_only, contextual With rankingMode=contextual: the discovery brief.
With rankingMode=contextual: the brief’s version.
With rankingMode: exclude snoozed companies (the default), include them, or show only them.
exclude, include, only With rankingMode: only customers, not_customers, or companies with no status recorded (unavailable).
customer, not_customer, unavailable With rankingMode: only companies in_sales_work, not_in_sales_work, or with none recorded (unavailable).
in_sales_work, not_in_sales_work, unavailable Response
A page of companies.
Was this page helpful?