# Google News Scraper (`mdcurt/google-news-scraper`) Actor

Scrape Google News headlines by keyword, topic, city or any Google News URL in any language and country. Every record has the title, publisher, publish time, related coverage and the resolved publisher URL - no extra charge for URL resolution.

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

## Pricing

from $2.00 / 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

Pull headlines out of Google News the way you would read it: by **keyword search**, by **topic section** (Top stories, World, Business, Technology, Sports, …), by **city / region** (local news) or from **any Google News URL** you copy from the browser - in any of Google News' languages and country editions.

Every record is one unique story with the headline, publisher name and site, publish time, a short snippet, the other publishers covering the same story, and - unlike the Google News feed itself - the **resolved publisher URL**, so you can open or crawl the real article. URL resolution is included in the per-article price; there is no extra event for it.

Typical uses: media monitoring and brand alerts, competitor and industry news feeds, RSS replacement for dashboards and AI agents, local-news aggregation, trend and sentiment pipelines, feeding an article crawler with fresh publisher links.

### What you get

One dataset record per story:

```json
{
  "id": "CBMirAFBVV95cUxNYjF6M2x3R2hodlk0dGJGZGFKNmNZQlBEOVd1SXA2b2pGQk9wQnl2TnhZeldjZ25ZdzduTERsTTVfeDh5bzJpNXhKRTV6c1NwbnhPTjVjMGJBa1A0WVdWWUxfUHFPTVhLLXdoeVN0MWgtbVhGNGlsT2JzbVF3c3JQSk9XbXprNWIxZ3JhRlE5cW11ZU1US3Z4dmtYYXMwQ2ozY2lNM24tMGV4SXZZ",
  "title": "Exclusive: Longhorns used AI against Florida — a 'new wave' for UT sports",
  "url": "https://www.statesman.com/business/technology/article/texas-football-athletics-ai-bevo-lab-dell-22484462.php",
  "publisher": "Austin American-Statesman",
  "publisherUrl": "https://www.statesman.com",
  "publishedAt": "2026-10-23T14:16:41.000Z",
  "googleNewsUrl": "https://news.google.com/rss/articles/CBMirAFBVV95cUxN...?oc=5",
  "description": "Exclusive: Longhorns used AI against Florida — a 'new wave' for UT sports",
  "relatedArticles": [
    { "id": "CBMi...", "title": "Apple's Foldable iPhone Duo Arrives in Stores: Smartphone Review", "publisher": "The New York Times", "googleNewsUrl": "https://news.google.com/rss/articles/CBMi...?oc=5" }
  ],
  "urlResolution": "api",
  "source": { "type": "search", "value": "artificial intelligence", "feedUrl": "https://news.google.com/rss/search?q=artificial%20intelligence&hl=en-US&gl=US&ceid=US%3Aen" },
  "language": "en-US",
  "country": "US",
  "scrapedAt": "2026-10-24T19:39:05.910Z"
}
```

| Field | Meaning |
|---|---|
| `id` | Google News story id (stable; used for deduplication) |
| `title` | Headline with Google's " - Publisher" suffix removed |
| `url` | Resolved publisher article URL, or `null` when resolution was off or failed |
| `publisher`, `publisherUrl` | Publisher name and homepage as shown by Google News |
| `publishedAt` | ISO 8601 UTC publish time |
| `googleNewsUrl` | The Google News redirect link |
| `description` | Up to 300 characters: the headline, or for clustered stories the related headlines and publishers |
| `relatedArticles` | Other publishers' coverage of the same story (empty when `includeRelated` is off or the story is not clustered) |
| `urlResolution` | `api` (resolved through Google News), `offline` (legacy id decoded locally), `skipped` (`resolveUrls` off) or `failed` |
| `source` | Which feed produced the record: `search`, `topic`, `location` or `url`, with the value and the feed URL |
| `language`, `country` | The Google News edition used |

The key-value store also holds a `SUMMARY` record with feed counts, items seen, duplicates skipped, URL-resolution counts and whether `maxItems` was reached.

### Input

| Field | Type | Default | Notes |
|---|---|---|---|
| `queries` | string\[] | `["artificial intelligence"]` | One Google News search per entry. Operators work: `"exact phrase"`, `OR`, `-word`, `site:reuters.com`, `intitle:`, `allintext:`, `when:7d`, `before:2026-01-01`, `after:2026-01-01`. Each search feed returns up to ~100 newest stories. |
| `topics` | enum\[] | `[]` | Headline sections: `TOP`, `WORLD`, `NATION`, `BUSINESS`, `TECHNOLOGY`, `ENTERTAINMENT`, `SPORTS`, `SCIENCE`, `HEALTH`. |
| `locations` | string\[] | `[]` | Local-news feeds, e.g. `Chicago`, `Sydney NSW`, `Bavaria`. |
| `startUrls` | request list | `[]` | Google News search / topic / section / RSS URLs copied from the browser; converted to RSS automatically. Other URLs are ignored (listed in the log and SUMMARY). |
| `language` | string | `en-US` | Google `hl`: `en-US`, `en-GB`, `de`, `fr`, `es`, `pt-BR`, `ja`, `hi`, … |
| `country` | string | `US` | Google `gl`; empty derives it from the language. Together they pick the edition (`ceid`). |
| `timeRange` | enum | `any` | `1h`, `1d`, `7d`, `1m`, `1y` - applied to search queries only, unless the query already has `when:`. |
| `maxItems` | integer | `100` | Total unique stories per run (exact). |
| `maxItemsPerFeed` | integer | `100` | Cap per query / topic / location / URL. Google returns at most about 100 per feed. |
| `resolveUrls` | boolean | `true` | Resolve each Google News link to the publisher URL (two lightweight requests per story, no extra charge). Off = faster, Google links only. |
| `includeRelated` | boolean | `true` | Keep `relatedArticles`. |
| `proxyConfiguration` | object | Apify proxy | Datacenter proxies are fine for normal volumes; use residential if Google rate-limits very large runs. |

At least one of `queries`, `topics`, `locations` or `startUrls` is required.

#### Example inputs

Media monitoring, last 24 hours, UK edition:

```json
{ "queries": ["\"Acme Corp\" OR \"Acme Corporation\"", "Acme recall"], "language": "en-GB", "country": "GB", "timeRange": "1d", "maxItems": 200 }
```

German business and tech headlines plus Bundesliga, Google links only (fastest):

```json
{ "topics": ["BUSINESS", "TECHNOLOGY"], "queries": ["Bundesliga"], "language": "de", "country": "DE", "resolveUrls": false }
```

Local news for several cities:

```json
{ "locations": ["Chicago", "Austin TX", "Denver"], "maxItemsPerFeed": 30, "maxItems": 90 }
```

### Pricing

Pay per event. **$0.005 per run start** plus **$0.002 per story** returned (`$2 per 1,000`), with publisher URL resolution and related coverage included. A default run of 100 stories costs about $0.21. Compared with other Google News Actors on the Store (typically $0.002–0.005 per item, some charging extra for resolved URLs), this is at the low end with the resolved URL built in.

### How it works and limitations

- The Actor reads Google News' public RSS feeds (search, section, local and topic feeds) and, when `resolveUrls` is on, resolves each story link through Google News' own redirect service to the publisher URL. No login, cookies or CAPTCHA solving are involved.
- Google News caps feeds at roughly 100 stories each. For more coverage, split a broad query into several narrower ones or use `when:` / `before:` / `after:` ranges, and use `locations` and `topics` alongside queries.
- `maxItems` is exact and filled in the order feeds finish; use `maxItemsPerFeed` to balance several feeds.
- Output is facts and metadata only: headline, publisher, time, links and a snippet of at most 300 characters. Article bodies and images are not copied; use the `url` with an article crawler if you need full text.
- Stories are deduplicated by Google's story id within a run (the same story appearing in two feeds is returned once, attributed to the first feed that produced it).
- Google occasionally rate-limits an IP; the Actor retries with a new session and proxy. If a feed still fails after 3 retries it is counted in `SUMMARY.feedsFailed`, and the run fails only when every feed failed.

### Get alerted when records change

Pair this Actor with [Dataset Diff & Alert Monitor](https://apify.com/mdcurt/dataset-diff-monitor) to receive only the new, changed or removed records in Slack, Discord, Telegram or a webhook. Schedule the monitor, not this Actor: it runs this Actor for you, compares runs by `id`, and a run that finds nothing costs only the comparison. Scheduled hourly this is a Google Alerts replacement you control: your keywords, your edition, your channel, at $0.002 per new story plus the comparison.

```json
{
  "sourceActorId": "mdcurt/google-news-scraper",
  "sourceInput": {
    "queries": [
      "\"Acme Corp\" OR \"Acme Corporation\""
    ],
    "timeRange": "1d",
    "maxItems": 100
  },
  "keyFields": [
    "id"
  ],
  "notifyOn": [
    "added"
  ],
  "labelField": "title",
  "urlField": "url",
  "slackWebhookUrl": "https://hooks.slack.com/services/…"
}
```

### Changelog

- **1.0.0** (2026-10-24) - Initial release: search, topic, location and start-URL feeds; language/country editions; time range; publisher URL resolution (API + offline legacy ids); related coverage; exact `maxItems`; SUMMARY record.

# Actor input Schema

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

Keywords to search Google News for, one per line. Google News search operators work: `"exact phrase"`, `OR`, `-excluded`, `site:reuters.com`, `intitle:`, `allintext:`, `when:7d`, `before:2026-01-01`, `after:2026-01-01`. Each query becomes one feed of up to ~100 newest matching stories.

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

Google News headline sections to pull: Top stories, World, Nation (local country), Business, Technology, Entertainment, Sports, Science, Health.

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

Cities, regions or countries for Google News local headline feeds, e.g. `Chicago`, `Bavaria`, `Sydney NSW`. Spell them the way Google News shows them.

## `startUrls` (type: `array`):

Any Google News page or RSS URL copied from the browser: a search (`https://news.google.com/search?q=...`), a topic (`/topics/...`), a section (`/headlines/section/...`) or an RSS feed (`/rss/...`). They are converted to RSS automatically. Non-Google-News URLs are ignored.

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

Google News interface language / edition language code, e.g. `en-US`, `en-GB`, `de`, `fr`, `es`, `pt-BR`, `ja`, `hi`. Combined with Country it selects the Google News edition.

## `country` (type: `string`):

Two-letter country code of the Google News edition, e.g. `US`, `GB`, `DE`, `IN`, `BR`, `AU`. Leave empty to derive it from the language (en-US → US).

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

Restrict search queries to stories published within the last hour, day, 7 days, month or year. Ignored for topics, locations and start URLs, and for queries that already contain a `when:` operator.

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

Stop after this many unique articles across all feeds. You pay per article returned.

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

Cap per query / topic / location / URL. Google News returns at most about 100 stories per feed.

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

Google News links point at news.google.com redirect pages. When enabled, the Actor resolves each one to the publisher's own article URL (`url` field). Costs two extra lightweight requests per article but no extra charge. Turn off for a faster, Google-links-only run.

## `includeRelated` (type: `boolean`):

Keep the `relatedArticles` array (other publishers covering the same story, as shown in Google News) on each record.

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

Proxies to use. Apify datacenter proxies are enough for normal volumes; switch to residential if Google starts rate limiting large runs.

## Actor input object example

```json
{
  "queries": [
    "artificial intelligence"
  ],
  "topics": [],
  "locations": [],
  "startUrls": [],
  "language": "en-US",
  "country": "US",
  "timeRange": "any",
  "maxItems": 100,
  "maxItemsPerFeed": 100,
  "resolveUrls": true,
  "includeRelated": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

One record per unique Google News story: title, publisher, publisher URL, publish time, snippet, related coverage, resolved article URL, and the feed it came from.

## `summary` (type: `string`):

SUMMARY record: feeds requested, feeds succeeded/failed, items seen, duplicates skipped, records pushed, URL resolution counts and whether maxItems was reached.

# 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"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("mdcurt/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": ["artificial intelligence"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("mdcurt/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": [
    "artificial intelligence"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call mdcurt/google-news-scraper --silent --output-dataset

```

## MCP server setup

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