{"openapi":"3.1.0","info":{"title":"AI Readiness Index","description":"The public surface of air.ten7.com: the pages, their Markdown representations, and the two endpoints a result page polls. Everything behind the staff login is deliberately absent — a specification that lists it hands over the route map for free.","version":"1.0.0"},"paths":{"/":{"get":{"summary":"Landing","operationId":"landing__get","parameters":[{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/checks":{"get":{"summary":"Checks Page","description":"The 68 checks, grouped by dimension. Public: it is the receipt for what\na scan actually looked at, not something behind the login.","operationId":"checks_page_checks_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/methodology":{"get":{"summary":"Methodology Page","description":"The Index itself, published.\n\nA score is only defensible if the rubric behind it is readable by the person\nbeing scored. The page is derived from docs/AI-READINESS-INDEX.md at render\ntime rather than written by hand, so there is one document rather than two\nthat drift apart.","operationId":"methodology_page_methodology_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/methodology.md":{"get":{"summary":"Methodology Markdown","description":"The same document as Markdown. It is what the page is made of, it is what\na machine reading this site would rather have, and publishing it is the\ncheapest possible proof that the page is not a marketing rewrite.","operationId":"methodology_markdown_methodology_md_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/license":{"get":{"summary":"License Page","description":"One page that says, without hedging, what is open and what is not.\n\nTwo different licenses live in this codebase and a reader should never\nhave to guess which one covers what they are looking at.","operationId":"license_page_license_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/editorial-policy":{"get":{"summary":"Editorial Policy Page","description":"How checks are chosen, weighted and scored, and what happens when\nsomebody says a finding is wrong. The Organization node points at this\nas its publishingPrinciples — a rubric nobody can read is a number\nnobody can argue with.","operationId":"editorial_policy_page_editorial_policy_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/privacy":{"get":{"summary":"Privacy Page","operationId":"privacy_page_privacy_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/terms":{"get":{"summary":"Terms Page","operationId":"terms_page_terms_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/embed.js":{"get":{"summary":"Embed Script","description":"One script tag that writes the form wherever it is dropped.\n\nPublic, and it has to be: this is what another site loads. Only the\ninstructions for using it live behind the dashboard login.","operationId":"embed_script_embed_js_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/scan":{"get":{"summary":"Scan Via Get","description":"GET so the form works from an email, where JavaScript never runs.","operationId":"scan_via_get_scan_get","parameters":[{"name":"url","in":"query","required":false,"schema":{"type":"string","default":"","title":"Url"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Scan Via Post","operationId":"scan_via_post_scan_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_scan_via_post_scan_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/s/{token}":{"get":{"summary":"Result Page","operationId":"result_page_s__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}},{"name":"captured","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Captured"}},{"name":"save","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Save"}},{"name":"saved","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Saved"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scan/{token}":{"get":{"summary":"Scan Status","operationId":"scan_status_api_scan__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/view/{token}":{"post":{"summary":"Record Dwell","operationId":"record_dwell_api_view__token__post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/healthz":{"get":{"summary":"Healthz","operationId":"healthz_healthz_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/robots.txt":{"get":{"summary":"Robots","description":"Practice what we measure.\n\nThe comment block is the policy in plain English (AR-1.5): a person reading\nthis file should learn what they may do with the Index without writing to\nask. It has to stay one unbroken run of comment lines — a blank line in the\nmiddle splits it in two and halves what a parser sees.\n\nThe Content-Signal line below says the same thing to machines, and the two\nmust not disagree. Result pages are private to whoever ran them.","operationId":"robots_robots_txt_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/llms.txt":{"get":{"summary":"Llms Txt","description":"The site in one Markdown file, per llmstxt.org. AR-4.1.\n\nGenerated, not written. The link list is built from the same sitemap the\ncrawlers get and the counts come from the registry, so a check added to\nchecks.yaml cannot leave this file quoting a number that used to be true —\nwhich is exactly the staleness AR-4.1 penalizes.","operationId":"llms_txt_llms_txt_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/sitemap.xml":{"get":{"summary":"Sitemap","description":"An index pointing at one child per content type.\n\nThere is one type today — the pages in web/pages.py — so the index has\none child. The shape is what matters: when reports or a second type\nearn their own sitemap, they get one by being added here rather than by\nthis being rewritten. Media sitemaps are deliberately absent: this site\nhas no images or video, and an empty image sitemap to satisfy a check is\nexactly what this Index exists to catch.","operationId":"sitemap_sitemap_xml_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/sitemap-pages.xml":{"get":{"summary":"Sitemap Pages","operationId":"sitemap_pages_sitemap_pages_xml_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"Body_scan_via_post_scan_post":{"properties":{"url":{"type":"string","title":"Url","default":""}},"type":"object","title":"Body_scan_via_post_scan_post"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}},"servers":[{"url":"https://air.ten7.com"}]}