Google's Trending Now page answers "what is everyone searching for right now?", but only for one country at a time and only while you are looking. If you run content, news or campaigns across several markets, you want that list captured every day, per country, in a format you can sort and compare.
Doing that by hand means visiting the page for each country and copying rows. Unofficial libraries break when Google changes things and leave you to handle storage and deduplication. The Google Trends actor reads Google's official Trending Now RSS feed for any of 125 countries and returns one structured row per trend, with traffic parsed to a number and the news articles attached.
This guide sets up a country list, schedules a daily run, and uses pandas to keep a history, drop repeats and compare today with yesterday.
Step by step
Pick your countries
Decide which markets you want to watch and list their two-letter codes in
geos, for example US, GB, DE, FR and BR. The input offers all 125 countries the official feed accepts; Google answers unknown codes with an error, so pick from that list. Each country is one request, so a long list only adds a second or so per country.Set how many trends to keep per country
The feed currently lists up to about 10 of the newest trends per country, fewer for small countries. Leave
maxItemsPerGeoat 10 to keep everything, or lower it if you only care about the top few. Leavekeywordsempty for this workflow: the keyword explore part is separate, rate-limited by Google and not needed to track trending searches.Turn on only-new mode with a monitor name
Set
onlyNewSinceLastRunto true and give the schedule its ownmonitorName. The actor then remembers what it already returned (per country, keyword and start day) in the key-value store trends-seen-<name> and skips those trends on later runs without charging for them. Use a different monitor name for each schedule so they do not share memory.{ "geos": ["US", "GB", "DE", "FR", "BR"], "maxItemsPerGeo": 10, "onlyNewSinceLastRun": true, "monitorName": "daily-5-markets", "keywords": [] }Schedule a daily run
In Apify Console, save the input above as a task (or use the actor directly) and create a schedule with a cron expression such as
0 7 * * *for 07:00 every day in your chosen timezone. If you need fresher alerts, an hourly expression like0 * * * *works the same way, and only-new mode keeps the cost tied to trends that are genuinely new. Optionally add a webhook on run success to trigger the next step automatically.Collect each run into a history file
After each scheduled run, pull its dataset and append the trend rows to a CSV, stamped with the snapshot date. The dataset can also contain other row types if you ever add keywords, so filter on
type == "trend".import os from datetime import date import pandas as pd from apify_client import ApifyClient client = ApifyClient(os.environ["APIFY_TOKEN"]) # Read the dataset of the most recent finished scheduled run runs = client.actor("actor-forge/google-trends").runs().list(desc=True, limit=1, status="SUCCEEDED").items run = runs[0] rows = list(client.dataset(run["defaultDatasetId"]).iterate_items()) df = pd.DataFrame([r for r in rows if r.get("type") == "trend"]) df["snapshotDate"] = date.today().isoformat() # Append to a local history file path = "trends_history.csv" df.to_csv(path, mode="a", index=False, header=not os.path.exists(path)) print(len(df), "trend rows added")Dedupe and compare days with pandas
Normalize keywords, drop duplicates on country, keyword and start day, then compare the latest snapshot with the one before it. The first output lists trends that are new today per country, the second shows topics trending in more than one country, often the most useful signal for a global team. You need at least two snapshot days in the file before the comparison runs.
import pandas as pd hist = pd.read_csv("trends_history.csv", parse_dates=["startedAt"]) hist["keywordNorm"] = hist["keyword"].str.strip().str.lower() hist["startDay"] = hist["startedAt"].dt.date # One row per country + keyword + start day (the same key the actor uses), # keeping the snapshot in which each trend was first seen hist = hist.sort_values("snapshotDate") dedup = hist.drop_duplicates(subset=["geo", "keywordNorm", "startDay"], keep="first") days = sorted(dedup["snapshotDate"].unique()) today, yesterday = days[-1], days[-2] t = dedup[dedup["snapshotDate"] == today] y = dedup[dedup["snapshotDate"] == yesterday] # Trends first seen today whose keyword did not trend yesterday in that country merged = t.merge(y[["geo", "keywordNorm"]], on=["geo", "keywordNorm"], how="left", indicator=True) new_today = merged[merged["_merge"] == "left_only"] print(new_today[["geo", "rank", "keyword", "approxTraffic", "topNewsTitle"]]) # Topics trending in several countries at once multi = (t.groupby("keywordNorm")["geo"].nunique() .sort_values(ascending=False)) print(multi[multi > 1])Act on the rows
Each row carries
topNewsTitle,topNewsUrland the fullnewsArticleslist, so an editor or marketer can see why a term is trending without opening Google. Sort byapproxTrafficto rank within a country, but remember it is Google's bucketed estimate (200+, 2K+, 1M+), not an exact count.trendsUrlis a link you can open to explore the term further on trends.google.com.
Sample input
{
"geos": [
"US",
"GB",
"DE",
"FR",
"BR"
],
"maxItemsPerGeo": 10,
"onlyNewSinceLastRun": true,
"monitorName": "daily-5-markets",
"keywords": []
}Sample output
Each run returns rows like these, one per trend and country, with traffic as a number and the top news headline:
| geo | rank | keyword | approxTraffic | approxTrafficText | startedAt | newsCount | topNewsTitle |
|---|---|---|---|---|---|---|---|
| US | 3 | slayground | 2000 | 2000+ | 2026-10-20T14:00:00.000Z | 3 | The First ‘Slayground’ Trailer Teases Death as a Treat |
| GB | 1 | interest rate | 200 | 200+ | 2026-10-20T14:10:00.000Z | 3 | The Treasury market has been acting weird lately |
| DE | 2 | psg barca | 500 | 500+ | 2026-10-20T14:10:00.000Z | 3 | Fußball: Wird der Champions-League-Knaller verschoben? PSG – Barça |
| BR | 2 | tocantins | 2000 | 2000+ | 2026-10-20T13:30:00.000Z | 3 | Os números da pesquisa Real Time Big Data para governo do Tocantins no 2º turno |
Run it from code
cURL
curl -X POST "https://api.apify.com/v2/acts/actor-forge~google-trends/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"geos": ["US", "GB", "DE", "FR", "BR"], "maxItemsPerGeo": 10, "onlyNewSinceLastRun": true, "monitorName": "daily-5-markets", "keywords": []}'JavaScript (Node.js)
// Node.js 18+ (built-in fetch). Set APIFY_TOKEN in your environment.
const input = {
"geos": [
"US",
"GB",
"DE",
"FR",
"BR"
],
"maxItemsPerGeo": 10,
"onlyNewSinceLastRun": true,
"monitorName": "daily-5-markets",
"keywords": []
};
const res = await fetch(
"https://api.apify.com/v2/acts/actor-forge~google-trends/run-sync-get-dataset-items",
{
method: "POST",
headers: {
Authorization: `Bearer ${process.env.APIFY_TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify(input),
}
);
const items = await res.json();
console.log(items.length, items[0]);Python
# pip install apify-client (set APIFY_TOKEN in your environment)
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run_input = {
"geos": [
"US",
"GB",
"DE",
"FR",
"BR"
],
"maxItemsPerGeo": 10,
"onlyNewSinceLastRun": True,
"monitorName": "daily-5-markets",
"keywords": []
}
run = client.actor("actor-forge/google-trends").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)The run-sync-get-dataset-items endpoint waits for the run (up to 5 minutes) and returns the dataset rows directly. For longer runs, start the run asynchronously and read the dataset when it finishes, as the Python example does. Replace APIFY_TOKEN with your own token from the Apify console.
What it costs
Trending Now rows cost $0.0005 each, so 5 countries × 10 trends is at most 50 rows or $0.025 per daily run, about $0.75 over 30 days before only-new mode skips repeats. The platform start fee at 256 MB adds $0.0000125 per run.
| Charged for | When | Price | Per 1,000 | Worked example |
|---|---|---|---|---|
| Trend result | Charged per Trending Now row (keyword, traffic, start time, picture, news articles) | $0.0005 | $0.50 | 10 countries × 10 trends = $0.05; an hourly 'only new' schedule pays only for trends it hasn't returned before |
| Keyword explored | Charged per keyword whose interest over time, interest by region and related queries were all fetched (every row for it included) | $0.003 | $3 | 5 keywords = $0.015 for ~90 timeline rows + regions + 50 related queries each; keywords Google rate-limited are free |
| Actor Start (platform start fee) | Charged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event). | $0.00005 | — | One run at 256 MB = $0.0000125 |
Ready to try it? Google Trends Scraper — Trending Now & Interest Over Time runs on Apify, pay per result.
Run on Apify → Read the full actor pageTips and pitfalls
- The feed shows the newest trends only, about 10 per country. It is not the full Trending Now page with its 24 and 48-hour filters, so schedule frequently if you do not want to miss short-lived spikes.
- Traffic values are buckets, not counts. Two trends both at 2000 may differ a lot in reality; use the value to rank, not to forecast volume.
- Keep one
monitorNameper schedule. Reusing a name across an hourly and a daily schedule makes one of them skip trends the other already delivered. - If you later add
keywordsfor interest-over-time data, expect Google to rate-limit that part. Keywords it could not finish are free, and the Trending Now rows are unaffected. - Set a maximum total charge on the run if you are cost-sensitive; the actor stops cleanly at the cap.
FAQ
How often does the Trending Now feed change?
The feed lists the newest trends per country, so its contents shift through the day as new searches spike. A daily run gives a snapshot; an hourly schedule with only-new mode catches more short-lived trends at the same per-row price.
Can I track trending searches for a US state or a city?
Trending Now in this actor is per country, using the two-letter codes in geos. Region-level data (states, cities) is only available in the keyword explore part, via exploreGeo and interest by region.
Why does a small country return fewer than 10 trends?
The official feed lists fewer trends for small countries. The actor returns whatever the feed contains up to maxItemsPerGeo, and you only pay for rows delivered.
Will a trend that lasts two days show up twice?
With only-new mode on, a trend is identified by country, keyword and start day, so the same trend with the same start day is skipped on later runs. The pandas step uses the same key to dedupe your history file.
Actors used in this guide
Google Trends Scraper — Trending Now & Interest Over Time
Google Trends scraper and API: Trending Now searches for 125 countries from the official feed (traffic, start time, picture, news articles), plus…
$0.50 per 1,000 · trend resultRelated guides
How to Monitor Competitor Ads in Google Ads Transparency Center
List your competitors' domains or advertiser names, run the ActorForge Ads Transparency actor daily with only-new mode, and route the new ads into…
How to Check If a Phrase Is Trademarked (USPTO, in Bulk)
Run your phrases through USPTO Trademark Search in contains mode with the classes for your product (25 for clothing, 21 for mugs). Anything marked…