What ProfilePage is for
ProfilePage is a subtype of WebPage. It tells a consumer that the page as a whole is about one entity, so the facts on it describe that entity rather than, say, an article's author. The entity itself is a Person (or an Organization) given in mainEntity; the page carries page facts such as its URL, language and dates.
Google's requirements
Google reads ProfilePage markup for pages that focus on a single person or organization. Its documentation sets out:
- Required:
mainEntity, a Person or Organization with aname(oralternateName). - Recommended on the page:
dateCreatedanddateModified. - Recommended on the entity:
identifier,image,description,sameAsand interaction statistics such as follower counts. - Not for every page that has an author: an article with an author byline is an Article, not a ProfilePage.
Page and entity, separately identified
Give the page and the person different identifiers: the page its URL, the person the URL with a fragment such as #person. Then dateModifiedbelongs to the page, and jobTitle to the person, without ambiguity. See @id and stable identifiers.
How SelfBadge publishes ProfilePage
Every published SelfBadge profile carries one JSON-LD @graph: the ProfilePage, the WebSite it belongs to, the Organization nodes the person is linked to, and the works they authored. The Person is the ProfilePage's mainEntity. A shortened, fictional example:
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "ProfilePage",
"@id": "https://selfbadge.com/lena-marlowe",
"url": "https://selfbadge.com/lena-marlowe",
"name": "Lena Marlowe on SelfBadge",
"inLanguage": "en",
"isPartOf": { "@id": "https://selfbadge.com/#website" },
"dateCreated": "2026-09-14T08:12:00Z",
"dateModified": "2026-10-01T16:40:00Z",
"mainEntity": {
"@type": "Person",
"@id": "https://selfbadge.com/lena-marlowe#person",
"name": "Lena Marlowe",
"jobTitle": "Head of Product",
"sameAs": ["https://www.linkedin.com/in/lena-marlowe-example"]
}
},
{ "@type": "WebSite", "@id": "https://selfbadge.com/#website", "url": "https://selfbadge.com/", "name": "SelfBadge" }
]
}Every fact visible on the page is also in the JSON-LD, and nothing in the JSON-LD is hidden from readers. Seeded, unclaimed, thin and sample profiles still carry the same markup but send noindex.
Specifications and sources
Related reference
- Person schema: every schema.org Person property for a professional, with a full JSON-LD example.
- @id and stable identifiers: why a person needs a stable identifier, and the page versus entity (#person) pattern.
- Reading a SelfBadge profile: for bots and agents: JSON-LD, .json, .md, llms.txt, the API and the MCP server.
- sameAs: how sameAs links one person across sites, best practices and common mistakes.
- All reference pages