# Google Trends Reliable: Series Without a Start Fee (`urlwright/google-trends-reliable`) Actor

Interest over time, regions and related queries from Google Trends. No start fee. A blocked keyword is free. Delta mode keeps only new rising queries for a scheduled watch.

- **URL**: https://apify.com/urlwright/google-trends-reliable.md
- **Developed by:** [Urlwright](https://apify.com/urlwright) (community)
- **Categories:** SEO tools
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 trend series

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 Trends Reliable: Series Without a Start Fee

**Urlwright.** Little tools for the web.

Interest over time, interest by region and related queries from the public Google Trends pages. Each keyword is its own series. There is no start fee. A keyword that comes back blocked is free.

No login. The actor does not collect personal data. It asks Google for the chart, then stores the numbers.

### What it does

1. You pass one or more keywords. Each keyword is requested on its own, so the 0 to 100 scale is not shared with the others.
2. **Interest over time** (on by default) is one timeline.
3. **Interest by region** is one table of places.
4. **Related queries** and **related topics** are the top list and the rising list. A value Google labels Breakout is marked `breakout`.
5. **Daily trends**, off by default, reads the public daily trends feed for the geo once per run. You get the title and the traffic label.
6. **Delta mode** keeps a snapshot in a named key-value store. The next run, for the same keyword, geo, time range, category and property, writes only rising or breakout queries and topics that were not in that snapshot. A quiet day still writes the row, with an empty `data` list.
7. One blocked keyword does not fail the run. The row is `status: blocked` and nothing is billed for it.

Direct or datacenter proxy goes first. After an HTTP 429 the actor waits and tries again three times. If you listed the RESIDENTIAL proxy group, it then tries residential. If that still fails, the row is blocked.

`robots.txt` for UrlwrightBot is respected unless you turn that off.

### Who it is for

Scheduled watches: run the actor on a timetable and use delta mode so the dataset shows what started rising. Also one-off checks of a few keywords, without a fee for a keyword Google refuses.

### Input

The console prefills `urlwright` and `sitemap`, worldwide, the last 12 months, interest over time only.

```json
{
  "keywords": ["urlwright", "sitemap"],
  "geo": "",
  "timeRange": "today 12-m",
  "category": 0,
  "property": "",
  "interestOverTime": true,
  "interestByRegion": false,
  "relatedQueries": false,
  "relatedTopics": false,
  "dailyTrends": false,
  "deltaMode": false,
  "deltaStoreName": "google-trends-delta",
  "respectRobotsTxt": true
}
```

`geo` empty is worldwide. A code such as `US` or `US-CA` limits the chart. `timeRange` is a preset (`today 12-m`, `today 5-y`, `now 7-d`, and the other presets in the field description) or two dates, `YYYY-MM-DD YYYY-MM-DD`. `property` empty is web search. `youtube`, `news`, `images` and `froogle` (Shopping) are the other properties. `category` `0` is all categories.

At most 25 keywords. A repeated keyword is kept once.

### Output

One dataset row per keyword and output type. Daily trends is a single extra row, with an empty keyword. Every field is present. Unused fields are null.

```json
{
  "schemaVersion": 1,
  "keyword": "urlwright",
  "geo": "",
  "timeRange": "today 12-m",
  "category": 0,
  "property": "",
  "type": "interestOverTime",
  "data": [
    { "timestamp": "1761436800", "date": "Oct 26, 2025", "axisDate": "Oct 26, 2025", "value": 62, "hasData": true, "partial": false }
  ],
  "fetchedAt": "2026-10-29T10:00:00.000Z",
  "status": "ok",
  "attempts": 1,
  "proxyTier": "none",
  "httpStatus": 200,
  "error": null,
  "charged": true,
  "chargedEvents": { "trend-series": 1, "delta-alert": 0 }
}
```

`status` is `ok`, `partial` or `blocked`. The latest timeline bucket is `partial` when Google marks that period as incomplete, and the row status follows. `proxyTier` is `none`, `datacenter` or `residential`. `attempts` counts the tries for that request.

`RUN_SUMMARY` in the default key-value store has the counts per status, the request count, the HTTP 429 count, the retry count, proxy tier usage and the charged events. It is written even when the input is rejected.

### Pricing

Pay per event. No start fee. No charge for a blocked row.

Prices are per event and are charged only for delivered rows.

| Event | Price | When |
|---|---:|---|
| `trend-series` | $0.002 | Each delivered series, region table, related list or daily trends row with status ok or partial |
| `delta-alert` | $0.003 | Each keyword that has at least one new rising or breakout hit in delta mode |

A related list with no new hits in delta mode is still delivered (empty `data`) and bills `trend-series` only. It does not bill `delta-alert`.

### Limitations

Google can answer HTTP 429. The actor retries, then blocks that keyword. It does not guess a number.

Related topics are sometimes an empty list. That row is `ok` with `data: []`.

The actor reads public charts. It does not browse while logged in, and it does not store cookies, raw HTML or news article URLs.

Values are Google's 0 to 100 index for that keyword alone, not absolute search volume.

### FAQ

**Why is one keyword blocked while the others succeeded?**
Google refused that request after the retries. You are not billed for it. The rest of the run still finishes.

**What does delta mode store?**
The rising and breakout queries and topics for that keyword, geo, time range, category and property. The next run compares against that list.

**Do I pay if the run finds nothing new?**
You pay `trend-series` for each delivered ok or partial row. You pay `delta-alert` only when at least one new rising or breakout item is in the row.

### No warranty

The charts come from a public website that can change or refuse a request. Check anything you rely on. This actor is not affiliated with Google.

# Actor input Schema

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

Each keyword is its own series, so the 0 to 100 scale is not shared. At least one, at most 25. Duplicates are dropped.

## `geo` (type: `string`):

Country or region code such as US or US-CA. Leave empty for worldwide.

## `timeRange` (type: `string`):

A preset (today 12-m, today 5-y, today 3-m, today 1-m, now 7-d, now 1-d, now 4-H, now 1-H) or two dates: YYYY-MM-DD YYYY-MM-DD.

## `category` (type: `integer`):

Google Trends category id. 0 is all categories.

## `property` (type: `string`):

Search property. Empty is web search. froogle is Google Shopping.

## `interestOverTime` (type: `boolean`):

One timeline per keyword. The latest bucket is partial when Google marks the current period as incomplete.

## `interestByRegion` (type: `boolean`):

One region table per keyword.

## `relatedQueries` (type: `boolean`):

Top and rising queries. In delta mode the row lists only rising or breakout queries that were not in the previous snapshot.

## `relatedTopics` (type: `boolean`):

Top and rising topics. In delta mode the row lists only new rising or breakout topics.

## `dailyTrends` (type: `boolean`):

Also read the public daily trends RSS for the geo (one row, not one per keyword). Titles and traffic only.

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

Compare rising queries and topics with the named key-value store. A quiet day still writes the row, with an empty data list.

## `deltaStoreName` (type: `string`):

Named key-value store that keeps the previous rising queries and topics. Used only when delta mode is on.

## `respectRobotsTxt` (type: `boolean`):

Obey robots.txt for UrlwrightBot. A disallowed path is status blocked and is not billed.

## `proxyConfiguration` (type: `object`):

Direct or datacenter first. After repeated HTTP 429 responses the run switches to residential, and only when this configuration lists the RESIDENTIAL group.

## Actor input object example

```json
{
  "keywords": [
    "urlwright",
    "sitemap"
  ],
  "geo": "",
  "timeRange": "today 12-m",
  "category": 0,
  "property": "",
  "interestOverTime": true,
  "interestByRegion": false,
  "relatedQueries": false,
  "relatedTopics": false,
  "dailyTrends": false,
  "deltaMode": false,
  "deltaStoreName": "google-trends-delta",
  "respectRobotsTxt": true
}
```

# Actor output Schema

## `overview` (type: `string`):

Every row. status is ok, partial or blocked.

## `series` (type: `string`):

Interest over time and interest by region.

## `related` (type: `string`):

Related queries, related topics and the daily trends row.

## `runSummary` (type: `string`):

Counts per status, requests, HTTP 429s, retries, proxy tier usage and charged events.

# 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 = {
    "keywords": [
        "urlwright",
        "sitemap"
    ],
    "geo": "",
    "timeRange": "today 12-m",
    "deltaStoreName": "google-trends-delta"
};

// Run the Actor and wait for it to finish
const run = await client.actor("urlwright/google-trends-reliable").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 = {
    "keywords": [
        "urlwright",
        "sitemap",
    ],
    "geo": "",
    "timeRange": "today 12-m",
    "deltaStoreName": "google-trends-delta",
}

# Run the Actor and wait for it to finish
run = client.actor("urlwright/google-trends-reliable").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 '{
  "keywords": [
    "urlwright",
    "sitemap"
  ],
  "geo": "",
  "timeRange": "today 12-m",
  "deltaStoreName": "google-trends-delta"
}' |
apify call urlwright/google-trends-reliable --silent --output-dataset

```

## MCP server setup

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

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/eAU8KX9dxpS0kZ5oi/builds/JBXGQJfIToGMdZI4Y/openapi.json
