# Google News Scraper (Search, Topics, Top Stories) (`praguedatalab/google-news-scraper`) Actor

Google News articles by keyword, topic or top stories in any of 80+ editions: title, source, publisher URL, date, related coverage. Date ranges past 100 results. No proxy needed. $0.70 per 1,000.

- **URL**: https://apify.com/praguedatalab/google-news-scraper.md
- **Developed by:** [Prague Data Lab](https://apify.com/praguedatalab) (community)
- **Categories:** News, Marketing, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.70 / 1,000 news articles

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

Get Google News articles for any search query, for a topic, or for the top stories of 80+ country editions, one row per article: headline, publisher, link, publication date and related coverage. Media monitoring teams, analysts and researchers use it to follow a subject over time. $0.70 per 1,000 articles.

### Why this one

| | Price per 1,000 results |
|---|---|
| **This Actor** | $0.70 |
| Popular alternatives (top 5 on the Store by users) | $2.00 – $5.00 |

The top five Actors for "google news scraper" list between $2 and $5 per 1,000 articles.

### Quick start

Run the Actor with this input. Every other field has a default.

```json
{
  "queries": [
    "electric vehicles"
  ],
  "timeframe": "1d",
  "maxItems": 50
}
```

**Compatible with the input of the leading Google News Actors**, so you can switch by changing only the Actor ID:

| Leader | Fields accepted as they are |
|---|---|
| `data_xplorer/google-news-scraper-fast` | `keyword`, `maxArticles`, `timeframe` (`1h`, `1d`, `1w`, `1m`, `1y`), `region_language` (`US:en`…), `proxyConfiguration` |
| `lhotanova/google-news-scraper` | `query`, `topics`, `topicsHashed`, `language`, `maxItems`, `dateFrom`, `dateTo`, `openEndedDateRange` (`12h`, `7d`…), `fetchArticleDetails` (→ `decodeUrls`) |
| `easyapi/google-news-scraper` | `query`, `maxItems`, `gl`, `hl`, `time_period` (`last_hour` … `last_year`) |

Output keeps their main field names too: `title`, `source`, `sourceUrl`, `link`, `url`, `rssLink`, `guid`, `publishedAt`, `publishedTimestamp`.

### Output example

One row, trimmed. The full field list is further down this page.

```json
{
  "title": "UK Taxman to Tackle Rogue Advice From Artificial Intelligence",
  "source": "Bloomberg.com",
  "link": "https://www.bloomberg.com/news/articles/2026-10-22/uk-taxman-to-tackle-rogue-advice-from-artificial-intelligence",
  "publishedAt": "2026-10-22T04:00:00.000Z",
  "query": "artificial intelligence",
  "position": 2,
  "isDecoded": true
}
```

### Use it from your code

The Actor id is `praguedatalab/google-news-scraper`. Replace `YOUR_APIFY_TOKEN` with your Apify API token.

**Python** (`pip install apify-client`)

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("praguedatalab/google-news-scraper").call(run_input={"queries":["electric vehicles"],"timeframe":"1d","maxItems":50})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

**JavaScript** (`npm install apify-client`)

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('praguedatalab/google-news-scraper').call({"queries":["electric vehicles"],"timeframe":"1d","maxItems":50});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

**curl** (returns the rows as JSON; the endpoint waits for the run, up to 5 minutes, so keep the limits small)

```bash
curl -X POST "https://api.apify.com/v2/acts/praguedatalab~google-news-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"queries":["electric vehicles"],"timeframe":"1d","maxItems":50}'
```

### Use it with AI agents

AI assistants can call `praguedatalab/google-news-scraper` through the Apify MCP server to get the latest articles for a query as JSON rows.

### FAQ

#### Is it legal to scrape Google News?

The Actor reads the public Google News feeds and the links in them. It does not download article text. The articles belong to their publishers, so check the reuse rules before you republish headlines.

#### How much do 10,000 results cost?

$7.00. The price is $0.70 per 1,000 articles. Duplicates are not saved and not charged.

#### Do I need a proxy?

No. The default input does not use a proxy. Publisher link decoding is best effort: if Google shows a captcha, the rest of the run keeps the `news.google.com` link (`isDecoded` is `false`). The Actor never solves captchas.

#### How fresh is the data?

Each run reads the feeds when it runs. Use `timeframe`, or `dateFrom` and `dateTo`, to choose the period. A feed holds at most 100 articles per query.

#### Can I export to Excel, CSV or Google Sheets?

Yes. Each run saves a dataset that you can download as JSON, CSV or Excel. For Google Sheets, import the CSV, or connect Apify to Google Sheets with an integration.

#### Can I schedule it daily?

Yes. In the Apify Console, open the Actor, go to Schedules, and add a daily schedule with the same input. Each run is billed per result, as usual.

### Input

| Field | Type | Description |
|---|---|---|
| `queries` | array of strings | Google News searches. Operators work: `"exact phrase"`, `OR`, `-exclude`, `site:reuters.com`, `intitle:`. Aliases: `keyword`, `query`. |
| `topics` | array of strings | `WORLD`, `NATION`, `BUSINESS`, `TECHNOLOGY`, `ENTERTAINMENT`, `SPORTS`, `SCIENCE`, `HEALTH`, or a hashed topic id from a `news.google.com/topics/<id>` URL. |
| `topStories` | boolean | Also read the edition's top stories (automatic when no query and no topic is given). |
| `language` | string | Edition as `COUNTRY:lang`, e.g. `US:en`, `GB:en`, `FR:fr`, `DE:de`, `CZ:cs`. Default `US:en`. Aliases: `region_language`, `gl` + `hl`. |
| `timeframe` | string | `1h`, `1d`, `7d`, `30d`, `1y` (also `1w`, `1m`, `12h`, `3d`, `last_week`…). Ignored when `dateFrom`/`dateTo` is set. |
| `dateFrom`, `dateTo` | string | Publication days, `YYYY-MM-DD`. `dateTo` defaults to today. |
| `maxItems` | integer | Maximum articles saved per run, all feeds together (queries first, then topics, then top stories). Default 100. Alias: `maxArticles`. |
| `splitByDay` | boolean | Google returns at most 100 articles per search. When `maxItems` is above 100 and the range covers several days, each day is searched separately. Default on. |
| `decodeUrls` | boolean | Replace the `news.google.com` link with the publisher article URL (two extra requests per article, about 1 s each). Default off. |
| `deduplicate` | boolean | Save each article once across queries, days and topics. Default on. |
| `proxyConfiguration` | object | Not needed. Use it only if Google rate-limits your runs. |

### Output fields

| Field | Description |
|---|---|
| `title` | Headline without the " - Source" suffix Google adds. |
| `source` | Publisher name. |
| `sourceUrl` | Publisher home page. |
| `link` | Publisher article URL when `decodeUrls` worked, otherwise the `news.google.com` link (it opens the article in a browser). |
| `url` | Same as `link`. |
| `rssLink` | The `news.google.com/rss/articles/…` link from the feed. |
| `isDecoded` | `true` when `link` is the publisher URL. |
| `guid` | Google News article id, used for deduplication. |
| `publishedAt` | Publication time, ISO 8601 UTC. |
| `publishedTimestamp` | Publication time in milliseconds since 1970. |
| `position` | Position in its feed, 1 = first. |
| `query` | Search query that returned the article (`null` for topics and top stories). |
| `topic` | Topic name or id, `TOP_STORIES`, or `null` for searches. |
| `feed` | `search`, `topic` or `top`. |
| `language` | Edition used. |
| `relatedArticles` | Other coverage of the same story: `title`, `source`, `link`. |
| `scrapedAt` | When the row was saved, ISO 8601 UTC. |

### Pricing

Pay per event: **$0.0007 per article saved** ($0.70 per 1,000), the same with or without `decodeUrls`. Duplicates are not saved and not charged. Set `maxItems` (or a maximum cost per run) to control the total. No platform usage is added on top.

### Limits

- Google News returns at most 100 articles per feed. Long ranges are split into days automatically. A single very busy day still caps at 100 per query, so split the query into narrower ones (`site:`, extra keywords) if you need more.
- Decoding publisher URLs is best effort. If Google answers with a captcha page, decoding stops for the rest of the run and those rows keep the `news.google.com` link (`isDecoded: false`). The Actor never solves captchas.
- Article bodies are not downloaded. Use the `link` with a page scraper if you need the text.
- Headlines and links come from Google News feeds; the articles belong to their publishers.

# Actor input Schema

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

One Google News search per line. Google operators work: <code>"exact phrase"</code>, <code>OR</code>, <code>-exclude</code>, <code>site:reuters.com</code>, <code>intitle:</code>. The leader field names <code>keyword</code> and <code>query</code> are accepted too.

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

Topic feeds: WORLD, NATION, BUSINESS, TECHNOLOGY, ENTERTAINMENT, SPORTS, SCIENCE, HEALTH, or a hashed topic id copied from a news.google.com/topics/\<id> URL.

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

Also read the top stories of the edition. Used automatically when no query and no topic are given.

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

Google News edition, as COUNTRY:language. The leader names <code>region_language</code> and <code>gl</code> + <code>hl</code> work too. Default US:en.

## `timeframe` (type: `string`):

Only articles from the last hour, day, week, month or year. Ignored when dateFrom or dateTo is set. Also accepted: <code>time_period</code> (last_hour…last_year) and <code>openEndedDateRange</code> (e.g. 12h, 3d, 2w).

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

First publication day, YYYY-MM-DD. With dateTo (default today), searches day by day so you can get more than the 100 articles Google returns per search.

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

Last publication day, YYYY-MM-DD.

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

Maximum articles saved in this run (all queries and topics together). You pay per article saved. Alias: maxArticles. Default 100.

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

Google returns at most 100 articles per search. When maxItems is above 100 and the date range covers several days, search each day separately.

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

Replace the news.google.com link with the publisher article URL (2 extra requests per article, slower). If Google asks for a captcha, decoding stops and the remaining rows keep the Google link. Alias: fetchArticleDetails. Off by default.

## `deduplicate` (type: `boolean`):

Save each article once even when several queries, days or topics return it. Duplicates are not charged.

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

Not needed: the RSS feeds answer from Apify servers. Use it only if Google rate-limits you.

## Actor input object example

```json
{
  "queries": [
    "electric vehicles"
  ],
  "topics": [],
  "topStories": false,
  "language": "US:en",
  "timeframe": "1d",
  "maxItems": 50,
  "splitByDay": true,
  "deduplicate": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "queries": [
        "electric vehicles"
    ],
    "language": "US:en",
    "timeframe": "1d",
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("praguedatalab/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 = {
    "queries": ["electric vehicles"],
    "language": "US:en",
    "timeframe": "1d",
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("praguedatalab/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 '{
  "queries": [
    "electric vehicles"
  ],
  "language": "US:en",
  "timeframe": "1d",
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call praguedatalab/google-news-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,praguedatalab/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/1TovmM8KyU3hVhfmf/builds/N68QWBGrlqNd5kwzC/openapi.json
