First CH Apps / Heading Structure (h1–h6) Extractor
Enter a URL and we fetch the page on our server, then list its h1–h6 headings as an indented outline in document order. Multiple h1 elements, skipped levels (an h4 straight after an h2) and headings without text are flagged as you go.
For SEO basics on one screen use the Meta Tag & SEO Basics Check; for broken links and missing alt text use the Link & Alt Check. This page looks only at heading order and hierarchy — the view you want when reviewing or rewriting an article.
Headings are counted exactly as they appear in the HTML, in document order (never re-sorted by level). Headings injected later by JavaScript do not exist at fetch time and are not included.
Headings inside comments (<!-- -->), script, style or template are not counted because they never reach the screen.
A skipped level means a heading two or more levels deeper than the one before it (an h4 after an h2). Going back up (an h2 after an h3) is normal structure.
An empty heading has no visible text inside the tag. An image-only heading is not credited as heading text, even with an alt attribute.
Headings hidden with CSS still appear here as long as they exist in the HTML (visibility is not evaluated).
Sent: only the URL you type. Our server (Cloudflare Workers) fetches that URL once as a public page.
Stored: nothing. The extraction lives entirely inside one request and writes neither the URL nor the result to any database (no KV, no D1). It leaves memory when the request ends.
Returned: the heading text we extracted and our findings. We never re-serve the fetched HTML, so this app cannot be used to browse other sites through us.
Note: public GET only. URLs pointing at internal networks, localhost or private IPs are rejected. Pages behind a login, or pages that render their headings with JavaScript, cannot be extracted correctly.
POST /headings/api/extract with JSON ({"url": "https://example.com/"}) or a form body and you get the same result back as JSON (heading array, findings and Markdown).