Email finds
The Email finds endpoints of the Kenso API.
Find one person's email by name and company
/v1/email-findsemail-finds.createNeeds the email_finder feature on your workspace. Until it is on, calls answer 404.
Body: a name (fullName, or firstName and lastName) and companyDomain (the company's website domain, such as acme.fr; free mail, social and link hosts are 400 invalid_domain) or linkedinUrl, or both; companyName is optional. With only linkedinUrl, the domain is the person's current company in Kenso Search, and the find ends not_found (free) when Kenso Search does not know it. Works for any country. Kenso asks its own email database, then Prospeo, LeadMagic and Findymail, verifies each answer and keeps the first valid (safe or verified) email. 1 credit when a Kenso-paid lookup finds one, nothing for a miss or a find on the workspace's own provider key. Out of credits it is 402 plan_limit_reached with error.refusal and nothing runs. The person is kept in the workspace (on no account): the person an earlier lookup made for this name at this domain (unless they hold another LinkedIn URL), else the person a linkedinUrl names, else a new one. So a repeat lookup that adds linkedinUrl makes no second person. A person is reused only when they have no email, their email is the one an earlier lookup at this domain found, or it is at companyDomain; one who already has it gets it back found, at no charge, with verification unverified. Parallel calls for the same name and domain are not merged: send one and poll it. Returns 202 with the find (status queued); it usually ends within a minute: poll GET /v1/email-finds/{emailFindId}. A person whose lookup is still working gets that find back (409 active_find when it is for another company). 30 lookups a minute and 500 a day per workspace (a 400, 402, 403 or 409, or a call that gets a running find back, does not count); past it, 429 quota_exceeded with Retry-After. With account scope own it is 403. Requires the Search page (edit). Behind the email_finder feature (404 when off).
Parameters
400 workspace_required).Request body
application/json, optional.
Response 202
data is a EmailFindModel.
curl -X POST "https://api.ken.so/v1/email-finds" \
-H "Authorization: Bearer $KEN_API_KEY" \
-H "Ken-Version: 2026-11-02" \
-H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID" \
-H "Content-Type: application/json" \
-d '{
"fullName": "string",
"firstName": "string",
"lastName": "string",
"companyDomain": "example.com",
"companyName": "string",
"linkedinUrl": "https://example.com"
}'{
"success": true,
"data": {
"id": 812,
"personId": 812,
"status": "string",
"pausedReason": "string",
"email": "[email protected]",
"verification": {
"status": "string",
"verifiedBy": "string"
},
"provider": "string",
"companyDomain": "example.com",
"costCredits": 1,
"error": "string",
"createdAt": "2026-09-23T15:02:11Z",
"completedAt": "2026-09-23T15:02:11Z"
}
}Read one email find
/v1/email-finds/{emailFindId}email-finds.getNeeds the email_finder feature on your workspace. Until it is on, calls answer 404.
The find POST /v1/email-finds queued. status is queued, running or paused while it works (pausedReasoncredits or member_limit), then found, not_found or failed (error says why; a failed find may be asked again). Found, it carries email, provider and verification (status safe, verified or unverified, and verifiedBy), and costCredits is what it charged. Another workspace's find is 404. With account scope own it is 403, as on create. Requires the Search page (view). Behind the email_finder feature (404 when off).
Parameters
400 workspace_required).Response 200
data is a EmailFindModel.
curl -X GET "https://api.ken.so/v1/email-finds/812" \ -H "Authorization: Bearer $KEN_API_KEY" \ -H "Ken-Version: 2026-11-02" \ -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
{
"success": true,
"data": {
"id": 812,
"personId": 812,
"status": "string",
"pausedReason": "string",
"email": "[email protected]",
"verification": {
"status": "string",
"verifiedBy": "string"
},
"provider": "string",
"companyDomain": "example.com",
"costCredits": 1,
"error": "string",
"createdAt": "2026-09-23T15:02:11Z",
"completedAt": "2026-09-23T15:02:11Z"
}
}