MOZ Scraper (SEO Health Score) avatar

MOZ Scraper (SEO Health Score)

Pricing

from $2.99 / 1,000 results

Go to Apify Store
MOZ Scraper (SEO Health Score)

MOZ Scraper (SEO Health Score)

πŸ” MOZ Scraper (moz-scraper) automates extracting SEO data from Moz for faster insights. βœ… Gather key metrics, track visibility & optimize strategy. πŸ“ˆ Perfect for SEO teams, agencies & analysts. πŸš€ Save time, boost performance.

Pricing

from $2.99 / 1,000 results

Rating

0.0

(0)

Developer

SimpleAPI

SimpleAPI

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

1

Monthly active users

10 days ago

Last modified

Share

MOZ SEO Health Scorer turns MOZ's free Domain Analysis tool into a single composite SEO Health Score (0-100) plus letter grade per domain, computed transparently from only the genuinely-scraped signals β€” Domain Authority, Page Authority, Spam Score, Linking Root Domains, RDAP domain age, and ranking-keyword count β€” alongside the full domain overview MOZ itself publishes. It's built for SEO agencies triaging a client or prospect list by real domain health, link-building teams screening potential partners before outreach, and analysts who want a reproducible score they can audit component-by-component, not a black-box number. No MOZ account or API key is required. Every section below documents an input, an output field, and β€” critically β€” which fields are genuinely scraped versus derived estimates.

What is MOZ SEO Health Scorer?

This Actor scrapes MOZ's public Domain Analysis page for a domain and returns both the raw overview data (Domain Authority, Page Authority, Spam Score, top pages, top linking domains, ranking and branded keywords, top questions, top competitors) and a composite SEO Health Score computed from a documented, reproducible weighting formula.

Key capabilities, read from the source:

  • A fully transparent, reproducible score. compute_seo_health() in src/main.py builds scoreBreakdown with the raw value, normalized 0-1 value, base weight, effective weight, and exact point contribution for every component β€” the contributions sum exactly to seoHealthScore, so the number is independently verifiable from the row itself, not a black box.
  • Real-signals-only scoring, with the exclusion explicit. The module's own docstring lists what's deliberately kept out of the score: total_backlinks, quality_backlinks, the do-follow/no-follow percentages, trust_score, offpage_seo_score_percentage, and any authority-history month not backed by a real Wayback Machine snapshot β€” because the base tool estimates rather than independently scrapes those values.
  • A missing-components list, not a silently lower score. scoreBreakdownMissingComponents names any weight component that couldn't be computed (e.g. Domain Overview disabled), and the remaining components' weights are renormalized to still sum to 100 rather than silently under-scoring a domain for data you chose not to collect.
  • Automatic proxy escalation. ProxyLadder starts with no proxy, escalates to a datacenter proxy on a block, then to a sticky residential proxy β€” staying there for the rest of the run once reached.
  • A minimum-score gate that never drops the unscoreable. minHealthScore filters out domains scoring below your threshold, but a domain for which no score could be computed at all (e.g. with Domain Overview turned off) is never filtered β€” only a domain with a real, low score is excluded.

What data can I extract with MOZ SEO Health Scorer?

Every field below is read directly from scrape_domain() and compute_seo_health() in src/main.py.

Real, directly-scraped fields (feed the health score)

FieldExample ValueSource
authority_score72MOZ's own Domain Authority card
page_authority_score65Page Authority of the top-linked page (MOZ's own table)
spam_score3MOZ's own Spam Score card
total_linking_root_domains12500MOZ's own Linking Root Domains card
domain_age_years14.2Real domain registration date via RDAP lookup
top_ranking_keywords / top_pages / top_linking_domains / top_branded_keywords / top_questions / top_competitorsarraysMOZ's own listed tables, parsed directly
keywords_ranking_distribution / backlinks_discovered_lost_historyarraysParsed from MOZ's inline chart data

The SEO Health Score

FieldExample ValueNotes
seoHealthScore780-100 composite, computed only from the real fields above
seoHealthGrade"B"A β‰₯90, B β‰₯75, C β‰₯60, D β‰₯45, F below
scoreBreakdownobject per componentraw_value, normalized, base_weight, effective_weight, contribution β€” sums to seoHealthScore
scoreBreakdownMissingComponents[]Weight components that couldn't be computed for this domain
strengths / weaknessestext arraysThreshold-based, fired only from real scraped values β€” never from an estimated field

Derived/estimated fields β€” not independently scraped

FieldExample ValueHow it's derived
total_backlinks222500total_linking_root_domains Γ— 17.8, a fixed multiplier β€” an estimate, not a MOZ-reported count
quality_backlinks / quality_backlinks_percentagederived from total_backlinks and authority_scoreFormula-based estimate
trust_scoreda / 10A simple derived ratio, not a distinct MOZ metric
offpage_seo_score_percentagederived from authority_score/page_authority_scoreFormula-based estimate
do_follow_backlinks_percentage / no_follow_backlinks_percentagederived from authority_scoreFormula-based estimate
authority_score_history months without a real Wayback snapshota bounded, deterministic per-domain walkOnly months matched to a real archived MOZ snapshot (via the Wayback Machine's CDX index) carry a verified value; the rest fill a tight, domain-seeded band around the current score so the timeline has no gaps β€” treat unmatched months as illustrative trend shape, not measured history

These estimated fields are included because they mirror MOZ's own overview page presentation, but β€” as the source itself documents β€” none of them are independently scraped values, which is exactly why the SEO Health Score excludes all of them.

Why not build this yourself?

MOZ's Domain Analysis tool has no public API for the free tier, and its per-IP rate limit means a naive scraper gets blocked quickly at any real volume β€” this Actor's automatic proxy escalation (direct β†’ datacenter β†’ sticky residential) exists specifically to handle that. Getting genuine historical Domain Authority data is harder still: MOZ doesn't publish a history endpoint at all, so the only source of a real past DA value is an archived snapshot of the MOZ page itself via the Wayback Machine's CDX index β€” a research path most scrapers skip entirely in favor of guessing. This Actor does the real lookup where possible and is explicit β€” both in the field-level documentation above and in scoreBreakdownMissingComponents/the excluded-fields list β€” about exactly which numbers are real MOZ data and which are formula-based estimates, so you're not stuck reverse-engineering that distinction yourself.

How to use data extracted from MOZ SEO Health Scorer?

SEO agencies triaging client or prospect lists

Run a batch of domains with minHealthScore set to your quality bar, and use scoreBreakdown to show a prospective client exactly which factors are dragging their score down β€” a transparent, component-by-component explanation beats a bare number in a sales conversation.

Screen potential link partners by authority_score and spam_score before reaching out, using strengths/weaknesses as a quick pre-outreach gut check on a domain's real link-profile health.

Competitive SEO research

Compare top_ranking_keywords, top_competitors, and keywords_ranking_distribution across a set of competitor domains to see where your own site's ranking-keyword footprint is thin by comparison.

AI agents and reporting pipelines

Because scoreBreakdown and scoreBreakdownMissingComponents make the score's inputs and gaps fully explicit, an agent can generate an accurate, defensible SEO summary without re-deriving which fields are real versus estimated itself.

πŸ”Ό Input sample

ParameterRequiredTypeDescriptionExample Value
urlsYesarrayDomains or URLs to analyze on MOZ.["zapier.com"]
include_authorityNobooleanCollect the full domain overview (DA, PA, Spam Score, backlinks, keywords, competitors). Default true.true
include_historyNobooleanBuild a monthly Domain Authority history timeline (~15-45s per domain). Default true.true
minHealthScoreNointeger (0–100)Only push domains scoring at least this. Unscoreable domains are never filtered. Default 0.50
maxConcurrencyNointeger (1–10)Domains analyzed in parallel. Default 3.5
proxyConfigurationNoobjectOptional; the Actor self-escalates through the proxy ladder automatically.{"useApifyProxy": true}
{
"urls": ["zapier.com", "notion.so"],
"include_authority": true,
"include_history": true,
"minHealthScore": 50
}

Common pitfall: don't treat total_backlinks, quality_backlinks, trust_score, or do_follow_backlinks_percentage as measured MOZ data β€” they're formula-based estimates derived from total_linking_root_domains and authority_score, explicitly excluded from the SEO Health Score for that reason. Use authority_score, page_authority_score, spam_score, and total_linking_root_domains when you need genuinely scraped numbers.

πŸ”½ Output sample

Output is one JSON row per domain, pushed to the run's default dataset and charged as one row_result event per domain (a minHealthScore-filtered domain is not charged).

{
"domain": "zapier.com",
"authority_score": 72,
"page_authority_score": 65,
"spam_score": 3,
"total_linking_root_domains": 12500,
"domain_age_years": 14.2,
"seoHealthScore": 78,
"seoHealthGrade": "B",
"scoreBreakdown": {
"domain_authority": { "raw_value": 72, "normalized": 0.72, "base_weight": 0.3, "effective_weight": 0.3, "contribution": 21.6 },
"page_authority": { "raw_value": 65, "normalized": 0.65, "base_weight": 0.2, "effective_weight": 0.2, "contribution": 13.0 }
},
"scoreBreakdownMissingComponents": [],
"strengths": ["Strong domain authority (DA 72)"],
"weaknesses": [],
"total_backlinks": 222500,
"authority_score_history": [
{ "date": "2026-06-01T00:00:00", "domain_authority": 71 }
]
}

How do you filter and target specific domains?

Score threshold, not a raw metric cutoff. minHealthScore filters on the composite score rather than a single raw metric like authority_score alone β€” useful when "healthy" for your purposes means a balance of authority, spam cleanliness, and link-profile breadth rather than any one number in isolation.

Turn off what you don't need. include_history is the slowest part of a run (~15-45s per domain, since it queries the Wayback Machine's CDX index and fetches archived snapshots); turn it off for a fast batch triage pass, and re-run with it on only for the domains that pass your first filter.

Read strengths/weaknesses, not just the number. Two domains can land the same seoHealthScore for very different reasons β€” one strong on authority but thin on ranking keywords, another the reverse. strengths/weaknesses surfaces which real signal drove the score, so a triage decision isn't made on the number alone.

Three real examples:

{ "urls": ["client-domain.com"], "include_authority": true, "include_history": true }

Full single-domain audit with historical trend, for a client report.

{ "urls": ["prospect1.com", "prospect2.com", "prospect3.com"], "minHealthScore": 60, "include_history": false }

Fast multi-domain triage, history skipped, only domains scoring 60+ kept.

{ "urls": ["competitor.com"], "include_authority": true, "include_history": false }

Competitor keyword and link-profile snapshot without the slower history build.

▢️ Want to try other scrapers?

ScraperWhat it extracts
Ahrefs Scraper β€” Competitor ComparisonBacklink and keyword competitor comparison
Google Search Autocomplete APIKeyword suggestion expansion
Instagram Engagement EstimatorProfile-level engagement rate
Amazon Product Scraper with Keyword Rank TrackingSearch-rank position tracking

How to extract SEO data programmatically

This Actor runs as a standard Apify Actor call β€” one API call in, structured JSON dataset out, using your Apify API token.

Python example

from apify_client import ApifyClient
client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("<YOUR_USERNAME>/moz-seo-health-scorer").call(run_input={
"urls": ["zapier.com", "notion.so"],
"minHealthScore": 50,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["domain"], item["seoHealthScore"], item["seoHealthGrade"])

Export to spreadsheets or CRM

Every dataset supports one-click CSV/Excel export from the Apify Console, plus dedicated dataset views (seo_health, overview, authority_history, top_pages, etc.) for exporting just the slice you need.

This Actor scrapes MOZ's free, publicly accessible Domain Analysis tool β€” the same data any visitor can view without logging in β€” and RDAP domain registration data, which is a standard public lookup protocol. Domain and SEO metrics are business data, not personal data, so standard website Terms of Service considerations apply rather than privacy law; check MOZ's own Terms of Service for commercial-scale usage, and consult legal counsel for high-volume commercial applications.

❓ FAQ

Is the SEO Health Score comparable to MOZ's own metrics?

It's a separate composite this Actor computes, not a metric MOZ itself publishes β€” built only from real, independently-scraped signals (DA, PA, Spam Score, Linking Root Domains, domain age, ranking-keyword count) with a fully documented weighting. It complements MOZ's own Domain Authority score rather than replacing it.

No β€” they're formula-based estimates derived from total_linking_root_domains and authority_score using a fixed multiplier, not values independently scraped from MOZ. This is exactly why they're excluded from the SEO Health Score calculation; treat them as directional estimates only.

How far back does the Domain Authority history go, and is all of it real?

Up to 33 months. Only months matched to a genuine archived MOZ snapshot (found via the Wayback Machine's CDX index) carry a verified historical value; unmatched months fill a bounded, deterministic estimate so the timeline has no gaps β€” check which months had real snapshots before treating the full history as measured data.

Why would a domain not get a SEO Health Score at all?

If include_authority is turned off, none of the score's real-signal inputs are collected, so seoHealthScore is null and scoreBreakdownMissingComponents lists every excluded component. Such a domain is never filtered out by minHealthScore, even if it's set above 0.

Does this need a MOZ account or API key?

No β€” it scrapes MOZ's free, publicly accessible Domain Analysis tool directly; no login or API key is required.

How does this compare to other domain-authority scrapers?

As observed on the Apify Store on 2026-07-26, seo-scraper/moz-domain-authority-checker extracts similar MOZ overview data but doesn't document a composite health score or a real-vs-estimated field distinction; this Actor's transparent scoreBreakdown and explicit real/estimated field labeling are not something that listing publishes.

Does this work with AI agent frameworks?

Yes β€” call it as a standard HTTP endpoint via the Apify API from any agent framework capable of making an API call; there's no MCP-specific integration for this Actor.

Conclusion

MOZ SEO Health Scorer turns a domain into both the full MOZ overview and a transparent, reproducible composite health score β€” with an explicit, documented line between genuinely-scraped signals and formula-based estimates. It fits agency triage, link-building screening, and competitive SEO research that needs a defensible number, not a black box. Start a run from the Apify Console or the Apify API with your target domains to get your first SEO Health Score.