Bulk Domain Rank & Spam Risk Checker
Pricing
from $0.30 / 1,000 domain checkeds
Bulk Domain Rank & Spam Risk Checker
Bulk domain checker and referring domains checker for any website worldwide: domain rank (0 to 100), spam risk and referring domain counts for up to 10,000 domains per run, looked up in batches of 1,000. Optional total backlink count. Results as a table, JSON or CSV, or through the API.
Pricing
from $0.30 / 1,000 domain checkeds
Rating
0.0
(0)
Developer
Data Pulse
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Check the domain rank, spam risk and referring domain counts of a list of domains in one run. Up to 10,000 domains per run, looked up in batches of up to 1,000, so a list of a few hundred domains takes a few seconds.
Typical uses are qualifying outreach and guest post lists, filtering expired domain lists, sorting a list of competitors or partners by link strength, and spotting domains with a suspicious link profile before you link to them.
What the scores mean
The domain rank runs from 0 to 100 and comes from the link graph of the data source this Actor uses. It is a link-based rank: a page ranks higher when more pages, and stronger pages, link to it, and a domain's rank is built from the ranks of its pages. It is not the metric of any SEO tool vendor, so the numbers will not match scores you see elsewhere. Use it to compare domains with each other.
The spam risk runs from 0 to 100 and estimates how likely the domain is to be spam or low quality, based on signals in its link profile and pages. Higher means more suspicious. It is null when the domain is not in the link index.
Referring domains is the number of distinct domains with at least one live backlink to the domain. Referring main domains counts root domains only, so links from a.blog.com and b.blog.com count once. The nofollow variants count domains with at least one nofollow link to the target.
A domain target includes its subdomains.
Input
| Field | Default | Notes |
|---|---|---|
domains | example | Up to 10,000 domains or URLs. https://, www., ports, paths and a trailing dot are removed, international names are converted to punycode and duplicates are dropped. Subdomains are kept as given. Without this field the Actor checks a small example list. |
includeBacklinkCount | false | Add the total number of live backlinks per domain. One extra lookup per batch, charged separately (see Pricing). |
useCache | true | Reuse results for the same domain and settings from earlier runs. |
cacheTtlDays | 7 | Maximum age of cached results, 1 to 30 days. |
pushSummaryToDataset | false | Append the run summary to the dataset. |
Example:
{"domains": ["apify.com", "crawlee.dev", "https://www.example.com/about"],"includeBacklinkCount": false}
Every entry is checked before anything is looked up. A domain must use letters, digits and hyphens only (no hyphen at the start or end of a label), have labels of up to 63 characters and at most 253 characters in total, and end in a known public suffix with a registrable name in front of it. So co.uk, localhost and example.zzzz are rejected. Rejected entries are never sent to the data source. Each gets a free row with error set to the reason, for example invalid domain: a public suffix without a registrable name.
An empty domains list, or a list with only invalid entries, is invalid input. Invalid input ends the run as SUCCEEDED with a clear error message and no charge ($0).
Output
One row per domain:
{"domain": "apify.com","domainRank": 76,"spamRisk": 18,"referringDomains": 14700,"referringDomainsNofollow": 5482,"referringMainDomains": 12123,"referringMainDomainsNofollow": 3413,"backlinks": null,"hasData": true,"error": null,"source": "live","fetchedAt": "2026-10-22T07:43:10.512Z"}
backlinks is filled only when includeBacklinkCount is on. A domain that is not in the link index comes back with hasData: false, a domain rank of 0 (null for a few unusual names, such as names of the maximum length), a spam risk of null and no referring domains. That is a valid answer, for example for an expired domain, and it is charged like any other domain. source is live or cache.
If the data source rejects a domain, it rejects the whole batch. The Actor then splits the batch in halves until the rejected domain is isolated, so the other domains are still checked. The rejected domain gets a row with error set and the score fields empty, and it is not charged. The split is limited to 32 lookups per batch. Domains left unchecked at that limit are listed in the run summary as failed and are not charged. In tests with unusual names (long international names, repeated hyphens, new and rare top-level domains, names of the maximum length) the data source did not reject any domain that passed the check above, so the split is a safeguard that normal input does not reach.
Run summary
Every run saves a SUMMARY record in the default key-value store: valid, invalid and duplicate domains (with the reason each invalid entry was rejected), domains without data, cache hits, charged events, number of batches, rate-limit waits and the run status (succeeded, failed or invalid_input). If the input has nothing the Actor can use (no valid domains, every domain rejected by the data source, or a maximum charge per run too low for one domain), the run ends as succeeded with an empty dataset, nothing is charged, and the status message says what was wrong and how to fix it; the summary status is then invalid_input.
Pricing
Pay per event:
- $0.135 per batch of up to 1,000 domains looked up live, charged after that batch's lookups succeed. A run of up to 1,000 domains pays it once. Domains answered from the cache do not count, so a run answered fully from the cache does not pay it, and neither does a run whose lookups all fail.
- $0.0003 per domain checked, fresh or from the cache ($0.30 per 1,000 domains), including domains that are not in the link index.
- $0.045 per batch of up to 1,000 domains when
includeBacklinkCountis on.
Invalid domains and failed lookups are not charged.
Examples:
- 20 domains: $0.135 plus $0.006, $0.141 in total.
- 100 domains: $0.135 plus $0.03, $0.165 in total.
- 1,000 domains: $0.135 plus $0.30, $0.435 in total. With backlink counts, $0.48.
- 10,000 domains: 10 batches at $0.135 plus $3.00, $4.35 in total.
If you set a maximum charge per run, the Actor looks up only as many domains as that limit can pay for and lists the rest in the summary as skipped. If the limit cannot cover one batch and one domain, the run stops before any lookup, nothing is charged, and the status message says so.
Run time and limits
A run of 1,000 domains takes about 20 seconds (measured: 19 seconds with backlink counts on), and about 2 seconds when every domain is in the cache. Requests to the data source are rate limited per account. The Actor spaces its requests, waits and retries when a limit is hit, and records the waiting time in the summary.
If a run is restarted or migrated, domains that were already delivered are not looked up or charged again.
Apify free plan limit
Users on the Apify free plan get up to 20 domains per run. The Actor looks up the first 20 valid domains of the list and names the rest under freePlanLimit.skipped in the run summary. The run still finishes as succeeded, and its status message says that the free plan limit was reached.
This limit was set by the developer of this Actor, not by Apify. The link data is paid per request, and runs by free plan users bring the developer no revenue. Any paid Apify plan removes the limit, and nothing else about the run changes.
Notes
- The link index is crawled continuously. A link added or removed today can take days or weeks to show up in the counts.
- Very new or very small domains are often not in the index. They are listed in the summary.
- Use the domain the site actually serves. After a domain move, the old domain may still show most of the links.
- Subdomains are separate targets.
blog.example.comreturns only that subdomain, whileexample.comincludes all its subdomains.
API
curl -X POST "https://api.apify.com/v2/acts/datapulsehq~bulk-domain-rank-checker/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"domains": ["apify.com", "crawlee.dev"]}'
This Actor is an independent tool. It is not affiliated with, endorsed by, or sponsored by any search engine or SEO software vendor, and its rank and spam risk values are not the metrics of any such vendor. All trademarks belong to their respective owners.