compare_competitors
Compare a domain with its competitors on Google organic search — organic SERP counts, all twelve position bands (#1 to #100), estimated monthly organic…
Cost: 90 credits.
compare_competitors puts a domain side by side with its rivals on Google organic search — how many organic result pages each one appears in, where those appearances sit, and what that traffic is worth — powered by DataForSEO Labs. It works on any public domain, so it reads your own site or a competitor's the same way. It is synchronous: the table comes back immediately, with no background job to poll.
What it does
Name the site being compared 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 comparison of the one you did not mean. The competitors are always plain domains — a rival is not one of your projects.
Name up to three competitors yourself — that is the mode that gives a useful comparison. You can instead omit them and let DataForSEO pick the rivals it sees sharing the most organic result pages with your target, which works well for a domain with a broad keyword footprint. On a small or niche site it can pick general-purpose giants such as youtube.com or wikipedia.org: they genuinely share those result pages, but they are not competitors in any sense you can act on. The reply says which of the two happened, and every row is labelled with where it came from — target, found by DataForSEO, or supplied by you — so a discovered rival is never mistaken for one you chose.
Every domain in the table gets the same lines, under the heading Across the whole domain — every keyword that domain ranks for:
- Organic SERPs containing the domain — how many organic result pages the domain appears in. It counts result pages, not keywords.
- Organic SERPs by position — how those appearances distribute across all twelve bands DataForSEO reports, printed on two lines: #1 through #11-20, then #21-30 through #91-100. That is the complete range, so you see a domain's whole ranked presence and not just the part of it near the top.
- Estimated monthly organic traffic (ETV) — DataForSEO's estimate of monthly visits, calculated from click-through rate and search volume. It is an estimate, not measured traffic.
- Estimated monthly cost of the same traffic as paid ads — what buying that organic traffic through ads would be estimated to cost per month.
- Since DataForSEO's previous check — how many rankings are newly ranking, moved up, moved down, or were no longer found. This is the line that says whether a rival is gaining or losing ground, rather than only how big it is today.
A rival found by DataForSEO carries two more things. First, its overlap with your target: how many intersecting keywords the two share, and the average position it holds on those shared keywords — not across its whole keyword set. Second, the same metric lines again under Across the keywords it shares with the target only.
Those two blocks are different numbers for the same rival, which is why each one is printed under its own heading. The whole-domain block is how big the rival is everywhere; the shared block is how it does on the ground you actually compete on. A large rival can appear in tens of thousands of result pages while sharing only a few thousand of them with you. The side-by-side comparison is made on the whole-domain figures, because the shared figures cover a different keyword set for each rival.
The answer ends with the difference, so you do not have to subtract by eye. Under Target vs each competitor, every rival gets one line per measure — organic result pages, estimated monthly traffic, and what that traffic would cost as ads — showing your figure, theirs, and the gap between them. The gap is the competitor's figure minus yours, so a plus means theirs is the larger number. This is where a site that ranks for more keywords than a rival while pulling less valuable traffic shows up as what it is: a minus on one line and a plus on the next.
Two things are deliberately not differenced. A figure DataForSEO did not report is never treated as a zero — the line says the difference is not reported rather than inventing the largest gap in the table out of a missing value. And two figures read from different DataForSEO measurements are not subtracted from each other at all; the line says so and names both measurements, because most of that gap would be the distance between the vendor's own methods rather than between the two domains.
Read the whole-domain rows with their source in view. Each block names the DataForSEO measurement it was read from, and in one table they are not always the same one: on the discovery flow, rivals DataForSEO found carry its competitor-discovery figures while your target may carry its domain-overview figures instead. The two disagree routinely — the same domain's lost-ranking count read 319 under one and 547 under the other. Neither is wrong; they are two measurements, and the source line on each block is what lets you see which you are comparing. Every answer also carries one note saying the same thing about SeoGrep's other tools: a different total elsewhere is a second measurement, not a contradiction.
A competitor you supplied carries neither, because no discovery request is made for it.
Only organic results are counted; paid placements are excluded. A metric DataForSEO has no value for is shown as n/a rather than as a zero, and a domain it holds no organic data for says so plainly.
Who can run it
compare_competitors needs a paid credit balance. It reads live data from a paid third-party provider, 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 trial 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 "competitor comparisons are not yet enabled on this deployment" message and charges you nothing — no credits are reserved or spent. SeoGrep never returns sample or placeholder figures dressed up as real data.
Example
Ask your MCP client in plain language:
How does example.com compare with its competitors?
Or name the rivals yourself:
Compare example.com against first-rival.com and second-rival.com.
Input
| Field | Type | Required | Description |
|---|---|---|---|
target | string | No | The domain to compare, 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. |
competitors | string[] | No | Up to 3 competitor domains to compare the target against — naming them gives the most useful comparison. Omit this to let DataForSEO pick, which works well for domains with a broad keyword footprint but on a small or niche site can return general-purpose giants (youtube.com, wikipedia.org) that share a SERP without being real rivals. |
limit | integer | No | How many rows the competitor-discovery request may return (1–1000, default 10). Only the top 3 rivals are compared, so raising this widens the pool the ranking is drawn from without adding rows to the table. Unused when you pass "competitors": that skips the discovery request entirely. |
language_code | string | No | Language code (default 'en'). |
location_code | integer | No | DataForSEO location code (default 2840 = United States). |
Returns
A heading naming the target — or, when you passed a project_id, the project it came from — the language and location the figures were read for, and where the compared rivals came from; then one block per domain with its metric lines, the target first; then a Target vs each competitor section putting your organic result pages, estimated traffic and paid-equivalent cost beside each rival's, with the gap between them stated (or the reason there is none).
An input that is not a public domain (the target, or any competitor you named), a call naming neither target nor project_id (or both), 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
How many times one comparison reads DataForSEO depends on which mode you used. Letting DataForSEO discover the rivals normally takes a single request — that one response already carries every listed domain's own metrics — while naming the competitors yourself takes one rank-overview request per compared domain, because a rival you chose is not part of any discovery result.
You pay the same either way: it is a flat price, charged once, as a single tool call. If any of those requests fails, the whole call fails and you are not charged — a partial comparison is never billed.
analyze_backlinks
Analyze a domain's backlink profile — total backlinks, referring domains, dofollow-only share, spam score, plus the top referring domains and anchor…
keyword_gap
Find the Google organic keywords a competitor ranks for and your domain does not — each with its monthly search volume, the competitor's position, the…