GET /people returns a page envelope. Its data rows are full Person objects by default, or CompactPerson objects when view=compact. GET /people/{slug} always returns a fully hydrated Person. Company orbit rows use the same field names but hydrate only two positions and do not hydrate education, skills, languages, or certifications.
A missing value is normally represented as null; an empty array or object is distinct from null. Clients should ignore additional fields and should not infer employment from a display summary alone.
CompactPerson
view=compact returns exactly the following fields for each search row:
Person
The full serializer emits these fields.match and exploring_interpretation are present as keys even when their value is an empty object or null.
Position and education
APosition has nullable fields company, company_url, title, started_at, ended_at, tenure_months, is_current, and role_family. tenure_months is a number or null; is_current is a boolean or null. Dates retain the source precision, so do not invent a day when a value is only YYYY or YYYY-MM.
An Education has nullable string fields school, degree, field, started_at, ended_at, and school_url.
A Certification has a nonempty string name and nullable string fields authority and issued_at. Nameless records are omitted. issued_at preserves source precision (YYYY or YYYY-MM) and can be null. Certification search matches a literal, case-insensitive substring of name or authority through an actual HAS_CERTIFICATION relationship. The plural certifications request accepts up to 10 distinct terms and combines them with certification_match=any (default) or all; singular certification remains a compatibility alias. A record represents source data and does not verify current validity or expiration.
GET /people/{slug} hydrates all available positions after overlapping rows are collapsed, plus education, skills, languages, and certifications. People search hydrates at most two positions per row and leaves education empty. Search hydrates skills and languages only when their filters are used, and hydrates certifications only when a certification filter (certification or certifications) is used. Company orbit rows hydrate at most two positions and leave education, skills, languages, and certifications empty.
Identity enrichment
Whengithub is not null, it contains nullable fields login, candidate_login, url, confidence, score, signals, hireable, blog, twitter, and reconciled_at. score is a number or null; hireable is a boolean or null. A candidate_login is a candidate identity, not confirmation.
When x is not null, it contains nullable fields handle, candidate_handle, url, confidence, and reconciled_at. A candidate handle is not a confirmed identity.
Match metadata
match can contain the following optional fields:
Coworker rows may use the overlap fields. Similar rows use
score and reasons. Search rows can use company and role match fields. Do not assume any optional match key is present for every endpoint.
Exploring explanation
Eachexploring_reasons item has field of headline, about, or role_description; a string label; nullable before and after; and an ISO timestamp seen_at. Text is truncated by the serializer.
When exploring_interpretation is not null, it has:
model: stringversion: stringsegments: { text: string, evidence_indices: number[] }[]evidence: { field, label, before, after, seen_at, quote, side, source? }[]
side is before or after; source, when present, is snapshot. Evidence indices point into the same evidence array. An assessment is not a statement that someone is actively seeking a job.
Get-person expansions
GET /people/{slug}?include=... keeps the base data as a full Person. Unrequested top-level expansion keys are omitted.
include=coworkersaddscoworkers: Person[]andstints: StintContext[].include=similaraddssimilar: Person[].include=coworkers,similaradds all three arrays.
StintContext has this structure (the nested person below is abbreviated; it uses the Person field shape):
stint.company is a string; the other stint fields are nullable strings. managers and coworkers contain full-shaped person rows with match metadata. coworker_count is the count before the preview list is truncated.
Search envelope and pagination
A people search response is:query is the effective snake_case filter object and excludes pagination. meta.count is the page length, meta.limit and meta.offset echo the request defaults or values, meta.has_more is true when the page is full (a following request can still be empty), and meta.total is null for an unfiltered browse. There is no cursor or next URL; request the next page by increasing offset by limit.
See Search people for parameter syntax and Get person for a fully hydrated dossier.