Features

Everything you need to ship schema, and keep it shipping.

SchemaX is the whole pipeline. Scan, propose, review, deploy, verify. Built so a single product person can ship, and a hundred-person team can govern.

Site scanner

Crawl what an agent can read today: pages, entities, existing schema, and the gaps between them.

Schema studio

Visual editor for every field of every entity. Diff before you ship.

Evidence-backed AI

Suggestions carry the page snippet they're drawn from. Grounded facts publish automatically; uncertain ones wait for you.

One-snippet deploy

A single script tag publishes approved schema without a rebuild or CMS migration.

Live verification

Published schema is checked against the live page so stale or unsupported fields are flagged.

Drift detection

When content changes and schema no longer matches, you find out before the mismatch compounds.

Versioning + rollback

Every change is a version. Roll back in one click. Audit trail forever.

Workspace dashboard

See page status, approvals, published versions, and drift alerts from one operational view.

Export paths

Use the managed injector, GTM export, or developer-ready schema output when your stack needs it.

Why grounded schema

Four public-page snapshots. Audited against what is actually on screen.

These examples show the gap between page content and machine-readable markup: values stated incorrectly, visible facts omitted, and the grounded schema SchemaX is built to publish instead. No invented prices. No borrowed facts.

Wrong - on the page, stated incorrectlyMissing - on the page, absent from markupGained - grounded value SchemaX adds
Wrong values01 / Recipe

A recipe snapshot with a 1000x nutrition mismatch and a visible rating left out of markup.

BBC Good Food/bbcgoodfood.com/recipes/easy-pancakes

Published snapshot

The markup snapshot restates salt as sodium, a different nutrient, with a 1000x unit error. The visible rating is not declared.

{
  "@type": "Recipe",
  "name": "Easy pancakes",
  "nutrition": {
    "@type": "NutritionInformation",
    "sodiumContent": "0.1 milligram of sodium"
  }
  // no aggregateRating
  // no fiberContent / servingSize
}

Grounded output

We keep the salt figure verbatim, drop the fabricated sodium, and add the rating that was visible all along.

{
  "@type": "Recipe",
  "name": "Easy pancakes",
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.1",
    "ratingCount": "876"
  },
  "nutrition": {
    "@type": "NutritionInformation",
    "fiberContent": "0 g",
    "servingSize": "per pancake"
  }
}

On the page

  • Nutrition table: salt 0.1 g, not sodium
  • Rating block: 4.1 stars from 876 ratings
  • Method steps with exact quantities

What you’d gain

Recover eligibility signals for the rating that was on the page but absent from the machine layer.

Absent02 / Product

A product page with zero structured data about the product.

Open Food Facts / Nutella/world.openfoodfacts.org/product/.../nutella-ferrero

Published snapshot

The JSON-LD snapshot describes the website itself. Nothing tells an agent what the product is, despite a full fact sheet on screen.

{
  "@type": "WebSite",
  "name": "Open Food Facts",
  "url": "https://world.openfoodfacts.org"
  // describes the site, not Nutella
  // no Product node at all
  // no gtin / brand / nutrition
}

Grounded output

We build the Product that was missing, with every field grounded against the visible fact sheet.

{
  "@type": "Product",
  "name": "Nutella",
  "gtin13": "3017620422003",
  "brand": { "@type": "Brand", "name": "Nutella" },
  "manufacturer": "Ferrero France Commerciale",
  "additionalProperty": [
    { "name": "Nutri-Score", "value": "E" },
    { "name": "NOVA group", "value": "4" }
  ]
}

On the page

  • Barcode (GTIN-13) and producer: Ferrero France Commerciale
  • Nutri-Score E / NOVA group 4 (ultra-processed)
  • Ingredients, allergens, per-100 g nutrition

What you’d gain

Make the product itself machine-readable, not just the website around it.

Incomplete & under-typed03 / OpinionNewsArticle

Correct as far as it goes, but under-typed for an opinion column and missing the standfirst.

The Guardian/theguardian.com/.../brexit-bus-economy-vote

Published snapshot

The Guardian's markup is accurate, but it types an opinion piece as a generic NewsArticle and omits the description, section, and author's role that are all right there.

{
  "@type": "NewsArticle",
  "headline": "The Brexit bus...",
  "author": { "@type": "Person", "name": "..." },
  "datePublished": "2024-..."
  // no description (standfirst)
  // no articleSection: Opinion
  // no author jobTitle / inLanguage
}

Grounded output

We promote it to the specific type, fold the standfirst into a description, and add the section, language, and the author's stated role.

{
  "@type": "OpinionNewsArticle",
  "headline": "The Brexit bus...",
  "description": "<standfirst, verbatim>",
  "articleSection": "Opinion",
  "inLanguage": "en-GB",
  "author": {
    "@type": "Person", "name": "...",
    "jobTitle": "Guardian columnist"
  }
}

On the page

  • URL path /commentisfree/ and section label Opinion
  • Standfirst paragraph below the headline
  • Byline: Guardian columnist

What you’d gain

Let an agent read the page as opinion, in English, by a named columnist, not as anonymous generic news.

Invisible service04 / Service

A product page where the service is invisible and the tempting autofill would invent a price list.

Cloudflare CDN/cloudflare.com/products/cdn/

Published snapshot

The markup snapshot contains Organization, WebSite, and WebPage nodes. Nothing describes the CDN service. A naive generator could invent plan tiers that do not appear on this page.

{
  "@type": "WebPage",
  "name": "Cloudflare CDN",
  "isPartOf": { "@type": "WebSite", "...": "..." }
  // no Service node for the CDN itself
  // no serviceType / provider / areaServed
  // tempting autofill: hasOfferCatalog
  //   [Free, Pro, Business, Enterprise] - not on page
}

Grounded output

We emit the Service that anchors the page, keep only grounded properties, and refuse the price tiers that are not on it.

{
  "@type": "Service",
  "serviceType": "Content Delivery Network",
  "provider": { "@type": "Organization", "name": "Cloudflare" },
  "areaServed": "Worldwide",
  "offers": {
    "@type": "Offer", "price": "0",
    "url": "https://dash.cloudflare.com/sign-up"
  }
  // no invented tier catalog
}

On the page

  • Content Delivery Network across 330+ cities worldwide
  • Start building for free points to dash.cloudflare.com/sign-up
  • Links to WAF, DDoS, Workers, Load Balancing

What you’d gain

Make the service machine-readable without publishing a price list the page never claimed.

Policy-first

You set the rules. SchemaX does the rest, and shows you every exception.

Generative tools that just push raw schema make a mess. SchemaX runs deterministic extraction first, auto-publishes only what it can ground, and surfaces the uncertain or sensitive claims for you. AI commits the safe 80%; you decide the rest, and you can pause everything.

  • Diff every change against last published
  • Inline evidence: “this came from this paragraph”
  • Review only the exceptions: accept, edit, or reject
  • Roll back instantly when a vendor breaks something
review · /products/lamp3 changes
{
  "@type": "Product",
  "name": "Wireless Lamp",
- "price": "$49",
+ "price": "$49.00 USD",
+ "availability": "InStock",
+ "priceCurrency": "USD"
}

// grounded in /products/lamp · no invented values

Open the door for the agents.

Set once, approved by you. Every agent on every platform reads the same verified facts: in your pages, in your /.well-known/ucp manifest, and through your site's agent app.

Book a demoTest your site

free for personal sites · no credit card