How to Track Google Trends Trending Searches by Country

Uses Google Trends Scraper — Trending Now & Interest Over Time

Short answer: Run the ActorForge Google Trends actor with a list of country codes, schedule it daily with only-new mode, and keep a small pandas history to see what is new each day and what trends in several countries at once.

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

  1. 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.

  2. 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 maxItemsPerGeo at 10 to keep everything, or lower it if you only care about the top few. Leave keywords empty for this workflow: the keyword explore part is separate, rate-limited by Google and not needed to track trending searches.

  3. Turn on only-new mode with a monitor name

    Set onlyNewSinceLastRun to true and give the schedule its own monitorName. 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": []
    }
  4. 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 like 0 * * * * 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.

  5. 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")
    
  6. 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])
    
  7. Act on the rows

    Each row carries topNewsTitle, topNewsUrl and the full newsArticles list, so an editor or marketer can see why a term is trending without opening Google. Sort by approxTraffic to rank within a country, but remember it is Google's bucketed estimate (200+, 2K+, 1M+), not an exact count. trendsUrl is 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:

georankkeywordapproxTrafficapproxTrafficTextstartedAtnewsCounttopNewsTitle
US3slayground20002000+2026-10-20T14:00:00.000Z3The First ‘Slayground’ Trailer Teases Death as a Treat
GB1interest rate200200+2026-10-20T14:10:00.000Z3The Treasury market has been acting weird lately
DE2psg barca500500+2026-10-20T14:10:00.000Z3Fußball: Wird der Champions-League-Knaller verschoben? PSG – Barça
BR2tocantins20002000+2026-10-20T13:30:00.000Z3Os 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 forWhenPricePer 1,000Worked example
Trend resultCharged per Trending Now row (keyword, traffic, start time, picture, news articles)$0.0005$0.5010 countries × 10 trends = $0.05; an hourly 'only new' schedule pays only for trends it hasn't returned before
Keyword exploredCharged per keyword whose interest over time, interest by region and related queries were all fetched (every row for it included)$0.003$35 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 page

Tips and pitfalls

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 result

Related 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…

All guides