People
Send people into Kenso from your own source.
Take in one person from your own source: match, place on their company's account, assign an owner
/v1/people/intakepeople.intakeNeeds the accounts feature on your workspace. Until it is on, calls answer 404. Needs the lead_intake feature on your workspace. Until it is on, calls answer 404.
Body: email, linkedinUrl, or a name (fullName, or firstName and lastName) with a business companyDomain (else 400identity_required); title, companyName, phone (a bad number is 400invalid_phone), source (api default, workflow or manual; any other is 400invalid_source), sourceDetail, ownerMemberId (a member, else 400invalid_member), leadStatus (default new), customFields (person custom field keys; unknown keys are ignored) and createAccount. A person with the same email, else LinkedIn URL, else the same name on the domain and no email, is matched: only their blank fields fill, pinned fields never change, the phone is added and the latest source updates. Else the person is created with lead status new and a score. A business domain with no account gets one (stage researching, source inbound, no research credits) unless createAccount is false or the workspace's intake settings say no; the person joins that account. Owner: the person's, else the account's, the CRM contact's, ownerMemberId, the workspace default, then the round robin. A new person adds a new_lead row to the owner's Today and notifies them. Returns person, created, matchedBy (email, linkedin_url, name_domain or none), accountId, accountCreated and suggestedDuplicateOfPersonId (same name on the domain with another email). A role address (support@, info@, no-reply@) matches the person who holds it but never fills onto one. With a LinkedIn URL or a real first and last name (as on people.create) the person comes in without it, matched later by that name on the address's domain, and the answer carries emailDropped: role_address; with neither and no match it is 422 role_address and nothing is written. 600 calls an hour per workspace; the next is 429 with Retry-After. With account scope own it is 403permission_denied with scope: all. Behind the lead_intake feature (404 when off). Requires WriteAccess.
Parameters
400 workspace_required).Request body
application/json, optional.
Response 200
data is a PersonIntakeModel.
curl -X POST "https://api.ken.so/v1/people/intake" \
-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 '{
"email": "[email protected]",
"linkedinUrl": "https://example.com",
"fullName": "string",
"firstName": "string",
"lastName": "string",
"title": "string",
"companyName": "string",
"companyDomain": "example.com",
"phone": "string",
"source": "string",
"sourceDetail": "string",
"ownerMemberId": 812,
"leadStatus": "string",
"customFields": {
"key": null
},
"createAccount": true
}'{
"success": true,
"data": {
"person": {
"id": 812,
"fullName": "string",
"firstName": "string",
"lastName": "string",
"title": "string",
"email": "[email protected]",
"linkedinUrl": "https://example.com",
"kenPersonId": 812,
"ownerMemberId": 812,
"leadStatus": "string",
"leadStatusAt": "2026-09-23T15:02:11Z",
"score": 1,
"phones": [
{
"number": "string",
"kind": "string",
"source": "string",
"addedAt": "2026-09-23T15:02:11Z",
"invalidAt": "2026-09-23T15:02:11Z"
}
],
"phone": "string",
"phoneOptOutAt": "2026-09-23T15:02:11Z",
"firstSource": {
"source": "string",
"detail": "string",
"at": "2026-09-23T15:02:11Z"
},
"latestSource": {
"source": "string",
"detail": "string",
"at": "2026-09-23T15:02:11Z"
},
"headline": "string",
"location": "string",
"seniority": "string",
"department": "string",
"photoUrl": "https://example.com",
"photoSource": "string",
"profileSource": "string",
"profileEnrichedAt": "2026-09-23T15:02:11Z",
"profile": {
"summary": "string",
"industry": "string",
"city": "string",
"state": "string",
"country": "string",
"currentCompany": {
"name": "string",
"domain": "example.com",
"linkedinUrl": "https://example.com",
"kenCompanyId": 812,
"title": "string",
"startedAt": "string"
},
"yearsOfExperience": 0.5,
"yearsInCurrentRole": 0.5,
"yearsInCurrentCompany": 0.5,
"connectionsCount": 1,
"followerCount": 1,
"experience": [
{
"title": "string",
"companyName": "string",
"location": "string",
"startedAt": "string",
"endedAt": "string",
"isCurrent": true,
"description": "string"
}
],
"education": [
{
"school": "string",
"degree": "string",
"fieldOfStudy": "string",
"startedAt": "string",
"endedAt": "string"
}
],
"skills": [
"string"
],
"languages": [
"string"
],
"certifications": [
{
"name": "string",
"issuer": "string"
}
]
},
"pinnedFields": [
"string"
],
"createdBy": {
"kind": "string",
"memberId": 812
},
"updatedBy": {
"kind": "string",
"memberId": 812
},
"createdAt": "2026-09-23T15:02:11Z",
"updatedAt": "2026-09-23T15:02:11Z",
"emailFind": {
"id": 812,
"status": "string",
"completedAt": "2026-09-23T15:02:11Z",
"fromKenPool": true
},
"phoneFind": {
"status": "string",
"requestedAt": "2026-09-23T15:02:11Z"
},
"accounts": [
{
"accountId": 812,
"stakeholderId": 812,
"name": "string",
"primaryDomain": "example.com",
"logoUrl": "https://example.com",
"role": "string",
"priority": 1,
"coverage": "string"
}
],
"tagIds": [
812
],
"connectedVia": [
{
"linkedinAccountId": 812,
"displayName": "string",
"memberId": 812
}
],
"connectionIcpScore": 1,
"importOnlyAt": "2026-09-23T15:02:11Z",
"emailDropped": "string"
},
"created": true,
"matchedBy": "string",
"accountId": 812,
"accountCreated": true,
"suggestedDuplicateOfPersonId": 812,
"emailDropped": "string"
}
}