XooCode(){

Breadcrumb Schema Generator

Paste a URL. Get valid BreadcrumbList JSON-LD.

A form-driven builder for schema.org BreadcrumbList markup with a URL parser that auto-populates rows from any absolute URL you paste. Live JSON-LD preview, one-click copy, and a toggle for the omit-item-on-last-row pattern Google documents for the current page. Everything runs in your browser, nothing is sent to XooCode.

BreadcrumbList form

Paste any absolute URL. The parser splits the pathname into segments, prepends a Home row, and title-cases each segment into a starting name. Edit the names below before copying.

Crumb rows (5)

Each row becomes a ListItem with an auto-assigned 1-indexed position. Order top-to-bottom matches the breadcrumb trail left-to-right.

  • Position 1

    Human-readable label shown in the SERP breadcrumb trail.

    Fully qualified URL. Relative paths are invalid per Google's docs.

  • Position 2

    Human-readable label shown in the SERP breadcrumb trail.

    Fully qualified URL. Relative paths are invalid per Google's docs.

  • Position 3

    Human-readable label shown in the SERP breadcrumb trail.

    Fully qualified URL. Relative paths are invalid per Google's docs.

  • Position 4

    Human-readable label shown in the SERP breadcrumb trail.

    Fully qualified URL. Relative paths are invalid per Google's docs.

  • Position 5

    Human-readable label shown in the SERP breadcrumb trail.

    Fully qualified URL. Relative paths are invalid per Google's docs.

Live JSON-LD output

schema.org/BreadcrumbList
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "position": 1,
      "name": "Home",
      "item": "https://example.com/"
    },
    {
      "@type": "ListItem",
      "position": 2,
      "name": "Products",
      "item": "https://example.com/products"
    },
    {
      "@type": "ListItem",
      "position": 3,
      "name": "Shoes",
      "item": "https://example.com/products/shoes"
    },
    {
      "@type": "ListItem",
      "position": 4,
      "name": "Running",
      "item": "https://example.com/products/shoes/running"
    },
    {
      "@type": "ListItem",
      "position": 5,
      "name": "Trail Running",
      "item": "https://example.com/products/shoes/running/trail-running"
    }
  ]
}
</script>

Updates as you type. Empty fields are omitted. Click the copy icon above to grab the full <script> tag ready for pasting into your page head.

How to use the generator

Two-pane layout: form on the left, live JSON-LD preview on the right. Type anywhere and the preview updates. When you’re done, click the copy icon in the preview header and paste the script block into your page’s <head>. That’s it.

  1. 1

    Paste a URL and click Parse

    Drop any absolute URL into the Generate rows from a URL box at the top of the form and hit Parse (or press Enter). The parser splits the pathname on slashes, title-cases each segment, and prepends a Home row pointing at the origin. A URL like example.com/products/shoes/running becomes four rows in one click.
  2. 2

    Edit the derived names

    The parser is a starting point, not the final answer. URL slugs often collapse words together (trailrunning) or hyphenate awkwardly (mens-shoes), and the human-readable label you want in the SERP may be different anyway. Click into each row’s name field and rewrite as needed. The URL itself is usually fine straight from the parser.
  3. 3

    Toggle the current-page row (optional)

    Google documents that the final ListItem can drop its item property because the URL is redundant with the page carrying the markup. Flip the Last row is the current page checkbox to drop the URL on the bottom row. Leave it off when the breadcrumb is a reusable template component that can’t assume it’s always rendered on the last level.
  4. 4

    Reorder or add rows, then copy

    Use the up and down arrows on each row to adjust order if your logical hierarchy differs from the URL pathname (it sometimes does). Click Add row to push in an extra level. The preview pane on the right shows the full <script> tag with syntax highlighting. Copy, paste, ship.

The three properties that matter

BreadcrumbList itself has one property: an itemListElement array. Everything interesting lives on each ListItem, and Google cares about three: position, name, and item.

position is a 1-indexed integer that tells the crawler where this level sits in the trail. Positions must be sequential with no gaps. 1, 2, 3, 4 is valid. 1, 2, 4 is malformed and Google drops the whole BreadcrumbList. Starting at 0 is also malformed for the same reason. The generator auto-assigns positions from the row order so this is one mistake you can’t make by hand here.

name is the human-readable label that renders in the SERP. Keep it short, title-cased, and descriptive of the level (Products, Running Shoes, Trail Running), not of the entire page title. Don’t reuse the page title on the final row.

item is the absolute URL of the level. Relative paths are not valid; every row needs a full URL including scheme and host. The final row can omit item because it’s the current page, which is the behaviour the toggle in the form controls.

What this generator isn't

The Breadcrumb Schema Generator is deliberately small. It outputs one specific shape of JSON-LD and nothing else. Knowing what it does not try to do saves time looking for features that were never going to exist.

It IS a BreadcrumbList JSON-LD builder

Outputs valid schema.org BreadcrumbList markup with 1-indexed ListItem rows, human-readable names, absolute item URLs, and the optional omit-on-last-row pattern Google documents for the current page.

It is NOT a breadcrumb navigation component

This generates structured data for search engines and AI crawlers. It doesn't render a visible breadcrumb trail on your page. For the visible <nav> component, that's a separate UI concern in your framework of choice.

It IS URL-parser first

Paste any absolute URL and the pathname auto-splits into rows with title-cased names. The parser is the differentiating feature vs hand-rolling a ListItem array row by row.

It is NOT a crawler

The parser only knows what the URL tells it. It doesn't fetch the page, read the HTML, or verify any of the intermediate levels actually exist. You're trusting the URL shape.

It IS 1-indexed and gap-free

Positions are auto-assigned from the row order top to bottom. You can't accidentally start at 0 or skip a number. If a ListItem emits with a bad position, it won't be because the tool let you type one.

It is NOT a Rich Results Test

Run the output through Google's Rich Results Test afterwards to catch value-level mistakes the form can't see, like URLs that 404 or a hostname that doesn't match your canonical domain.

Authoritative sources behind the BreadcrumbList vocabulary

The generator’s behaviour is sourced from primary documentation. These are the documents to consult when you need to verify anything the tool produces.

  • schema.org/BreadcrumbList. The canonical vocabulary definition. BreadcrumbList inherits from ItemList and carries itemListElement (array of ListItem) as its only meaningful property.
  • schema.org/ListItem. The element type each row emits as. Carries position, name, item, and the rarely-used image property.
  • Google BreadcrumbList structured data documentation. The current required and recommended property lists, the 1-indexed position rule, and the current-page omission allowance. Read this first when troubleshooting a missing breadcrumb rich result.
  • Google Rich Results Test. Run your generator output through this to confirm the markup is valid and that the breadcrumb trail renders as expected.