Link Gap Finder & Backlink Gap Analysis
Pricing
from $1.20 / 1,000 prospects
Link Gap Finder & Backlink Gap Analysis
Find the sites that link to your competitors but not to you, one row per site. Up to 20 competitors, with domain rank, spam risk and the strongest link URL. Service domains and spammy sites removed.
Pricing
from $1.20 / 1,000 prospects
Rating
0.0
(0)
Developer
Data Pulse
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Find the sites that link to your competitors but not to you. Give your domain and up to 20 competitor domains, and the Actor returns a list of link prospects, one row per site: each site that links to at least the number of competitors you choose and has no link to your site, with how many competitors it links to, its domain rank and spam risk, the links it gives each competitor and, for the top 50, the URL and type of its strongest link.
Service domains are removed before you see the list: newsletter and email infrastructure, CDNs, URL shorteners, ad and redirect domains, and caches and archives. Prospects with a spam risk above 40 are left out by default.
A site that links to three of your competitors writes about your topic and already links out to sites like yours. That makes it a better outreach prospect than a random site with a high rank, and this list is the usual starting point for link building and for checking where a competitor gets its links.
How the backlink gap analysis works
The link index answers one question very well: which sites link to all of these targets and to none of those. For "at least 2 of 3 competitors" the Actor asks that question once for every pair of competitors, always with your domain excluded, and merges the answers. A site that links to competitors A and C shows up in the A and C lookup, so its row says it links to 2 of 3 competitors and names them.
The number of lookups is the number of combinations: 3 competitors and a minimum of 2 is 3 lookups, 5 and 2 is 10, 6 and 3 is 20. The limit is 20 lookups per run, and an input that needs more is rejected before anything is looked up. With many competitors, raise minCompetitors. Sites that link to every competitor need a single lookup.
Then the Actor removes service domains, groups the linking hosts by root domain, looks up the domain rank and spam risk of the prospects in bulk, applies your filters and sorts the list: most competitors linked first, then by domain rank. Last, it looks up the strongest link of the top prospects (50 by default) to get the page URL, anchor text and target page, and sorts once more: within the same number of competitors, sites whose strongest link comes from using a competitor's product or from a legal page move down (see link types below).
Service domains
A link from a newsletter archive, a tracked click, an image on a CDN or a short link is a by-product of a product, not an editorial link someone chose to place, and nobody there can add a link to your site. These domains often link to many competitors at once, so without a filter they fill the top of the list. The Actor removes them with a built-in list of about 180 domains in five categories:
| Category | What it covers |
|---|---|
email | Email and newsletter sending, click tracking, hosted signup forms and campaign archives |
cdn | CDNs, file and image hosting |
shortener | URL shorteners and link-in-bio pages |
redirect | Ad, affiliate, click tracking and redirect domains |
mirror | Caches, archives, translation proxies and feed proxies |
An entry also matches its subdomains. The list holds only domains whose whole purpose is the service, never the main site of a company, so a competitor's own blog or a large social network is not removed by it. Add your own entries in serviceDomains, for example a competitor's separate domain for its newsletter, help center, status page or app downloads, and switch the built-in list off with useBuiltInServiceList: false. The run summary counts the removed domains per category and lists them, so you can check what was removed.
Hosting platforms where each subdomain belongs to a different owner (blog hosts, course and shop builders, help desk hosts) are not removed. The link index counts all sites on such a platform as one linking domain, so the row is marked with hostedPlatform: true and whyListed says to pitch the hosted sites, not the platform.
Not filtered: domains that carry a competitor's name. A domain like that can be a service domain of the competitor, but just as often it is a partner agency, a review site or a template shop, which are real prospects. A name match alone is not reliable enough to drop a row.
One row per site
By default every row is one root domain (the registrable domain, such as example.co.uk for blog.example.co.uk). Linking hosts of the same site are merged into one row: the linked competitors are combined, backlinks and pages are added up, linkingHosts lists the hosts and linkingSubdomains gives the number of linking subdomains. Sites under a public hosting suffix, such as a github.io site, stay separate. The link index already reports most linking sites at the root domain level, so in practice the merge mostly catches www. and other host variants. Set groupByRootDomain: false for one row per host.
Each lookup first reads a probe of 100 sites, strongest links first. Further pages are read only when at least 10% of that probe became prospects. It does this at most 5 times, and at most 10,000 sites per lookup. A lookup that finds no prospects stops after the probe.
Input
| Field | Default | Notes |
|---|---|---|
yourDomain | example | Your site, for example example.com. https:// and paths are removed. A leading www is removed when the host underneath still has a registrable name, so www.example.com becomes example.com and www.gov.uk stays. |
competitors | example | 1 to 20 competitor domains. Invalid entries, duplicates and your own site are dropped and listed in the run summary. |
minCompetitors | 2 | A prospect must link to at least this many competitors. With one competitor it is 1. |
maxProspects | 100 | Most prospects to return, up to 5,000. Each lookup reads this many sites at a time, at least 100 (200 after the first read) when a score filter is on. |
includeDomainRank | true | Add the domain rank and spam risk of each prospect. Needed for the two filters. |
minDomainRank | 0 | Drop prospects with a lower domain rank (0 to 100). |
maxSpamRisk | 40 | Drop prospects with a higher spam risk (0 to 100). 100 keeps all. Prospects without a value are kept. |
dofollowOnly | false | Count only dofollow links to the competitors. |
groupByRootDomain | true | One row per root domain. Off gives one row per linking host. |
exampleLinksFor | 50 | Look up the strongest link URL and link type for this many prospects from the top (0 to 200). 0 turns it off. |
excludeDomains | none | Up to 9 more sites you own. Sites that link to any of them are left out too. |
skipProspects | none | Up to 10,000 sites you already contacted. A root domain also skips its subdomains. Not charged. |
useBuiltInServiceList | true | Remove service domains with the built-in list. |
serviceDomains | none | Up to 1,000 more service domains to remove, with their subdomains. |
includeSubdomains | true | Count links to subdomains of your site and of the competitors. |
useCache | true | Reuse the result of the same analysis and the prospect scores from earlier runs. |
cacheTtlDays | 7 | Maximum age of cached results, 1 to 30 days. |
pushSummaryToDataset | false | Append the run summary to the dataset. |
Example:
{"yourDomain": "crawlee.dev","competitors": ["scrapy.org", "pptr.dev", "playwright.dev"],"minCompetitors": 2,"maxProspects": 200,"minDomainRank": 10,"serviceDomains": ["newsletter-domain-of-a-competitor.com"]}
Every entry is checked before anything is looked up. A domain must use letters, digits and hyphens only, have labels of up to 63 characters, and end in a known public suffix with a registrable name in front of it, so co.uk, localhost and example.zzzz are rejected. A competitor on the same site as your domain, more than 20 competitors, a minCompetitors higher than the number of competitors, more than 20 lookups, exampleLinksFor above 200, more than 1,000 serviceDomains, and a score filter you set with includeDomainRank off are all input errors. The default maxSpamRisk does not apply when includeDomainRank is off. An input error fails the run with a message that says what to change, and nothing is charged.
Output
One row per prospect site:
{"type": "prospect","yourDomain": "crawlee.dev","prospectDomain": "example-blog.com","rootDomain": "example-blog.com","competitorsLinked": 3,"competitorsTotal": 3,"linkedCompetitors": ["scrapy.org", "pptr.dev", "playwright.dev"],"domainRank": 41,"spamRisk": 12,"backlinksToCompetitors": 27,"referringPagesToCompetitors": 19,"linkingSubdomains": 2,"linkingHosts": ["example-blog.com", "docs.example-blog.com"],"onlyNofollow": false,"strongestLinkScore": 23,"strongestLink": {"competitor": "scrapy.org","linkScore": 23,"referringPages": 9,"firstSeen": "2023-02-11T08:15:02.000Z","url": "https://example-blog.com/posts/python-crawling-tools","targetUrl": "https://scrapy.org/","anchor": "Scrapy","dofollow": true,"fromLegalPage": false,"lastSeen": "2026-10-03T11:20:41.000Z","linkType": "mention"},"hostedPlatform": false,"firstSeen": "2023-02-11T08:15:02.000Z","whyListed": "Links to 3 of 3 competitors (scrapy.org, pptr.dev, playwright.dev) and not to crawlee.dev.","competitorLinks": [{"competitor": "scrapy.org","backlinks": 14,"referringPages": 9,"nofollowPages": 0,"linkingSubdomains": 2,"linkScore": 23,"linkSpamRisk": 8,"firstSeen": "2023-02-11T08:15:02.000Z","lostDate": null}],"countsComplete": true,"source": "live","fetchedAt": "2026-10-22T10:40:00.000Z"}
competitorLinks has one entry per linked competitor (one is shown above). linkScore is the strength of the links from the prospect to that competitor, on a 0 to 100 scale, and linkSpamRisk is the average spam risk of those links. domainRank and spamRisk describe the prospect site itself. onlyNofollow is true when every page that links to a competitor does so with nofollow links only. firstSeen is the earliest date the index saw a link from the prospect to one of the competitors.
prospectDomain is the root domain of the site (or the host when groupByRootDomain is off). Sites on your own domain, a competitor's domain or one of your excluded domains are never listed.
strongestLink is the prospect's strongest link to a competitor. Its competitor, linkScore, referringPages and firstSeen are always filled. The page fields (url, targetUrl, anchor, dofollow, lastSeen) are filled for the first exampleLinksFor rows when the index returns a live link, and are null otherwise. fromLegalPage is true when that page is a privacy, terms, cookie or other legal page.
Link types
Many sites link to a tool because they use it, not because they wrote about it: a university page links to a hosted signup form, a shop shows a "powered by" badge, a privacy policy names the newsletter service. Such a site is a customer of your competitor and rarely a realistic outreach target. strongestLink.linkType says which kind of link the example is:
| Value | Meaning |
|---|---|
mention | Any other link, usually from an article, a list, a review or an integration page |
product use | The link goes to a part of the competitor's product that its customers use (a hosted form, board, dashboard, sign-in or booking page on a subdomain such as form. or app.), or it is a "powered by" or referral badge |
affiliate | The link goes through an affiliate or referral path or parameter |
legal page | The link is on a privacy, terms or other legal page, or goes to one |
| null | No example link was looked up for this row |
Within the same number of linked competitors, product use and legal page rows are listed after the others. The type comes from the two URLs only. In the two live test runs it matched a manual check for 19 of 20 examples; the miss was a link to a shared board on a plain path, which counts as mention. Only the strongest link is checked, so a site with a strong product-use link and a weaker article link is still marked product use.
When counts are lower bounds
When a competitor pair has more common linking sites than the Actor read, the list is cut, and a site that links to three competitors can show up in only two of the cut lists. Its competitorsLinked is then a lower bound. Rows say so in whyListed and countsComplete is false, and the run summary lists the total and the number read for every lookup. A site that links to every competitor always has an exact count. Raise maxProspects to read more.
Run summary
Every run saves a SUMMARY record in the default key-value store: the competitors and lookups, the total, read count and number of reads of each lookup, the number of candidates, sites dropped because they belong to you or a competitor or are on your skip list, service domains removed per category (droppedServiceDomains, with the removed domains), hosts merged into root domains, sites removed by each score filter with a sample, example links found, taken from the cache and counted per link type, hosting platform rows, cache hits, charged events, rate-limit waits and the run status.
Pricing
Pay per event:
- $0.05 once per run, charged when the first live lookup is performed, including a run that delivers no prospect. A run answered fully from the cache does not pay it. Invalid input is not charged.
- $0.045 per lookup request, charged when that lookup is performed: one gap lookup, one domain rank or spam risk lookup, or one example link lookup. The first page of a gap lookup reads 100 sites.
- $0.0002 per row actually read from a live lookup ($0.20 per 1,000). Rows that are not returned are not charged.
- $0.002 per delivered prospect ($2 per 1,000), fresh or from the cache. On paid plans a prospect costs less, down to $0.0012 on Gold and higher.
Cached results pay no lookup requests and no rows read. Invalid input and failed lookups are not charged, and removed service domains and sites on your skip list are never charged as prospects or as rows read.
Examples:
- 3 competitors, at least 2, 100 delivered prospects, example links for the top 50 from 3 competitors: $0.05 plus 3 gap lookups, 2 score lookups and 3 example link lookups at $0.045, 100 delivered sites and 50 example links read, and 100 prospects, $0.64 in total. Sites read and then removed are not in that total.
- Without example links (
exampleLinksForset to 0) the same run is $0.495 in total. - The same analysis again within 7 days, from the cache: 100 prospects, $0.20 in total.
- 3 competitors, all 3, 50 prospects without domain rank or example links: $0.05 plus $0.045, 50 delivered sites and 50 prospects, $0.205 in total.
- 5 competitors, at least 2, 200 delivered prospects, example links for the top 50 from 4 competitors: $0.05 plus 10 gap lookups, 2 score lookups and 4 example link lookups, 200 delivered sites and 50 example links read, and 200 prospects, $1.22 in total.
The spam risk filter is on by default. When it removes many sites, the Actor reads further and each extra page costs one more lookup request. Rows the filter removes are not charged, so a run with strict filters costs more only for the extra pages and for the prospects that remain.
If you set a maximum charge per run, the Actor checks first that it covers the run fee, every planned gap lookup and one prospect. If it does not, the run fails before any lookup and nothing is charged. Otherwise it reads only as many sites as the limit pays for, delivers as many prospects as it can and lists the rest in the summary as skipped. Example links come last: when the limit is close, they are skipped so the prospects can still be delivered.
Run time and limits
A run with 3 competitors and 100 prospects takes a few seconds. Requests to the link index 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, prospects that were already delivered are not charged again.
Apify free plan limit
Users on the Apify free plan get up to 20 prospects per run. Live data needs a paid Apify plan; a free-plan run returns cached results when they exist and does not call the live data source. The run then finishes normally with a status message about the limit, and the run summary names it under freePlanLimit. 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.
- A site that links to you only from a page the index has not crawled yet can still be listed as a prospect. Check the top of the list by hand before you send outreach.
- The domain rank is a link-based rank from the link index this Actor uses, from 0 to 100. It is not the metric of any SEO tool vendor, so it will not match scores you see elsewhere.
- Use the domain each site actually serves. After a domain move, the old domain may still hold most of the links.
- Sites that link to many competitors at once include press release networks and link directories with a high spam risk. The default
maxSpamRiskof 40 removes most of them. Some sites have no spam risk value yet; they are kept. - A competitor's parent company or sister brands are not recognised as the competitor and can show up as prospects. Add them to
excludeDomains(if they also link to you) or toserviceDomains. - The built-in service list covers widely used services. A small or regional service is not on it; add it to
serviceDomains. - Tool directories and aggregator sites that list hundreds of products often link to every competitor. They pass the spam risk filter when their spam risk is low, and some of them are worth a submission. A
minDomainRankof 20 to 30 removes the weakest of them. - The output has no contact details. It lists sites, not people.
API
curl -X POST "https://api.apify.com/v2/acts/datapulsehq~link-gap-finder/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"yourDomain": "crawlee.dev", "competitors": ["scrapy.org", "pptr.dev", "playwright.dev"], "minCompetitors": 2}'
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.