www.khanacademy.org
Scored by v3 · source-of-truth hashes: score db860d6ac94e · thresholds e94f8b33e500 — verifiable against the canonical scorer.
The 28-day score is the p75 of nightly runs — the stable number to cite. Deterministic metrics (CRR/SSD/TC) show their latest value (they move only when the site changes); timing (TTFUT) and answer-fidelity (AF) are smoothed by 28-day p75 — the same lab-vs-field split Core Web Vitals uses. Synthetic daily measurement, not real-user field data.
An agent is likely to fabricate missing details rather than say “I don’t know”. 0/3 applicable facts come from machine-readable structured data.
Metrics
Token Cost breakdown
Where the page's tokens go (≈3,751 across regions). 53% is non-content — chrome and boilerplate an agent pays for. Add landmark roles (main/nav/header/footer) so agents can skip it.
Final screenshot
Diagnostics
pre-JS raw HTML
Fix: Server-render or statically generate the main content so a non-JS agent still receives it; make client rendering a progressive enhancement, not the source of truth.
content vs chrome/boilerplate
Fix: Wrap the real content in <main>/<article>, cut repeated nav/boilerplate, and keep the primary content dense and early in the DOM.
agent representation — token decomposition
Fix: Strip repeated nav/header/footer/cookie chrome from the agent-visible output; wrap content in <main>/<article> so the extractor keeps signal and drops boilerplate.
Rendered profile: headless
Metrics
Token Cost breakdown
Where the page's tokens go (≈3,627 across regions). 51% is non-content — chrome and boilerplate an agent pays for. Add landmark roles (main/nav/header/footer) so agents can skip it.
Final screenshot
Diagnostics
pre-JS raw HTML
Fix: Server-render or statically generate the main content so a non-JS agent still receives it; make client rendering a progressive enhancement, not the source of truth.
content vs chrome/boilerplate
Fix: Wrap the real content in <main>/<article>, cut repeated nav/boilerplate, and keep the primary content dense and early in the DOM.
agent representation — token decomposition
Fix: Strip repeated nav/header/footer/cookie chrome from the agent-visible output; wrap content in <main>/<article> so the extractor keeps signal and drops boilerplate.
Rendered profile: headless
Access & discovery checks — separate from the gated CAV metrics above. Click an issue for business impact, what we measured, and how to fix. · Take the Agent Readiness course →
Agent files & endpoints
Issues (4)
✗ robots.txt allows AI bots high impact Blocks: GPTBot
Business impact If robots.txt blocks AI crawlers you are invisible to ChatGPT, Claude and Perplexity — they skip you and recommend a competitor instead.
What we measured We read /robots.txt and test it against 16 AI user-agents (GPTBot, ClaudeBot, PerplexityBot, …) for a Disallow that blocks them.
How to fix Allow major AI bots to public content; restrict only private paths (/admin, /api).
User-agent: GPTBot
Allow: /
Disallow: /admin/
~ No content-blocking cookie wall medium impact Consent platform: cookiebot (verify it doesn't block content)
Business impact A consent wall that hides content until a click is invisible to agents — they cannot click 'Accept'.
What we measured We fingerprint OneTrust, Cookiebot, Usercentrics and similar managers and flag content-blocking ones.
How to fix Use an overlay banner that leaves content in the DOM, not a blocking interstitial.
Spec: https://gdpr.eu/cookies/
~ llms.txt present + valid high impact Found at /llms.txt but missing H1/blockquote
Business impact llms.txt is the robots.txt for AI: it tells agents what your site is, what matters, and where to find it. Without it AI guesses — and guessing means inaccurate recommendations and lost visibility.
What we measured We fetch /llms.txt and /.well-known/llms.txt and validate the spec (H1 title + a one-line blockquote summary). We also note /llms-full.txt (your full content as Markdown).
How to fix Create /llms.txt with a short summary + key pages; optionally /llms-full.txt with full content in Markdown.
# Your Site
> One-line description for AI agents.
## Key pages
- /products — catalog
- /pricing — plans
- /docs — documentationSpec: https://llmstxt.org
✗ Structured data (JSON-LD) medium impact No JSON-LD found
Business impact Schema.org JSON-LD tells agents what a page IS (product, article, business) with typed fields (price, rating, hours). Without it agents extract less reliably.
What we measured We parse <script type=application/ld+json>, validate it, and check for populated @type fields.
How to fix Add JSON-LD: Organization/LocalBusiness on the homepage, Product on product pages, Article on posts.
<script type="application/ld+json">{"@context":"https://schema.org","@type":"Organization","name":"Your Co","url":"https://example.com"}</script>Spec: https://schema.org/
Passed audits (7)
Transport & Trust (SEC 1.0.0)
HTTPS, HSTS, CSP, sniffing, referrer and CORS posture. Diagnostic only — this does not affect the CAV score. A security header does not make a page more legible to an agent, so scoring it would reward a CDN toggle that changes nothing an agent can recover. We measure it and say so.
Per-header findings (6)
| Header | Evidence |
|---|---|
| ✅ HTTPS | served over HTTPS |
| ✅ HSTS | max-age=31536000; includeSubDomains; preload |
| ✅ Content-Security-Policy | policy present, script-src does not allow inline |
| ✅ X-Content-Type-Options | nosniff |
| ⚠️ Referrer-Policy | no referrer-policy header (browser default applies) |
| ➖ CORS exposure | no CORS headers on the document (normal for an HTML page) |
How to improve
khanacademy.6b13cdf9dd6bb252.js — 714 KiB transferred, 58.6% unused (third-party)
kastatic.org — 2109 KiB, 68 requests, 222 ms main-thread
cumulative layout shift
longest task 121 ms (2 total)
2.6 MB total
Third-party impact
81 third-party requests · 2461 KiB (94.1% of transfer) · 222 ms main-thread — code an agent must also fetch/run before your content settles. Fewer, lazier third-parties = faster, cheaper agent reads.
| Third-party domain | Reqs | Transfer | Main-thread |
|---|---|---|---|
| kastatic.org | 68 | 2109 KiB | 222 ms |
| cookielaw.org | 10 | 180 KiB | — |
| googletagmanager.com | 1 | 161 KiB | — |
| apple.com | 1 | 11 KiB | — |
| onetrust.com | 1 | 0 KiB | — |
Wasted JavaScript (by bundle)
Transfer-accurate — each bundle's transfer size × its unused %, ranked by wasted bytes (the biggest code-splitting wins). Unused JS also inflates Token Cost (TC).
| Bundle | Transfer | Unused | Wasted |
|---|---|---|---|
| https://cdn.kastatic.org/khanacademy/khanacademy.6b13cdf9dd6bb252.js 3P | 714 KiB | 58.6% | 418 KiB |
| https://www.googletagmanager.com/gtm.js?id=GTM-WSX5PBP 3P | 161 KiB | 60.3% | 97 KiB |
| https://cdn.cookielaw.org/scripttemplates/202310.2.0/otBannerSdk.js 3P | 103 KiB | 61.1% | 63 KiB |
| https://cdn.kastatic.org/khanacademy/16914.a29881af8838a9c2.js 3P | 35 KiB | 74.3% | 26 KiB |
| https://cdn.kastatic.org/khanacademy/62257.b0e56ef60b495c14.js 3P | 23 KiB | 83.7% | 20 KiB |
| https://cdn.kastatic.org/khanacademy/25071.5ee7a73a959b9915.js 3P | 13 KiB | 79.7% | 10 KiB |
| https://cdn.kastatic.org/khanacademy/8273.d6ae3993a3701930.js 3P | 9 KiB | 79.5% | 7 KiB |
| https://cdn.kastatic.org/khanacademy/14953.ed9dce10bea3a8ce.js 3P | 6 KiB | 84.6% | 5 KiB |
| https://cdn.cookielaw.org/scripttemplates/otSDKStub.js 3P | 9 KiB | 45.9% | 4 KiB |
| https://cdn.kastatic.org/khanacademy/29226.6eccf3e2be9bb6dc.js 3P | 21 KiB | 19.7% | 4 KiB |
| https://cdn.kastatic.org/khanacademy/73950.aabeead257a16f5d.js 3P | 5 KiB | 77.4% | 4 KiB |
| https://cdn.kastatic.org/khanacademy/57819.32644b5e098e69bf.js 3P | 5 KiB | 65.8% | 4 KiB |
| https://cdn.kastatic.org/khanacademy/76684.0cc3e5250ad93e32.js 3P | 5 KiB | 76.1% | 4 KiB |
| https://cdn.kastatic.org/khanacademy/11860.ca810a3d9682dbab.js 3P | 4 KiB | 85.9% | 3 KiB |
| https://cdn.kastatic.org/khanacademy/75083.5d34075adf63db25.js 3P | 4 KiB | 62.9% | 2 KiB |
Network
Heaviest requests (30)
| URL | Type | Status | Transfer |
|---|---|---|---|
| https://cdn.kastatic.org/ka-mpp/ab38b054-1a1c-401e-bbde-58f19df734f3.png | Image | 200 | 783 KiB |
| https://cdn.kastatic.org/khanacademy/khanacademy.6b13cdf9dd6bb252.js | Script | 200 | 714 KiB |
| https://www.googletagmanager.com/gtm.js?id=GTM-WSX5PBP | Script | 200 | 161 KiB |
| https://cdn.cookielaw.org/scripttemplates/202310.2.0/otBannerSdk.js | Script | 200 | 103 KiB |
| https://www.khanacademy.org/ | Document | 200 | 79 KiB |
| https://www.khanacademy.org/api/features/sdk-u16yaYPyqdZ0OHuZ | Fetch | 200 | 66 KiB |
| https://cdn.kastatic.org/khanacademy/fonts/6964dfbfb0312ae1-PlusJakartaSans-Italic-VariableFont_wght.woff2 | Font | 200 | 64 KiB |
| https://cdn.kastatic.org/khanacademy/fonts/951cb95b43c04e99-PlusJakartaSans-VariableFont_wght.woff2 | Font | 200 | 60 KiB |
| https://cdn.kastatic.org/sounds/khanmigo/audio_samples_v2/error/lmnt:khanmigo-m-1:en.txt | Fetch | 200 | 48 KiB |
| https://cdn.kastatic.org/khanacademy/fonts/1cf13853095a62e2-LatoLatin-Bold.woff2 | Font | 200 | 44 KiB |
| https://cdn.kastatic.org/khanacademy/fonts/d45d409d2fa42169-LatoLatin-Regular.woff2 | Font | 200 | 43 KiB |
| https://cdn.kastatic.org/khanacademy/16914.a29881af8838a9c2.js | Script | 200 | 35 KiB |
| https://cdn.kastatic.org/khanacademy/images/[email protected] | Image | 200 | 34 KiB |
| https://cdn.kastatic.org/khanacademy/images/[email protected] | Image | 200 | 29 KiB |
| https://cdn.kastatic.org/images/ie-warning/browser_firefox.png | Image | 200 | 29 KiB |
| https://cdn.cookielaw.org/consent/757b7941-c87a-4c66-8f35-eed366c64b57/018dd1ad-8ae3-7978-89b9-87c467eef3d1/en.json | Fetch | 200 | 24 KiB |
| https://cdn.kastatic.org/khanacademy/62257.b0e56ef60b495c14.js | Script | 200 | 23 KiB |
| https://cdn.kastatic.org/khanacademy/29226.6eccf3e2be9bb6dc.js | Script | 200 | 21 KiB |
| https://cdn.cookielaw.org/logos/static/ot_company_logo.png | Image | 200 | 19 KiB |
| https://cdn.kastatic.org/khanacademy/khanacademy.2339b08e45f2a9cb.css | Stylesheet | 200 | 17 KiB |
| https://cdn.kastatic.org/khanacademy/fonts/03ac24f73354c182-SourceSerifPro-Regular.woff2 | Font | 200 | 16 KiB |
| https://cdn.kastatic.org/khanacademy/runtime.bf2d676b85c5f93b.js | Script | 200 | 13 KiB |
| https://cdn.kastatic.org/khanacademy/25071.5ee7a73a959b9915.js | Script | 200 | 13 KiB |
| https://cdn.cookielaw.org/scripttemplates/202310.2.0/assets/v2/otPcCenter.json | Fetch | 200 | 13 KiB |
| https://toolbox.marketingtools.apple.com/api/badges/download-on-the-app-store/black/en-us?releaseDate=1331424000 | Image | 200 | 11 KiB |
| https://cdn.kastatic.org/khanacademy/images/[email protected] | Image | 200 | 11 KiB |
| https://cdn.kastatic.org/khanacademy/44272.a0cb7b173313d9e8.js | Script | 200 | 9 KiB |
| https://cdn.cookielaw.org/scripttemplates/otSDKStub.js | Script | 200 | 9 KiB |
| https://cdn.kastatic.org/khanacademy/8273.d6ae3993a3701930.js | Script | 200 | 9 KiB |
| https://cdn.kastatic.org/images/ie-warning/browser_chrome.png | Image | 200 | 7 KiB |
Long tasks (>50 ms)
| Start | Duration |
|---|---|
| 229 ms | 121 ms |
| 354 ms | 60 ms |