Breadcrumb Schema Generator
Turn a visible breadcrumb trail into structured data without manually numbering entries or assembling nested JSON.
Run — free
Provide the page names and absolute URLs in their displayed order, beginning with the broadest page and ending with the current destination. 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
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. Each row needs a concise visible name and an absolute HTTP or HTTPS URL. 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.
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. 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. Validation accepts only non-empty names and absolute HTTP or HTTPS URLs; schemes such as javascript, data, mailto, or relative paths are rejected. The algorithm is deterministic and performs no network requests, so it does not confirm that a URL resolves or that a page is indexable. 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. 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. 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.
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.
Standardize CMS output
Generate the same predictable JSON-LD shape for articles, product pages, categories, and documentation sections.
Repair missing structured data
Create replacement markup when visible breadcrumbs exist but the deployed page has no machine-readable trail.
FAQ
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.
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.
Can I use relative URLs?
No. Each item must contain an absolute HTTP or HTTPS URL so the structured data is unambiguous.
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.
What does an API request cost?
Each API request costs $0.002. The same deterministic transformation can also run in the browser.
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. |