Kenso

People

Send people into Kenso from your own source.

Contacts and lists1 endpointKen-Version: 2026-11-02AuthenticationWorkspacesErrors

Take in one person from your own source: match, place on their company's account, assign an owner

POST/v1/people/intakepeople.intake

Needs 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.

Try it on developer.ken.so

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

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
email
string
optional
linkedinUrl
string
optional
fullName
string
optional
firstName
string
optional
lastName
string
optional
title
string
optional
companyName
string
optional
companyDomain
string
optional
phone
string
optional
source
string
optional
sourceDetail
string
optional
ownerMemberId
integer (int64)
optional
leadStatus
string
optional
customFields
map of object
optional
createAccount
boolean
optional

Response 200

data is a PersonIntakeModel.

Field
Type
Description
person
PersonModel
created
boolean
matchedBy
string
accountId
integer (int64)
accountCreated
boolean
suggestedDuplicateOfPersonId
integer (int64)
emailDropped
string
Request
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
}'
Response 200
{
  "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"
  }
}