Free JSON-LD Schema Generator
Build valid Schema.org structured data for any page — pick a type, fill the fields, copy the code. Powers Google rich results and helps AI answer engines cite your content.
The rich-result + agentic-commerce workhorse. AI shopping agents read price, availability, and GTIN from this.
Strongly recommended for AI shopping surfaces.
InStock, OutOfStock, PreOrder…
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product"
}
</script>A JSON-LD generator turns form fields into a Schema.org structured-data block you paste into a page’s HTML. This one builds six types — Product, Organization, Article, LocalBusiness, FAQPage and WebSite — nests the sub-entities for you, drops empty fields, and wraps the output in a script tag. It runs in your browser; nothing you type is uploaded.
How the JSON-LD generator works
The tool is a set of templates, one per Schema.org type. Each lists the fields that type needs and a build step that turns what you type into a nested JSON-LD object with @context and @type already set. No account, no crawl of your site, no upload; the code runs in your browser tab.
- 1
Pick the schema type
Product for something you sell, Organization for your brand entity, Article for a post, Local Business for a physical location, FAQ Page for question-and-answer content, Website for the sitelinks search box. The generator builds one type at a time; if a page needs two, generate each and paste both blocks.
- 2
Fill the fields
Fields marked with an asterisk are required for that preset. You type flat values and the generator nests them: brand becomes a Brand, price and currency become an Offer, an author name becomes a Person, a street address becomes a PostalAddress. A blank field is dropped, not emitted as an empty string.
- 3
Check the output against the page
The right-hand pane updates as you type. Read it once against the visible page: same price, same headline, same publish date. Structured data that contradicts what a visitor sees is the one mistake no generator can catch for you.
- 4
Copy with or without the script wrapper
With the wrapper on, the output is a complete <script type="application/ld+json"> tag for the head of the page. Turn it off when a CMS field or a component already adds the tag. Download gives you an .html or .json file to match.
- 5
Validate, ship, then view source
Paste the block into the JSON-LD validator linked below; it checks the same types for required and recommended fields. After deploying, view source on the live URL and confirm the block is in the HTML the server returns, not only in the DOM after JavaScript runs.
Every schema type this generator builds
Six presets, covering the pages most sites actually have. The required column is what the form enforces. The two signal columns are different jobs: a search engine uses the type to pick a rich result; an answer engine uses it as facts and provenance.
| Type | Required in this tool | What it signals to a search engine | What it signals to an AI answer engine |
|---|---|---|---|
| Product | Product name | Product rich results and merchant listings once an Offer is present. Price, currency, availability and rating are the fields Google reads for those surfaces. | Price, availability, GTIN and brand as facts a shopping agent can read without parsing your layout. If an agent is going to recommend a product, this is where it finds them. |
| Organization | Organization name, website URL | The entity behind the site: name, logo and contact details for knowledge panels and the brand-name query. | The sameAs list is what matters. It ties your domain to the LinkedIn, X, Crunchbase and Wikipedia profiles an engine already knows, so mentions of your brand resolve to one entity. |
| Article | Headline, author name | Article rich results, plus the publish and modified dates that feed freshness. Publisher with a logo is what Google recommends for the full result. | Author, publisher and dateModified are the provenance an engine weighs before citing a claim. mainEntityOfPage points at the canonical URL to cite. |
| LocalBusiness | Business name, street address | Local pack and map results: the PostalAddress, telephone and price range Google matches against a Business Profile. | Answers to "near me" and "in [city]" prompts are assembled from address, phone and price range. This block puts those facts in one place instead of a footer. |
| FAQPage | At least one question with an answer | Marks the page as questions with accepted answers. Since August 2023 Google has limited FAQ rich results to well-known, authoritative government and health sites; expect no visual result on a commercial site. | The most directly liftable type: a question and a complete-sentence answer, which is the shape an answer engine produces. Keep answers plain text that also appears on the page. |
| WebSite | Site name, site URL | Names the site and, with a search URL template, declares the SearchAction Google can use for the sitelinks search box. | Little on its own. It anchors the site as an entity other blocks can reference; the potentialAction is a search-engine feature, not something an answer engine quotes. |
| You fill in | Generator emits | Inside |
|---|---|---|
| Brand | { "@type": "Brand", "name": … } | Product |
| Price, currency, availability, product URL | { "@type": "Offer", … }, availability expanded to the full https://schema.org/InStock form | Product |
| Rating value, review count | { "@type": "AggregateRating", … } | Product |
| Social and profile URLs, one per line | A sameAs array, blank lines removed | Organization |
| Contact email | { "@type": "ContactPoint", "contactType": "customer service", … } | Organization |
| Author name and URL | { "@type": "Person", … } | Article |
| Publisher name and logo URL | { "@type": "Organization", "logo": { "@type": "ImageObject", … } } | Article |
| Article URL | { "@type": "WebPage", "@id": … } as mainEntityOfPage. dateModified falls back to datePublished if blank | Article |
| Street, city, region, postal code, country | { "@type": "PostalAddress", … } | LocalBusiness |
| Question and answer pairs | A mainEntity array of Question objects, each with an acceptedAnswer of type Answer. Pairs with an empty side are dropped | FAQPage |
| Search URL template | { "@type": "SearchAction", "target": { "@type": "EntryPoint", … }, "query-input": … } | WebSite |
Worked examples: minimal-but-wrong versus complete
Every block on the left parses as JSON and has an @type, so a syntax check passes it. Each is still missing the field that makes the type do its job. The right-hand block is what the generator produces when you fill the fields it asks for.
Valid but weak: Organization without sameAs
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "Acme",
"url": "https://acme.com"
}Complete
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "Acme",
"url": "https://acme.com",
"logo": "https://acme.com/logo.png",
"sameAs": [
"https://www.linkedin.com/company/acme",
"https://x.com/acme",
"https://www.crunchbase.com/organization/acme"
],
"contactPoint": {
"@type": "ContactPoint",
"email": "[email protected]",
"contactType": "customer service"
}
}The left block names a company and nothing else; there are thousands of Acmes. sameAs is the disambiguation: this domain and those profiles are one entity. Paste your profile URLs one per line and the generator emits the array. Logo and contact point complete the fields Google lists as recommended.
Valid but weak: Article with no author or dates
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "How to size a warehouse safety stock"
}Complete
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "How to size a warehouse safety stock",
"image": "https://acme.com/img/safety-stock.png",
"author": {
"@type": "Person",
"name": "Priya Nair",
"url": "https://acme.com/team/priya"
},
"publisher": {
"@type": "Organization",
"name": "Acme",
"logo": { "@type": "ImageObject", "url": "https://acme.com/logo.png" }
},
"datePublished": "2026-07-24",
"dateModified": "2026-09-02",
"mainEntityOfPage": { "@type": "WebPage", "@id": "https://acme.com/blog/safety-stock" }
}A headline alone passes the required check and misses the point of the type. Author and publisher are who is making the claim, the two dates are how current it is, mainEntityOfPage is the URL to cite. The generator marks author name as required for that reason, and if you leave dateModified blank it copies datePublished.
Breaks or misleads: FAQPage with HTML in the answer
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [{
"@type": "Question",
"name": "Do you ship to Canada?",
"acceptedAnswer": {
"@type": "Answer",
"text": "<p>Yes! See our <a href="/shipping">shipping page</a>.</p>"
}
}]
}Complete
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [{
"@type": "Question",
"name": "Do you ship to Canada?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes. Orders to Canada ship by tracked post in 5 to 8 business days and duties are collected at checkout."
}
}]
}The left block is not valid JSON: the double quotes inside href="/shipping" end the string early and the parser stops. Escape them and it parses, but the answer is now a link and an exclamation mark. Write the acceptedAnswer as the complete sentence you want an engine to repeat, and put the same sentence on the visible page. The generator escapes plain text correctly, so quotes in your answers are safe.
Valid but weak: Product with no offers
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Aeron Chair",
"image": "https://store.com/img/aeron.jpg",
"description": "Ergonomic office chair."
}Complete
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Aeron Chair",
"image": "https://store.com/img/aeron.jpg",
"description": "Ergonomic office chair.",
"brand": { "@type": "Brand", "name": "Herman Miller" },
"sku": "AER-001",
"gtin": "0885482000000",
"offers": {
"@type": "Offer",
"url": "https://store.com/aeron",
"priceCurrency": "USD",
"price": "1395.00",
"availability": "https://schema.org/InStock"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.8",
"reviewCount": "214"
}
}A Product with no Offer tells a shopping agent that something exists but not what it costs, whether it is in stock, or where to buy it. Fill price, currency and availability and the generator nests the Offer, expanding "InStock" to the schema.org URL Google expects. GTIN lets the agent match your listing to the same product elsewhere; add it whenever you have one.
Valid but useless: HowTo with no step array
{
"@context": "https://schema.org",
"@type": "HowTo",
"name": "How to descale an espresso machine",
"description": "Descale in four steps."
}Complete
{
"@context": "https://schema.org",
"@type": "HowTo",
"name": "How to descale an espresso machine",
"totalTime": "PT25M",
"step": [
{ "@type": "HowToStep", "name": "Empty the tank", "text": "Pour out any water and remove the filter." },
{ "@type": "HowToStep", "name": "Add descaler", "text": "Fill the tank with descaling solution to the max line." },
{ "@type": "HowToStep", "name": "Run half through", "text": "Run the machine until the tank is half empty, then wait 15 minutes." },
{ "@type": "HowToStep", "name": "Rinse", "text": "Run two full tanks of fresh water through." }
]
}HowTo answers "how do I" prompts, and the steps are the answer; without a step array it is a heading with nothing under it. This generator has no HowTo preset, so write it by hand in this shape, one HowToStep per visible step in page order, then run it through the validator, which knows the required fields for fifteen types.
Where to put JSON-LD on the page
The generator hands you a script tag. Where it goes, how many you use and how it reaches the page decide whether a crawler sees it at all.
| Decision | Do this | Why |
|---|---|---|
| Head or body | Head by default. Body is fine when a component owns the block. | Google reads JSON-LD from either. The head keeps it near the other metadata and away from templates that strip unknown scripts from the body. |
| One script per type or one @graph | One script per type for independent blocks. A single @graph when blocks reference each other. | Separate scripts are easier to generate, review and diff, which is why this tool emits one at a time. A @graph lets an Article point at an Organization by @id instead of repeating it, at the cost of one larger object to maintain. |
| Server-rendered or injected by JavaScript | Server-rendered, always. | Googlebot renders JavaScript and picks up a block a script inserts. AI retrieval agents read the HTML the server returns; a block that only exists after your framework hydrates is invisible to them. |
JSON-LD for AI answer engines
Search engines use structured data to decide which rich result to show. Answer engines use it as a machine-readable copy of facts they would otherwise extract from prose, and as provenance for whether to cite the page. So the types worth the effort are the ones whose values are already answer-shaped.
| Type | What an engine can take from it | In this generator |
|---|---|---|
| FAQPage | A question and a complete-sentence answer, already the shape of an answer. | Yes |
| HowTo | An ordered step list with text on each step, the shape of a "how do I" answer. | No; write by hand, validate with the sibling tool |
| DefinedTerm | A term and its definition, the shape of a "what is" answer. Useful on glossary pages. | No; write by hand |
| Article with about and mentions | The entities the piece is about, so a claim on the page attaches to the right subject. The generator emits the core Article; add about and mentions by hand. | Core fields yes |
✓Every value must also be visible text
Structured data corroborates a page; it does not replace it. An answer that exists only in a FAQPage block is a schema-only claim, and Google’s guidelines treat markup that does not match visible content as spam.
✓Match the values exactly
Same price as the page shows, same headline as the H1, same author as the byline, same date as the dateline. An engine that finds two prices on one page trusts neither.
✓Complete sentences in answers and steps
Answer text and step text are what get lifted. Write them to stand alone without the question, because the engine may show the answer without it.
✓Provenance on anything you want cited
Author as a Person with a URL, publisher as an Organization, both dates, and mainEntityOfPage. That is the minimum for a claim to be attributed to a named source at a known URL.
Generator vs validator vs visualizer: which one you need
Three tools share the JSON-LD name on this site and do three jobs. The generator, this page, builds a block from a form: you have facts and want valid markup. The JSON-LD validator takes a block you already have, or a whole script tag copied from a page, parses it, checks for @context and @type, and reports required and recommended fields for fifteen rich-result types: you have markup and want to know if it is complete. The JSON-LD visualizer draws the block as a tree so you can see how entities nest and reference each other: you have a large @graph and want to understand it.
The order is generate, validate, then visualize once it has grown complicated. If you already have schema on the page, start with the validator. Starting from nothing, start here.
Who uses a JSON-LD generator
Four roles reach for this tool for four different reasons.
✓SEO and AEO leads
To produce a correct block for one page quickly, and to hand a developer a reference for what a template should emit across a page type. The tables on this page are the spec to attach to the ticket.
✓Ecommerce and D2C teams
Product schema with a complete Offer is the fact sheet shopping agents read. Generate one for a hero product, compare it to what the theme emits today, and fix the gaps at the template level.
✓Content and editorial teams
Article and FAQPage for posts without waiting on engineering. Fill the form from the byline and dateline, then paste the block into the CMS structured-data field with the wrapper off.
✓Developers
To see the exact shape a type should take before writing the component that renders it, including how sub-entities nest. Copy the unwrapped JSON and use it as the fixture for the template.
Frequently asked questions
What does a JSON-LD generator do?+
It turns values you type into a form into a Schema.org structured-data block, with @context and @type set, sub-entities nested correctly and the whole thing wrapped in a script tag ready to paste into a page. This one builds Product, Organization, Article, LocalBusiness, FAQPage and WebSite, and runs in your browser.
Which schema type should I generate for my page?+
Product for anything you sell, Organization once for the brand on the homepage or about page, Article for posts, LocalBusiness for a physical location, FAQPage for a page of questions and answers, WebSite on the homepage if you have on-site search. A page can carry more than one; generate each separately and paste both.
Where do I paste the generated JSON-LD?+
Into the head of the page’s HTML with the script wrapper on. If your CMS has a structured-data field that adds the script tag itself, turn the wrapper off and paste the bare JSON; otherwise you get a script tag inside a script tag and nothing reads it. Then confirm with view-source that the block is in the server response.
Does JSON-LD help my content get cited by ChatGPT, Perplexity or Google AI Overviews?+
It helps when the values are also visible on the page. Structured data gives an engine a clean copy of facts and provenance: who wrote it, when, what it is about, what it costs. FAQPage answers and HowTo steps are the most reusable because they are already answer-shaped. Schema with no matching visible text does not help and can be treated as spam.
Why is my JSON-LD not showing up for crawlers?+
Usually because it is injected by JavaScript. Client-side head managers add the block after the page hydrates, so the HTML the server returns has no ld+json in it, and a crawler that does not execute JavaScript never sees it. Server-render it or put it in the HTML template, then check with view-source rather than the element inspector.
Does Product schema help my store show up in AI shopping?+
Product schema with a complete Offer is where a shopping agent finds price, currency, availability, GTIN and rating without parsing your layout. Fill those fields and the generator nests the Offer and AggregateRating for you. It is a prerequisite for being represented accurately, not a guarantee of being recommended.
Should I use one script tag per type or one @graph?+
One script per type when the blocks are independent, which is what this generator produces. A single @graph when blocks refer to each other, such as an Article whose publisher is the Organization block, so you can reference it by @id instead of repeating it. Both are valid; @graph is harder to maintain by hand.
What is the difference between JSON-LD, microdata and RDFa?+
All three encode Schema.org structured data. Microdata and RDFa add attributes to the HTML elements themselves; JSON-LD is a separate block in a script tag that describes the page without touching its markup. Google recommends JSON-LD, and it is the only format this generator, the validator and the visualizer work with.
Do FAQ rich results still appear in Google?+
Rarely. Since August 2023 Google has limited FAQ rich results to well-known, authoritative government and health sites. FAQPage markup is still worth adding for answer engines, because question-and-answer pairs are the most reusable structured data there is, but do not expect a visual result on a commercial site.
Is this JSON-LD generator free, and where does my data go?+
Free, no signup, and nowhere. The templates and the build step run in your browser tab; the text you type is never posted to a server. You can generate markup for an unreleased product or a draft article without it leaving your machine.