{"rules":[{"id":"https","category":"indexability","severity":"high","issue":"The page is not served over HTTPS (or the final URL is not https).","why_it_matters":"HTTPS is a confirmed ranking signal and browsers flag http pages as not secure; many crawlers de-prioritise or distrust plain http.","recommendation":"Serve the page over HTTPS with a valid TLS certificate and 301-redirect http to https.","indexability_critical":false},{"id":"meta_robots_noindex","category":"indexability","severity":"high","issue":"The page declares <meta name=\"robots\" content=\"noindex\">.","why_it_matters":"A meta-robots noindex tells every search engine to drop the page from its index entirely — it cannot rank no matter how good the rest is.","recommendation":"Remove the noindex directive from the robots meta tag (or the X-Robots-Tag header) if the page should be indexed.","indexability_critical":true},{"id":"x_robots_noindex","category":"indexability","severity":"high","issue":"The HTTP response carries an X-Robots-Tag: noindex header.","why_it_matters":"An X-Robots-Tag noindex in the response headers removes the page from search indexes just like a meta noindex, but is easy to miss in the HTML.","recommendation":"Remove noindex from the X-Robots-Tag response header for this URL if it should be indexed.","indexability_critical":true},{"id":"robots_txt_indexable","category":"indexability","severity":"high","issue":"robots.txt disallows crawling of this URL for the generic crawler.","why_it_matters":"A path blocked in robots.txt is not fetched, so its content is never indexed (and any on-page directives are never even seen).","recommendation":"Scope the Disallow rules in robots.txt so this URL is crawlable, or remove the site-wide Disallow: / for the user-agent.","indexability_critical":true},{"id":"canonical_present","category":"indexability","severity":"medium","issue":"No canonical URL (<link rel=\"canonical\">) is declared.","why_it_matters":"A canonical consolidates duplicate/parameterised variants onto one URL and tells engines which version to index and rank.","recommendation":"Add <link rel=\"canonical\" href=\"...\"> pointing at the preferred, absolute URL of this page.","indexability_critical":false},{"id":"canonical_self","category":"indexability","severity":"high","issue":"The canonical URL points to a different URL than this page (non-self canonical).","why_it_matters":"A canonical that points elsewhere tells engines to index the OTHER URL instead of this one — a mis-set canonical silently de-indexes the page.","recommendation":"Point the canonical at this page's own final URL, or confirm the cross-URL canonical is intentional (e.g. a deliberate duplicate).","indexability_critical":true},{"id":"title_present","category":"title_meta","severity":"high","issue":"The page has no <title> (or it is empty).","why_it_matters":"The <title> is the single most important on-page SEO element and the clickable headline in the SERP; without it engines invent one.","recommendation":"Add a descriptive <title> that states the page topic, roughly 30-60 characters.","indexability_critical":false},{"id":"title_length","category":"title_meta","severity":"medium","issue":"The <title> length is outside the ~30-60 character SERP-snippet band.","why_it_matters":"Titles shorter than ~30 chars waste snippet space; longer than ~60 are truncated by Google, hiding the tail of the headline.","recommendation":"Rewrite the <title> to roughly 30-60 characters so it shows in full.","indexability_critical":false},{"id":"description_present","category":"title_meta","severity":"medium","issue":"The page has no meta description.","why_it_matters":"The meta description is the snippet Google frequently shows under the title; without it the engine scrapes arbitrary body text.","recommendation":"Add a concise <meta name=\"description\"> (roughly 70-160 characters) summarising the page.","indexability_critical":false},{"id":"description_length","category":"title_meta","severity":"low","issue":"The meta description length is outside the ~70-160 character band.","why_it_matters":"Descriptions under ~70 chars under-use the snippet; over ~160 are truncated, cutting off the call to action.","recommendation":"Rewrite the meta description to roughly 70-160 characters.","indexability_critical":false},{"id":"single_h1","category":"headings","severity":"high","issue":"The page does not have exactly one non-empty H1 heading.","why_it_matters":"The H1 is the primary topic signal; a missing H1 leaves the topic ambiguous and multiple H1s dilute it.","recommendation":"Use exactly one descriptive <h1> that states the page topic; demote the rest to <h2>/<h3>.","indexability_critical":false},{"id":"heading_hierarchy","category":"headings","severity":"medium","issue":"The heading levels skip a level (e.g. an H2 jumps straight to an H4).","why_it_matters":"A clean, unbroken heading outline helps engines (and assistive tech) parse the page's structure and extract sections.","recommendation":"Order headings without skipping levels: H1 then H2, H3 under H2, etc.","indexability_critical":false},{"id":"word_count","category":"headings","severity":"medium","issue":"The page has thin body content (few readable words).","why_it_matters":"Very short pages struggle to demonstrate relevance/depth and are more likely to be judged thin content.","recommendation":"Add substantive, useful body text (a common floor is ~300+ words) so the page is not thin.","indexability_critical":false},{"id":"json_ld_present","category":"structured_social","severity":"medium","issue":"No schema.org JSON-LD structured data was found.","why_it_matters":"JSON-LD is how rich results (stars, FAQ, breadcrumbs, sitelinks) are generated and how parser-agents extract typed facts.","recommendation":"Add a <script type=\"application/ld+json\"> block describing the page (Organization / WebSite / Article / Product / FAQPage as appropriate).","indexability_critical":false},{"id":"json_ld_valid","category":"structured_social","severity":"high","issue":"A JSON-LD block is present but does not parse as valid JSON.","why_it_matters":"A broken JSON-LD block is silently ignored by Google, so the intended rich result never appears — worse than having none, because it looks done.","recommendation":"Fix the malformed JSON in the <script type=\"application/ld+json\"> block (validate it) so search engines can parse it.","indexability_critical":false},{"id":"open_graph","category":"structured_social","severity":"low","issue":"OpenGraph tags are missing or incomplete (og:title/description/image/url).","why_it_matters":"OpenGraph controls the title, description and image shown when the URL is shared on social and read by many AI/social parsers.","recommendation":"Add og:title, og:description, og:image and og:url meta tags.","indexability_critical":false},{"id":"twitter_card","category":"structured_social","severity":"low","issue":"No Twitter card meta tag (twitter:card) was found.","why_it_matters":"The Twitter/X card controls how the URL renders when shared there; without it the platform falls back to a bare link.","recommendation":"Add a twitter:card meta tag (summary or summary_large_image) plus twitter:title/description/image.","indexability_critical":false},{"id":"image_alt","category":"images","severity":"medium","issue":"Many <img> elements are missing a non-empty alt attribute.","why_it_matters":"alt text is both an accessibility requirement and the primary way image search understands (and ranks) an image.","recommendation":"Add a concise, descriptive alt attribute to every content <img> (decorative images may use alt=\"\").","indexability_critical":false},{"id":"viewport","category":"i18n_mobile_crawl","severity":"high","issue":"No mobile viewport meta tag was found.","why_it_matters":"Without <meta name=\"viewport\"> the page is not mobile-friendly, and Google indexes mobile-first — a hard ranking penalty on mobile.","recommendation":"Add <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"> to the <head>.","indexability_critical":false},{"id":"html_lang","category":"i18n_mobile_crawl","severity":"low","issue":"The <html> element has no valid lang attribute.","why_it_matters":"<html lang> declares the page language for search engines, translation and assistive tech; an absent or malformed value confuses all three.","recommendation":"Set a valid BCP-47 lang on the <html> element, e.g. <html lang=\"en\"> or lang=\"en-US\".","indexability_critical":false},{"id":"charset","category":"i18n_mobile_crawl","severity":"medium","issue":"No character encoding is declared (meta charset or Content-Type header).","why_it_matters":"An undeclared charset can garble non-ASCII text for crawlers and browsers, corrupting the indexed content.","recommendation":"Declare the encoding with <meta charset=\"utf-8\"> early in the <head> (and/or a charset in the Content-Type response header).","indexability_critical":false},{"id":"hreflang_valid","category":"i18n_mobile_crawl","severity":"low","issue":"One or more hreflang annotations use an invalid language/region code.","why_it_matters":"Malformed hreflang codes are ignored by Google, so the intended international/regional targeting silently fails.","recommendation":"Use valid BCP-47 codes in hreflang (language, or language-REGION, e.g. en, en-GB, es-419) and include a self-referencing hreflang.","indexability_critical":false},{"id":"sitemap_discoverable","category":"i18n_mobile_crawl","severity":"medium","issue":"No XML sitemap was discovered (via robots.txt or /sitemap.xml).","why_it_matters":"A sitemap helps crawlers discover and prioritise every important URL instead of relying on internal links alone.","recommendation":"Publish a sitemap.xml and reference it with a 'Sitemap:' line in robots.txt.","indexability_critical":false},{"id":"favicon","category":"i18n_mobile_crawl","severity":"low","issue":"No favicon (<link rel=\"icon\">) was declared.","why_it_matters":"Google shows a favicon next to the result on mobile; its absence makes the listing look less trustworthy and lowers click-through.","recommendation":"Add a <link rel=\"icon\"> (and ideally an apple-touch-icon) in the <head>.","indexability_critical":false}],"categories":[{"key":"indexability","name":"Indexability & crawl-directives","weight":30,"description":"Whether the page is allowed to rank at all: HTTPS, meta-robots / X-Robots-Tag noindex, robots.txt access, and a present, self-referencing canonical."},{"key":"title_meta","name":"Title & meta description","weight":20,"description":"The SERP snippet: a present, well-sized <title> (30-60 chars) and meta description (70-160 chars) that will not be truncated or padded by Google."},{"key":"headings","name":"Headings & content depth","weight":15,"description":"A single descriptive H1, a heading hierarchy that does not skip levels, and enough body text that the page is not thin content."},{"key":"structured_social","name":"Structured data & social","weight":15,"description":"schema.org JSON-LD that is present AND parses, OpenGraph completeness and a Twitter card — the machine-readable/social markup rich results rely on."},{"key":"images","name":"Images","weight":8,"description":"The share of <img> elements that carry a non-empty alt attribute (accessible and an image-search ranking signal)."},{"key":"i18n_mobile_crawl","name":"i18n, mobile, encoding & crawl aids","weight":12,"description":"A mobile viewport, a declared <html lang>, a declared charset, valid hreflang (if used), a discoverable sitemap and a favicon."}],"grade_bands":[{"min_score":90,"grade":"A"},{"min_score":80,"grade":"B"},{"min_score":70,"grade":"C"},{"min_score":60,"grade":"D"},{"min_score":0,"grade":"F"}],"rating_bands":[{"min_score":80,"rating":"excellent"},{"min_score":60,"rating":"good"},{"min_score":40,"rating":"fair"},{"min_score":0,"rating":"poor"}],"indexability_critical_rules":["canonical_self","meta_robots_noindex","robots_txt_indexable","x_robots_noindex"],"thresholds":{"title_len":[30,60],"description_len":[70,160],"min_word_count":300,"image_alt_pass_ratio":0.9,"og_required":["og:title","og:description","og:image","og:url"],"critical_score_cap":39},"method":"Deterministic weighted mean of per-category rule pass-rates (pass=1, warn=0.5, fail=0) over a single page's markup, response headers and final URL; no LLM. Any indexability-critical fail (noindex / X-Robots noindex / robots-block / non-self canonical) caps the score and flags the verdict critical. Unavailable rules drop out (partial-on-failure).","attribution":"All signals are computed by us from the target page's own public surface: the fetched HTML (title, meta, headings, images, structured-data/social markup, i18n/mobile tags), its response headers (X-Robots-Tag, Content-Type charset), the final URL after redirects (HTTPS + self-canonical) and the site's robots.txt / sitemap. No third-party audit API is resold.","disclaimer":"These are automated, deterministic on-page technical-SEO indicators over a single page's markup and headers, NOT a guarantee of search ranking or indexation and NOT a judgement of content quality, keyword intent or E-E-A-T. Search engines weigh hundreds of off-page and content signals this audit does not see. Verify independently.","not_covered":"This is a mechanical on-page audit. It does NOT judge content quality, keyword intent, E-E-A-T, backlinks, Core Web Vitals or rendered/JavaScript-only content."}