{"ok":true,"skill":"site-visibility-check","name":"Site Visibility Check","engine":"1.0.0","price_usd":"0.01","method":"POST","run_url":"https://api.aiskills402.com/v1/run/site-visibility-check","content_type":"application/json","input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","additionalProperties":false,"required":["url"],"properties":{"url":{"type":"string","minLength":1,"maxLength":2048,"description":"Public https address of the site to check, usually its home page (port 443, a DNS name; no IP addresses, no *.workers.dev)."}}},"example":{"input":{"url":"https://example.com/"},"output":{"url":"https://example.com/","checked_url":"https://example.com/","host":"example.com","submitted_host":"example.com","rules_verdict":"open","score":17,"findings":[{"id":"js_only_shell","group":"invisible","severity":"critical","what":"Without JavaScript your page is nearly empty.","evidence":"171 characters of visible text: \"Example Domain This domain is for use in documentation examples without needing permission. This is not a service; avoid\"","why":"GPTBot, OAI-SearchBot, ClaudeBot and PerplexityBot do not execute JavaScript. Your site can be in Google and still not exist in ChatGPT, Claude or Perplexity answers.","fix":"Serve the main copy in the HTML itself, not only after JavaScript runs. Prerender or server-render the landing route.","private":false,"fix_skill":"no-js-visibility-fix"},{"id":"www_apex_duplicate","group":"invisible","severity":"high","what":"Both https://example.com/ and https://www.example.com/ serve the page with 200 — neither redirects to the other.","evidence":"https://www.example.com/ → 200, no redirect · no canonical link","why":"This is duplicate content: the same page on two addresses, with nothing telling search engines which one counts.","fix":"Pick one hostname and 301 the other to it, keeping the path. Then make sure <link rel=\"canonical\"> points at the one you picked.","private":false,"fix_skill":"canonical-url-decision"},{"id":"sitemap_missing","group":"invisible","severity":"high","what":"No sitemap.","evidence":"GET https://example.com/sitemap.xml → 404","why":"Your internal routes exist only inside the JavaScript bundle, so a crawler has no way to discover them. A sitemap is what makes a URL found; an internal link is what makes it crawled.","fix":"Publish /sitemap.xml listing your real routes, and add a \"Sitemap:\" line to robots.txt.","private":false,"fix_skill":"sitemap-builder"},{"id":"http_serves_content","group":"technical","severity":"high","what":"The full page loads over plain http://, not just a redirect.","evidence":"http://example.com/ → 200 OK, 577 bytes served unencrypted","why":"The entire site is usable without TLS. Anyone on the network path between a visitor and your server can read or alter the page.","fix":"Cloudflare: turn on \"Always Use HTTPS\" so the origin never answers plain http requests with real content.","private":false,"fix_skill":"canonical-url-decision"},{"id":"no_jsonld","group":"machines","severity":"medium","what":"No structured data (JSON-LD) on the page.","evidence":"0 <script type=\"application/ld+json\"> blocks on https://example.com/","why":"JSON-LD is how you tell an AI system or a search engine what your page IS (a product, a business, an article) instead of leaving it to guess from prose.","fix":"Add a <script type=\"application/ld+json\"> block describing the page (Organization, WebSite, Product or Article schema, whichever fits).","private":false,"fix_skill":"json-ld-schema"},{"id":"no_og","group":"machines","severity":"medium","what":"No Open Graph tags (og:title, og:image).","evidence":"no og:title and no og:image on https://example.com/","why":"Sharing your link on X, LinkedIn, Facebook, Slack or Discord shows a bare URL instead of a title, image and description.","fix":"Add og:title, og:description and og:image meta tags — most frameworks generate these from the same title/description you already have.","private":false,"fix_skill":null},{"id":"no_description","group":"machines","severity":"medium","what":"No meta description.","evidence":"no <meta name=\"description\"> on https://example.com/","why":"Without one, search engines synthesize a snippet from whatever text happens to sit near the top of the page — usually worse than one sentence you wrote yourself.","fix":"Add a <meta name=\"description\"> with one sentence describing the page.","private":false,"fix_skill":"seo-meta"},{"id":"http_not_redirected","group":"technical","severity":"medium","what":"The plain http:// address does not redirect to https.","evidence":"http://example.com/ → 200 at http://example.com/","why":"Visitors and crawlers that arrive over http never get upgraded to the secure version — a typed address or an old link keeps them on an unencrypted connection.","fix":"Cloudflare: turn on \"Always Use HTTPS\" under SSL/TLS → Edge Certificates, or add a Redirect Rule that 301s http:// to https://.","private":false,"fix_skill":"canonical-url-decision"},{"id":"no_viewport","group":"technical","severity":"medium","what":"No viewport meta tag.","evidence":"no <meta name=\"viewport\"> on https://example.com/","why":"Without it, mobile browsers render the desktop layout zoomed out — one of the most common single causes of a bad mobile experience score.","fix":"Add <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"> to <head>.","private":false,"fix_skill":null},{"id":"no_max_image_preview","group":"machines","severity":"low","what":"No max-image-preview:large in the robots meta tag.","evidence":"no <meta name=\"robots\"> at all","why":"Without it, Google Discover is capped to a thumbnail-sized image if it ever surfaces this page — a smaller effect on a single landing page than on a content site.","fix":"Add max-image-preview:large to your robots meta tag, e.g. <meta name=\"robots\" content=\"max-image-preview:large\">, in the root layout so it applies to every page.","private":false,"fix_skill":"search-console-actions"},{"id":"no_llms_txt","group":"machines","severity":"low","what":"No llms.txt.","evidence":"GET https://example.com/llms.txt → 404","why":"llms.txt is an emerging convention that tells AI agents what your site is and which pages matter — cheap to add, and read by tools that specifically look for it.","fix":"Publish a plain-text /llms.txt with a short description of the site and links to your most important pages.","private":false,"fix_skill":"llms-txt"},{"id":"no_lang","group":"machines","severity":"low","what":"No lang attribute on <html>.","evidence":"<html> has no lang attribute on https://example.com/","why":"Screen readers pick a pronunciation and AI systems infer the content's language from this attribute when they have little text to sample.","fix":"Add lang=\"en\" (or your content's actual language) to the <html> tag.","private":false,"fix_skill":"accessibility-review"},{"id":"canonical_missing","group":"machines","severity":"low","what":"No canonical link.","evidence":"no <link rel=\"canonical\"> on https://example.com/","why":"Without it, query-string variants or a future www/apex duplicate have no declared \"real\" version to consolidate onto.","fix":"Add <link rel=\"canonical\" href=\"https://yourdomain.com/the-current-path\"> pointing at itself with the final URL, on every page.","private":false,"fix_skill":"canonical-url-decision"},{"id":"no_h1_in_html","group":"machines","severity":"low","what":"No <h1> on the page.","evidence":"0 <h1> elements on https://example.com/","why":"The H1 is the strongest per-page topic signal after the title — a page without one relies entirely on <title> to say what it is about.","fix":"Give the page a single <h1> that states what it is, matching or close to the <title>.","private":false,"fix_skill":null},{"id":"no_hsts","group":"technical","severity":"low","what":"No Strict-Transport-Security header.","evidence":"response headers for https://example.com/ have no Strict-Transport-Security","why":"Without HSTS, a visitor's very first request can still be intercepted on plain http before any redirect happens.","fix":"Cloudflare: SSL/TLS → Edge Certificates → enable HSTS.","private":false,"fix_skill":null},{"id":"no_favicon","group":"technical","severity":"low","what":"No favicon declared in the HTML.","evidence":"no <link rel=\"icon\"> on https://example.com/","why":"Browser tabs, bookmarks and search results show a blank generic icon instead of your brand.","fix":"Add a favicon.ico at the site root and declare it with <link rel=\"icon\" href=\"/favicon.ico\">.","private":false,"fix_skill":null},{"id":"security_headers_missing","group":"technical","severity":"low","what":"Standard security headers are missing: Content-Security-Policy, X-Frame-Options (or CSP frame-ancestors), X-Content-Type-Options: nosniff.","evidence":"response headers for https://example.com/ — missing: Content-Security-Policy; X-Frame-Options (or CSP frame-ancestors); X-Content-Type-Options: nosniff","why":"Without them any site can frame your pages and the browser has no policy limiting injected scripts — the baseline hardening every security scanner checks first.","fix":"Cloudflare: Rules → Transform Rules → Modify Response Header — add Content-Security-Policy, X-Frame-Options: SAMEORIGIN and X-Content-Type-Options: nosniff.","private":false,"fix_skill":null}],"fixes":[{"slug":"no-js-visibility-fix","name":"No-JavaScript Visibility Fix","url":"https://aiskills402.com/skills/no-js-visibility-fix","fixes":["js_only_shell"],"helps_with":[]},{"slug":"canonical-url-decision","name":"Canonical URL Decision","url":"https://aiskills402.com/skills/canonical-url-decision","fixes":["www_apex_duplicate","canonical_missing"],"helps_with":["http_serves_content","http_not_redirected"]},{"slug":"sitemap-builder","name":"Sitemap Builder","url":"https://aiskills402.com/skills/sitemap-builder","fixes":["sitemap_missing"],"helps_with":[]},{"slug":"json-ld-schema","name":"JSON-LD Schema Writer","url":"https://aiskills402.com/skills/json-ld-schema","fixes":["no_jsonld"],"helps_with":[]},{"slug":"seo-meta","name":"SEO Meta Writer","url":"https://aiskills402.com/skills/seo-meta","fixes":["no_description"],"helps_with":[]},{"slug":"search-console-actions","name":"Search Console Next Action","url":"https://aiskills402.com/skills/search-console-actions","fixes":["no_max_image_preview"],"helps_with":[]},{"slug":"llms-txt","name":"llms.txt Writer","url":"https://aiskills402.com/skills/llms-txt","fixes":["no_llms_txt"],"helps_with":[]},{"slug":"accessibility-review","name":"Accessibility Review: WCAG Defects in Markup","url":"https://aiskills402.com/skills/accessibility-review","fixes":["no_lang"],"helps_with":[]}],"facts":{"visibleLength":171,"excerpt":"Example Domain This domain is for use in documentation examples without needing permission. This is not a service; avoid relying on it for testing and monitoring purposes.","metaDescription":null,"lang":null,"jsonLdTypes":[],"mainStatus":200,"hops":0,"finalUrl":"https://example.com/","botControlStatus":200,"botProbes":{"OAI-SearchBot":200,"PerplexityBot":200,"GPTBot":200,"ClaudeBot":200},"robots":{"status":404,"isHtml":true,"blocksAI":[],"sitemapDeclared":false},"sitemap":{"status":404,"isHtml":true,"locs":0,"samples":[]},"llms":{"status":404,"isHtml":true},"httpUpgrades":false,"otherForm":"duplicates"},"stack":["host:cloudflare"],"title":"Example Domain","requests":20,"ms":169,"rules_version":"2026-09-13","engine":"402registry","fetched_as":"402registry-check/1.0 (+https://402registry.com/bot)","measured_from":"recorded","checked_at":"2026-11-06T05:17:51.067Z","report_url":null},"refusal":null},"limits":{"max_body_bytes":65536,"max_input_chars":60000},"note":"Computed from a recorded report (2026-11-06) of a public site, made by the same 402registry engine with the same rules; this example never contacts another site. Paid calls check the site live from the Cloudflare edge and return report_url, the full report with evidence. Findings marked private: true are shown only to you.","live":false,"captured_at":"2026-11-06T05:17:51.068Z","file_url":null}