# Semantic heading structure

> Semantic heading structure: A single H1 and a consistent H2 structure let the content be split correctly. The fix: build a semantic heading structure.

- Source: /checks/headings
- Site: AgenticWebScore
- Language: English

---
A single H1 and a consistent H2 structure let the content be split correctly.

| Property | Value |
| --- | --- |
| Check id | `headings` |
| Dimension | Content Accessibility (22%) |
| Tier | Essential — pool 80 pts |
| Weight inside tier | 2 |
| Impact | High |
| Maturity | Adopted — A ratified standard with real deployment. |
| Conditional | No |
| Publishing skill | `semantic-headings` |
| Standards | WCAG 2.2 |

## What is measured

The scanner parses the headings in the homepage `/` HTML and rebuilds the outline. Pass when the page has exactly one `<h1>` and no heading is more than one level deeper than the one before it (an `<h2>` may be followed by `<h3>`, never by `<h4>`); partial when there is exactly one `<h1>` but the outline skips a level, or when the page repeats `<h1>` while the rest of the outline is well formed; fail when the page has no `<h1>` at all. This is the WCAG 2.2 heading structure (1.3.1 Info and Relationships, 2.4.6 Headings and Labels).

## Reproduce it yourself

You do not have to take our word for any of this. Run the same measurement against your own domain:

```bash
DOMAIN="https://example.com"
curl -sL "$DOMAIN/" | perl -0777 -ne 'while (m{<(h[1-6])\b[^>]*>(.*?)</\1>}gsi) { my ($l,$t)=(lc($1),$2); $t=~s/<[^>]*>//g; $t=~s/\s+/ /g; print "$l ",substr($t,0,60),"\n" }'
```

## The fix

This is the artifact to ship. It is the complete change, not a description of one.

```html
<main>
  <h1>Agent readiness for e-commerce teams</h1>
  <p class="summary">A 5-dimension audit of how well your store serves autonomous AI agents.</p>

  <section>
    <h2>What we measure</h2>
    <p>Discovery, content, bot access, protocol and commerce signals.</p>

    <section>
      <h3>Structured data</h3>
      <p>Entity types an agent can quote without having to guess.</p>
    </section>
  </section>

  <section>
    <h2>How the score works</h2>
    <p>61 weighted checks, graded from C to AAA.</p>
  </section>
</main>
```

> Never pick a heading tag for its font size: if a block has no heading, style a `<p>` instead and keep `<h1>` for the page title only.

## Standards referenced

- `WCAG 2.2`

## Related checks

| Check | Tier | Impact | Same skill |
| --- | --- | --- | --- |
| `markdown-negotiation` — Markdown content negotiation | Recommended | Critical | — |
| `meta` — Title and summary metadata | Essential | High | — |
| `jsonld` — JSON-LD structured data | Essential | Critical | — |
| `faq-schema` — FAQ / question-answer schema | Recommended | High | — |
| `breadcrumb` — Breadcrumb / navigation schema | Emerging | Low | — |
| `summary` — Prominent summary block | Recommended | Medium | — |
| `lang` — Language declaration and multilingual access | Recommended | Medium | — |
| `no-js-fallback` — Content that needs no JavaScript | Essential | High | — |
