Intent Labeler

What does this search results page actually want?

Intent Labeler reads Google's top ten the way a good editor does. It groups the results by what the searcher is after, names the form each group expects, and measures how long the winning pages are. A language model does the grouping. Plain code does every number.

Google, United States: standing desk

The model groups. The code counts.

Most tools ask a model "what is the intent and how long should the article be?" and print whatever comes back. That is how you get confident percentages nobody computed. Here the work is split on purpose.

The model reads

Titles, snippets, the phrases Google highlighted and a 400-character digest of each page: its headings and first paragraphs. It returns groups of result IDs, a name for each searcher goal, and the form that answers it. It never sees a number and never writes one.

The code counts

How many results each intent covers. How the results divide when one page serves two goals: half to each, so shares add up to 100%. Estimated traffic per intent. Word and character lengths of the pages that win. Tables, lists, videos and calculators found in the HTML.

When the numbers cannot support a conclusion, it says so. Two pages is not a sample, and a 64-character page next to a 500,000-character legal act has no meaningful median. You get no length and the reason, not a number to trust.

What you get for a query

Intents
Named from the results, not picked from a list. No fixed count.
Form per intent
"Shop category listing", "day-by-day recipe", "mortgage calculator". Named freely.
Coverage and share
How many results address the intent, and how the results divide between intents.
Traffic share
From estimated traffic per URL. A page the database does not know is left out, never counted as zero.
Reference length
Words and characters of the dominant intent's pages, or no number and the reason.
Content form on pages
Which share of the winning pages use tables, numbered lists, video, FAQ or a calculator.
Warnings
Mixed results page, several big intents, traffic disagreeing with the result count, and "this query does not want an article".

Sixteen live queries, six markets

Run on 30 September 2026 against Google's top ten in Poland, the United States, the United Kingdom, Germany, Italy and France. Each one is labeled by seven low-cost models on the same data, so you can compare them. The same topic, sourdough starter, appears in four languages. Each report is the full output: charts, every result and the numbers behind them.

Try it with your own keys

You need an OpenRouter key - the model always runs through OpenRouter, so you can pick any of the low-cost models below with one key. For live Google results and page reading you also need a DataForSEO account (affiliate link); without it, paste results yourself.

Where the results come from

The API password is in your DataForSEO dashboard under API access; it is not your account password. New DataForSEO accounts get a small free credit, enough for many runs.

Shows what is left on your DataForSEO and OpenRouter accounts. Refreshed after every run.

Run the full version

The command line tool fetches every page, reads a digest of each, counts tables and videos, estimates traffic, and writes an HTML report like the examples above. It needs an OpenAI-compatible model endpoint, and DataForSEO for live Google results.

git clone https://github.com/romek-rozen/intent-labeler.git
cd intent-labeler
pip install -e '.[api,extract]'
cp .env.example .env    # add your model key and DataForSEO login
intent-labeler --keyword "standing desk" --language en --location 2840

It also runs as an HTTP API for your own panel, and on any list of URLs or uploaded HTML files instead of a search. The method, with the measurement behind every rule, is in METHOD.md.

No code at all: two n8n templates run the same method - keywords from a Google Sheet with results written back, or one keyword per webhook call with a JSON answer. Import the file into your n8n (affiliate link) and add your DataForSEO and OpenRouter keys. The Google Sheets version is in the n8n template library; more on the n8n creator page.