# Google News Scraper: Headlines, Topics & Real Article URLs (`datadesk-io/google-news-scraper`) Actor

Input: keywords (Google operators OK), topics, countries/languages, date range. Output: one row per article: title, source, publish date, real publisher URL, related coverage. Past the 100-result limit. No login, no API key. $1.50 per 1,000 articles.

- **URL**: https://apify.com/datadesk-io/google-news-scraper.md
- **Developed by:** [DataDesk](https://apify.com/datadesk-io) (community)
- **Categories:** News, SEO tools, AI
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 articles

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 News Scraper: Headlines, Topics & Real Article URLs

Scrape **Google News** by keyword, topic, country/language and date range. Every row has the headline, publisher, publish time and the **real article URL on the publisher's site** (not the `news.google.com` redirect). Goes **past Google News' 100-results limit** by searching day by day. No login, no API key, no browser.

🇪🇸 [Español](#español) · 🇧🇷 [Português](#português)

### What you get

- **Keyword search** with Google operators: `"exact phrase"`, `site:reuters.com`, `intitle:`, `OR`, `-exclude`.
- **Topic feeds** (Top stories, World, Nation, Business, Technology, Entertainment, Sports, Science, Health) with **related coverage** from other outlets.
- **Any edition**: `US:en`, `GB:en`, `IN:en`, `DE:de`, `FR:fr`, `MX:es-419`, `BR:pt-419`, `JP:ja`... several in one run.
- **Time range** (past hour/day/week/month/year) or an exact **date range** (`dateFrom`/`dateTo`).
- **Real publisher URLs** resolved with Google News' own link resolver (included in the price). In our tests 2,500+ of 2,500+ links resolved.
- **More than 100 results per keyword**: above 100 the Actor splits the search into one-day windows (up to ~100 articles per day per edition).
- Stable `articleId` to de-duplicate between scheduled runs.

### Real test numbers (2026-10-28)

- Empty input: 100 articles, 8 s, 100/100 URLs resolved.
- 2 keywords + 2 topics × 2 editions (US, BR): 240 articles, 16 s.
- `bitcoin` + `nvidia`, Oct 1–27, cap 1,000 each: 2,000 articles, 156 s, 2,000/2,000 URLs resolved, 0 duplicates.

### Sources and coverage

| Source | Coverage | Data |
|---|---|---|
| **Google News RSS search** | Any query, 40+ region/language editions (e.g. US:en, MX:es, BR:pt-419) | title, publisher, publish date, real article URL |
| **Google News topics** | WORLD, BUSINESS, TECHNOLOGY, SPORTS, HEALTH... | same fields per topic |

### How to use it

1. Click **Try for free** (or **Start**): the prefilled input runs a quick test.
2. Fill in the input fields (see the examples below). Every field is optional.
3. Click **Start** and wait a few seconds to minutes, depending on how many articles you ask for.
4. Open the **Output** tab and export as **JSON, CSV, Excel, XML or HTML**, or read the results via API.

### Input examples

**Keyword (default):**

```json
{"searchQueries": ["artificial intelligence"], "regions": ["US:en"], "maxArticlesPerQuery": 20}
```

**Last 24h, several countries:**

```json
{"searchQueries": ["Tesla"], "regions": ["US:en", "GB:en", "DE:de"], "timeRange": "1d"}
```

**Topics feed:**

```json
{"topics": ["BUSINESS", "TECHNOLOGY"], "regions": ["MX:es-419"]}
```

**Date range:**

```json
{"searchQueries": ["inflation"], "dateFrom": "2026-10-01", "dateTo": "2026-10-31", "maxArticlesPerQuery": 100}
```

#### Input fields

| Field | Type | Description |
|---|---|---|
| `searchQueries` | array | What you would type in the Google News search box. Google operators work: "exact phrase", site:reuters.com, intitle:tesla, OR, -exclude. If you leave both this and Top… |
| `topics` | array | Current Google News headline sections for each region (about 30-70 stories each, with related coverage from other outlets). Optional. |
| `regions` | array | Google News editions as COUNTRY:language. Examples: US:en, GB:en, IN:en, CA:fr, DE:de, FR:fr, ES:es, MX:es-419, AR:es-419, BR:pt-419, PT:pt-150, IT:it, JP:ja. Every ke… |
| `timeRange` | string | Only articles published in this period (search keywords only). Ignored when you set a date range below. |
| `dateFrom` | string | Optional start date. With a date range the Actor searches day by day, which goes past Google News' 100-results-per-search limit. |
| `dateTo` | string | Optional end date (inclusive). Defaults to today. |
| `maxArticlesPerQuery` | integer | Google News returns up to ~100 articles per search. Above 100 the Actor automatically splits the search into one-day windows (newest first) until this cap, the date ra… |
| `maxResults` | integer | Hard cap on articles for the whole run (all keywords, topics and regions). Never exceeded. |
| `decodeUrls` | boolean | Google News links (news.google.com/rss/articles/...) are converted to the real article URL on the publisher's site (articleUrl). Included in the price. Turn off for sl… |

### Output example (real run, 2026-10-28, topic BUSINESS, US:en)

```json
{
  "query": null,
  "topic": "BUSINESS",
  "region": "US:en",
  "position": 1,
  "title": "Fed meeting live updates: No hike expected, but investors watching Warsh for what's next",
  "source": "CNBC",
  "sourceUrl": "https://www.cnbc.com",
  "publishedAt": "2026-10-28T15:05:00Z",
  "articleUrl": "https://www.cnbc.com/2026/10/28/fed-meeting-today-live-updates.html",
  "urlResolved": true,
  "googleNewsUrl": "https://news.google.com/rss/articles/CBMidkFVX3lxTE1t...?oc=5",
  "articleId": "CBMidkFVX3lxTE1t...",
  "relatedArticles": [
    {"title": "The Federal Reserve Will Release Its Interest Rate Decision Today. Here’s What to Watch.", "source": "The New York Times", "googleNewsUrl": "https://news.google.com/rss/articles/CBMihgFB..."},
    {"title": "Fed expected to hold interest rates steady as inflation tops midterm voters’ concerns", "source": "NBC News", "googleNewsUrl": "https://news.google.com/rss/articles/CBMimwFB..."}
  ],
  "relatedCount": 4,
  "searchDate": null,
  "scrapedAt": "2026-10-28T15:24:05Z"
}
```

#### Output fields

| Field | Description |
|---|---|
| `query` | Search keyword that found the article (empty for topic feeds) |
| `topic` | Topic feed (e.g. BUSINESS) when the article came from a headline section |
| `region` | Google News edition (COUNTRY:language) |
| `position` | Position in the Google News feed (1 = first) |
| `title` | Headline (without the trailing " - Source") |
| `source` | Publisher name |
| `sourceUrl` | Publisher homepage |
| `publishedAt` | Publication date and time (ISO 8601, UTC) |
| `articleUrl` | Real article URL on the publisher site (resolved from the Google News link) |
| `urlResolved` | True when articleUrl was resolved |
| `googleNewsUrl` | Original Google News link |
| `articleId` | Google News article id (stable; use it to deduplicate between runs) |
| `relatedArticles` | Other outlets covering the same story (title, source, Google News link); mostly on topic feeds |
| `relatedCount` | Number of related articles |
| `searchDate` | Day window used when the search was split by day (past 100 results) |
| `scrapedAt` | When the row was scraped (ISO 8601, UTC) |

The Output tab has a **Articles** view.

### Pricing

Pay-per-event: you pay only for results delivered, no monthly fee.

- **Article** (`article`): **$1.50 per 1,000** ($0.0015 each)
- **Actor start:** $0.005 per run

| Run | Articles | Cost |
|---|---|---|
| Quick test | 20 | $0.035 |
| Small run | 100 | $0.155 |
| Regular run | 1,000 | $1.505 |
| Large run | 10,000 | $15.005 |

Rows that are not delivered are never charged. Apify's free plan includes monthly credit, and you can set a maximum cost per run in the run options.

### Use cases

Media monitoring and brand mentions, PR and competitor tracking, market and crypto news feeds, news datasets for sentiment analysis and LLM/RAG pipelines, local-news research in any country and language.

### Integrations and API

- Export results as JSON, CSV, Excel, XML or HTML from the Output tab.
- **Schedule** runs (daily, hourly) and send results to Google Sheets, Slack, Zapier, Make, n8n, Airbyte or webhooks.
- Call it from code with the [Apify API](https://docs.apify.com/api/v2):

```bash
curl -X POST "https://api.apify.com/v2/acts/datadesk-io~google-news-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchQueries": ["artificial intelligence"], "regions": ["US:en"], "maxArticlesPerQuery": 20}'
```

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("datadesk-io/google-news-scraper").call(run_input={'searchQueries': ['artificial intelligence'], 'regions': ['US:en'], 'maxArticlesPerQuery': 20})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item.get('title'))
```

### FAQ

**Do I need a Google account or API key?** No.
**Is it legal?** It collects public headline metadata (title, source, date, link) that Google News shows to anyone. You are responsible for how you use it: respect publishers' copyright and Google's terms, and don't republish full articles.
**Why are some `articleUrl` empty?** Very rarely Google's resolver doesn't answer for a link; `googleNewsUrl` still opens the article.

***

**How fresh is the data?** Live: every run reads the source at that moment. Schedule it to keep a dataset up to date.

**Why did I get fewer articles than the maximum?** The source had fewer matching articles, or duplicates were removed. You only pay for articles delivered.

### Limitations

- Google News gives headline, source, time and link. It does **not** give the article body or images; open `articleUrl` for those.
- Google caps each search at ~100 results, so day-by-day splitting returns at most ~100 per day per edition. Very busy topics can have more than that in a day.
- Publication dates come from Google; a few articles fall on the day next to the searched window (time zones).
- Topic feeds hold the current headlines only (about 30-70 stories), not history.
- If Google rate-limits the run, the Actor retries and then uses the Apify datacenter proxy included in your plan. Partial results are kept.

### Support

Found a bug, or need a new field, source or filter? Open an issue in the **Issues** tab; we usually answer within 24 hours. Custom data work: datadesk.io@proton.me.

### Español

**Google News Scraper**: extrae noticias de Google News por palabra clave (con operadores de Google), tema, país/idioma y rango de fechas. Cada fila trae titular, medio, fecha de publicación y la **URL real del artículo** en el sitio del medio. Supera el **límite de 100 resultados** buscando día por día. Sin login ni API key.

- Ediciones de cualquier país: `MX:es-419`, `AR:es-419`, `CO:es-419`, `ES:es`, `US:es-419`...
- Temas: portada, mundo, nacional, negocios, tecnología, entretenimiento, deportes, ciencia, salud (con cobertura relacionada).
- Precio: **US$1,50 por 1.000 artículos** + US$0,005 por corrida, solo si hay resultados.
- Ejemplo: `{"searchQueries": ["elecciones"], "regions": ["MX:es-419", "AR:es-419"], "timeRange": "7d"}`.

### Português

**Google News Scraper**: extrai notícias do Google News por palavra-chave (com operadores do Google), tema, país/idioma e período. Cada linha traz manchete, veículo, data de publicação e a **URL real da matéria** no site do veículo. Passa do **limite de 100 resultados** buscando dia a dia. Sem login nem API key.

- Edições de qualquer país: `BR:pt-419`, `PT:pt-150`...
- Temas: principais, mundo, Brasil (NATION), negócios, tecnologia, entretenimento, esportes, ciência, saúde (com cobertura relacionada).
- Preço: **US$1,50 por 1.000 matérias** + US$0,005 por execução, só quando há resultados.
- Exemplo: `{"searchQueries": ["inteligência artificial"], "regions": ["BR:pt-419"], "timeRange": "1d"}`.

### Use with AI agents (MCP)

This Actor works as a tool for AI agents through the [Apify MCP server](https://mcp.apify.com). Add it to Claude, ChatGPT, Cursor, VS Code or any MCP client:

`https://mcp.apify.com/?tools=datadesk-io/google-news-scraper`

Sign in with OAuth or `Authorization: Bearer <APIFY_TOKEN>`. Local stdio config:

```json
{"mcpServers": {"google-news": {"command": "npx", "args": ["-y", "@apify/actors-mcp-server", "--tools", "datadesk-io/google-news-scraper"], "env": {"APIFY_TOKEN": "<token>"}}}}
```

**What goes in → what comes out:** Input: keywords and/or topics, editions, time or date range, caps. Output: one JSON row per article with title, source, publish time, real publisher URL and related coverage. Every input is optional and every output field is documented.

**Example prompt:** "Get this week's Google News articles about 'Anthropic' in the US and UK editions and group them by publisher." Use `maxArticlesPerQuery` or `maxResults` to cap the cost of one call.

# Actor input Schema

## `searchQueries` (type: `array`):

What you would type in the Google News search box. Google operators work: "exact phrase", site:reuters.com, intitle:tesla, OR, -exclude. If you leave both this and Topics empty, the Actor searches 'artificial intelligence'.

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

Current Google News headline sections for each region (about 30-70 stories each, with related coverage from other outlets). Optional.

## `regions` (type: `array`):

Google News editions as COUNTRY:language. Examples: US:en, GB:en, IN:en, CA:fr, DE:de, FR:fr, ES:es, MX:es-419, AR:es-419, BR:pt-419, PT:pt-150, IT:it, JP:ja. Every keyword and topic runs in every edition.

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

Only articles published in this period (search keywords only). Ignored when you set a date range below.

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

Optional start date. With a date range the Actor searches day by day, which goes past Google News' 100-results-per-search limit.

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

Optional end date (inclusive). Defaults to today.

## `maxArticlesPerQuery` (type: `integer`):

Google News returns up to ~100 articles per search. Above 100 the Actor automatically splits the search into one-day windows (newest first) until this cap, the date range or the time range is reached.

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

Hard cap on articles for the whole run (all keywords, topics and regions). Never exceeded.

## `decodeUrls` (type: `boolean`):

Google News links (news.google.com/rss/articles/...) are converted to the real article URL on the publisher's site (articleUrl). Included in the price. Turn off for slightly faster runs.

## Actor input object example

```json
{
  "searchQueries": [
    "artificial intelligence"
  ],
  "regions": [
    "US:en"
  ],
  "timeRange": "any",
  "maxArticlesPerQuery": 100,
  "decodeUrls": true
}
```

# Actor output Schema

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

One row per news article (see dataset schema for field descriptions).

# 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 = {
    "searchQueries": [
        "artificial intelligence"
    ],
    "regions": [
        "US:en"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("datadesk-io/google-news-scraper").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 = {
    "searchQueries": ["artificial intelligence"],
    "regions": ["US:en"],
}

# Run the Actor and wait for it to finish
run = client.actor("datadesk-io/google-news-scraper").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 '{
  "searchQueries": [
    "artificial intelligence"
  ],
  "regions": [
    "US:en"
  ]
}' |
apify call datadesk-io/google-news-scraper --silent --output-dataset

```

## MCP server setup

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

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/yK44ScUyLumFwbhJo/builds/ezdRCs0zebTlTlWpu/openapi.json
