Backlinks API
The individual links behind the numbers: anchor text, source page, target URL and follow status, with a profile summary alongside them. Served from our own index, which is why it costs what it does.
What you get
One request returns two things: a summary of the domain's link profile, and the individual links that summary was calculated from. That second part is the point — you can check the reasoning rather than take a score on trust.
Backlinks
1 creditUp to 5,000 backlink rows for a domain, plus a link profile summary.
GET https://domdetailer.com/api2/getBacklinks.php?apikey=YOUR_KEY&app=YourApp&domain=example.com
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
apikey |
string | Required | Your account API key. |
app |
string | Required | A short identifier for your integration. |
domain |
string | Required | The target domain. Send a bare hostname. |
onePerDomain |
boolean | Optional | Return at most one link per referring domain. Useful for outreach lists, where a hundred links from one site are one prospect. |
subdomain |
boolean | Optional | Treat the value in domain as a subdomain and query it directly rather than rolling up to the registrable domain. |
Response fields
| Field | Type | Meaning |
|---|---|---|
page_count |
number | Pages of the target in our index. |
links_in |
number | External inbound links observed. |
links_out |
number | External outbound links observed. |
backlinks_follow |
number | Inbound links without a nofollow attribute. |
backlinks_nofollow |
number | Inbound links carrying nofollow. |
nofollow_ratio |
number | Nofollow share as a percentage, 0-100. |
ref_domains |
number | Unique referring domains. |
links_from_edu |
number | Inbound links from .edu domains. |
links_from_gov |
number | Inbound links from .gov domains. |
language_share |
object | Optional. Percentage share per detected language across the referring pages, largest first. Omitted when we have no language data. |
| Field | Type | Meaning |
|---|---|---|
anchor |
string | Visible link text. May be empty, in which case fall back to title. |
title |
string | Title of the page carrying the link. |
nf |
number | 1 when the link is nofollow, 0 when it is not. |
source |
string | URL of the page containing the link. |
target |
string | URL on the target domain being linked to. |
What each metric actually tells you, and which combinations catch a manipulated profile, is covered in the field reference.
Example response
{
"domain": "domdetailer.com",
"metrics": {
"page_count": 364,
"links_in": 504,
"links_out": 2114,
"backlinks_follow": 469,
"backlinks_nofollow": 35,
"nofollow_ratio": 6.9,
"ref_domains": 215,
"links_from_gov": 0,
"links_from_edu": 0
},
"backlinks": [
{
"anchor": "Domdetailer.com",
"title": "Domdetailer.com",
"nf": 1,
"source": "https://bestfew.com/elementor-test/",
"target": "https://domdetailer.com/"
},
{
"anchor": "DomDetailer Homepage",
"title": "https://domdetailer.com/",
"nf": 0,
"source": "https://docu.gsa-online.de/proxy_scraper/url_metrics",
"target": "https://domdetailer.com/"
}
]
}
Code
curl -G https://domdetailer.com/api2/getBacklinks.php \ --data-urlencode "apikey=YOUR_KEY" \ --data-urlencode "app=YourApp" \ --data-urlencode "domain=example.com"
import requests r = requests.get( "https://domdetailer.com/api2/getBacklinks.php", params={ "apikey": "YOUR_KEY", "app": "YourApp", "domain": "example.com", }, timeout=60, ) r.raise_for_status() data = r.json()
const url = new URL("https://domdetailer.com/api2/getBacklinks.php"); Object.entries({ apikey: "YOUR_KEY", app: "YourApp", domain: "example.com", }).forEach(([k, v]) => url.searchParams.set(k, v)); const res = await fetch(url); if (!res.ok) throw new Error(`HTTP ${res.status}`); const data = await res.json();
$qs = http_build_query([
'apikey' => 'YOUR_KEY',
'app' => 'YourApp',
'domain' => 'example.com',
]);
$json = file_get_contents(
'https://domdetailer.com/api2/getBacklinks.php?' . $qs
);
$data = json_decode($json, true);
Using it well
Send bare domains
Pass example.com rather than a full URL. Protocols, a leading www. and any path are stripped for you, but sending them wastes a round trip if the result is not what you expected.
Use onePerDomain for outreach
A hundred links from one site is one relationship, not a hundred prospects. onePerDomain=1 collapses them so 5,000 rows means up to 5,000 distinct referring domains.
Read anchor with a fallback
anchor can legitimately be empty - image links carry no text. Fall back to title before treating it as missing data.
Treat counts as a floor
Our crawl coverage is deep but not total. A Pretty count is a firm lower bound on what exists, not an exact total, and should be read that way when comparing against Majestic.
Cache, and throttle
This endpoint is heavier than domain metrics. Five concurrent requests is a sensible ceiling, and a backlink profile is worth caching for days rather than minutes.
Errors
The same status codes and error slugs as the rest of the API. A failed request is never charged.
| Status | error | When it happens |
|---|---|---|
| 400 | missing_parameter |
A required parameter is absent, or the domain could not be parsed as a hostname. |
| 401 | invalid_api_key |
The key is missing, malformed, or not attached to an account. |
| 402 | not_enough_credits |
The account has no credits left. Nothing was charged. |
| 404 | account_not_found |
The key or email did not match any account. |
| 429 | rate_limited |
Too many requests. The body carries retry_after in seconds - wait that long rather than retrying immediately. |
| 502 | upstream_error |
A data source failed to respond. Safe to retry after a short pause. |
| 500 | server_error |
Something went wrong on our side. If it persists, tell us what you sent. |
Questions
How many backlinks can one request return?
Up to 5,000 rows. For domains with larger profiles, use onePerDomain=1 to get one link per referring domain, which usually tells you more per row than 5,000 links from a handful of sites.
Is the order of the rows meaningful?
No. Row order is not guaranteed and should not be treated as a ranking. Sort on whatever matters to you after you receive them.
Can I page through more than 5,000 links?
Not yet. Paginated link lists are part of the Pretty V2 work described on the dataset page.
Start at 25,000 lookups for $34.
One balance covers the browser tools, the desktop app and the API. Nothing renews, nothing expires, and you can stop using it for six months without losing anything.