ranked_keywords
List the Google organic keywords a domain already ranks for — organic and on-page position, monthly search volume, CPC, competition, estimated traffic…
Cost: 65 credits.
ranked_keywords lists the Google organic keywords a domain already ranks for — each with its position, monthly search volume, CPC, competition, estimated traffic, the exact URL that ranks and that page's SERP title — under a one-screen summary of the whole domain's organic footprint. It is powered by DataForSEO Labs and 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 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.
You get a domain summary first, before any keyword rows: how many organic results the domain appears in, how those are spread across all twelve position bands from #1 to #100, its estimated monthly organic traffic, what the same traffic would cost as ads, and how many rankings are new, up, down or gone since DataForSEO last checked. It answers "how is this domain doing" without reading a single row.
Then one row per ranked keyword:
- Keyword — the query the domain ranks for.
- Position — its rank among the organic results. When a SERP feature (a featured snippet, an answer box, an ad block) sits above it, the reply also gives the rank on the page —
position #3 organic (#4 on the page). Those are two different numbers in the same response: the first is what stays comparable over time, the second is how far a reader actually scrolls. When they agree, only one is printed. - Search volume — average monthly Google searches for that keyword. 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.
- CPC and competition — the advertiser bid and the HIGH/MEDIUM/LOW band. They come with this lookup, so you do not need a separate
research_keywordscall to get them for a keyword you already rank for. - Difficulty and intent — how hard the keyword is to rank for (0–100) and what searchers want from it. The same two figures
research_keywordsreports, in the same words, without a second call. - Estimated traffic — DataForSEO's estimate of the monthly visits this ranking earns. Usually a sharper priority signal than position and volume read separately.
- URL and title — the page that holds the ranking, and the title it shows in the SERP.
When there is more to say about the result page, a second indented line follows the row:
- Movement — whether the ranking is new, moved up or moved down since DataForSEO's previous check, and where it was. This is what makes the tool a change report rather than a snapshot: run it on a schedule and the movement lines are the story.
- What else is on that SERP — the other element types Google showed,
ai_overviewincluded. It is the direct explanation of the organic/on-page position gap above, naming what sits between your result and the top of the page. - A verify link — Google, at the exact locale DataForSEO measured. You cannot rebuild it from the keyword alone, and the locale is usually what a surprising result turns on.
Position, search volume and the URL are always stated, as n/a when the vendor sent nothing — they are the row's spine, and a row that quietly lost its position would read as a shorter row rather than as a missing measurement. Everything else above is omitted when DataForSEO did not send it, so a row with nothing extra to say stays a single line. A dated line under the table says when the vendor last refreshed the CPC and competition figures, and says so in a sentence once that is over a month old.
Only organic results are counted — paid placements are excluded. The header line says how many rows you got, which ordering you got them in, and — when the domain ranks for more than the limit you asked for — how many it ranks for in total, so a truncated list never reads like the whole picture.
Who can run it
ranked_keywords 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 "ranked-keyword lookups 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:
What keywords does competitor.com rank for?
Or narrow it down:
Show me the top 50 keywords example.com ranks for.
"Top" is a real instruction here: DataForSEO orders the domain's whole keyword set before returning the first limit of them. By default that ordering is highest search volume first; pass sort to get traffic (highest estimated traffic first) or position (best ranking first) instead.
Which of example.com's rankings bring the most traffic?
Input
| Field | Type | Required | Description |
|---|---|---|---|
target | string | No | The domain to look up, 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 ranked keywords to return (1–1000, default 100). The header always names the domain's FULL ranked keyword count, so raise this deliberately when the total says there is more worth reading. |
sort | string | No | How DataForSEO orders the domain's keywords before returning the first limit of them: 'volume' = highest monthly search volume first (default), 'traffic' = highest estimated monthly traffic first, 'position' = best ranking first. |
language_code | string | No | Language code (default 'en'). |
location_code | integer | No | DataForSEO location code (default 2840 = United States). |
Returns
A summary of the domain's organic footprint — organic results it appears in, all twelve position bands from #1 to #100, estimated monthly organic traffic, the paid-equivalent traffic cost, and how many rankings are new, up, down or gone since DataForSEO's previous check — followed by one row per ranked keyword: keyword, organic position (and the on-page position when a SERP feature outranks it), search volume, CPC, competition, difficulty, intent, estimated traffic, the ranking URL and its SERP title, plus a second line carrying how the ranking moved, which other element types share that SERP (ai_overview among them) and a link to check Google yourself. Position, volume and the URL are stated as n/a when the vendor sent none; the added fields are left out.
The whole-domain summary names the DataForSEO measurement it was read from, and carries a note saying that DataForSEO measures these separately — so a different total for the same domain in another SeoGrep tool is a second measurement, not a contradiction.
The header says how many of the domain's ranked keywords are shown, in which ordering, and out of how many in total — and how many returned rows carried no keyword at all and were dropped, so a short table is never mistaken for a complete one; when you looked the site up by project_id, it names that project. A dated line under the table says when the vendor last refreshed the CPC and competition figures. A domain with no organic rankings on record is reported as such — with the summary still shown, because "no rows came back" and "this domain ranks for nothing" are different findings.
limit defaults to 100, not the 1,000-row maximum: DataForSEO charges per row, and a thousand bullet lines costs you more and reads worse. The header always names the domain's full ranked-keyword count, so you can see when raising it is worth it.
Rankings are read for the United States in English unless you pass location_code and language_code. When a lookup left on that default comes back thin AND the domain carries a country-code TLD, the reply says so and names the TLD — it does not guess the matching location code, because a wrong code returns another country's rankings that look perfectly ordinary. Two-letter TLDs that are delegated to a country but sold worldwide (.io, .ai, .co, .me, .tv and the like) are deliberately not called country-code TLDs, because for almost every site using one that would be advice about the wrong country.
An input that is not a public domain, 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.
my_pages
List the pages of a domain that DataForSEO Labs reports ranking figures for, and compare them against the pages your own last crawl fetched. Each page…
analyze_backlinks
Analyze a domain's backlink profile — total backlinks, referring domains, dofollow-only share, spam score, plus the top referring domains and anchor…