MOZ Scraper (SEO Health Score)
Pricing
from $2.99 / 1,000 results
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
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
1
Monthly active users
10 days ago
Last modified
Categories
Share
MOZ SEO Health Scorer β Domain Authority and Backlinks
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()insrc/main.pybuildsscoreBreakdownwith the raw value, normalized 0-1 value, base weight, effective weight, and exact point contribution for every component β the contributions sum exactly toseoHealthScore, 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.
scoreBreakdownMissingComponentsnames 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.
ProxyLadderstarts 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.
minHealthScorefilters 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)
| Field | Example Value | Source |
|---|---|---|
authority_score | 72 | MOZ's own Domain Authority card |
page_authority_score | 65 | Page Authority of the top-linked page (MOZ's own table) |
spam_score | 3 | MOZ's own Spam Score card |
total_linking_root_domains | 12500 | MOZ's own Linking Root Domains card |
domain_age_years | 14.2 | Real domain registration date via RDAP lookup |
top_ranking_keywords / top_pages / top_linking_domains / top_branded_keywords / top_questions / top_competitors | arrays | MOZ's own listed tables, parsed directly |
keywords_ranking_distribution / backlinks_discovered_lost_history | arrays | Parsed from MOZ's inline chart data |
The SEO Health Score
| Field | Example Value | Notes |
|---|---|---|
seoHealthScore | 78 | 0-100 composite, computed only from the real fields above |
seoHealthGrade | "B" | A β₯90, B β₯75, C β₯60, D β₯45, F below |
scoreBreakdown | object per component | raw_value, normalized, base_weight, effective_weight, contribution β sums to seoHealthScore |
scoreBreakdownMissingComponents | [] | Weight components that couldn't be computed for this domain |
strengths / weaknesses | text arrays | Threshold-based, fired only from real scraped values β never from an estimated field |
Derived/estimated fields β not independently scraped
| Field | Example Value | How it's derived |
|---|---|---|
total_backlinks | 222500 | total_linking_root_domains Γ 17.8, a fixed multiplier β an estimate, not a MOZ-reported count |
quality_backlinks / quality_backlinks_percentage | derived from total_backlinks and authority_score | Formula-based estimate |
trust_score | da / 10 | A simple derived ratio, not a distinct MOZ metric |
offpage_seo_score_percentage | derived from authority_score/page_authority_score | Formula-based estimate |
do_follow_backlinks_percentage / no_follow_backlinks_percentage | derived from authority_score | Formula-based estimate |
authority_score_history months without a real Wayback snapshot | a bounded, deterministic per-domain walk | Only 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.
Link-building and outreach teams
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
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
urls | Yes | array | Domains or URLs to analyze on MOZ. | ["zapier.com"] |
include_authority | No | boolean | Collect the full domain overview (DA, PA, Spam Score, backlinks, keywords, competitors). Default true. | true |
include_history | No | boolean | Build a monthly Domain Authority history timeline (~15-45s per domain). Default true. | true |
minHealthScore | No | integer (0β100) | Only push domains scoring at least this. Unscoreable domains are never filtered. Default 0. | 50 |
maxConcurrency | No | integer (1β10) | Domains analyzed in parallel. Default 3. | 5 |
proxyConfiguration | No | object | Optional; 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?
| Scraper | What it extracts |
|---|---|
| Ahrefs Scraper β Competitor Comparison | Backlink and keyword competitor comparison |
| Google Search Autocomplete API | Keyword suggestion expansion |
| Instagram Engagement Estimator | Profile-level engagement rate |
| Amazon Product Scraper with Keyword Rank Tracking | Search-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 ApifyClientclient = 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.
Is it legal to use MOZ SEO Health Scorer?
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.
Are total_backlinks and quality_backlinks real numbers from MOZ?
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.