# Google Trending Searches - Trending Now by Country & Alerts (`cedarfetch/google-trending-searches`) Actor

What people are searching for on Google right now, per country or region: query, approximate searches, start time and the news stories behind each trend. Change tracking reports only new trends on scheduled runs. Trending-now only, no interest over time. Not affiliated with Google.

- **URL**: https://apify.com/cedarfetch/google-trending-searches.md
- **Developed by:** [Cedarfetch Labs](https://apify.com/cedarfetch) (community)
- **Features:** Limited permissions
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 trends

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Google Trending Searches - Trending Now by Country & Alerts

**What this Actor does:** it returns the searches that are **trending on Google right now** in the countries and regions you choose: the query, Google's approximate search count, when the trend started, a picture, and the news stories Google links to it. Turn on change tracking and schedule it, and each run reports only the trends that are **new** since the last run.

**What it does not do:** this Actor **does not provide interest over time, related queries, related topics, interest by region or keyword comparison.** Those charts come from Google Trends' explore API, which refuses plain automated requests (in our tests it answered "429 Too Many Requests" to the very first cookie-less request) and only works with browser cookies, tokens and rate-limit workarounds. This Actor uses none of those, so it does not offer that data. If you need interest over time, use an explore-based Google Trends scraper; if you need to know what is trending right now, and what is new since an hour ago, this one is built for it.

The data comes from Google Trends' public trending RSS feed (`trends.google.com/trending/rss?geo=...`), read with plain HTTP requests and an honest User-Agent. No browser, no proxies, no login, no cookies. A run for one country takes about a second. This Actor is independent and **not affiliated with Google**; "Google" and "Google Trends" are trademarks of Google LLC.

### What you can use it for

- **Content and newsjacking**: see what your audience is searching for in the last hour, with the articles driving it, and write or post while it is still rising.
- **E-commerce and ad timing**: catch product, sports and entertainment spikes per country and adjust campaigns, landing pages or stock alerts.
- **Social media scheduling**: feed a posting queue with fresh, country-specific topics.
- **Monitoring a market across countries**: run 10-50 countries in one go, merge duplicates into one row per trend with the list of countries where it trends.
- **Alerts**: schedule every 15-30 minutes with change tracking and send only new trends to Slack, email or a webhook.
- **AI agents and pipelines**: one small, stable JSON shape per trend.

### What you get per trend

| Field | Example | Notes |
|---|---|---|
| `geo`, `geoName` | `US`, `United States` | Country or sub-region you asked for. |
| `rank` | `2` | Position in Google's feed. **1 = the most recently started trend**, not the biggest. Use `sortBy: "traffic"` for biggest first. |
| `query` | `weather chicago` | The trending search, as Google publishes it (usually lowercase). |
| `approxTraffic` | `200` | Google's approximate search count as a **number**: the lower bound of its bucket (`"500+"` becomes `500`, `"200K+"` becomes `200000`). |
| `approxTrafficText` | `200+` | Google's own label. |
| `startedAt` | `2026-11-11T20:30:00.000Z` | When the trend started (ISO 8601, UTC). |
| `trendingForMinutes` | `21` | Minutes since it started (or since this Actor first saw it, if earlier). |
| `pictureUrl`, `pictureSource` | Google-hosted thumbnail, `ABC7 Chicago` | Missing for some trends. |
| `news`, `newsCount` | up to 3 stories | Each with `title`, `url`, `source`, `imageUrl`, `snippet` (Google leaves snippets empty today). |
| `exploreUrl`, `searchUrl`, `trendingPageUrl` | links | Google Trends explore page for the query (to look at interest over time yourself), Google search, and the Trending now page for the geo. |
| `changeType`, `firstSeenAt`, `lastSeenAt`, `peakApproxTraffic`, `previousRank`, `droppedAt` | | With change tracking (below). |
| `geos`, `geoCount` | | With one row per trend across geos (below). |

### Input

Only `geos` is required (default `["US"]`). One entry per line, in any of these forms:

| You type | Read as |
|---|---|
| `US`, `gb`, `JP` | ISO 3166-1 country code, any case |
| `Germany`, `United Kingdom`, `UK`, `USA`, `South Korea` | country name or common alias |
| `US-CA`, `US-NY`, `GB-SCT`, `CA-ON`, `AU-NSW`, `DE-BY` | sub-region (ISO 3166-2); names built in for US states, UK nations, Canadian provinces, Australian states and German states |
| `California`, `Scotland`, `Bavaria` | built-in sub-region name |
| `FR-IDF` or any other `CC-XXX` | passed to Google as is; reported as `unsupported_geo` if Google has no feed for it |

Typos and unknown codes (`XX`, `US-ZZ`, `Atlantis`) are reported per entry in the dataset and the run summary, and cost no request. The other geos still run. Duplicates (`US` and `United States`) are fetched once.

#### Example: three countries, biggest trends first

```json
{
    "geos": ["US", "GB", "DE"],
    "sortBy": "traffic",
    "maxTrendsPerGeo": 5
}
```

#### Example: only trends with 1,000+ searches that mention sports words

```json
{
    "geos": ["US", "CA", "AU"],
    "minApproxTraffic": 1000,
    "keywords": ["nfl", "nba", "vs", "game*", "cup"],
    "keywordScope": "query_and_news"
}
```

#### Example: one row per trend across European markets

```json
{
    "geos": ["GB", "IE", "DE", "AT", "CH", "FR", "BE", "NL", "ES", "IT"],
    "dedupeAcrossGeos": true,
    "includeNews": false
}
```

#### All options

| Field | Default | What it does |
|---|---|---|
| `geos` | `["US"]` | Countries / regions, up to 300 per run. |
| `maxTrendsPerGeo` | 10 | At most this many trends per geo (the feed holds 10). |
| `includeNews` | true | Add the linked news stories. |
| `language` | empty | Optional `hl` code (`en`, `de`, `pt-BR`). In our tests it changed which news stories are attached, not which trends are listed. |
| `sortBy` | `feed` | `feed` = most recently started first (Google's order); `traffic` = highest approximate searches first. Applied before the cap. |
| `minApproxTraffic` | 0 | Keep trends with at least this many approximate searches. |
| `keywords` | none | Keep trends mentioning any of these words. |
| `excludeKeywords` | none | Drop trends mentioning any of these words. |
| `keywordScope` | `query_and_news` | Match keywords in the query and its news headlines, or in the query only. |
| `dedupeAcrossGeos` | false | One row per trend with the list of geos. |
| `trackChanges` | false | Compare with the previous run and label every row. |
| `changesOnly` | false | With tracking on, deliver only new (and dropped) trends. |
| `includeDropped` | true | With tracking on, report trends that left the feed. |
| `snapshotStoreName` | `google-trending-searches-snapshots` | Named key-value store for snapshots. Use different names for independent feeds. |
| `maxRequests` | 100 | Hard cap on requests per run, retries included. |
| `concurrency` | 2 | Feeds fetched at the same time (max 4). |
| `requestDelayMs` | 500 | Pause after each request (min 100). |
| `requestTimeoutSecs` | 30 | Timeout per request. |
| `maxRetries` | 3 | Retries for 429, 5xx and network errors. |

**Keyword matching** is case- and accent-insensitive and works on whole words: `taylor` matches "taylor swift tour" but not "taylormade"; `taylor*` matches both; phrases such as `world cup` work. Keywords written in Chinese, Japanese, Korean or Thai match anywhere in the text, because those languages do not separate words with spaces.

### Output

One row per trend in the default dataset. Download as JSON, CSV, Excel or XML from the Output tab or the API. Views: **Trends**, **News behind the trends**, **Changes**, **Across geos**, **Geos that could not be read**.

```json
{
    "recordType": "trend",
    "geo": "US",
    "geoName": "United States",
    "rank": 2,
    "query": "weather chicago",
    "approxTraffic": 200,
    "approxTrafficText": "200+",
    "startedAt": "2026-11-11T20:30:00.000Z",
    "trendingForMinutes": 21,
    "pictureUrl": "https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcTO9oBmcOgB4o...",
    "pictureSource": "ABC7 Chicago",
    "newsCount": 3,
    "news": [
        {
            "title": "Chicago, IL-area weather forecast this week could include 1st snowfall of season",
            "url": "https://abc7chicago.com/post/chicago-il-area-weather-forecast-week-could-include-1st-snowfall-season/20030999/",
            "source": "ABC7 Chicago",
            "snippet": null,
            "imageUrl": "https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcTO9oBmcOgB4o..."
        }
    ],
    "exploreUrl": "https://trends.google.com/trends/explore?q=weather+chicago&geo=US&date=now+7-d",
    "searchUrl": "https://www.google.com/search?q=weather+chicago",
    "trendingPageUrl": "https://trends.google.com/trending?geo=US",
    "language": null,
    "geoCount": null,
    "geos": null,
    "changeType": null,
    "firstSeenAt": null,
    "lastSeenAt": null,
    "peakApproxTraffic": null,
    "previousRank": null,
    "droppedAt": null,
    "source": "feed",
    "scrapedAt": "2026-11-11T20:51:00.460Z"
}
```

(Real row from 2026-11-11, news list and image URLs shortened.) Dates are ISO 8601 in UTC; numbers are numbers.

#### One row per trend across geos

With `dedupeAcrossGeos`, a query trending in several geos becomes one row. `geos` lists each geo with its own `rank`, `approxTraffic`, `startedAt` and (with tracking) `changeType`; the row's `approxTraffic` is the highest, `rank` the best, `startedAt` the earliest, and news stories are merged (up to 10). In a real 5-country run (US, GB, CA, AU, IE) 50 trends became 46 rows; "elina svitolina" was trending in US (#5, 1000+), GB (#6, 200+) and CA (#4, 200+).

#### Geos that could not be read

A free `geo_status` row is added for every geo that could not be read, with a `status` and a plain-language `message`:

| status | Meaning |
|---|---|
| `invalid_geo` | Not a country code, name or sub-region this Actor knows. No request was made. |
| `unsupported_geo` | Google has no trending feed for that geo (it answered HTTP 400). Seen for `AQ` and `KP`. |
| `no_trends` | The feed answered but was empty. |
| `rate_limited` | Still rate-limited after polite retries. Try later. |
| `blocked` | Google refused the request or answered with a consent or bot-protection page. Never worked around. |
| `unreachable` / `error` | Network failure or an unexpected answer. |
| `skipped_request_budget` | Not fetched because `maxRequests` was used up. |
| `skipped_rate_limit` | Not fetched because two geos in a row were rate-limited; the run stopped asking Google. |

If the feeds were read but nothing was delivered (everything filtered out, or nothing new in changes-only mode), a free `geo_status` row per geo says so. If no trend at all could be read, the run fails and the status message lists the reason for each geo.

#### Run summary

The default key-value store record `OUTPUT` has, per geo: the input, resolved code and name, status, HTTP status, trends found / matched / delivered, dropped trends reported, how many were cut by filters (and which filter) or by the cap, change counts, requests and duration. Totals cover requests and retries for the whole run.

### Change tracking

Turn on **Track changes between runs** and schedule the Actor. Each run compares every geo's feed with the snapshot from the previous run and adds:

| Field | Meaning |
|---|---|
| `changeType` | `new` (not in the previous run's feed), `still_trending`, or `dropped` (was in the previous feed, is not now). |
| `firstSeenAt` | When this Actor first saw the trend in this geo's feed. Carried across runs. |
| `lastSeenAt` | The latest run that saw it. |
| `peakApproxTraffic` | Highest `approxTraffic` seen so far. |
| `previousRank` | Rank in the previous run. |
| `droppedAt` | For `dropped` rows: when this run noticed it had left the feed. Dropped rows carry the last known query, traffic, start time, picture and news. |

Rules you can rely on:

- **The first tracked run labels every trend `new`.** It sets the baseline.
- **"Dropped" means "left Google's 10-item feed".** The feed holds only the most recently started trends, so a trend usually drops out because newer trends pushed it down, not because people stopped searching. Treat `dropped` as "no longer among the newest", and turn it off with `includeDropped: false` if you only want new trends.
- **A failed or empty fetch never reports drops.** If a geo cannot be read, its snapshot is left untouched.
- **Filters and caps do not create false changes.** The snapshot records the whole feed, so changing `keywords` or `maxTrendsPerGeo` does not make old trends look new.
- **Nothing is lost on a budget stop.** Trends that did not fit under the run's charge limit are not recorded, so the next run reports them.
- **A trend that drops out and comes back is `new` again**, with a fresh `firstSeenAt`.
- With `dedupeAcrossGeos`, a merged row is `new` if it is new in any geo, `still_trending` if it is still in any geo's feed, and `dropped` only when it left every geo's feed; `geos[].changeType` has the per-geo detail.
- Snapshots live in the named key-value store `snapshotStoreName` in your Apify account (one small JSON record per geo, under 20 KB). Delete it, or pick a new name, to start over.

#### Recipe: alert me on new trends every 30 minutes

1. Create a task with:

```json
{
    "geos": ["US", "GB"],
    "trackChanges": true,
    "changesOnly": true,
    "includeDropped": false,
    "minApproxTraffic": 500
}
```

2. Run it once to set the baseline (every trend is `new` on that run).
3. Schedule it every 30 minutes (cron `*/30 * * * *`). From then on each run delivers only trends that started since the previous run, and you pay only for those. For the US the feed covered about 40 minutes of trends when we tested, so schedule at least every 30 minutes if you do not want to miss any; quieter countries can run hourly.
4. Connect the dataset to Slack, email, a Google Sheet or a webhook through Apify integrations ("Run succeeded" with a non-empty dataset).

### Pricing

Pay per event: one `trend` event per trend row delivered to the dataset (including `dropped` rows), plus Apify's small run-start fee. See the Pricing tab for the current price.

- `geo_status` rows are free.
- With changes-only output, still-trending trends are not delivered and not charged.
- Set **Maximum cost per run** in the run options to cap spending. The Actor stops cleanly at the cap, keeps everything delivered so far, and notes it in `OUTPUT`.

### Use from an AI agent or via API

Ready-to-run Python, Node.js and cURL examples: [github.com/cedarfetch/google-trending-searches-examples](https://github.com/cedarfetch/google-trending-searches-examples).

Run synchronously and get the rows back in one HTTP call:

```bash
curl -X POST "https://api.apify.com/v2/acts/<username>~google-trending-searches/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"geos":["US","GB"],"maxTrendsPerGeo":5,"includeNews":false}'
```

JavaScript:

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('<username>/google-trending-searches').call({ geos: ['US'], sortBy: 'traffic' });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

Python:

```python
from apify_client import ApifyClient
client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("<username>/google-trending-searches").call(run_input={"geos": ["DE", "AT", "CH"]})
items = client.dataset(run["defaultDatasetId"]).list_items().items
```

The Actor is also available to agents through the Apify MCP server, which exposes Store Actors as tools. Tips for agents: filter on `recordType == "trend"`; use `approxTraffic` (a number) rather than parsing `approxTrafficText`; `rank` is recency, not size; read `OUTPUT` for per-geo status.

### Limits and honest caveats

- **Trending now only.** No interest over time, related queries, related topics, interest by region or keyword comparison (see the top of this page for why).
- **10 trends per geo.** Google's feed lists the 10 most recently started trends, newest first. The Trending now web page shows more, with categories and "trend breakdown" terms, but it loads them through an internal, undocumented interface that this Actor does not use.
- **Approximate traffic is a coarse bucket.** Values seen on 2026-11-11: 100+, 200+, 500+, 1000+, 5000+, 10000+. Suffixed labels such as 20K+ or 1M+ are parsed too. `approxTraffic` is the lower bound; two trends both at "1000+" may differ a lot.
- **No category, no end time, no growth percentage** in the feed. `trendingForMinutes` is computed from the start time.
- **Time-window, category and sort parameters do not exist** for this feed: we tested `hours=4` and `category=17` and Google ignored both. `sortBy: "traffic"` sorts the 10 items locally.
- **Coverage varies by geo.** Some countries and sub-regions have no feed (`unsupported_geo`, one request, nothing charged). Verified on 2026-11-11: US, GB, DE, JP, CA, AU, IE, US-CA, GB-SCT work; AQ and KP do not.
- **Google decides the content.** Queries are as people search them (lowercase, sometimes misspelled); news stories are Google's selection, in the language Google picks unless you set `language`.
- **Not affiliated with Google.** If Google changes or removes the feed, runs will report `error` or `unsupported_geo` per geo rather than return wrong data.

### FAQ

**Why only 10 trends?** That is what Google's public trending feed contains. Running more often (every 15-30 minutes) with change tracking collects every trend as it appears.

**Why is rank 1 not the biggest trend?** The feed is ordered by start time. Set `sortBy` to `traffic` for biggest first.

**Can I get worldwide trends?** Google publishes trending searches per country, not worldwide. List the countries you care about and use `dedupeAcrossGeos` to see which trends cross borders.

**Can I get cities?** No. The feed works for countries and some sub-regions (US states, UK nations and others).

**Do I need proxies?** No. The feed answers plain requests. The Actor sends one request per geo with a pause between them and backs off on rate limits; geos that are refused are reported, not worked around.

**Is this legal?** The Actor reads a public feed that Google publishes for anyone to subscribe to, and collects no personal data. You are responsible for how you use the data and for complying with Google's terms. If in doubt, ask a lawyer.

### Supported codes

Countries (ISO 3166-1; Google covers most but not all of them):

`AD` Andorra · `AE` United Arab Emirates · `AF` Afghanistan · `AG` Antigua & Barbuda · `AI` Anguilla · `AL` Albania · `AM` Armenia · `AO` Angola · `AQ` Antarctica · `AR` Argentina · `AS` American Samoa · `AT` Austria · `AU` Australia · `AW` Aruba · `AX` Åland Islands · `AZ` Azerbaijan · `BA` Bosnia & Herzegovina · `BB` Barbados · `BD` Bangladesh · `BE` Belgium · `BF` Burkina Faso · `BG` Bulgaria · `BH` Bahrain · `BI` Burundi · `BJ` Benin · `BL` St. Barthélemy · `BM` Bermuda · `BN` Brunei · `BO` Bolivia · `BQ` Caribbean Netherlands · `BR` Brazil · `BS` Bahamas · `BT` Bhutan · `BV` Bouvet Island · `BW` Botswana · `BY` Belarus · `BZ` Belize · `CA` Canada · `CC` Cocos (Keeling) Islands · `CD` Congo - Kinshasa · `CF` Central African Republic · `CG` Congo - Brazzaville · `CH` Switzerland · `CI` Côte d’Ivoire · `CK` Cook Islands · `CL` Chile · `CM` Cameroon · `CN` China · `CO` Colombia · `CR` Costa Rica · `CU` Cuba · `CV` Cape Verde · `CW` Curaçao · `CX` Christmas Island · `CY` Cyprus · `CZ` Czechia · `DE` Germany · `DJ` Djibouti · `DK` Denmark · `DM` Dominica · `DO` Dominican Republic · `DZ` Algeria · `EC` Ecuador · `EE` Estonia · `EG` Egypt · `EH` Western Sahara · `ER` Eritrea · `ES` Spain · `ET` Ethiopia · `FI` Finland · `FJ` Fiji · `FK` Falkland Islands · `FM` Micronesia · `FO` Faroe Islands · `FR` France · `GA` Gabon · `GB` United Kingdom · `GD` Grenada · `GE` Georgia · `GF` French Guiana · `GG` Guernsey · `GH` Ghana · `GI` Gibraltar · `GL` Greenland · `GM` Gambia · `GN` Guinea · `GP` Guadeloupe · `GQ` Equatorial Guinea · `GR` Greece · `GS` South Georgia & South Sandwich Islands · `GT` Guatemala · `GU` Guam · `GW` Guinea-Bissau · `GY` Guyana · `HK` Hong Kong SAR China · `HM` Heard & McDonald Islands · `HN` Honduras · `HR` Croatia · `HT` Haiti · `HU` Hungary · `ID` Indonesia · `IE` Ireland · `IL` Israel · `IM` Isle of Man · `IN` India · `IO` British Indian Ocean Territory · `IQ` Iraq · `IR` Iran · `IS` Iceland · `IT` Italy · `JE` Jersey · `JM` Jamaica · `JO` Jordan · `JP` Japan · `KE` Kenya · `KG` Kyrgyzstan · `KH` Cambodia · `KI` Kiribati · `KM` Comoros · `KN` St. Kitts & Nevis · `KP` North Korea · `KR` South Korea · `KW` Kuwait · `KY` Cayman Islands · `KZ` Kazakhstan · `LA` Laos · `LB` Lebanon · `LC` St. Lucia · `LI` Liechtenstein · `LK` Sri Lanka · `LR` Liberia · `LS` Lesotho · `LT` Lithuania · `LU` Luxembourg · `LV` Latvia · `LY` Libya · `MA` Morocco · `MC` Monaco · `MD` Moldova · `ME` Montenegro · `MF` St. Martin · `MG` Madagascar · `MH` Marshall Islands · `MK` North Macedonia · `ML` Mali · `MM` Myanmar (Burma) · `MN` Mongolia · `MO` Macao SAR China · `MP` Northern Mariana Islands · `MQ` Martinique · `MR` Mauritania · `MS` Montserrat · `MT` Malta · `MU` Mauritius · `MV` Maldives · `MW` Malawi · `MX` Mexico · `MY` Malaysia · `MZ` Mozambique · `NA` Namibia · `NC` New Caledonia · `NE` Niger · `NF` Norfolk Island · `NG` Nigeria · `NI` Nicaragua · `NL` Netherlands · `NO` Norway · `NP` Nepal · `NR` Nauru · `NU` Niue · `NZ` New Zealand · `OM` Oman · `PA` Panama · `PE` Peru · `PF` French Polynesia · `PG` Papua New Guinea · `PH` Philippines · `PK` Pakistan · `PL` Poland · `PM` St. Pierre & Miquelon · `PN` Pitcairn Islands · `PR` Puerto Rico · `PS` Palestinian Territories · `PT` Portugal · `PW` Palau · `PY` Paraguay · `QA` Qatar · `RE` Réunion · `RO` Romania · `RS` Serbia · `RU` Russia · `RW` Rwanda · `SA` Saudi Arabia · `SB` Solomon Islands · `SC` Seychelles · `SD` Sudan · `SE` Sweden · `SG` Singapore · `SH` St. Helena · `SI` Slovenia · `SJ` Svalbard & Jan Mayen · `SK` Slovakia · `SL` Sierra Leone · `SM` San Marino · `SN` Senegal · `SO` Somalia · `SR` Suriname · `SS` South Sudan · `ST` São Tomé & Príncipe · `SV` El Salvador · `SX` Sint Maarten · `SY` Syria · `SZ` Eswatini · `TC` Turks & Caicos Islands · `TD` Chad · `TF` French Southern Territories · `TG` Togo · `TH` Thailand · `TJ` Tajikistan · `TK` Tokelau · `TL` Timor-Leste · `TM` Turkmenistan · `TN` Tunisia · `TO` Tonga · `TR` Türkiye · `TT` Trinidad & Tobago · `TV` Tuvalu · `TW` Taiwan · `TZ` Tanzania · `UA` Ukraine · `UG` Uganda · `UM` U.S. Outlying Islands · `US` United States · `UY` Uruguay · `UZ` Uzbekistan · `VA` Vatican City · `VC` St. Vincent & Grenadines · `VE` Venezuela · `VG` British Virgin Islands · `VI` U.S. Virgin Islands · `VN` Vietnam · `VU` Vanuatu · `WF` Wallis & Futuna · `WS` Samoa · `XK` Kosovo · `YE` Yemen · `YT` Mayotte · `ZA` South Africa · `ZM` Zambia · `ZW` Zimbabwe

Sub-regions with built-in names:

- **United States**: `US-AL` Alabama, `US-AK` Alaska, `US-AZ` Arizona, `US-AR` Arkansas, `US-CA` California, `US-CO` Colorado, `US-CT` Connecticut, `US-DE` Delaware, `US-DC` District of Columbia, `US-FL` Florida, `US-GA` Georgia, `US-HI` Hawaii, `US-ID` Idaho, `US-IL` Illinois, `US-IN` Indiana, `US-IA` Iowa, `US-KS` Kansas, `US-KY` Kentucky, `US-LA` Louisiana, `US-ME` Maine, `US-MD` Maryland, `US-MA` Massachusetts, `US-MI` Michigan, `US-MN` Minnesota, `US-MS` Mississippi, `US-MO` Missouri, `US-MT` Montana, `US-NE` Nebraska, `US-NV` Nevada, `US-NH` New Hampshire, `US-NJ` New Jersey, `US-NM` New Mexico, `US-NY` New York, `US-NC` North Carolina, `US-ND` North Dakota, `US-OH` Ohio, `US-OK` Oklahoma, `US-OR` Oregon, `US-PA` Pennsylvania, `US-RI` Rhode Island, `US-SC` South Carolina, `US-SD` South Dakota, `US-TN` Tennessee, `US-TX` Texas, `US-UT` Utah, `US-VT` Vermont, `US-VA` Virginia, `US-WA` Washington, `US-WV` West Virginia, `US-WI` Wisconsin, `US-WY` Wyoming
- **United Kingdom**: `GB-ENG` England, `GB-SCT` Scotland, `GB-WLS` Wales, `GB-NIR` Northern Ireland
- **Canada**: `CA-AB` Alberta, `CA-BC` British Columbia, `CA-MB` Manitoba, `CA-NB` New Brunswick, `CA-NL` Newfoundland and Labrador, `CA-NS` Nova Scotia, `CA-NT` Northwest Territories, `CA-NU` Nunavut, `CA-ON` Ontario, `CA-PE` Prince Edward Island, `CA-QC` Quebec, `CA-SK` Saskatchewan, `CA-YT` Yukon
- **Australia**: `AU-ACT` Australian Capital Territory, `AU-NSW` New South Wales, `AU-NT` Northern Territory, `AU-QLD` Queensland, `AU-SA` South Australia, `AU-TAS` Tasmania, `AU-VIC` Victoria, `AU-WA` Western Australia
- **Germany**: `DE-BW` Baden-Württemberg, `DE-BY` Bavaria, `DE-BE` Berlin, `DE-BB` Brandenburg, `DE-HB` Bremen, `DE-HH` Hamburg, `DE-HE` Hesse, `DE-MV` Mecklenburg-Vorpommern, `DE-NI` Lower Saxony, `DE-NW` North Rhine-Westphalia, `DE-RP` Rhineland-Palatinate, `DE-SL` Saarland, `DE-SN` Saxony, `DE-ST` Saxony-Anhalt, `DE-SH` Schleswig-Holstein, `DE-TH` Thuringia

Other sub-regions in `CC-XXX` form are passed to Google as is.

### Support

Found a geo that behaves oddly? Open an issue on the Issues tab with the input and the run ID; the `OUTPUT` record usually shows what happened.

### More Actors from Cedarfetch Labs

Built the same way: public data only, typed output, per-source error reporting, change tracking for scheduled runs.

- [Shopify Store Scraper](https://apify.com/cedarfetch/shopify-store-scraper): full product catalogs from any Shopify store, with price and stock change tracking.
- [ATS Jobs Scraper](https://apify.com/cedarfetch/ats-jobs-scraper): open jobs from Greenhouse, Lever, Ashby, SmartRecruiters, Workable, Recruitee and Personio boards, with new and removed postings flagged.
- [Remote Jobs Scraper](https://apify.com/cedarfetch/remote-jobs-scraper): remote jobs from Remote OK, We Work Remotely and five more boards in one deduplicated feed.
- [Substack Scraper](https://apify.com/cedarfetch/substack-scraper): public posts from any Substack newsletter as Markdown, with a new-posts feed.

# Changelog

This Actor's version history is a separate document: https://apify.com/cedarfetch/google-trending-searches/changelog.md

# Actor input Schema

## `geos` (type: `array`):

One per line. ISO country codes (US United States, GB United Kingdom, CA Canada, AU Australia, IN India, DE Germany, FR France, ES Spain, IT Italy, NL Netherlands, BR Brazil, MX Mexico, JP Japan, KR South Korea, ...), country names ("Germany"), or sub-regions as ISO 3166-2 codes: US states (US-CA California, US-NY New York, US-TX Texas), UK nations (GB-ENG, GB-SCT, GB-WLS, GB-NIR), Canadian provinces (CA-ON), Australian states (AU-NSW), German states (DE-BY). The full list with names is in the README. Invalid codes are reported in the run summary and the rest still run.

## `maxTrendsPerGeo` (type: `integer`):

Deliver at most this many trends per geo. Google's trending feed holds the 10 most recently started trends, so 10 is the maximum.

## `includeNews` (type: `boolean`):

Add the news articles Google links to each trend (headline, URL, publisher, image; usually 1-3 per trend). Turn off for smaller rows.

## `language` (type: `string`):

Optional language code (hl) such as "en", "de" or "pt-BR". In tests it changed which news articles are attached, not which trends are listed. Leave empty for Google's default for the geo.

## `sortBy` (type: `string`):

"feed": Google's order, the most recently started trend first. "traffic": highest approximate search volume first (ties keep feed order). Applied before "Max trends per geo".

## `minApproxTraffic` (type: `integer`):

Keep only trends whose approximate search count is at least this number, for example 1000 keeps "1000+" and above and drops "200+" and "500+". 0 keeps everything.

## `keywords` (type: `array`):

Keep trends that mention any of these words (case- and accent-insensitive, whole words; add \* for a prefix, "election\*"; phrases work). Words in Chinese, Japanese, Korean or Thai match anywhere in the text.

## `excludeKeywords` (type: `array`):

Drop trends that mention any of these words (same matching rules).

## `keywordScope` (type: `string`):

"query_and_news": the trending query and the headlines of its news stories. "query": the query only.

## `dedupeAcrossGeos` (type: `boolean`):

When the same query trends in several geos, deliver one row with the list of geos (each with its rank and traffic) instead of one row per geo. Useful for monitoring a market across countries.

## `trackChanges` (type: `boolean`):

Compare with the previous run and label every row new, still_trending or dropped (left the feed), with firstSeenAt, lastSeenAt, peak traffic and how long it has been trending. The snapshot is kept in a named key-value store in your account, so it survives between runs. Schedule the Actor every 15-30 minutes for a trend alert feed.

## `changesOnly` (type: `boolean`):

Requires change tracking. Deliver (and pay for) only trends that are new since the previous run, plus dropped ones if "Report dropped trends" is on. The first tracked run labels every trend new.

## `includeDropped` (type: `boolean`):

With change tracking: add a row for each trend that was in the previous run's feed and is not in this one (changeType "dropped"). The feed only holds the 10 most recent trends, so a drop usually means newer trends pushed it out, not that interest ended.

## `snapshotStoreName` (type: `string`):

Name of the key-value store that holds the change-tracking snapshots (one small record per geo). Use a different name to run independent alert feeds on the same geos. Lowercase letters, digits and hyphens.

## `maxRequests` (type: `integer`):

Hard cap on requests to Google in one run, retries included (one request per geo when nothing goes wrong). Geos beyond the cap are reported as skipped.

## `concurrency` (type: `integer`):

How many feeds are fetched at the same time.

## `requestDelayMs` (type: `integer`):

Pause after each request, with small random jitter. Minimum 100 ms.

## `requestTimeoutSecs` (type: `integer`):

Give up on a single request after this many seconds (it is then retried).

## `maxRetries` (type: `integer`):

Retries for rate-limit (429), server-error (5xx) and network failures, with jittered exponential backoff that honours Retry-After. If two geos in a row stay rate-limited, the run stops requesting the rest.

## Actor input object example

```json
{
  "geos": [
    "US",
    "GB",
    "DE",
    "US-CA"
  ],
  "maxTrendsPerGeo": 10,
  "includeNews": true,
  "language": "de",
  "sortBy": "feed",
  "minApproxTraffic": 1000,
  "keywords": [
    "nfl",
    "taylor swift",
    "earthquake"
  ],
  "excludeKeywords": [
    "lottery",
    "weather"
  ],
  "keywordScope": "query_and_news",
  "dedupeAcrossGeos": false,
  "trackChanges": false,
  "changesOnly": false,
  "includeDropped": true,
  "snapshotStoreName": "google-trending-searches-snapshots",
  "maxRequests": 100,
  "concurrency": 2,
  "requestDelayMs": 500,
  "requestTimeoutSecs": 30,
  "maxRetries": 3
}
```

# Actor output Schema

## `trends` (type: `string`):

All trend rows (including dropped rows with change tracking), plus geo_status rows for geos that could not be read.

## `news` (type: `string`):

The same rows shown with their news headlines.

## `changes` (type: `string`):

The same rows shown with the change-tracking columns.

## `summary` (type: `string`):

Per-geo status (ok, invalid_geo, unsupported_geo, rate_limited, ...), trend counts, requests, duration and change counts.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "geos": [
        "US"
    ],
    "maxTrendsPerGeo": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("cedarfetch/google-trending-searches").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "geos": ["US"],
    "maxTrendsPerGeo": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("cedarfetch/google-trending-searches").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "geos": [
    "US"
  ],
  "maxTrendsPerGeo": 10
}' |
apify call cedarfetch/google-trending-searches --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cedarfetch/google-trending-searches"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/94I09DqGc2d7ucHU7/builds/HEkAbSnpKrYYvZoN6/openapi.json
