RankParse

Link Intersect

Find the domains that link to domain A but do not link to domain B.

GET/v1/link-intersect5 creditsAPI key

Returns domains that link to domain_a and do not link to domain_b. Despite the name, this is a link gap: set domain_a to a competitor and domain_b to your own site to get sites that already link to the competitor but have not linked to you. Swapping the two parameters gives a different answer. Data comes from the pre-processed link graph snapshot (see Response format).

To find domains that link to several sites at once, use Domain Overlap. For a ranked, authority-scored version of the "links to them, not to me" question, use Competitor Gap.

Request

Parameters

ParameterTypeRequiredDefaultDescription
domain_astringYesnoneDomain whose linkers you want to see, typically a competitor. Must contain a dot, no scheme or path.
domain_bstringYesnoneDomain whose linkers are excluded, typically your own site. Same format as domain_a.
limitintegerNo100Number of rows to return. Clamped to 1 to 1000. A non-numeric value falls back to 100.

Example

curl "https://api.rankparse.com/v1/link-intersect?domain_a=square.com&domain_b=stripe.com&limit=25" \
  -H "X-API-Key: rp_your_key"
import requests

res = requests.get(
    "https://api.rankparse.com/v1/link-intersect",
    params={"domain_a": "square.com", "domain_b": "stripe.com", "limit": 25},
    headers={"X-API-Key": "rp_your_key"},
    timeout=90,
)
res.raise_for_status()
body = res.json()
print(f"{body['total']} domains link to square.com but not stripe.com")
for row in body["data"]:
    print(row["from_domain"], row["total_links"])
const params = new URLSearchParams({
  domain_a: "square.com",
  domain_b: "stripe.com",
  limit: "25",
});

const res = await fetch(`https://api.rankparse.com/v1/link-intersect?${params}`, {
  headers: { "X-API-Key": "rp_your_key" },
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const { data, total } = await res.json();
console.log(total, data);

Response

{
  "data": [
    { "from_domain": "shopify.com", "total_links": 214 },
    { "from_domain": "producthunt.com", "total_links": 78 }
  ],
  "total": 1860,
  "limit": 25,
  "credits_used": 5,
  "credits_remaining": 995
}

Response fields

Top level:

FieldTypeDescription
dataarrayDomains that link to domain_a but not domain_b, sorted by total_links descending, then domain name. Empty when there are none.
totalintegerCount of all matching domains, independent of limit. 0 when there are no matches.
limitintegerThe limit value you sent, echoed back as received.
credits_usedintegerAlways 5.
credits_remainingintegerYour balance after this call.

This endpoint does not echo domain_a or domain_b in the response.

Each row in data:

FieldTypeDescription
from_domainstringA domain that links to domain_a and not to domain_b.
total_linksintegerNumber of links from this domain to domain_a.

Behavior and limits

  • Credits: 5 per call, charged before the lookup. Server errors are refunded.
  • Caching: results are cached for 30 days per crawl release and per ordered pair of domain_a, domain_b and limit. A cache hit is billed the same as a fresh lookup.
  • Empty results: if every linker of domain_a also links to domain_b (or domain_a has no data), you get 200 with data: [] and total: 0.
  • No scoring: rows are ranked by link count only. Use Competitor Gap for authority-ranked prospects.
  • Rate limit: 60 requests per minute per key. See Rate limiting.

Errors

HTTPCodeWhen
400invalid_domainsdomain_a or domain_b is missing or not a valid domain.
401invalid_api_keyMissing, invalid or revoked API key.
402insufficient_creditsBalance is lower than 5 credits.
402spend_cap_reachedYour monthly spend cap is reached.
429rate_limitedMore than 60 requests in a minute.
503query_timeout, upstream_errorTransient data store problem. Retry after the Retry-After header. Credits are refunded.

See Errors for the full list and the error body format.

MCP tool: get_link_intersect (accepts domain_a and domain_b; described as "domains linking to A but not B").

On this page