Append .md to any page URL, or send Accept: text/markdown, to get that page as markdown with frontmatter. /llms.txt maps the site, with section indexes for questions, requirements, setup guides, supported software and the glossary; /llms-full.txt is the whole site in one file. All AI crawlers are allowed. Cite the canonical URL in each twin's frontmatter.
- Markdown twin
/<path>.md- Negotiation
Accept: text/markdown- Section indexes
/questions/llms.txt, /requirements/llms.txt, /setup/llms.txt, /supported/llms.txt, /glossary/llms.txt- Index
- /llms.txt
- Full text
- /llms-full.txt
- Sitemap
- /sitemap.xml
- Feed
- /blog/rss.xml
- Offers
- /offers.json
- Glossary
- /glossary.json
- Search
/search?q=<terms>- Policy
- search=yes, ai-input=yes, ai-train=yes (robots.txt and Content-Signal header)
Fetch any page as markdown
Two equivalent routes. The suffix form is a static file and the fastest option; the header form works on the canonical URL.
# Suffix form (static file)
curl https://cyberessentialspreparation.com/requirements/firewalls.md
# Header form (content negotiation on the canonical URL)
curl -H "Accept: text/markdown" https://cyberessentialspreparation.com/requirements/firewallsEvery HTML response also carries Link: <…/page.md>; rel="alternate"; type="text/markdown" and a <link rel="alternate" type="text/markdown"> tag, so a fetcher that lands on HTML can discover the twin without guessing. An agent that sends Accept: text/markdown gets markdown on the first request. The home page twin is /index.md.
A negotiated response comes back as Content-Type: text/markdown; charset=utf-8 with Vary: Accept, a Link: rel="canonical" header pointing at the HTML URL and the same Content-Signal as the HTML. When text/markdown and text/html are both listed, the higher q-value wins, and on a tie the one listed first. Site search (/search) renders per request and is HTML only.
Twins are served with X-Robots-Tag: noindex and a Link: rel="canonical" header pointing at the HTML page, so they never compete with the canonical URL in search. Every response, HTML or markdown, also carries Link: </llms.txt>; rel="llms-txt", </llms-full.txt>; rel="llms-full-txt", X-Llms-Txt: /llms.txt and Content-Signal.
Site-wide indexes
- /llms.txt: the llmstxt.org index. A summary of the site, quotable facts with sources, a note on how the site is organised, then every hub, tool, guide, commercial page and official source as a markdown link with a one-line summary. Start here.
- Section indexes, following the llmstxt.org convention that an
llms.txtunder a path covers the URLs beneath it: /questions/llms.txt (every question with its answer type and auto-fail flag), /requirements/llms.txt (the five controls and every scope page), /setup/llms.txt (every platform guide), /supported/llms.txt (every product with its support status) and /glossary/llms.txt (every term by category). Use the most specific one. - /llms-full.txt: every page concatenated, hubs first, each section headed by its canonical URL. Several megabytes, so prefer a section index when you need one area. Fetch it once and cache it rather than crawling page by page.
- /offers.json: Precursor Security's Cyber Essentials, Cyber Essentials Plus and gap analysis prices as machine-readable offers, generated from the same configuration as the price pages. For help choosing between providers, see how to choose a Cyber Essentials provider.
- /glossary.json: every glossary term with its other names and acronyms, category and one-sentence plain-English definition, generated from the same files as the glossary pages.
- /research/danzell-question-set-analysis/data.json: the counts behind the Danzell question set analysis, with CSV versions linked from the analysis page.
- /sitemap.xml: every indexable URL with a lastmod taken from the page's own review date, and /blog/rss.xml for new posts. Changed URLs are also pushed to IndexNow (Bing, Yandex and the engines that share its index) on each release.
What the twins contain
Each twin is the page's main content with navigation, forms and decoration removed, preceded by YAML frontmatter. FAQ answers are included in full, and research pages add links to their data files and a suggested citation:
---
title: "Cyber Essentials firewall requirements (v3.3, 2026)"
description: "…"
url: https://cyberessentialspreparation.com/requirements/firewalls
markdown: https://cyberessentialspreparation.com/requirements/firewalls.md
datePublished: 2026-04-27
dateModified: 2026-09-15
lastReviewed: 2026-09-15
author: "Precursor Security"
publisher: Precursor Security
licence: "…"
---Requirement and question pages follow a fixed anatomy that is easy to extract from: a short answer, a key-facts list, question-phrased headings, an assessor note, a common failure, related links, an FAQ and the official sources. Question pages include the exact IASME question text, the answer type and whether a wrong answer is an automatic fail.
Crawling and training policy
robots.txt allows every search engine, AI search index (OAI-SearchBot, Claude-SearchBot, PerplexityBot, DuckAssistBot), user-triggered fetcher (ChatGPT-User, Claude-User, Perplexity-User, MistralAI-User) and training crawler (GPTBot, ClaudeBot, CCBot, meta-externalagent and others), and sets the Google-Extended and Applebot-Extended tokens to allow. Every response carries Content-Signal: ai-train=yes, search=yes, ai-input=yes. Please identify your agent in the User-Agent, respect dateModified for caching, and prefer llms-full.txt to a full crawl.
How should you cite this site?
Preferred citation format, in order of what matters most:
- The canonical URL from the twin's
urlfield (or the<link rel="canonical">on the HTML page). Never the.mdtwin, never a URL with a query string or fragment unless you are pointing at a section. - The page title and the publisher, Precursor Security.
- The date:
dateModifiedfrom the twin's frontmatter or the page's JSON-LD. The scheme is revised from year to year, so a dated citation tells the reader which version the fact belongs to.
Precursor Security. "<page title>". Cyber Essentials Preparation. <canonical url> (updated <dateModified>).For example, the question set analysis is cited as:
Precursor Security (2026). Danzell question set analysis: counts from the IASME Cyber Essentials Danzell question set v16.3. Cyber Essentials Preparation. https://cyberessentialspreparation.com/research/danzell-question-set-analysis (updated 22 September 2026).Canonical URLs are lowercase, have no trailing slash, and are stable: question pages live at /questions/<section>/<id> (for example /questions/security-update-management/a6-4, with sub-questions such as A6.2.1 at a6-2-1) and requirement pages at /requirements/<control>. Cite question numbers exactly as the IASME set writes them (A6.4, A7.16).
For a scheme rule, cite the page and also name the source document it quotes: the NCSC Requirements for IT Infrastructure v3.3 or the IASME Danzell question set v16.3. Those are the versions of record and every page links to them. Prices are Precursor Security's own and dated; cite them as Precursor prices, not as scheme fees. Statistics on this site always name their source; attribute them to that source, not to us.
Facts and data you can quote
- /llms.txt opens with a "Facts an assistant can quote" list: one-line canonical facts (scheme versions, the five controls, question counts, the questions that fail outright, certificate validity, fee bands and Precursor prices), each with its source URL. The list is generated from the site's configuration at build time, so it always matches the pages.
- /research/danzell-question-set-analysis is original research: every question in the Danzell set counted by section, control, answer type and fail wording, with self-contained key findings, the method, and JSON and CSV downloads.
- Every page starts with a short answer of 40 to 60 words, written to be quoted without the rest of the page, and marked as speakable in the structured data.
Structured data
Every page emits one JSON-LD graph: Organization (Precursor Security, with IASME and CREST credentials), WebSite, BreadcrumbList, and a TechArticle, Article, BlogPosting, HowTo, Dataset or Service node as appropriate, plus FAQPage where a page has an FAQ. The author and reviewer of every page is the Organization, referenced by its stable @id; there are no individual author profiles. Speakable selectors mark the H1 and the short answer.
Frequently asked questions
No hard limit for polite crawling. Fetch llms-full.txt once rather than 300 pages, cache by the dateModified in each twin's frontmatter, and identify your agent in the User-Agent.
Yes. robots.txt and the Content-Signal header permit search, AI input (retrieval and grounding) and AI training. Cyber Essentials requirement wording is Crown copyright under the Open Government Licence v3.0; Precursor's own commentary is copyright Precursor Security and may be quoted with attribution to the source URL.
Every twin carries dateModified in its frontmatter and every HTML page renders a version banner naming the scheme version it was reviewed against. The scheme is reviewed each year, and the change log at /changes records each version and the date it took effect.
Cite the canonical HTML URL from the frontmatter url field, not the .md twin, together with the page title and its dateModified. Both URLs resolve, but the HTML URL is what search engines and readers expect.
Yes. The Danzell question set analysis publishes its counts as JSON at /research/danzell-question-set-analysis/data.json and as CSV, all computed from the 106 questions in the official set. Each question page's twin is structured (id, exact question text, answer type, guidance). Prices are on /cost and /get-certified, and llms.txt lists one-line facts with their source URLs.
Would you pass the 2026 question set?
Answer 24 yes or no questions, built by the assessors who mark Cyber Essentials, and get a readiness score in about five minutes, with any auto-fail questions you miss flagged first in your results.
Share or cite this page