Person schema for web extraction
The Person schema is a copy-and-paste shape for turning a public profile page into typed, validated JSON. Instead of writing CSS selectors or XPath against a bio page, an about-me section, a conference speaker card or a company team listing, you describe the fields you want (name, jobTitle, organization, location, bio, sameAs) and Extracto renders the page in a real headless browser and returns exactly those fields, validated against the schema. Anything the page does not actually state comes back as null rather than a guessed or hallucinated value, which matters a great deal when the subject is a real human being. Person data is structurally messy: the same role might be labelled "Title", "Position" or "Role", the employer might live in a byline, a logo alt-text or a sidebar, and social links are scattered across header icons, footers and inline mentions. Describing fields instead of selectors lets one schema generalize across very differently built profile pages. Because Extracto includes a managed anti-bot bypass layer with proxies handled for you, the same schema works on JavaScript-rendered profile widgets and on profiles served behind Cloudflare, DataDome or PerimeterX without any setup on your side. The one shape it will not reach is login-gated content that needs your session cookies. Important: people are personal data. Use this schema on public profiles only, keep volume modest, respect each site's Terms of Service and robots.txt, and treat anything you collect under your applicable privacy obligations such as the GDPR, including having a lawful basis and honouring deletion requests. Treat this entry as a starting point you trim or extend to the specific page you are reading.
Fields in a Person schema
The fields teams most often extract for a person, what type each one is, and whether it is usually present.
| Field | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | The person's full display name as written on the page. Typing it as a required string means a profile that renders without a recognizable name fails validation loudly instead of silently returning a half-empty record you would later have to clean. |
| jobTitle | string | optional | The current professional role or title, such as 'Senior Staff Engineer' or 'Head of Product'. Pages label this inconsistently (Title, Position, Role), so describing the field rather than a selector lets one schema read it across differently structured bios; if the page never states a title it returns null, not an invented one. |
| organization | string | optional | The employer, company or affiliation the person is associated with. Returning it as its own typed field separates the where-they-work signal from the free-text bio, which is what makes the record joinable against a company table instead of needing a second parse. |
| location | string | optional | The stated location or base, for example 'Berlin, Germany' or 'Remote'. Kept as a plain string because profile pages rarely break city and country into separate elements; null here honestly signals the page did not disclose a location rather than guessing from a flag emoji or timezone. |
| bio | string | optional | The biographical summary or about paragraph in the person's own framing. Capturing it verbatim as a string preserves the source wording for E-E-A-T and provenance, and avoids the model paraphrasing or compressing claims the person did not actually make. |
| sameAs | string[] | optional | An array of canonical profile URLs linking the person to other platforms (personal site, LinkedIn, GitHub, Mastodon). Typing it as a list of strings mirrors the schema.org sameAs convention and is what lets you disambiguate two people with the same name; an empty array cleanly means no links were found. |
| pronouns | string | optional | Self-stated pronouns when the profile lists them, such as 'she/her' or 'they/them'. Returned only when present and null otherwise, so you never attribute pronouns the person did not publish, which is both more accurate and more respectful of the individual. |
| profileImageUrl | string | optional | The absolute URL of the headshot or avatar shown on the profile. Typed as a string URL so it is immediately usable in a UI; if the page uses a generic placeholder or no image, the field returns null rather than a misleading default-avatar link. |
The schema
Copy this and send it with any URL.
{
"name": "string",
"jobTitle": "string",
"organization": "string",
"location": "string",
"bio": "string",
"sameAs": "string[]",
"pronouns": "string",
"profileImageUrl": "string"
} Example output
Validated JSON back, matching the schema.
{
"name": "Tim Berners-Lee",
"jobTitle": "Computer Scientist, Inventor of the World Wide Web",
"organization": "World Wide Web Consortium (W3C)",
"location": "London, United Kingdom",
"bio": "British computer scientist best known as the inventor of the World Wide Web in 1989. He is a professor at the University of Oxford and MIT, and directs the W3C, which oversees the continued development of the web.",
"sameAs": [
"https://www.w3.org/People/Berners-Lee/",
"https://en.wikipedia.org/wiki/Tim_Berners-Lee"
],
"pronouns": null,
"profileImageUrl": "https://upload.wikimedia.org/wikipedia/commons/Tim_Berners-Lee.jpg"
} Try this person schema against a real page in the live demo, or read the docs to use it via the API.