Breadcrumb Schema Generator
List your pages from the home page to the current one and get breadcrumb structured data ready to paste: Home, Guides and Technical SEO become positions 1, 2 and 3, numbered for you. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Provide the page names and absolute URLs in their displayed order, beginning with the broadest page and ending with the current destination.
Prepare the breadcrumb trail in page order
Start with the same hierarchy that a visitor sees on the page. The first row should normally represent the home page or the broadest useful section, followed by progressively more specific pages, and the final row should identify the current page. Absolute URLs remove ambiguity for crawlers and make the generated markup portable across templates, preview domains, and content systems.
Keep labels aligned with the linked pages rather than stuffing keywords into them. This tool preserves the supplied order exactly and assigns positions beginning at one, so rearranging rows changes the meaning of the trail. It does not crawl a site, infer a hierarchy, or compare the entries with navigation rendered in HTML.
Review redirects, canonical choices, spelling, and capitalization before generating the block. An empty list is rejected because a BreadcrumbList without any ListItem entries communicates no usable path and is usually evidence of a broken template or incomplete request.
What each step of the generated trail contains
Every supplied pair becomes a ListItem with a one-based position, the trimmed breadcrumb name, and its URL in the item property. Pretty printing keeps the output readable during reviews and produces stable results for identical input. The generator also escapes a less-than character inside serialized values, preventing user-provided text from prematurely closing the script element when the block is embedded in HTML.
The algorithm is deterministic and performs no network requests, so it does not confirm that a URL resolves or that a page is indexable.
Publish and verify the breadcrumb markup
Keep the structured trail consistent with links that users can actually see and navigate. If a content system already emits breadcrumb structured data, replace or disable the older block instead of publishing competing versions with different positions or URLs. Regenerate the markup whenever a page moves, a section changes name, or canonical URLs change.
After deployment, inspect the rendered HTML rather than only the source template, because themes, tag managers, and optimization plugins can duplicate, remove, or alter script elements. Then use a structured-data testing tool or search-engine inspection workflow to catch page-level issues outside this generator, including inaccessible destinations, conflicting canonical tags, or markup inserted on the wrong page.
What you can do with it
Add markup to a page template
Convert a template's ordered navigation trail into a ready-to-embed BreadcrumbList script block.
Repair missing structured data
Create replacement markup when visible breadcrumbs exist but the deployed page has no machine-readable trail.
FAQ
Which order should I use?
Enter pages from the broadest level to the current page. The generator preserves that order and assigns positions starting at one.
Does the generator check whether pages exist?
No. It makes no network requests. It validates URL syntax and scheme but cannot confirm response status, indexing, redirects, or canonical tags.
Where should I place the generated block?
Place the script element in the page head or body according to your publishing system, and ensure duplicate breadcrumb markup is not also emitted.
Does breadcrumb markup guarantee breadcrumbs in search results?
No. Valid markup tells search engines how the trail is built, but it does not promise a particular display in the results. Keep it consistent with the links visitors actually see on the page.
What if my site already outputs breadcrumb structured data?
Replace or switch off the older block instead of publishing two versions with different positions or addresses. Then check the rendered page, because themes and plugins can duplicate or remove the block.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/web/breadcrumb-schema-generate \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"breadcrumbs":[{"name":"Home","url":"https://example.com/"},{"name":"Guides","url":"https://example.com/guides"},{"name":"Technical SEO","url":"https://example.com/guides/technical-seo"}]}'const res = await fetch("https://api.kit.forhosting.com/web/breadcrumb-schema-generate", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"breadcrumbs": [
{
"name": "Home",
"url": "https://example.com/"
},
{
"name": "Guides",
"url": "https://example.com/guides"
},
{
"name": "Technical SEO",
"url": "https://example.com/guides/technical-seo"
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/web/breadcrumb-schema-generate",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"breadcrumbs": [
{
"name": "Home",
"url": "https://example.com/"
},
{
"name": "Guides",
"url": "https://example.com/guides"
},
{
"name": "Technical SEO",
"url": "https://example.com/guides/technical-seo"
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/web/breadcrumb-schema-generate", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"breadcrumbs":[{"name":"Home","url":"https://example.com/"},{"name":"Guides","url":"https://example.com/guides"},{"name":"Technical SEO","url":"https://example.com/guides/technical-seo"}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"breadcrumbs":[{"name":"Home","url":"https://example.com/"},{"name":"Guides","url":"https://example.com/guides"},{"name":"Technical SEO","url":"https://example.com/guides/technical-seo"}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/web/breadcrumb-schema-generate", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"breadcrumbs": [
{
"name": "Home",
"url": "https://example.com/"
},
{
"name": "Guides",
"url": "https://example.com/guides"
},
{
"name": "Technical SEO",
"url": "https://example.com/guides/technical-seo"
}
]
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "web.breadcrumb_schema_generate",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
timeout_sec | 30 |
max_crawl_pages | 25 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
Turn a visible breadcrumb trail into structured data without manually numbering entries or assembling nested JSON. The generator produces a schema.org BreadcrumbList object and a complete JSON-LD script block ready to place in the page head or body. It validates empty lists, malformed rows, missing labels, and unsupported URLs before returning any markup.
Prepare the breadcrumb trail in page order
Each row needs a concise visible name and an absolute HTTP or HTTPS URL.
Understand the generated JSON-LD
The result contains a schema object for programmatic use and a complete script block for direct placement on a webpage. At the top level, the context points to schema.org and the type is BreadcrumbList. Validation accepts only non-empty names and absolute HTTP or HTTPS URLs; schemes such as javascript, data, mailto, or relative paths are rejected. Use the returned schema object when another application will handle serialization, or use the jsonld field when you need the complete markup without additional assembly.
Publish and verify the breadcrumb markup
Add one generated script block to the page represented by the trail, either in the document head or in the body where your publishing system permits JSON-LD. Valid JSON-LD is an implementation requirement, not a guarantee of a particular search presentation. The API price is $0.002 per request, while browser execution can use the same deterministic logic without sending the breadcrumb data across the network.
Integration use cases
Standardize CMS output
Generate the same predictable JSON-LD shape for articles, product pages, categories, and documentation sections.
Technical questions
What happens if the breadcrumb list is empty?
The request fails with an invalid input error because a BreadcrumbList must contain at least one useful item.
Can I use relative URLs?
No. Each item must contain an absolute HTTP or HTTPS URL so the structured data is unambiguous.
What does an API request cost?
Each API request costs $0.002. The same deterministic transformation can also run in the browser.