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

Scrapes Google News for any query. Extracts the full canonical news-vertical schema: title, URL, source, publisher (with logo and verified flag), excerpt, thumbnail, publish date, author, category, topics, breaking/featured flags, and more.

- **URL**: https://apify.com/searchapi/google-news-scraper.md
- **Developed by:** [Search API](https://apify.com/searchapi) (community)
- **Categories:** Automation, Developer tools, News
- **Stats:** 2 total users, 0 monthly users, 96.4% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.99 / 1,000 search results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

### What does Google News Scraper do?

Google News Scraper searches public [Google News](https://news.google.com/) results and returns clean, structured records for monitoring, research, and API workflows. It uses Google News's structured public feed first, with a bounded HTML fallback if that feed format changes; it does not visit publisher paywalls, solve CAPTCHAs, or claim article text or bylines the source does not provide.

The Actor supports **one query or up to 20 batch queries**, language and country localization, exact phrases, excluded terms, publisher filtering, publication-time windows, stable IDs, and global deduplication.

### Why use Google News Scraper?

- Monitor brands, companies, competitors, markets, and public-policy topics.
- Build media-intelligence alerts and research datasets.
- Run multiple topics together with fair round-robin result allocation.
- Schedule searches and access results through the Apify API, webhooks, or integrations.
- Finish typical searches in seconds because no browser is launched.
- Receive an empty dataset for a valid no-results search instead of placeholder records.

### What data can Google News Scraper extract?

| Field                           | Type    | Description                                             |
| ------------------------------- | ------- | ------------------------------------------------------- |
| `id`                            | string  | Stable SHA-256-derived record ID                        |
| `title`                         | string  | Headline with the redundant publisher suffix removed    |
| `url`                           | string  | Public Google News article URL                          |
| `source`                        | string  | Publisher name shown by Google News                     |
| `author`                        | string  | Byline, when Google News displays or supplies one       |
| `sourceUrl`                     | string  | Publisher homepage supplied by the feed, when available |
| `sourceDomain`                  | string  | Normalized publisher domain                             |
| `publishedAt`                   | string  | ISO-8601 publication timestamp                          |
| `relativeTime`                  | string  | Relative publication label shown on the result card    |
| `queryIndex`                    | integer | One-based index of the requested query                 |
| `queryPosition`                 | integer | Position within that query's results                    |
| `position`                      | integer | Position in the combined dataset                        |
| `effectiveQuery`                | string  | Query after source, exclusion, phrase, and time filters |
| `extractionMethod`              | string  | `rss` or `domFallback`                                  |
| `country`, `language`, `locale` | string  | Requested localization context                          |

Optional values are omitted when Google News does not provide them. The Actor does not fill missing fields with `null`, empty strings, or fabricated content.

### How to scrape Google News

1. Open the Actor input tab.
2. Choose **Single query** or **Multiple queries**.
3. Enter a topic such as `artificial intelligence` or add several batch queries.
4. Optionally choose a country, language, source, exact phrase, excluded terms, and publication window.
5. Set `maxItems` and run the Actor.
6. Open the dataset or download it as JSON, CSV, Excel, XML, RSS, or HTML.

### How much will it cost to scrape Google News?

This Actor is compute-efficient because it fetches one structured feed per query and does not launch Chrome. A small single-query run normally uses only seconds of compute. Your exact cost depends on your Apify plan, the number of batch queries, proxy selection, retries, and run frequency. Residential proxy traffic can add proxy charges; direct feed access is the default.

### Input

See the input tab for the full configuration. Important options include:

- `mode`: `single` or `batch`.
- `query` / `queries`: one query or up to 20 queries.
- `timeRange`: any time, hour, day, week, or month. This maps to a Google News `when:` operator.
- `sortBy`: preserve Google News order or sort parsed records newest-first.
- `maxItems`: total combined records, with `maxItemsPerQuery` capped at 100 because the public feed has no pagination cursor.
- `proxyConfiguration`: direct, Residential Apify Proxy, or custom proxy URLs. `GOOGLE_SERP` is intentionally rejected because it is designed for Google Search HTTP result pages, not `news.google.com` feed endpoints.

Legacy `hl` and `gl` inputs remain supported as locale and country overrides.

### Output

You can download the dataset in JSON, HTML, CSV, or Excel. The 21-field excerpt below is grounded in the seventh card visible on the public Google News page inspected in Chrome on 2026-09-23. Its headline, publisher, byline, relative publication time, and Google News link were visible. Query and localization fields reflect the checked-in input and the page URL. This evidence excerpt is not presented as a schema-complete Actor run row.

```json
{
  "type": "news",
  "resultType": "newsArticle",
  "queryPosition": 7,
  "title": "Trump says AI will be renamed ‘super intelligence’ in all US documents",
  "url": "https://news.google.com/read/CBMikgFBVV95cUxPTHFSRVlHOGRzQlVzcWRvcHlCU2pyMGhSXzlPLUxvNnFqaldRVnpIYWJWMHpvRHY5OUR3UmV1eGtCS29LbHlHUFFDaHc5YjVhN1owS0RfT2Y1X0FSVVJsZ09WZUNNOUV4MGtZLTRMeS01bVJ2MHdaaE5VMEI3M3laVEZGejJCNHZSWDFuNWZ1NjBHd9IBlwFBVV95cUxQTnJVNkJmdXZuX2pHN0pqd1JKczNfM21JVHFLaHU5QVFHN1VERkxtNUhqQVZuZi1xaUZrZms3SzFWU201SUs2Y0cySEN2SG4wUmQ1TnVOMEo5T2lacDJpMzVoS2RwQWdUOUV2cG93bkZURUxNb2JhRkE1R1RyZlk1dkhvS1k2cGxSTjRlallVRzF4RzB4RkJr?hl=en-US&gl=US&ceid=US%3Aen",
  "googleNewsUrl": "https://news.google.com/read/CBMikgFBVV95cUxPTHFSRVlHOGRzQlVzcWRvcHlCU2pyMGhSXzlPLUxvNnFqaldRVnpIYWJWMHpvRHY5OUR3UmV1eGtCS29LbHlHUFFDaHc5YjVhN1owS0RfT2Y1X0FSVVJsZ09WZUNNOUV4MGtZLTRMeS01bVJ2MHdaaE5VMEI3M3laVEZGejJCNHZSWDFuNWZ1NjBHd9IBlwFBVV95cUxQTnJVNkJmdXZuX2pHN0pqd1JKczNfM21JVHFLaHU5QVFHN1VERkxtNUhqQVZuZi1xaUZrZms3SzFWU201SUs2Y0cySEN2SG4wUmQ1TnVOMEo5T2lacDJpMzVoS2RwQWdUOUV2cG93bkZURUxNb2JhRkE1R1RyZlk1dkhvS1k2cGxSTjRlallVRzF4RzB4RkJr?hl=en-US&gl=US&ceid=US%3Aen",
  "source": "The Hill",
  "sourceName": "The Hill",
  "publisher": "The Hill",
  "author": "Julia Manchester",
  "relativeTime": "3 hours ago",
  "query": "artificial intelligence",
  "searchQuery": "artificial intelligence",
  "effectiveQuery": "artificial intelligence when:7d",
  "searchUrl": "https://news.google.com/search?q=artificial+intelligence+when%3A7d&hl=en-US&gl=US&ceid=US%3Aen",
  "language": "en",
  "locale": "en-US",
  "country": "US",
  "market": "US:en",
  "timeRange": "week",
  "sortBy": "date"
}
```

The stable ID, exact publication timestamp, publisher homepage, image URL, extraction method, combined-dataset position, and scrape timestamp are omitted because this browser inspection did not expose them. `url` / `googleNewsUrl`, `source` / `sourceName` / `publisher`, and `query` / `searchQuery` are compatibility aliases retained by the output contract.

`queryPosition` preserves the original source rank within its query, including after date sorting. `queryIndex` identifies the requested query, and `position` is the final combined-dataset order.

The `OUTPUT` key-value-store record summarizes query counts, failures, duplicates removed, extraction methods, record count, and runtime without including proxy credentials or raw responses.

### Tips and advanced options

- Use batch mode instead of launching many small runs; feeds are fetched concurrently and results are interleaved fairly.
- Keep `maxConcurrency` moderate. The default of 5 is fast for normal batches without unnecessary load.
- Use `source`, `exactPhrase`, and `excludeTerms` instead of pasting a constructed result URL.
- Enable Residential proxy only when direct cloud access is unreliable for your region or workload.
- A valid search with no matching stories completes successfully with zero records.

### FAQ, disclaimer, and support

#### Why is the article URL on news.google.com?

Google News feeds expose a public Google News article link and the publisher homepage, but not always a direct publisher-article URL. The Actor preserves those source-backed values rather than using fragile private decoding endpoints.

#### Does this Actor scrape full article text?

No. Version 3 removed the previously advertised but unimplemented `deepScrape` option. Visiting arbitrary publisher pages would introduce paywalls, consent flows, robots restrictions, and inconsistent schemas. This Actor focuses on reliable Google News search metadata.

#### What happens if Google returns a CAPTCHA?

The run fails clearly and never stores the challenge page. The Actor does not solve or bypass CAPTCHAs. Proxy routing can be selected before a run; a gate stops requests without switching routes or sessions.

> This Actor extracts publicly displayed news metadata and does not intentionally extract private user data. Results can still contain names or other personal data published in news headlines. Personal data is protected by the GDPR and other laws. Do not process personal data without a legitimate reason; consult legal counsel if unsure.

Use the Actor's Issues tab for feedback and its API tab for programmatic access.

### Bounded preview and failure accounting

The UI and INPUT.json reproduce a hash-verified historical batch: artificial intelligence and robotics, four records overall, week/date filters, concurrency two, no retries, and direct access. Runtime/API defaults remain unchanged. This historical input is a reproducible preview, not a claim that the source is currently available.

HTTP 401/403/407/429/451, redirects, visible verification/login gates, and TLS/proxy-authentication failures stop new requests and HTML fallbacks across all workers. Ordinary transient failures may retry on the same route and fixed authorized proxy session. Feed structure/content-type changes may use the existing public HTML fallback only while no gate has been observed. Article/query words alone do not establish a gate.

OUTPUT preserves successful rows with PARTIAL status after a later failure. BLOCKED or FAILED with no rows and storage-write failures exit with code 1. Completed, failed, and skipped queries are counted separately. Existing queryPosition remains the original per-query source rank; queryIndex identifies the requested query and position is the global output order.

# Changelog

This Actor's version history is a separate document: https://apify.com/searchapi/google-news-scraper/changelog.md

# Actor input Schema

## `mode` (type: `string`):

Use single for one query or batch for multiple independent queries.

## `query` (type: `string`):

Topic or keywords to search in single mode.

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

Queries to run in batch mode. Duplicate and blank entries are removed.

## `exactPhrase` (type: `string`):

Optional phrase that must appear exactly in matching stories.

## `excludeTerms` (type: `array`):

Optional words or phrases to exclude from every query.

## `source` (type: `string`):

Optional publisher name to add as a Google News source filter.

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

Restrict each query to stories published within the selected time window.

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

Preserve Google News feed order or sort the parsed records newest first.

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

ISO language code, for example en, fr, de, or hi.

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

Two-letter ISO country code, for example US, IN, GB, or FR.

## `hl` (type: `string`):

Optional backward-compatible Google locale such as en-US. Leave empty to derive it from language and country.

## `gl` (type: `string`):

Optional backward-compatible country code. Leave empty to use country.

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

Maximum records across all queries.

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

Google News feeds expose up to about 100 records per query.

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

Number of query feeds fetched in parallel.

## `maxRequestRetries` (type: `integer`):

Retries for ordinary temporary network or server failures on one route. Denial, verification, login, TLS and proxy-authentication boundaries stop the run.

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

Per-request timeout in seconds.

## `useDomFallback` (type: `boolean`):

Use a bounded news.google.com HTML parser only if the structured feed format changes.

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

Direct access is fastest for the public feed. Residential or custom proxies are supported. GOOGLE_SERP is not compatible with news.google.com feed endpoints.

## Actor input object example

```json
{
  "mode": "batch",
  "query": "artificial intelligence",
  "queries": [
    "artificial intelligence",
    "robotics"
  ],
  "excludeTerms": [],
  "timeRange": "week",
  "sortBy": "date",
  "language": "en",
  "country": "US",
  "maxItems": 4,
  "maxItemsPerQuery": 4,
  "maxConcurrency": 2,
  "maxRequestRetries": 2,
  "requestTimeoutSecs": 30,
  "useDomFallback": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `runSummary` (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 = {
    "mode": "batch",
    "query": "",
    "queries": [
        "artificial intelligence",
        "robotics"
    ],
    "excludeTerms": [],
    "timeRange": "week",
    "sortBy": "date",
    "language": "en",
    "country": "US",
    "maxItems": 4,
    "maxItemsPerQuery": 4,
    "maxConcurrency": 2,
    "maxRequestRetries": 0,
    "requestTimeoutSecs": 30,
    "useDomFallback": true,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("searchapi/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 = {
    "mode": "batch",
    "query": "",
    "queries": [
        "artificial intelligence",
        "robotics",
    ],
    "excludeTerms": [],
    "timeRange": "week",
    "sortBy": "date",
    "language": "en",
    "country": "US",
    "maxItems": 4,
    "maxItemsPerQuery": 4,
    "maxConcurrency": 2,
    "maxRequestRetries": 0,
    "requestTimeoutSecs": 30,
    "useDomFallback": True,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("searchapi/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 '{
  "mode": "batch",
  "query": "",
  "queries": [
    "artificial intelligence",
    "robotics"
  ],
  "excludeTerms": [],
  "timeRange": "week",
  "sortBy": "date",
  "language": "en",
  "country": "US",
  "maxItems": 4,
  "maxItemsPerQuery": 4,
  "maxConcurrency": 2,
  "maxRequestRetries": 0,
  "requestTimeoutSecs": 30,
  "useDomFallback": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call searchapi/google-news-scraper --silent --output-dataset

```

## MCP server setup

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