curl --request GET \
--url https://api.enrik.ai/v1/company-candidates \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.enrik.ai/v1/company-candidates"
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/company-candidates', 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/company-candidates",
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/company-candidates"
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/company-candidates")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.enrik.ai/v1/company-candidates")
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-00000000e001",
"discoveryJobId": "0199a1b2-0000-7000-8000-00000000d001",
"icpProfileId": "0199a1b2-0000-7000-8000-00000000f001",
"icpProfileVersionId": "0199a1b2-0000-7000-8000-00000000f011",
"discoveryBriefId": null,
"name": "Alpine Robotics GmbH",
"normalizedName": "alpine robotics",
"website": "https://alpine-robotics.example",
"domain": "alpine-robotics.example",
"normalizedDomain": "alpine-robotics.example",
"country": "AT",
"description": "Industrial robot cells for small manufacturers.",
"sourceType": "pasted_list",
"sourceLabel": "Trade fair shortlist",
"sourceUrl": null,
"sourceRowIndex": 0,
"sourcePayload": {
"row": "Alpine Robotics GmbH, alpine-robotics.example"
},
"status": "needs_review",
"dedupeStatus": "no_match",
"domainVerificationStatus": "verified",
"confidence": "high",
"matchedCompanyId": null,
"promotedCompanyId": null,
"createdBy": "0199a1b2-0000-7000-8000-00000000c001",
"updatedBy": "0199a1b2-0000-7000-8000-00000000c001",
"createdAt": "2026-09-29T08:00:07.000Z",
"updatedAt": "2026-09-29T08:00:08.000Z",
"candidateQualityScore": 90,
"candidateIcpFitScore": 75,
"candidateEvidenceScore": 60,
"sourceConfidenceScore": 70,
"reviewPriorityScore": 78,
"reviewPriorityTier": "medium_priority",
"recommendedAction": "review_manually",
"scoringStatus": "scored",
"scoredAt": "2026-09-29T08:00:08.000Z",
"scoringVersion": "deterministic-v1",
"scoringMetadata": {
"scoringMode": "deterministic",
"scoringVersion": "deterministic-v1",
"icpProfileId": "0199a1b2-0000-7000-8000-00000000f001",
"icpProfileVersionId": "0199a1b2-0000-7000-8000-00000000f011",
"discoveryBriefId": null,
"inputs": [
"name",
"website",
"country",
"description"
],
"scoreBreakdown": {
"candidateQuality": {
"score": 90,
"reasons": [
"Name, website and description are present."
]
},
"icpFit": {
"score": 75,
"reasons": [
"The country matches.",
"The industry matches."
]
},
"evidence": {
"score": 60,
"reasons": [
"The website was verified."
]
},
"sourceConfidence": {
"score": 70,
"reasons": [
"A pasted list from a known trade fair."
]
}
},
"penalties": []
},
"canonicalCompanyId": null,
"entityCompanyId": null,
"sourceProfileStatus": null,
"workspaceMatchStatus": null,
"workspaceCompanyId": null,
"enrikSnapshotVersion": null,
"profileFetchedAt": null,
"retrievalQuery": null,
"retrievalReasons": null
}
],
"pageInfo": {
"hasNextPage": false,
"endCursor": null,
"limit": 50
},
"contextualRanking": {
"available": true
}
}{
"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 candidates
Pages through the workspace’s company candidates, by review priority unless sort says otherwise. Filter by job, status, scores or source. Pass rankingMode with sort=contextual_priority for a ranked list (contextualRanking.available says whether the workspace can have one); its rows also carry a recommendation. A ranked sort without rankingMode, or another sort with it, is refused with invalid_sort.
curl --request GET \
--url https://api.enrik.ai/v1/company-candidates \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.enrik.ai/v1/company-candidates"
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/company-candidates', 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/company-candidates",
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/company-candidates"
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/company-candidates")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.enrik.ai/v1/company-candidates")
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-00000000e001",
"discoveryJobId": "0199a1b2-0000-7000-8000-00000000d001",
"icpProfileId": "0199a1b2-0000-7000-8000-00000000f001",
"icpProfileVersionId": "0199a1b2-0000-7000-8000-00000000f011",
"discoveryBriefId": null,
"name": "Alpine Robotics GmbH",
"normalizedName": "alpine robotics",
"website": "https://alpine-robotics.example",
"domain": "alpine-robotics.example",
"normalizedDomain": "alpine-robotics.example",
"country": "AT",
"description": "Industrial robot cells for small manufacturers.",
"sourceType": "pasted_list",
"sourceLabel": "Trade fair shortlist",
"sourceUrl": null,
"sourceRowIndex": 0,
"sourcePayload": {
"row": "Alpine Robotics GmbH, alpine-robotics.example"
},
"status": "needs_review",
"dedupeStatus": "no_match",
"domainVerificationStatus": "verified",
"confidence": "high",
"matchedCompanyId": null,
"promotedCompanyId": null,
"createdBy": "0199a1b2-0000-7000-8000-00000000c001",
"updatedBy": "0199a1b2-0000-7000-8000-00000000c001",
"createdAt": "2026-09-29T08:00:07.000Z",
"updatedAt": "2026-09-29T08:00:08.000Z",
"candidateQualityScore": 90,
"candidateIcpFitScore": 75,
"candidateEvidenceScore": 60,
"sourceConfidenceScore": 70,
"reviewPriorityScore": 78,
"reviewPriorityTier": "medium_priority",
"recommendedAction": "review_manually",
"scoringStatus": "scored",
"scoredAt": "2026-09-29T08:00:08.000Z",
"scoringVersion": "deterministic-v1",
"scoringMetadata": {
"scoringMode": "deterministic",
"scoringVersion": "deterministic-v1",
"icpProfileId": "0199a1b2-0000-7000-8000-00000000f001",
"icpProfileVersionId": "0199a1b2-0000-7000-8000-00000000f011",
"discoveryBriefId": null,
"inputs": [
"name",
"website",
"country",
"description"
],
"scoreBreakdown": {
"candidateQuality": {
"score": 90,
"reasons": [
"Name, website and description are present."
]
},
"icpFit": {
"score": 75,
"reasons": [
"The country matches.",
"The industry matches."
]
},
"evidence": {
"score": 60,
"reasons": [
"The website was verified."
]
},
"sourceConfidence": {
"score": 70,
"reasons": [
"A pasted list from a known trade fair."
]
}
},
"penalties": []
},
"canonicalCompanyId": null,
"entityCompanyId": null,
"sourceProfileStatus": null,
"workspaceMatchStatus": null,
"workspaceCompanyId": null,
"enrikSnapshotVersion": null,
"profileFetchedAt": null,
"retrievalQuery": null,
"retrievalReasons": null
}
],
"pageInfo": {
"hasNextPage": false,
"endCursor": null,
"limit": 50
},
"contextualRanking": {
"available": true
}
}{
"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
Rank the candidates: icp_only against the ICP profile, contextual against a brief.
icp_only, contextual Sort by one score, highest first, or by createdAt, newest first. A ranked list sorts by contextual_priority, and only by it. Without it, candidates come by review priority.
reviewPriorityScore, candidateIcpFitScore, candidateQualityScore, candidateEvidenceScore, createdAt, contextual_priority A contextual ranked list: the brief to rank against.
^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$A contextual ranked list: the exact brief version to rank against.
^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$A ranked list: leave snoozed candidates out (exclude, the default), in, or only.
exclude, include, only A ranked list: only candidates with this customer status.
customer, not_customer, unavailable A ranked list: only candidates in this state of sales work.
in_sales_work, not_in_sales_work, unavailable Where to resume a list: the previous page’s pageInfo.endCursor. Opaque.
1Only the candidates of this discovery job.
^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$Only candidates in this status.
new, needs_review, accepted, rejected, archived, promoted, linked_existing, failed Only candidates with this duplicate status.
unchecked, no_match, possible_duplicate, existing_company_match, duplicate_candidate Only candidates with this scoring status.
unscored, scored, failed, stale Only candidates in this review-priority band.
high_priority, medium_priority, low_priority, reject_likely, insufficient_data Only candidates with this recommended next action.
promote_candidate, review_manually, verify_domain, possible_duplicate_review, reject_candidate, insufficient_data Only candidates from this kind of source.
pasted_list, manual_candidate, user_provided_source_page, controlled_source, csv_upload, enrik_data, infobel_firmographics Only candidates from this category of controlled source.
trade_fair_exhibitor, event_sponsor, industry_directory, association_member_list, conference_partner, other_structured_b2b_list Only candidates with at least this review priority, 0 to 100. Empty means no minimum.
Only candidates with at least this ICP fit, 0 to 100. Empty means no minimum.
How many items to return: 1 to 200, 50 when absent.
1 <= x <= 200Response
A page of candidates: by review priority, by the sort asked for, or ranked (rankingMode).
A page of candidates: by review priority, by the sort asked for, or ranked (rankingMode).
Was this page helpful?