{"openapi":"3.1.0","info":{"title":"SEO Audit API - On-Page SEO Checker & Score","version":"1.0.0","description":"One URL in, a complete on-page SEO report out: a 0-100 score with issues and fixes, title and meta description with pixel widths, headings, canonical and indexability (robots meta, X-Robots-Tag, robots.txt for Googlebot), sitemap, hreflang, Open Graph / Twitter, structured data validated against Google's rich result rules, images without alt, links with optional broken-link checks, word count and readability, and page speed hints. Deterministic checks, no AI; plain HTTP first with an automatic real-browser fallback for JavaScript sites; most answers in 1-3 seconds.\n\nAll endpoints accept GET (query string) or POST (JSON body). Errors use one shape: `{\"success\": false, \"error\": {\"code\", \"message\", \"retryable\"}}`. When a numeric `Retry-After` header is present, `error.retryAfterSeconds` is included.","contact":{"name":"TidyTools","url":"https://apify.com/tidytools"}},"servers":[{"url":"https://webcapture-api.yukailin.workers.dev","description":"Origin (reachable only through the marketplace gateway)"}],"tags":[{"name":"SEO"}],"paths":{"/api/v1/seo/audit":{"get":{"operationId":"seoAuditGet","summary":"Audit a web page for on-page SEO (GET)","description":"Fetches one page and returns a 0-100 score, a grade and a list of issues (severity, stable code, message, fix), plus the details behind them: title and meta description (length and estimated pixel width in Google results), heading outline and H1 checks, canonical (duplicates, conflicts with the HTTP Link header, placement, status of the target), robots meta, googlebot meta and X-Robots-Tag, robots.txt verdict for Googlebot, sitemap presence, hreflang validation, Open Graph and Twitter cards, structured data checked against Google's required and recommended properties, images without alt text, internal/external links (optionally the status of up to 50 of them), word count and readability, speed hints from the HTTP response (HTML size, compression, cache headers, render-blocking resources), mobile viewport, language, charset and mixed content. Deterministic rules only (no AI). Plain HTTP first; a real browser only when the site blocks bots or needs JavaScript. Results are cached for 30 minutes.","tags":["SEO"],"parameters":[{"name":"url","schema":{"type":"string"},"description":"Page URL. A bare domain such as `example.com` is accepted (https is assumed). Private, local and cloud-metadata addresses are refused on every redirect.","required":true,"example":"https://vercel.com/","in":"query"},{"name":"checkLinks","schema":{"type":"integer","default":0,"minimum":0,"maximum":50},"description":"Also check the HTTP status of up to this many links on the page (unique, internal first), following redirects. 0 = no link checks (fastest).","required":false,"in":"query"},{"name":"linkScope","schema":{"type":"string","default":"all","enum":["all","internal","external"]},"description":"Which links `checkLinks` picks: `all` (internal first), `internal` or `external`.","required":false,"in":"query"},{"name":"siteChecks","schema":{"type":"boolean","default":true},"description":"Read robots.txt (Googlebot verdict), look for a sitemap and check the canonical target's status. `false` = the page only.","required":false,"in":"query"},{"name":"includeLinks","schema":{"type":"boolean","default":false},"description":"Also return the list of links on the page (up to 500).","required":false,"in":"query"},{"name":"render","schema":{"type":"string","default":"auto","enum":["auto","never","always"]},"description":"`auto` (default): plain HTTP first, a real Chrome browser only when the site blocks plain requests or sends a JavaScript shell with almost no text. `never`: HTTP only. `always`: browser only.","required":false,"in":"query"},{"name":"timeoutMs","schema":{"type":"integer","default":15000,"minimum":1000,"maximum":30000},"description":"Page-load timeout in milliseconds.","required":false,"in":"query"}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"url":{"type":"string"},"finalUrl":{"type":"string"},"statusCode":{"type":"integer"},"redirects":{"type":"integer"},"https":{"type":"boolean"},"renderedWith":{"type":"string","enum":["http","browser"],"description":"`http`: plain HTTP fetch. `browser`: a real Chrome render (the site blocked plain requests, sent a JavaScript shell, or render=always)."},"score":{"type":"integer","minimum":0,"maximum":100,"description":"100 minus 15 per critical, 5 per warning and 1 per notice issue."},"grade":{"type":"string","enum":["A","B","C","D","F"],"description":"A >= 90, B >= 80, C >= 70, D >= 50, F < 50."},"summary":{"type":"object","properties":{"critical":{"type":"integer"},"warnings":{"type":"integer"},"notices":{"type":"integer"},"total":{"type":"integer"}}},"categoryScores":{"type":"object","properties":{"indexing":{"type":"integer"},"technical":{"type":"integer"},"meta":{"type":"integer"},"headings":{"type":"integer"},"content":{"type":"integer"},"links":{"type":"integer"},"images":{"type":"integer"},"social":{"type":"integer"},"structured-data":{"type":"integer"},"performance":{"type":"integer"},"mobile":{"type":"integer"},"international":{"type":"integer"}},"description":"Per category: 100 minus 3x the penalties of its issues."},"issues":{"type":"array","description":"Problems found, critical first. Each has a stable `code` and a concrete `fix`.","items":{"type":"object","properties":{"severity":{"type":"string","enum":["critical","warning","notice"]},"code":{"type":"string","description":"Stable machine-readable id, e.g. `title-long`, `canonical-target-redirect`, `robots-txt-blocked`, `img-alt-missing` (full list in the docs)."},"category":{"type":"string","enum":["indexing","technical","meta","headings","content","links","images","social","structured-data","performance","mobile","international"]},"message":{"type":"string","description":"What was found, with the numbers."},"fix":{"type":"string","description":"How to fix it."}}}},"title":{"type":"object","properties":{"text":{"type":"string","nullable":true},"length":{"type":"integer"},"pixelWidth":{"type":"integer","description":"Estimated width in Google results (Arial 20 px). About 600 px fit."},"truncatedInSerp":{"type":"boolean"},"count":{"type":"integer"}}},"metaDescription":{"type":"object","properties":{"text":{"type":"string","nullable":true},"length":{"type":"integer"},"pixelWidth":{"type":"integer","description":"Estimated width in Google results (Arial 14 px). About 920 px fit."},"truncatedInSerp":{"type":"boolean"},"count":{"type":"integer"}}},"headings":{"type":"object","properties":{"h1":{"type":"array","items":{"type":"string"}},"counts":{"type":"object","properties":{"h1":{"type":"integer"},"h2":{"type":"integer"},"h3":{"type":"integer"},"h4":{"type":"integer"},"h5":{"type":"integer"},"h6":{"type":"integer"}}},"outline":{"type":"array","items":{"type":"object","properties":{"level":{"type":"integer"},"text":{"type":"string"}}}},"outlineTruncated":{"type":"boolean"}}},"canonical":{"type":"object","properties":{"url":{"type":"string","nullable":true},"selfReferencing":{"type":"boolean","nullable":true},"count":{"type":"integer"},"values":{"type":"array","items":{"type":"string"}},"fromHeader":{"type":"boolean"},"inBody":{"type":"boolean"},"target":{"type":"object","nullable":true,"description":"Status of the canonical URL when it points elsewhere (null when self-referencing or not checked).","properties":{"url":{"type":"string"},"status":{"type":"integer","nullable":true},"statusClass":{"type":"string"},"finalUrl":{"type":"string","nullable":true},"redirects":{"type":"integer"},"error":{"type":"string","nullable":true}}}}},"indexability":{"type":"object","properties":{"indexable":{"type":"boolean"},"metaRobots":{"type":"string","nullable":true},"googlebotMeta":{"type":"string","nullable":true},"xRobotsTag":{"type":"string","nullable":true},"directives":{"type":"object","properties":{"noindex":{"type":"boolean"},"nofollow":{"type":"boolean"},"noarchive":{"type":"boolean"},"nosnippet":{"type":"boolean"},"noimageindex":{"type":"boolean"},"maxSnippet":{"type":"integer","nullable":true},"maxImagePreview":{"type":"string","nullable":true},"unavailableAfter":{"type":"string","nullable":true}}},"robotsTxt":{"type":"object","nullable":true,"description":"robots.txt verdict for Googlebot (null with siteChecks=false).","properties":{"url":{"type":"string"},"status":{"type":"integer","nullable":true},"fetched":{"type":"boolean"},"allowed":{"type":"boolean","nullable":true,"description":"May Googlebot crawl this URL? null when robots.txt could not be read (e.g. it refused our servers)."},"rule":{"type":"string","nullable":true,"description":"The deciding rule, e.g. `Disallow: /private/`."},"matchedAgent":{"type":"string","nullable":true},"sitemaps":{"type":"array","items":{"type":"string"}},"note":{"type":"string","nullable":true}}}}},"sitemap":{"type":"object","nullable":true,"description":"Sitemap presence (the first sitemap listed in robots.txt, else /sitemap.xml). null with siteChecks=false.","properties":{"found":{"type":"boolean"},"url":{"type":"string","nullable":true},"source":{"type":"string","enum":["robots.txt","default"]},"status":{"type":"integer","nullable":true},"type":{"type":"string","nullable":true,"enum":["urlset","index"]},"urlCount":{"type":"integer","nullable":true},"listsThisPage":{"type":"boolean","nullable":true,"description":"true/false when the sitemap read answers it; null for sitemap indexes or when other sitemaps may list the page."},"note":{"type":"string","nullable":true}}},"hreflang":{"type":"object","properties":{"count":{"type":"integer"},"xDefault":{"type":"boolean"},"links":{"type":"array","items":{"type":"object","properties":{"lang":{"type":"string"},"href":{"type":"string"}}},"description":"Up to 50 hreflang alternates."}}},"social":{"type":"object","properties":{"openGraph":{"type":"object","properties":{"title":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"image":{"type":"string","nullable":true},"url":{"type":"string","nullable":true},"type":{"type":"string","nullable":true},"siteName":{"type":"string","nullable":true}}},"twitter":{"type":"object","properties":{"card":{"type":"string","nullable":true},"title":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"image":{"type":"string","nullable":true},"site":{"type":"string","nullable":true}}}}},"structuredData":{"type":"object","properties":{"status":{"type":"string","enum":["none","valid","warnings","errors"]},"formats":{"type":"array","items":{"type":"string"}},"types":{"type":"array","items":{"type":"string"}},"richResultsEligible":{"type":"array","items":{"type":"string"}},"errorCount":{"type":"integer"},"warningCount":{"type":"integer"},"items":{"type":"array","description":"Top-level structured data items (and nested ones with errors), checked against Google's required and recommended properties.","items":{"type":"object","properties":{"type":{"type":"string"},"format":{"type":"string","enum":["json-ld","microdata"]},"richResult":{"type":"string","nullable":true},"eligible":{"type":"boolean","nullable":true},"errors":{"type":"array","items":{"type":"string"}},"warnings":{"type":"array","items":{"type":"string"}},"notes":{"type":"array","items":{"type":"string"}}}}}}},"images":{"type":"object","properties":{"total":{"type":"integer"},"missingAlt":{"type":"integer"},"emptyAlt":{"type":"integer"},"missingDimensions":{"type":"integer"},"lazyLoaded":{"type":"integer"},"missingAltList":{"type":"array","items":{"type":"string"},"description":"Up to 20 image URLs without an alt attribute."}}},"links":{"type":"object","properties":{"total":{"type":"integer"},"internal":{"type":"integer"},"external":{"type":"integer"},"unique":{"type":"integer"},"nofollow":{"type":"integer"},"withoutText":{"type":"integer"},"checked":{"type":"object","nullable":true,"description":"Only with checkLinks > 0.","properties":{"requested":{"type":"integer"},"checked":{"type":"integer"},"skipped":{"type":"integer","description":"Not requested: private/local addresses, or the time budget ran out."},"broken":{"type":"integer"},"redirected":{"type":"integer"},"results":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"internal":{"type":"boolean"},"anchorText":{"type":"string"},"status":{"type":"integer","nullable":true},"statusClass":{"type":"string","enum":["ok","redirect","restricted","broken","server-error","error"],"description":"`restricted` = 401/403/429/999 (often bot protection; not counted as broken)."},"finalUrl":{"type":"string","nullable":true},"redirects":{"type":"integer"},"error":{"type":"string","nullable":true}}}}}},"list":{"type":"array","description":"Only with includeLinks=true: up to 500 links.","items":{"type":"object","properties":{"url":{"type":"string"},"text":{"type":"string"},"internal":{"type":"boolean"},"nofollow":{"type":"boolean"}}}}}},"content":{"type":"object","properties":{"wordCount":{"type":"integer"},"characters":{"type":"integer"},"textHtmlRatio":{"type":"number","nullable":true},"readingTimeMinutes":{"type":"integer"},"readability":{"type":"object","properties":{"sentences":{"type":"integer"},"avgWordsPerSentence":{"type":"number","nullable":true},"longSentencePercent":{"type":"number","nullable":true},"fleschReadingEase":{"type":"number","nullable":true},"level":{"type":"string","nullable":true,"enum":["easy","standard","fairly difficult","difficult","very difficult"],"description":"From the Flesch score (English only)."}},"description":"Computed on prose blocks (12+ words); Flesch Reading Ease for English only."},"language":{"type":"string","nullable":true},"wordsWithoutJavaScript":{"type":"integer","description":"Only when the browser version was audited: words in the plain HTML."}}},"mobile":{"type":"object","properties":{"viewport":{"type":"string","nullable":true},"responsive":{"type":"boolean"},"zoomDisabled":{"type":"boolean"}}},"performance":{"type":"object","properties":{"responseMs":{"type":"integer","nullable":true,"description":"Time to the response headers, redirects included (null for browser-only renders)."},"htmlBytes":{"type":"integer"},"transferBytes":{"type":"integer","nullable":true,"description":"Compressed size on the wire when the server sends Content-Length."},"compression":{"type":"string","nullable":true},"cacheControl":{"type":"string","nullable":true},"etag":{"type":"boolean"},"lastModified":{"type":"string","nullable":true},"scripts":{"type":"integer"},"inlineScripts":{"type":"integer"},"stylesheets":{"type":"integer"},"renderBlocking":{"type":"object","properties":{"scripts":{"type":"integer"},"stylesheets":{"type":"integer"}}},"images":{"type":"integer"},"iframes":{"type":"integer"},"hints":{"type":"array","items":{"type":"string"}}}},"technical":{"type":"object","properties":{"doctype":{"type":"boolean"},"charset":{"type":"string"},"charsetSource":{"type":"string","enum":["bom","header","meta","default","browser"]},"charsetDeclared":{"type":"string","nullable":true},"lang":{"type":"string","nullable":true},"favicon":{"type":"boolean"},"metaRefresh":{"type":"string","nullable":true},"headEndsEarlyAt":{"type":"string","nullable":true,"description":"The element that ends <head> early (tags after it are ignored by Google), else null."}}},"durationMs":{"type":"integer"},"renderedBecause":{"type":"string","enum":["blocked","javascript","requested"],"description":"Only when renderedWith=browser: why."},"fallbackReason":{"type":"string","description":"Why the browser was used (or why its result was not kept)."},"partial":{"type":"boolean","description":"true: a time or request budget cut a check short (robots.txt, sitemap, canonical target or link checks). Such answers are not cached."}}},"example":{"success":true,"url":"https://vercel.com/","finalUrl":"https://vercel.com/","statusCode":200,"redirects":0,"https":true,"renderedWith":"http","score":93,"grade":"A","summary":{"critical":0,"warnings":1,"notices":2,"total":3},"categoryScores":{"indexing":100,"technical":100,"meta":97,"headings":100,"content":100,"links":100,"images":100,"social":100,"structured-data":85,"performance":100,"mobile":97,"international":100},"issues":[{"severity":"warning","code":"structured-data-errors","category":"structured-data","message":"Structured data has 1 error(s): SoftwareApplication: missing required one of \"aggregateRating\", \"review\".","fix":"Fix the errors listed in structuredData.items: they stop the page from getting rich results."},{"severity":"notice","code":"description-short","category":"meta","message":"The meta description is short (45 characters).","fix":"Expand the meta description to 120-160 characters."},{"severity":"notice","code":"zoom-disabled","category":"mobile","message":"The viewport stops visitors from zooming.","fix":"Remove user-scalable=no and maximum-scale below 2 so that visitors can zoom."}],"title":{"text":"Agentic Infrastructure - Vercel","length":31,"pixelWidth":265,"truncatedInSerp":false,"count":1},"metaDescription":{"text":"The autonomous stack for every app and agent.","length":45,"pixelWidth":297,"truncatedInSerp":false,"count":1},"headings":{"h1":["Agentic Infrastructure"],"counts":{"h1":1,"h2":17,"h3":0,"h4":0,"h5":0,"h6":0},"outline":[{"level":1,"text":"Agentic Infrastructure"},{"level":2,"text":"Build agents on infrastructure that thinks like them"},{"level":2,"text":"Ship apps that scale from zero to millions instantly"},{"level":2,"text":"Host platforms that serve every customer"}],"outlineTruncated":false},"canonical":{"url":"https://vercel.com/","selfReferencing":true,"count":1,"values":["https://vercel.com"],"fromHeader":false,"inBody":false,"target":null},"indexability":{"indexable":true,"metaRobots":"index, max-image-preview:large","googlebotMeta":null,"xRobotsTag":null,"directives":{"noindex":false,"nofollow":false,"noarchive":false,"nosnippet":false,"noimageindex":false,"maxSnippet":null,"maxImagePreview":"large","unavailableAfter":null},"robotsTxt":{"url":"https://vercel.com/robots.txt","status":200,"fetched":true,"allowed":true,"rule":null,"matchedAgent":"*","sitemaps":["https://vercel.com/sitemap.xml"],"note":null}},"sitemap":{"found":true,"url":"https://vercel.com/sitemap.xml","source":"robots.txt","status":200,"type":"urlset","urlCount":8471,"listsThisPage":true,"note":null},"hreflang":{"count":0,"xDefault":false,"links":[]},"social":{"openGraph":{"title":"Agentic Infrastructure - Vercel","description":"The autonomous stack for every app and agent.","image":"https://lishhsx6kmthaacj.public.blob.vercel-storage.com/og-home-not-x.png","url":"https://vercel.com","type":"website","siteName":"Vercel"},"twitter":{"card":"summary_large_image","title":"Agentic Infrastructure - Vercel","description":"The autonomous stack for every app and agent.","image":"https://lishhsx6kmthaacj.public.blob.vercel-storage.com/og-home-x.png","site":null}},"structuredData":{"status":"errors","formats":["json-ld"],"types":["Organization","Service","SoftwareApplication"],"richResultsEligible":["Organization (logo, knowledge panel)"],"errorCount":1,"warningCount":0,"items":[{"type":"Organization","format":"json-ld","richResult":"Organization (logo, knowledge panel)","eligible":true,"errors":[],"warnings":[]},{"type":"Service","format":"json-ld","richResult":null,"eligible":null,"errors":[],"warnings":[]},{"type":"SoftwareApplication","format":"json-ld","richResult":"Software app","eligible":false,"errors":["$[2]: SoftwareApplication: missing required one of \"aggregateRating\", \"review\""],"warnings":[]}]},"images":{"total":19,"missingAlt":0,"emptyAlt":3,"missingDimensions":0,"lazyLoaded":12,"missingAltList":[]},"links":{"total":167,"internal":149,"external":18,"unique":90,"nofollow":0,"withoutText":0,"checked":null},"content":{"wordCount":616,"characters":4241,"textHtmlRatio":0.7,"readingTimeMinutes":3,"readability":{"sentences":10,"avgWordsPerSentence":15.3,"longSentencePercent":0,"fleschReadingEase":55.3,"level":"fairly difficult"},"language":"en"},"mobile":{"viewport":"width=device-width, initial-scale=1, maximum-scale=1","responsive":true,"zoomDisabled":true},"performance":{"responseMs":59,"htmlBytes":626089,"transferBytes":null,"compression":"br","cacheControl":"public, max-age=0, must-revalidate","etag":true,"lastModified":null,"scripts":44,"inlineScripts":20,"stylesheets":3,"renderBlocking":{"scripts":1,"stylesheets":3},"images":19,"iframes":0,"hints":["Add defer or async to 1 script(s) in <head>."]},"technical":{"doctype":true,"charset":"utf-8","charsetSource":"header","charsetDeclared":"utf-8","lang":"en","favicon":true,"metaRefresh":null,"headEndsEarlyAt":null},"durationMs":257}}}},"400":{"description":"Invalid parameter (`invalid_request`) or a private/local target (`url_not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"error":{"code":"url_not_allowed","message":"private, local and reserved hosts are not allowed"}}}}},"413":{"description":"Request body or target document too large (`too_large`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The page does not exist (`target_error`, HTTP 404/410), the site refused even a real browser (`target_blocked`), could not be reached or its domain does not resolve (`target_unreachable`), or the URL is not an HTML page (`unsupported_content`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"error":{"code":"target_error","message":"The page does not exist (HTTP 404).","details":{"targetStatus":404,"finalUrl":"https://example.com/this-page-does-not-exist"}}}}}},"502":{"description":"Temporary failure on our side (`upstream_error`); safe to retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The target did not respond in time (`timeout`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"seoAudit","summary":"Audit a web page for on-page SEO","description":"Fetches one page and returns a 0-100 score, a grade and a list of issues (severity, stable code, message, fix), plus the details behind them: title and meta description (length and estimated pixel width in Google results), heading outline and H1 checks, canonical (duplicates, conflicts with the HTTP Link header, placement, status of the target), robots meta, googlebot meta and X-Robots-Tag, robots.txt verdict for Googlebot, sitemap presence, hreflang validation, Open Graph and Twitter cards, structured data checked against Google's required and recommended properties, images without alt text, internal/external links (optionally the status of up to 50 of them), word count and readability, speed hints from the HTTP response (HTML size, compression, cache headers, render-blocking resources), mobile viewport, language, charset and mixed content. Deterministic rules only (no AI). Plain HTTP first; a real browser only when the site blocks bots or needs JavaScript. Results are cached for 30 minutes.\n\nThe same parameters as the GET form, sent as a JSON body.","tags":["SEO"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"Page URL. A bare domain such as `example.com` is accepted (https is assumed). Private, local and cloud-metadata addresses are refused on every redirect."},"checkLinks":{"type":"integer","default":0,"minimum":0,"maximum":50,"description":"Also check the HTTP status of up to this many links on the page (unique, internal first), following redirects. 0 = no link checks (fastest)."},"linkScope":{"type":"string","default":"all","enum":["all","internal","external"],"description":"Which links `checkLinks` picks: `all` (internal first), `internal` or `external`."},"siteChecks":{"type":"boolean","default":true,"description":"Read robots.txt (Googlebot verdict), look for a sitemap and check the canonical target's status. `false` = the page only."},"includeLinks":{"type":"boolean","default":false,"description":"Also return the list of links on the page (up to 500)."},"render":{"type":"string","default":"auto","enum":["auto","never","always"],"description":"`auto` (default): plain HTTP first, a real Chrome browser only when the site blocks plain requests or sends a JavaScript shell with almost no text. `never`: HTTP only. `always`: browser only."},"timeoutMs":{"type":"integer","default":15000,"minimum":1000,"maximum":30000,"description":"Page-load timeout in milliseconds."}},"required":["url"]}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"url":{"type":"string"},"finalUrl":{"type":"string"},"statusCode":{"type":"integer"},"redirects":{"type":"integer"},"https":{"type":"boolean"},"renderedWith":{"type":"string","enum":["http","browser"],"description":"`http`: plain HTTP fetch. `browser`: a real Chrome render (the site blocked plain requests, sent a JavaScript shell, or render=always)."},"score":{"type":"integer","minimum":0,"maximum":100,"description":"100 minus 15 per critical, 5 per warning and 1 per notice issue."},"grade":{"type":"string","enum":["A","B","C","D","F"],"description":"A >= 90, B >= 80, C >= 70, D >= 50, F < 50."},"summary":{"type":"object","properties":{"critical":{"type":"integer"},"warnings":{"type":"integer"},"notices":{"type":"integer"},"total":{"type":"integer"}}},"categoryScores":{"type":"object","properties":{"indexing":{"type":"integer"},"technical":{"type":"integer"},"meta":{"type":"integer"},"headings":{"type":"integer"},"content":{"type":"integer"},"links":{"type":"integer"},"images":{"type":"integer"},"social":{"type":"integer"},"structured-data":{"type":"integer"},"performance":{"type":"integer"},"mobile":{"type":"integer"},"international":{"type":"integer"}},"description":"Per category: 100 minus 3x the penalties of its issues."},"issues":{"type":"array","description":"Problems found, critical first. Each has a stable `code` and a concrete `fix`.","items":{"type":"object","properties":{"severity":{"type":"string","enum":["critical","warning","notice"]},"code":{"type":"string","description":"Stable machine-readable id, e.g. `title-long`, `canonical-target-redirect`, `robots-txt-blocked`, `img-alt-missing` (full list in the docs)."},"category":{"type":"string","enum":["indexing","technical","meta","headings","content","links","images","social","structured-data","performance","mobile","international"]},"message":{"type":"string","description":"What was found, with the numbers."},"fix":{"type":"string","description":"How to fix it."}}}},"title":{"type":"object","properties":{"text":{"type":"string","nullable":true},"length":{"type":"integer"},"pixelWidth":{"type":"integer","description":"Estimated width in Google results (Arial 20 px). About 600 px fit."},"truncatedInSerp":{"type":"boolean"},"count":{"type":"integer"}}},"metaDescription":{"type":"object","properties":{"text":{"type":"string","nullable":true},"length":{"type":"integer"},"pixelWidth":{"type":"integer","description":"Estimated width in Google results (Arial 14 px). About 920 px fit."},"truncatedInSerp":{"type":"boolean"},"count":{"type":"integer"}}},"headings":{"type":"object","properties":{"h1":{"type":"array","items":{"type":"string"}},"counts":{"type":"object","properties":{"h1":{"type":"integer"},"h2":{"type":"integer"},"h3":{"type":"integer"},"h4":{"type":"integer"},"h5":{"type":"integer"},"h6":{"type":"integer"}}},"outline":{"type":"array","items":{"type":"object","properties":{"level":{"type":"integer"},"text":{"type":"string"}}}},"outlineTruncated":{"type":"boolean"}}},"canonical":{"type":"object","properties":{"url":{"type":"string","nullable":true},"selfReferencing":{"type":"boolean","nullable":true},"count":{"type":"integer"},"values":{"type":"array","items":{"type":"string"}},"fromHeader":{"type":"boolean"},"inBody":{"type":"boolean"},"target":{"type":"object","nullable":true,"description":"Status of the canonical URL when it points elsewhere (null when self-referencing or not checked).","properties":{"url":{"type":"string"},"status":{"type":"integer","nullable":true},"statusClass":{"type":"string"},"finalUrl":{"type":"string","nullable":true},"redirects":{"type":"integer"},"error":{"type":"string","nullable":true}}}}},"indexability":{"type":"object","properties":{"indexable":{"type":"boolean"},"metaRobots":{"type":"string","nullable":true},"googlebotMeta":{"type":"string","nullable":true},"xRobotsTag":{"type":"string","nullable":true},"directives":{"type":"object","properties":{"noindex":{"type":"boolean"},"nofollow":{"type":"boolean"},"noarchive":{"type":"boolean"},"nosnippet":{"type":"boolean"},"noimageindex":{"type":"boolean"},"maxSnippet":{"type":"integer","nullable":true},"maxImagePreview":{"type":"string","nullable":true},"unavailableAfter":{"type":"string","nullable":true}}},"robotsTxt":{"type":"object","nullable":true,"description":"robots.txt verdict for Googlebot (null with siteChecks=false).","properties":{"url":{"type":"string"},"status":{"type":"integer","nullable":true},"fetched":{"type":"boolean"},"allowed":{"type":"boolean","nullable":true,"description":"May Googlebot crawl this URL? null when robots.txt could not be read (e.g. it refused our servers)."},"rule":{"type":"string","nullable":true,"description":"The deciding rule, e.g. `Disallow: /private/`."},"matchedAgent":{"type":"string","nullable":true},"sitemaps":{"type":"array","items":{"type":"string"}},"note":{"type":"string","nullable":true}}}}},"sitemap":{"type":"object","nullable":true,"description":"Sitemap presence (the first sitemap listed in robots.txt, else /sitemap.xml). null with siteChecks=false.","properties":{"found":{"type":"boolean"},"url":{"type":"string","nullable":true},"source":{"type":"string","enum":["robots.txt","default"]},"status":{"type":"integer","nullable":true},"type":{"type":"string","nullable":true,"enum":["urlset","index"]},"urlCount":{"type":"integer","nullable":true},"listsThisPage":{"type":"boolean","nullable":true,"description":"true/false when the sitemap read answers it; null for sitemap indexes or when other sitemaps may list the page."},"note":{"type":"string","nullable":true}}},"hreflang":{"type":"object","properties":{"count":{"type":"integer"},"xDefault":{"type":"boolean"},"links":{"type":"array","items":{"type":"object","properties":{"lang":{"type":"string"},"href":{"type":"string"}}},"description":"Up to 50 hreflang alternates."}}},"social":{"type":"object","properties":{"openGraph":{"type":"object","properties":{"title":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"image":{"type":"string","nullable":true},"url":{"type":"string","nullable":true},"type":{"type":"string","nullable":true},"siteName":{"type":"string","nullable":true}}},"twitter":{"type":"object","properties":{"card":{"type":"string","nullable":true},"title":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"image":{"type":"string","nullable":true},"site":{"type":"string","nullable":true}}}}},"structuredData":{"type":"object","properties":{"status":{"type":"string","enum":["none","valid","warnings","errors"]},"formats":{"type":"array","items":{"type":"string"}},"types":{"type":"array","items":{"type":"string"}},"richResultsEligible":{"type":"array","items":{"type":"string"}},"errorCount":{"type":"integer"},"warningCount":{"type":"integer"},"items":{"type":"array","description":"Top-level structured data items (and nested ones with errors), checked against Google's required and recommended properties.","items":{"type":"object","properties":{"type":{"type":"string"},"format":{"type":"string","enum":["json-ld","microdata"]},"richResult":{"type":"string","nullable":true},"eligible":{"type":"boolean","nullable":true},"errors":{"type":"array","items":{"type":"string"}},"warnings":{"type":"array","items":{"type":"string"}},"notes":{"type":"array","items":{"type":"string"}}}}}}},"images":{"type":"object","properties":{"total":{"type":"integer"},"missingAlt":{"type":"integer"},"emptyAlt":{"type":"integer"},"missingDimensions":{"type":"integer"},"lazyLoaded":{"type":"integer"},"missingAltList":{"type":"array","items":{"type":"string"},"description":"Up to 20 image URLs without an alt attribute."}}},"links":{"type":"object","properties":{"total":{"type":"integer"},"internal":{"type":"integer"},"external":{"type":"integer"},"unique":{"type":"integer"},"nofollow":{"type":"integer"},"withoutText":{"type":"integer"},"checked":{"type":"object","nullable":true,"description":"Only with checkLinks > 0.","properties":{"requested":{"type":"integer"},"checked":{"type":"integer"},"skipped":{"type":"integer","description":"Not requested: private/local addresses, or the time budget ran out."},"broken":{"type":"integer"},"redirected":{"type":"integer"},"results":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"internal":{"type":"boolean"},"anchorText":{"type":"string"},"status":{"type":"integer","nullable":true},"statusClass":{"type":"string","enum":["ok","redirect","restricted","broken","server-error","error"],"description":"`restricted` = 401/403/429/999 (often bot protection; not counted as broken)."},"finalUrl":{"type":"string","nullable":true},"redirects":{"type":"integer"},"error":{"type":"string","nullable":true}}}}}},"list":{"type":"array","description":"Only with includeLinks=true: up to 500 links.","items":{"type":"object","properties":{"url":{"type":"string"},"text":{"type":"string"},"internal":{"type":"boolean"},"nofollow":{"type":"boolean"}}}}}},"content":{"type":"object","properties":{"wordCount":{"type":"integer"},"characters":{"type":"integer"},"textHtmlRatio":{"type":"number","nullable":true},"readingTimeMinutes":{"type":"integer"},"readability":{"type":"object","properties":{"sentences":{"type":"integer"},"avgWordsPerSentence":{"type":"number","nullable":true},"longSentencePercent":{"type":"number","nullable":true},"fleschReadingEase":{"type":"number","nullable":true},"level":{"type":"string","nullable":true,"enum":["easy","standard","fairly difficult","difficult","very difficult"],"description":"From the Flesch score (English only)."}},"description":"Computed on prose blocks (12+ words); Flesch Reading Ease for English only."},"language":{"type":"string","nullable":true},"wordsWithoutJavaScript":{"type":"integer","description":"Only when the browser version was audited: words in the plain HTML."}}},"mobile":{"type":"object","properties":{"viewport":{"type":"string","nullable":true},"responsive":{"type":"boolean"},"zoomDisabled":{"type":"boolean"}}},"performance":{"type":"object","properties":{"responseMs":{"type":"integer","nullable":true,"description":"Time to the response headers, redirects included (null for browser-only renders)."},"htmlBytes":{"type":"integer"},"transferBytes":{"type":"integer","nullable":true,"description":"Compressed size on the wire when the server sends Content-Length."},"compression":{"type":"string","nullable":true},"cacheControl":{"type":"string","nullable":true},"etag":{"type":"boolean"},"lastModified":{"type":"string","nullable":true},"scripts":{"type":"integer"},"inlineScripts":{"type":"integer"},"stylesheets":{"type":"integer"},"renderBlocking":{"type":"object","properties":{"scripts":{"type":"integer"},"stylesheets":{"type":"integer"}}},"images":{"type":"integer"},"iframes":{"type":"integer"},"hints":{"type":"array","items":{"type":"string"}}}},"technical":{"type":"object","properties":{"doctype":{"type":"boolean"},"charset":{"type":"string"},"charsetSource":{"type":"string","enum":["bom","header","meta","default","browser"]},"charsetDeclared":{"type":"string","nullable":true},"lang":{"type":"string","nullable":true},"favicon":{"type":"boolean"},"metaRefresh":{"type":"string","nullable":true},"headEndsEarlyAt":{"type":"string","nullable":true,"description":"The element that ends <head> early (tags after it are ignored by Google), else null."}}},"durationMs":{"type":"integer"},"renderedBecause":{"type":"string","enum":["blocked","javascript","requested"],"description":"Only when renderedWith=browser: why."},"fallbackReason":{"type":"string","description":"Why the browser was used (or why its result was not kept)."},"partial":{"type":"boolean","description":"true: a time or request budget cut a check short (robots.txt, sitemap, canonical target or link checks). Such answers are not cached."}}},"example":{"success":true,"url":"https://vercel.com/","finalUrl":"https://vercel.com/","statusCode":200,"redirects":0,"https":true,"renderedWith":"http","score":93,"grade":"A","summary":{"critical":0,"warnings":1,"notices":2,"total":3},"categoryScores":{"indexing":100,"technical":100,"meta":97,"headings":100,"content":100,"links":100,"images":100,"social":100,"structured-data":85,"performance":100,"mobile":97,"international":100},"issues":[{"severity":"warning","code":"structured-data-errors","category":"structured-data","message":"Structured data has 1 error(s): SoftwareApplication: missing required one of \"aggregateRating\", \"review\".","fix":"Fix the errors listed in structuredData.items: they stop the page from getting rich results."},{"severity":"notice","code":"description-short","category":"meta","message":"The meta description is short (45 characters).","fix":"Expand the meta description to 120-160 characters."},{"severity":"notice","code":"zoom-disabled","category":"mobile","message":"The viewport stops visitors from zooming.","fix":"Remove user-scalable=no and maximum-scale below 2 so that visitors can zoom."}],"title":{"text":"Agentic Infrastructure - Vercel","length":31,"pixelWidth":265,"truncatedInSerp":false,"count":1},"metaDescription":{"text":"The autonomous stack for every app and agent.","length":45,"pixelWidth":297,"truncatedInSerp":false,"count":1},"headings":{"h1":["Agentic Infrastructure"],"counts":{"h1":1,"h2":17,"h3":0,"h4":0,"h5":0,"h6":0},"outline":[{"level":1,"text":"Agentic Infrastructure"},{"level":2,"text":"Build agents on infrastructure that thinks like them"},{"level":2,"text":"Ship apps that scale from zero to millions instantly"},{"level":2,"text":"Host platforms that serve every customer"}],"outlineTruncated":false},"canonical":{"url":"https://vercel.com/","selfReferencing":true,"count":1,"values":["https://vercel.com"],"fromHeader":false,"inBody":false,"target":null},"indexability":{"indexable":true,"metaRobots":"index, max-image-preview:large","googlebotMeta":null,"xRobotsTag":null,"directives":{"noindex":false,"nofollow":false,"noarchive":false,"nosnippet":false,"noimageindex":false,"maxSnippet":null,"maxImagePreview":"large","unavailableAfter":null},"robotsTxt":{"url":"https://vercel.com/robots.txt","status":200,"fetched":true,"allowed":true,"rule":null,"matchedAgent":"*","sitemaps":["https://vercel.com/sitemap.xml"],"note":null}},"sitemap":{"found":true,"url":"https://vercel.com/sitemap.xml","source":"robots.txt","status":200,"type":"urlset","urlCount":8471,"listsThisPage":true,"note":null},"hreflang":{"count":0,"xDefault":false,"links":[]},"social":{"openGraph":{"title":"Agentic Infrastructure - Vercel","description":"The autonomous stack for every app and agent.","image":"https://lishhsx6kmthaacj.public.blob.vercel-storage.com/og-home-not-x.png","url":"https://vercel.com","type":"website","siteName":"Vercel"},"twitter":{"card":"summary_large_image","title":"Agentic Infrastructure - Vercel","description":"The autonomous stack for every app and agent.","image":"https://lishhsx6kmthaacj.public.blob.vercel-storage.com/og-home-x.png","site":null}},"structuredData":{"status":"errors","formats":["json-ld"],"types":["Organization","Service","SoftwareApplication"],"richResultsEligible":["Organization (logo, knowledge panel)"],"errorCount":1,"warningCount":0,"items":[{"type":"Organization","format":"json-ld","richResult":"Organization (logo, knowledge panel)","eligible":true,"errors":[],"warnings":[]},{"type":"Service","format":"json-ld","richResult":null,"eligible":null,"errors":[],"warnings":[]},{"type":"SoftwareApplication","format":"json-ld","richResult":"Software app","eligible":false,"errors":["$[2]: SoftwareApplication: missing required one of \"aggregateRating\", \"review\""],"warnings":[]}]},"images":{"total":19,"missingAlt":0,"emptyAlt":3,"missingDimensions":0,"lazyLoaded":12,"missingAltList":[]},"links":{"total":167,"internal":149,"external":18,"unique":90,"nofollow":0,"withoutText":0,"checked":null},"content":{"wordCount":616,"characters":4241,"textHtmlRatio":0.7,"readingTimeMinutes":3,"readability":{"sentences":10,"avgWordsPerSentence":15.3,"longSentencePercent":0,"fleschReadingEase":55.3,"level":"fairly difficult"},"language":"en"},"mobile":{"viewport":"width=device-width, initial-scale=1, maximum-scale=1","responsive":true,"zoomDisabled":true},"performance":{"responseMs":59,"htmlBytes":626089,"transferBytes":null,"compression":"br","cacheControl":"public, max-age=0, must-revalidate","etag":true,"lastModified":null,"scripts":44,"inlineScripts":20,"stylesheets":3,"renderBlocking":{"scripts":1,"stylesheets":3},"images":19,"iframes":0,"hints":["Add defer or async to 1 script(s) in <head>."]},"technical":{"doctype":true,"charset":"utf-8","charsetSource":"header","charsetDeclared":"utf-8","lang":"en","favicon":true,"metaRefresh":null,"headEndsEarlyAt":null},"durationMs":257}}}},"400":{"description":"Invalid parameter (`invalid_request`) or a private/local target (`url_not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"error":{"code":"url_not_allowed","message":"private, local and reserved hosts are not allowed"}}}}},"413":{"description":"Request body or target document too large (`too_large`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The page does not exist (`target_error`, HTTP 404/410), the site refused even a real browser (`target_blocked`), could not be reached or its domain does not resolve (`target_unreachable`), or the URL is not an HTML page (`unsupported_content`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"error":{"code":"target_error","message":"The page does not exist (HTTP 404).","details":{"targetStatus":404,"finalUrl":"https://example.com/this-page-does-not-exist"}}}}}},"502":{"description":"Temporary failure on our side (`upstream_error`); safe to retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The target did not respond in time (`timeout`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"Error":{"type":"object","required":["success","error"],"properties":{"success":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_configured","unauthorized","not_found","method_not_allowed","invalid_request","rate_limited","url_not_allowed","target_blocked","target_unreachable","target_error","unsupported_content","too_large","timeout","upstream_error","board_not_found","app_not_found"]},"message":{"type":"string"},"retryable":{"type":"boolean","description":"true for rate_limited, timeout, upstream_error and browser_busy; false for other errors."},"retryAfterSeconds":{"type":"integer","description":"Seconds to wait before retrying, when a numeric Retry-After header is present."},"details":{"type":"object","additionalProperties":true}}}}}}}}