Exports and data
Contact field reference
Category: Exports and data · Version: 1.0 · Date: 2026-09-04 · Status: Active
GENERATED FILE. DO NOT EDIT BY HAND.
Regenerate with
pnpm --filter @legion/field-registry exec tsx src/generate.ts.
What this does
This is the plain-language list of every field OSPRY can show you about a person, a company or a contact. Use it to decide what to map into your CRM, what to expect in an export, and what a webhook body will contain.
How to read the table
- key is the stable name of the field. It never changes once published.
- label is what the portal calls it on screen.
- description is what the value means.
- type is the base type of the value. A field with a fixed list of values is shown simply as
enum. - example is one representative value.
- where_it_appears lists the places the field can show up for you.
Every value is optional unless your plan and settings say otherwise. When OSPRY does not have a value for a field, the field is still named in the payload, with a short reason, so you always know whether a blank means "we looked and there is nothing" or "this was not requested".
Fields
61 fields.
| key | label | description | type | example | where_it_appears |
|---|---|---|---|---|---|
| company.city | City | The visitor location shown on the company-tier card. | text | Columbus | Profile page, List page, CSV export, Webhook, API |
| company.domain | Company domain | The registrable domain. Half of the row unique key, so the upsert never overwrites it. | text | northwindlogistics.com | Profile page, List page, Search, CSV export, Webhook, API |
| company.employee_count | Company size | The employee-count band as delivered by the resolving provider. | text | 201-500 | Profile page, List page, CSV export, Webhook, API |
| company.est_revenue | Estimated revenue | The revenue band as delivered by the resolving provider. | text | $50M-$100M | Profile page, List page, CSV export, Webhook, API |
| company.first_seen_at | First seen | When this company was first resolved for the tenant. | timestamp | 2026-08-14T13:02:44Z | Profile page, Webhook, API |
| company.id | Company id | The tenant-scoped identifier of the resolved company record. | uuid | 2b7f4c11-9a10-4f2e-8c31-77c4b9d1e004 | Search, Webhook, API |
| company.industry | Industry | The industry band the resolving provider reports for the organization. | text | Transportation and Logistics | Profile page, List page, Search, CSV export, Webhook, API |
| company.last_seen_at | Last seen | When this company was last re-resolved. Refreshed on every upsert conflict. | timestamp | 2026-09-04T18:59:02Z | Profile page, List page, Webhook, API |
| company.linkedin_url | LinkedIn URL | The organization's LinkedIn page. Emitted in the export for a company record. | url | https://www.linkedin.com/company/northwind-logistics | Profile page, List page, CSV export, Webhook, API |
| company.name | Company name | The resolved organization name. The only non-nullable business column on the table. | text | Northwind Logistics | Profile page, List page, Search, CSV export, Webhook, API |
| company.resolved_by_provider | Resolved by | Which vendor resolved this company. A per-ROW insert-only stamp, masked to a tier label on every customer surface. | text | primary | Profile page, Webhook, API |
| company.state | State | The visitor region shown on the company-tier card. | text | OH | Profile page, List page, CSV export, Webhook, API |
| company.website | Website | The company's website URL as delivered, kept alongside the normalized domain. | url | https://northwindlogistics.com | Profile page, List page, Search, Webhook, API |
| contact.company | Company name | The employer name on the roster row. company is the canonical inbound key; the HighLevel portal lane still emits companyName, which is the recorded three-lane defect this pull request carries forward. |
text | Northwind Logistics | Profile page, List page, Webhook, API |
| contact.email | The contact email as ingested, stored case-insensitively. NULL when only the hash is known. | dana.whitfield@northwindlogistics.com | Profile page, List page, Search, Webhook, API | ||
| contact.first_name | First name | The contact's given name as the upstream source supplied it. | text | Dana | Profile page, List page, Search, Webhook, API |
| contact.id | Contact id | The tenant-scoped identifier of the CRM roster contact. | uuid | 4b7c2d19-33a8-42ce-9f01-6d5a8e7b0c34 | Search, Webhook, API |
| contact.last_name | Last name | The contact's family name as the upstream source supplied it. | text | Whitfield | Profile page, List page, Search, Webhook, API |
| contact.phone | Phone | The contact phone number, which is what gives the inbound catalog key phone a writable landing instead of a reference-only one. Added by this pull request and carrying no production writer until the inbound landing ships, so it holds no production data today. Never emitted without its DNC state, which travels inside the phone wire shape. |
phone | +1 614 555 0142 | Profile page, Webhook, API |
| contact.title | Job title | The contact's job title as the upstream source supplied it. | text | VP of Demand Generation | Profile page, List page, Webhook, API |
| person.business_email | Business email | The person's work email address, stored case-insensitively. | dana.whitfield@northwindlogistics.com | Profile page, List page, Search, CSV export, Webhook, API | |
| person.city | City | The coarse business location the resolving provider reports. It is not the home address, which is a tier-3 trait. | text | Columbus | Profile page, List page, CSV export, Webhook, API |
| person.company_domain | Company domain | The registrable domain of the person's employer. | text | northwindlogistics.com | Profile page, List page, CSV export, Webhook, API |
| person.company_name | Company name | The denormalized name of the person's employer. | text | Northwind Logistics | Profile page, List page, Search, CSV export, Webhook, API |
| person.employee_count | Company size | The employee-count band of the person's employer, as delivered by the provider. | text | 201-500 | Profile page, List page, CSV export, Webhook, API |
| person.est_revenue | Estimated revenue | The revenue band of the person's employer, as delivered by the provider. | text | $50M-$100M | Profile page, List page, CSV export, Webhook, API |
| person.first_name | First name | The person's given name. | text | Dana | Profile page, List page, Search, Webhook, API |
| person.first_seen_at | First seen | When this person was first resolved for the tenant. | timestamp | 2026-08-14T13:02:44Z | Profile page, Webhook, API |
| person.full_name | Full name | The person's full name, joined from the first and last name at ingest. | text | Dana Whitfield | Profile page, List page, Search, CSV export, Webhook, API |
| person.id | Person id | The tenant-scoped identifier of the resolved person record. | uuid | 9f2c1e4a-7b30-4a51-9d8e-2f6b1c0d5e77 | Search, Webhook, API |
| person.industry | Industry | The industry of the person's employer, as the resolving provider bands it. | text | Transportation and Logistics | Profile page, List page, CSV export, Webhook, API |
| person.last_name | Last name | The person's family name. | text | Whitfield | Profile page, List page, Search, Webhook, API |
| person.last_seen_at | Last seen | When this person was last re-resolved. Refreshed on every provider upsert. | timestamp | 2026-09-04T18:59:02Z | Profile page, List page, Webhook, API |
| person.linkedin_url | LinkedIn URL | The person's LinkedIn profile URL. Half of the row's unique key, so the provider upsert never overwrites it. | url | https://www.linkedin.com/in/danawhitfield | Profile page, List page, CSV export, Webhook, API |
| person.name_source | Name source | Which class of writer last set the name columns. The ADR-031 ladder ranks form above manual above enrichment above provider, and NULL ranks as provider. | enum | provider | Profile page, Webhook, API |
| person.page_hit.path | Path | The normalized path of the page the visitor loaded. | text | /pricing | List page |
| person.page_hit.referrer | Referrer | The referring URL for the page hit. | url | https://www.google.com/ | List page |
| person.page_hit.seen_at | Seen at | When the page hit happened. | timestamp | 2026-09-04T18:59:02Z | List page |
| person.page_hit.utm_campaign | UTM campaign | The campaign name parsed from the page URL. This is the live UTM value the profile export column reads once the export joins the page-hit stream. | text | q3-logistics | List page, CSV export |
| person.page_hit.utm_source | UTM source | The campaign source parsed from the page URL. Part of the only populated UTM set in the product. | text | List page | |
| person.phone | Phone | A phone number captured from a submitted first-party form. Never emitted without its DNC state, which travels in the phone wire shape. | phone | +1 614 555 0142 | Profile page, Webhook, API |
| person.postal_code | Postal code | The coarse postal code the resolving provider reports for the business location. | text | 43215 | Profile page, Webhook, API |
| person.provider_traits.attributes | Provider traits | The demographic, household and financial trait list the secondary resolver returns, each entry carrying a key, a label, a value and a group. Tier 3: delivered only when the customer enables the sensitive_traits tier on a connector, and shown on the profile page as present or missing. | json | age_range = 45-54 (demographics) | Profile page, Webhook |
| person.provider_traits.emails | Personal emails | The multi-valued personal email list the secondary resolver returns, each entry carrying whether the vendor verified it. The verified set is preferred and both sets are surfaced, deduplicated. | d.whitfield@example.com (verified) | Profile page, Webhook, API | |
| person.provider_traits.phones | Phones | The multi-valued, DNC-aligned phone list the secondary resolver returns. Each entry carries its number, its kind, its do-not-call flag, whether that flag was actually supplied, and the derived callable value; an entry whose callability is unknown is never asserted callable. | phone | +1 614 555 0142 (mobile, callable) | Profile page, Webhook, API |
| person.resolved_by_provider | Resolved by | Which vendor resolved this person. A per-ROW insert-only stamp, never per-field provenance, and masked to a tier label on every customer surface. | text | secondary | Profile page, Webhook, API |
| person.seniority | Seniority | The seniority band both providers return. Elected by the resolver today and landed by the winner writer this pull request ships. | text | VP | Profile page, CSV export, Webhook, API |
| person.state | State | The coarse business region the resolving provider reports. | text | OH | Profile page, List page, CSV export, Webhook, API |
| person.title | Job title | The person's job title at the resolved company. | text | VP of Demand Generation | Profile page, List page, Search, CSV export, Webhook, API |
| person.trait.age_range | Age range | The demographic age band the secondary resolver returns, written into the attribute list under the demographics group. | text | 45-54 | Profile page, Webhook |
| person.trait.gender | Gender | The demographic gender signal the secondary resolver returns, written into the attribute list under the demographics group. | text | F | Profile page, Webhook |
| person.trait.homeowner | Homeowner | The household home-ownership signal the secondary resolver returns, written into the attribute list under the household group. | text | Yes | Profile page, Webhook |
| person.trait.income_range | Income range | The financial income band the secondary resolver returns, written into the attribute list under the financial group. | text | $150k-$200k | Profile page, Webhook |
| person.trait.married | Married | The household marital-status signal the secondary resolver returns, written into the attribute list under the household group. | text | Married | Profile page, Webhook |
| person.trait.net_worth | Net worth | The financial net-worth band the secondary resolver returns, written into the attribute list under the financial group. | text | $500k-$1M | Profile page, Webhook |
| person.trait.personal_address | Personal address | The home street address the secondary resolver can return. The vendor accepts it as an input identifier but the input record type declares no property for it, so this repository cannot send it, and the trait builder writes no attribute for it either. | text | 118 Maple Court | Profile page, Webhook |
| person.trait.personal_city | Personal city | The home city the secondary resolver can return. Vendor-accepted as an input identifier, unreachable from this repository, and written into no attribute list. | text | Dublin | Profile page, Webhook |
| person.trait.personal_state | Personal state | The home state the secondary resolver can return. Vendor-accepted as an input identifier, unreachable from this repository, and written into no attribute list. | text | OH | Profile page, Webhook |
| person.trait.personal_zip | Personal ZIP | The home postal code the secondary resolver can return. Vendor-accepted as an input identifier, unreachable from this repository, and written into no attribute list. | text | 43017 | Profile page, Webhook |
| person.visit.referrer | Referrer | The referring URL for the visit. The profile export emits the most recent non-null value per profile. | url | https://www.google.com/ | CSV export |
| person.visit.seen_at | Seen at | When the visit happened, as delivered by the provider. The profile export aggregates it into the last-seen and page-count columns. | timestamp | 2026-09-04T18:59:02Z | CSV export |
Your own custom fields
Fields you define yourself are not in the table above, because their names, labels and types are yours rather than ours. They travel alongside the standard fields in a custom_fields list, and each entry carries a key, a label, a type, the value, where the value came from, and when it was last filled in.
Phone numbers and email addresses
Phone numbers and extra email addresses travel as lists rather than single values, because a contact can have more than one of each. A phone entry carries the number, what kind of number it is, whether it is on a do-not-call list, whether that status is known at all, and a single callable flag that is true only when the status is known and the number is not on a list. A number whose callable is false is never sent.
Tips and FAQs
- A blank is never silent. A field with no value is still named, with one of five short reasons, so two contacts always produce the same shape.
- The list only grows. Adding a field advances the dated contract version. Removing or renaming one takes a new version with a 90-day overlap.
- Machine-readable versions. The same contract is published as a JSON Schema document you can generate a client from, and as an OpenAPI document.