Skip to main content
POST
Create person

Authorizations

Authorization
string
header
required

Authenticate with a Bearer token: API key, OAuth token, or session token.

Body

application/json
name
string
required

Full name (required). Used as display name across the system.

Minimum string length: 1
first_name
string

First name. Auto-split from name if omitted.

last_name
string

Last name. Auto-split from name if omitted.

linkedin_url
string<uri>

Strongly recommended. LinkedIn profile URL (e.g. "https://linkedin.com/in/johndoe") is the deduplication key for this endpoint. When present, an existing person with that profile is matched and updated (never duplicated), including when job_id is used to add a candidacy. Without it, a duplicate is only caught when the name matches an existing person along with their email and/or phone (see the endpoint description); otherwise a new person is created. Enrichment is also skipped without a LinkedIn URL.

current_job_title
string

Current job title.

location
string

Location (e.g. city, region, or country).

company_name
string

Current employer company name.

emails
string<email>[]

Additional email addresses.

work_email
string<email>

Primary work email.

work_phone
string

Work phone number.

personal_email
string<email>

Personal email address.

mobile_phone
string

Mobile phone number.

phone_numbers
string[]

Additional phone numbers.

notes
string

Initial note to attach to the person record.

job_id
string

Job UUID to add this person to that job pipeline as a candidate (creates the candidacy). When linkedin_url is provided, works whether the person is new or already exists (matched by linkedin_url, never duplicated). Without linkedin_url, a new person may be created unless it is automatically merged into a matching existing person, in which case that person is added to the job. Get IDs from POST /v1/jobs/search.

job_name
string

Job title to match and add this person to that job pipeline as a candidate. Used when job_id is not provided.

client_name
string

Company name to associate this person as a client contact.

client_id
string

Company UUID for client contact association. Get IDs from GET /v1/companies.

external_source_id
string

Identifier from an external system (e.g. HRIS or legacy ATS). A new person is never automatically merged into an existing person that has a different external_source_id.

enrich_record
boolean

When true, triggers background enrichment via data providers after creation.

person_owner
string<uuid>

UUID of the team member to assign as owner of this person. Get IDs from GET /v1/team-members. If omitted, the caller is auto-assigned when authenticated as a team member. If the team member is not found, a warning is logged but person creation still proceeds.

sourced_by
string<uuid>

UUID of the team member who sourced this candidate, recorded as "Sourced by" on the new candidacy. Get IDs from GET /v1/team-members. Requires job_id. Only applies to API-key requests; requests made as a signed-in user (session or OAuth, including MCP) always credit that user. If the person is already a candidate on the job, the existing sourcer is kept. When person_owner is omitted, this team member also becomes the owner of a newly created person and candidacy.

custom_fields
object[]

Custom field values to set, in the same shape as PATCH /v1/persons/{id}. Get attribute definitions from GET /v1/custom-fields/persons. When linkedin_url matches an existing person, the values are written to that person. If a value is invalid, the person is still saved and the error message includes its ID so the fields can be retried with PATCH.

Response

Person created

success
enum<boolean>
required
Available options:
true
data
object
required