Keyword research with Claude: estimates, then measurements

Keyword research answers three questions: how many people ask this, what they want when they ask it, and who already answers them. Claude can expand a seed into forty terms and tag their intent for free. The volume beside each one is a label until somebody pays a provider for the number.

Module 3 · 5 of 13 · 16 min

This course is independent. It has no affiliation with Anthropic or with AgriciDaniel, who writes claude-seo, and nobody on their side reviewed it. Run with claude-seo v2.4.1 on 2026-10-03.

What you will be able to do

  • Expand one seed into a list of terms with an intent tag on each.
  • Tell an estimated volume from a measured one, and label both in your own notes.
  • Measure a shortlist with your own DataForSEO balance, with the cost on screen first.

Keyword research is three questions wearing one name: how many people ask this, what they want when they ask it, and how good the answer already on the page is. Claude answers the second and third for free, because both of them are readable on a live SERP. The first one lives in a provider's database, and the figure beside a term is an estimate until somebody pays for it. This lesson runs the planning half of claude-seo over one seed, "seo agent", on 2026-10-03, then measures a shortlist of ten terms through seodraft against our own DataForSEO balance. The interesting part is the gap between the two outputs: forty-two variants with relative labels on one side, three measured terms and seven withheld on the other. Everything below is what those two runs returned.

What keyword research answers before anybody writes

A term earns a page when three things line up: people ask it, you can tell what they want, and the pages answering them today are beatable. Demand is a count, intent is a category, and difficulty is a judgement about the ten results already there. Research that reports only the first one sends you to write a long guide for a question people were trying to answer with a pricing page.

Intent is the cheapest of the three to get right and the most expensive to get wrong. Our expansion tagged every variant informational, commercial, transactional or navigational, and the five navigational ones (brand names and vendor login pages) were excluded from the plan on the spot. A term nobody can win is cheaper to drop in the research than in the draft.

Disambiguate the seed before you expand it

A seed with two meanings produces two plans, and the expansion will not tell you which one it chose unless you ask. "seo agent" reads as an AI agent that does SEO work, and also as a human SEO specialist or agency. Our run opened by resolving that: October 2026 SERPs for the seed and its close variants were dominated by the AI-agent sense, with the human-agency sense appearing once, incidentally, inside a comparison article.

The plan then made a decision and wrote it down: cluster around the AI-agent sense, and phrase the pillar as "AI SEO agent" so the phrase carries its own meaning. That rewrite is the useful move. A seed that keeps its ambiguity through the whole plan produces an outline that answers two audiences badly, and the SERP had already voted.

What claude-seo returns with no data provider connected

With no provider connected, the command expands through WebSearch and labels what it cannot count. Ours generated 42 unique variants from the seed: related results, People Also Ask synthesis and modifier expansion across best, free, pricing, comparison, how-to and per-platform shapes. Each variant carries an intent tag and, where it applies, a note saying it was merged into another, deferred as thin, or excluded as navigational.

The volume column is where the honesty shows. The report's limitations section states that no DataForSEO was available, that all volumes are relative estimates labelled est. high, medium or low, and that no number was invented. The pillar is listed with "est. high volume" and no figure anywhere. That label is the correct output for a run that could not measure, and it is also the one people paste into a spreadsheet and forget the provenance of.

An estimate orders a list and a measurement sizes it

A relative label ranks the terms of one run against each other, as one model read one day's search results. It has no unit, so two labels from two sessions do not compare, nothing adds up, and the word "high" means high among these forty-two. A measured figure has a market, a month and a provider behind it, and survives being quoted to somebody who was not in the session.

Both are usable, in different places. Rank your own shortlist with labels, pick what to pay for, and keep the estimate out of any sentence that sounds like a forecast. The habit that makes this work is boring: one column named "estimated" and one named "measured", filled from the two different runs, never merged.

What measuring the same ten terms added

We sent ten terms from the plan to seodraft's add_topics, which measures a whole batch in one call against your own DataForSEO balance. By the public rates its own status tool reports, a batch costs around USD 0.11 whatever the term count, and that figure is shown before the call is made. Seven of the ten were withheld before anything was spent, for competing with another term in the same batch; lesson 6 reads that list, because it is a cannibalization finding wearing a different hat.

Three terms were measured. "seo agent" came back with 27,100 searches a month in the United States, 61 in AI search, and commercial intent. "ai seo agent vs seo tool" and "how to build an ai seo agent" came back with no figure reported. The difference between that first line and the plan's "est. high volume" is the whole lesson: one of them can be defended in a planning meeting.

"Unavailable" is a missing figure, and a zero is a result

A term marked unavailable was asked about and the provider reported nothing for that exact phrase. seodraft keeps the two states apart on purpose: observed means a figure came back, a reported 0 included; unavailable means we paid to ask and got nothing; unmeasured means no paid call has covered it yet. A null volume reads as "no exact-match volume reported", and long-tail questions land there routinely.

That matters because a dash in a spreadsheet becomes a zero by Friday, and a zero kills a topic. Two of our three measured terms were unavailable, and both are questions somebody obviously types. Keep them, write them when the pillar is done, and decide them on the question rather than on the empty cell.

What the research actually cost

Two costs ran in parallel here, and they are charged by different people. The /seo cluster run took 334 seconds over six turns and would equal USD 1.55 at API prices; on a Claude subscription it is drawn from the plan's usage limit instead of billed in dollars. The measurement cost about USD 0.11, charged by DataForSEO to the account whose credentials you connected.

Those are different kinds of spend worth tracking separately. Model time is a fixed subscription most readers already pay for, and provider calls come out of a balance that empties. seodraft shows the estimate before every paid call and reports what it has spent in total and over the last 30 days, which is the part that keeps research from quietly becoming a line item (features/dataforseo).

Decide what to measure, then label what you did not

Pick your shortlist from the terms you would actually write this quarter, measure them in one batch, and write the provenance next to every number before the list leaves your screen. A plan whose columns are labelled survives a handover; one that merged two kinds of figure has to be rebuilt from scratch, and usually is.

Two things are now on your desk and unresolved: the seven terms the batch withheld, and the question of which of your forty variants deserve separate pages at all. Lesson 6 takes both, and it starts with the measurement claude-seo ran on its own groupings: eleven keyword pairs, every one of which landed under its own threshold.

Steps

  1. Step 1

    claude-seo

    Expand one seed into a term list

    Run this inside Claude Code with the runtime from lesson 2 answering. The command does more than expand, and lesson 6 reads the rest of its output; for now the part you want is the top of the report: how it read your seed, the variants it mined and the intent tag beside each one. Give it a seed somebody could search, and nothing about your brand.

    /seo cluster <your seed keyword>

    What you should see

    A disambiguation note, then the expansion. Ours read "seo agent" as the AI-agent sense, generated 42 unique variants through WebSearch, and tagged every one of them informational, commercial, transactional or navigational.

  2. Step 2

    claude-seo

    Ask which numbers were measured

    Paste this as a prompt in the same session, before you copy anything into a spreadsheet. A plan reads as if every column were the same kind of fact, and the volume column usually is the one that is a guess. Asking in writing leaves the answer in the transcript next to the plan.

    For every term in the plan, print the volume figure and say whether it was measured or estimated, with the source of each measured one.

    What you should see

    In a run with no data provider connected, every figure comes back as an estimate. Ours answered that way, and the report's own limitations section says so: volumes are relative labels, est. high, medium or low, and the pillar carries "est. high volume".

  3. Step 3

    seodraft

    Check the balance before you spend it

    `dataforseo_status` is free and reads your own provider account: whether DataForSEO is connected, the balance in US dollars, and what seodraft has already spent out of it in total and over the last 30 days. The credentials are yours, the balance is yours, and seodraft never proxies or resells either.

    Run dataforseo_status and tell me whether my provider is connected and what my balance is.

    What you should see

    A connection flag and a balance in dollars. With nothing connected you get the flag alone, and every measuring tool falls back to storing estimates and says it did.

  4. Step 4

    seodraft

    Measure the shortlist

    `add_topics` sends the whole batch in one call and bills as one batch: around USD 0.11 whatever the term count, and a term already measured in the last 30 days costs nothing. It checks every term against the bank and against the others in the same call before it spends anything, so a batch can come back smaller than you sent it.

    Add these terms to the topic bank with add_topics and show me the cost before you call it.

    What you should see

    Measured volume, AI search volume and intent per term, plus whatever the call withheld. Ours sent 10 terms, kept 3 and measured them: "seo agent" came back with 27,100 searches a month in the US, 61 in AI search, commercial intent.

  5. Step 5

    seodraft

    Read the state of every number

    `list_topics` is free and reports, per number, which of three states it is in: observed, when the provider returned a figure; unavailable, when you paid to ask and it reported nothing for that term; unmeasured, when no paid call has covered it yet. A term whose source still reads estimate was never measured at all.

    Run list_topics and show me each term with its volumeStatus and aiVolumeStatus.

    What you should see

    Three states and no blanks. Two of our three measured terms came back unavailable for volume, which reads as no exact-match volume reported for that phrase, and long-tail questions routinely land there.

Checklist

Tick every line and the lesson marks itself as completed.

Checkpoint

A measured term comes back with volume `unavailable`. How much demand does it have?Show the answer

Unknown, and the term keeps its place on your list. `unavailable` records that the provider was asked and reported nothing for that exact phrase, which happens constantly on long-tail questions people do ask. Two of the three terms we measured landed there. A zero is a reported figure and ranks a term out of the plan; `unavailable` ranks nothing and leaves the decision to your own judgement about the question behind the phrase.

Your plan shows "est. high volume" next to the pillar. What can you decide with that?Show the answer

The order of your own shortlist, and nothing you would defend to somebody paying for the quarter. A relative label compares the terms in that one run against each other, under one model's reading of a SERP it searched that day. It carries no unit, so two labels from two runs cannot be compared and no label can be added up. Measuring our seed turned "est. high volume" into 27,100 a month in one market; the label was right about the ranking and silent about the size.

What this lesson said

  • Keyword research answers three questions: how many people ask, what they want, and how hard the answer already is to beat.
  • A seed gets disambiguated before it gets expanded. Ours, "seo agent", reads as an AI agent on today's SERP, and the plan said so in its first paragraph.
  • claude-seo with no data provider expands and tags intent for free: 42 variants in our run, each one informational, commercial, transactional or navigational, with volumes as relative labels.
  • seodraft's `add_topics` measures a batch against your own DataForSEO balance for about USD 0.11, whatever the term count. Ours returned 27,100 a month in the US and 61 in AI search for "seo agent".
  • A number with no provider behind it is an estimate. Label the column, so the plan reading of it can be audited later.

Questions

Can I do keyword research with Claude and no paid data?
Up to a point, and the point is worth knowing. Claude can read today's SERP, tell you which sense of an ambiguous phrase is winning, expand a seed into dozens of variants and tag the intent of each one, which is most of what a plan needs. What it cannot do is tell you how many people search a term, because that figure lives in a provider's database and nowhere in a page. Our run generated 42 variants and labelled every volume an estimate, in its own words.
Why does seodraft ask me for my own DataForSEO account?
So the data is yours and the price is the provider's. seodraft reads your credentials, spends from your balance, shows the cost before each call and reports what it has spent; it never resells access or marks it up. The practical effect is that a batch of ten terms costs the same as a batch of one, about USD 0.11, so research is cheapest when you think in batches. The /features/dataforseo page covers the setup.
How many terms should I measure at once?
As many as you are willing to write about this quarter, because the batch price does not move with the count. The constraint that bites first is the similarity check inside the call: terms that compete with each other get withheld before anything is measured, and ours withheld seven of ten. Send the distinct questions, read what came back withheld, and decide those by hand in lesson 6.

Next lesson

Topic clusters and cannibalization

How claude-seo groups keywords by SERP overlap, how seodraft withholds a term for resembling another, and what to do when the two answers disagree.

The same lesson, as plain Markdown: /learn/claude-seo/keyword-research-with-claude.md

Back to the course