Where Person markup goes
Person markup is usually embedded in the HTML page about the person, as JSON-LD in a <script type="application/ld+json"> element. JSON-LD is the format Google recommends, and it keeps the data apart from the visible HTML. Microdata and RDFa express the same vocabulary inside the HTML itself. Whatever the format, the markup should describe facts that are also visible on the page.
Properties for a professional
schema.org defines dozens of properties on Person, some inherited from Thing. The table lists the ones that describe someone as a professional. Every property is optional; a property may hold one value or a list.
| Property | Expected value | Use |
|---|---|---|
name | Text | The name the person is known by. One value; variants go in alternateName. |
givenName, familyName, additionalName | Text | The parts of the name. Useful when the order or the spelling differs between languages. |
honorificPrefix, honorificSuffix | Text | Dr, Prof; PhD, MBE. Kept out of name so the name stays matchable. |
alternateName | Text | Other names in use: a short form, a maiden name, a transliteration. |
description | Text | A short description of the person. |
disambiguatingDescription | Text | What sets this person apart from others with the same name. See Disambiguation. |
image | URL or ImageObject | A photo of the person. |
url | URL | The person's own website. Not their profile on a platform (that goes in sameAs). |
sameAs | URL | Pages on other sites that unambiguously identify this person. See sameAs. |
identifier | Text, URL or PropertyValue | Registry identifiers (ORCID iD, ISNI, Wikidata QID). PropertyValue names the scheme in propertyID. |
jobTitle | Text or DefinedTerm | The current job title. |
worksFor | Organization | The current employer. Give the Organization its own @id when you can. |
hasOccupation | Occupation | The occupation in general terms, apart from a specific job. |
affiliation, memberOf | Organization | Organizations the person is affiliated with or a member of. |
alumniOf | EducationalOrganization or Organization | Schools and universities attended, and former employers. |
hasCredential | EducationalOccupationalCredential | Degrees, certifications and licenses. |
award | Text | Awards and honors, one value each. |
knowsAbout | Text, Thing or URL | Fields of expertise. |
knowsLanguage | Language or Text | Languages spoken. A Language node can carry a BCP 47 code. |
workLocation, homeLocation | Place | Where the person works or lives. For privacy, a city at most. |
subjectOf | CreativeWork | Articles, talks and pages about the person. |
birthDate, nationality, gender | Date, Country, Text | Defined by schema.org but personal. Leave them out unless the person chose to publish them. |
A complete example
A fictional person, Lena Marlowe, on her own website. The organization has its own @id, the accounts are in sameAs, and the ORCID iD is the one ORCID uses in its own documentation for a fictional researcher, so the example points to no real person.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Person",
"@id": "https://lenamarlowe.example/#person",
"name": "Lena Marlowe",
"givenName": "Lena",
"familyName": "Marlowe",
"alternateName": "L. Marlowe",
"description": "Product leader working on analytics software for hospitals.",
"disambiguatingDescription": "Head of Product at Brightfield Analytics in London; not the novelist of the same name.",
"image": "https://lenamarlowe.example/photo.jpg",
"url": "https://lenamarlowe.example/",
"jobTitle": "Head of Product",
"worksFor": {
"@type": "Organization",
"@id": "https://brightfield.example/#organization",
"name": "Brightfield Analytics",
"url": "https://brightfield.example/"
},
"hasOccupation": {
"@type": "Occupation",
"name": "Product manager"
},
"workLocation": {
"@type": "Place",
"name": "London, United Kingdom"
},
"alumniOf": {
"@type": "CollegeOrUniversity",
"name": "University of Example"
},
"hasCredential": {
"@type": "EducationalOccupationalCredential",
"name": "MSc Health Informatics",
"credentialCategory": "degree"
},
"knowsAbout": ["Product management", "Health informatics"],
"knowsLanguage": [
{ "@type": "Language", "name": "English", "alternateName": "en" },
{ "@type": "Language", "name": "Spanish", "alternateName": "es" }
],
"award": "Example Product Award, 2024",
"memberOf": {
"@type": "Organization",
"name": "Example Product Managers Association"
},
"sameAs": [
"https://www.linkedin.com/in/lena-marlowe-example",
"https://github.com/lena-marlowe-example"
],
"identifier": {
"@type": "PropertyValue",
"propertyID": "ORCID",
"value": "0000-0002-1825-0097",
"url": "https://orcid.org/0000-0002-1825-0097"
},
"subjectOf": {
"@type": "NewsArticle",
"headline": "Brightfield names a new head of product",
"url": "https://news.example/brightfield-head-of-product"
}
}
</script>The Person markup generator writes this markup from a short form, with a stable @id and the accounts you list.
Rules that keep the markup useful
- Mark up what the page shows. Google's structured data guidelines ask that markup describes the visible content of the page.
- One person, one @id. Use the same identifier everywhere you describe the same person. See @id and stable identifiers.
- Nest or reference organizations, do not flatten them.
"worksFor": "Brightfield"is valid text, but an Organization node with a name and a URL is unambiguous. - Separate the person from the page. The page is a WebPage or ProfilePage whose
mainEntityis the Person. - Leave out what the person did not choose to publish: birth dates, home addresses, family. Schema.org defines these properties; that is no reason to fill them.
- Validate. The Schema Markup Validator checks the vocabulary; Google's Rich Results Test checks Google's own requirements.
How SelfBadge uses Person
Every SelfBadge profile publishes a ProfilePage whose mainEntity is a Person with the @id https://selfbadge.com/<handle>#person. It uses the properties in the table above, with organizations as separate nodes, credentials as EducationalOccupationalCredential, identifiers as PropertyValue and only proven accounts in sameAs. Verification status is not in the JSON-LD (schema.org has no clean property for it); it is in the .jsonversion. See Reading a SelfBadge profile.
Specifications and sources
Related reference
- sameAs: how sameAs links one person across sites, best practices and common mistakes.
- @id and stable identifiers: why a person needs a stable identifier, and the page versus entity (#person) pattern.
- ProfilePage: the schema.org type for profile pages, and how SelfBadge uses it.
- Person markup generator: a tool that writes schema.org Person JSON-LD for your own site.
- Disambiguation: how machines tell people with the same name apart.
- All reference pages