SFOLN

Catalogue / SEO & search

SEO Audit API – On-Page Checks for Any URL

sfoln/onpage-seo-audit · SEO tools, Lead generation, Developer tools On request

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.

About

What it does

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.

Price

Price per delivered record

EventPricePer 1,000Charged for
Page audit
onpage-page-audit
$0.004$4 / 1,000Charged once per page audited.
JavaScript render
onpage-javascript-render
$0.006$6 / 1,000Charged once per audited page when "Render JavaScript" is enabled.

Apify free plan: up to 10 items per run. Paid plans have no per-run cap; set maxTotalChargeUsd to cap spend.

Run

Call it from code, an agent or the Console

This API is private on Apify for now. Email us and we will publish it for you, usually within two working days. The calls below work once it is public. contact@sfoln.com

curl · synchronous run, rows in the response
curl -X POST "https://api.apify.com/v2/actors/sfoln~onpage-seo-audit/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"urls":["https://dataforseo.com/"]}'
mcp.json · hosted Apify MCP server
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/onpage-seo-audit"
    }
  }
}
asynchronous run · for large batches
POST https://api.apify.com/v2/actors/sfoln~onpage-seo-audit/runs?maxTotalChargeUsd=1
GET  https://api.apify.com/v2/actor-runs/{runId}            # until status is SUCCEEDED
GET  https://api.apify.com/v2/datasets/{defaultDatasetId}/items?format=json

Authenticate with an Apify API token. MCP clients can instead sign in with OAuth when prompted. Example prompt for an agent: 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.

Input

Input fields

Enter page URLs. Each URL is fetched live and audited (about 5–60 seconds per page).

FieldTypeDefaultMeaning
urls *arrayrequiredPage URLs
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.
enableJavascriptbooleanfalseRender JavaScript
Execute JavaScript before auditing (for client-rendered sites). Adds the onpage-javascript-render event per page. Not available on the Apify free plan.
checkSpellbooleanfalseCheck spelling
Run a Hunspell spell check and return misspelled words (no extra charge).
acceptLanguagestring"en-US,en;q=0.9"Accept-Language header
Sent with the page request; some sites refuse requests without it.
maxUrlsinteger1000Max URLs
Safety cap on how many URLs are processed in this run. Range 1–10000.
concurrencyinteger3Concurrency
How many pages are processed in parallel. Range 1–6.
includeRawbooleanfalseInclude raw upstream response
Attach the unmodified DataForSEO item to each result record.
Example input
{
  "urls": [
    "https://dataforseo.com/"
  ]
}

Output

One record per input item

Records land in the run's dataset; a synchronous call returns them directly. Each has a status (ok is charged; everything else is free) and a charged flag. The run's OUTPUT record totals items and charges.

FieldTypeMeaning
urlstringURL
Audited URL. e.g. "https://dataforseo.com/"
inputUrlstringInput URL
The URL as given in the input (ok records).
statusCodeinteger | nullHTTP status
Status code returned by the page. e.g. 200
resourceTypestring | nullResource type
html | broken | redirect.
redirectLocationstring | nullRedirect location
Target of a redirect (resourceType redirect).
fetchTimestring | nullFetch time
When the page was fetched.
titlestring | nullTitle
<title> text.
titleLengthinteger | nullTitle length
Characters.
descriptionstring | nullMeta description
Meta description text.
descriptionLengthinteger | nullDescription length
Characters.
h1arrayH1
All H1 headings.
h2CountintegerH2 count
Number of H2 headings.
canonicalstring | nullCanonical
Canonical URL.
metaFollowboolean | nullFollow
False when the page tells crawlers not to follow its links (meta robots nofollow).
wordCountinteger | nullWord count
Words of visible text.
contentRatenumber | nullText-to-HTML ratio
Plain-text share of the HTML.
readabilityFleschKincaidnumber | nullReadability (Flesch-Kincaid)
Flesch–Kincaid readability index.
internalLinksinteger | nullInternal links
Links to the same domain.
externalLinksinteger | nullExternal links
Links to other domains.
imagesinteger | nullImages
Images on the page.
hasImagesWithoutAltboolean | nullImages without alt
True when at least one image has no alt text.
scriptsinteger | nullScripts
Script files on the page.
stylesheetsinteger | nullStylesheets
Stylesheet files on the page.
renderBlockingResourcesinteger | nullRender-blocking resources
Render-blocking scripts plus stylesheets.
pageSizeinteger | nullPage size (bytes)
HTML size in bytes.
domSizeinteger | nullDOM size (bytes)
Total DOM size in bytes.
loadTimenumber | nullLoad time (ms)
Time to interactive (falls back to DOM complete).
largestContentfulPaintnumber | nullLCP (ms)
Largest Contentful Paint (needs JavaScript rendering).
cumulativeLayoutShiftnumber | nullCLS
Cumulative Layout Shift score.
hasMicromarkupboolean | nullStructured data
True when the page has schema.org / microdata markup.
hasOpenGraphbooleanOpen Graph
True when og: tags are present.
brokenLinksboolean | nullBroken links
True when the page links to broken pages.
brokenResourcesboolean | nullBroken resources
True when the page loads broken resources (images, scripts, stylesheets).
onpageScorenumber | nullOn-page score
DataForSEO on-page score 0–100. e.g. 92.5
failedChecksarrayFailed checks
Names of the SEO checks this page fails (e.g. no_h1_tag, title_too_long).
failedChecksCountintegerFailed checks count
Number of failed checks.
passedChecksCountintegerPassed checks count
Number of passed checks.
misspelledWordsarrayMisspelled words
Only with checkSpell.
serverstring | nullServer
Server software reported by the page response.
mediaTypestring | nullMedia type
Content type of the page (e.g. text/html).
contentEncodingstring | nullContent encoding
Compression of the response (e.g. gzip, br).
javascriptRenderedbooleanJavaScript rendered
Whether JavaScript rendering was requested.
javascriptChargedbooleanJavaScript charged
Whether onpage-javascript-render was charged.
inputstring | object | nullInput
URL as entered.
statusstringStatus
ok | not_found | error | skipped_invalid | skipped_budget | skipped_free_plan e.g. "ok"
chargedbooleanCharged
Whether this record incurred a pay-per-event charge.
chargedEventstringCharged event
onpage-page-audit.
warningsarrayWarnings
Non-fatal notes (limit reduced, budget reached...).
errorobjectError
{code, message, provider?} when status is not ok.
sourcestringSource
Upstream data source.
fetchedAtstringFetched at
ISO timestamp.
Example record
{
  "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"
}

Machine-readable

This page for agents