# Bulk Domain Authority Checker - Backlinks & Referring Domains (`seemuapps/bulk-domain-authority-checker`) Actor

Check domain rank (0-100), backlinks, dofollow/nofollow split, referring domains, spam score and 30-day link changes for thousands of domains at once.

- **URL**: https://apify.com/seemuapps/bulk-domain-authority-checker.md
- **Developed by:** [Seemu Scraping](https://apify.com/seemuapps) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 domain checkeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Bulk Domain Authority Checker - Backlinks & Referring Domains

Check the authority of hundreds or thousands of domains in one run. For each domain you get a 0-100 domain rank, referring domains, total backlinks, the dofollow/nofollow split, spam score, broken links, link types, top linking countries and TLDs. You can also add new and lost links over the last 30 days. It's a fast, low-cost Ahrefs and Moz alternative for bulk domain checks. Invalid domains and domains with no backlink data are free.

### What you get

For every domain you enter, one row with:

- **domainRank**: authority score from 0 to 100, based on the number and strength of referring domains (similar in spirit to PageRank, Domain Rating or Domain Authority). **mainDomainRank** is the rank of the root domain, which is useful when you check subdomains.
- **referringDomains** and **referringMainDomains**: unique linking domains and linking root domains, plus nofollow versions of each (domains sending at least one nofollow link)
- **backlinks**, **dofollowBacklinks**, **nofollowBacklinks** and **dofollowRatio** (0-1)
- **referringIps**, **referringSubnets** and **referringPages**: how diverse the link sources are, which helps spot link networks
- **textBacklinks**, **imageBacklinks** and **redirectBacklinks**, plus **otherBacklinkTypes** (canonical, alternate, meta and so on)
- **spamScore**: 0-100 spam score of the link profile; higher means riskier
- **brokenBacklinks** and **brokenPages**: links that point at pages returning errors
- **firstSeen** and **lostDate**: when the first backlink was found and when the last one was lost
- **topCountries**, **topTlds** and **platformTypes**: where the links come from (for example `{"US": 812, "DE": 120}`, `{"com": 640, "org": 95}`, `{"cms": 300, "blogs": 120}`)
- **Optional 30-day changes**: newBacklinks30d, lostBacklinks30d, netBacklinks30d, newReferringDomains30d, lostReferringDomains30d, netReferringDomains30d, and root-domain versions
- **status**: `ok`, `no_data` (free), `invalid` (free) or `error` (free, retry later)

Export to JSON, CSV, Excel or Google Sheets from the **Dataset** tab, or use the API.

### Use cases

- **Link building and outreach**: filter a prospect list down to sites above a minimum domain rank before you send a single email
- **Expired domain and domain flipping research**: screen thousands of domains for real authority, spam risk and link diversity in one run
- **Competitor analysis**: compare domain authority, dofollow ratios and link growth against competitors
- **Guest post and PBN vetting**: catch sites with inflated metrics, few referring IPs, high spam scores or links that are collapsing
- **SEO agency reporting**: track referring domains and 30-day new and lost links for every client domain on a schedule

### How to use

1. Paste your domains into **Domains**, one per line. Full URLs are fine: `https://www.example.com/blog?ref=1` is checked as `example.com`. Subdomains such as `shop.example.com` are kept.
2. Optional: set **Minimum domain rank** (0-100) to keep only domains at or above that rank.
3. Optional: turn on **Include 30-day new & lost links** to add link velocity to every row.
4. Run the actor. Results appear in the **Dataset** tab, one row per domain.

Duplicates are removed automatically, so each domain is checked and billed once per run.

### Pricing

- A small fixed fee per run, plus a fee for each domain checked that has backlink data.
- Turning on **30-day new & lost links** adds one flat fee per run (not per domain).
- Domains that are invalid, have no backlink data, or fail to load are **not charged**.
- **Minimum domain rank filter:** domains below your minimum are still checked and **are charged**, even though they don't appear in the dataset. The filter saves you sorting time, not money. The run's status message tells you how many domains passed and how many fell below.
- **Free plan:** check up to 3 domains per run (current metrics only, no 30-day changes), 2 runs per day, 60 minutes apart, so you can try the output. Upgrade to a paid Apify plan to remove these limits.

### Output example

```json
{
  "domain": "forbes.com",
  "input": "https://www.forbes.com/sites/",
  "status": "ok",
  "domainRank": 65,
  "mainDomainRank": 65,
  "referringDomains": 938837,
  "referringMainDomains": 787233,
  "referringDomainsNofollow": 96596,
  "referringMainDomainsNofollow": 78071,
  "backlinks": 20436483,
  "dofollowBacklinks": 14840987,
  "nofollowBacklinks": 5595496,
  "dofollowRatio": 0.7262,
  "referringIps": 751069,
  "referringSubnets": 563302,
  "referringPages": 14305538,
  "referringPagesNofollow": 3916847,
  "textBacklinks": 16757916,
  "imageBacklinks": 2043648,
  "redirectBacklinks": 1021824,
  "otherBacklinkTypes": { "canonical": 613095 },
  "spamScore": 8,
  "brokenBacklinks": 613094,
  "brokenPages": 8174,
  "firstSeen": "2017-05-13T03:12:44.000Z",
  "lostDate": null,
  "topCountries": { "US": 8174593, "unknown": 4087296, "DE": 2043648, "GB": 1634918 },
  "topTlds": { "com": 10218241, "org": 2043648, "net": 1021824, "de": 817459 },
  "platformTypes": { "unknown": 8174593, "cms": 6130944, "blogs": 4087296, "news": 1021824 },
  "newBacklinks30d": 6468642,
  "lostBacklinks30d": 1468807,
  "netBacklinks30d": 4999835,
  "newReferringDomains30d": 37664,
  "lostReferringDomains30d": 3692,
  "netReferringDomains30d": 33972,
  "newReferringMainDomains30d": 14825,
  "lostReferringMainDomains30d": 1339,
  "changesSince": "2026-09-06",
  "checkedAt": "2026-10-06T09:12:44.120Z",
  "error": null
}
```

The 30-day fields are `null` unless **Include 30-day new & lost links** is on. Invalid entries come back as a free row so you can see what was skipped:

```json
{ "domain": "not a domain", "input": "not a domain", "status": "invalid", "error": "Not a valid domain name." }
```

### FAQ

**Is domain rank the same as Ahrefs DR or Moz DA?**
No tool shares the same scale, but all of them measure the same thing: how many strong sites link to a domain. Use domainRank to compare domains with each other and to track changes over time.

**How are dofollow and nofollow backlinks counted?**
nofollowBacklinks is the number of backlinks with a `rel="nofollow"` attribute. dofollowBacklinks is all remaining backlinks.

**What does "no data" mean?**
No backlinks were found for that domain. This is common for brand-new or parked domains. These rows are free.

**Can I check individual pages?**
This actor checks whole domains and subdomains. Paths in your input are removed.

# Actor input Schema

## `domains` (type: `array`):

Domains or URLs to check, one per line. Full URLs, www., paths and ports are all fine (https://www.example.com/blog becomes example.com). Subdomains such as blog.example.com are kept as-is. Duplicates are removed and invalid entries are returned free of charge.

## `minDomainRank` (type: `integer`):

Only return domains with a domain rank (0-100) at or above this value. 0 returns every domain. Domains below the threshold are still checked and billed.

## `includeChanges` (type: `boolean`):

Add new and lost backlinks plus new and lost referring domains for the last 30 days to every row. Off by default.

## Actor input object example

```json
{
  "domains": [
    "apify.com",
    "ahrefs.com",
    "github.com"
  ],
  "minDomainRank": 0,
  "includeChanges": false
}
```

# Actor output Schema

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

One record per domain: domain, status (ok / no_data / invalid / error), domainRank and mainDomainRank (0-100), referringDomains, referringMainDomains, backlinks, dofollowBacklinks, nofollowBacklinks, dofollowRatio, referringIps, referringSubnets, referringPages, textBacklinks, imageBacklinks, redirectBacklinks, spamScore, brokenBacklinks, brokenPages, firstSeen, topCountries, topTlds, platformTypes and optional 30-day new/lost counts.

# 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 = {
    "domains": [
        "apify.com",
        "ahrefs.com",
        "github.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("seemuapps/bulk-domain-authority-checker").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 = { "domains": [
        "apify.com",
        "ahrefs.com",
        "github.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("seemuapps/bulk-domain-authority-checker").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 '{
  "domains": [
    "apify.com",
    "ahrefs.com",
    "github.com"
  ]
}' |
apify call seemuapps/bulk-domain-authority-checker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,seemuapps/bulk-domain-authority-checker"
        }
    }
}
```

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/DSrBVzjshDFGnWYM6/builds/5RpwcBJExX7s2ild0/openapi.json
