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. 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). DataForSEO bills per returned row, so this is the price control, not a display preference. |
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). Billed per row on the same tariff as the backlink list. |
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.
The limit and page_limit ceilings are part of the price rather than stylistic limits: DataForSEO bills per returned row, so the two row caps together are what hold the flat price to the margin it was signed against. Asking for fewer rows costs the same; asking for more than the ceiling is refused before anything is charged.
Limitations
Results are not stored. Each call returns its two lists to the conversation and nothing else keeps them, so there is no backlink-explorer page in the dashboard and no "new since last time" — run it again for a fresh read. The lookup-history table that backs the other domain tools is bound to those tools by design and does not accept this one.
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…
generate_report
Generate a shareable HTML SEO report for a project from its latest crawl and Search Console data, and get a public link to share with clients or…