# Google News Scraper & API: Real Article URLs, Full Text (`tidewell/google-news-api`) Actor

Search Google News by keyword (site:, intitle:, when: operators), topic or location for any country and language. Get headline, publisher, date and the real article URL, plus optional image, author and full text. Dedupe and only-new mode. $2 per 1,000 articles.

- **URL**: https://apify.com/tidewell/google-news-api.md
- **Developed by:** [Tidewell Software](https://apify.com/tidewell) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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 News Scraper & API: keyword search, topics, real article URLs, full text

Get Google News results as clean JSON, CSV or Excel. Search by keyword with every Google News operator, or read topic and local headlines, for any country and language. For each article you get:

- **Title, publisher, publish time** and the publisher's home page
- **The real article URL**, decoded from Google's `news.google.com` redirect link, so you can open, store or crawl the article itself
- **Optional page details** from the publisher's site: description (snippet), image, author, published time, site name, language and keywords
- **Optional full article text** with a word count
- **Related coverage** of the same story, for topic feeds

**$2 per 1,000 articles, real URLs included. Page details are $1 per 1,000 extra.** There is no start fee and no monthly rental. Articles whose link can't be decoded, and publisher pages that are blocked or paywalled, are free.

### Why use this Google News API

- **Built on Google's official RSS feeds.** Search, topic and location feeds are the most stable way to read Google News: no headless browser, no HTML parsing of the Google News app. A 50-article run takes about 5 seconds.
- **Real article URLs, not redirects.** Google News RSS only gives `news.google.com/rss/articles/...` links. The actor exchanges each one for the publisher URL, the same way the Google News website does when you click a story. In testing, every link resolved (3,000 of 3,000 in the largest cloud run).
- **Every search operator.** `"exact phrase"`, `OR`, `-exclude`, `site:reuters.com`, `intitle:`, `inurl:`, `when:7d`, `after:` / `before:` all work, because the query goes to Google News unchanged.
- **More than 100 results per query.** Google News stops at about 100 articles per search. Turn on *Split searches by day* and a 7-day query runs once per day: one test returned 575 unique OpenAI articles from a single query.
- **Many countries in one run.** Add editions such as `US:en`, `GB:en`, `DE:de`, `JP:ja` and every query, topic and location runs for each.
- **Built for monitoring.** Duplicates across queries, topics and editions are removed. *Only new articles* remembers what earlier runs returned, so a scheduled run sends you each article once.
- **Polite to publishers.** Publisher pages are read one at a time per site, at least a second apart, and robots.txt is honoured by default.
- **You pay for results, not attempts.** `RUN_SUMMARY` lists what happened to every feed, and failures cost nothing.

### Use cases

- **PR and comms teams:** track brand, CEO and competitor mentions across countries, with daily only-new alerts to Slack or email.
- **Media monitoring and clipping:** collect every article on a topic with the publisher URL, author and image for your reports.
- **Finance and trading:** pull headlines for tickers and companies (`"Nvidia" OR NVDA when:1h`) into a model or dashboard.
- **AI agents and RAG:** feed current news, with full text, into an LLM pipeline. Works from Make, Zapier, n8n, LangChain and Apify's MCP server.
- **Research and data science:** build news datasets by date range, topic or country.
- **SEO and content teams:** see who ranks in Google News for your keywords.

### How to use it

1. Add **Search queries**, one per line, and/or pick **Topics**, add **Local news** locations or paste **Google News URLs**.
2. Set the **Editions** (country:language, `US:en` by default) and a **Time window** or date range.
3. Choose limits, and turn on **Fetch article details** or **Include full article text** if you need them.
4. Click **Start**, then download the dataset as JSON, CSV, Excel or XML, or read it with the Apify API.

#### Input example: two searches from the past 24 hours

```json
{
  "queries": ["artificial intelligence", "\"electric vehicles\""],
  "timeWindow": "1d",
  "maxItemsPerQuery": 25
}
```

#### Input example: brand monitoring in three countries, only new articles, with details

```json
{
  "queries": ["\"Acme Corp\" OR \"Acme Inc\"", "\"Jane Doe\" Acme"],
  "editions": ["US:en", "GB:en", "IN:en"],
  "timeWindow": "1d",
  "onlyNew": true,
  "stateKey": "acme-brand",
  "fetchArticleDetails": true
}
```

Schedule it daily or hourly with Apify Schedules. Each run returns only articles the earlier runs didn't.

#### Input example: Technology and Business headlines for the US and Germany, with full text

```json
{
  "topics": ["TECHNOLOGY", "BUSINESS"],
  "editions": ["US:en", "DE:de"],
  "maxItemsPerQuery": 20,
  "includeArticleText": true
}
```

#### Input example: every Reuters article about Tesla in October 2026, beyond the 100 cap

```json
{
  "queries": ["tesla site:reuters.com"],
  "dateFrom": "2026-10-01",
  "dateTo": "2026-11-01",
  "splitByDay": true,
  "maxItemsPerQuery": 0
}
```

#### Input fields

| Field | What it does |
|---|---|
| `queries` | Google News searches, one per line. Operators: `"phrase"`, `OR`, `-word`, `site:`, `intitle:`, `inurl:`, `when:`, `after:`, `before:` |
| `topics` | `TOP_STORIES`, `WORLD`, `NATION`, `BUSINESS`, `TECHNOLOGY`, `ENTERTAINMENT`, `SPORTS`, `SCIENCE`, `HEALTH` |
| `locations` | Local headlines for a place name: `London`, `Austin, Texas`, `Bavaria` |
| `googleNewsUrls` | Any news.google.com search, topic or publication URL (or its RSS URL), or a topic ID. A URL with its own `hl`/`gl`/`ceid` keeps that edition |
| `editions` | `COUNTRY:language` (Google's `ceid`), e.g. `US:en`, `GB:en`, `IN:en`, `CA:fr`, `DE:de`, `FR:fr`, `ES:es`, `BR:pt-419`, `MX:es-419`, `JP:ja`, `KR:ko`, `TW:zh-Hant`. `hl` and `gl` are derived |
| `language` | Optional `hl` override for every edition |
| `timeWindow` | `1h`, `12h`, `1d`, `2d`, `7d`, `30d`, `1y`, or empty for any time. Sent as `when:` for searches, applied by publish date for other feeds |
| `dateFrom`, `dateTo` | `YYYY-MM-DD`, sent as `after:` / `before:`. Override the time window |
| `splitByDay` | Run each search once per day of the window or date range, to get past Google's ~100-per-search cap |
| `maxItemsPerQuery` | Max new articles per feed (per edition, and per day when split). `0` = all. Default 100 |
| `maxItems` | Max articles in the whole run. `0` = no limit. Default 1,000 |
| `resolveUrls` | Decode Google links to publisher URLs (default on) |
| `fetchArticleDetails` | Read each publisher page for description, image, author, date, site name, language |
| `includeArticleText` | Also extract the main text and word count (turns on details) |
| `respectRobotsTxt` | Skip publisher pages that robots.txt disallows (default on) |
| `dedupe` | Return an article once even if several feeds find it (default on) |
| `onlyNew`, `stateKey` | Skip articles returned by earlier runs with the same key (kept 45 days in the key-value store `google-news-state`) |
| `proxyConfiguration`, `useProxyForPublishers` | Optional Apify Proxy. Google News RSS normally works without one |

### Output

```json
{
  "title": "iPhone Duo vs. Galaxy Z Fold 8 Camera Comparison: Frolicking With Apple's and Samsung's Foldables",
  "publisher": "CNET",
  "publishedAt": "2026-11-07T13:00:09Z",
  "articleUrl": "https://www.cnet.com/tech/mobile/iphone-duo-vs-galaxy-z-fold-8-camera-comparison/",
  "snippet": "I snapped some photos in a dreamy garden with these passport-size phones to see how their rear cameras stack up.",
  "googleNewsUrl": "https://news.google.com/rss/articles/CBMiiAFBVV95cUxQZVNjbEJN...?oc=5",
  "publisherUrl": "https://www.cnet.com",
  "type": "article",
  "feedType": "topic",
  "query": null,
  "searchQuery": null,
  "topic": "TECHNOLOGY",
  "location": null,
  "day": null,
  "edition": "US:en",
  "hl": "en-US",
  "gl": "US",
  "feedUrl": "https://news.google.com/rss/headlines/section/topic/TECHNOLOGY?hl=en-US&gl=US&ceid=US%3Aen",
  "rank": 1,
  "articleId": "CBMiiAFBVV95cUxQZVNjbEJN...",
  "relatedArticles": [
    {"title": "The iPhone Duo has more than 100,000 optimized apps, Apple says", "publisher": "The Verge", "googleNewsUrl": "https://news.google.com/rss/articles/..."}
  ],
  "detailsStatus": "ok",
  "articleTitle": "iPhone Duo vs. Galaxy Z Fold 8 Camera Comparison: Frolicking With Apple's and Samsung's Foldables - CNET",
  "description": "I snapped some photos in a dreamy garden with these passport-size phones to see how their rear cameras stack up.",
  "imageUrl": "https://www.cnet.com/wp-content/uploads/sites/2/iPhone-Duo-vs.-Galaxy-Z-Fold-8-camera-comparison.jpg",
  "author": "Abrar Al-Heeti; CNET",
  "articlePublishedAt": "2026-11-07T08:00:09-05:00",
  "siteName": "CNET",
  "language": "en-US",
  "keywords": ["apple", "samsung"],
  "text": "There are a handful of things Apple's iPhone Duo and Samsung's Galaxy Z Fold 8 have in common...",
  "wordCount": 875,
  "scrapedAt": "2026-11-08T03:42:27Z"
}
```

| Field | Notes |
|---|---|
| `title` | Headline with Google's trailing ` - Publisher` removed |
| `publishedAt` | ISO 8601 in UTC, from the feed. Older articles sometimes carry a date only (midnight US Pacific) |
| `articleUrl` | The publisher's article URL. `null` if it could not be decoded (that article is free) or if `resolveUrls` is off |
| `snippet` | Google's RSS has no snippet text. With article details on, this is the publisher's own description |
| `query` / `searchQuery` | Your query, and the exact `q` sent to Google with time operators added |
| `day` | The day slice, when *Split searches by day* is on |
| `rank` | Position in the Google News feed |
| `relatedArticles` | Topic and top-stories feeds group coverage of one story; the other outlets are listed here |
| `detailsStatus` | `ok`, or why the page was not read: `error: HTTP 403`, `skipped: disallowed by robots.txt`... Only `ok` pages are charged |
| Details fields | `articleTitle`, `description`, `imageUrl`, `author`, `articlePublishedAt`, `siteName`, `language`, `keywords`, plus `text` and `wordCount` with full text on. They appear only when details are on |

The dataset has three views: **Articles**, **Article details** and **Monitoring (compact)**. The key-value store record `RUN_SUMMARY` lists each feed's status, how many articles it had, duplicates removed, links resolved, pages read and any errors.

### Pricing

Pay per event. You pay only for what comes back:

| Event | Price | When |
|---|---|---|
| Article | **$0.002** | Once per article row in the dataset. The decoded article URL is included. Articles whose link could not be decoded are free |
| Article details | **$0.001** | Once per article whose publisher page was read successfully (details and full text cost the same). Blocked, paywalled, robots-disallowed and failed pages are free |

There is no start fee. A feed that fails costs nothing. An empty input returns up to 50 Top stories for the US as a sample, so at most $0.10. Set **Max cost per run** in the run options to cap spending: the actor stops cleanly before an article that would go over the limit.

Examples:

- 10 brand queries, 25 new articles each, every day for a month: 7,500 articles = **$15**
- One-off pull of 1,000 articles with full text: about **$3**
- Hourly headlines for 3 topics in 2 countries, only new (about 300 new articles a day): about **$18 a month**

### Tips

- **Put the time filter in the window, not the query,** unless you need something unusual: a query with its own `when:`, `after:` or `before:` keeps it and ignores the window.
- **Exact phrases cut noise.** `"interest rates"` finds far fewer off-topic articles than `interest rates`.
- **Editions change the results.** `GB:en` and `US:en` give different publishers and rankings for the same query. Add each market you care about.
- **Use `site:` for one publisher**, e.g. `tesla site:reuters.com`. Note that some publishers only appear in some editions.
- **Use a separate `stateKey` per monitor**, so two schedules don't hide each other's articles.
- **Full text is best-effort.** Paywalled sites (WSJ, FT, NYT...) usually return 401/403 or just the intro. Those pages are free and marked in `detailsStatus`.

### Other actors from Tidewell

- [ATS Jobs API](https://apify.com/tidewell/ats-jobs-api): jobs from Greenhouse, Lever, Ashby, Workable and 4 more ATSes
- [Document to Markdown for LLM & RAG](https://apify.com/tidewell/doc-to-markdown): PDF, Word, PowerPoint, Excel and scans to Markdown or RAG chunks
- [Google Trends API](https://apify.com/tidewell/google-trends-api): interest over time, rising queries and Trending Now
- [Website Screenshot & PDF API](https://apify.com/tidewell/website-screenshot-pdf): full-page screenshots and URL to PDF in real Chrome

### FAQ

**Is scraping Google News legal? What about Google's terms?**
The actor reads Google's public RSS feeds and the public article pages they link to, and collects no personal data beyond what publishers print in a byline. Google's feed terms say the feeds are for personal, non-commercial use in a feed reader, and Google's Terms of Service restrict automated access. Using this actor may therefore conflict with Google's terms, and article text belongs to its publishers. You are responsible for how you use the data, including copyright in article text: storing headlines and links for monitoring is a very different thing from republishing articles. If you need a licensed feed, use a commercial news API. This is not legal advice.

**Why are some article URLs null?**
Google occasionally won't decode a link (rare: every link in our tests resolved). The article is still returned with its Google News link, and you are not charged for it.

**Why do I get fewer than 100 results?**
Google News returns at most about 100 articles per search, fewer for narrow queries or short windows. Topic and location feeds return up to about 70. Use *Split searches by day* or more editions to get more.

**Can I get articles older than a month?**
Yes. Use `dateFrom` / `dateTo` (or `after:` / `before:` in the query). Coverage of older dates is thinner than for recent news, and the times of older articles are often date-only.

**How fresh is the data?**
The feeds are live: a `when:1h` search returns articles from the past hour. Hourly schedules with *Only new articles* work well for alerts.

**What happens when Google rate-limits?**
The actor backs off and retries. With Apify Proxy on, it also moves to a new IP. A feed that still fails is reported in `RUN_SUMMARY`, not charged, and the run continues. If every feed fails, the run fails with a clear message, so a schedule doesn't silently store nothing.

**Something broke or looks wrong?**
Open an issue on the actor's Issues tab with the run ID. When Google changes something, the fix ships here.

### Keywords

google news api, google news scraper, google news rss, news scraper, news api, news monitoring, media monitoring, brand monitoring, headlines api, google news search, google news topics, decode google news url, google news redirect, real article url, article text extraction, full text news, news alerts, press monitoring, pr monitoring, n8n news, ai news agent

# Actor input Schema

## `queries` (type: `array`):

One Google News search per line. Google News operators work: "exact phrase", OR, -exclude, site:reuters.com, intitle:tesla, inurl:, when:7d, after:2026-01-01, before:2026-02-01. A query with its own date operator ignores the time window below.

## `topics` (type: `array`):

Google News topic headlines for each edition. 'Nation' is the edition's own country (U.S. for US:en).

## `locations` (type: `array`):

Local headlines for a city, region or country name, as on Google News > Local, e.g. 'London', 'Austin, Texas', 'Bavaria'.

## `googleNewsUrls` (type: `array`):

Paste any news.google.com page (a search, a topic, a publication or a story page) or its RSS URL, or a topic ID such as CAAqJggKIiBDQkFTRWdvSUwyMHZNRGRqTVhZU0FtVnVHZ0pWVXlnQVAB. The actor reads its RSS feed. A URL with its own hl/gl/ceid keeps that edition.

## `editions` (type: `array`):

Google News edition as COUNTRY:language (the ceid parameter), one per line. Every query, topic and location runs once per edition. Examples: US:en, GB:en, IN:en, CA:fr, DE:de, FR:fr, ES:es, IT:it, NL:nl, BR:pt-419, MX:es-419, JP:ja, KR:ko, TW:zh-Hant, AU:en. hl and gl are derived from it (US:en = hl en-US, gl US).

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

Optional. Overrides the hl parameter for every edition, e.g. en-GB or es-419. Leave empty to derive it from the edition.

## `timeWindow` (type: `string`):

Only articles published within this window. Added to searches as when:, and applied to topic, location and URL feeds by publish date.

## `dateFrom` (type: `string`):

Optional start date (YYYY-MM-DD), sent as after:. Overrides the time window.

## `dateTo` (type: `string`):

Optional end date (YYYY-MM-DD), sent as before:.

## `splitByDay` (type: `boolean`):

Google News returns at most about 100 articles per search. With a date range or a time window of 2 days or more, this runs each query once per day, so a 30-day window can return up to about 3,000 articles per query. Duplicates are removed.

## `maxItemsPerQuery` (type: `integer`):

Cap per search, topic, location or URL feed (per edition, and per day when split by day). 0 = everything the feed returns (about 100 for a search).

## `maxItems` (type: `integer`):

Stop after this many articles across all feeds. 0 = no limit. You can also cap spending with the run's maximum cost.

## `resolveUrls` (type: `boolean`):

Decode Google's news.google.com redirect links to the publisher's article URL (articleUrl). Articles whose link can't be decoded are returned with articleUrl null and are free.

## `fetchArticleDetails` (type: `boolean`):

Open each article on the publisher's site and add its description (snippet), image, author, published time, site name and language. Extra charge per page read successfully; pages that are blocked, paywalled or disallowed by robots.txt are free.

## `includeArticleText` (type: `boolean`):

Also extract the main article text (and word count) from the publisher page. Turns on article details. Paywalled pages often return only the intro.

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

Skip publisher pages that robots.txt disallows. Publisher pages are always read politely: one request at a time per site, at least 1 second apart.

## `dedupe` (type: `boolean`):

An article found by several queries, topics or editions is returned once (matched by Google id, article URL, and title + publisher).

## `onlyNew` (type: `boolean`):

For scheduled monitoring: skip articles returned by earlier runs with the same state key. Seen articles are kept for 45 days in the named key-value store 'google-news-state'.

## `stateKey` (type: `string`):

Name for the only-new memory. Use a different key per monitor (e.g. 'brand-acme', 'competitors') so they don't share history.

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

Optional. Google News RSS normally works without a proxy. If Google starts rate-limiting, turn Apify Proxy on: a blocked request then retries on a new IP.

## `useProxyForPublishers` (type: `boolean`):

By default publisher pages are read directly. Turn on to send them through the proxy above.

## Actor input object example

```json
{
  "queries": [
    "artificial intelligence",
    "\"electric vehicles\""
  ],
  "editions": [
    "US:en"
  ],
  "timeWindow": "1d",
  "splitByDay": false,
  "maxItemsPerQuery": 25,
  "maxItems": 50,
  "resolveUrls": true,
  "fetchArticleDetails": false,
  "includeArticleText": false,
  "respectRobotsTxt": true,
  "dedupe": true,
  "onlyNew": false,
  "stateKey": "default",
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "useProxyForPublishers": false
}
```

# Actor output Schema

## `articles` (type: `string`):

One row per article, with the resolved publisher URL and optional page details.

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

Per-feed status: articles found, duplicates, links resolved, pages read and any errors.

# 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 = {
    "queries": [
        "artificial intelligence",
        "\"electric vehicles\""
    ],
    "editions": [
        "US:en"
    ],
    "timeWindow": "1d",
    "maxItemsPerQuery": 25,
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("tidewell/google-news-api").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 = {
    "queries": [
        "artificial intelligence",
        "\"electric vehicles\"",
    ],
    "editions": ["US:en"],
    "timeWindow": "1d",
    "maxItemsPerQuery": 25,
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("tidewell/google-news-api").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 '{
  "queries": [
    "artificial intelligence",
    "\\"electric vehicles\\""
  ],
  "editions": [
    "US:en"
  ],
  "timeWindow": "1d",
  "maxItemsPerQuery": 25,
  "maxItems": 50
}' |
apify call tidewell/google-news-api --silent --output-dataset

```

## MCP server setup

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

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/VwqDrgeQzgb5WmTUH/builds/7933arfgyGdVh2gvo/openapi.json
