{"name":"onpage-seo-audit","id":"sfoln/onpage-seo-audit","title":"SEO Audit API – On-Page Checks for Any URL","description":"Audit the on-page SEO of any URL: title and meta description lengths, H1s, canonical, word count, links, images missing alt text, load time, page size, on-page score and the list of failed checks, one JSON record per page. $4 per 1,000 pages; JavaScript rendering is optional.","version":"0.1","status":"ready","family":{"id":"seo-search","name":"SEO & search","description":"Google search, news and Scholar results, keyword volumes and difficulty, backlinks, ranked keywords, competitor domains and on-page audits.","actors":13},"categories":["SEO_TOOLS","LEAD_GENERATION","DEVELOPER_TOOLS"],"availability":"on_request","seoTitle":"On-Page SEO Audit API – $4 per 1,000 pages","seoDescription":"SEO audit API for any URL: title, meta description, H1, canonical, links, alt text, load time and failed on-page checks as JSON. $4 per 1,000 pages.","summary":"SEO Audit API – On-Page Checks for Any URL runs a technical on-page SEO audit of any web page with one API call per URL. Each page is fetched live and checked for title and meta description (with lengths), H1 headings, canonical, word count, internal and external links, images and missing alt text, page size, load time, structured data and Open Graph. You also get DataForSEO's on-page score and the list of SEO checks the page fails (e.g. no_h1_tag, title_too_long, low_content_rate). Use it for SEO audits, pre-launch QA, client reports and monitoring, or as a tool for AI agents. Turn on JavaScript rendering for client-rendered sites.","pricing":{"model":"pay-per-event","currency":"USD","billedBy":"Apify","freePlanMaxItemsPerRun":10,"events":[{"name":"onpage-page-audit","title":"Page audit","description":"Charged once per page audited.","priceUsd":0.004},{"name":"onpage-javascript-render","title":"JavaScript render","description":"Charged once per audited page when \"Render JavaScript\" is enabled.","priceUsd":0.006}]},"input":{"description":"Enter page URLs. Each URL is fetched live and audited (about 5–60 seconds per page).","required":["urls"],"fields":[{"name":"urls","title":"Page URLs","type":"array","required":true,"description":"Page URLs to audit, one per line (https:// is added when missing). Accounts on the Apify free plan can process up to 10 pages per run.","prefill":["https://dataforseo.com/"],"editor":"stringList"},{"name":"enableJavascript","title":"Render JavaScript","type":"boolean","required":false,"description":"Execute JavaScript before auditing (for client-rendered sites). Adds the onpage-javascript-render event per page. Not available on the Apify free plan.","default":false},{"name":"checkSpell","title":"Check spelling","type":"boolean","required":false,"description":"Run a Hunspell spell check and return misspelled words (no extra charge).","default":false},{"name":"acceptLanguage","title":"Accept-Language header","type":"string","required":false,"description":"Sent with the page request; some sites refuse requests without it.","default":"en-US,en;q=0.9","editor":"textfield"},{"name":"maxUrls","title":"Max URLs","type":"integer","required":false,"description":"Safety cap on how many URLs are processed in this run.","default":1000,"minimum":1,"maximum":10000},{"name":"concurrency","title":"Concurrency","type":"integer","required":false,"description":"How many pages are processed in parallel.","default":3,"minimum":1,"maximum":6},{"name":"includeRaw","title":"Include raw upstream response","type":"boolean","required":false,"description":"Attach the unmodified DataForSEO item to each result record.","default":false}]},"exampleInput":{"urls":["https://dataforseo.com/"]},"outputFields":[{"name":"url","type":"string","title":"URL","description":"Audited URL.","example":"https://dataforseo.com/"},{"name":"inputUrl","type":"string","title":"Input URL","description":"The URL as given in the input (ok records)."},{"name":"statusCode","type":"integer | null","title":"HTTP status","description":"Status code returned by the page.","example":200},{"name":"resourceType","type":"string | null","title":"Resource type","description":"html | broken | redirect."},{"name":"redirectLocation","type":"string | null","title":"Redirect location","description":"Target of a redirect (resourceType redirect)."},{"name":"fetchTime","type":"string | null","title":"Fetch time","description":"When the page was fetched."},{"name":"title","type":"string | null","title":"Title","description":"<title> text."},{"name":"titleLength","type":"integer | null","title":"Title length","description":"Characters."},{"name":"description","type":"string | null","title":"Meta description","description":"Meta description text."},{"name":"descriptionLength","type":"integer | null","title":"Description length","description":"Characters."},{"name":"h1","type":"array","title":"H1","description":"All H1 headings."},{"name":"h2Count","type":"integer","title":"H2 count","description":"Number of H2 headings."},{"name":"canonical","type":"string | null","title":"Canonical","description":"Canonical URL."},{"name":"metaFollow","type":"boolean | null","title":"Follow","description":"False when the page tells crawlers not to follow its links (meta robots nofollow)."},{"name":"wordCount","type":"integer | null","title":"Word count","description":"Words of visible text."},{"name":"contentRate","type":"number | null","title":"Text-to-HTML ratio","description":"Plain-text share of the HTML."},{"name":"readabilityFleschKincaid","type":"number | null","title":"Readability (Flesch-Kincaid)","description":"Flesch–Kincaid readability index."},{"name":"internalLinks","type":"integer | null","title":"Internal links","description":"Links to the same domain."},{"name":"externalLinks","type":"integer | null","title":"External links","description":"Links to other domains."},{"name":"images","type":"integer | null","title":"Images","description":"Images on the page."},{"name":"hasImagesWithoutAlt","type":"boolean | null","title":"Images without alt","description":"True when at least one image has no alt text."},{"name":"scripts","type":"integer | null","title":"Scripts","description":"Script files on the page."},{"name":"stylesheets","type":"integer | null","title":"Stylesheets","description":"Stylesheet files on the page."},{"name":"renderBlockingResources","type":"integer | null","title":"Render-blocking resources","description":"Render-blocking scripts plus stylesheets."},{"name":"pageSize","type":"integer | null","title":"Page size (bytes)","description":"HTML size in bytes."},{"name":"domSize","type":"integer | null","title":"DOM size (bytes)","description":"Total DOM size in bytes."},{"name":"loadTime","type":"number | null","title":"Load time (ms)","description":"Time to interactive (falls back to DOM complete)."},{"name":"largestContentfulPaint","type":"number | null","title":"LCP (ms)","description":"Largest Contentful Paint (needs JavaScript rendering)."},{"name":"cumulativeLayoutShift","type":"number | null","title":"CLS","description":"Cumulative Layout Shift score."},{"name":"hasMicromarkup","type":"boolean | null","title":"Structured data","description":"True when the page has schema.org / microdata markup."},{"name":"hasOpenGraph","type":"boolean","title":"Open Graph","description":"True when og: tags are present."},{"name":"brokenLinks","type":"boolean | null","title":"Broken links","description":"True when the page links to broken pages."},{"name":"brokenResources","type":"boolean | null","title":"Broken resources","description":"True when the page loads broken resources (images, scripts, stylesheets)."},{"name":"onpageScore","type":"number | null","title":"On-page score","description":"DataForSEO on-page score 0–100.","example":92.5},{"name":"failedChecks","type":"array","title":"Failed checks","description":"Names of the SEO checks this page fails (e.g. no_h1_tag, title_too_long)."},{"name":"failedChecksCount","type":"integer","title":"Failed checks count","description":"Number of failed checks."},{"name":"passedChecksCount","type":"integer","title":"Passed checks count","description":"Number of passed checks."},{"name":"misspelledWords","type":"array","title":"Misspelled words","description":"Only with checkSpell."},{"name":"server","type":"string | null","title":"Server","description":"Server software reported by the page response."},{"name":"mediaType","type":"string | null","title":"Media type","description":"Content type of the page (e.g. text/html)."},{"name":"contentEncoding","type":"string | null","title":"Content encoding","description":"Compression of the response (e.g. gzip, br)."},{"name":"javascriptRendered","type":"boolean","title":"JavaScript rendered","description":"Whether JavaScript rendering was requested."},{"name":"javascriptCharged","type":"boolean","title":"JavaScript charged","description":"Whether onpage-javascript-render was charged."},{"name":"input","type":"string | object | null","title":"Input","description":"URL as entered."},{"name":"status","type":"string","title":"Status","description":"ok | not_found | error | skipped_invalid | skipped_budget | skipped_free_plan","example":"ok"},{"name":"charged","type":"boolean","title":"Charged","description":"Whether this record incurred a pay-per-event charge."},{"name":"chargedEvent","type":"string","title":"Charged event","description":"onpage-page-audit."},{"name":"warnings","type":"array","title":"Warnings","description":"Non-fatal notes (limit reduced, budget reached...)."},{"name":"error","type":"object","title":"Error","description":"{code, message, provider?} when status is not ok."},{"name":"source","type":"string","title":"Source","description":"Upstream data source."},{"name":"fetchedAt","type":"string","title":"Fetched at","description":"ISO timestamp."}],"outputExample":{"url":"https://dataforseo.com/","statusCode":200,"resourceType":"html","fetchTime":"2026-10-14 10:00:00 +00:00","title":"DataForSEO","titleLength":10,"description":"APIs for SEO","descriptionLength":12,"h1":["Powerful API Stack"],"h2Count":1,"canonical":"https://dataforseo.com/","metaFollow":true,"wordCount":1300,"internalLinks":150,"externalLinks":12,"images":30,"hasImagesWithoutAlt":true,"pageSize":220000,"loadTime":640,"hasMicromarkup":true,"hasOpenGraph":true,"onpageScore":91.4,"failedChecks":["no_image_alt","title_too_short"],"failedChecksCount":2,"javascriptRendered":false,"javascriptCharged":false,"input":"https://dataforseo.com/","status":"ok","charged":true,"chargedEvent":"onpage-page-audit","source":"dataforseo","fetchedAt":"2026-10-14T10:00:00.000Z"},"faq":[],"mcpExamplePrompt":"Run an on-page SEO audit of https://apify.com/ and list the failed checks, the title and meta description lengths and the page load time.","related":["domain-seo-overview","seo-competitor-snapshot","url-metadata","domain-intelligence","ranked-keywords"],"urls":{"site":"https://www.sfoln.com/actors/onpage-seo-audit/","siteJson":"https://www.sfoln.com/actors/onpage-seo-audit.json","siteMarkdown":"https://www.sfoln.com/actors/onpage-seo-audit.md","runSync":"https://api.apify.com/v2/actors/sfoln~onpage-seo-audit/run-sync-get-dataset-items","runAsync":"https://api.apify.com/v2/actors/sfoln~onpage-seo-audit/runs","mcp":"https://mcp.apify.com?tools=sfoln/onpage-seo-audit","requestAccess":"mailto:contact@sfoln.com?subject=Access%20request%3A%20SEO%20Audit%20API%20%E2%80%93%20On-Page%20Checks%20for%20Any%20URL%20(sfoln%2Fonpage-seo-audit)&body=Please%20publish%20onpage-seo-audit.%20What%20we%20plan%20to%20use%20it%20for%3A"},"publisher":{"name":"SFOLN LLC","apifyUsername":"sfoln","url":"https://www.sfoln.com","apifyProfile":"https://apify.com/sfoln","email":"contact@sfoln.com"},"generatedAt":"2026-10-22T04:28:58.477Z"}