Tools Reference

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…

Cost: 45 credits.

keyword_gap lists the Google organic keywords a competitor ranks for and you do not — each with its monthly search volume, the position the competitor holds, and the page holding it — powered by DataForSEO Labs. It works on any public domain, so you can run it for your own site or for one competitor against another. It is synchronous: the list comes back immediately, with no background job to poll.

What it does

Name your side in one of two ways — pass a target domain (a bare host or a full URL — it is canonicalized for you), 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 name one competitor — the rival to mine. Naming the target as its own competitor is rejected before anything is charged: a domain has no gap against itself.

Each row carries:

  • Keyword — the query the competitor ranks for.
  • Search volume — average monthly Google searches, and the order the list is sorted in, biggest opportunity first. About these search volumes: they are Google Keyword Planner figures, passed through from DataForSEO unchanged. Each one is a 12-MONTH AVERAGE for the keyword AND ITS CLOSE VARIANTS, and Google ROUNDS it — so a volume here is not a count of exact-match searches in the month just gone, two keywords can share a figure only because both were rounded onto it, and volumes added up across rows or across locations will not come out exact. Because the figures are rounded, many rows land on the SAME volume: sorting by it groups the list into bands rather than ranking it, and the order of rows sharing one figure carries no meaning — do not read a row above another as the stronger keyword when both print the same volume.
  • The competitor's position — where the rival ranks in the organic results.
  • Keyword difficulty — how hard the keyword is to rank for, on a 0–100 scale.
  • CPC and competition band — what advertisers pay for the same query, when DataForSEO has a figure.
  • The ranking page — the competitor URL that holds the position, and DataForSEO's estimate of the monthly visits it earns.

Only organic results are counted; paid placements are excluded. A metric DataForSEO has no value for is left out of the row rather than printed as a zero — with one exception: search volume, the axis the list is ordered by, is always stated, and shows n/a when the vendor holds no figure. Dropping it would silently move a row up or down an ordering the reader is trusting, and "nobody has a number for this" is not "nobody searches this".

There is no "your position" column, and there cannot be

A keyword appears in this list precisely because your domain does not rank for it, so DataForSEO returns no ranking of yours to print. That absence is the result, not a missing measurement — which is why the tool does not render an empty column that would read as "we could not find your position". If you want the keywords you and a rival both rank for, that is a different question and a different tool: compare_competitors for the side-by-side picture, ranked_keywords for everything one domain ranks for.

Who can run it

keyword_gap 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 "keyword gap analysis is 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:

What does competitor.com rank for that example.com doesn't?

Or keep it short:

Show me the top 25 keyword gaps between my project and rival.com.

Input

FieldTypeRequiredDescription
targetstringNoThe domain to analyse for keyword gaps, e.g. "example.com" or "https://example.com" — any public domain, including a competitor's. Pass this OR project_id, not both.
project_idstring (uuid)NoOne of your projects (from setup_project / list_projects) — the domain is taken from it. Pass this OR target, not both.
competitorstringYesThe rival to mine for gaps, e.g. "competitor.com" — the keywords it ranks for and your domain does not. One competitor per call.
limitintegerNoHow many gap keywords to return (1–1000, default 100), highest search volume first. Whenever DataForSEO sends a count of the whole set, the header states it — as "N of M", or as a note that this list is all of them — and when the vendor sends no count the header says that too, so a shorter list never reads like the whole picture.
language_codestringNoLanguage code (default 'en').
location_codeintegerNoDataForSEO location code (default 2840 = United States).

Returns

A header naming your side — or, when you passed a project_id, the project it came from — the competitor, the language and location the rankings were read for, and how many of the total gap keywords are shown; then one block per keyword. A rival you already match on every keyword is reported as no gap found, plainly, and you are still charged for the delivered analysis.

An input that is not a public domain (the target or the competitor), a call naming neither target nor project_id (or both), a competitor equal to the target, 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 gap is one DataForSEO request, charged once, as a single tool call. If it fails, the whole call fails and you are not charged — a half-built list is never billed. Rankings are read for the United States in English unless you pass location_code and language_code.