Sitebulb Crawler Test Site
Deterministic fixtures for exercising the crawler.
Documentation
- Introduction — What the Sitebulb Crawler Test Site is and how to use it.
- Safe crawling — How to crawl this site without falling into deliberate traps.
- Crawler behaviour — How a crawler's observations are compared against fixture expectations.
- Infrastructure requirements — Environment capabilities and how unavailable fixtures are reported.
- Sitebulb hints — How fixtures link to the Sitebulb hint engine.
Categories
- Foundation example — The minimal proving fixture for the registry-to-route pipeline.
- Utility endpoints — Crawler introspection endpoints that make crawler behaviour observable.
- HTTP status codes — Exact status fixtures across informational, success, redirect, client-error, and server-error ranges, plus soft 404 variants.
- Redirects — HTTP 3xx redirects, chains, loops, meta refresh, JavaScript redirects, and redirect edge cases.
- Robots protocol — Root robots.txt behaviours on dedicated profile origins, plus meta robots, X-Robots-Tag, and canonical-versus-blocked conflict fixtures on the primary site.
- Canonical tags — Canonical link and HTTP Link header fixtures across self, conflicting, blocked, redirected, relative, protocol, fragment, and external scenarios.
- Links — Link discovery fixtures covering standard anchors, nofollow variants, JavaScript-built links, hidden links, iframes, malformed markup, and a 10,000-anchor page.
- URLs and normalisation — URL format, encoding, duplicate-parameter, tracking-parameter, internationalisation, host, and path normalisation fixtures.
- JavaScript Rendering — Fixtures that distinguish crawlers that render JavaScript from crawlers that only parse the initial HTML response, covering injected content, delays, metadata mutation, interaction-gated content, shadow DOM, and service workers.
- Content and meta tags — Title, meta description, heading, charset, and content-quality fixtures with deterministic markers for extraction checks.
- Structured data — Format-level JSON-LD, Microdata, and RDFa fixtures covering valid types, invalid payloads, placement, multiplicity, JavaScript injection, and content conflicts.
- Mobile Responsive — Mobile-crawling fixtures covering a responsive single-URL baseline, alternate mobile URL pairing, User-Agent dynamic serving, AMP relationship discovery, and viewport and rendering defects.
- HTTP Headers — Cache directives, conditional validators, content negotiation, compression and transfer encodings, security headers, and response-timing fixtures that exercise how a crawler reads the wire.
- Sitemaps — XML sitemap fixtures covering parsing, the 50,000-URL protocol limit, gzip handling, malformed XML, sitemap index traversal, extension namespaces, and sitemap-only discovery.
- Spider traps — Bounded spider-trap and honeytrap fixtures covering path depth, incrementing parameters, calendar walks, session-id URLs, faceted explosion, unique-token chains, hidden links, and a 10 MB body.
- Authentication and access control — HTTP auth challenges, cookie-gated content, expired sessions, SameSite scoping, login surfaces, and redirect-to-login flows.
- Pagination — Paginated-series fixtures covering anchor traversal, rel-next/prev head links, correct and incorrect canonicalisation, sitemap-only discovery, noindex inside a series, client-side loading, numbered-range boundaries, empty final pages, and duplicate page content.
- Non-HTML Resources — Fixtures covering how a crawler fetches, classifies, and reports PDFs, images, text and structured-data files, feeds, large binaries, mismatched content types, download dispositions, range requests, and broken resource references.
- Structured data features — Per-feature validation fixtures for every Google search-gallery rich-result feature, with known pass and fail states.
- International micro-sites — Six self-contained hreflang micro-sites for end-to-end international audits — three correct, two broken, one edge-case.
- International and hreflang — Per-hint hreflang fixtures covering the three declaration channels, reciprocity checking, the standard failure modes, and RTL documents.
- AI modern crawlers — AI crawler fixtures covering per-bot robots.txt rules, bot-scoped meta robots and X-Robots-Tag directives, llms.txt discovery variants, JavaScript-gated versus server-rendered content, and a self-labelled bot-specific content marker.
- Exotic advanced tests — Advanced crawler fixtures covering sandboxed iframes and legacy framesets, non-GET HTTP method handling, browser-environment fingerprint exposure, TLS fingerprint echo, web components, bounded streaming, and parser stress recovery.
- Images and Media Optimisation — Fixtures covering alt-text extraction, image dimension and scaling analysis, encoding-quality and next-gen format opportunities, animated-GIF-versus-video classification, hidden and offscreen image detection, and favicon handling.
- Asset Weight and Duplication — Fixtures covering minification detection on CSS/JS/HTML, duplicate and identical resource grouping, single-asset and combined per-category size thresholds, same-origin request counting, and enormous-network-payload detection.
- Loading, Webfonts and Render-Blocking — Loading-behaviour fixtures covering render-blocking head resources, critical-CSS placement, synchronous script chains, single points of failure, print stylesheets, webfont count/weight/font-display behaviour, and unused CSS/JavaScript via Chrome coverage.
- Web Vitals and Performance Lab — Capability fixtures producing known, bounded Web Vitals and performance-budget values so crawler tests can validate LCP, CLS, TBT/TTI, FCP, and TTFB capture plus per-category transferred-size buckets.
- Accessibility — Deliberate axe-core rule violations grouped one rule family per page, plus the helper frame and media assets they embed.
- Content quality and language — Calibrated word counts, readability and sentiment extremes, template subtraction, rendered word divergence, multilingual spelling, and a near-duplicate similarity gradient.
- Technology and Infrastructure Fingerprints — Self-labelled pages and endpoints that emit one technology or CDN/WAF signature set each, exercising Sitebulb's Wappalyzer technology detection and header-based CDN/WAF identification without any real stack installed.
- Custom Extraction and Search Targets — Frozen, exact-valued pages that validate Sitebulb's three user-configurable data-collection pipelines - content extraction rules, content search terms, and custom JavaScript snippets.
- Crawl scope and host discrimination — Fixtures that make scope classification itself the subject under test - subdomain scope, external links, CDN-hosted first-party assets, tracker classification, and scheme/port variants.
Fixtures
accessibility
- Colour contrast violations —
a11y-color-contrast(expects HTTP 200, safe) - Presentational and obsolete markup —
a11y-presentational-markup(expects HTTP 200, safe) - Form labelling violations —
a11y-form-labels(expects HTTP 200, safe) - ARIA validity violations —
a11y-aria-validity(expects HTTP 200, safe) - ARIA accessible name violations —
a11y-aria-names(expects HTTP 200, safe) - ARIA structure and hidden content violations —
a11y-aria-structure(expects HTTP 200, safe) - Body hidden from assistive technology —
a11y-aria-hidden-body(expects HTTP 200, safe) - Landmarks and headings missing —
a11y-landmarks-missing(expects HTTP 200, safe) - Landmark structure violations —
a11y-landmarks-structure(expects HTTP 200, safe) - Heading order violations —
a11y-headings(expects HTTP 200, safe) - Duplicate id violations —
a11y-duplicate-ids(expects HTTP 200, safe) - Link and button name violations —
a11y-link-button-names(expects HTTP 200, safe) - Image and graphic violations —
a11y-images(expects HTTP 200, safe) - Media caption and autoplay violations —
a11y-media(expects HTTP 200, safe) - Table semantics violations —
a11y-tables(expects HTTP 200, safe) - List structure violations —
a11y-lists(expects HTTP 200, safe) - Document metadata violations —
a11y-doc-metadata(expects HTTP 200, safe) - Invalid document language —
a11y-doc-lang-invalid(expects HTTP 200, safe) - Mismatched lang and xml lang —
a11y-doc-lang-mismatch(expects HTTP 200, safe) - Meta refresh and viewport violations —
a11y-meta-directives(expects HTTP 200, safe) - Frame title and focus violations —
a11y-frames(expects HTTP 200, safe) - Keyboard and focus violations —
a11y-keyboard-focus(expects HTTP 200, safe)
ai-modern-crawlers
- AI robots blocked target — GPTBot —
ai-robots-gptbot(expects HTTP 200, safe) - AI robots blocked target — ChatGPT-User —
ai-robots-chatgpt-user(expects HTTP 200, safe) - AI robots blocked target — ClaudeBot —
ai-robots-claudebot(expects HTTP 200, safe) - AI robots blocked target — Claude-Web —
ai-robots-claude-web(expects HTTP 200, safe) - AI robots blocked target — Amazonbot —
ai-robots-amazonbot(expects HTTP 200, safe) - AI robots blocked target — Google-Extended —
ai-robots-google-extended(expects HTTP 200, safe) - AI robots blocked target — OAI-SearchBot —
ai-robots-oai-searchbot(expects HTTP 200, safe) - AI robots blocked target — PerplexityBot —
ai-robots-perplexitybot(expects HTTP 200, safe) - AI robots blocked target — cohere-ai —
ai-robots-cohere-ai(expects HTTP 200, safe) - Bot-scoped meta robots — GPTBot noindex —
ai-meta-noai-gptbot(expects HTTP 200, moderate) - Bot-scoped X-Robots-Tag — ClaudeBot noindex —
ai-xrobots-claudebot(expects HTTP 200, moderate) - llms.txt — valid —
ai-llms-valid(expects HTTP 200, safe) - llms.txt — optional section —
ai-llms-optional-section(expects HTTP 200, safe) - llms.txt — missing —
ai-llms-missing(expects HTTP 404, safe) - JavaScript-gated article content —
ai-js-gated-content(expects HTTP 200, safe) - Server-rendered equivalent control —
ai-ssr-equivalent-control(expects HTTP 200, safe) - JavaScript execution detection reference —
ai-js-execution-detection(expects HTTP 200, safe) - Bot-specific content marker —
ai-bot-specific-content-marker(expects HTTP 200, moderate) - Training-control disallow reference —
ai-training-disallow-reference(expects HTTP 200, safe) - Search-bot allow reference —
ai-search-bot-allow-reference(expects HTTP 200, safe)
asset-weight
- Unminified page —
asset-unminified-page(expects HTTP 200, safe) - Unminified stylesheet (UTF-16LE) —
asset-unminified-css(expects HTTP 200, safe) - Unminified script (UTF-16LE) —
asset-unminified-js(expects HTTP 200, safe) - Large stylesheet page —
asset-large-stylesheet-page(expects HTTP 200, safe) - Large stylesheet —
asset-large-css(expects HTTP 200, safe) - Duplicate query-variant resources —
asset-duplicate-page(expects HTTP 200, safe) - Duplicate stylesheet variant v1 —
asset-dup-css-v1(expects HTTP 200, safe) - Duplicate stylesheet variant v2 —
asset-dup-css-v2(expects HTTP 200, safe) - Duplicate script variant v1 —
asset-dup-js-v1(expects HTTP 200, safe) - Duplicate script variant v2 —
asset-dup-js-v2(expects HTTP 200, safe) - Identical resources at different URLs —
asset-identical-page(expects HTTP 200, safe) - Identical stylesheet a —
asset-identical-css-a(expects HTTP 200, safe) - Identical stylesheet b —
asset-identical-css-b(expects HTTP 200, safe) - Identical script a —
asset-identical-js-a(expects HTTP 200, safe) - Identical script b —
asset-identical-js-b(expects HTTP 200, safe) - Combined CSS weight page —
asset-combined-css-page(expects HTTP 200, moderate) - Bulk stylesheet 1 —
asset-bulk-css-1(expects HTTP 200, moderate) - Bulk stylesheet 2 —
asset-bulk-css-2(expects HTTP 200, moderate) - Bulk stylesheet 3 —
asset-bulk-css-3(expects HTTP 200, moderate) - Combined JS weight page —
asset-combined-js-page(expects HTTP 200, moderate) - Bundle script 1 —
asset-bundle-js-1(expects HTTP 200, moderate) - Bundle script 2 —
asset-bundle-js-2(expects HTTP 200, moderate) - Combined image weight page —
asset-combined-images-page(expects HTTP 200, moderate) - Weight payload image 01 —
asset-image-01(expects HTTP 200, moderate) - Weight payload image 02 —
asset-image-02(expects HTTP 200, moderate) - Weight payload image 03 —
asset-image-03(expects HTTP 200, moderate) - Weight payload image 04 —
asset-image-04(expects HTTP 200, moderate) - Weight payload image 05 —
asset-image-05(expects HTTP 200, moderate) - Weight payload image 06 —
asset-image-06(expects HTTP 200, moderate) - Weight payload image 07 —
asset-image-07(expects HTTP 200, moderate) - Weight payload image 08 —
asset-image-08(expects HTTP 200, moderate) - Weight payload image 09 —
asset-image-09(expects HTTP 200, moderate) - Weight payload image 10 —
asset-image-10(expects HTTP 200, moderate) - Weight payload image 11 —
asset-image-11(expects HTTP 200, moderate) - Combined webfont weight page —
asset-combined-fonts-page(expects HTTP 200, moderate) - Webfont stylesheet —
asset-fonts-css(expects HTTP 200, moderate) - Webfont 1 —
asset-font-1(expects HTTP 200, moderate) - Webfont 2 —
asset-font-2(expects HTTP 200, moderate) - Webfont 3 —
asset-font-3(expects HTTP 200, moderate) - Webfont 4 —
asset-font-4(expects HTTP 200, moderate) - Webfont 5 —
asset-font-5(expects HTTP 200, moderate) - Many same-origin requests page —
asset-many-requests-page(expects HTTP 200, safe)
auth-access-control
- Session cookie setter —
auth-cookie-setter(expects HTTP 200, safe) - HTTP 403 forbidden without challenge —
auth-403-forbidden(expects HTTP 403, safe) - Visible login form —
auth-login-form-visible(expects HTTP 200, safe) - Redirect to login —
auth-redirect-to-login(expects HTTP 302, safe) - Robots-accessible login form —
auth-robots-accessible-login(expects HTTP 200, safe) - Noindexed login form —
auth-noindex-login-page(expects HTTP 200, safe) - IP-based access control reference —
auth-ip-based-profile-reference(expects HTTP 200, safe)
canonical-tags
- Canonical — self-referencing —
canonical-self(expects HTTP 200, safe) - Canonical — points at the preferred page —
canonical-cross-page(expects HTTP 200, safe) - Canonical preferred page —
canonical-preferred-page(expects HTTP 200, safe) - Canonical — HTTP Link header —
canonical-http-link-header(expects HTTP 200, safe) - Canonical — body placement is ignored —
canonical-body-ignored(expects HTTP 200, safe) - Canonical — multiple conflicting head canonicals —
canonical-multiple-conflict(expects HTTP 200, safe) - Canonical — HTML head vs HTTP Link header conflict —
canonical-html-vs-http-conflict(expects HTTP 200, safe) - Canonical — disagrees with og:url —
canonical-og-url-conflict(expects HTTP 200, safe) - Canonical — target returns 404 —
canonical-target-404(expects HTTP 200, safe) - Canonical — target redirects —
canonical-target-redirect(expects HTTP 200, safe) - Canonical — target is noindex —
canonical-target-noindex(expects HTTP 200, safe) - Canonical — relative URL —
canonical-relative(expects HTTP 200, safe) - Canonical — case variant of its own path —
canonical-case-variant(expects HTTP 200, safe) - Canonical — trailing-slash variant of its own path —
canonical-trailing-slash(expects HTTP 200, safe) - Canonical — href carries a fragment —
canonical-fragment-stripped(expects HTTP 200, safe) - Canonical — http page nominates its https equivalent —
canonical-protocol-mismatch(expects HTTP 200, moderate) - Canonical — explicit default port —
canonical-port-normalisation(expects HTTP 200, safe)
content-meta-tags
- Title — missing —
meta-title-missing(expects HTTP 200, safe) - Title — empty —
meta-title-empty(expects HTTP 200, safe) - Title — long —
meta-title-long(expects HTTP 200, safe) - Title — multiple —
meta-title-multiple(expects HTTP 200, safe) - Title — inside body only —
meta-title-body(expects HTTP 200, safe) - Title — HTML entities —
meta-title-entities(expects HTTP 200, safe) - Title — newline in text —
meta-title-newlines(expects HTTP 200, safe) - Meta description — missing —
meta-description-missing(expects HTTP 200, safe) - Meta description — empty —
meta-description-empty(expects HTTP 200, safe) - Meta description — duplicated tag —
meta-description-duplicate(expects HTTP 200, safe) - Meta description — long —
meta-description-long(expects HTTP 200, safe) - Headings — H1 missing —
meta-h1-missing(expects HTTP 200, safe) - Headings — multiple H1s —
meta-h1-multiple(expects HTTP 200, safe) - Headings — out of order —
meta-heading-order(expects HTTP 200, safe) - Charset — UTF-8 baseline —
meta-charset-utf8(expects HTTP 200, safe) - Charset — ISO-8859-1 —
meta-charset-iso(expects HTTP 200, safe) - Charset — header/body mismatch —
meta-charset-mismatch(expects HTTP 200, safe) - Charset — undeclared —
meta-charset-missing(expects HTTP 200, safe) - Charset — HTTP/HTML conflict —
meta-charset-http-html-conflict(expects HTTP 200, safe) - Content — thin —
meta-thin-content(expects HTTP 200, safe) - Content — duplicate pair (primary) —
meta-duplicate-content(expects HTTP 200, safe) - Content — duplicate pair (twin) —
meta-duplicate-content-twin(expects HTTP 200, safe)
content-quality
- Word count calibration page at one twenty —
quality-word-count-120(expects HTTP 200, safe) - Word count calibration page at seven fifty —
quality-word-count-750(expects HTTP 200, safe) - Word count calibration page at twelve hundred —
quality-word-count-1200(expects HTTP 200, safe) - A very easy reading page with short plain words —
quality-readability-very-easy(expects HTTP 200, safe) - A very difficult reading page with long words —
quality-readability-very-difficult(expects HTTP 200, safe) - A strongly positive review of the harbour cafe —
quality-sentiment-positive(expects HTTP 200, safe) - A strongly negative review of the station diner —
quality-sentiment-negative(expects HTTP 200, safe) - Template subtraction sibling page A of four —
quality-template-page-a(expects HTTP 200, safe) - Template subtraction sibling page B of four —
quality-template-page-b(expects HTTP 200, safe) - Template subtraction sibling page C of four —
quality-template-page-c(expects HTTP 200, safe) - Template subtraction sibling page D of four —
quality-template-page-d(expects HTTP 200, safe) - Rendered word divergence calibration fixture —
quality-rendered-word-divergence(expects HTTP 200, safe) - Booking a stay we can accomodate without any fuss —
spelling-en-gb(expects HTTP 200, safe) - Unser Intresse an guter Handwerksarbeit nimmt zu —
spelling-de(expects HTTP 200, safe) - Un apartement lumineux au bord de la vieille ville —
spelling-fr(expects HTTP 200, safe) - Un exelente comienzo para nuestro nuevo proyecto —
spelling-es(expects HTTP 200, safe) - Una efficenza sorprendente nel nostro laboratorio —
spelling-it(expects HTTP 200, safe) - Een acommodatie met uitzicht over de oude haven —
spelling-nl(expects HTTP 200, safe) - Uma excessão notável entre as casas antigas da vila —
spelling-pt(expects HTTP 200, safe) - Симпотичный домик у самого края соснового леса —
spelling-ru(expects HTTP 200, safe) - Die Entwiklung unserer kleinen Tischlerei geht weiter —
spelling-dictionary-fallback(expects HTTP 200, safe) - A field guide to auditing one page at a time —
spelling-custom-dictionary-trap(expects HTTP 200, safe) - Similarity gradient base copy with garden notes —
similarity-base(expects HTTP 200, safe) - Similarity gradient variant at ninety five percent —
similarity-variant-95(expects HTTP 200, safe) - Similarity gradient variant at eighty five percent —
similarity-variant-85(expects HTTP 200, safe) - Similarity gradient variant at seventy percent —
similarity-variant-70(expects HTTP 200, safe)
crawl-scope
- Subdomain scope link —
scope-subdomain-link(expects HTTP 200, safe) - Subdomain scope target —
scope-subdomain-target(expects HTTP 200, safe) - CDN-hosted first-party resources —
scope-cdn-embedded-resources(expects HTTP 200, safe) - CDN asset — stylesheet —
scope-cdn-asset-stylesheet(expects HTTP 200, safe) - CDN asset — script —
scope-cdn-asset-script(expects HTTP 200, safe) - CDN asset — image —
scope-cdn-asset-image(expects HTTP 200, safe) - Third-party tracking stubs —
scope-tracking-stub-page(expects HTTP 200, safe) - Tracking stub — analytics script —
scope-tracking-analytics-script(expects HTTP 200, safe) - Tracking stub — beacon pixel —
scope-tracking-beacon-pixel(expects HTTP 200, safe) - Scheme and default-port scope variants —
scope-protocol-port-variants(expects HTTP 200, safe) - Scheme and port variants target —
scope-protocol-variants-target(expects HTTP 200, safe)
custom-extraction-search
- Extraction target — product page —
extract-product-page(expects HTTP 200, safe) - Extraction target — contact page —
extract-contact-page(expects HTTP 200, safe) - Extraction target — data table —
extract-table-page(expects HTTP 200, safe) - Extraction target — attribute-borne data —
extract-attribute-page(expects HTTP 200, safe) - Extraction target — repeated elements —
extract-repeated-elements(expects HTTP 200, safe) - Extraction target — regex edge cases —
extract-regex-edge(expects HTTP 200, safe) - Extraction target — empty selector —
extract-empty-target(expects HTTP 200, safe) - Extraction target — rendered-only values —
extract-rendered-only(expects HTTP 200, safe) - Search target — keyword frequency —
search-keyword-frequency(expects HTTP 200, safe) - Search target — word boundaries —
search-word-boundary(expects HTTP 200, safe) - Search target — case variants —
search-case-variants(expects HTTP 200, safe) - Search target — German locale —
search-german-locale(expects HTTP 200, safe) - Search target — selector scope —
search-selector-scope(expects HTTP 200, safe) - Search target — negative term —
search-negative-term(expects HTTP 200, safe) - Snippet target — frozen JS global —
snippet-global-state(expects HTTP 200, safe) - Snippet target — static DOM counts —
snippet-dom-counts(expects HTTP 200, safe) - Snippet target — load-event timing —
snippet-timing-state(expects HTTP 200, safe)
exotic-advanced-tests
- Sandboxed same-origin iframe —
exotic-iframe-sandbox(expects HTTP 200, safe) - Legacy HTML4 frameset —
exotic-frameset-legacy(expects HTTP 200, moderate) - HTTP method resource — HEAD —
exotic-method-head(expects HTTP 200, safe) - HTTP method resource — OPTIONS —
exotic-method-options(expects HTTP 204, safe) - HTTP method resource — PUT 405 —
exotic-method-put-405(expects HTTP 405, safe) - HTTP method resource — DELETE 405 —
exotic-method-delete-405(expects HTTP 405, safe) - HTTP method resource — PATCH 405 —
exotic-method-patch-405(expects HTTP 405, safe) - Custom element with shadow content —
exotic-custom-elements(expects HTTP 200, safe) - Parser stress — deep nesting —
exotic-parser-stress-nested(expects HTTP 200, moderate)
foundation-example
- Hello — Status 200 —
hello-status-200(expects HTTP 200, safe)
http-headers
- Cache-Control no-cache —
headers-cache-no-cache(expects HTTP 200, safe) - Cache-Control no-store —
headers-cache-no-store(expects HTTP 200, safe) - Cache-Control max-age=0 —
headers-cache-max-age-zero(expects HTTP 200, safe) - Cache-Control one-year max-age —
headers-cache-long(expects HTTP 200, safe) - Cache-Control private —
headers-cache-private(expects HTTP 200, safe) - Expires header —
headers-expires(expects HTTP 200, safe) - Conflicting cache headers —
headers-cache-conflict(expects HTTP 200, safe) - ETag conditional flow —
headers-etag(expects HTTP 200, safe) - Last-Modified conditional flow —
headers-last-modified(expects HTTP 200, safe) - Vary on User-Agent with identical content —
headers-vary-user-agent(expects HTTP 200, safe) - Content-Type malformed —
headers-content-type-malformed(expects HTTP 200, safe) - HTML body served as text/plain —
headers-text-plain-html(expects HTTP 200, safe) - Compression — gzip encoded response —
headers-gzip(expects HTTP 200, safe) - Compression — brotli encoded response —
headers-brotli(expects HTTP 200, safe) - Delayed response — 5 seconds —
headers-delay-5s(expects HTTP 200, moderate) - CSP blocks inline scripts —
headers-csp-inline-block(expects HTTP 200, safe) - CSP blocks an external script —
headers-csp-external-block(expects HTTP 200, safe) - X-Content-Type-Options nosniff —
headers-nosniff(expects HTTP 200, safe) - HSTS — short max-age —
headers-hsts-short(expects HTTP 200, moderate) - HSTS — long max-age with preload —
headers-hsts-long-preload(expects HTTP 200, moderate)
http-status-codes
- HTTP 102 Processing —
http-status-102-processing(expects HTTP 200, safe) - HTTP 103 Early Hints —
http-status-103-early-hints(expects HTTP 200, safe) - HTTP 200 OK —
http-status-200-ok(expects HTTP 200, safe) - HTTP 204 No Content —
http-status-204-no-content(expects HTTP 204, safe) - HTTP 206 Partial Content —
http-status-206-partial-content(expects HTTP 200, safe) - HTTP 304 Not Modified —
http-status-304-not-modified(expects HTTP 200, safe) - HTTP 300 Multiple Choices —
http-status-300-multiple-choices(expects HTTP 300, safe) - HTTP 503 with Retry-After —
http-status-503-retry-after(expects HTTP 503, safe) - HTTP 301 Moved Permanently —
http-status-301(expects HTTP 301, safe) - HTTP 302 Found —
http-status-302(expects HTTP 302, safe) - HTTP 303 See Other —
http-status-303(expects HTTP 303, safe) - HTTP 307 Temporary Redirect —
http-status-307(expects HTTP 307, safe) - HTTP 308 Permanent Redirect —
http-status-308(expects HTTP 308, safe) - HTTP 400 Bad Request —
http-status-400(expects HTTP 400, safe) - HTTP 401 Unauthorized —
http-status-401(expects HTTP 401, safe) - HTTP 402 Payment Required —
http-status-402(expects HTTP 402, safe) - HTTP 403 Forbidden —
http-status-403(expects HTTP 403, safe) - HTTP 404 Not Found —
http-status-404(expects HTTP 404, safe) - HTTP 405 Method Not Allowed —
http-status-405(expects HTTP 405, safe) - HTTP 406 Not Acceptable —
http-status-406(expects HTTP 406, safe) - HTTP 407 Proxy Authentication Required —
http-status-407(expects HTTP 407, safe) - HTTP 408 Request Timeout —
http-status-408(expects HTTP 408, safe) - HTTP 409 Conflict —
http-status-409(expects HTTP 409, safe) - HTTP 410 Gone —
http-status-410-gone(expects HTTP 410, safe) - HTTP 411 Length Required —
http-status-411(expects HTTP 411, safe) - HTTP 412 Precondition Failed —
http-status-412(expects HTTP 412, safe) - HTTP 413 Content Too Large —
http-status-413(expects HTTP 413, safe) - HTTP 414 URI Too Long —
http-status-414(expects HTTP 414, safe) - HTTP 415 Unsupported Media Type —
http-status-415(expects HTTP 415, safe) - HTTP 416 Range Not Satisfiable —
http-status-416(expects HTTP 416, safe) - HTTP 417 Expectation Failed —
http-status-417(expects HTTP 417, safe) - HTTP 418 I'm a teapot —
http-status-418(expects HTTP 418, safe) - HTTP 421 Misdirected Request —
http-status-421(expects HTTP 421, safe) - HTTP 422 Unprocessable Content —
http-status-422(expects HTTP 422, safe) - HTTP 423 Locked —
http-status-423(expects HTTP 423, safe) - HTTP 424 Failed Dependency —
http-status-424(expects HTTP 424, safe) - HTTP 425 Too Early —
http-status-425(expects HTTP 425, safe) - HTTP 426 Upgrade Required —
http-status-426(expects HTTP 426, safe) - HTTP 428 Precondition Required —
http-status-428(expects HTTP 428, safe) - HTTP 429 Too Many Requests —
http-status-429(expects HTTP 429, safe) - HTTP 431 Request Header Fields Too Large —
http-status-431(expects HTTP 431, safe) - HTTP 451 Unavailable For Legal Reasons —
http-status-451-legal(expects HTTP 451, safe) - HTTP 500 Internal Server Error —
http-status-500(expects HTTP 500, safe) - HTTP 501 Not Implemented —
http-status-501(expects HTTP 501, safe) - HTTP 502 Bad Gateway —
http-status-502(expects HTTP 502, safe) - HTTP 503 Service Unavailable —
http-status-503(expects HTTP 503, safe) - HTTP 504 Gateway Timeout —
http-status-504(expects HTTP 504, safe) - HTTP 505 HTTP Version Not Supported —
http-status-505(expects HTTP 505, safe) - HTTP 506 Variant Also Negotiates —
http-status-506(expects HTTP 506, safe) - HTTP 507 Insufficient Storage —
http-status-507(expects HTTP 507, safe) - HTTP 508 Loop Detected —
http-status-508(expects HTTP 508, safe) - HTTP 510 Not Extended —
http-status-510(expects HTTP 510, safe) - HTTP 511 Network Authentication Required —
http-status-511(expects HTTP 511, safe) - Soft 404 — not-found title and body —
http-status-soft-404-title-body(expects HTTP 200, safe) - Soft 404 — thin content —
http-status-soft-404-thin-content(expects HTTP 200, safe) - Soft 404 — noindex with 200 —
http-status-soft-404-noindex(expects HTTP 200, safe) - Soft 404 — title says 404, status says 200 —
http-status-soft-404-title-says-404(expects HTTP 200, safe)
images
- Images missing alt text —
images-missing-alt-page(expects HTTP 200, safe) - Linked image missing alt text —
images-linked-missing-alt-page(expects HTTP 200, safe) - Decorative image with empty alt —
images-decorative-alt-page(expects HTTP 200, safe) - Image without declared dimensions —
images-missing-dimensions(expects HTTP 200, safe) - Browser-scaled image —
images-scaled(expects HTTP 200, safe) - Inefficiently encoded image — large saving —
images-encoding-q100(expects HTTP 200, safe) - Inefficiently encoded image — moderate saving —
images-encoding-q92(expects HTTP 200, safe) - Photographic truecolour PNG —
images-nextgen-png(expects HTTP 200, safe) - Animated GIF over the video threshold —
images-animated-gif(expects HTTP 200, safe) - Animation delivered as video —
images-animated-video(expects HTTP 200, safe) - Hidden eager image —
images-hidden(expects HTTP 200, safe) - Offscreen eager image —
images-offscreen(expects HTTP 200, safe) - Favicon link to a 404 target —
images-favicon-missing(expects HTTP 200, safe) - Favicon with a mismatched content type —
images-favicon-wrong-content-type(expects HTTP 200, safe) - Multiple sized icon links —
images-favicon-multi-size(expects HTTP 200, safe) - Alt-less image asset —
images-missing-alt-asset(expects HTTP 200, safe) - Linked alt-less image asset —
images-linked-missing-alt-asset(expects HTTP 200, safe) - Decorative image asset —
images-decorative-alt-asset(expects HTTP 200, safe) - Undeclared-dimensions image asset —
images-missing-dimensions-asset(expects HTTP 200, safe) - Scaled 1600x1067 image asset —
images-scaled-asset(expects HTTP 200, safe) - Large-saving photo asset —
images-encoding-q100-asset(expects HTTP 200, safe) - Moderate-saving photo asset —
images-encoding-q92-asset(expects HTTP 200, safe) - Photographic PNG asset —
images-nextgen-png-asset(expects HTTP 200, safe) - Animated GIF asset —
images-animated-gif-asset(expects HTTP 200, safe) - MP4 video asset —
images-animated-video-asset(expects HTTP 200, safe) - Hidden image asset —
images-hidden-asset(expects HTTP 200, safe) - Offscreen image asset —
images-offscreen-asset(expects HTTP 200, safe) - 16x16 favicon asset —
images-favicon-16(expects HTTP 200, safe) - 32x32 favicon asset —
images-favicon-32(expects HTTP 200, safe) - 180x180 apple-touch icon asset —
images-favicon-180(expects HTTP 200, safe) - Wrong-content-type icon —
images-favicon-wrong-content-type-icon(expects HTTP 200, moderate)
international-hreflang
- Hreflang cluster A — English —
cluster-a-en(expects HTTP 200, safe) - Hreflang cluster A — Deutsch —
cluster-a-de(expects HTTP 200, safe) - Hreflang cluster A — Français —
cluster-a-fr(expects HTTP 200, safe) - Hreflang cluster A — Español —
cluster-a-es(expects HTTP 200, safe) - Hreflang cluster A — language selector —
cluster-a-x-default(expects HTTP 200, safe) - Hreflang cluster B — English (Link header) —
http-link-hreflang(expects HTTP 200, safe) - Hreflang cluster B — Deutsch (Link header) —
http-link-hreflang-de(expects HTTP 200, safe) - Hreflang cluster C — English (sitemap channel) —
xml-sitemap-hreflang-en(expects HTTP 200, safe) - Hreflang cluster C — Deutsch (sitemap channel) —
xml-sitemap-hreflang-de(expects HTTP 200, safe) - Hreflang cluster C — xhtml:link fixture sitemap —
xml-sitemap-hreflang(expects HTTP 200, safe) - Hreflang broken — missing reciprocal, declaring side —
missing-reciprocal-a(expects HTTP 200, moderate) - Hreflang broken — missing reciprocal, silent side —
missing-reciprocal-b(expects HTTP 200, moderate) - Hreflang broken — alternate target returns 404 —
hreflang-target-404(expects HTTP 200, moderate) - Hreflang broken — alternate target redirects —
hreflang-target-301(expects HTTP 200, moderate) - Hreflang broken — invalid language codes —
invalid-language-code(expects HTTP 200, moderate) - Hreflang broken — multiple x-default declarations —
multiple-x-default(expects HTTP 200, moderate) - Hreflang broken — html lang vs Content-Language conflict —
html-lang-content-language-conflict(expects HTTP 200, moderate) - Hreflang broken — German page canonicalised to English —
mixed-locale-canonical(expects HTTP 200, moderate) - Hreflang broken — the self-canonical English counterpart —
mixed-locale-canonical-en(expects HTTP 200, safe) - RTL fixture — Arabic —
rtl-arabic-page(expects HTTP 200, safe) - RTL fixture — Hebrew —
rtl-hebrew-page(expects HTTP 200, safe)
javascript-rendering
- Content via document.write —
js-document-write(expects HTTP 200, safe) - Content via innerHTML —
js-inner-html(expects HTTP 200, safe) - Content via textContent —
js-text-content(expects HTTP 200, safe) - Content loaded over fetch —
js-fetch-content(expects HTTP 200, safe) - Content delayed by 500ms —
js-delay-500(expects HTTP 200, safe) - Content delayed by 2000ms —
js-delay-2000(expects HTTP 200, safe) - SPA shell hydration —
js-spa-hydration(expects HTTP 200, safe) - Title changed by JavaScript —
js-title-set(expects HTTP 200, safe) - Meta description inserted by JavaScript —
js-description-set(expects HTTP 200, safe) - Canonical inserted by JavaScript —
js-canonical-inserted(expects HTTP 200, safe) - JSON-LD injected by JavaScript —
js-jsonld-injected(expects HTTP 200, safe) - All body text rendered by JavaScript —
js-all-body-text(expects HTTP 200, safe) - All links rendered by JavaScript —
js-all-links(expects HTTP 200, safe) - Content revealed by IntersectionObserver —
js-intersection-observer(expects HTTP 200, safe) - Content inside an open shadow root —
js-shadow-open(expects HTTP 200, safe)
links
- Standard internal anchors —
links-standard-internal(expects HTTP 200, safe) - Relative, root-relative, and protocol-relative anchors —
links-relative-root-protocol(expects HTTP 200, safe) - Base href changes link resolution —
links-base-href(expects HTTP 200, safe) - Image-wrapped anchor —
links-image-link(expects HTTP 200, safe) - Empty and broken anchors —
links-empty-and-broken(expects HTTP 200, safe) - rel=nofollow anchor —
links-nofollow(expects HTTP 200, safe) - rel=ugc sponsored anchor —
links-ugc-sponsored(expects HTTP 200, safe) - Follow and nofollow anchors to the same target —
links-follow-and-nofollow-same-target(expects HTTP 200, safe) - Anchor href built by string concatenation —
links-js-string-concat(expects HTTP 200, safe) - Anchor injected from an AJAX response —
links-ajax-loaded(expects HTTP 200, safe) - pushState navigation —
links-pushstate(expects HTTP 200, safe) - Anchor inside an open shadow root —
links-shadow-dom-open(expects HTTP 200, safe) - data-href span —
links-data-href(expects HTTP 200, safe) - Anchor inside noscript —
links-noscript(expects HTTP 200, safe) - Anchors inside a comment and a template —
links-comment-template(expects HTTP 200, safe) - Same-domain iframe —
links-iframe-same-domain(expects HTTP 200, safe) - Whitespace and percent-encoded hrefs —
links-whitespace-encoded(expects HTTP 200, safe) - Nested anchors —
links-nested-anchors(expects HTTP 200, safe) - Link target A —
links-target-a(expects HTTP 200, safe) - Link target B —
links-target-b(expects HTTP 200, safe) - Link target C —
links-target-c(expects HTTP 200, safe)
loading
- Render-blocking head resources —
loading-render-blocking(expects HTTP 200, safe) - Critical CSS present but after stylesheet links —
loading-critical-css-late(expects HTTP 200, safe) - Too many synchronous head scripts —
loading-sync-scripts(expects HTTP 200, safe) - Single point of failure — delayed cross-origin script —
loading-spof-delayed-origin(expects HTTP 200, moderate) - Print stylesheet download —
loading-print-stylesheet(expects HTTP 200, safe) - Too many webfonts —
loading-webfonts-too-many(expects HTTP 200, safe) - Overweight webfont —
loading-webfont-overweight(expects HTTP 200, safe) - Webfont with no font-display —
loading-webfont-foit(expects HTTP 200, safe) - Unused CSS via Chrome coverage —
loading-unused-css(expects HTTP 200, safe) - Unused JavaScript via Chrome coverage —
loading-unused-js(expects HTTP 200, safe) - Delayed blocking script asset —
loading-asset-blocking-js(expects HTTP 200, safe) - Delayed blocking stylesheet asset —
loading-asset-blocking-css(expects HTTP 200, safe) - Late critical CSS stylesheet asset —
loading-asset-late-css(expects HTTP 200, safe) - Synchronous script asset 1 of 5 —
loading-asset-sync-js-1(expects HTTP 200, safe) - Synchronous script asset 2 of 5 —
loading-asset-sync-js-2(expects HTTP 200, safe) - Synchronous script asset 3 of 5 —
loading-asset-sync-js-3(expects HTTP 200, safe) - Synchronous script asset 4 of 5 —
loading-asset-sync-js-4(expects HTTP 200, safe) - Synchronous script asset 5 of 5 —
loading-asset-sync-js-5(expects HTTP 200, safe) - Print-only stylesheet asset —
loading-asset-print-css(expects HTTP 200, safe) - Six-webfont stylesheet asset —
loading-asset-fonts-many-css(expects HTTP 200, safe) - Webfont asset 1 of 6 —
loading-asset-font-many-1(expects HTTP 200, safe) - Webfont asset 2 of 6 —
loading-asset-font-many-2(expects HTTP 200, safe) - Webfont asset 3 of 6 —
loading-asset-font-many-3(expects HTTP 200, safe) - Webfont asset 4 of 6 —
loading-asset-font-many-4(expects HTTP 200, safe) - Webfont asset 5 of 6 —
loading-asset-font-many-5(expects HTTP 200, safe) - Webfont asset 6 of 6 —
loading-asset-font-many-6(expects HTTP 200, safe) - Overweight-webfont stylesheet asset —
loading-asset-fonts-overweight-css(expects HTTP 200, safe) - Overweight webfont asset —
loading-asset-font-overweight(expects HTTP 200, safe) - FOIT stylesheet asset —
loading-asset-fonts-foit-css(expects HTTP 200, safe) - FOIT webfont asset —
loading-asset-font-foit(expects HTTP 200, safe) - Unused-CSS coverage bundle asset —
loading-asset-unused-css(expects HTTP 200, safe) - Unused-JavaScript coverage bundle asset —
loading-asset-unused-js(expects HTTP 200, safe)
mobile-responsive
- Responsive single URL —
responsive-single-url(expects HTTP 200, safe) - Alternate mobile URL — desktop page —
mobile-alternate-desktop(expects HTTP 200, safe) - Alternate mobile URL — mobile page —
mobile-alternate-mobile(expects HTTP 200, safe) - Dynamic serving with Vary on User-Agent —
dynamic-serving-vary-user-agent(expects HTTP 200, moderate) - Dynamic serving — title differs per variant —
mobile-title-different(expects HTTP 200, moderate) - Dynamic serving — H1 differs per variant —
mobile-h1-different(expects HTTP 200, moderate) - Dynamic serving — word count differs per variant —
mobile-word-count-different(expects HTTP 200, moderate) - Dynamic serving — outbound links differ per variant —
mobile-outbound-links-different(expects HTTP 200, moderate) - AMP relationship — canonical source —
amp-canonical-source(expects HTTP 200, safe) - AMP relationship — AMP page —
amp-page(expects HTTP 200, safe) - Viewport meta missing —
viewport-missing(expects HTTP 200, safe) - Viewport meta invalid —
viewport-invalid(expects HTTP 200, safe) - CSS media-query visibility markers —
css-media-query-marker(expects HTTP 200, safe) - Undersized touch targets —
touch-target-marker(expects HTTP 200, safe)
non-html-resources
- PDF resource — basic —
resource-pdf-basic(expects HTTP 200, safe) - PDF resource — X-Robots-Tag noindex —
resource-pdf-x-robots-noindex(expects HTTP 200, safe) - Redirect to a PDF resource —
resource-redirect-to-pdf(expects HTTP 302, safe) - PNG image resource —
resource-image-png(expects HTTP 200, safe) - Image embedded from HTML —
resource-image-linked-from-html(expects HTTP 200, safe) - Plain text resource —
resource-text-plain(expects HTTP 200, safe) - CSV resource —
resource-csv(expects HTTP 200, safe) - JSON resource —
resource-json(expects HTTP 200, safe) - Generic XML resource —
resource-xml(expects HTTP 200, safe) - RSS 2.0 feed —
resource-rss(expects HTTP 200, safe) - Atom feed —
resource-atom(expects HTTP 200, safe) - Feed item target — one —
resource-feed-item-one(expects HTTP 200, safe) - Feed item target — two —
resource-feed-item-two(expects HTTP 200, safe) - Unknown MIME type —
resource-unknown-mime(expects HTTP 200, moderate) - Wrong content type —
resource-wrong-content-type(expects HTTP 200, moderate) - Download attachment disposition —
resource-download-content-disposition(expects HTTP 200, safe) - Range request file —
resource-range-request-file(expects HTTP 200, moderate) - Broken resource references —
resource-404-file-reference(expects HTTP 200, safe)
pagination
- Pagination classic series — page 1 of 5 —
pagination-page-1(expects HTTP 200, safe) - Pagination classic series — page 2 of 5 —
pagination-page-2(expects HTTP 200, safe) - Pagination classic series — page 3 of 5 —
pagination-page-3(expects HTTP 200, safe) - Pagination rel-next/prev series — page 1 of 5 —
pagination-rel-next-prev(expects HTTP 200, safe) - Pagination self-canonical series — page 1 of 5 —
pagination-self-canonical(expects HTTP 200, safe) - Pagination canonical-to-page-1 series — page 1 of 5 —
pagination-all-canonical-page-1(expects HTTP 200, safe) - Pagination sitemap-only series — page 1 of 3 —
pagination-sitemap-only-page-1(expects HTTP 200, safe) - Pagination sitemap-only series — page 3 of 3 —
pagination-sitemap-only-page(expects HTTP 200, safe) - Pagination noindex series — page 1 of 3 —
pagination-noindex-page-1(expects HTTP 200, safe) - Pagination noindex series — page 2 of 3 —
pagination-noindex-page(expects HTTP 200, safe) - Pagination empty-final series — page 1 of 4 —
pagination-empty-final-page-1(expects HTTP 200, safe) - Pagination empty-final series — page 4 of 4 —
pagination-empty-final-page(expects HTTP 200, safe) - Pagination duplicate-content series — page 1 of 5 —
pagination-duplicate-page-content(expects HTTP 200, safe) - Pagination — infinite scroll with URL updates —
pagination-infinite-scroll-url-updates(expects HTTP 200, moderate) - Pagination — infinite scroll without URL updates —
pagination-infinite-scroll-no-url-updates(expects HTTP 200, moderate) - Pagination — load-more button —
pagination-load-more-button(expects HTTP 200, moderate) - Pagination large-range boundary hub —
pagination-large-range-boundary(expects HTTP 200, moderate)
redirects
- Redirect 301 Moved Permanently —
redirect-standard-301(expects HTTP 301, safe) - Redirect 302 Found —
redirect-standard-302(expects HTTP 302, safe) - Redirect 303 See Other —
redirect-standard-303(expects HTTP 303, safe) - Redirect 307 Temporary Redirect —
redirect-standard-307(expects HTTP 307, safe) - Redirect 308 Permanent Redirect —
redirect-standard-308(expects HTTP 308, safe) - Redirect target — final 200 —
redirect-target-final-200(expects HTTP 200, safe) - Redirect chain — two hops of 301 —
redirect-chain-two-hop-301(expects HTTP 301, safe) - Redirect chain — three mixed hops —
redirect-chain-three-hop-mixed(expects HTTP 301, safe) - Redirect chain — five hops —
redirect-chain-five-hop(expects HTTP 301, moderate) - Redirect chain — ends in 404 —
redirect-chain-ends-404(expects HTTP 301, safe) - Redirect chain — ends in 410 —
redirect-chain-ends-410(expects HTTP 301, safe) - Redirect chain — robots-disallowed middle hop —
redirect-chain-robots-disallowed-middle(expects HTTP 301, moderate) - Redirect chain — robots-disallowed final URL —
redirect-chain-robots-disallowed-final(expects HTTP 301, moderate) - Meta refresh — immediate —
redirect-meta-immediate(expects HTTP 200, safe) - Meta refresh — delayed 5s —
redirect-meta-delayed-5s(expects HTTP 200, moderate) - JavaScript redirect — window.location.href —
redirect-js-window-location-href(expects HTTP 200, moderate) - JavaScript redirect — window.location.replace —
redirect-js-window-location-replace(expects HTTP 200, moderate) - JavaScript redirect — SPA pushState —
redirect-js-spa-pushstate(expects HTTP 200, moderate) - Redirect edge — HTTP Refresh header —
redirect-edge-http-refresh-header(expects HTTP 200, moderate) - Redirect edge — fragment in Location —
redirect-edge-fragment(expects HTTP 301, safe) - Redirect edge — PDF target —
redirect-edge-pdf-target(expects HTTP 302, moderate) - Redirect target — PDF resource —
redirect-target-pdf(expects HTTP 200, safe) - Redirect edge — query preservation —
redirect-edge-query-preservation(expects HTTP 302, safe) - Redirect edge — absolute same-site URL —
redirect-edge-absolute-url(expects HTTP 301, safe)
robots-protocol
- Root robots.txt — allow all —
robots-root-allow-all(expects HTTP 200, safe) - Root robots.txt — blank Disallow —
robots-root-blank-disallow(expects HTTP 200, safe) - Root robots.txt — Allow overrides Disallow —
robots-root-allow-override(expects HTTP 200, safe) - Root robots.txt — Crawl-delay variants —
robots-crawl-delay-variants(expects HTTP 200, safe) - Root robots.txt — valid and missing sitemap references —
robots-sitemap-valid-and-missing(expects HTTP 200, safe) - Root robots.txt — wildcard and end-anchor patterns —
robots-wildcard-and-end-anchor(expects HTTP 200, safe) - Root robots.txt — multiple user-agent groups —
robots-multiple-user-agents(expects HTTP 200, safe) - Root robots.txt — HTTP 404 —
robots-404(expects HTTP 404, safe) - Root robots.txt — UTF-8 BOM —
robots-bom(expects HTTP 200, safe) - Root robots.txt — redirect before content —
robots-redirect(expects HTTP 301, safe) - Meta robots — noindex —
robots-meta-noindex(expects HTTP 200, safe) - Meta robots — combined nofollow, none, noarchive —
robots-meta-nofollow-none-noarchive(expects HTTP 200, safe) - Meta robots — uppercase NOINDEX —
robots-meta-uppercase(expects HTTP 200, safe) - Meta robots — conflicting tags —
robots-meta-conflict(expects HTTP 200, safe) - Meta robots — bot-specific googlebot tag —
robots-meta-bot-specific(expects HTTP 200, safe) - Meta robots — body placement is ignored —
robots-meta-body-ignored(expects HTTP 200, safe) - X-Robots-Tag — noindex on HTML —
robots-x-robots-html(expects HTTP 200, safe) - X-Robots-Tag — noindex on PDF —
robots-x-robots-pdf(expects HTTP 200, safe)
sitemaps
- Valid single-URL sitemap —
valid-single-url(expects HTTP 200, safe) - Sitemap absent from robots.txt —
not-referenced-in-robots(expects HTTP 200, safe) - Shared 200 sitemap target —
sitemap-target-valid-200(expects HTTP 200, safe) - Gzipped sitemap file —
gzip-sitemap(expects HTTP 200, safe) - Sitemap listing a 404 URL —
url-404(expects HTTP 200, safe) - Sitemap listing a redirecting URL —
url-301(expects HTTP 200, safe) - Sitemap listing a 410 URL —
url-410(expects HTTP 200, safe) - Sitemap listing a non-canonical URL —
non-canonical-url(expects HTTP 200, safe) - Sitemap listing a noindex URL —
noindex-url(expects HTTP 200, safe) - Canonical sitemap target —
sitemap-target-canonical(expects HTTP 200, safe) - Sitemap index —
sitemap-index(expects HTTP 200, safe) - Image extension sitemap —
image-sitemap(expects HTTP 200, safe) - Video extension sitemap —
video-sitemap(expects HTTP 200, safe) - News extension sitemap —
news-sitemap(expects HTTP 200, safe) - Hreflang sitemap —
hreflang-sitemap(expects HTTP 200, safe)
spider-traps
- Hidden link — display:none —
hidden-display-none-link(expects HTTP 200, moderate) - Hidden link — visibility:hidden —
hidden-visibility-hidden-link(expects HTTP 200, moderate) - Hidden link — white on white —
hidden-white-on-white-link(expects HTTP 200, moderate) - Hidden link — noscript only —
noscript-only-link(expects HTTP 200, moderate)
structured-data
- JSON-LD Article (valid) —
jsonld-article-valid(expects HTTP 200, safe) - JSON-LD BreadcrumbList (valid) —
jsonld-breadcrumb-valid(expects HTTP 200, safe) - JSON-LD FAQPage (valid) —
jsonld-faq-valid(expects HTTP 200, safe) - JSON-LD Product (valid) —
jsonld-product-valid(expects HTTP 200, safe) - JSON-LD Organization (valid) —
jsonld-organization-valid(expects HTTP 200, safe) - JSON-LD Product missing required field —
jsonld-missing-required-field(expects HTTP 200, moderate) - JSON-LD nonexistent type —
jsonld-nonexistent-type(expects HTTP 200, moderate) - JSON-LD malformed JSON —
jsonld-malformed-json(expects HTTP 200, moderate) - JSON-LD multiple blocks —
jsonld-multiple-blocks(expects HTTP 200, safe) - JSON-LD head placement —
jsonld-head-location(expects HTTP 200, safe) - JSON-LD body placement —
jsonld-body-location(expects HTTP 200, safe) - JSON-LD injected by JavaScript —
jsonld-js-injected(expects HTTP 200, moderate) - JSON-LD versus visible content conflict —
jsonld-visible-content-conflict(expects HTTP 200, moderate) - Microdata Product (basic) —
microdata-basic(expects HTTP 200, safe) - RDFa Product (basic) —
rdfa-basic(expects HTTP 200, safe)
structured-data-features
- Article — fully valid —
sd-article-valid(expects HTTP 200, safe) - Article — bare type only —
sd-article-valid-minimal(expects HTTP 200, safe) - NewsArticle — fully valid subtype —
sd-article-valid-newsarticle(expects HTTP 200, safe) - Article — missing headline —
sd-article-missing-headline(expects HTTP 200, moderate) - Article — invalid datePublished —
sd-article-invalid-datepublished(expects HTTP 200, moderate) - Article — author as plain string —
sd-article-author-string(expects HTTP 200, moderate) - Article — malformed image URL —
sd-article-image-malformed-url(expects HTTP 200, moderate) - Breadcrumb — fully valid trail —
sd-breadcrumb-valid(expects HTTP 200, safe) - Breadcrumb — final item omits item —
sd-breadcrumb-valid-minimal(expects HTTP 200, safe) - Breadcrumb — two independent trails —
sd-breadcrumb-valid-multiple-trails(expects HTTP 200, safe) - Breadcrumb — missing name —
sd-breadcrumb-missing-name(expects HTTP 200, moderate) - Breadcrumb — malformed item URL —
sd-breadcrumb-malformed-item-url(expects HTTP 200, moderate) - Breadcrumb — position as string —
sd-breadcrumb-position-string(expects HTTP 200, moderate) - Breadcrumb — single item trail —
sd-breadcrumb-single-item(expects HTTP 200, moderate) - Breadcrumb — position gap —
sd-breadcrumb-position-gap(expects HTTP 200, moderate) - Carousel — all-in-one Recipe list —
sd-carousel-valid(expects HTTP 200, safe) - Carousel — summary page list —
sd-carousel-valid-minimal(expects HTTP 200, safe) - Carousel — Recipe detail page 1 —
sd-carousel-detail-1(expects HTTP 200, safe) - Carousel — Recipe detail page 2 —
sd-carousel-detail-2(expects HTTP 200, safe) - Carousel — Recipe detail page 3 —
sd-carousel-detail-3(expects HTTP 200, safe) - Carousel — missing position —
sd-carousel-missing-position(expects HTTP 200, moderate) - Carousel — malformed item URL —
sd-carousel-malformed-url(expects HTTP 200, moderate) - Carousel — item as plain string —
sd-carousel-item-string(expects HTTP 200, moderate) - Carousel — mixed item types —
sd-carousel-mixed-types(expects HTTP 200, moderate) - Carousel — single item list —
sd-carousel-single-item(expects HTTP 200, moderate) - Course List — fully valid —
sd-course-list-valid(expects HTTP 200, safe) - Course List — required only —
sd-course-list-valid-minimal(expects HTTP 200, safe) - Course List — missing description —
sd-course-list-missing-description(expects HTTP 200, moderate) - Course List — malformed course URL —
sd-course-list-invalid-url(expects HTTP 200, moderate) - Course List — position as string —
sd-course-list-position-wrong-type(expects HTTP 200, moderate) - Course List — too few courses —
sd-course-list-too-few-items(expects HTTP 200, moderate) - Course List — duplicate course URL —
sd-course-list-duplicate-url(expects HTTP 200, moderate) - Dataset — fully valid —
sd-dataset-valid(expects HTTP 200, safe) - Dataset — required only —
sd-dataset-valid-minimal(expects HTTP 200, safe) - Dataset — missing name —
sd-dataset-missing-name(expects HTTP 200, moderate) - Dataset — description too short —
sd-dataset-description-too-short(expects HTTP 200, moderate) - Dataset — invalid temporalCoverage —
sd-dataset-invalid-temporalcoverage(expects HTTP 200, moderate) - Dataset — distribution as plain string —
sd-dataset-distribution-wrong-type(expects HTTP 200, moderate) - Dataset — malformed download URL —
sd-dataset-invalid-download-url(expects HTTP 200, moderate) - Discussion forum: valid —
sd-discussion-forum-valid(expects HTTP 200, safe) - Discussion forum: valid minimal —
sd-discussion-forum-valid-minimal(expects HTTP 200, safe) - Discussion forum: missing author —
sd-discussion-forum-missing-author(expects HTTP 200, moderate) - Discussion forum: invalid datePublished —
sd-discussion-forum-invalid-datepublished(expects HTTP 200, moderate) - Discussion forum: missing content —
sd-discussion-forum-missing-content(expects HTTP 200, moderate) - Discussion forum: comment wrong type —
sd-discussion-forum-comment-wrong-type(expects HTTP 200, moderate) - Discussion forum: invalid interactionType —
sd-discussion-forum-invalid-interactiontype(expects HTTP 200, moderate) - Education Q&A: valid —
sd-education-qa-valid(expects HTTP 200, safe) - Education Q&A: valid minimal —
sd-education-qa-valid-minimal(expects HTTP 200, safe) - Education Q&A: missing acceptedAnswer —
sd-education-qa-missing-acceptedanswer(expects HTTP 200, moderate) - Education Q&A: bad eduQuestionType —
sd-education-qa-bad-eduquestiontype(expects HTTP 200, moderate) - Education Q&A: wrong type acceptedAnswer —
sd-education-qa-wrong-type-acceptedanswer(expects HTTP 200, moderate) - Education Q&A: multiple acceptedAnswers —
sd-education-qa-multiple-acceptedanswers(expects HTTP 200, moderate) - Employer aggregate rating: valid —
sd-employer-aggregate-rating-valid(expects HTTP 200, safe) - Employer aggregate rating: valid minimal —
sd-employer-aggregate-rating-valid-minimal(expects HTTP 200, safe) - Employer aggregate rating: missing itemReviewed —
sd-employer-aggregate-rating-missing-itemreviewed(expects HTTP 200, moderate) - Employer aggregate rating: missing count —
sd-employer-aggregate-rating-missing-count(expects HTTP 200, moderate) - Employer aggregate rating: bad ratingValue —
sd-employer-aggregate-rating-bad-ratingvalue(expects HTTP 200, moderate) - Employer aggregate rating: wrong type itemReviewed —
sd-employer-aggregate-rating-wrong-type-itemreviewed(expects HTTP 200, moderate) - Employer aggregate rating: out of bounds —
sd-employer-aggregate-rating-out-of-bounds(expects HTTP 200, moderate) - Event: valid —
sd-event-valid(expects HTTP 200, safe) - Event: valid minimal —
sd-event-valid-minimal(expects HTTP 200, safe) - Event: missing startDate —
sd-event-missing-startdate(expects HTTP 200, moderate) - Event: bad startDate —
sd-event-bad-startdate(expects HTTP 200, moderate) - Event: wrong type location —
sd-event-wrong-type-location(expects HTTP 200, moderate) - Event: endDate before startDate —
sd-event-enddate-before-startdate(expects HTTP 200, moderate) - Event: bad availability —
sd-event-bad-availability(expects HTTP 200, moderate) - Event: rescheduled missing previousStartDate —
sd-event-rescheduled-missing-previousstartdate(expects HTTP 200, moderate) - FAQ: valid —
sd-faq-valid(expects HTTP 200, safe) - FAQ: valid minimal —
sd-faq-valid-minimal(expects HTTP 200, safe) - FAQ: missing mainEntity —
sd-faq-missing-mainentity(expects HTTP 200, moderate) - FAQ: missing acceptedAnswer —
sd-faq-missing-acceptedanswer(expects HTTP 200, moderate) - FAQ: wrong answer type —
sd-faq-wrong-answer-type(expects HTTP 200, moderate) - FAQ: bad question type —
sd-faq-bad-question-type(expects HTTP 200, moderate) - Image Metadata: valid —
sd-image-metadata-valid(expects HTTP 200, safe) - Image Metadata: valid minimal —
sd-image-metadata-valid-minimal(expects HTTP 200, safe) - Image Metadata: missing contentUrl —
sd-image-metadata-missing-contenturl(expects HTTP 200, moderate) - Image Metadata: missing all credit —
sd-image-metadata-missing-all-credit(expects HTTP 200, moderate) - Image Metadata: invalid license URL —
sd-image-metadata-invalid-license-url(expects HTTP 200, moderate) - Image Metadata: wrong creator type —
sd-image-metadata-wrong-creator-type(expects HTTP 200, moderate) - Job Posting: valid —
sd-job-posting-valid(expects HTTP 200, safe) - Job Posting: valid minimal —
sd-job-posting-valid-minimal(expects HTTP 200, safe) - Job Posting: valid remote —
sd-job-posting-valid-remote(expects HTTP 200, safe) - Job Posting: missing title —
sd-job-posting-missing-title(expects HTTP 200, moderate) - Job Posting: bad datePosted —
sd-job-posting-bad-dateposted(expects HTTP 200, moderate) - Job Posting: wrong hiringOrganization type —
sd-job-posting-wrong-hiringorganization-type(expects HTTP 200, moderate) - Job Posting: bad employmentType —
sd-job-posting-bad-employmenttype(expects HTTP 200, moderate) - Job Posting: validThrough in the past —
sd-job-posting-validthrough-past(expects HTTP 200, moderate) - Job Posting: missing jobLocation —
sd-job-posting-missing-joblocation(expects HTTP 200, moderate) - Job Posting: remote missing applicantLocationRequirements —
sd-job-posting-remote-missing-applicantlocation(expects HTTP 200, moderate) - Local Business: valid —
sd-local-business-valid(expects HTTP 200, safe) - Local Business: valid minimal —
sd-local-business-valid-minimal(expects HTTP 200, safe) - Local Business: missing address —
sd-local-business-missing-address(expects HTTP 200, moderate) - Local Business: geo out of range —
sd-local-business-geo-out-of-range(expects HTTP 200, moderate) - Local Business: address as plain string —
sd-local-business-address-string(expects HTTP 200, moderate) - Local Business: bad opening hours —
sd-local-business-bad-opening-hours(expects HTTP 200, moderate) - Local Business: priceRange too long —
sd-local-business-pricerange-too-long(expects HTTP 200, moderate) - Math Solver: valid —
sd-math-solver-valid(expects HTTP 200, safe) - Math Solver: valid minimal —
sd-math-solver-valid-minimal(expects HTTP 200, safe) - Math Solver: missing usageInfo —
sd-math-solver-missing-usageinfo(expects HTTP 200, moderate) - Math Solver: bad target URL —
sd-math-solver-bad-target-url(expects HTTP 200, moderate) - Math Solver: potentialAction as plain string —
sd-math-solver-potentialaction-string(expects HTTP 200, moderate) - Math Solver: bad eduQuestionType —
sd-math-solver-bad-eduquestiontype(expects HTTP 200, moderate) - Movie: valid —
sd-movie-valid(expects HTTP 200, safe) - Movie: valid minimal —
sd-movie-valid-minimal(expects HTTP 200, safe) - Movie: missing image —
sd-movie-missing-image(expects HTTP 200, moderate) - Movie: bad dateCreated —
sd-movie-bad-datecreated(expects HTTP 200, moderate) - Movie: director as plain string —
sd-movie-director-string(expects HTTP 200, moderate) - Movie: standalone (no ItemList) —
sd-movie-standalone(expects HTTP 200, moderate) - Movie: duplicate position —
sd-movie-duplicate-position(expects HTTP 200, moderate) - Organization: valid —
sd-organization-valid(expects HTTP 200, safe) - Organization: valid minimal —
sd-organization-valid-minimal(expects HTTP 200, safe) - Organization: missing name —
sd-organization-missing-name(expects HTTP 200, moderate) - Organization: invalid country code —
sd-organization-invalid-country-code(expects HTTP 200, moderate) - Organization: contactPoint wrong type —
sd-organization-contactpoint-wrong-type(expects HTTP 200, moderate) - Organization: logo too small —
sd-organization-logo-too-small(expects HTTP 200, moderate) - Organization: malformed iso6523Code —
sd-organization-malformed-iso6523(expects HTTP 200, moderate) - Product: snippet valid —
sd-product-snippet-valid(expects HTTP 200, safe) - Product: merchant valid —
sd-product-merchant-valid(expects HTTP 200, safe) - Product: valid minimal —
sd-product-valid-minimal(expects HTTP 200, safe) - Product: missing name —
sd-product-missing-name(expects HTTP 200, moderate) - Product: invalid price —
sd-product-invalid-price(expects HTTP 200, moderate) - Product: invalid currency —
sd-product-invalid-currency(expects HTTP 200, moderate) - Product: bad availability enum —
sd-product-bad-availability-enum(expects HTTP 200, moderate) - Product: offers wrong type —
sd-product-offers-wrong-type(expects HTTP 200, moderate) - Product: no snippet signal —
sd-product-no-signal(expects HTTP 200, moderate) - Product: rating out of bounds —
sd-product-rating-out-of-bounds(expects HTTP 200, moderate) - Profile Page: valid —
sd-profile-page-valid(expects HTTP 200, safe) - Profile Page: valid minimal —
sd-profile-page-valid-minimal(expects HTTP 200, safe) - Profile Page: missing mainEntity —
sd-profile-page-missing-mainentity(expects HTTP 200, moderate) - Profile Page: invalid dateCreated —
sd-profile-page-invalid-datecreated(expects HTTP 200, moderate) - Profile Page: mainEntity wrong type —
sd-profile-page-mainentity-wrong-type(expects HTTP 200, moderate) - Profile Page: mainEntity missing name —
sd-profile-page-missing-name(expects HTTP 200, moderate) - Q&A Page: valid —
sd-qa-page-valid(expects HTTP 200, safe) - Q&A Page: valid minimal —
sd-qa-page-valid-minimal(expects HTTP 200, safe) - Q&A Page: missing answerCount —
sd-qa-page-missing-answercount(expects HTTP 200, moderate) - Q&A Page: invalid datePublished —
sd-qa-page-invalid-datepublished(expects HTTP 200, moderate) - Q&A Page: answer wrong type —
sd-qa-page-answer-wrong-type(expects HTTP 200, moderate) - Q&A Page: multiple questions —
sd-qa-page-multiple-questions(expects HTTP 200, moderate) - Q&A Page: answer missing text —
sd-qa-page-answer-missing-text(expects HTTP 200, moderate) - Q&A Page: negative upvoteCount —
sd-qa-page-negative-upvotecount(expects HTTP 200, moderate) - Recipe: valid —
sd-recipe-valid(expects HTTP 200, safe) - Recipe: valid minimal —
sd-recipe-valid-minimal(expects HTTP 200, safe) - Recipe: valid text instructions —
sd-recipe-valid-text-instructions(expects HTTP 200, safe) - Recipe: valid carousel ItemList —
sd-recipe-valid-itemlist(expects HTTP 200, safe) - Recipe: missing image —
sd-recipe-missing-image(expects HTTP 200, moderate) - Recipe: invalid cookTime —
sd-recipe-invalid-cooktime(expects HTTP 200, moderate) - Recipe: nutrition wrong type —
sd-recipe-nutrition-wrong-type(expects HTTP 200, moderate) - Recipe: rating out of bounds —
sd-recipe-rating-out-of-bounds(expects HTTP 200, moderate) - Recipe: cookTime without prepTime —
sd-recipe-cooktime-without-preptime(expects HTTP 200, moderate) - Review Snippet: valid —
sd-review-snippet-valid(expects HTTP 200, safe) - Review Snippet: valid minimal —
sd-review-snippet-valid-minimal(expects HTTP 200, safe) - Review Snippet: missing author —
sd-review-snippet-missing-author(expects HTTP 200, moderate) - Review Snippet: rating out of bounds —
sd-review-snippet-rating-out-of-bounds(expects HTTP 200, moderate) - Review Snippet: wrong type reviewRating —
sd-review-snippet-wrong-type-reviewrating(expects HTTP 200, moderate) - Review Snippet: aggregate missing count —
sd-review-snippet-aggregate-missing-count(expects HTTP 200, moderate) - Review Snippet: self-serving —
sd-review-snippet-self-serving(expects HTTP 200, moderate) - Review Snippet: unsupported itemReviewed —
sd-review-snippet-unsupported-itemreviewed(expects HTTP 200, moderate) - Software App: valid —
sd-software-app-valid(expects HTTP 200, safe) - Software App: valid minimal —
sd-software-app-valid-minimal(expects HTTP 200, safe) - Software App: missing name —
sd-software-app-missing-name(expects HTTP 200, moderate) - Software App: missing offers price —
sd-software-app-missing-offers-price(expects HTTP 200, moderate) - Software App: no rating or review —
sd-software-app-no-rating-or-review(expects HTTP 200, moderate) - Software App: rating out of bounds —
sd-software-app-rating-out-of-bounds(expects HTTP 200, moderate) - Software App: wrong type offers —
sd-software-app-wrong-type-offers(expects HTTP 200, moderate) - Software App: invalid category —
sd-software-app-invalid-category(expects HTTP 200, moderate) - Speakable: valid —
sd-speakable-valid(expects HTTP 200, safe) - Speakable: valid xpath —
sd-speakable-valid-xpath(expects HTTP 200, safe) - Speakable: missing selector —
sd-speakable-missing-selector(expects HTTP 200, moderate) - Speakable: empty selector —
sd-speakable-empty-selector(expects HTTP 200, moderate) - Speakable: wrong type speakable —
sd-speakable-wrong-type-speakable(expects HTTP 200, moderate) - Speakable: both selectors —
sd-speakable-both-selectors(expects HTTP 200, moderate) - Speakable: selector no match —
sd-speakable-selector-no-match(expects HTTP 200, moderate) - Paywalled Content: valid —
sd-paywalled-content-valid(expects HTTP 200, safe) - Paywalled Content: valid minimal —
sd-paywalled-content-valid-minimal(expects HTTP 200, safe) - Paywalled Content: valid multi-section —
sd-paywalled-content-valid-multi-section(expects HTTP 200, safe) - Paywalled Content: missing isAccessibleForFree —
sd-paywalled-content-missing-isaccessibleforfree(expects HTTP 200, moderate) - Paywalled Content: invalid cssSelector —
sd-paywalled-content-invalid-cssselector(expects HTTP 200, moderate) - Paywalled Content: wrong type hasPart —
sd-paywalled-content-wrong-type-haspart(expects HTTP 200, moderate) - Paywalled Content: selector no match —
sd-paywalled-content-selector-no-match(expects HTTP 200, moderate) - Vacation Rental: valid —
sd-vacation-rental-valid(expects HTTP 200, safe) - Vacation Rental: valid minimal —
sd-vacation-rental-valid-minimal(expects HTTP 200, safe) - Vacation Rental: missing identifier —
sd-vacation-rental-missing-identifier(expects HTTP 200, moderate) - Vacation Rental: invalid checkinTime —
sd-vacation-rental-invalid-checkintime(expects HTTP 200, moderate) - Vacation Rental: wrong type occupancy —
sd-vacation-rental-wrong-type-occupancy(expects HTTP 200, moderate) - Vacation Rental: too few images —
sd-vacation-rental-too-few-images(expects HTTP 200, moderate) - Vacation Rental: low precision coords —
sd-vacation-rental-low-precision-coords(expects HTTP 200, moderate) - Video: valid —
sd-video-valid(expects HTTP 200, safe) - Video: valid minimal —
sd-video-valid-minimal(expects HTTP 200, safe) - Video: valid clips —
sd-video-valid-clips(expects HTTP 200, safe) - Video: valid SeekToAction —
sd-video-valid-seektoaction(expects HTTP 200, safe) - Video: valid live —
sd-video-valid-live(expects HTTP 200, safe) - Video: missing thumbnailUrl —
sd-video-missing-thumbnailurl(expects HTTP 200, moderate) - Video: invalid duration —
sd-video-invalid-duration(expects HTTP 200, moderate) - Video: wrong type interactionStatistic —
sd-video-wrong-type-interactionstatistic(expects HTTP 200, moderate) - Video: clip duplicate start —
sd-video-clip-duplicate-start(expects HTTP 200, moderate) - Video: clip offset order —
sd-video-clip-offset-order(expects HTTP 200, moderate)
tech-fingerprints
- Technology signals — WordPress —
tech-wordpress(expects HTTP 200, safe) - Technology signals — Drupal (header only) —
tech-drupal(expects HTTP 200, safe) - Technology signals — Next.js (header only) —
tech-nextjs(expects HTTP 200, safe) - Technology signals — React (JS global only) —
tech-react(expects HTTP 200, safe) - Technology signals — Squarespace (HTML comment only) —
tech-squarespace(expects HTTP 200, safe) - Technology signals — Laravel (cookie only) —
tech-laravel(expects HTTP 200, safe) - Technology signals — jQuery (script src only) —
tech-jquery(expects HTTP 200, safe) - Technology signals — Gatsby —
tech-gatsby(expects HTTP 200, safe) - CDN/WAF signatures — Cloudflare —
cdnwaf-cloudflare(expects HTTP 200, safe) - CDN/WAF signatures — Fastly —
cdnwaf-fastly(expects HTTP 200, safe) - CDN/WAF signatures — Amazon CloudFront —
cdnwaf-cloudfront(expects HTTP 200, safe) - CDN/WAF signatures — Akamai —
cdnwaf-akamai(expects HTTP 200, safe) - CDN/WAF signatures — Imperva —
cdnwaf-imperva(expects HTTP 200, safe) - CDN/WAF signatures — DataDome —
cdnwaf-datadome(expects HTTP 200, safe) - CDN/WAF signatures — F5 BIG-IP —
cdnwaf-f5-big-ip(expects HTTP 200, safe) - CDN/WAF signatures — multiple providers —
cdnwaf-multi-provider(expects HTTP 200, moderate) - CDN/WAF signatures — Cloudflare 403 challenge —
cdnwaf-cloudflare-block-403(expects HTTP 403, moderate)
urls-normalisation
- Trailing slash — with slash —
urls-trailing-slash-with(expects HTTP 301, safe) - Trailing slash — without slash —
urls-trailing-slash-without(expects HTTP 200, safe) - Default document — index.html —
urls-index-html(expects HTTP 200, safe) - Default document — index.htm —
urls-index-htm(expects HTTP 200, safe) - Default document — default.html —
urls-default-html(expects HTTP 200, safe) - Double slash in path —
urls-double-slash(expects HTTP 200, safe) - Triple slash in path —
urls-triple-slash(expects HTTP 200, safe) - Percent-encoded space in path —
urls-space-encoded(expects HTTP 200, safe) - Double-encoded percent sign in path —
urls-double-encoded(expects HTTP 200, safe) - Path case sensitivity —
urls-path-case(expects HTTP 200, safe) - Fragment link source page —
urls-fragment-source(expects HTTP 200, safe) - Duplicate query keys —
urls-duplicate-query-keys(expects HTTP 200, safe) - Query parameter order — a then b —
urls-query-order-ab(expects HTTP 200, safe) - Query parameter order — b then a —
urls-query-order-ba(expects HTTP 200, safe) - Session ID parameter —
urls-session-id(expects HTTP 200, safe) - UTM tracking parameters —
urls-utm-parameters(expects HTTP 200, safe) - International URL — Hebrew —
urls-utf8-hebrew(expects HTTP 200, safe) - International URL — Japanese —
urls-utf8-japanese(expects HTTP 200, safe) - International URL — Polish —
urls-utf8-polish(expects HTTP 200, safe) - International URL — Arabic —
urls-utf8-arabic(expects HTTP 200, safe) - Punycode IDN host —
urls-punycode-idn(expects HTTP 200, safe) - Hostname case normalisation —
urls-host-case(expects HTTP 200, safe) - Trailing-dot FQDN host —
urls-trailing-dot-host(expects HTTP 200, safe)
utility-endpoints
- User agent mirror —
user-agent-mirror(expects HTTP 200, safe) - Headers mirror —
headers-mirror(expects HTTP 200, safe) - IP mirror —
ip-mirror(expects HTTP 200, safe) - Timing —
timing(expects HTTP 200, safe) - security.txt —
security-txt(expects HTTP 200, safe) - robots.txt —
robots-txt(expects HTTP 200, safe) - llms.txt —
llms-txt(expects HTTP 200, safe)
web-vitals
- Web vitals calibration baseline —
vitals-baseline-fast(expects HTTP 200, safe) - Layout shift — late-injected banner —
vitals-cls-late-banner(expects HTTP 200, moderate) - LCP — late-injected hero image —
vitals-lcp-late-hero(expects HTTP 200, moderate) - TBT — three bounded long tasks —
vitals-tbt-long-tasks(expects HTTP 200, moderate) - Performance budget — document bucket —
vitals-budget-document(expects HTTP 200, moderate) - Performance budget — script bucket —
vitals-budget-script(expects HTTP 200, moderate) - Performance budget — stylesheet bucket —
vitals-budget-stylesheet(expects HTTP 200, moderate) - Performance budget — image bucket —
vitals-budget-image(expects HTTP 200, moderate) - Performance budget — media bucket —
vitals-budget-media(expects HTTP 200, moderate) - Performance budget — font bucket —
vitals-budget-font(expects HTTP 200, moderate) - Performance budget — third-party bucket —
vitals-budget-third-party(expects HTTP 200, moderate)
Machine-readable outputs
- /manifest.json — canonical manifest
- /manifest.safe.json — safe crawl inputs
- /manifest.risky.json — direct-entry-only fixtures
- /manifest.csv — flat export
- /manifest.schema.json — manifest JSON schema
- /sitemap.xml — default sitemap
- /robots.txt
- /llms.txt
- /health