# Google News Scraper: Articles by Keyword, Topic & Country (`zaiq/google-news-scraper`) Actor

Get news articles by keyword, country and language, with publisher names, timestamps, snippets, thumbnails and publisher links when available. Keyword searches fall back to the Google News tab. Includes date filters, paging and optional public article text.

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

## Pricing

from $1.60 / 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.
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: Articles by Keyword, Topic & Country

![Google News Scraper: Articles by Keyword, Topic & Country](https://api.apify.com/v2/key-value-stores/4VJNANhwKgqPpXtAi/records/hero-google-news-scraper.jpg)

Get news headlines, publisher names, publish times, snippets, thumbnails and available publisher URLs for **$0.002 per article**, the same price on every Apify plan. Keyword searches use RSS when available and automatically fall back to Google’s News tab.

Start with `{"queries": ["renewable energy"]}` for up to ten articles. Set country, language and a date window, then increase maxPerQuery to page through more keyword results. Each row begins with a one-line result.

Optional public article text costs **$0.02 per article with text, including the listing**. Failed text retrieval falls back to the $0.002 listing. Topic and top-stories modes require news.google.com; a refused feed returns a free note.

### What you get

| Field | What it holds |
|---|---|
| `verdict`, `kind`, `status` | A one-line result, article status and separate free notes. |
| `title`, `publisher`, `source`, `sourceUrl` | Headline, publisher name and publisher home page when a publisher URL is available. |
| `publishedAt`, `publishedAtRaw`, `publishedAtMethod`, `publishedAtIsEstimated` | Google’s timestamp in UTC when supplied, otherwise an estimate from the relative label. Unknown times stay null. |
| `publishedAtEstimate` | Relative-label estimate anchored to the page capture time, where the label can be read. Source timestamps take precedence in publishedAt. |
| `url`, `googleUrl`, `linkStatus`, `linkMethod` | Publisher URL when supplied or resolved; otherwise the original Google link and an explanation. |
| `snippet`, `snippetSource` | Source-provided snippet when present. Carousel cards may have none. |
| `thumbnail`, `thumbnailType`, `image`, `imageSource` | News-tab thumbnail as a URL or inline image data URI. image contains only a remote image URL when available. Source images are not fetched separately. |
| `position`, `pagePosition`, `pageStart`, `sourceRank`, `rank` | News-tab position is start plus card position. Carousels can make positions overlap across pages; rank counts delivered results per query. |
| `sourceType`, `searchUrl`, `feedUrl` | Whether the row came from RSS or the Google News tab, with source request URLs. |
| `clusterId`, `alsoReporting`, `relatedCount` | Source cluster identifier where available. Nested related headlines come from RSS; News-tab rows leave that list empty. |
| `text`, `textStatus`, `authors`, `canonicalUrl` | Optional public article text and publisher metadata; failures are explained. |

### What people use it for

- **News monitoring:** Collect the latest coverage of a subject in the editions that matter to you.
- **Research:** Compare headlines and publishers across languages, with the original sources attached.
- **Coverage analysis:** Keep related reporting together instead of treating every headline as an unrelated story.
- **Article processing:** Send publisher URLs or public article text to your own search, classification or summarisation pipeline.

### How to use it

1. Add one or more keyword searches.
2. Choose a country, language, optional date filter and article limit.
3. Run the Actor and export article rows to JSON, CSV or Excel. Free note rows explain source failures and limits.

### Input

| Field | Example | Notes |
|---|---|---|
| `queries` | `[]` | Up to 30 searches. Empty selects topic/top stories, which require news.google.com. The Console prefill supplies a keyword. |
| `country`, `language` | `US`, `en` | Requested country and language codes; regional language codes are accepted. |
| `topic` | `top` | Used only without keyword searches. Requires news.google.com. |
| `period`, `when` | `any`, empty | Hour, day, week, month or year, or a custom window such as 2d. when overrides period. |
| `after`, `before` | empty | Inclusive after and exclusive before dates, YYYY-MM-DD. Keyword fallback maps them to a custom source range and checks UTC timestamps. |
| `site` | empty | Optional publisher domain such as publisher.example; requires a keyword. |
| `maxPerQuery`, `maxArticles` | `10`, `100` | Up to 100 articles per query and 1,000 per run. |
| `maxPages` | `10` | One to 20 News-tab pages per keyword; also bounded by article and spending limits. |
| `resolveLinks` | `true` | Publisher link resolution included. Direct publisher links need no extra request. |
| `includeArticleText` | `false` | Read public publisher text for $0.02 total per successful text article. |
| `maxTextChars` | `50000` | 1,000 to 200,000 characters; truncation is marked. |
| `maxRelated` | `10` | Zero to 30 RSS related headlines. News-tab rows do not supply this list. |
| `sortBy` | `relevance` | Keep source order, or request date order and sort each returned page by newest timestamp. |

### Output

Each result is one row in the run's dataset (download it as JSON, CSV, Excel, XML or HTML, or read it through the API). An example row (values shortened):

```json
{
  "verdict": "Article listing available",
  "kind": "article",
  "status": "ok",
  "title": "Example Forum in Example City: Die Chancen für den Mittelstand",
  "publisher": "Example News",
  "publishedAt": "2026-10-25T18:18:04Z",
  "publishedAtRaw": "vor 7 Minuten",
  "publishedAtMethod": "source_timestamp",
  "publishedAtIsEstimated": false,
  "url": null,
  "snippet": "Bei der Entwicklung großer KI-Modelle hält Alex Example den Rückstand Europas für kaum noch aufholbar. Doch die eigentliche Chance...",
  "image": null,
  "thumbnailType": "inline",
  "position": 1,
  "pagePosition": 1,
  "pageStart": 0,
  "sourceType": "google_news_tab"
}
```

This excerpt comes from an offline Actor replay of a real source page captured on 25 October 2026. Names, handles and site addresses are replaced where present. The original row had no resolved publisher URL or remote thumbnail URL; inline image data and some metadata are omitted for readability. SUMMARY records pages, source changes, limits, skipped records, unresolved links and charges.

### Pricing

- **$0.002 per delivered article listing**, including available source fields and requested publisher link resolution. There is no separate article-link charge.
- **$0.02 per article with public text**, including the listing. This replaces the $0.002 event; the two prices are not added together.
- If a publisher URL or article text is unavailable, delivered headline metadata still costs $0.002, with a clear result message.
- Blocked sources, empty results, invalid inputs and other note rows have no article charge. Apify’s **$0.00005 start charge** counts towards the buyer’s Maximum cost per run.
- The same price on every Apify plan. No AI charges or separate proxy fees for the buyer.

What typical jobs cost at the list price:

| Job | Cost |
|---|---|
| 10 article listings | $0.02005 including start |
| 100 article listings | $0.20005 including start |
| 5 articles with public text | $0.10005 including start |
| 3 articles with text and 2 listings | $0.06405 including start |
| No articles delivered | $0.00005 start charge only |

Set Maximum cost per run. Apify’s $0.00005 start charge is part of that limit: $0.004 fits one $0.002 article; $0.00405 fits two. The Actor checks remaining allowance before fetching another page or reading article text. Free notes remain available after the limit. Acknowledged articles are skipped after a restart of the same run.

### Tips

- Use one keyword and the default ten articles for a first run.
- Use date fields for UTC filtering. A source date range is not a complete news archive.
- An article can appear for each distinct query. Duplicate cards within a query are skipped. Separate scheduled runs are new collections.
- Use articleId and publisher URL when available to join results; pageStart and pagePosition preserve where a card appeared.

### Use it through the API

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("zaiq/google-news-scraper").call(run_input={"queries": ["renewable energy"], "country": "DE", "language": "de", "when": "7d", "maxPerQuery": 10})
for row in client.dataset(run.default_dataset_id).iterate_items():
    print(row)
```

**JavaScript**

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('zaiq/google-news-scraper').call({"queries": ["renewable energy"], "country": "DE", "language": "de", "when": "7d", "maxPerQuery": 10});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

**HTTP (one call, results back)**

```bash
curl -X POST 'https://api.apify.com/v2/acts/zaiq~google-news-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>' \
  -H 'Content-Type: application/json' \
  -d '{"queries": ["renewable energy"], "country": "DE", "language": "de", "when": "7d", "maxPerQuery": 10}'
```

### Integrations and schedules

- **Schedules:** run it every hour, day or week from the Apify Console (Schedules) and keep a history of results.
- **Make, Zapier, n8n, Google Sheets, Slack, Airtable:** connect it through Apify's integrations, or send each finished run to a **webhook**.
- **Datasets:** results stay in the run's dataset; export them or read them by API whenever you need them.

### Use it with AI agents (MCP)

Add Apify's MCP server (`https://mcp.apify.com`) to Claude, ChatGPT, Cursor, VS Code or any MCP client. The agent can find this Actor and run it for you: ask it for "ten recent articles about renewable energy in Germany". AI agents can also pay for runs directly through Apify's agentic payments.

### Limits

- Keyword searches fall back from RSS to Google’s News tab. Topic and top-stories modes only use news.google.com and return a free note if it is refused.
- RSS has a 100-item ceiling and no paging. News-tab paging uses start offsets, stops at the configured limits, and detects a repeated page. Neither source guarantees complete historical coverage.
- Google may return opaque redirect links. Resolving them can fail; url then stays null and googleUrl is retained. Link resolution never signs in or solves a check.
- News-tab thumbnails may be inline image data instead of remote links. Snippets can be absent. Missing fields are not invented.
- Relative times are estimates; publishedAtMethod identifies their origin. Month/year estimates use 30/365 days. Google’s own data-ts timestamps take precedence. Unsupported time labels remain null and cannot pass a local date filter.
- Country and language select the requested edition. Google may fall back or return no results for some combinations.
- Newest ordering requests the source date sort and sorts each returned page. Changing sources or page layouts can change ordering and results.
- Topics filter only their current feed. Relative and custom filters together use the custom source range and then apply both constraints to returned timestamps.
- Public article text respects publisher robots rules. Login walls, paywalls, browser-only pages and blocked pages return notes; no login or check is attempted.
- Publisher HTML is limited to 16 MiB decoded. Residential requests have a separate 128 KiB transfer ceiling. Text truncation does not prove source completeness.
- Source work is limited to 14 minutes. Page failures keep already delivered articles and add a free explanation.

### FAQ

**Are publisher URLs included?**

Yes, when the page supplies them or an ordinary Google redirect resolves. An unavailable URL stays null with a clear note; the headline metadata still costs the listing price.

**Do topics use the keyword fallback?**

No. Top stories and topics depend on news.google.com. Use a keyword search for the News-tab fallback.

**Does every article have a snippet and thumbnail link?**

No. Some cards lack snippets, and many thumbnails arrive as inline image data. Missing remote URLs remain null.

**What happens when another page is blocked?**

Already delivered articles remain in the dataset. A free note identifies the unavailable continuation.

**What happens after a restart?**

Saved page snapshots and acknowledged result IDs prevent repeat article charges and unnecessary source requests.

**Is an AI service involved?**

No. The Actor reads public responses with deterministic parsers.

### Related Actors from Zaiq

- [google-trends-scraper](https://apify.com/zaiq/google-trends-scraper): search interest over time
- [google-trending-now-scraper](https://apify.com/zaiq/google-trending-now-scraper): current trending searches
- [llm-website-crawler](https://apify.com/zaiq/llm-website-crawler): public website content as Markdown

### Support

Questions, a site that changed, or a field you need? Open an issue on this Actor's **Issues** tab: we answer there, usually within a day.

***

Also found as: google news scraper, google news api, news articles api, news rss, publisher URLs, media monitoring.

# Actor input Schema

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

Up to 30 keyword searches. Quotes and search operators are accepted. Empty searches select topic/top stories, which require news.google.com and can return a free unavailable-source note.

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

Two-letter country of the Google News edition, e.g. US, GB, IN, ZA, DE, FR, BR.

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

Language of the edition, e.g. en, de, fr, es, pt, hi.

## `period` (type: `string`):

Relative publish window. Keyword fallback uses Google News-tab date filters; source timestamps are also checked. Topic filters apply only to the current feed.

## `topic` (type: `string`):

Used only when Searches is empty. Topics and top stories require news.google.com; there is no News-tab substitute. A refused feed returns a free note.

## `site` (type: `string`):

Optional publisher domain such as example.com. Requires a keyword query.

## `maxPerQuery` (type: `integer`):

Maximum articles per keyword or topic, from 1 to 100. Default 10. News-tab searches page as needed; RSS feeds contain at most 100 items. At least 5.

## `resolveLinks` (type: `boolean`):

Include publisher link resolution in the article price. Direct links need no extra fetch; opaque Google redirect links are followed. Unresolved links keep their Google URL and an explanation.

## `when` (type: `string`):

Optional 1h, 1d, 7d or similar window. Overrides period. A when: prefix is accepted.

## `after` (type: `string`):

Optional inclusive UTC date in YYYY-MM-DD form. Narrow an interval without claiming a complete news archive.

## `before` (type: `string`):

Optional exclusive UTC date in YYYY-MM-DD form. Must be later than after.

## `includeArticleText` (type: `boolean`):

Fetch public publisher text, snippet, image and authors through the crawler. An article with text costs $0.02 total; unavailable text falls back to the $0.002 listing. No login, paywall bypass, browser or AI.

## `maxArticles` (type: `integer`):

Total article rows across all queries, including already delivered rows after a restart.

## `maxTextChars` (type: `integer`):

Maximum text characters per article. Truncation is marked in the row.

## `maxRelated` (type: `integer`):

Up to 30 related headlines supplied by RSS. The News-tab source provides cluster IDs where present; its article rows do not fabricate a related-headlines list.

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

Source order, or newest first. News-tab searches request date order and each returned page is sorted by timestamp. RSS sorts only its returned feed.

## `maxPages` (type: `integer`):

Page limit for the keyword fallback. Stops sooner when the article limit, spending limit, final page or repeated page is reached. Does not add paging to RSS topics.

## Actor input object example

```json
{
  "queries": [
    "renewable energy"
  ],
  "country": "US",
  "language": "en",
  "period": "any",
  "topic": "top",
  "maxPerQuery": 10,
  "resolveLinks": true,
  "includeArticleText": false,
  "maxArticles": 100,
  "maxTextChars": 50000,
  "maxRelated": 10,
  "sortBy": "relevance",
  "maxPages": 10
}
```

# Actor output Schema

## `results` (type: `string`):

Dataset: the results.

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

What each input returned, and notes.

# 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": [
        "renewable energy"
    ],
    "maxPerQuery": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("zaiq/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": ["renewable energy"],
    "maxPerQuery": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("zaiq/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": [
    "renewable energy"
  ],
  "maxPerQuery": 10
}' |
apify call zaiq/google-news-scraper --silent --output-dataset

```

## MCP server setup

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