Structured data for a developer tool site
Which schema types are worth adding, which are a waste, and the one rule that turns markup from an asset into a manual penalty.
Structured data is machine-readable markup describing what a page is, usually as JSON-LD in the head. It does not raise rankings on its own. It removes ambiguity, so a parser does not have to guess, and guessing wrong is how you lose an answer to somebody whose markup was clearer.
The one rule
The markup must describe what a reader can see on the page.
That is not a style preference. Marking up an FAQ that is not on the page, a rating nobody left, or a price that is not shown is a guidelines violation, and the penalty is not scoped to the page. A site can lose its rich results entirely.
We ran into this on our own site. The service page was a good candidate for FAQPage markup and it has no visible FAQ, so it did not get one. It got Service with an Offer at the price the page already states, which is a claim the page supports.
What is worth adding
| Type | Where | Why |
|---|---|---|
Organization | Every page | The entity signal. One @id, referenced everywhere |
WebSite | Home page | Names the site and its publisher |
SoftwareApplication | Product pages | Category, operating system, offers |
Article | Written pages | Author, publisher, published and modified dates |
BreadcrumbList | Every page below the root | Hierarchy, and it shows in results |
FAQPage | Pages with a visible FAQ only | The clearest path into People Also Ask |
HowTo | Real step-by-step procedures | Steps get extracted as steps |
Dataset | Pages publishing data | Indexed separately, and the distributions become findable |
Offer | Pages that state a price | Only where the price is visible |
What is not worth adding
AggregateRating you cannot substantiate. The most common way sites get manual actions in this area.
Review you wrote about yourself. Same.
Product on a page that is not a product. A blog post about a product is an Article.
Every type you can think of, stacked. More markup is not better markup. Each type is a claim, and a wrong claim is worse than a missing one.
The shape that works
One JSON-LD block, one @graph, nodes referring to each other by @id:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://example.com/#organization",
"name": "Acme",
"url": "https://example.com/",
"logo": { "@type": "ImageObject", "url": "https://example.com/logo.png" }
},
{
"@type": "Article",
"headline": "How the queue retries",
"datePublished": "2026-09-03",
"dateModified": "2026-09-03",
"publisher": { "@id": "https://example.com/#organization" }
},
{
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Acme", "item": "https://example.com/" },
{ "@type": "ListItem", "position": 2, "name": "Docs", "item": "https://example.com/docs" }
]
}
]
}
</script>
Three things that go wrong here often:
A missing @context. Without it the block is not schema.org and does nothing. Easy to omit when hand-writing, and it fails silently.
Unescaped content. A </script> inside a string ends the block. Escape <, > and & when generating.
Dates that are not real. dateModified set to the build date on every page tells a parser that your whole site changed today, every day. Use the date the content actually changed.
Generate it, do not hand-write it
Hand-written markup drifts from the page. The title changes and the headline does not. A date is updated in the text and not in the block.
Generate it from the same source as the page, in the same build, and add a test that parses every block and asserts the required nodes exist. We do that: every page in this library is checked for parseable JSON-LD, a correct @context and a BreadcrumbList, and the build fails without them.
Does it matter for coding agents
Less than for search engines, and it is not nothing.
An agent fetching a page mostly reads the content. But structured data on a documentation page states the version, the publisher and the dates in a form that cannot be misread, and that is exactly the class of fact models get stale on.
The bigger lever for agents is a Markdown twin of the page, which almost nobody publishes. Do both. The markup is an hour, the twin is an afternoon, and neither is a substitute for the content being correct.
Common questions
What structured data should a developer tool site have?
Organization and WebSite on the home page, SoftwareApplication on the product pages, Article on written pages, BreadcrumbList everywhere, FAQPage only where a visible FAQ exists, HowTo for real procedures, and Dataset if you publish data.
Does structured data improve rankings?
Not directly. It removes ambiguity, so a parser does not have to guess what it is looking at, and it makes certain rich results possible. Treat it as a label rather than a lever.
What is the one rule?
The markup must describe what a reader can see on the page. Marking up an FAQ that does not appear, or a rating nobody left, is a guidelines violation and it can cost a whole site its rich results.
Is JSON-LD better than microdata?
For practical purposes yes. It sits in one block in the head, it does not entangle with your markup, and it is what the documentation and the testing tools assume.
Where this comes from
Armature ran 5,292 judged sessions with Claude Code, Codex and Cursor inside 51 realistic codebases, and published every run. The numbers on this page come from that work.