person
Every canonical field of a person record, how one is keyed tier by tier, and the relations its fields mint, generated from spec/fields/person.json
What you'll learn
You're mapping a column or a vendor field to a person field and need the exact name, its tier, and its normalization rule.
- every canonical field of a person, with its tier and type
- how a person is keyed, tier by tier
- which fields mint a relation to another type
Canonical field registry for person records (SPEC.md §4a, ADR-017). Seeded from the fields the v0 adapters actually touch plus the curated cross-provider overlap. A field name not listed here must be vendor-namespaced (<vendor>.<field>). A subject type (ADR-054): what a pipeline delivers to. The identity list is SPEC.md §4's person derivation, tier by tier.
Identity
A person is keyed by the first of these tiers the record has, strongest first.
| Tier | From | Key |
|---|---|---|
| 1 | email | the normalized value |
| 2 | linkedin_url | the normalized value |
| 3 | github_username | the value prefixed gh: |
| 4 | twitter_handle | the value prefixed tw: |
| 5 | (full_name or first_name + last_name) and company_domain | a SHA-256 of those, prefixed nh: |
As the type file states it:
[
{
"field": "email"
},
{
"field": "linkedin_url"
},
{
"field": "github_username",
"prefix": "gh:"
},
{
"field": "twitter_handle",
"prefix": "tw:"
},
{
"hash": [
{
"any": [
"full_name",
{
"join": [
"first_name",
"last_name"
]
}
]
},
"company_domain"
],
"prefix": "nh:"
}
]
Fields
| Field | Tier | Type | Normalization | Description |
|---|---|---|---|---|
email | identity | string (email) | email | Work or personal email. Identity tier 1 (SPEC.md §4). |
linkedin_url | identity | string (uri) | linkedin_url | PUBLIC LinkedIn profile URL (vanity slug) only. Identity tier 2 via the derived slug. An internal-form or Sales-Navigator URL is an INVALID value for this field — those are linkedin_internal_url / linkedin_sales_nav_url (SPEC.md §4, ADR-020); the shapes are separate fields precisely so they can never collide under one name. |
linkedin_internal_url | core | string (uri) | trim | Internal-form LinkedIn profile URL (opaque token in the /in/ path, such as linkedin.com/in/ACwAA…). Stored as the URL, case preserved — gtme distinguishes observable URL shapes and does not reinterpret them as identifiers. NOT key material in v0 (SPEC.md §4, ADR-020): an enrichment that resolves it to the public profile writes linkedin_url, and the ordinary key upgrade applies. |
linkedin_sales_nav_url | core | string (uri) | trim | Sales Navigator URL form (linkedin.com/sales/lead/… or /sales/people/…). Stored as the URL, case preserved. NOT key material in v0 (SPEC.md §4, ADR-020); same recovery path as linkedin_internal_url. |
first_name | identity | string | trim | Given name. Feeds the name-hash fallback tier with last_name (SPEC.md §4). |
last_name | identity | string | trim | Family name. Feeds the name-hash fallback tier with first_name (SPEC.md §4). |
github_username | identity, reserved | string | handle | GitHub username. Reserved identity tier 3, key prefix gh: (SPEC.md §4, ADR-020); no v0 adapter provides it. |
twitter_handle | identity, reserved | string | handle | Twitter/X handle without the @. Reserved identity tier 4, key prefix tw: (SPEC.md §4, ADR-020); no v0 adapter provides it. |
full_name | core | string | trim | Full display name. Feeds the name-hash fallback tier when first/last are absent. |
title | core | string | trim | Current job title, as stated. |
seniority | core | string | lower | Seniority band, lowercased. No locked value domain in v0 — providers do not converge enough to pin one; a domain is declared only if real cross-provider evidence shows convergence (SPEC.md §4a). |
headline | core | string | trim | Profile headline/tagline. |
about | core | string | trim | Profile summary / about section. |
city | core | string | trim | City of residence/work. |
state | core | string | trim | State/region. |
country | core | string | trim | Country. |
location | core | string | trim | Free-form location string when a provider does not split city/state/country. |
company_name | core | string | trim | Current employer's name. |
company_domain | core | string | domain | Current employer's registrable domain (eTLD+1). The comparable, dedupe-safe form — never a full URL. Declares the works_at reference (ADR-054): a person record carrying it also names a company, keyed and populated from company_domain and company_name, and the runner writes works_at from the person to it. |
company_website | core | string (uri) | trim | Current employer's website URL as provided. company_domain is the comparable form. |
company_linkedin_url | core | string (uri) | linkedin_url | Current employer's LinkedIn company page URL. |
company_employees | core | integer | none | Current employer's headcount as an integer — never a range string. An adapter whose provider reports a range maps it to a point estimate or omits the field. |
company_industry | core | string | trim | Current employer's industry label. Value domain deferred until a second adapter forces comparability (rule of two). |
current_role | core | string | trim | Current role as an enrichment provider states it (may differ from a source's title). |
current_company | core | string | trim | Current employer as an enrichment provider states it. |
role_history | core | array of string | none | Past roles, most recent first, one string per role. |
recent_posts | core | array of string | none | Recent public post texts, most recent first. |
follower_count | core | integer | none | Social follower count. |
open_to_work | core | boolean | none | Whether the profile advertises being open to work. |
email_status | core | string | lower | Email verification status as the providing adapter reports it. Waterfall-relevant; canonical value domain deferred until a second adapter forces comparability (rule of two). |
first_line | core | string | trim | Composed personalized opening line, consumed by deliver steps. |
ps_line | core | string | trim | Composed personalized P.S. line, consumed by deliver steps. |
References
A field with a reference names a record of another type. A source that writes it also mints that record and the relation between them.
| Field | Names a | Relation | Fields carried |
|---|---|---|---|
company_domain | company | works_at | company_domain, company_name |
Examples
| Field | Example value |
|---|---|
email | jane.doe@acme.com |
linkedin_url | https://www.linkedin.com/in/jane-doe |
linkedin_internal_url | https://www.linkedin.com/in/ACwAAAbQ2xKB9… |
linkedin_sales_nav_url | https://www.linkedin.com/sales/lead/ACwAAAbQ2xKB9…,NAME_SEARCH |
first_name | Jane |
last_name | Doe |
github_username | janedoe |
twitter_handle | janedoe |
full_name | Jane Doe |
title | VP Marketing |
seniority | vp |
headline | Building outbound that people actually read |
about | 20 years of B2B marketing… |
city | Portland |
state | Oregon |
country | United States |
location | Portland, Oregon, United States |
company_name | Acme Corp |
company_domain | acme.com |
company_website | https://www.acme.com |
company_linkedin_url | https://www.linkedin.com/company/acme-corp |
company_employees | 120 |
company_industry | Computer Software |
current_role | VP Marketing at Acme Corp |
current_company | Acme Corp |
role_history | [VP Marketing, Acme Corp (2022–) Director of Growth, Beta Inc (2018–2022)] |
recent_posts | [Shipped our new onboarding flow today…] |
follower_count | 4821 |
open_to_work | false |
email_status | verified |
first_line | Loved your post on onboarding flows — |
ps_line | P.S. congrats on the Series B. |