# Google News Scraper API: Articles, Sources & Dates (`plainrows/google-news-scraper`) Actor

Monitor brands and topics in Google News: title, URL, publisher, snippet, publication time and position for every article, in 20 countries. Time filter, sort by date, only-new-articles mode for scheduled alerts (no duplicates). Pay per article found.

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

## Pricing

from $0.90 / 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 API: Articles, Sources & Dates

Scrape **Google News** for any keyword, brand or topic and get one clean row per article: **title, URL, publisher, snippet, publication time and position**, in 20 countries and their languages. Filter by **past hour, day, week, month or year** and sort by date: a simple **news monitoring API** for brand tracking, PR and market watch.

It calls a commercial search data API instead of driving a browser: **results in seconds, no proxies, no blocked runs, no captcha.** **You only pay for articles returned** (from October 23, 2026, plus a small check fee with **Only new articles**): queries with no result, duplicates and input mistakes are free.

### Typical uses

- **Brand and competitor monitoring**: turn on **Only new articles**, schedule a daily run on your brand names and get (and pay for) each new article mentioning them once.
- **PR and media relations**: see which outlets cover a topic, how high they rank and when they published.
- **Market and investment watch**: follow companies, tickers, products or regulations in several countries at once.
- **Content and SEO teams**: find what is trending in Google News for your keywords, with the publishers that rank.
- **Automations and AI agents**: feed n8n, Make, Zapier, Slack, Google Sheets or an MCP client with structured JSON.

### What you get for each article

| Field | Description |
|---|---|
| `title`, `url` | Headline and article URL on the publisher's site |
| `sourceDomain` | Publisher domain without www, e.g. `reuters.com` (always filled) |
| `sourceName` | Publisher name as Google shows it, e.g. `Reuters`. Google displays it in Top stories; in the main list it is filled only when the same publisher also appears in Top stories, otherwise `null` |
| `snippet` | Short excerpt shown by Google (main news list; `null` for Top stories) |
| `publishedAt` | Publication time in UTC (ISO 8601), computed from Google's relative time: "7 hours ago" gives the hour, "4 days ago" gives the day |
| `publishedTimeText` | Publication time exactly as Google displays it, in the search language (`7 hours ago`, `Il y a 4 jours`) |
| `position`, `section` | Position in the results (1 = first) and where it was shown: `top_stories` (carousel) or `news` (main list) |
| `topStoryHeadline` | Headline of the Top stories group the article belongs to |
| `searchQuery`, `timeRange`, `sortBy`, `searchCountry`, `languageCode` | Your search settings, echoed on every row |
| `observedAt` | When the data was fetched (UTC) |

Missing values are always `null`, never guessed. Each URL appears once per query.

### Input

```json
{
  "queries": ["Tesla", "\"electric vehicles\" Europe"],
  "country": "US",
  "maxArticlesPerQuery": 50,
  "timeRange": "day",
  "sortBy": "date",
  "includeTopStories": true
}
```

- **queries**: up to 1,000 per run. `"exact phrase"`, `-excluded` words and `OR` work at the normal price.
- **country**: US, GB, CA, AU, IE, IN, DE, AT, CH, FR, BE, ES, MX, IT, NL, PT, BR, PL, SE, JP. **languageCode** (optional, e.g. `fr` for Switzerland) defaults to the country's main language.
- **maxArticlesPerQuery**: 1 to 200 (default 50). Google loads about 10 results per page; large values take longer (about 6 seconds per page).
- **timeRange**: `any`, `hour`, `day`, `week`, `month`, `year` (Google's own "Recent" filter).
- **sortBy**: `relevance` (Google's default) or `date` (most recent first).
- **includeTopStories**: also return the articles of Google's Top stories carousels (default `true`).
- **onlyNewArticles** (optional, monitoring): return only articles never delivered to you before for the same query, country and language. See below.
- **monitorName** (optional): name of the key-value store in your account that remembers delivered articles (default `plainrows-news-monitor`).
- **Search operators** such as `site:` or `intitle:` are not supported: in our tests the data source returned no article for them, so such queries are skipped for free and listed in the run summary. Use plain keywords instead.

### Scheduled monitoring: only new articles

Turn on **Only new articles** (`"onlyNewArticles": true`) and add an Apify **schedule** (hourly or daily). The first run returns every article it finds and remembers their URLs in a key-value store of your own Apify account; each later run returns **and bills only articles it has never delivered**. A query with nothing new gets a free row with `notFoundReason: "no-new-articles"`.

**Check fee in this mode (from October 23, 2026):** each page of up to 10 Google News results checked costs one small `page-checked` event (about what the data source charges us), even when nothing new is found. It is never charged for a search the data source answered in an unexpected format (no results list): the run warns about it in the log and in its summary. Keep **maxArticlesPerQuery** close to the number of new articles you expect per run (10 or 20 for a daily brand watch). Runs without **Only new articles** never pay it.

- Use `sortBy: "date"` and a time range a bit longer than the schedule (`timeRange: "day"` for a daily run) so the newest articles are always in the window; `maxArticlesPerQuery` caps the articles checked per run.
- History is kept per query, country, language and Top stories setting (time range and sort order are ignored). Use a different **monitorName** per monitoring task to keep separate histories, or a new name to start over.
- The same article can match several of your queries: each query returns its own row (with `searchQuery`), so you know which brand it mentions.
- Without this option, a scheduled run returns everything in the time window again: remove duplicates by `url` where the data lands.

### Output example

Real rows from runs on 2026-10-07: a Top stories article (query `Tesla`, default settings) and a main-list article (query `Tesla`, `timeRange: "day"`, `sortBy: "date"`), both US/English:

```json
[
  {
    "searchQuery": "Tesla",
    "found": true,
    "position": 1,
    "section": "top_stories",
    "title": "Tesla is browbeating the EU to approve its ‘Full Self-Driving’ tech. The pressure is working.",
    "url": "https://www.reuters.com/investigations/tesla-is-browbeating-eu-approve-its-full-self-driving-tech-pressure-is-working-2026-10-07/",
    "sourceName": "Reuters",
    "sourceDomain": "reuters.com",
    "snippet": null,
    "publishedAt": "2026-10-07T06:24:04.000Z",
    "publishedTimeText": "7 hours ago",
    "topStoryHeadline": "News about Tesla",
    "timeRange": "any",
    "sortBy": "relevance",
    "searchCountry": "US",
    "languageCode": "en",
    "observedAt": "2026-10-07T13:23:21.192Z",
    "schemaVersion": "1.0"
  },
  {
    "searchQuery": "Tesla",
    "found": true,
    "position": 1,
    "section": "news",
    "title": "Tesla’s Third-Quarter Deliveries Beat Expectations. Time to Buy the Stock?",
    "url": "https://www.fool.com/investing/2026/10/07/tesla-s-third-quarter-deliveries-beat-expectations-time-to-buy-the-stock/",
    "sourceName": null,
    "sourceDomain": "fool.com",
    "snippet": "It's been a pretty challenging year for Tesla (TSLA +0.52%). The company's shares are down 16% as of writing, partly due to a mixed performance in its...",
    "publishedAt": "2026-10-07T13:07:32.000Z",
    "publishedTimeText": "14 minutes ago",
    "topStoryHeadline": null,
    "timeRange": "day",
    "sortBy": "date",
    "searchCountry": "US",
    "languageCode": "en",
    "observedAt": "2026-10-07T13:20:59.682Z",
    "schemaVersion": "1.0"
  }
]
```

### Pricing

Pay per article returned, no subscription, no fee per run, no proxy costs. See the **Pricing** tab for current prices: one event per **article found**, cheaper on higher Apify plans. With **Only new articles**, each page of up to 10 results checked also costs a small `page-checked` event (from October 23, 2026). Title, publisher, snippet and date are all included in that price.

Price change on October 23, 2026: new `page-checked` event, $0.0025 (FREE) / $0.002 (BRONZE+) per page of up to 10 results checked, only with **Only new articles**. The article price does not change.

Queries with no result, duplicate URLs, skipped queries (search operators) and input mistakes cost nothing. The run never spends more than the maximum cost you set. If many searches in a row return nothing billable (about $0.01 of data-provider calls), the run stops early and says so in its status; the searches not run are not charged.

**Free Apify plan:** each run returns up to 20 articles for up to 2 queries, so you can check the output. A paid Apify plan removes these limits.

### Use it from code, automations or AI agents

**API (one call, results returned directly):**

```bash
curl -X POST "https://api.apify.com/v2/acts/plainrows~google-news-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"queries": ["Tesla"], "timeRange": "day", "sortBy": "date", "maxArticlesPerQuery": 30}'
```

**n8n, Make, Zapier:** use the Apify integration, pick `plainrows/google-news-scraper`, schedule it, and send new articles to Slack, e-mail, Google Sheets, Airtable or your database.

**AI agents (MCP):** add `https://mcp.apify.com?tools=plainrows/google-news-scraper` to Claude, Cursor or any MCP client. The agent gets a typed news search tool and pays per result.

### What this is not

- **No full article text.** You get what Google News shows (title, snippet, publisher, time) and the link to the article.
- Not the news.google.com "For you" or topic feeds: it is the Google search News tab for your keywords.
- `publishedAt` is as precise as Google's relative time ("1 day ago" is a day, not a minute).
- Not affiliated with Google.

### Run summary

Each run stores a summary in the key-value store (`OUTPUT`): queries run, queries with no result, articles billed, articles skipped as already delivered (`articlesAlreadySeen`, monitoring only), duplicates, invalid or skipped queries (with the reason), and anything skipped because of the free-plan or budget limit.

### FAQ

**How do I monitor news about my brand?**
Enter your brand as a query (use `"exact phrase"` and `-word` to refine), set **timeRange** to `day`, **sortBy** to `date`, turn on **Only new articles** and schedule the run daily in Apify or n8n: you get and pay for each new article once.

**How many articles per query?**
1 to 200 (**maxArticlesPerQuery**, default 50).

**Which countries and languages?**
US, GB, CA, AU, IE, IN, DE, AT, CH, FR, BE, ES, MX, IT, NL, PT, BR, PL, SE, JP, in the country's main language or the one you set.

**Does it return the full article text?**
No: title, snippet, publisher, publication time and the link to the article.

**Can I use site: or intitle:?**
No: such queries returned nothing in our tests, so they are skipped for free and listed in the run summary.

### More PlainRows tools

Same pay-per-result pricing, same clean JSON, built to chain together in n8n, Make, Zapier or AI agents.

- **SEO and keywords:** [Keyword Search Volume, CPC & Difficulty](https://apify.com/plainrows/keyword-search-volume) · [Keyword Ideas Generator](https://apify.com/plainrows/keyword-ideas-generator) · [Google Autocomplete & People Also Ask](https://apify.com/plainrows/google-autocomplete-questions) · [Google Trends Explorer](https://apify.com/plainrows/google-trends-explorer) · [Website Organic Traffic & Top Keywords](https://apify.com/plainrows/domain-seo-overview) · [Bulk Domain Authority Checker](https://apify.com/plainrows/domain-authority-checker) · [Backlink Checker](https://apify.com/plainrows/backlink-checker) · [Broken Link Checker](https://apify.com/plainrows/broken-link-checker) · [AI Search Visibility Tracker (ChatGPT, Gemini, AI Mode)](https://apify.com/plainrows/ai-search-brand-visibility) · [Google Maps Rank Tracker (Geo-Grid Local SEO)](https://apify.com/plainrows/google-maps-rank-tracker)
- **Leads and companies:** [Google Maps Scraper](https://apify.com/plainrows/google-maps-businesses) · [Website Technology Checker](https://apify.com/plainrows/website-tech-stack) · [ATS Jobs Scraper (Workday, Greenhouse, Lever, Ashby)](https://apify.com/plainrows/ats-job-postings) · [Google Jobs Scraper](https://apify.com/plainrows/google-jobs-scraper) · [Google Ads Scraper (Transparency Center)](https://apify.com/plainrows/google-ads-transparency) · [Company Registry Lookup (SIRENE, LEI, Brreg)](https://apify.com/plainrows/company-registry-lookup) · [Public Tenders Search (EU TED & UK)](https://apify.com/plainrows/public-tenders-search)
- **E-commerce and travel:** [Amazon Product Search Scraper](https://apify.com/plainrows/amazon-product-search) · [Google Shopping Prices Scraper](https://apify.com/plainrows/google-shopping-prices) · [Google Hotels Prices Scraper](https://apify.com/plainrows/google-hotels-prices) · [Tripadvisor Reviews Scraper](https://apify.com/plainrows/tripadvisor-reviews)
- **Content and media:** [YouTube Search Scraper](https://apify.com/plainrows/youtube-search-scraper) · [YouTube Comments Scraper](https://apify.com/plainrows/youtube-comments-scraper) · [Google Images Scraper](https://apify.com/plainrows/google-images-scraper) · [Website Screenshot API](https://apify.com/plainrows/website-screenshot) · [Google Maps Reviews Scraper](https://apify.com/plainrows/google-maps-reviews) · [App Store & Google Play Reviews Scraper](https://apify.com/plainrows/app-reviews-scraper)

**Compared with other APIs:** [Brand news monitoring as JSON](https://nadaho.github.io/plainrows/brand-news-monitoring-json/) · [NewsAPI alternative for production](https://nadaho.github.io/plainrows/newsapi-alternative/)

### Support

Missing a field or found a bug? Open an issue on this page. Issues are read and answered.

# Actor input Schema

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

What you would type in Google News, one per line: a brand, a company, a person in the news, a topic. "Exact phrases", -excluded words and OR work. Operators such as site: or intitle: are not supported (those queries are skipped for free). Up to 1,000 queries per run.

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

Country edition of Google News (results Google shows to readers in that country).

## `languageCode` (type: `string`):

Two-letter language code, e.g. "en" or "fr". Leave empty to use the country's main language (for example German for Switzerland, French for Belgium).

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

Google News returns up to about 200 articles per search. Each article returned is billed; see Pricing. Large values take longer (about 6 seconds per 10 articles).

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

Google's time filter. For scheduled monitoring, match it to your schedule ("Past 24 hours" for a daily run) and remove duplicates by URL.

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

Order of the results. "Most recent first" is best for monitoring.

## `includeTopStories` (type: `boolean`):

Also return the articles of Google's "Top stories" carousels (they carry the publisher name). Turn off to get only the main news list.

## `onlyNewArticles` (type: `boolean`):

Return only articles this tool has never delivered to you for the same query, country and language. The first run returns every article and remembers them; later runs (for example a daily schedule) return and bill only new articles.

## `monitorName` (type: `string`):

Name of the key-value store in your Apify account that remembers delivered articles (default "plainrows-news-monitor"). Use a different name per monitoring task to keep separate histories, or a new name to start over. Lowercase letters, digits and hyphens.

## Actor input object example

```json
{
  "queries": [
    "Tesla",
    "\"electric vehicles\" Europe"
  ],
  "country": "US",
  "maxArticlesPerQuery": 50,
  "timeRange": "any",
  "sortBy": "relevance",
  "includeTopStories": true,
  "onlyNewArticles": false
}
```

# Actor output Schema

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

No description

## `summary` (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": [
        "Tesla",
        "\"electric vehicles\" Europe"
    ],
    "country": "US"
};

// Run the Actor and wait for it to finish
const run = await client.actor("plainrows/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": [
        "Tesla",
        "\"electric vehicles\" Europe",
    ],
    "country": "US",
}

# Run the Actor and wait for it to finish
run = client.actor("plainrows/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": [
    "Tesla",
    "\\"electric vehicles\\" Europe"
  ],
  "country": "US"
}' |
apify call plainrows/google-news-scraper --silent --output-dataset

```

## MCP server setup

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