Structured Data Generator

Build and validate JSON-LD structured data for articles, products, FAQs and more.

Runs in your browser. Nothing is uploaded — your input is processed on this device and discarded when you close the tab.

Switching type loads that type’s sample, so you can see the expected shape before you replace it with your own details. Fields marked * are required; recommended fields raise a warning, not an error, when left empty.

Read this first: valid JSON-LD does not guarantee a rich result. Structured data only makes a page eligible; Google decides which results to show, and eligibility rules change. In particular, Google currently limits FAQ rich results to well-known government and health sites, and HowTo rich results have been retired on most Google surfaces — so treat both types as accurate machine-readable summaries, not as a promise of an enhanced listing. Always check the current guidance in Google Search Central and test your page with the Rich Results Test before you rely on any enhancement. This note is guidance to verify, not a policy ruling.

How to use the Structured Data Generator

  1. Choose the type that matches the page. Pick the schema.org type describing the page you are marking up — an article, a product, a business, a how-to, a breadcrumb trail and so on. If no type honestly fits the page, the correct answer is no markup, not the nearest type.
  2. Fill in the form. A sample for the selected type is loaded for you; replace every value with your page’s real details. Required fields are marked with an asterisk. Questions, steps, breadcrumb levels and offers repeat — use the Add button for each extra item.
  3. Watch the preview and the validation lists. The JSON-LD rebuilds as you type, so syntax is never in question. Anything in the red list must be fixed: a missing required field, a URL without its https://, a rating outside its scale, a price that is not a number. Amber items are worth checking — a missing recommended field, a value that still looks like placeholder text, or a product with no offer.
  4. Copy or download the result. Copy the full <script> block into your page’s <head> or just before </body>, or download the JSON-LD object as a .json file or a ready-made .html snippet.
  5. Test the live page, not just the snippet. After publishing, run the page URL through Google’s Rich Results Test and the Schema Markup Validator. They check the deployed page — including anything your template adds or strips — rather than the tidy block you copied.

Worked example

Say a guide page ends with two questions that readers ask again and again, answered in the page text. Choosing FAQPage and entering those two questions and answers exactly as they appear on the page produces the block below. Select Load the FAQ sample and the workspace above fills with these same two pairs, and the live preview generates this output character for character — so what you read here is genuinely what the tool produces, not a hand-typed imitation. Two details are worth noticing: the questions live inside mainEntity as Question objects, each with its own acceptedAnswer, and there is exactly one @type per object, which is the pattern validators expect.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "How do I add FAQ structured data to a page?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Write each question and answer as visible text on the page first, then add a FAQPage JSON-LD block whose mainEntity lists the same questions and answers word for word."
      }
    },
    {
      "@type": "Question",
      "name": "Does FAQ structured data guarantee a rich result?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "No. Valid FAQPage markup only makes a page eligible. Google currently limits FAQ rich results to well-known government and health sites, so most sites will not see the expanded FAQ display even with perfect markup."
      }
    }
  ]
}
</script>

Publish that block, and the page is honestly described: a crawler can lift the two questions without guessing which headings are questions and which prose answers them. Whether Google then shows an expanded FAQ listing is a separate matter — for most sites today it will not, for the eligibility reason given in the second answer itself.

What the form asks for — and what Google actually requires

Three different lists are easy to confuse: the fields this form collects, the properties Google requires for a rich result, and the ones it merely recommends. They are not the same list. The form sometimes asks for more than Google requires (because the extra data is genuinely useful to other consumers), and Google sometimes wants data the form treats as optional. This table puts the three side by side, checked against Google’s structured-data documentation on 24 October 2026 — re-check it there before relying on any row, because Google revises these requirements.

TypeThis form asks forGoogle requiresGoogle recommendsWorth knowing
ArticleHeadline and author (required here); description, image, dates, article URL, publisherNothing — Google lists no required properties for Articleheadline, image, datePublished, dateModified, authorFor the large-image preview, Google asks for images at least 1200 px wide — the form’s image hint says so.
FAQPageQuestion/answer pairs (both required); optional page URLmainEntity — each Question needs a name and an acceptedAnswer with text—Since 2023 Google shows FAQ rich results only for qualifying government and health sites. The markup is still valid and other engines use it; do not add it expecting a Google FAQ expansion.
HowToTitle (required); description, image, total time, cost; step rows with required instruction textname and stepimage, totalTime, estimatedCost, supply, toolGoogle wound down HowTo rich results in 2023. The markup still describes the steps accurately for other tools and readers.
BreadcrumbListOne row per level: name (required) and URLitemListElement with at least two ListItems; each ListItem needs position and name, plus item (the URL) — item is optional only on the final entry—The trail in the markup must match the breadcrumb trail visible on the page.
OrganizationName and website URL (required here); logo, description, email, telephone, profile URLsNothingname, url, logo, sameAs, contactPointOrganization markup supports logo and knowledge-panel features when the organisation is eligible; it guarantees neither.
ProductName (required); image, description, brand, SKU/MPN; offer rows (price, currency, availability); rating valuesname, plus at least one of offers, review or aggregateRating. Merchant listings additionally require image and an Offer with price and priceCurrencyimage, description, brand, offers, aggregateRating, reviewPrices and ratings shown in search must also be visible on the page itself — markup that contradicts the page is ignored or penalised.
LocalBusinessBusiness type and name (required); address fields (street and town required here), telephone, price range, opening hours, coordinates, imagenameaddress, geo, openingHours, priceRange, telephone, image, urlLocal results lean heavily on the business profile Google holds separately; this markup supports it rather than replacing it.
WebSiteSite name and URL (required here); alternate name; search URL templateNothingname, url, and potentialAction (a SearchAction) if you want the sitelinks search boxThe form’s search template becomes that SearchAction — it only works if the template URL genuinely performs a search on your site.
WebApplicationApplication name (required); URL, category, operating system, description, price, rating valuesGoogle documents SoftwareApplication (the narrower type), not WebApplication: for app results it requires name plus offers or aggregateRating/reviewoffers, aggregateRating, applicationCategory, operatingSystemWebApplication is valid schema.org and the honest type for a browser tool — just do not expect a dedicated Google app rich result from it.

What structured data does, and why the details matter

Structured data is a standardised description of a page, written for machines instead of people. A visitor reads your headline, your price and your opening hours by looking at the layout; a search engine has to guess which of the hundreds of text fragments on the page is the price and which is a phone number in the footer. JSON-LD — JavaScript Object Notation for Linked Data — removes the guessing. It is a small block of JSON, placed in a script tag, that states plainly: this page is about a product, the product is called this, it costs this much in this currency, and it is in stock. The vocabulary comes from schema.org, a shared dictionary maintained by the major search engines, so the same block is understood by all of them.

That clarity buys two things. The first is eligibility for richer search displays — star ratings under a product, a breadcrumb trail instead of a raw URL, an article date beside a headline. None of those is promised; they are shown selectively, and Google has withdrawn or narrowed several formats over the years, most recently retiring HowTo enhancements on most surfaces and restricting FAQ enhancements to a small class of authoritative sites. The second benefit is quieter and more durable: an accurate, machine-readable summary helps search systems classify a page correctly even when no enhancement is ever displayed, and the same markup feeds shopping aggregators, voice assistants and other consumers of schema.org data.

Getting the details wrong quietly undoes both benefits. A price written as “£89.99” instead of the number 89.99 with a separate currency code fails validation. A review rating of 4.6 with no review count, or a rating nobody on the page can see, reads as decoration — and marking up content that is not visible on the page is a direct breach of Google’s structured data policies, punishable by the loss of rich results across a whole site. Dates in a local format such as 14/09/2026 are ambiguous to a parser and to a reader in another country; ISO format removes the doubt. Placeholder text left over from a generator’s sample — a logo still pointing at a stock URL, a business named “Your Company” — is worse than no markup, because it publishes false statements about your organisation in a format designed to be trusted.

That is why this tool validates as it generates rather than leaving checking to a separate step. Required properties are errors, not suggestions. URLs must be absolute, ratings must sit inside the scale they declare, currencies must be three-letter ISO codes, and anything that smells like a placeholder is flagged before it reaches your page. The generator builds the JSON itself from your form answers, so the syntax is valid by construction — the failures that remain possible are factual ones, and those are precisely the ones the error and warning lists are written to catch.

Common errors, and the limits of this tool

The most common failure is mismatched content: markup describing things the page does not visibly contain — FAQ answers that exist only in the JSON-LD, five-star ratings with no reviews behind them, prices that differ from the price on the page. Keep the two in step, and update the markup whenever the visible content changes. The second failure is relative URLs: an image given as /img/cover.jpg instead of the full address. A crawler reading your snippet out of context cannot resolve it, so every URL field here insists on the complete https:// form. Third is type confusion — marking a category listing as a Product, or a personal blog as an Organization with a trading name. Use the type the page honestly is.

Formatting errors still matter even though the generator prevents most of them. Hand-editing the output afterwards can reintroduce trailing commas, unquoted keys or a stray </script> inside a text value, which is why the copy button’s output escapes angle brackets. If you do edit by hand, re-validate the whole block, not just the line you touched.

The limits are these. This tool covers nine types — Article, FAQPage, HowTo, BreadcrumbList, Organization, Product, LocalBusiness, WebSite and WebApplication — with the properties most pages need. Schema.org defines hundreds of types and far more properties than any form should carry; specialist markup such as events, courses, job postings or recipes, and advanced patterns such as a multi-type @graph, are outside its scope and are better written deliberately, with the schema.org documentation open. The validator checks the rules encoded here — required properties, formats, ranges and the recommendations drawn from Google’s documentation at build time. It is not Google’s Rich Results Test and cannot see your live page, your template’s other markup, or policy changes published after this page was written. Treat a clean result here as “ready to test on the real page”, never as approval.

Frequently asked questions

Where do I paste the JSON-LD block?

Anywhere inside the page’s HTML works for parsers, but the conventional places are inside the <head> or just before the closing </body> tag. In a content management system, use the field or plugin your theme provides for per-page scripts rather than pasting into the article text, where an editor update can mangle the block. One block per type is fine; several different types on one page can sit in separate script tags.

Will this markup give me star ratings or an FAQ dropdown in Google?

Not by itself. Valid markup makes a page eligible, and Google then applies its own rules about which enhancements to show for which sites and queries. FAQ rich results are currently limited by Google to well-known government and health sites, and HowTo rich results were retired for most surfaces, so neither type should be added in the expectation of an enhanced listing. Product ratings, breadcrumbs and article dates are still displayed where the markup is accurate and the page earns them — but “eligible” is the strongest claim honest markup can make. Check Google Search Central for the current position before planning around any specific enhancement.

Can I mark up content that is not visible on the page?

No. Google’s structured data policies require marked-up content to be visible to visitors in substantially the same form. FAQ answers that exist only in JSON-LD, hidden ratings, or a price in the markup that differs from the price on the page can all lead to the site losing rich-result eligibility altogether. Write the visible content first, then describe it — which is the order the FAQ form in this tool encourages.

Why does the tool insist on full URLs beginning with https://?

Because structured data is consumed out of context. A relative path such as /img/cover.jpg only means something alongside the page it came from; a validator, aggregator or search system reading the block on its own cannot resolve it, and Google’s documentation asks for absolute URLs for images, logos and page links. The same applies to breadcrumb levels: each one except the last should carry the full address of that level’s page.

My markup is valid but nothing shows in search results. What should I check?

Work through four things in order. First, confirm the live page actually contains the block — view the page source, since a cached or templated copy may differ from what you pasted. Second, run the URL through the Rich Results Test to see which enhancements Google detects and any it rejects. Third, check the marked-up content matches the visible page exactly, including prices and ratings. Fourth, give it time and check the enhancement reports in Search Console; eligibility is assessed per page and can lag publication by days. If all four are clean, the likely answer is that Google is simply not showing that enhancement for that query — which no markup change can override.

Can one page carry more than one type of structured data?

Yes, and most real pages should. An article page typically carries Article for the story, BreadcrumbList for its trail and Organization for the publisher, because each describes a different thing on the same page. Generate each block here, paste them as separate script tags (or ask a developer to combine them into a single @graph), and make sure names, URLs and dates agree across all of them — a breadcrumb pointing at one URL while the Article names another is exactly the kind of inconsistency validators flag.

Related tools

Related articles