# Google News API: Search, Topics and Original Article URLs (`joesimo/google-news`) Actor

Get Google News articles for any search, topic, city or country edition as clean JSON: headline, publisher, publish time, Google News link and the original article URL. Date ranges, split by day past the 100 result cap, dedupe. No browser or proxy. $1.50 per 1,000 articles.

- **URL**: https://apify.com/joesimo/google-news.md
- **Developed by:** [Joe Simo](https://apify.com/joesimo) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 results

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 API: search, topics, local news and original article URLs

Get Google News articles as clean JSON for any **search query**, **topic** (Business, Technology, Sports...), **city or region**, or **country edition**. Every article comes with its headline, publisher, publish time, the Google News link and, by default, the **original article URL** on the publisher's site.

Built on Google News' public RSS feeds: no browser, no login, no proxy. Fast (100 articles in about 3 seconds) and cheap: **$1.50 per 1,000 articles**.

### What you can use it for

- **Media monitoring and brand alerts:** track mentions of a company, product or person every hour or day.
- **Market and investment research:** news flow for tickers, sectors and competitors.
- **AI and RAG pipelines:** feed fresh headlines and source URLs to an LLM, then fetch the full article from `articleUrl`.
- **Content and SEO research:** what is trending in a topic or country right now, and who is covering it.
- **Local news:** headlines for a city, state or country.
- **Datasets:** daily snapshots over a date range for research or model training (check the terms first, see the legal note).

### Why this Actor

- **Original article URLs.** Google News links point to news.google.com redirects. This Actor resolves them to the publisher's real URL (100% resolved in our tests) and still returns the Google News link.
- **Searches, topics, locations, top stories and raw feed URLs** in one run, across any number of **editions** (country and language).
- **More than 100 results per search.** Google caps each search at about 100 articles. Set a date range and turn on **Split date range by day** to run one search per day (up to 92 days).
- **Exact date filtering** in UTC, with plain dates (`2026-10-01`) or relative spans (`24 hours`, `7 days`).
- **Deduplication** across feeds and editions, publisher exclusion, relevance or newest-first ordering.
- **Related coverage:** topic and top story feeds group several outlets per story; you get them in `relatedArticles`.
- **Clean schema** validated before saving, and a per-feed run summary so you can see exactly what happened.

### Input example

```json
{
    "queries": ["nvidia earnings", "\"electric vehicles\" site:reuters.com"],
    "topics": ["TECHNOLOGY"],
    "locations": ["Boston"],
    "editions": ["US:en", "GB:en"],
    "dateFrom": "7 days",
    "maxItems": 200,
    "sortBy": "newest"
}
```

Each query, topic and location runs once per edition. In the example: (2 queries + 1 topic + 1 location) x 2 editions = 8 feeds.

#### Inputs

| Field | What it does |
|---|---|
| `queries` | Google News searches. Operators work: `"exact phrase"`, `OR`, `-word`, `site:`, `intitle:`, `when:24h`. |
| `topics` | `WORLD`, `NATION`, `BUSINESS`, `TECHNOLOGY`, `ENTERTAINMENT`, `SPORTS`, `SCIENCE`, `HEALTH`, a topic ID (`CAAq...`) or a `news.google.com/topics/...` URL. |
| `locations` | Local headlines for a place name, for example `New York` or `Texas`. |
| `topStories` | Also fetch Top stories for each edition. |
| `feedUrls` | Any Google News search, topic, location or story URL (RSS or web form). Keeps its own edition. |
| `editions` | `COUNTRY:language`, for example `US:en`, `GB:en`, `IN:en`, `DE:de`, `FR:fr`, `ES:es`, `MX:es-419`, `BR:pt-419`, `JP:ja`, `TW:zh-Hant`. Default `US:en`. |
| `dateFrom`, `dateTo` | Date range in UTC: `YYYY-MM-DD`, an ISO date-time, or `24 hours` / `7 days` / `2 weeks`. |
| `splitByDay` | One search per day of the range, to get past the 100 per search limit. |
| `maxItems` | Total articles to save (default 100, 0 = no limit). |
| `maxItemsPerFeed` | Cap per feed. |
| `sortBy` | `relevance` (Google order, feeds interleaved fairly) or `newest`. |
| `dedupe` | Remove the same article seen in several feeds or editions (default on). |
| `excludeSources` | Drop publishers whose name or homepage contains these strings. |
| `resolveUrls` | Resolve original article URLs (default on). Turn off for the fastest runs. |

### Output example

One item per article:

```json
{
    "id": "CBMiggFBVV95cUxPVjFqcXcxNFVD...",
    "title": "Fed holds rates steady despite concerns over inflation",
    "source": "CNBC",
    "sourceUrl": "https://www.cnbc.com",
    "googleNewsUrl": "https://news.google.com/rss/articles/CBMiggFBVV95cUxPVjFqcXcxNFVD...?oc=5",
    "articleUrl": "https://www.cnbc.com/2026/10/28/fed-interest-rate-decision-october-2026.html",
    "urlResolved": true,
    "publishedAt": "2026-10-28T18:00:18.000Z",
    "description": null,
    "relatedArticles": [
        { "title": "Fed leaves rates steady as governor Lisa Cook dissents", "source": "Axios", "googleNewsUrl": "https://news.google.com/rss/articles/CBMib0FV..." }
    ],
    "feedType": "top",
    "feedValue": "Top stories",
    "query": null,
    "language": "en",
    "country": "US",
    "edition": "US:en",
    "rank": 1,
    "feedUrl": "https://news.google.com/rss?hl=en-US&gl=US&ceid=US%3Aen",
    "scrapedAt": "2026-10-28T19:21:03.512Z"
}
```

#### Field reference

| Field | Description |
|---|---|
| `id` | Google News article ID, stable across runs. Use it to dedupe scheduled runs. |
| `title` | Headline without the " - Publisher" suffix Google adds. |
| `source`, `sourceUrl` | Publisher name and homepage. |
| `googleNewsUrl` | Google News link (redirects to the article). |
| `articleUrl`, `urlResolved` | Publisher's original URL, when resolved. |
| `publishedAt` | Publish time, ISO 8601 UTC. |
| `description` | RSS description text when it adds something beyond the headline (often null). |
| `relatedArticles` | Other outlets covering the same story (topic and top story feeds). |
| `feedType`, `feedValue`, `query` | Which feed produced the article: `search`, `topic`, `location`, `top` or `custom`. |
| `language`, `country`, `edition` | Edition the article came from. |
| `rank` | Position in its feed (1 = top). |
| `feedUrl`, `scrapedAt` | The RSS URL fetched and when. |

#### Run summary (key-value store `OUTPUT`)

Articles saved and matched, feeds succeeded and failed (with the error per feed), editions Google actually served, duplicates removed, articles outside the date range, URL resolution stats and HTTP stats.

### Pricing

**Pay per event: $0.0015 per article saved** ($1.50 per 1,000). You are not charged for articles removed by the date range, deduplication, publisher exclusion or limits, or for feeds that fail. The only other charge is the tiny platform run-start fee that every pay-per-event Actor has.

| Run | Articles | Price |
|---|---|---|
| Brand alert, 3 queries, last 24 hours, every hour | about 30 per run | about $0.05 per run |
| Daily briefing, 8 topics, 1 edition | about 550 | about $0.83 |
| 1 query, 30 days split by day | up to about 3,000 | up to about $4.50 |

Set **Maximum cost per run** in the run options to cap spending. The Actor saves exactly as many articles as the cap allows (and only resolves URLs for those), stops cleanly and still writes the run summary.

### Limits and good to know

- Google returns **about 100 articles per search feed** and about 40 to 70 per topic or location feed. Use more queries, editions or **Split date range by day** to get more.
- Searches use Google's relevance order, not strictly newest first. Use `sortBy: newest` or a date range when recency matters.
- **Unknown editions** (for example `XX:zz`) are silently served as US English by Google. The run summary flags this with a warning per feed.
- **URL resolution** uses two light requests per 10 articles plus one per article. If Google starts rate limiting, resolution pauses, the remaining articles keep their Google News link and the run still succeeds. Run summary field `urlResolution` shows the counts.
- Articles have headline, publisher and time only; the RSS feeds do not include full article text. Fetch `articleUrl` yourself if you need the body, respecting the publisher's terms.
- Default memory is 256 MB. Peak memory in our tests was about 145 MB for 1,000 articles with URL resolution. There is no reason to raise it.

### FAQ

**Do I need an API key or a proxy?**
No. The Actor reads Google News' public RSS feeds. A proxy option exists only for unusual cases.

**How fresh is the data?**
Live. Google News feeds update every few minutes.

**How do I get only new articles on a schedule?**
Schedule the Actor (for example hourly) with `dateFrom: "2 hours"` and dedupe on `id` in your destination.

**Why is `articleUrl` null for some articles?**
Google rate limited URL resolution for that run, or the link could not be decoded. `googleNewsUrl` always works and redirects to the article.

**Can I search in other languages?**
Yes. Add editions such as `DE:de` or `JP:ja`; queries are sent as you type them.

### Legal note

This Actor reads public Google News RSS feeds and saves headline-level metadata (headline, publisher, time and links). It does not log in, bypass access controls or break captchas, and it does not collect personal data. Google's feeds carry a notice that they are provided for personal, non-commercial feed reader use, and article content belongs to the publishers. You are responsible for making sure your use complies with Google's terms, publishers' rights and applicable law (for example copyright). Link back to the original article when you republish anything. Google News is a trademark of Google LLC. This Actor is not affiliated with or endorsed by Google.

### Support

Something not working, or want another field? Open an issue on the Actor's **Issues** tab with your input. Contact: joesimo@mail.grokbot.com

# Actor input Schema

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

One search per line. Google News search operators work: <code>"exact phrase"</code>, <code>OR</code>, <code>-exclude</code>, <code>site:reuters.com</code>, <code>intitle:</code>, <code>when:24h</code>. Each search returns up to 100 articles per edition (a Google limit). For more, set a date range and turn on <b>Split date range by day</b>.

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

Topic headline feeds. Use <code>WORLD</code>, <code>NATION</code>, <code>BUSINESS</code>, <code>TECHNOLOGY</code>, <code>ENTERTAINMENT</code>, <code>SPORTS</code>, <code>SCIENCE</code>, <code>HEALTH</code>, a topic ID starting with <code>CAAq</code>, or a <code>news.google.com/topics/...</code> URL.

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

Local headline feeds for a city, region or country name, for example <code>Boston</code>, <code>Texas</code> or <code>London</code>.

## `topStories` (type: `boolean`):

Also fetch the Top stories feed for every edition.

## `feedUrls` (type: `array`):

Any Google News search, topic, location or story URL, either the RSS form (<code>news.google.com/rss/...</code>) or the web page form (<code>news.google.com/topics/...</code>). Each URL keeps its own edition (hl, gl, ceid).

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

Google News editions to query, as <code>COUNTRY:language</code>. Examples: <code>US:en</code>, <code>GB:en</code>, <code>IN:en</code>, <code>CA:fr</code>, <code>DE:de</code>, <code>FR:fr</code>, <code>ES:es</code>, <code>MX:es-419</code>, <code>BR:pt-419</code>, <code>JP:ja</code>, <code>TW:zh-Hant</code>. Every query, topic and location runs once per edition. Unknown editions fall back to US:en and are flagged in the run summary.

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

Keep only articles published on or after this date (UTC). Use <code>YYYY-MM-DD</code>, an ISO date-time, or a relative span such as <code>24 hours</code>, <code>7 days</code> or <code>2 weeks</code>. For searches the range is also sent to Google, so you get articles from that period, not just the newest 100.

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

Keep only articles published on or before this date (UTC, the whole day is included). Same formats as above. Leave empty for now.

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

For searches with a date range, run one search per day (up to 92 days) to get past the 100 results per search limit. A 30 day range can return up to about 3,000 articles per query.

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

Maximum number of articles to save in total. You pay per saved article. Use 0 for no limit.

## `maxItemsPerFeed` (type: `integer`):

Cap for each single feed (each query, topic or location per edition, or each day when splitting). 0 means everything the feed returns (Google returns up to 100).

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

<b>Relevance</b> keeps Google's order and interleaves feeds so each query gets a fair share of Max articles. <b>Newest first</b> sorts everything by publish date.

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

Drop articles already seen in another feed or edition (same Google article ID, or same title from the same publisher).

## `excludeSources` (type: `array`):

Drop articles whose publisher name or homepage contains any of these strings, for example <code>Yahoo</code> or <code>msn.com</code>. Case-insensitive.

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

Google News links redirect through news.google.com. With this on, each saved article also gets <code>articleUrl</code>, the publisher's own URL (2 light requests per 10 articles plus one per article). If Google starts rate limiting, resolution pauses and the remaining articles keep only their Google News link; the run still succeeds. Turn off for the fastest runs.

## `resolveConcurrency` (type: `integer`):

How many article links are resolved at the same time. Lower it if the run summary shows URL resolution paused.

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

How many RSS feeds are fetched at the same time.

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

Timeout for each HTTP request.

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

Retries with exponential backoff for network errors, HTTP 429 and 5xx responses.

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

Not needed for normal use: Google News RSS works without a proxy. Only set one if your runs report many failed feeds or paused URL resolution.

## Actor input object example

```json
{
  "queries": [
    "nvidia earnings",
    "\"climate change\" site:reuters.com",
    "openai when:7d"
  ],
  "topics": [
    "BUSINESS",
    "SCIENCE"
  ],
  "locations": [
    "New York",
    "London"
  ],
  "topStories": false,
  "editions": [
    "US:en"
  ],
  "splitByDay": false,
  "maxItems": 100,
  "maxItemsPerFeed": 0,
  "sortBy": "relevance",
  "dedupe": true,
  "resolveUrls": true,
  "resolveConcurrency": 4,
  "maxConcurrency": 5,
  "requestTimeoutSecs": 30,
  "maxRetries": 4
}
```

# Actor output Schema

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

One article per item: headline, publisher, publish time, Google News link and the original article URL.

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

JSON summary with articles saved, feeds fetched and failed, duplicates removed and URL resolution stats.

# 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"
    ],
    "topics": [
        "TECHNOLOGY"
    ],
    "editions": [
        "US:en"
    ],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("joesimo/google-news").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",
    ],
    "topics": ["TECHNOLOGY"],
    "editions": ["US:en"],
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("joesimo/google-news").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"
  ],
  "topics": [
    "TECHNOLOGY"
  ],
  "editions": [
    "US:en"
  ],
  "maxItems": 100
}' |
apify call joesimo/google-news --silent --output-dataset

```

## MCP server setup

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

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/hTqBAwH1Tx44EeqPg/builds/fDJJm8tHYOKeXK7IU/openapi.json
