SFOLN

Catalogue / SEO & search

Website Audit – SEO, Security, SSL & DNS

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

Audit any website in one JSON record: SEO tags, security headers grade, SSL certificate, SPF/DMARC e-mail setup, tech stack, speed signals, robots.txt and sitemap, broken links and domain age, with 0–100 scores and a prioritised issue list. $8 per 1,000 websites.

About

What it does

Audit any website and get one JSON record with 0–100 scores and a prioritised list of issues across eight areas: SEO tags (title and description lengths, H1, canonical, robots meta, Open Graph and Twitter cards, hreflang, structured data), security headers with an A–F grade (HSTS, CSP, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy, cookie flags, mixed content), the SSL certificate (issuer, days left), DNS and e-mail setup (SPF, DMARC, MX, CAA, DNSSEC, MTA-STS, BIMI), domain age (RDAP), the tech stack, speed signals (time to first byte, HTML size, compression, request count) and crawlability (robots.txt, sitemap, broken links on the page). Built for agencies prospecting with audits, web developers, IT and security hygiene checks, due diligence and AI agents.

Price

Price per delivered record

EventPricePer 1,000Charged for
Website audit
site-audit
$0.008$8 / 1,000Charged once per audited website: SEO, security headers, SSL certificate, e-mail DNS, registration, performance, crawl files, link check and tech stack with scores and issues.
Website safety check
safety-check
paid plans only
$0.002$2 / 1,000Paid add-on (includeSafetyCheck): the audited page looked up in Google Web Risk (malware, social engineering, unwanted software). Paid Apify plans only.

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~website-audit/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"urls":["apify.com"],"maxLinksToCheck":10}'
mcp.json · hosted Apify MCP server
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/website-audit"
    }
  }
}
asynchronous run · for large batches
POST https://api.apify.com/v2/actors/sfoln~website-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: Audit apify.com: give me its SEO, security and performance scores and the five most important issues to fix.

Input

Input fields

Enter websites (domains or page URLs). Each website produces one audit record with scores and issues.

FieldTypeDefaultMeaning
urls *arrayrequiredWebsites
Domains (apify.com) or page URLs (https://www.apify.com/pricing), one per line. A domain is audited from its homepage (https://, falling back to http://). Duplicates are removed. Accounts on the Apify free plan can process up to 10 websites per run.
maxLinksToCheckinteger50Links to check per website
How many links of the audited page are checked for errors (internal links first; 0 turns the check off). Free plan: at most 20. Range 0–200.
includeSafetyCheckbooleanfalseGoogle Web Risk safety check
Also look the page up in Google Web Risk (malware, phishing, unwanted software). Paid add-on: $0.002 per website (safety-check), paid Apify plans only.
maxItemsinteger1000Max websites
Safety cap on how many websites are processed in this run. Range 1–10000.
concurrencyinteger3Concurrency
How many websites are audited in parallel (1–10). Each one makes a few requests at a time to its own site. Range 1–10.
includeRawbooleanfalseInclude raw response data
Attach the page's response headers and redirect chain under raw.
Example input
{
  "urls": [
    "apify.com"
  ],
  "maxLinksToCheck": 10
}

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
inputstring | objectInput
The website as submitted.
statusstringStatus
ok | not_found | error | skipped_invalid | skipped_budget | skipped_free_plan | skipped_unmetered e.g. "ok"
chargedbooleanCharged
Whether this record incurred a pay-per-event charge.
chargedEventstringCharged event
Pay-per-event event charged for this record (present only when charged; the safety-check add-on is charged separately).
chargedCountintegerEvents charged
Events actually charged when the charge came back short of the requested count (present only then; a warning explains it).
sourcestringSource
website+dns+rdap+tls: the site's own pages, public DNS, RDAP and a TLS handshake.
fetchedAtstringFetched at
ISO timestamp.
errorobjectError
{ code, message, provider?, status? } when status is not ok. Codes: site_blocked (401/403/429/503), page_not_found (404/410), http_error, domain_not_found, invalid_url, network, timeout, tls_error, unexpected_type, too_many_redirects; runtime codes: budget_exhausted, free_plan_limit, unmetered, aborted, charge_failed, record_too_large, invalid_record, dataset_push_failed.
warningsarrayWarnings
Sections that failed, a link check stopped at its time limit, the free-plan link cap, the safety add-on skipped or failed.
domainstring | nullDomain
Registrable domain of the website. e.g. "apify.com"
urlstring | nullURL
Final URL of the audited page (after redirects).
httpStatusintegerHTTP status
scoreinteger | nullScore
Overall score 0–100 (weighted: SEO 30%, security 30%, performance 25%, e-mail 15%).
gradestring | nullGrade
A ≥ 90, B ≥ 75, C ≥ 60, D ≥ 45, E ≥ 25, F below.
scoresobjectScores
{ overall, seo, security, email, performance }: 0–100 each, null when the area could not be assessed.
issueCountsobjectIssue counts
{ high, medium, low }
issuesarrayIssues
[{ severity: high | medium | low, area: seo | security | email | performance, code, message, points }] sorted by severity, then points.
seoobjectSEO
title, titleLength, metaDescription, metaDescriptionLength, canonical, canonicalIsSelf, robotsMeta, xRobotsTag, indexable, lang, hasViewport, charset, h1Count, h1, h2Count, openGraph{}, twitterCard{}, hreflang[], structuredData{ jsonLdBlocks, invalidJsonLdBlocks, types[], microdataTypes[] }, images, imagesMissingAlt, wordCount, favicon, robotsTxt{}, sitemap{}.
securityobjectSecurity
https, httpRedirectsToHttps, headersGrade (A–F), headersScore, headers{ hsts{}, csp{}, xFrameOptions, xContentTypeOptions, referrerPolicy, permissionsPolicy, present[], missing[] }, cookies[{ name, secure, httpOnly, sameSite }], mixedContent{ active[], passive[] }, server, poweredBy.
tlsobject | nullSSL/TLS certificate
issuer, issuerOrganization, validFrom, validTo, daysLeft, expired, trusted, trustError, coversHost, protocol, sanCount.
dnsobject | nullDNS and e-mail
domain, mx[], mailProvider, spf{ record, allQualifier, includes[], multipleRecords }, dmarc{ record, policy, subdomainPolicy, pct, rua[] }, mtaSts, bimi, caa[{ flags, tag, value }], dnssec, nameservers[].
registrationobject | nullRegistration (RDAP)
registrar, createdAt, expiresAt, ageDays, daysUntilExpiry, dnssec.
performanceobjectPerformance
ttfbMs, totalMs, htmlKb, compressed, compression, redirects, requestEstimate, scripts, inlineScripts, stylesheets, images, iframes, renderBlockingScripts, cacheControl.
linksobject | nullLinks
found, internal, external, checked, ok, redirected, brokenCount, broken[{ url, internal, status, error }], unverifiable, notChecked, stoppedEarly; null when maxLinksToCheck is 0.
crawlobjectCrawl files
robotsTxt{ found, url, disallowsAll, crawlDelay, sitemaps[] }, sitemap{ found, url, source, type, urlCount, truncated }, securityTxt{ found, contact[], expires, expired }.
techobjectTech stack
technologyCount, technologyNames[], byCategory{}, cms, ecommercePlatform, analytics[], tagManagers[], advertising[], marketingAutomation[], crm[], liveChat[], paymentProcessors[], emailProvider, emailSenders[], hosting[], cdn[], webServer, javascriptFrameworks[], programmingLanguages[], saasVerifiedByDns[], technologies[{ name, slug, categories[], version, confidence, evidence[], website }].
safetyobject | nullSafety (Web Risk)
{ checked, url, isSafe, threatTypes[] } with the includeSafetyCheck add-on; null otherwise.
sectionsobjectSection status
page, tls, dns, registration, links, safety: ok | not_found | error | skipped.
rawobjectRaw
With includeRaw: { headers, redirects[], httpProbe }.
Example record
Example record
{
  "input": "apify.com",
  "domain": "apify.com",
  "url": "https://apify.com/",
  "httpStatus": 200,
  "score": 94,
  "grade": "A",
  "scores": {
    "overall": 94,
    "seo": 100,
    "security": 95,
    "email": 100,
    "performance": 84
  },
  "issueCounts": {
    "high": 0,
    "medium": 0,
    "low": 5
  },
  "issues": [
    {
      "severity": "low",
      "area": "performance",
      "code": "many_requests",
      "message": "The page references about 147 files (scripts, stylesheets, images, frames).",
      "points": 7
    },
    {
      "severity": "low",
      "area": "performance",
      "code": "html_large",
      "message": "The HTML document is 522.4 KB; under 400 KB keeps the first render fast.",
      "points": 5
    },
    {
      "severity": "low",
      "area": "performance",
      "code": "render_blocking_scripts",
      "message": "1 script(s) in <head> load without async or defer and block the first render.",
      "points": 4
    },
    {
      "severity": "low",
      "area": "security",
      "code": "referrer_policy_missing",
      "message": "No Referrer-Policy header.",
      "points": 3
    },
    {
      "severity": "low",
      "area": "security",
      "code": "csp_unsafe_eval",
      "message": "The Content-Security-Policy allows 'unsafe-eval'.",
      "points": 2
    }
  ],
  "seo": {
    "title": "Apify: Marketplace of ready-to-run tools for AI",
    "titleLength": 47,
    "metaDescription": "Thousands of tools to automate your business. Get real-time web data, track competitors, generate leads, and integrate your apps and AI agents.",
    "metaDescriptionLength": 143,
    "canonical": "https://apify.com/",
    "canonicalIsSelf": true,
    "robotsMeta": "index,follow",
    "xRobotsTag": null,
    "indexable": true,
    "lang": "en",
    "hasViewport": true,
    "charset": "utf-8",
    "h1Count": 1,
    "h1": "87,717 tools for your AI",
    "h2Count": 11,
    "openGraph": {
      "title": "Apify: Marketplace of ready-to-run tools for AI",
      "description": "Thousands of tools to automate your business.",
      "image": "https://apify.com/og-image",
      "type": "website",
      "url": "https://apify.com",
      "siteName": "Apify"
    },
    "twitterCard": {
      "card": "summary_large_image",
      "title": "Apify: Marketplace of ready-to-run tools for AI",
      "description": "Thousands of tools to automate your business.",
      "image": "https://apify.com/og-image",
      "site": null
    },
    "hreflang": [],
    "structuredData": {
      "jsonLdBlocks": 3,
      "invalidJsonLdBlocks": 0,
      "types": [
        "Organization",
        "WebSite",
        "SoftwareApplication"
      ],
      "microdataTypes": []
    },
    "images": 78,
    "imagesMissingAlt": 0,
    "wordCount": 1577,
    "favicon": "https://apify.com/favicon.ico",
    "robotsTxt": {
      "found": true,
      "disallowsAll": false,
      "sitemaps": 1
    },
    "sitemap": {
      "found": true,
      "url": "https://apify.com/sitemap.xml",
      "type": "sitemapindex",
      "urlCount": 17
    }
  },
  "security": {
    "https": true,
    "httpRedirectsToHttps": true,
    "headersGrade": "B",
    "headersScore": 85,
    "headers": {
      "hsts": {
        "present": true,
        "maxAgeSecs": 15768000,
        "includeSubDomains": false,
        "preload": false
      },
      "csp": {
        "present": true,
        "reportOnly": false,
        "unsafeInline": false,
        "unsafeEval": true,
        "frameAncestors": true
      },
      "xFrameOptions": "SAMEORIGIN",
      "xContentTypeOptions": "nosniff",
      "referrerPolicy": null,
      "permissionsPolicy": true,
      "present": [
        "Strict-Transport-Security",
        "Content-Security-Policy",
        "X-Frame-Options",
        "X-Content-Type-Options",
        "Permissions-Policy"
      ],
      "missing": [
        "Referrer-Policy"
      ]
    },
    "cookies": [],
    "mixedContent": {
      "active": [],
      "passive": []
    },
    "server": null,
    "poweredBy": null
  },
  "tls": {
    "issuer": "Amazon RSA 2048 M03",
    "issuerOrganization": "Amazon",
    "validFrom": "2026-04-20T00:00:00.000Z",
    "validTo": "2027-05-19T23:59:59.000Z",
    "daysLeft": 217,
    "expired": false,
    "trusted": true,
    "trustError": null,
    "coversHost": true,
    "protocol": "TLSv1.3",
    "sanCount": 2
  },
  "dns": {
    "domain": "apify.com",
    "mx": [
      "aspmx.l.google.com",
      "alt1.aspmx.l.google.com"
    ],
    "mailProvider": "google",
    "spf": {
      "record": "v=spf1 a mx include:_spf.google.com include:mailgun.org -all",
      "multipleRecords": false,
      "allQualifier": "-all",
      "includes": [
        "_spf.google.com",
        "mailgun.org"
      ]
    },
    "dmarc": {
      "record": "v=DMARC1; p=reject; sp=reject; pct=100; rua=mailto:dmarc-reports@apify.com",
      "policy": "reject",
      "subdomainPolicy": "reject",
      "pct": 100,
      "rua": [
        "mailto:dmarc-reports@apify.com"
      ]
    },
    "mtaSts": true,
    "bimi": true,
    "caa": [
      {
        "flags": 0,
        "tag": "issue",
        "value": "letsencrypt.org"
      }
    ],
    "dnssec": true,
    "nameservers": [
      "ns-449.awsdns-56.com",
      "ns-839.awsdns-40.net"
    ]
  },
  "registration": {
    "registrar": "Amazon Registrar, Inc.",
    "createdAt": "2009-06-02T17:14:10Z",
    "expiresAt": "2035-06-02T17:14:10Z",
    "ageDays": 6343,
    "daysUntilExpiry": 3152,
    "dnssec": true
  },
  "performance": {
    "ttfbMs": 367,
    "totalMs": 406,
    "htmlKb": 522.4,
    "compressed": true,
    "compression": "gzip",
    "redirects": 0,
    "requestEstimate": 147,
    "scripts": 50,
    "inlineScripts": 2,
    "stylesheets": 3,
    "images": 78,
    "iframes": 1,
    "renderBlockingScripts": 1,
    "cacheControl": "private, no-cache, no-store, max-age=0, must-revalidate"
  },
  "links": {
    "found": 89,
    "internal": 73,
    "external": 16,
    "checked": 50,
    "ok": 50,
    "redirected": 0,
    "brokenCount": 0,
    "broken": [],
    "unverifiable": 0,
    "notChecked": 39,
    "stoppedEarly": false
  },
  "crawl": {
    "robotsTxt": {
      "found": true,
      "url": "https://apify.com/robots.txt",
      "disallowsAll": false,
      "crawlDelay": null,
      "sitemaps": [
        "https://apify.com/sitemap.xml"
      ]
    },
    "sitemap": {
      "found": true,
      "url": "https://apify.com/sitemap.xml",
      "source": "robots.txt",
      "type": "sitemapindex",
      "urlCount": 17,
      "truncated": false
    },
    "securityTxt": {
      "found": true,
      "contact": [
        "mailto:security@apify.com"
      ],
      "expires": "2035-01-01T00:00:00.000Z",
      "expired": false
    }
  },
  "tech": {
    "technologyCount": 20,
    "technologyNames": [
      "Algolia",
      "Node.js",
      "Amazon Web Services",
      "Next.js",
      "React",
      "Amazon Cloudfront",
      "Google Workspace",
      "HubSpot",
      "Mailgun",
      "Mixpanel"
    ],
    "byCategory": {
      "CDN": [
        "Amazon Cloudfront"
      ],
      "Analytics": [
        "Leadfeeder",
        "Mixpanel"
      ],
      "Marketing automation": [
        "HubSpot"
      ]
    },
    "cms": null,
    "ecommercePlatform": null,
    "analytics": [
      "Leadfeeder",
      "Mixpanel"
    ],
    "tagManagers": [],
    "advertising": [],
    "marketingAutomation": [
      "HubSpot"
    ],
    "crm": [
      "Intercom"
    ],
    "liveChat": [
      "Intercom"
    ],
    "paymentProcessors": [],
    "emailProvider": "Google Workspace",
    "emailSenders": [
      "Amazon SES",
      "Google Workspace",
      "HubSpot",
      "Mailgun"
    ],
    "hosting": [
      "Amazon Web Services"
    ],
    "cdn": [
      "Amazon Cloudfront",
      "Amazon S3"
    ],
    "webServer": "Next.js",
    "javascriptFrameworks": [
      "React"
    ],
    "programmingLanguages": [
      "Node.js"
    ],
    "saasVerifiedByDns": [
      "Google Search Console",
      "Amazon SES",
      "Google Workspace",
      "HubSpot",
      "Mailgun",
      "Mixpanel"
    ],
    "technologies": [
      {
        "name": "Algolia",
        "slug": "algolia",
        "categories": [
          "Search engines"
        ],
        "version": null,
        "confidence": 100,
        "evidence": [
          "header"
        ],
        "website": "http://www.algolia.com"
      }
    ]
  },
  "safety": null,
  "sections": {
    "page": "ok",
    "tls": "ok",
    "dns": "ok",
    "registration": "ok",
    "links": "ok",
    "safety": "skipped"
  },
  "status": "ok",
  "charged": true,
  "chargedEvent": "site-audit",
  "source": "website+dns+rdap+tls",
  "fetchedAt": "2026-10-14T10:00:00.000Z"
}

FAQ

Questions

What does the audit check?
SEO tags of the page (title and description lengths, H1, canonical, robots meta and X-Robots-Tag, Open Graph and Twitter cards, hreflang, structured data, image alt texts), robots.txt, the XML sitemap and security.txt; the security headers with an A–F grade (HSTS, CSP, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy), cookie flags, mixed content and the http-to-https redirect; the SSL certificate; SPF, DMARC, MX, CAA, DNSSEC, MTA-STS and BIMI; domain registration and age (RDAP); the tech stack; time to first byte, HTML size, compression, request count and render-blocking scripts; and broken links on the page.
How are the scores calculated?
Each issue costs its area (SEO, security, e-mail, performance) a fixed number of points, shown in the issue's points field, from a starting 100. The overall score weighs SEO 30%, security 30%, performance 25% and e-mail 15%; an area whose data could not be fetched is left out. Grades: A from 90, B from 75, C from 60, D from 45, E from 25, F below.
Does it run JavaScript or a real browser?
No. It reads the HTML the server sends, like a search engine's first pass, which keeps it fast and cheap. Performance values are server-side signals (time to first byte, HTML size, compression, number of referenced files), not Lighthouse scores.

Machine-readable

This page for agents