Kenso

Email finds

The Email finds endpoints of the Kenso API.

Search and data2 endpointsKen-Version: 2026-11-02AuthenticationWorkspacesErrors

Find one person's email by name and company

POST/v1/email-findsemail-finds.create

Needs the email_finder feature on your workspace. Until it is on, calls answer 404.

Try it on developer.ken.so

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

Name
In
Type
Required
Description
Ken-Version
In: header
string, one of: 2026-11-02, 1.1
required
The API version: a dated version (YYYY-MM-DD), or 1.1, another name for the first dated version. Without it the request uses your API key's pinned version; an unpinned key reaches the legacy shape of the same path. 1.0 selects the legacy shape explicitly.
X-Ken-Workspace-Id
In: header
integer (int64)
optional
Workspace to act in. Required when your credential can reach more than one workspace (otherwise 400 workspace_required).

Request body

application/json, optional.

Field
Type
Required
Description
fullName
string
optional
firstName
string
optional
lastName
string
optional
companyDomain
string
optional
companyName
string
optional
linkedinUrl
string
optional

Response 202

data is a EmailFindModel.

Field
Type
Description
id
integer (int64)
personId
integer (int64)
status
string
pausedReason
string
email
string
verification
EmailFindVerificationModel
provider
string
companyDomain
string
costCredits
integer (int32)
error
string
createdAt
string (date-time)
completedAt
string (date-time)
Request
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"
}'
Response 202
{
  "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

GET/v1/email-finds/{emailFindId}email-finds.get

Needs the email_finder feature on your workspace. Until it is on, calls answer 404.

Try it on developer.ken.so

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

Name
In
Type
Required
Description
emailFindId
In: path
integer (int64)
required
Ken-Version
In: header
string, one of: 2026-11-02, 1.1
required
The API version: a dated version (YYYY-MM-DD), or 1.1, another name for the first dated version. Without it the request uses your API key's pinned version; an unpinned key reaches the legacy shape of the same path. 1.0 selects the legacy shape explicitly.
X-Ken-Workspace-Id
In: header
integer (int64)
optional
Workspace to act in. Required when your credential can reach more than one workspace (otherwise 400 workspace_required).

Response 200

data is a EmailFindModel.

Field
Type
Description
id
integer (int64)
personId
integer (int64)
status
string
pausedReason
string
email
string
verification
EmailFindVerificationModel
provider
string
companyDomain
string
costCredits
integer (int32)
error
string
createdAt
string (date-time)
completedAt
string (date-time)
Request
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"
Response 200
{
  "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"
  }
}