If you have ever tried to rank a long keyword list with Google Trends, you have hit the wall: the website compares 5 terms at a time, and every chart rescales its own biggest term to 100. A "60" in one chart and a "60" in another don't mean the same thing.
This post shows how to get around that and put hundreds of keywords (up to 500) on one shared 0–100 scale, with a real input, real output and code. Disclosure: the tool I use is my own Apify Actor, Google Trends Scraper: Bulk Compare 100+ Keywords.
The 5-keyword problem
Say you want to know which of 20 coffee drinks people search for most. On the Google Trends website you run 4 comparisons of 5. In each one, the top term becomes 100 and everything else is relative to it. So:
- You can't compare "matcha" from chart 1 with "oat milk" from chart 4.
- If one huge term (like "coffee") sits in a chart, everything small next to it rounds down to 0 or 1, because Google reports whole numbers.
The manual workaround is to put one shared keyword in every chart and rescale by hand. It works, but it is slow, and it breaks when the shared keyword is much bigger or smaller than the others.
How the Actor solves it
It does the linking automatically:
- A quick first pass sorts your keywords by size.
- Keywords are compared in groups of 5. Each group shares one keyword with the next group, so neighbours are always of similar size and small keywords keep their precision.
- Every group is rescaled through its shared keyword, and the single biggest value across all your keywords becomes 100.
The result is one ranked table where a score means the same thing in every row.
If you'd rather measure everything against one reference, such as your brand, set anchorKeyword and that keyword is included in every comparison instead.
Walkthrough
1. The input
This is the input I ran, the same 20 drinks the Actor's input form is prefilled with:
{
"keywords": [
"coffee", "tea", "matcha", "espresso", "latte",
"cold brew", "cappuccino", "green tea", "chai", "iced coffee",
"mocha", "flat white", "french press", "decaf", "oat milk",
"bubble tea", "kombucha", "hot chocolate", "energy drink", "yerba mate"
],
"geo": "",
"timeRange": "today 12-m",
"searchType": "web"
}
The input fields:
| Field | Default | What it does |
|---|---|---|
keywords |
required | 1 to 500 keywords. Duplicates and blank lines are removed. Any language. |
geo |
"" (worldwide) |
Country code, for example US, SA or AE. |
timeRange |
today 12-m |
now 1-H, now 7-d, today 3-m, today 12-m, today 5-y, all (since 2004) and more. |
customTimeRange |
none | For example 2024-01-01 2024-06-30. Overrides timeRange. |
searchType |
web |
web, youtube, news, images or shopping. |
category |
0 (all) |
Limit to one Google category. |
anchorKeyword |
none | Put one keyword (your brand, say) in every comparison. |
includeRelated |
false |
Top and rising related searches per keyword. |
includeRegions |
false |
Interest by country, or by region inside the chosen country. |
language |
en |
Language for related searches and place names, for example ar. |
2. The output
Here is the ranked table from that run (worldwide, past 12 months, run on October 18, 2026). averageScore is the keyword's average over the period on the shared scale:
| Rank | Keyword | averageScore | trend | change3m | change12m |
|---|---|---|---|---|---|
| 1 | coffee | 73.9 | rising | −7% | +16% |
| 2 | tea | 39.1 | flat | −10% | +1% |
| 3 | espresso | 9.2 | flat | −7% | +14% |
| 4 | matcha | 8.3 | rising | −9% | +14% |
| 5 | latte | 7.7 | rising | +13% | +14% |
| 6 | chai | 5.5 | rising | +12% | +24% |
| 7 | green tea | 3.6 | flat | −21% | −1% |
| 8 | energy drink | 2.6 | rising | −4% | +15% |
| 9 | mocha | 2.0 | flat | +10% | +1% |
| 10 | cold brew | 1.8 | rising | −21% | +75% |
| … | … | … | … | … | … |
| 20 | yerba mate | 0.5 | rising | −42% | +5% |
Your numbers will differ, because they come from Google at run time.
Notice that "yerba mate" gets a usable 0.5 even though "coffee" is about 150 times bigger. In a single 5-term chart next to "coffee", it would round to 0 or 1.
Each dataset row looks like this (a real row from a separate US run on October 20, 2026, with the weekly timeline shortened):
{
"keyword": "matcha",
"rank": 4,
"averageScore": 6.1,
"peakScore": 8,
"peakDate": "2026-04-05",
"latestScore": 5,
"change3m": -31,
"change12m": 18,
"trend": "rising",
"peakMonth": null,
"breakout": false,
"lowVolume": false,
"noData": false,
"timeline": [
{ "date": "2025-10-19", "score": 4 },
{ "date": "2025-10-26", "score": 4 }
],
"searchType": "web",
"geo": "US",
"timeRange": "today 12-m",
"anchorKeyword": null
}
What the fields mean:
-
trendisrising,falling,flatorseasonal. It describes the whole period, whilechange3monly looks at the last 3 months, so they can point in different directions (cold brew above: rising over the year, down 21% over 3 months). -
peakMonthis filled for ranges of 2 years or more. -
breakoutis true when the last few points are more than double the keyword's average. -
lowVolumeis true when Google rounds a keyword to 0 or 1, so its exact size is uncertain. Compare it again in a list of similar-sized keywords. -
noData: truemeans Google has no data for that keyword. These keywords aren't charged.
The run also saves a SUMMARY record in the key-value store with the ranked table and one sentence. For the 20-drink run it was:
Top by interest: coffee (73.9), tea (39.1), espresso (9.2). Fastest rising over 3 months: hot chocolate (+28%), latte (+13%), chai (+12%).
That's short enough to paste straight into an LLM prompt or a Slack message.
3. What 500 keywords looks like
I also ran a 500-keyword list (worldwide, past 12 months): broad terms like "chatgpt", "iphone" and "coffee" plus long-tail variants like "lipstick deals". It finished in about 7 minutes. Every keyword came back on the same scale, from 71.1 for "chatgpt" at the top down to 0.00033 for "lipstick deals" at rank 500. On the Google Trends website, anything below 1 in a chart just shows as 0, so you couldn't rank those long-tail terms against each other.
Run it from code
Python (pip install apify-client):
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
keywords = [line.strip() for line in open("keywords.txt") if line.strip()] # up to 500
run = client.actor("s3nafps/google-trends-bulk-compare").call(run_input={
"keywords": keywords,
"geo": "US",
"timeRange": "today 12-m",
"searchType": "web",
})
rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())
for row in rows[:20]:
print(row["rank"], row["keyword"], row["averageScore"], row["trend"], row["change3m"])
summary = client.key_value_store(run["defaultKeyValueStoreId"]).get_record("SUMMARY")
print(summary["value"]["text"])
To get a spreadsheet, export the dataset as CSV or Excel from the run's Output tab, or with pandas:
import pandas as pd
df = pd.DataFrame(rows).drop(columns=["timeline"])
df.to_csv("trends_ranked.csv", index=False)
You can also run it from n8n, Make or Zapier with the Apify "Run Actor" node, or give it to an AI agent through MCP at https://mcp.apify.com/?actors=s3nafps/google-trends-bulk-compare.
Use cases
-
SEO keyword research: rank 50–500 keyword ideas by real search interest before you write a page, and use
lowVolumeto spot terms that are too small to bother with. -
Content planning: find the topics with positive
change3m/change12mor abreakoutflag, and usepeakMonth(with a 2-year+ range) to time seasonal posts. -
Market research: compare the same product list across countries by changing
geo, or setsearchTypetoshopping(Google Shopping) oryoutubeto see product demand. AddincludeRegionsto see where interest is concentrated. -
Brand tracking: set your brand as
anchorKeyword, add competitors, and schedule a weekly run.
Pricing
Pay per keyword, checked today on the Store:
- $0.002 per keyword compared on the Free and Bronze plans (Silver $0.0018, Gold and above $0.0015).
- $0.00005 start fee per run.
- Related searches and regions are included at no extra cost.
- Keywords that fail, can't be linked to the shared scale, or have no data aren't charged.
That's about $0.20 for 100 keywords and $1.00 for 500 on the free plan.
FAQ
Why don't my scores match the Google Trends website?
On the website, each chart scales its own biggest term to 100. Here, the biggest term across all your keywords is 100. If you compare the same 5 keywords on their own, the ratios between them match the website.
How long does a run take?
A 100-keyword run usually takes 1 to 3 minutes. My 500-keyword run took about 7 minutes.
Why did one keyword get an error instead of a score?
A keyword more than about 200 times bigger or smaller than everything it was compared with shows as 0 on Google and can't be linked to the scale. The Actor keeps the biggest set of keywords it can link, reports the outlier with an error and doesn't charge for it. Compare it in a separate list of similar-sized keywords.
Which countries and languages work?
Every country Google Trends supports, and keywords in any language, including Arabic.
Can I schedule it?
Yes. Use Apify Schedules to run the same list daily or weekly, and connect a webhook, Google Sheets or Slack to get the new ranking automatically.
Is it allowed?
The Actor only reads public, aggregated Google Trends data, with no personal data. Check that your use complies with Google's terms and the laws that apply to you.
Try it
Google Trends Scraper: Bulk Compare 100+ Keywords on the Apify Store. The input form is prefilled with the 20 drinks above, so you can see a full ranked table for about $0.04.
If a keyword list gives odd results, open an issue on the Actor page with the input so I can look at it.
Top comments (0)