Every link pointing to your competitor is a relationship: a partner, a publisher, a review site, or a customer who cared enough to write about them. That makes a competitor’s backlink profile one of the cheapest, most overlooked sources of B2B leads – the sites linking to them are already active in your market, and many of them would link to (or buy from) you too.
In this guide, you’ll learn how to turn a competitor’s referring domains and brand mentions into a qualified prospect list using the DataForSEO Backlinks API and Content Analysis API. The workflow has five steps:
- Identify your competitors by backlink overlap (optional, if you already know your targets).
- Pull their referring domains, which is your raw prospect list.
- Find the link gap – sites linking to competitors but not to you, the warmest outreach targets.
- Add context – see the actual pages and anchor texts behind each link.
- Mine web mentions – brand citations across the web, including ones without a link.
The same run costs well under $1 (a realistic full pass is about $0.28, see the cost breakdown at the end), and every endpoint responds in seconds.
Before you start
- Create a free DataForSEO account at app.dataforseo.com, there’s no credit card required to start. You’ll find your API login and password under API access in your dashboard.
- All endpoints used here work in Live mode: you send one POST request and get data back immediately, with turnaround of up to 2 seconds on average.
- Pricing is pay-as-you-go: you’re billed $0.024 per request plus $0.000036 per returned row (up to 1,000 rows per request). You pay only for the data you pull – no subscription, no minimums. See the Backlinks API pricing and Content Analysis API pricing pages for details.
- Requests use Basic authentication with your API credentials. Every example below is a simple POST request, so you can run it with any HTTP client or your favourite language. cURL examples are included in each endpoint’s documentation.
Step 1: Identify your competitors
If you already know exactly who you’re up against, skip to Step 2. But if your competitor list is fuzzy, or you suspect you’re missing someone, the Competitors endpoint is the fastest way to map the field. It compares backlink profiles across our entire database and returns the domains that share referring domains with your site.
# Instead of 'login' and 'password', use your credentials from https://app.dataforseo.com/api-access
login="login"
password="password"
cred="$(printf ${login}:${password} | base64)"
curl --location --request POST "https://api.dataforseo.com/v3/backlinks/competitors/live" \
--header "Authorization: Basic ${cred}" \
--header "Content-Type: application/json" \
--data-raw '[
{
"target": "yourdomain.com",
"filters": ["rank", ">", 100],
"order_by": ["intersections", "desc"],
"limit": 100
}
]'
How to read the results: each item is a competing domain with two key numbers. intersections is how many referring domains it shares with you: the higher, the closer the rival. rank is the domain’s authority on a 0-1000 scale (a PageRank-style score based on its backlinks). The rank > 100 filter keeps only meaningful domains (low-rank sites rarely make good lead sources) and large domains like Google or Amazon are excluded automatically.
Pick the top 2-3 competitors from this list and move on to Step 2.
Step 2: Pull your competitor’s referring domains
This is the heart of the workflow. The Referring Domains endpoint returns every domain that links to the competitor you specify, along with the data you need to judge whether it’s worth approaching.
curl --location --request POST "https://api.dataforseo.com/v3/backlinks/referring_domains/live" \
--header "Authorization: Basic ${cred}" \
--header "Content-Type: application/json" \
--data-raw '[
{
"target": "competitor.com",
"filters": ["backlinks_spam_score", "<", 30],
"order_by": ["rank", "desc"],
"limit": 1000
}
]'
What you get back: one item per referring domain, each with the following fields.
domain: the prospect itself: a site that has already shown interest in your market by linking to a competitor.rank: the domain's authority (0–1000 scale). High-rank referring domains are established publishers, partners, or platforms, which are your prime outreach targets.backlinks_spam_score: how "spammy" the domain's own backlink profile is (0–100). The filter above keeps this under 30, which removes most junk before it ever reaches your list.first_seen: when our crawler first found the link. A recently discovered link often means a freshly published page and a contact who is still active.referring_pagesandbacklinks: how many pages and links point from this domain to the competitor. A single editorial mention reads very differently from thousands of sitewide links.
The rank, desc sorting puts the strongest prospects first, and limit: 1000 pulls the maximum per request.
Need more? Repeat the request with an increasing offset (1000, 2000, …) to page through the full list. Remember you're billed per returned row, so filtering aggressively here both cleans the list and cuts the cost.
Repeat this request for each competitor from Step 1, and you have your raw prospect list.
Step 3: Find the link gap
Not every referring domain is equally worth approaching. The best prospects are the ones that link to your competitors but not to you: they clearly cover or partner with businesses like yours, and your pitch is news to them.
This is exactly what the Domain Intersection endpoint is built for, it's the engine behind every "link gap" feature you've seen in SEO tools. You list your competitors as targets and your own domain in exclude_targets, and get back only the domains that link to them but not to you.
curl --location --request POST "https://api.dataforseo.com/v3/backlinks/domain_intersection/live" \
--header "Authorization: Basic ${cred}" \
--header "Content-Type: application/json" \
--data-raw '[
{
"targets": {
"1": "competitor1.com",
"2": "competitor2.com",
"3": "competitor3.com"
},
"exclude_targets": ["yourdomain.com"],
"order_by": ["1.backlinks", "desc"],
"limit": 1000
}
]'
How to read the results: each row is one referring domain, with a separate data block per competitor showing how many links it gives them and its rank. Two signals separate the hottest prospects:
- Multiple competitors in one row: a domain linking to two or three of your rivals at once is deeply involved in your market (an industry publisher, a partner directory, a comparison site). Approach it first.
- High rank: authority you'd actually want pointing at your site.
The link-gap list is usually much shorter than the raw referring-domain lists from Step 2 - and every entry on it is a domain that has never linked to you. That's your outreach shortlist.
Step 4: Add context — see the pages behind the links
Before anyone starts outreach, it pays to look at how a prospect actually linked. A single review article is a very different conversation than a sitewide partner badge. The Backlinks endpoint gives you the individual links behind any referring domain:
curl --location --request POST "https://api.dataforseo.com/v3/backlinks/backlinks/live" \
--header "Authorization: Basic ${cred}" \
--header "Content-Type: application/json" \
--data-raw '[
{
"target": "competitor1.com",
"filters": [["domain_from", "=", "prospect.com"]],
"limit": 100
}
]'
What you get back: each item is one link - the exact page it sits on (url_from), the page it points to, the anchor text, and whether it's dofollow. Two quick ways to qualify a prospect:
- Editorial vs boilerplate. A handful of links from articles (
semantic_locationslikearticleormain) means a real editorial relationship - a journalist or blogger you can pitch. Thousands of links from every page of the site means a footer badge or platform widget, which is often a partner you can buy the same way the competitor did. - Anchor text. Anchors containing the competitor's brand or product names signal genuine coverage; generic anchors like "read more" usually mean automated links.
Step 5: Mine web mentions, including ones without a link
Backlinks miss something important: pages that talk about your competitor without linking to them. A forum thread, a review, a comparison that mentions the brand in passing - these are mentions, not links, and the Content Analysis API finds them.
curl --location --request POST "https://api.dataforseo.com/v3/content_analysis/search/live" \
--header "Authorization: Basic ${cred}" \
--header "Content-Type: application/json" \
--data-raw '[
{
"keyword": "Competitor Brand",
"limit": 1000
}
]'
Set keyword to the competitor's brand name. The API searches our content index and returns every page citing it, with the page URL, title, language, country, publication date, and each page's connotation: whether the mention is positive, negative, or neutral.
Why this matters for lead generation:
- Unlinked mentions are ready-made outreach excuses. A site that reviews or discusses products in your space is pre-qualified to hear about yours.
- Negative-mention pages are double leads. A page complaining about a competitor is exactly where you want your product to appear, whether for coverage, or for a well-timed ad.
- Citing domains repeat. Group the results by domain, and the sites that mention your competitor most often are the niche media of your market.
Step 6: Score the list and put it to work
You now have a merged list of prospect domains from Steps 2, 3 and 5. Before it goes to sales, give every domain two final scores (in bulk, with one request per metric). The Bulk Ranks and Bulk Spam Score endpoints accept up to 1000 domains each:
curl --location --request POST "https://api.dataforseo.com/v3/backlinks/bulk_ranks/live" \
--header "Authorization: Basic ${cred}" \
--header "Content-Type: application/json" \
--data-raw '[
{
"targets": ["prospect1.com", "prospect2.com", "prospect3.com"]
}
]'
Swap the URL for bulk_spam_score/live to get spam scores the same way. Sort the final list by rank, drop anything with a spam score above your tolerance, and hand it over.
To move the data into your CRM without code, use our ready-made templates: the "Add backlinks to Google Sheets" Make template or the n8n equivalents in the Template Gallery. Alternatively, pipe the JSON straight into HubSpot, Salesforce, or Pipedrive.
What it costs
Everything above runs on the same pay-as-you-go formula: $0.024 per request + $0.000036 per returned row. A complete run for three competitors looks like this:
| Step | Requests | Rows returned | Cost |
|---|---|---|---|
| 1. Competitors | 1 | 100 | $0.0276 |
| 2. Referring domains | 3 | 3,000 | $0.1320 |
| 3. Link gap | 1 | 1,000 | $0.0600 |
| 4. Link context (top 50 prospects) | 1 | 50 | $0.0258 |
| 5. Brand mentions | 1 | 1,000 | $0.0600 |
| 6. Bulk scoring | 2 | 200 | $0.0312 |
| Total | 9 | 5,350 | ≈ $0.34 |
A full prospect list for a few cents. Filters reduce the row count and the bill and you only pay for what comes back.