backlink_details
List a site's individual backlinks — who links, from which page, to which page of the site, with what anchor — plus the site's own pages ranked by the…
Cost: 35 credits.
backlink_details lists a site's individual backlinks — who links, from which page, to which page of the site, and with what anchor — alongside the site's own pages ranked by the links they earned. Where analyze_backlinks gives you the profile and backlink_changes gives you its history, this one gives you the rows underneath both. It works on any public domain, and it is synchronous: both lists come back immediately, with no background job to poll.
What it does
Name the site in one of two ways — pass a target domain, or pass the project_id of one of your own projects and the domain is taken from it. Exactly one of the two: passing both is rejected rather than resolved by precedence, because the two can name different sites and guessing would bill you for a lookup of the one you did not mean. Then choose how much to fetch with limit (individual backlinks, strongest first), offset (how far into the list to start) and page_limit (the site's own pages, most-linked first).
You get two lists, both straight from DataForSEO:
- Individual backlinks — the linking domain and page, the page of yours it points at, the anchor text (or why there is none), whether it is followed, DataForSEO's rank for the link on a 0–1,000 scale, the vendor's spam score for it, the status code of the linked page, and when the link was first and last seen.
- Pages of the site that earn the links — per page, its backlinks, referring domains (and how many of those are nofollow), broken backlinks, rank, the vendor's spam score for the page, and when it was first seen.
Only live backlinks are counted, subdomains are included, and both settings are pinned explicitly rather than left to a default that could move. A figure DataForSEO did not return is printed as n/a, never as a zero.
You are reading a window, and the output says so
This is the one thing to know before reading the output. Both lists are slices of far larger sets, and the gap can be enormous: in DataForSEO's own published example the same response carries a handful of fetched rows and a whole-set count of 42,671,699 backlinks.
So every count in the output names the set it counts. The rows you were sent are described as "N backlinks in this window", printed together with the offset and limit they were fetched under, so you can always tell which slice you are holding. The vendor's whole-set figure is attributed to DataForSEO by name and followed by the sentence that stops the arithmetic: this window is a slice of that set, not a count of it. The two numbers are never joined into a single "N of M" claim, because the moment offset is anything but 0 your rows are not the head of that set.
If DataForSEO does not report a whole-set total, the output says it did not say — not 0, and not the number of rows in your hand.
The spam scores are the vendor's, not ours
Two spam scores appear, and both are DataForSEO's own fields under DataForSEO's own names: backlink_spam_score for one link, backlinks_spam_score for one page. The vendor really does spell them differently, and they are two different measurements on two different objects — so SeoGrep prints them under the vendor's names rather than tidying them into one column that would imply they are comparable.
SeoGrep adds no link-quality verdict of its own. Nothing here is labelled toxic or bad, and nothing tells you to disavow anything: that is a judgement about your site that only you can make, and dressing a vendor number up as our recommendation would be inventing a signal.
Who can run it
backlink_details needs a paid credit balance. It reads live data from a paid third-party provider — two requests per call — so it is not available on trial credits; the refusal arrives before anything is reserved and says outright that you were not charged. Buy any credit pack and it unlocks straight away; your existing credits are untouched and keep working for crawls, audits, reports and Search Console tools.
If live DataForSEO access is unavailable on this deployment, the tool returns a clear "backlink details are not yet enabled on this deployment" message and charges you nothing — no credits are reserved or spent. SeoGrep never returns sample or placeholder rows dressed up as real data.
Example
Ask your MCP client in plain language:
Show me who links to example.com and which of its pages they point at.
Or page further into a big profile:
Give me the next 100 backlinks for my project, starting from number 200.
Input
| Field | Type | Required | Description |
|---|---|---|---|
target | string | No | The domain to list individual backlinks for, e.g. "example.com" or "https://example.com" — any public domain, including a competitor's. Pass this OR project_id, not both. |
project_id | string (uuid) | No | One of your projects (from setup_project / list_projects) — the domain is taken from it. Pass this OR target, not both. |
limit | integer | No | How many individual backlinks to return (1-700, default 50). A display control, NOT a price control: this call costs 35 credits whatever you ask for, and asking for fewer rows costs the same. DataForSEO's own bill is nearly all a flat per-request fee — measured on one profile, 19x the rows cost 13% more. |
offset | integer | No | How many backlinks to skip before the window starts (0-20000, default 0). Page through a large profile by advancing this; the output always states the offset and limit the rows were fetched under. |
page_limit | integer | No | How many of the target's OWN pages to return, most-linked first (1-200, default 20). Same rule as limit: a display control, and asking for fewer rows costs the same. |
Returns
A header naming the site — or, when you passed a project_id, the project it came from — then the backlink list, then the site's own pages, each list under its own caption stating that list's row count, offset and limit, and the vendor's whole-set total for it. A window that came back empty is reported plainly as no backlinks found for the window that was asked for, with the offset and limit named, and you are still charged for the delivered lookup — running off the end of a list is a real answer, not an error.
A target that is not a public domain, a call naming neither target nor project_id (or both), a limit, offset or page_limit outside the allowed range, and a project_id that is not yours are all rejected before anything is charged; while live data is off you get the "not yet enabled" message instead — also free.
Billing
One call is one flat price, charged once. Behind it are two DataForSEO requests — the backlink list and the site's own pages — and if either one fails the whole call fails and you are not charged. A half-built list is never billed.
limit and page_limit are display controls, not price controls. This call costs the same whatever you ask for, and asking for fewer rows saves you nothing: DataForSEO's own bill for this endpoint is nearly all a flat per-request fee — measured on one profile, nineteen times the rows cost thirteen per cent more. What the two ceilings do is hold the worst case inside the margin the flat price was signed against; asking for more than a ceiling is refused before anything is charged. Set them for the reply you want to read.
A reply can be bounded, and it says so when it is. The two lists have their own size budgets, because one oversized answer is an answer a client will not display at all. When rows are cut, the reply prints how many were shown and how many more were fetched in the same window but not printed — and states plainly that those were charged for either way. Ask for a smaller limit, or page through with offset, to read them.
Limitations
Every delivered lookup is recorded: SeoGrep keeps a row saying what was looked up, when, under which settings, and a capped summary of what came back. The Lookups page of your dashboard lists them, so a lookup you paid for an hour ago is still something you can point at.
That record is history, not a live surface. No call here reads a previous run, nothing is refreshed for you, and there is no "new since last time" — so to see the current picture, run it again.
Paging stops at an offset of 20,000, DataForSEO's own documented ceiling for this endpoint. Going deeper needs a continuation token this tool does not use, so on a very large profile you are reading the strongest links rather than every link.
The page list is always the first page of the site's own pages, most-linked first: offset moves through the backlink list only. And a link is only marked broken when DataForSEO flags it as broken — an unmarked link is one the vendor did not flag, which is not the same as one it checked and found healthy.
backlink_changes
See how a site's backlink profile changed over time: new and lost backlinks and referring domains per bucket, plus the profile's own totals and…
disavow_candidates
Find candidate referring domains for a Google disavow file, and return the disavow file's text for you to review. Pass a target domain (any public…