Identity Pillar · Implementation Guide
Declare the correct schema.org service type so agents can match what you do — not just that you exist.
Whether your service page declares the correct
schema.org service-type
subtype — and whether that declaration carries the filterable properties agents need to match you
against service-typed queries.
I1 identifies your organization. I2 identifies what your organization does. A site can score 5 on I1 — well-declared identity — and 2 on I2 if the service-type axis is missing. An agent that knows you're an NGO but doesn't know you provide removal defense in Spanish in Cook County can't match you to "free immigration legal aid in Spanish in Chicago."
I2 covers any page that describes a service, offering, or operating business — anything an agent might evaluate against a service-typed query such as "free legal help in Spanish in Maryland," "community health clinic in San Antonio," or "emergency plumber in Oakland."
Agents answering service queries filter by type before they rank by relevance. A community clinic
without MedicalClinic schema
ranks below competitors who declared it, even when the clinic is the better answer.
Declaring the service type tells agents the category. Declaring the filterable properties — jurisdiction, language, cost, eligibility — lets them answer the specific question, not just the general one.
The same mechanics apply to a free legal aid clinic and a two-attorney immigration practice. The consequence classes differ — but the technical requirement is the same: type plus filterable properties.
Very high public-interest stakes. A noncitizen facing removal may rely on an AI assistant to find free legal help in their language. If the legal aid clinic's page declaresNGOwith noLegalService,areaServed, oravailableLanguage, the agent is less likely to surface it — and more likely to surface a commercial firm or a referral directory the person cannot actually use.
Public-interest
A noncitizen-serving legal aid clinic declares
LegalService with
serviceType: "Removal defense",
provider linked to its NGO, areaServed: "Cook County, IL",
availableLanguage: ["en", "es"],
audience.audienceType: "noncitizens facing removal proceedings",
and isAccessibleForFree: true.
Commercial
A two-attorney immigration practice declares
Attorney with
serviceType: "Family-based petitions",
areaServed: "California",
availableLanguage: ["en", "zh"],
and fees via offers and
priceRange.
Public-interest
A community health clinic declares
MedicalClinic with
areaServed,
availableLanguage, and
isAccessibleForFree,
but no audience to signal
sliding-scale eligibility.
Commercial
An urgent care chain declares
MedicalBusiness with
areaServed,
openingHours, and
priceRange — but no
availableLanguage despite
serving a multilingual population.
Public-interest
A food-pantry network declares itself a
SocialService with name and
URL only — agents see the category but can't tell which locations serve which neighborhoods,
on which days, in which languages.
Commercial
A regional plumbing co-op declares
LocalBusiness (parent type)
instead of Plumber (subtype);
agents filtering on "plumber in Oakland" are more likely to surface typed competitors above it.
Public-interest
A community legal aid organization declares
NGO (strong I1 signal) but
no LegalService — the page
reads as "an organization that exists," not "an organization that provides removal defense
in Spanish in Cook County."
Commercial
An independent plumbing business declares
LocalBusiness only —
the service axis agents filter on isn't present.
Public-interest
A 501(c)(3) volunteer-run food pantry has no JSON-LD service-type schema at all on its main page; an agent answering "free food pantry open Saturday in Pilsen" is more likely to surface commercial grocery delivery instead.
Commercial
A referral-only directory declares
LegalService as if it
provides legal services rather than referrals — agents are more likely to match it to
direct-service queries it can't fulfill.
Pick the most precise schema.org subtype that accurately describes what the page offers. Granularity is rewarded only when it's also accurate.
Public-interest types (representative)
LegalService Free or low-cost legal aid organizations GovernmentService Public services offered by a government agency SocialService Social support services — food pantries, shelters, case management MedicalClinic Community health clinics, FQHCs EmergencyService Emergency response services Hospital When the site is for an actual hospital — not a clinic EducationalOrganization Schools, literacy programs, workforce development Commercial types (representative)
Attorney Law offices and legal practices Restaurant Restaurants and food service Plumber Plumbing businesses HomeAndConstructionBusiness Contractors, HVAC, general home services Store Retail FinancialService Banks, credit unions, financial advisors MedicalBusiness Private medical practices Dentist Dental offices These lists are representative, not exhaustive. The full schema.org vocabulary is at schema.org/Service.
These are the six properties that separate a Score 5 from a Score 3. Collect them before writing any code:
@id (the I1 record)audienceType for a plain-language descriptiontrue for free services; use offers with price or priceRange for paid services
Add this code to the <head>
of the service page. If you have multiple distinct services, each gets its own declaration.
Subtype declared, but no filterable properties. Type is correct; the filter axes are empty.
<script type="application/ld+json">
{
"@context": "https://schema.org/",
"@type": "LegalService",
"name": "Casa Adelante Legal Aid",
"url": "https://casaadelante.org/legal"
}
</script> All six filterable properties declared. An agent can match jurisdiction, language, eligibility, and cost in a single pass.
<script type="application/ld+json">
{
"@context": "https://schema.org/",
"@type": "LegalService",
"name": "Casa Adelante Legal Aid — Removal Defense",
"url": "https://casaadelante.org/legal",
"description": "Free removal defense representation for noncitizens in Cook County",
"serviceType": "Removal defense",
"provider": {
"@type": "NGO",
"@id": "https://casaadelante.org/#organization"
},
"areaServed": "Cook County, IL",
"availableLanguage": ["en", "es"],
"audience": {
"@type": "Audience",
"audienceType": "Noncitizens facing removal proceedings"
},
"isAccessibleForFree": true
}
</script> Precise subtype, no filterable properties. Type is right; nothing an agent can filter on.
<script type="application/ld+json">
{
"@context": "https://schema.org/",
"@type": "Attorney",
"name": "Nguyen Immigration Law",
"url": "https://nguyenimmigration.com"
}
</script> Attorney subtype with serviceType, areaServed, availableLanguage, and pricing via offers.
<script type="application/ld+json">
{
"@context": "https://schema.org/",
"@type": "Attorney",
"name": "Nguyen Immigration Law",
"url": "https://nguyenimmigration.com",
"description": "Family-based petition practice serving California",
"serviceType": "Family-based petitions",
"provider": {
"@type": "LegalService",
"@id": "https://nguyenimmigration.com/#organization"
},
"areaServed": "California",
"availableLanguage": ["en", "zh"],
"priceRange": "$$",
"offers": {
"@type": "Offer",
"description": "Initial consultation",
"price": "250",
"priceCurrency": "USD"
}
}
</script> The same upgrade path applies to both a free immigration legal aid clinic and a small immigration law practice — different consequence classes, same technical axis.
❌ Before — NGO only, no service-type schema
An agent answering "free immigration legal help in Spanish near Chicago"
[searching "free removal defense Spanish Cook County"] Results: commercial law firm, referral directory, bar association. Agent: "I found several immigration attorneys in Cook County. Free legal aid wasn't clearly identified — you may want to search 211 directly."
✓ After — LegalService + filterable properties
After adding the Score 5 declaration
[searching "free removal defense Spanish Cook County"] Found: casaadelante.org — LegalService serviceType: Removal defense areaServed: Cook County, IL availableLanguage: en, es audience: noncitizens facing removal isAccessibleForFree: true Agent: "Casa Adelante offers free removal defense in Spanish and English in Cook County."
❌ Before — LocalBusiness only
An agent answering "immigration attorney family petitions Mandarin California"
[searching "family petition attorney Mandarin California"] Results: three firms with Attorney schema and availableLanguage: zh. Nguyen Immigration not surfaced. Agent: "Here are three Mandarin- speaking immigration attorneys in California." [Nguyen not listed]
✓ After — Attorney + filterable properties
After upgrading from LocalBusiness to Attorney with serviceType and language
[searching "family petition attorney Mandarin California"] Found: nguyenimmigration.com — Attorney serviceType: Family-based petitions areaServed: California availableLanguage: en, zh Agent: "Nguyen Immigration Law handles family-based petitions in California and works in English and Mandarin."
In both cases, the agent is filtering by service type and language before ranking by relevance.
Without the type declaration, neither page is in the candidate set. Without
availableLanguage,
neither page surfaces for language-specific queries — even if the service is genuinely multilingual.
The upgrade from Score 2 to Score 5 is the same technical task for both: choose the right subtype,
add the filterable properties, link back to the I1 record via provider.
No. I1 and I2 score independent axes. I1 measures your organization declaration (who you are). I2 measures your service-type declaration (what you do). A site that co-declares both and links them via provider is doing the right thing architecturally — but I2 doesn't award a bonus for the linkage. Only service-type correctness and the filterable property set determine your I2 score. This keeps the math symmetric: a commercial firm with a perfect LegalService declaration scores the same on I2 as a nonprofit with the same declaration.
Use the closest accurate parent type, document your reasoning internally, and score accordingly. Declaring SocialService for an unusual peer-support program is better than declaring nothing or choosing a type that doesn't fit. The rubric treats parent types as Score 3 — correct but less precise than a subtype. If the vocabulary genuinely lacks a good fit, that's a schema.org gap, not a failure on your part.
Declare the primary service as the main schema.org type on the page. Secondary or ancillary services can be declared as separate Service entities with their own serviceType properties. Each should have its own filterable properties if they differ meaningfully — different languages served, different eligibility criteria, different coverage areas.
A wrong type is one that misrepresents what the page actually does, judged from the page's own content. A referral directory declaring LegalService as if it provides direct services is a wrong type — I2 catches it. An unlicensed practitioner declaring Attorney is also a wrong type — I2 catches the declaration mismatch. Whether the practitioner holds the relevant license is a separate question: that's I3. I2 is about whether the schema.org type matches the page's stated offering, not about credential verification.
On every page that substantively describes a distinct service. A legal aid org with separate pages for removal defense, asylum, and VAWA petitions benefits from a separate service declaration on each. A small business with a single services page can declare it once there.
Use this to confirm you've implemented I2 correctly before moving on.