Does your law firm's website say where you practice?
Not in a heading — in markup. Enter your domain and the check reads your homepage plus up to three contact, about or locations pages, then reports what they actually declare: your LegalService or Attorney markup, every office address inside it, anywhere your own pages disagree about a phone number or a street, and which of your metro's real county and suburb phrasings appear anywhere in your copy. The raw markup is quoted beside every reading, so you check us rather than trust us. No form, no email, no score.
We fetch at most 4 pages — your homepage, plus up to three contact, about or locations pages linked from it — and read the HTML your server sends. Nothing is stored, and no email is asked for.
Enter your domain. You get back the LegalService / Attorney markup your pages carry, every office address in it, anywhere your pages disagree with each other about a phone number or a street, and — once we know your metro — which of its real county and suburb phrasings appear in your own copy.
Your own domain only. This tool never fetches, names or compares a competitor.
What the check reads
Twelve fields, and only twelve. Every one is something you can check against something you already know to be true — your letterhead, your bar listing, your Google Business Profile — which is what makes a finding a five-minute fix rather than a referral to a consultant. Each field reports one of three states: declared, not declared, or unreadable. The third state exists because markup that will not parse is not the same as markup a firm never wrote, and reporting the first as the second would blame an owner for something they did do.
| Field | What it declares | Why it is on this list |
|---|---|---|
| name | The firm name as the markup declares it. | The string anything machine-readable matches against your bar listing, your directory profiles and your Google Business Profile. Nothing reconciles a disagreement for you. |
| address.streetAddress | The street line of an office address. | The part of an address that distinguishes your suite from the twelve other firms in the building. |
| address.addressLocality | The city an office sits in. | The single field that answers "where is this firm". A site can say Houston in a heading a hundred times and never once declare it here. |
| address.addressRegion | The state an office sits in. | Bar admission is per state, and a city name without a state is ambiguous — there is a Pasadena in California and a Pasadena in Texas. |
| address.postalCode | The ZIP code of an office address. | The most precise place claim in the markup, and the one most likely to still say the old office. |
| telephone | The number the markup declares for the firm. | The field most likely to disagree with itself once a call-tracking number gets added to one template and not another. |
| areaServed | The places the firm says it serves. | The only field in schema.org vocabulary that separates "where we sit" from "where we take cases" — and the field almost no firm site fills in. |
| geo | Latitude and longitude for an office. | Coordinates are unambiguous where a street line is not. Optional, and absence here is ordinary rather than alarming. |
| url | The canonical URL the entity claims for itself. | Ties the entity to a site. A node that declares no URL is harder to reconcile with anything else about you on the web. |
| sameAs | Other profiles the firm claims as its own. | The explicit link between this markup and your directory, bar and social profiles. Without it, the connection is left to be inferred. |
| @id | A stable identifier for the entity. | What lets several pages, or several nodes on one page, say "the same firm" rather than "another firm with the same name". |
| openingHours | When the office is open. | Included because it is the field most often copied from a template and left wrong. Absence is fine; a wrong value is worse than none. |
The check keeps any JSON-LD node whose @type is LegalService, Attorney, LawFirm, LocalBusiness or Organization, including nodes inside an @graph. A firm with several offices gets a row per address, wherever that address is reached from — in location, department, an array-valued address, or anywhere else — and the path it was reached by is printed beside it, so a row from an unexpected place is visible rather than silent. tel: and mailto: links and microdata itemtype attributes are reported too, in their own list and labelled as the weaker signals they are.
What a reading looks like
An illustration, not a measurement. This is markup from a firm that does not exist, at a .example domain that cannot resolve — we use a fictional firm here rather than a real one for the same reason we never fetch or name a competitor's site anywhere in this tool.
{
"@context": "https://schema.org",
"@type": "LegalService",
"name": "Harbor & Vale LLP",
"url": "https://harborvale.example/",
"telephone": "+1-713-555-0142",
"address": {
"@type": "PostalAddress",
"streetAddress": "1200 Bayou Street, Suite 400",
"addressLocality": "Houston",
"addressRegion": "TX",
"postalCode": "77002"
}
}Against that block the check reports name, telephone, url and all four address parts as declared, and areaServed, geo, sameAs, @id and openingHours as not declared. The address puts the firm in Houston, so the vocabulary section then looks for the Houston metro's own phrasings — Harris County, Fort Bend County, Sugar Land, Katy, The Woodlands — in the visible text of the pages that were read, and quotes the surrounding sentence wherever it finds one.
That last part is the finding no generic schema validator produces. A validator tells you the markup is syntactically fine. It has no opinion about the fact that a Minneapolis firm's entire website never once writes “Hennepin County” — which is a sentence a partner can add this afternoon, and which our own market vocabulary only exists to check because we built it for the local hiring questions behind Case Recommendation Share.
What this check cannot see
Seven limits, stated here rather than discovered later. They are the reason a clean result is worth something and a bad one is worth arguing with.
- We read only the HTML your server sends. Markup injected by client-side JavaScript or a tag manager is invisible here. That is worth knowing rather than working around: a crawler that does not execute your scripts sees what we see, so an invisible-to-us block is a finding about your setup and not only about our blind spot.
- We read at most 4 pages. Your homepage, plus up to three contact, about or locations pages linked from it. A fact that lives anywhere else reads as absent here — and that is our limit rather than your defect, which is why every page we could not read is listed as unread, with its reason, and is never counted as missing anything.
- We read at most 20 entity nodes per page. A firm-wide attorney directory can emit one
Attorneynode per lawyer, and reading every one of them back to you would be a report nobody can use. Where a page declares more than we read, the result says how many it declares against how many we read, and concludes nothing about the rest. One node that several pages repeat identically is reported once, with the pages it appeared on — it is one entity, not one per page. - Phrase presence is not a promise. An assistant may name a firm whose site never writes its county, and adding the county does not make an assistant name you. The vocabulary section reports what your site says, which is one input among many and not a lever.
- We do not claim chat assistants read your schema. Google documents structured data for Search and treats AI Overviews and AI Mode as part of Search (AI features and your website). No chat assistant publicly documents reading JSON-LD. We state that and stop. Anyone telling you that adding
LegalServicemarkup gets you into ChatGPT is telling you something no operator has published. - Structured data is a legibility precondition, not a cause. Markup makes a machine's reading of your firm unambiguous. It does not make a machine recommend you, and being named by an assistant says something about coverage and sources rather than about the quality of your representation.
- This result is dated, and we do not re-check it for you. It describes the bytes your site served in this run. Run it again after you change something.
Where this sits
Three questions, in order, and each one is a different measurement. AI Crawler Check answers can they reach you — it reads your robots.txt and reports which AI crawlers your site turns away. This page answers when they reach you, can they tell who and where you practice. And the Legal AI Visibility Check answers the only one that pays your bills — do they recommend you — by putting client-style hiring questions to real assistants and showing you the answers.
The first two are deterministic: same bytes in, same report out. The third is not. AI answers are probabilistic, the same question asked twice does not reliably return the same firms, and one run is a snapshot rather than a verdict. We would rather say so than sell you a straight line, which is why recommendation data is reported as a trend across many questions, runs and assistants, and why our methodology is published rather than proprietary. The longer arguments — including what an AI visibility vendor can and cannot honestly promise a law firm — are on the blog, starting with why your law firm isn't showing up in ChatGPT.
What your site declares is not what the assistants say. Check that — free.
The free Briefly check asks AI assistants the hiring questions real clients ask in your practice area and market, then shows whether your firm is recommended, which firms are named when it isn't, and which sources shaped the answer.
Check your firm free →No signup. No credit card. No sales call — you see the actual answers.
John Rice builds and operates the scan engine behind Briefly, which runs client-style lawyer-hiring questions across ChatGPT, Gemini, Perplexity, Google AI Overviews, and Google AI Mode on a recurring schedule and stores every answer it collects. He is not a lawyer; he measures what AI assistants say, with receipts. Every finding this tool reports is a direct reading of bytes your own site served during the run, quoted beside the reading. Methodology · About John
Briefly measures what AI assistants say. It does not rank, rate, or endorse attorneys, and nothing here is legal advice. Schema.org, Google, ChatGPT, Gemini, Perplexity and Claude are named here only to describe vocabularies and services we factually read or track.