# MOZ Scraper — Keyword Opportunity Finder (`scrapier/moz-scraper`) Actor

Scrape Moz SEO data to uncover keyword opportunities, search metrics, difficulty, authority, rankings, and competitive insights. Identify high-potential keywords, analyze SERP competition, discover content gaps, and build data-driven SEO strategies for higher organic visibility.

- **URL**: https://apify.com/scrapier/moz-scraper.md
- **Developed by:** [Scrapier](https://apify.com/scrapier) (community)
- **Categories:** SEO tools, Automation, Developer tools
- **Stats:** 3 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.99 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### MOZ Scraper — Keyword Opportunities, DA and Backlink Data

MOZ Scraper — Keyword Opportunity Finder queries Moz's free Domain Analysis tool for one or more domains and returns each domain's Domain Authority, Page Authority, Spam Score, backlink profile, top pages, ranking and branded keywords, top questions and competitors — plus a keyword-opportunity analysis built entirely from those real, scraped keyword and question tables. Every response is structured JSON, ready to pass directly to an LLM, index into a vector store, or feed a monitoring pipeline. Point it at a client list, a competitor set, or your own domain and get back a repeatable SEO and content-opportunity snapshot for each one.

### What is MOZ Scraper — Keyword Opportunity Finder?

MOZ Scraper — Keyword Opportunity Finder is an Apify Actor that requests Moz's public `moz.com/domain-analysis` page for each domain or URL you supply, parses the tables and metric cards Moz renders on that page, and adds a keyword-opportunity analysis computed only from the real ranking-keyword, branded-keyword, top-questions and ranking-distribution data it just scraped. No Moz account, login or API key is required — the Actor reads the same free tool any visitor can open in a browser.

- 🧭 **Keyword-opportunity analysis** — merges real Top Ranking Keywords with real Branded Keywords, dedupes them, and splits the result into branded vs. non-branded counts
- 📊 **Ranking-position summary** — buckets ranking keywords into positions 1–3 / 4–10 / 11+ from Moz's own ranking-distribution chart
- ❓ **Content opportunities** — lists the real Moz Top Questions the domain could target, when `includeQuestions` is on
- 🎯 **A minimum-rank filter** — `minKeywordRank` narrows the opportunity analysis to keywords ranking at or above a chosen SERP position
- 🧠 **Full domain overview** — Domain Authority, Page Authority, Spam Score, backlinks, top pages, linking domains and top competitors
- 🛡️ **Self-managed proxy fallback** — starts direct, escalates to Datacenter then sticky Residential only if Moz blocks the request

### What data can you get with MOZ Scraper — Keyword Opportunity Finder?

Each domain you submit produces one dataset row, and that row can carry up to nine distinct data groups, from the headline authority metrics down to the derived opportunity analysis.

| Result Type | Extracted Fields | Primary Use Case |
| --- | --- | --- |
| Domain overview | `authority_score`, `page_authority_score`, `trust_score`, `spam_score`, `offpage_seo_score_percentage`, `domain_age_years` | Quick authority snapshot for a domain |
| Authority history | `authority_score_history` (up to 33 monthly points), `authority_score_last_month`, `authority_score_month_over_month_change` | Tracking DA movement over time |
| Backlink profile | `total_linking_root_domains`, `total_backlinks`, `quality_backlinks`, `quality_backlinks_percentage`, `do_follow_backlinks_percentage`, `no_follow_backlinks_percentage`, `backlinks_discovered_lost_history` | Link-profile sizing and trend checks |
| Top pages & linking domains | `top_pages`, `top_linking_domains` | Finding a site's strongest pages and referrers |
| Ranking & branded keywords | `keywords_ranking_distribution`, `top_ranking_keywords`, `top_branded_keywords` | Raw keyword inputs for the opportunity analysis |
| Top questions | `top_questions` | Content-gap and FAQ research |
| Top competitors | `top_competitors` | Identifying who Moz sees as the domain's search competitors |
| **Keyword opportunity analysis** | `keyword_opportunity_analysis` (branded/non-branded split, position summary, content opportunities) | Prioritizing which keywords and questions to target next |

#### Keyword opportunity analysis

This is the field the rest of the tables feed into, and it is the reason this Actor exists on top of a plain Moz scrape. `build_keyword_opportunity_analysis()` takes only the genuinely scraped `top_ranking_keywords`, `top_branded_keywords`, `top_questions` and `keywords_ranking_distribution` fields from the same run — no third-party keyword-volume estimate, no invented difficulty score — and merges, dedupes and buckets them:

```json
"keyword_opportunity_analysis": {
  "keywordCount": 3,
  "brandedKeywordCount": 1,
  "nonBrandedKeywordCount": 2,
  "brandedVsNonBranded": { "branded": 1, "nonBranded": 2, "brandedPct": 0.3333 },
  "rankingPositionSummary": { "pos1to3": 12, "pos4to10": 34, "pos11plus": 210, "totalRankingKeywords": 256 },
  "minKeywordRankApplied": 10,
  "rankingKeywordsConsidered": 2,
  "opportunityKeywords": [
    { "keyword": "zapier", "rank": 1, "volume": null, "type": "branded" },
    { "keyword": "workflow automation software", "rank": 4, "volume": null, "type": "non_branded" },
    { "keyword": "app integration platform", "rank": 9, "volume": null, "type": "non_branded" }
  ],
  "contentOpportunities": [
    { "question": "what is workflow automation", "relevance": 92 }
  ],
  "contentOpportunityCount": 1
}
```

A ranking keyword only counts as "branded" if it also appears in Moz's own Branded Keywords table for that domain (case-insensitive match). If a scrape returns no keywords or questions for a domain, the analysis returns zeros and empty arrays rather than an estimate — empty in, empty out.

#### Domain overview

`authority_score` and `spam_score` come straight off Moz's headline metric cards. `total_linking_root_domains` is the same. `page_authority_score` is the Page Authority of the domain's top page by links, since Moz's domain-analysis page does not publish a separate domain-wide PA figure — it is real, scraped data, but it describes the strongest page rather than the domain as a whole. `domain_age_years` comes from a public RDAP registration lookup (`rdap.org`), not from Moz.

### ⚠️ Which fields are scraped and which are computed?

This is the constraint worth reading before you build anything on top of the domain-overview numbers. Not every field in the overview comes directly off Moz's page — some are formulas this Actor computes from the real Domain Authority and linking-domain counts, because Moz's free tool does not expose them. They are clearly separable:

**Scraped directly from Moz, no formula:** `authority_score`, `spam_score`, `page_authority_score`, `total_linking_root_domains`, `top_pages`, `top_linking_domains`, `top_ranking_keywords`, `top_branded_keywords`, `top_questions`, `top_competitors`, `backlinks_discovered_lost_history`, `keywords_ranking_distribution`. `keyword_opportunity_analysis` is derived only from this group.

**Computed from those numbers, not reported by Moz:**

| Field | Exact formula |
| --- | --- |
| `trust_score` | `round(authority_score / 10)` |
| `offpage_seo_score_percentage` | `round((authority_score + page_authority_score) / 2 * 0.9 / 100, 2)` if a top page's PA was found, else `round(authority_score * 0.9 / 100, 2)` |
| `total_backlinks` | `total_linking_root_domains * 17.8`, rounded to 2 significant figures |
| `quality_backlinks` | `total_backlinks * authority_score * 0.00215`, rounded down to the nearest 1,000 |
| `quality_backlinks_percentage` | `quality_backlinks / total_backlinks`, rounded to 2 decimals |
| `do_follow_backlinks_percentage` | `min(0.95, 0.70 + authority_score * 0.0016)`, rounded to 2 decimals |
| `no_follow_backlinks_percentage` | `1 - do_follow_backlinks_percentage`, rounded to 2 decimals |

`authority_score_history` is a blend: each month is checked against the Wayback Machine (up to 8 archived snapshots fetched per domain), and any month with a recovered "Domain Authority" value from an archived page uses that real number. Every other month is filled with a deterministic value — seeded from an MD5 hash of the domain so it is stable across runs — clamped to a tight band of `authority_score - 2` to `authority_score + 1`. `authority_score_last_month` and `authority_score_month_over_month_change` are read off that same array, so they inherit whichever source (verified or filled) produced that month's value. None of this affects `keyword_opportunity_analysis`, which only touches the scraped-only fields above.

### How does MOZ Scraper differ from the official Moz API?

Moz publishes its own official Moz API, and it returns a paid, subscription-gated version of the same kind of authority and link data — if you already hold that subscription, it is the supported, contractually backed route. MOZ Scraper — Keyword Opportunity Finder exists for the case where you don't have one, reading the same free Domain Analysis page any visitor can open.

| Feature | Official Moz API | MOZ Scraper — Keyword Opportunity Finder |
| --- | --- | --- |
| Paid Moz subscription and API key required | ✅ | ❌ |
| Access route | Moz account + API credentials | Apify account only |
| Keyword-opportunity analysis (branded split, position summary, content opportunities) | Not part of the API | ✅ included |
| Domain Authority history | Full historical series on paid plans | Wayback-verified points where available, estimated elsewhere (see above) |
| Setup | Subscription, API key, credit management | Paste domains, click Start |
| Output shape | Moz's documented API schema | One normalized JSON row per domain |

Check Moz's current published API documentation for exact plan tiers, endpoints and call costs before choosing between them — those terms change and are not reproduced here. Use the official API for production billing-grade access to Moz's full index. Use MOZ Scraper — Keyword Opportunity Finder for ad-hoc audits, client and competitor sweeps, and keyword-opportunity triage without a Moz subscription.

### How to scrape MOZ domain data with MOZ Scraper — Keyword Opportunity Finder?

MOZ Scraper — Keyword Opportunity Finder runs on Apify. Start it from the Apify Console or call it through the Apify API — there is no separate signup, credit balance or API key of its own to manage.

1. Open MOZ Scraper — Keyword Opportunity Finder on its Apify Store page and click **Try for free**
2. Enter one or more values into **URL(s) or Domain(s)** (`urls`) — a bare domain like `zapier.com` or a full URL both work, since the Actor normalizes either down to a host
3. Toggle **Include Domain Overview** (`include_authority`), **Include Domain Authority History** (`include_history`) and **Include Content Opportunities** (`includeQuestions`) for the data groups you want, and set **Minimum Keyword Rank** (`minKeywordRank`) if you want the opportunity analysis narrowed to top-ranking keywords only
4. Leave **Proxy Configuration** on its default — the Actor manages the fallback ladder itself
5. Click **Start**, then download or stream the dataset as JSON, CSV, Excel or XML, or read it live through the Apify API

#### How to run multiple domains in one job

`urls` is an array — paste domains one at a time in the Console's list editor, or use **Bulk edit** to paste many at once. Both plain strings (`"zapier.com"`) and objects (`{"url": "zapier.com"}` or `{"domain": "zapier.com"}`) are accepted, so output from another tool can usually be fed in unchanged. Every domain in the array is analyzed and pushed to the dataset independently as soon as it finishes, so a crash partway through a large batch does not lose the domains already scraped.

### ⬇️ Input

| Parameter | Required | Type | Description | Example Value |
| --- | --- | --- | --- | --- |
| `urls` | Yes | array | List one or more domains or URLs to analyze on MOZ (e.g. `zapier.com`, `https://moz.com`). Add them one-by-one or paste a bulk list with **Bulk edit**. | `["zapier.com"]` |
| `include_authority` | No | boolean | If enabled, collects the full domain overview: Domain Authority, Page Authority, Spam Score, backlink totals, top pages, linking domains, ranking & branded keywords, top questions and competitors. Default `true`. | `true` |
| `include_history` | No | boolean | If enabled, builds a monthly Domain Authority history timeline for each domain (verified against historical snapshots where available). Default `true`. | `true` |
| `minKeywordRank` | No | integer (minimum 1) | Only consider ranking keywords at/above this SERP position (keeps keywords whose rank ≤ this value) when building the opportunity analysis. Leave empty to include every scraped ranking keyword. The base `top_ranking_keywords` output is always emitted in full. | `10` |
| `includeQuestions` | No | boolean | If enabled, the analysis lists the real MOZ Top Questions the domain could target as content opportunities. Turn off to omit them. Default `true`. | `true` |
| `proxyConfiguration` | No | object | Proxy strategy. The scraper starts with NO proxy, then automatically falls back to a Datacenter proxy, and finally to a sticky Residential proxy if MOZ blocks the request — so you almost never need to change this. Default `{"useApifyProxy": true}`. | `{"useApifyProxy": true}` |

None of these parameters carry credentials — there is no API key input for this Actor. `proxyConfiguration` uses the Console's proxy editor and is not a secret field.

#### Example input

```json
{
  "urls": ["zapier.com", "https://moz.com/"],
  "include_authority": true,
  "include_history": true,
  "minKeywordRank": 10,
  "includeQuestions": true,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

**Common pitfall:** `include_authority` gates almost everything, including the tables the opportunity analysis is built from. If you turn it off to save time, `top_ranking_keywords`, `top_branded_keywords`, `top_questions` and `keywords_ranking_distribution` are never populated for that run, so `keyword_opportunity_analysis` comes back as an empty shell (`keywordCount: 0`, empty arrays) even with `includeQuestions` and `minKeywordRank` still set. Leave `include_authority` on if you want the opportunity analysis to return anything.

### ⬆️ Output

Each run produces one dataset row per domain: typed, normalized JSON with a consistent set of keys, streamed to the dataset live as each domain finishes rather than held until the run ends. Export the dataset as JSON, CSV, Excel or XML, or read it through the Apify API. The Store listing also exposes ten dataset views — Overview, Authority History, Backlinks Discovered/Lost, Keyword Ranking Distribution, Top Pages, Top Linking Domains, Top Ranking Keywords, Branded Keywords, Top Questions, Top Competitors and Keyword Opportunities — each showing one slice of the same underlying row.

#### Scraped results

```json
{
  "data_captured_at": "2026-07-25T14:32:10.481230",
  "type": "domain_authority",
  "last_updated": "2026-07-25T14:32:10.481230",
  "domain": "zapier.com",
  "domain_age_years": 14.63,
  "authority_score": 82,
  "page_authority_score": 75,
  "trust_score": 8,
  "spam_score": 2,
  "offpage_seo_score_percentage": 0.71,
  "authority_score_last_month": 81,
  "authority_score_month_over_month_change": 1,
  "authority_score_history": [
    { "date": "2023-11-01T00:00:00", "domain_authority": 80 },
    { "date": "2023-12-01T00:00:00", "domain_authority": 81 },
    { "date": "2024-01-01T00:00:00", "domain_authority": 81 }
  ],
  "total_linking_root_domains": 112600,
  "total_backlinks": 2000000,
  "quality_backlinks": 352000,
  "quality_backlinks_percentage": 0.18,
  "do_follow_backlinks_percentage": 0.83,
  "no_follow_backlinks_percentage": 0.17,
  "backlinks_discovered_lost_history": [
    { "date": "2026-05-27T00:00:00", "discovered": 4210, "lost": 1830 },
    { "date": "2026-06-03T00:00:00", "discovered": 3980, "lost": 2010 },
    { "date": "2026-06-10T00:00:00", "discovered": 4520, "lost": 1750 }
  ],
  "keywords_ranking_distribution": [
    { "domain": "zapier.com", "position": "1-3", "ranking_keywords": 1240 },
    { "domain": "zapier.com", "position": "4-10", "ranking_keywords": 3860 },
    { "domain": "zapier.com", "position": "11-20", "ranking_keywords": 5210 }
  ],
  "top_pages": [
    { "page_url": "https://zapier.com/apps", "page_authority": 75 },
    { "page_url": "https://zapier.com/blog", "page_authority": 71 },
    { "page_url": "https://zapier.com/pricing", "page_authority": 68 }
  ],
  "top_linking_domains": [
    { "domain": "github.com", "domain_authority": 96 },
    { "domain": "producthunt.com", "domain_authority": 91 },
    { "domain": "medium.com", "domain_authority": 95 }
  ],
  "top_ranking_keywords": [
    { "keyword": "zapier", "rank": 1 },
    { "keyword": "workflow automation software", "rank": 4 },
    { "keyword": "app integration platform", "rank": 9 }
  ],
  "top_branded_keywords": [
    { "keyword": "zapier", "volume": 246000 },
    { "keyword": "zapier login", "volume": 40500 }
  ],
  "top_questions": [
    { "question": "what is workflow automation", "relevance": 92 },
    { "question": "how does zapier work", "relevance": 88 }
  ],
  "top_competitors": [
    { "domain": "make.com", "visibility": 34 },
    { "domain": "n8n.io", "visibility": 21 }
  ],
  "keyword_opportunity_analysis": {
    "keywordCount": 3,
    "brandedKeywordCount": 1,
    "nonBrandedKeywordCount": 2,
    "brandedVsNonBranded": { "branded": 1, "nonBranded": 2, "brandedPct": 0.3333 },
    "rankingPositionSummary": { "pos1to3": 1240, "pos4to10": 3860, "pos11plus": 5210, "totalRankingKeywords": 10310 },
    "minKeywordRankApplied": 10,
    "rankingKeywordsConsidered": 2,
    "opportunityKeywords": [
      { "keyword": "zapier", "rank": 1, "volume": 246000, "type": "branded" },
      { "keyword": "workflow automation software", "rank": 4, "volume": null, "type": "non_branded" },
      { "keyword": "app integration platform", "rank": 9, "volume": null, "type": "non_branded" }
    ],
    "contentOpportunities": [
      { "question": "what is workflow automation", "relevance": 92 },
      { "question": "how does zapier work", "relevance": 88 }
    ],
    "contentOpportunityCount": 2
  }
}
```

If a domain fails — Moz returns no result after the proxy ladder is exhausted, or the page can't be parsed — the Actor pushes a separate, shorter row instead of skipping the domain:

```json
{
  "data_captured_at": "2026-07-25T14:35:02.113044",
  "type": "error",
  "domain": "an-invalid-domain-example.test",
  "error": "MOZ returned no results after exhausting the proxy ladder (last error: rate-limited / no results). The target may be temporarily unavailable or the domain is invalid."
}
```

Error rows are pushed with a plain `Actor.push_data()` call and no `charged_event_name`, so **they are not billed** — only successful `domain_authority` rows are charged under the `row_result` event. Filter them out of billed results with `type != "error"` (or keep only `type == "domain_authority"`).

### How can I use the data extracted with MOZ Scraper — Keyword Opportunity Finder?

- 🔍 **SEO consultants and agencies:** paste a client or prospect list into `urls`, sort by `authority_score` and `total_linking_root_domains` to triage which sites need link work, and pull `keyword_opportunity_analysis.rankingPositionSummary` to see how many keywords sit just outside the top 10.
- ✍️ **Content strategists:** enable `includeQuestions` and read `contentOpportunities` for real questions Moz surfaces for the domain, then cross-reference against `opportunityKeywords` where `type` is `non_branded` to find topics with no branded coverage yet.
- 🤖 **AI engineers and LLM developers:** feed the JSON row straight into an agent's context — a grounded SEO assistant can answer "which of our target keywords are ranking outside the top 10" directly from `rankingPositionSummary` and `opportunityKeywords` without re-deriving anything.
- 📈 **Market researchers:** run the same domain set on a schedule and diff `authority_score`, `total_backlinks` and `top_competitors` between runs to track share-of-authority shifts across a competitive set.
- 🧩 **Product and SEO teams:** compare `keyword_opportunity_analysis.rankingPositionSummary` across your own domain and each entry in `top_competitors` to spot which position band (1–3, 4–10, 11+) has the most keywords worth pushing, then plan content or link-building sprints around the gap instead of guessing.

### How do you monitor keyword opportunities over time?

Keyword-opportunity tracking is the discipline of re-running the same domain list on a schedule and watching what moves in `keyword_opportunity_analysis`, rather than treating one run as a static report.

Each repeated run re-scrapes Moz's live tables, so `rankingKeywordsConsidered`, `brandedVsNonBranded.brandedPct` and `rankingPositionSummary` (`pos1to3` / `pos4to10` / `pos11plus` / `totalRankingKeywords`) will differ run to run as keywords move in and out of Moz's tracked set or shift SERP position. Diff `opportunityKeywords` between two runs on the `keyword` key: a keyword that gained a lower `rank` moved up; one that disappeared either fell out of Moz's tracked keywords or was filtered out by `minKeywordRank`. Diff `contentOpportunities` on `question` to catch newly surfaced Top Questions worth targeting with content. `authority_score_month_over_month_change` gives you the same kind of delta at the domain-authority level in a single run, without needing a second run to compare against.

A practical loop: schedule a run across a fixed domain set weekly or monthly, keep the previous run's dataset, and alert when `rankingPositionSummary.pos4to10` grows (keywords approaching page one) or when `brandedVsNonBranded.brandedPct` shifts significantly (a sign the domain's visible keyword mix is becoming more or less brand-dependent). Set up the recurring run with an [Apify schedule](https://docs.apify.com/platform/schedules) and compare datasets between runs via the Apify API — the Actor itself does not diff runs for you.

### Integrate MOZ Scraper — Keyword Opportunity Finder and automate your workflow

MOZ Scraper — Keyword Opportunity Finder works with any language or tool that can send an HTTP request, since it is a standard Apify Actor.

#### REST API with Python

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")

run = client.actor("<YOUR_USERNAME>/moz-keyword-opportunity-finder").call(run_input={
    "urls": ["zapier.com", "moz.com"],
    "include_authority": True,
    "include_history": True,
    "minKeywordRank": 10,
    "includeQuestions": True,
})

for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    if row.get("type") == "domain_authority":
        analysis = row["keyword_opportunity_analysis"]
        print(row["domain"], row["authority_score"], analysis["keywordCount"])
```

Works the same way in Go, Ruby, Node.js or cURL — any client that can call the Apify API.

#### Scheduled monitoring and delivery

There is no built-in webhook or push-delivery feature in this Actor. For recurring runs, set up an [Apify schedule](https://docs.apify.com/platform/schedules) to trigger the same input on a cadence, and use [Apify webhooks](https://docs.apify.com/platform/integrations/webhooks) at the platform level to notify another system when a run finishes, or poll the dataset through the Apify API on your own interval.

### Is it legal to scrape MOZ data?

Yes — MOZ Scraper — Keyword Opportunity Finder reads only Moz's free, publicly accessible Domain Analysis tool, the same page any visitor sees without logging in or paying for a Moz subscription. Scraping data that is already publicly displayed, without bypassing a login or paywall, is broadly treated as permissible.

The data returned — Domain Authority, backlink counts, ranking keywords, top pages — describes websites and their SEO metrics, not identifiable individuals, so personal-data regimes like GDPR and CCPA do not attach to this output the way they would to a profile scraper. What can apply is Moz's own terms of service and, in some jurisdictions, database or unfair-competition rules covering systematic reuse of a compiled dataset. Scraping for internal monitoring and research carries a different risk profile than scraping to build a redistributed or resold competing dataset.

Consult your legal team for commercial use cases involving bulk data storage or resale.

### ❓ Frequently asked questions

#### Does MOZ Scraper — Keyword Opportunity Finder require a Moz account or API key?

No. It reads Moz's free Domain Analysis page, which needs no login, subscription or API key. The only credential you need is your Apify account to run the Actor.

#### Does MOZ Scraper — Keyword Opportunity Finder extract keyword opportunities?

Yes — they arrive in the `keyword_opportunity_analysis` object on every successful row, built from the real `top_ranking_keywords`, `top_branded_keywords`, `top_questions` and `keywords_ranking_distribution` fields scraped in the same run. If `include_authority` is off, those source tables are never populated and the analysis comes back empty (see the input pitfall above).

#### How many keywords and questions does MOZ Scraper — Keyword Opportunity Finder return per domain?

However many Moz's own Top Ranking Keywords, Branded Keywords and Top Questions tables show for that domain on its Domain Analysis page — there is no additional cap applied by the Actor. `minKeywordRank` narrows which ranking keywords feed the opportunity analysis, but the base `top_ranking_keywords` field always carries the full scraped table regardless of that filter.

#### How does MOZ Scraper — Keyword Opportunity Finder handle Moz's anti-bot and rate-limit measures?

Every request starts direct, with no proxy. If Moz returns a non-200 response or a 200 page that doesn't contain real results (Moz's per-IP free-tool limit page), the Actor escalates a shared proxy ladder: direct → Apify Datacenter → sticky Apify Residential, retrying at each level (up to 3 retries once on Residential) before giving up. The escalation is shared across all domains in the run, so once one domain triggers a block, later domains start from wherever the ladder currently sits rather than re-triggering it from scratch. Note that the Residential rung always uses Apify's default Residential proxy group — any custom groups or country set in `proxyConfiguration` apply to the direct/Datacenter attempts, not to the Residential fallback.

#### Which fields are real Moz data and which are estimated?

See the dedicated section above. In short: authority, spam, backlinks-count, top-pages/domains/keywords/questions/competitors and the discovered/lost and ranking-distribution charts are scraped directly. `trust_score`, `offpage_seo_score_percentage`, `total_backlinks`, `quality_backlinks`, `quality_backlinks_percentage`, `do_follow_backlinks_percentage` and `no_follow_backlinks_percentage` are computed from the scraped Domain Authority and linking-domain counts using the formulas listed above, not read from Moz directly. `authority_score_history` blends Wayback Machine-verified months with an estimated fill for the rest.

#### How do I use MOZ Scraper — Keyword Opportunity Finder to monitor keyword opportunities over time?

Schedule the same domain list on a recurring [Apify schedule](https://docs.apify.com/platform/schedules), keep each run's dataset, and diff `opportunityKeywords` and `contentOpportunities` on their `keyword` / `question` keys between runs to see what moved, disappeared or newly appeared. See the monitoring section above for the full loop.

#### Does MOZ Scraper — Keyword Opportunity Finder work with Claude, ChatGPT and AI agent frameworks?

Yes. It is callable as a standard HTTP endpoint through the Apify API, so any agent framework that can make a request — LangChain, CrewAI, n8n, a custom tool definition — can invoke it and receive typed JSON, enabling a grounded agent that retrieves live domain-authority and keyword data before answering.

#### How does MOZ Scraper — Keyword Opportunity Finder compare to other keyword-research actors?

Checked on the Apify Store on 26 July 2026, none of the closest-named Store listings actually scrape Moz. `trovevault/keyword-opportunity-finder` scores content ideas by comparing search-question competition against Apify Store supply — a product-ideation tool, not an SEO authority scraper, and its `opportunityScore` is a 0–10 review aid rather than a keyword/branded split. `dxbear/google-keyword-finder` pulls Google search-volume, competition and CPC data for a seed keyword, priced as a flat monthly subscription rather than pay-per-event. Neither reads Domain Authority, backlinks or Moz's own ranking-keyword tables. MOZ Scraper — Keyword Opportunity Finder's distinct ground is combining a full Moz domain-authority scrape with an opportunity analysis computed only from that same domain's real ranking, branded-keyword and question data.

#### Can I pass a full URL instead of a bare domain?

Yes. `urls` accepts a bare domain (`zapier.com`) or a full URL with a scheme and path (`https://zapier.com/apps`); either way, the Actor normalizes the value down to just the host before analyzing it — `https://zapier.com/apps` and `zapier.com` produce the same row. There is no way to scope the analysis to a single page or subfolder; Moz's Domain Analysis tool, and therefore this Actor, always reports at the domain level.

#### Can I use MOZ Scraper — Keyword Opportunity Finder without managing proxies or a Moz account?

Yes. Proxy selection and escalation are handled automatically — you never create a proxy account or pick which tier to use, though you can restrict the proxy input if you have specific requirements. The only account you need is your Apify account; Moz itself needs no login for the pages this Actor reads.

### 🔗 Related scrapers

| Scraper | What it extracts |
| --- | --- |
| Ahrefs Scraper | Domain Rating, traffic, backlinks and keyword data from Ahrefs' free public tools — a second SEO data source useful for cross-checking Moz's authority scores against Ahrefs' Domain Rating |

### 💬 Your feedback

Found a bug, a Moz table that isn't parsing, or a field you need that Moz's page already shows but this Actor doesn't yet extract? Open an issue on the Actor's Issues tab on Apify with the domain you ran and the run ID — that's the fastest way to get it looked at.

# Actor input Schema

## `urls` (type: `array`):

List one or more domains or URLs to analyze on MOZ (e.g. `zapier.com`, `https://moz.com`). Add them one-by-one or paste a bulk list with **Bulk edit**.

## `include_authority` (type: `boolean`):

If enabled, collects the full domain overview: Domain Authority, Page Authority, Spam Score, backlink totals, top pages, linking domains, ranking & branded keywords, top questions and competitors.

## `include_history` (type: `boolean`):

If enabled, builds a monthly Domain Authority history timeline for each domain (verified against historical snapshots where available).

## `minKeywordRank` (type: `integer`):

Only consider ranking keywords at/above this SERP position (keeps keywords whose rank ≤ this value) when building the opportunity analysis. Leave empty to include every scraped ranking keyword. The base `top_ranking_keywords` output is always emitted in full.

## `includeQuestions` (type: `boolean`):

If enabled, the analysis lists the real MOZ Top Questions the domain could target as content opportunities. Turn off to omit them.

## `proxyConfiguration` (type: `object`):

Proxy strategy. The scraper starts with NO proxy, then automatically falls back to a Datacenter proxy, and finally to a sticky Residential proxy if MOZ blocks the request — so you almost never need to change this.

## Actor input object example

```json
{
  "urls": [
    "zapier.com"
  ],
  "include_authority": true,
  "include_history": true,
  "includeQuestions": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All scraped items in the Actor's default dataset — domain authority, page authority, spam score, backlinks and quality metrics.

## `authorityHistory` (type: `string`):

Monthly Domain Authority history timeline per domain.

## `backlinksHistory` (type: `string`):

Backlinks discovered/lost history per domain.

## `keywordsDistribution` (type: `string`):

Ranking-keyword position distribution per domain.

## `topPages` (type: `string`):

Top pages by links per domain.

## `topLinkingDomains` (type: `string`):

Top linking domains per domain.

## `topRankingKeywords` (type: `string`):

Top ranking keywords per domain.

## `topBrandedKeywords` (type: `string`):

Top branded keywords per domain.

## `topQuestions` (type: `string`):

Top questions per domain.

## `topCompetitors` (type: `string`):

Top search competitors per domain.

## `keywordOpportunities` (type: `string`):

Keyword & content opportunity analysis per domain.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "urls": [
        "zapier.com"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapier/moz-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "urls": ["zapier.com"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapier/moz-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "urls": [
    "zapier.com"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call scrapier/moz-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapier/moz-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/EoqPEZi7xa9AOQWWM/builds/xf6T2YaFbExDhrHG8/openapi.json
