# Google Trending Searches Scraper: New Trend Alerts (`accountable_eel/google-trending-searches-lookup`) Actor

Google trending searches by country or US state: the Trending now list with approximate search volume and news links. Get only new trends since your last run, filter by keyword, post to Slack, Discord or Telegram. Free when nothing is new. No login, no key, no proxies.

- **URL**: https://apify.com/accountable_eel/google-trending-searches-lookup.md
- **Developed by:** [Adriana Voss](https://apify.com/accountable_eel) (community)
- **Categories:** News, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 trending search returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Scraper: New Trend Alerts

Get Google's **Trending now** searches for any country or US state: the search term, its rank, an approximate search volume and the news stories Google shows for it. Turn on monitoring and each run returns only the searches that are **new since the last run**, filtered by your keywords, and can post each one straight to Slack, Discord or Telegram. A quiet run costs nothing but the start fee.

It reads Google's public Trending now RSS feed, so it needs no login, no API key and no proxy.

**What it covers:** the current Trending now list per country or region (Google lists about 10 per place). **What it does not cover:** interest over time, related queries, Explore comparisons and history. Google's `robots.txt` disallows the Explore routes, so this actor does not touch them.

### How to use

1. **In the Apify Console.** Open the actor page and click **Start** — the `geos` field is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found.
2. **Via the API.** Call it directly with a POST request — no Console needed once you have an API token:
   ```bash
   curl "https://api.apify.com/v2/acts/accountable_eel~google-trending-searches-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
     -X POST \
     -H "Content-Type: application/json" \
     -d '{"geos":["US"]}'
   ```
3. **On a schedule.** Save this actor as an Apify **Task** with the input you want, then add a **Schedule** (hourly, daily, weekly) so it runs on its own — no server of your own required.

### Input

```json
{
  "geos": [
    "US"
  ]
}
```

One code per line: a two-letter country code such as US, GB, DE, JP, IN or BR, or a region such as US-CA (California). Each line is one request to Google's public Trending now feed and returns that place's current trending searches, about 10 per country. No login, no API key. Accepted formats: US, GB, DE, JP, IN, BR, FR, AU, CA, MX, US-CA.

`geos` is a list of country or region codes (`US`, `GB`, `DE`, `JP`, `US-CA`). Codes are not case sensitive. One country returns about 10 trending searches, one row each. A code Google does not know (for example `ZZ`) comes back as a free row with `status: BAD_FORMAT`.

Filters that run after the fetch, so they cost nothing extra: **Only trends containing these keywords** (matches the search term or a news headline), **Minimum approx. searches**, and **Most trends per country**.

### Output

One row per trending search, for example (real values captured from the feed on 2026-10-27):

```json
{
  "geo": "US", "rank": 2, "title": "apple iphone duo", "approxTraffic": 500,
  "publishedAt": "2026-10-27T08:20:00.000Z",
  "newsItems": [{ "title": "iPhone Duo: Apple says it will replace handsets with screen problems", "url": "https://www.bbc.com/news/articles/c893zwlev2xpo", "source": "BBC" }],
  "feedUpdatedAt": "2026-10-27T08:40:00.000Z", "checkedAt": "2026-10-27T08:55:50.229Z",
  "trendCount": 10, "monitorStatus": "NEW_TRENDS", "isNew": true
}
```

`approxTraffic` is Google's search-volume bucket as a number (`200+` becomes `200`, `10000+` becomes `10000`); it is a floor, not an exact count. `rank` is the position in Google's list for that place, 1 = top, and stays the same when filters remove the rows above it. `feedUpdatedAt` is the newest trend time in the feed (the feed carries no build date of its own).

| query | found | status | geo | rank | title | approxTraffic | publishedAt | newsItems | feedUpdatedAt | checkedAt | trendCount | monitorStatus | isNew | firstSeenAt | trends | scrapedAt |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| US | true | OK | <country or region> | <rank> | <trending search> | \<approx. searches> | <started trending> | <news stories> | <feed updated> | <checked at> | <trends returned> | <monitoring status> | \<is this trend new?> | <first seen on a run> | \<all trends (full list)> | 1970-01-01T00:00:00.000Z |

A miss comes back as a row with `"found": false` and is never charged. The `status` tells the misses apart: `NOT_FOUND` (Google's list for that place is empty right now), `BAD_FORMAT` (not a country or region code, or one Google does not know), `BLOCKED` (Google answered HTTP 429 or a bot check, which is not the same as an empty list) and `PARSE_CHANGED` (Google changed the feed's shape and the actor needs an update).

### New trend containing my keyword to Slack, in three steps

1. **Create the watchlist.** Open the actor, put your country in **Countries or regions** (for example `US`), add your words under **Only trends containing these keywords** (for example `iphone`, `apple`), and tick **Only return new trending searches since the last run**. Tick **Skip the first run** so the channel is not flooded with today's list.
2. **Add the destination.** Under **Send alerts to**, paste your Slack incoming-webhook URL (a Discord webhook or a Telegram bot link works the same way; any other URL receives JSON for n8n or Make). Run it once: it remembers the current list and sends nothing.
3. **Schedule it.** Save the input as a Task and add a Schedule every 10 to 60 minutes. From then on, each new matching trend arrives as one Slack message with the term, country, rank, approximate searches and up to three news links. Runs with nothing new cost only the start fee.

A search counts as new when it was in neither the previous run's list nor any list seen in the last 24 hours, so a search that flickers across the edge of the top 10 does not alert twice.

### Example runs

Paste any of these into the Input tab and press Start. All three need no key and no account beyond an Apify login.

**Google trending searches today by country.**

```json
{ "geos": ["US", "GB", "DE", "JP", "IN"] }
```

**New trending search alert for a keyword, with monitoring on (schedule this one).**

```json
{
  "geos": ["US"],
  "keywordsFilter": ["iphone", "apple"],
  "deltaMode": true,
  "skipFirstRun": true,
  "deltaName": "iphone-trend-alert"
}
```

**Google trending news for a country: only the big trends, with their stories.**

```json
{ "geos": ["FR"], "minTraffic": 1000 }
```

### Limits

- **Trending now only.** No interest over time, no related queries, no Explore comparisons and no history: Google's `robots.txt` forbids those routes, so they are not offered.
- **About 10 trends per place.** That is what Google's feed lists; "Most trends per country" can lower it, not raise it.
- **Volume is a bucket.** `approxTraffic` is Google's floor (100, 200, 500, 1000 ... 10000), not an exact count.
- **Categories and time windows are not inputs.** A `hours=4` parameter was tried and returned the identical list, so it is not offered.
- **Fresh data only.** The feed changed by 2 of 10 trends in 10 minutes on a US check, so schedule monitoring every 10 to 60 minutes if you want alerts quickly.
- **Alert messages are free** and a message that fails never fails the run; the row's `notifyErrors` says why.

### Pricing

Pay-per-event. A flat per-run fee covers session/proxy warmup; you're billed
per item only when data is actually found and returned — see
`.actor/pay_per_event.json` for exact prices. A miss is never charged.

### Use it from Clay, n8n, Make, or an AI agent

This actor runs synchronously over plain HTTP — call it directly from a script, a workflow tool, or an AI agent, no Apify Console needed once you have an API token.

```bash
curl "https://api.apify.com/v2/acts/accountable_eel~google-trending-searches-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{"geos":["US"]}'
```

**n8n.** Add an HTTP Request node: Method `POST`, URL `https://api.apify.com/v2/acts/accountable_eel~google-trending-searches-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>`, Body Content Type `JSON`, JSON Body `{"geos":["US"]}` (swap in an expression from an earlier node for a real value).

**Clay.** Add an "HTTP API" column: Method `POST`, URL `https://api.apify.com/v2/acts/accountable_eel~google-trending-searches-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>`, Body `{"geos":["{{country}}"]}`, mapping the row's country into the `geos` array.

**MCP.** In Claude, Cursor, or any MCP client with the Apify MCP server, ask for "Google Trending Searches by Country: New Trend Alerts" — the agent will find and run this actor.

# Actor input Schema

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

One code per line: a two-letter country code such as US, GB, DE, JP, IN or BR, or a region such as US-CA (California). Each line is one request to Google's public Trending now feed and returns that place's current trending searches, about 10 per country. No login, no API key. Accepted formats: US, GB, DE, JP, IN, BR, FR, AU, CA, MX, US-CA. You're only charged for the ones we actually find — a miss costs nothing.

## `keywordsFilter` (type: `array`):

Optional. One keyword per line. A trend is kept when its search term or one of its news headlines contains any of them, ignoring case. Applied after the fetch, before monitoring remembers anything, so a trend that does not match is never counted as seen.

## `minTraffic` (type: `integer`):

Optional. Keep only trends whose search-volume bucket is at least this number (Google lists 100, 200, 500, 1000, 2000, 5000, 10000 and up). 0 keeps everything.

## `maxItemsPerGeo` (type: `integer`):

Keeps the first N trends per country after your filters (1 to 50). Google's feed currently lists 10 per country, so values above 10 return 10.

## `deltaMode` (type: `boolean`):

Turns the list into an alert. A trend is new when it was not in this country's previous run, nor in any run in the last 24 hours. Only new trends are returned and charged for, so a quiet run costs just the start fee. Run it on a schedule (every 10 to 60 minutes) and add a Slack, Discord or Telegram link below to get each new trend as a message.

## `skipFirstRun` (type: `boolean`):

On: the very first run for a country only remembers the current list and returns and bills nothing, so your alert channel is not flooded with today's whole list. Off: the first run returns the current list as new. Needs monitoring on.

## `alertOnChangeOnly` (type: `boolean`):

On: a quiet run writes zero dataset items, so a bot or integration reading the dataset never has to skip status rows. Off: a quiet run writes one free row per country with monitorStatus NO_NEW_TRENDS. Errors are always written. Needs monitoring on.

## `deltaName` (type: `string`):

Leave empty and one is derived from your keyword and minimum-searches filters, so two schedules with different filters keep separate memories. Type your own name to keep one memory across a filter change. Naming a watchlist with monitoring off returns every trend but still marks each one new or seen.

## `notifyUrl` (type: `string`):

Optional. After the trends are billed, each new trending search is posted here as one message: the term, country, rank, approximate searches and up to three news links. Discord or Slack: paste the channel's webhook URL. Telegram: https://api.telegram.org/bot<token>/sendMessage?chat_id=<chat id>. Any other URL receives JSON (n8n, Make, Zapier, your own bot). Messages are free, and a message that fails never fails the run (the row's notifyErrors says why). Needs monitoring on. Stored encrypted, never logged or written to the results.

## `notifyFormat` (type: `string`):

Leave on "Detect from the link": discord.com links get Discord messages, hooks.slack.com Slack, api.telegram.org Telegram, anything else JSON. Pick one only to override that.

## `maxNotificationsPerRun` (type: `integer`):

Up to 100. Above this, one "+N more" message says how many more new trends are in the run's dataset, so a busy first run never floods the channel. 0 sends only that summary message.

## `testRun` (type: `boolean`):

Turn this on to test your input on a small sample before running the full list. Turn it off to process everything.

## `onlyFound` (type: `boolean`):

Only keep rows where something was actually found. Misses are always free, whether or not you show them here.

## `includeKeywords` (type: `array`):

Optional. Only keep results that mention at least one of these words (e.g. a job title, a city, a product name). Leave empty to keep everything.

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

Optional. Drop any result that mentions one of these words. Leave empty to skip nothing.

## `maxResults` (type: `integer`):

Optional. Stop the run once this many results have been found — useful for a quick, cheap sample. Leave blank for no limit.

## `columns` (type: `array`):

Choose which pieces of information to include in each result row. All are included by default.

## `expandRows` (type: `boolean`):

When on, each trend found gets its own row instead of being grouped under its country. You're still only charged once per country, no matter how many rows it produces.

## `maxConcurrency` (type: `integer`):

Parallel requests. Keep conservative — this target has no browser fallback, so getting blocked costs more than slow-and-steady.

## Actor input object example

```json
{
  "geos": [
    "US"
  ],
  "keywordsFilter": [],
  "minTraffic": 0,
  "maxItemsPerGeo": 10,
  "deltaMode": false,
  "skipFirstRun": false,
  "alertOnChangeOnly": false,
  "deltaName": "",
  "notifyFormat": "auto",
  "maxNotificationsPerRun": 20,
  "testRun": false,
  "onlyFound": false,
  "includeKeywords": [],
  "excludeKeywords": [],
  "columns": [
    "geo",
    "rank",
    "title",
    "approxTraffic",
    "publishedAt",
    "newsItems",
    "feedUpdatedAt",
    "checkedAt",
    "trendCount",
    "monitorStatus",
    "isNew",
    "firstSeenAt",
    "trends"
  ],
  "expandRows": true,
  "maxConcurrency": 1
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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"
    ],
    "keywordsFilter": [],
    "includeKeywords": [],
    "excludeKeywords": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("accountable_eel/google-trending-searches-lookup").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"],
    "keywordsFilter": [],
    "includeKeywords": [],
    "excludeKeywords": [],
}

# Run the Actor and wait for it to finish
run = client.actor("accountable_eel/google-trending-searches-lookup").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"
  ],
  "keywordsFilter": [],
  "includeKeywords": [],
  "excludeKeywords": []
}' |
apify call accountable_eel/google-trending-searches-lookup --silent --output-dataset

```

## MCP server setup

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

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/qSbHW7uSGLmhJtuCE/builds/miGVW0RIzXcfkA8OH/openapi.json
