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…
Cost: 40 credits.
disavow_candidates finds the referring domains behind a site's worst-scoring live backlinks and hands you the text of a Google disavow file built from them. It is a proposal you review — SeoGrep does not submit disavow files to Google, and sends nothing anywhere. It works on any public domain and is synchronous: everything comes 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. Then set min_backlink_spam_score — see the next section, it has no default and the tool will not run without it — and optionally narrow to followed links with dofollow_only.
Behind one call are three DataForSEO Backlinks requests:
- the site's live backlinks, filtered by DataForSEO on its own
backlink_spam_scoreat the threshold you set, worst first — that window is what everything else is derived from; - DataForSEO's per-domain
spam_scorefor the linking domains that window named (itsbulk_spam_scoreendpoint). This is a different field on a different endpoint from the per-link score above, and the output keeps them apart; - the site's referring networks — the IP subnets its links sit in, a separate axis on which a link network shows up.
The candidate list is ordered by that per-domain spam_score, highest first. A domain DataForSEO returned no score for sorts last and is printed as unreported — never as a zero, because a silence is not a clean bill of health. Ties break on the domain name.
It proposes. It never submits.
This is the one thing to know before you use the output. The disavow text is returned to your conversation as text. There is no submission path in SeoGrep — no Search Console call, no upload, no "apply" button, not behind a flag. Uploading a disavow file is a decision with consequences for a site's link profile, so it stays with the human: if you decide to go ahead, you upload it yourself in Google Search Console.
The refusal is printed in the output and carried in the file's own first lines, so it does not get separated from the file when you copy it out.
The threshold is yours, and it is required
min_backlink_spam_score has no default, and the call is rejected without it.
That is deliberate. DataForSEO publishes a 0–100 spam score for a link but publishes no cut-off — there is no vendor-recommended "spammy above this" line, and Google publishes none either. Any number SeoGrep filled in for you would be our opinion about what counts as spam, arriving with the authority of a product default, on a page whose output is a list of other people's domains. So the tool asks you for the number instead, and repeats the one you chose in the output, next to the count of rows it examined.
A threshold of 0 means no threshold at all: every live backlink enters the window.
Whose numbers these are
Every score in the output is a DataForSEO field printed under DataForSEO's own name, and the vendor really does spell it three different ways because it measures three different things: backlink_spam_score for one link, spam_score for one referring domain, backlinks_spam_score for one network. SeoGrep does not merge them into a score of its own, and there is no "toxicity", no risk level and no ranking of our making anywhere in the output.
"Candidate" means one thing only: DataForSEO's score met the threshold you set. It is not a finding that these links are hurting the site, and neither DataForSEO nor SeoGrep can tell you what Google makes of any of them. Disavowing links that were fine costs you whatever value they were passing — which is why the output tells you to read every line, and why nothing here is applied for you.
Example
Ask your MCP client in plain language:
Find disavow candidates for example.com, counting links DataForSEO scores 60 or worse.
Or narrow it to followed links on one of your projects:
For my project, list disavow candidates from dofollow links scoring 75 and above.
Input
| Field | Type | Required | Description |
|---|---|---|---|
target | string | No | The domain to find disavow candidates 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. |
min_backlink_spam_score | integer | Yes | REQUIRED, and deliberately with no default: the DataForSEO backlink_spam_score a link must reach to enter the window (0-100, the vendor's own scale). This cut-off is YOUR judgement: DataForSEO publishes the score but no threshold, so SeoGrep will not supply one — a default here would be an invented number wearing a recommendation's clothes. 0 means no threshold at all. The output repeats the number you chose. |
dofollow_only | boolean | No | Keep only links DataForSEO marks dofollow (default false — no filter). A narrower window for the same price; it does not change what any score means. |
limit | integer | No | How many filtered backlinks to examine (1-300, default 100). A display control, NOT a price control: this call costs 40 credits whatever you ask for, and asking for fewer rows costs the same. DataForSEO's own bill for this lookup is nearly all flat per-request fees — three of them, one per endpoint — and rows are charged in ten-thousandths of a cent: measured on the same vendor endpoint this tool reads, 19x the rows cost 13% more. The candidate domains are derived from exactly these rows, so a narrower window buys less and saves nothing. |
network_limit | integer | No | How many referring NETWORKS (IP subnets) to return (1-50, default 20). Same rule as limit: a display control, and asking for fewer rows costs the same. A separate axis: several linking domains sitting in one subnet is a fact about addresses, not a verdict. |
Returns
A header naming the site — or, when you passed a project_id, the project it came from — then the refusal, then a plain statement of how the list was built: the threshold you chose, whether nofollowed links were kept, and which vendor field ordered which list. After that the filtered backlinks you were billed for, each with its own vendor score; the candidate referring domains; the referring networks; the disavow file text; and the note naming all three vendor fields.
Every candidate carries both vendor scores, each labelled with the level it describes: DataForSEO's per-domain score, and the worst per-link score in this window. They are not blended into one number, because they are two measurements from two endpoints and they disagree routinely — real rows scored 0 and 1 per domain beside domains whose worst link scored 60, and the printed number was the wrong one for the decision on that line. The row also names how many links in this window it accounted for, how many of those DataForSEO marked dofollow, and one example from → to pair.
A candidate whose links are none of them marked dofollow is marked, never removed: the line says so, because Google does not count a nofollowed link and disavowing that domain may change nothing. It stays in the list because which links are worth naming is your judgement, and dropping rows would hide candidates you paid to see. The wording is careful: "none is marked dofollow" is what was measured — a link the vendor never marked either way is not a link the vendor called nofollow. Both score levels and this marking are repeated as comment lines above each entry inside the file itself, so they survive the file leaving this conversation.
Both vendor lists are captioned as windows — the rows you got, the offset and limit they were fetched under, and DataForSEO's whole-set count attributed to the vendor by name, followed by the sentence that stops the arithmetic: this window is a slice of that set, not a count of it. The candidate list is derived from those rows rather than fetched, so it carries no vendor total at all — only a count of the window and the cap it was built under.
A lookup that matched nothing says so plainly, naming the window and the threshold it asked for, and you are still charged for the delivered lookup — "nothing above your cut-off in these rows" 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 missing or out-of-range min_backlink_spam_score, a limit or network_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 a "not yet enabled" message instead — also free.
Billing
One call is one flat price, charged once. Behind it are three DataForSEO requests, and if any of them fails the whole call fails and you are not charged — a half-built candidate list is never billed. When the filtered window names no domain at all, the second request is not sent: there would be nothing to ask it about.
disavow_candidates needs a paid credit balance. It reads live data from a paid third-party provider, so it is not available on trial credits, and the refusal 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.
The limit and network_limit ceilings, and the cap on how many candidate domains are scored, are part of the price rather than stylistic limits: DataForSEO bills per returned row, and these caps are what hold the flat price inside the margin it was signed against. Asking for fewer rows costs the same; asking for more than a ceiling is refused before anything is charged.
Limitations
Every delivered lookup is recorded: SeoGrep keeps a row saying what was looked up, when, under which criteria, and a capped summary of the candidates. The Lookups page of your dashboard lists them. The file text itself is deliberately not kept — everything it is derived from is, so it can be rebuilt, but a saved disavow file is a document that would go stale in place while still looking authoritative.
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.
The candidate domains come from the filtered window you paid for, not from the whole link profile: raise limit to examine more rows, and read the window caption for how far the slice sits from DataForSEO's whole-set count. Only live links are counted and subdomains are included, both pinned explicitly rather than left to a vendor default that could move.
The file lists whole domains (domain: entries), never individual URLs: this tool answers at the referring-domain level, and emitting a bare URL would claim a page-level judgement it never made. And the referring-network list is a fact about IP addresses, not a verdict — domains share a subnet for ordinary hosting reasons as well as for link-network ones.
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…
ai_visibility
Measure how a domain or a keyword is mentioned in one AI assistant's answers, from DataForSEO's LLM Mentions data. Pick a subject: "domain" (pass target…