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

Scrape Google News articles by search, topic, place or URL in 82 editions (70 countries): title, publisher, date, related coverage, original URL and full text. More than 100 articles per search. Export to JSON, CSV or Excel.

- **URL**: https://apify.com/nice_dev/google-news-scraper.md
- **Developed by:** [Nice Dev](https://apify.com/nice_dev) (community)
- **Categories:** News, Marketing, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

### 📰 What is Google News Scraper?

**Google News Scraper** extracts **news articles from [Google News](https://news.google.com)**: **headline, publisher, publication date, Google News link and the related coverage**, and on request the **original article URL** and the **full article text, main image and authors**. Search any keyword in any of the 82 Google News editions, read a topic (Business, Technology…), the local news of a city, a **Full coverage** story or a publisher's page. It works as a **Google News API alternative**: run it on a schedule, call it from your code, or plug it into Make, Zapier or n8n.

Type a **search query** (`tesla`) or paste any Google News URL, click **Start**, and download the articles in JSON, CSV or Excel. No login, no API key, and it is **fast: 250 articles in about 6 seconds**, or 40 articles with their full text in about 25 seconds. Google News stops at 100 articles per search: this Actor goes past it, and returns thousands of articles for one query.

### 📋 What data can you extract from Google News?

One item per article, 35 fields:

| Category | What you get |
| --- | --- |
| 📰 **Article** | headline (without the trailing publisher name), Google News id, link, rank in the feed |
| 🏢 **Publisher** | publisher name, website and domain — `Axios`, `axios.com` |
| 🕒 **Dates** | publication date (ISO, Unix timestamp and as Google wrote it), last update on the publisher's site |
| 🔗 **Links** | Google News link, and the **original article URL** on the publisher's site (option) |
| 🧭 **Where it was found** | search query, topic, place, edition (country and language), the Google News page and its title |
| 🗞️ **Related coverage** | the other articles Google News groups with it: same story, other publishers — free |
| 📝 **Full text** (option) | full article text, summary, word count, reading time, main image, authors, keywords, section, language |
| ✅ **Status** | whether the full text could be read: read, refused by the publisher, no text (paywall), failed |

Every field, with an example, is listed in the **Output** section below.

The original article URL is filled with **Original article URL** (`resolveUrls`); the full text, image, authors and the original URL with **Full article text, image and author** (`extractDetails`). Both are off by default: the plain run returns the article cards only, and is the fastest.

### ✅ Why use Google News Scraper?

- 🚀 **Fast**: 250 articles in about 6 seconds, 40 articles with their full text in about 25 seconds.
- 📈 **More than 100 articles per search**: Google News stops at 100; the Actor splits the period into smaller ones and reads each, so one query can return thousands of articles (**Get more than 100 articles per search**, on by default).
- 🌍 **82 editions, many in one run**: the same query in the United States, France, Germany and Japan at once, each article tagged with its country and language.
- 🔗 **The real article URL**, not only the Google News redirect link, and the **full text** when the publisher shows it — a refused or paywalled article is still saved, and is not charged for the option.
- 🗞️ **Related coverage included**: the other publishers on the same story, at no extra cost.
- 🔔 **Monitoring built in**: tick **Only new articles**, schedule the Actor, and each run returns (and charges) only the articles it has never delivered before.
- 🔌 API, scheduling, integrations (Make, Zapier, n8n, Google Sheets…) and JSON/CSV/Excel export via the Apify platform.

### 🚀 How to scrape Google News

1. Create a free Apify account.
2. Open **Google News Scraper** and type a **Search query** (e.g. `artificial intelligence`), or pick **Topics** or a place for **Local news**.
3. Optional: choose the **Country and language** (more with **More editions**), a **Time period** or exact dates, publishers to keep or drop — or paste Google News URLs into **Google News URLs**.
4. Set **Max articles** (100 by default, 0 = no limit) — and **Max articles per search** when you run several searches — then click **Start**.
5. Download the dataset in JSON, CSV, Excel or via API.

### 💰 How much does it cost to scrape Google News?

This Actor uses **pay per event** pricing: you pay for what you get, and the prices of each event are in the **Pricing** tab. What is charged:

- each **article** saved in the dataset (related coverage included);
- each **original article URL** found (with **Original article URL** or **Full article text**) — not for an article whose link Google News did not give, nor for a **Full coverage** card that already carries it;
- each **full article text** read (with **Full article text, image and author**) — only when the text was really read: an article the publisher refused, or showed behind a paywall, is not charged for it;
- a small fee per run start, and a small fee for each article that a filter of the Actor checks and drops (`filter-check`) — none for an article of a search dropped by its dates (Google News was asked for those dates).

An article already delivered, with **Only new articles**, is neither saved nor charged. Platform usage (compute, proxy) is included in the price.

### ⚙️ Input

A simple search:

```json
{
    "query": "artificial intelligence",
    "maxItems": 200
}
```

Several searches in several editions, last 7 days, with the original article URL and full text, only the articles not delivered before:

```json
{
    "searchQueries": ["tesla", "spacex"],
    "regionLanguages": ["GB:en", "DE:de"],
    "maxItemsPerQuery": 50,
    "postedAfter": "7 days",
    "extractDetails": true,
    "onlyNew": true,
    "stateKey": "musk-news"
}
```

Topics, local news, and your own Google News URLs:

```json
{
    "topics": ["BUSINESS", "TECHNOLOGY"],
    "location": "Paris",
    "regionLanguage": "FR:fr",
    "startUrls": [{ "url": "https://news.google.com/search?q=climate&hl=en-US&gl=US&ceid=US:en" }],
    "maxItems": 300
}
```

| Field | Notes |
| --- | --- |
| `query`, `searchQueries` | What to search, exactly as on Google News; operators work (`"exact phrase"`, `OR`, `-crypto`, `site:reuters.com`, `intitle:merger`). `searchQueries` adds more queries, one search each. |
| `topics` | Google News sections: `TOP`, `WORLD`, `NATION`, `BUSINESS`, `TECHNOLOGY`, `ENTERTAINMENT`, `SPORTS`, `SCIENCE`, `HEALTH` — about 40 articles for `TOP` (the front page), 60 to 75 for the other sections, per edition. |
| `location`, `locations` | Local news of a city (`Paris`, `New York`, `Munich`), or of a country in its own edition (`Germany` with `DE:de`); `locations` adds more places. Google News has no local news for a region or a state (`Bavaria`, `Texas`, `Ontario`: 0 articles). |
| `regionLanguage`, `regionLanguages` | Google News edition, country and language (`US:en`, `GB:en`, `FR:fr`, `DE:de`, `JP:ja`…, 82 in all). Every search, topic and place is read in each edition (max 1000 searches per run). |
| `startUrls` | Google News pages as copied from the browser: a search, a topic, local news, a **Full coverage** story, a publisher page or any news.google.com RSS feed. Their edition (`hl`, `gl`, `ceid`) is kept. A single article page is not accepted. |
| `maxItems` | Stop after this many articles for the whole run (`0` = unlimited). |
| `maxItemsPerQuery` | Cap for EACH search, topic, place or URL, per edition (`0` = no per-search cap). |
| `fetchBeyond100`, `lookbackDays` | Go past the 100 articles Google News gives per search, by splitting the period down to single days; the period is **Posted after** → **Posted before**, or the `lookbackDays` days (30 by default) before **Posted before**, or before the run's start. |
| `sortBy` | `relevance` (Google News order) or `date` (newest first). |
| `timeframe` | Recent period: `1h`, `12h`, `1d`, `7d`, `30d`, `1y` (Google News `when:`). |
| `postedAfter`, `postedBefore` | Publication date range: `2026-09-01`, or a period before now (`7 days`, `2 weeks`, `1 month`, `24 hours`). |
| `sites`, `excludeSites` | Keep only, or drop, these publishers by domain (`reuters.com`, `bbc.co.uk`); kept sites are added to each search as `site:`. |
| `titleOnly` | Match the query in the headline only. |
| `excludeKeywords` | Drop the articles whose headline contains one of these words or phrases, as whole words: `war` drops "War in…" but keeps "Warner" (case and accents ignored; in Chinese, Japanese, Korean, Thai… any part of the headline counts). |
| `resolveUrls`, `extractDetails` | Original article URL; full text, image, authors and summary from the publisher's page (includes the original URL). |
| `includeRelatedArticles` | The other articles Google News groups with each one (on by default, free). |
| `onlyNew`, `stateKey`, `resetState` | Monitoring: only the articles never delivered under this memory key; `resetState` forgets the memory. |
| Advanced | `proxyConfiguration` (Apify proxy by default, included in the price; the residential proxy is not available), `maxConcurrency`, `maxRequestsPerMinute`, `minRequestIntervalMs`, `maxRequestRetries`, `debugLog`. |

### 📦 Output

A real article from the **World** section with **Full article text** (the `text` and `keywords` are shortened here):

```json
{
    "id": "CBMiuwFBVV95cUxQOTJWaW9zNF9BSUp2T19LMXAzcGJrOXBYeUJpbVoxUWRZc2pZV2EzWkRjcHc1a1k2aVB3WUV4ejREU2MyVlNkNUt4bllYZC02VWFoT2Qzc1VnaXd5R2IzZHlDTWJfSnBUenllYVdYal9TdnQ1SEZ5TnhFczMtX3pXNHozcExHcld1ZGZMdXhYaExOU0NjdFQ3eEhaOWQtcjBQeF94d1Y3NnFjQzNkeldOZjRTOXVxRXdoX2pF0gG7AUFVX3lxTE9mRjNIczQ5NnU2TmNvczJQSzFkTTl3V3Y0cEVvbEZ1UmdrM0R2ZnFGanM1Tm9EUFprdWNCejhIYUVQSGhjQTFOMzdTRVN2YzRKWHp6bFVxOU93ekdtMGk1RHY1ck1iaG95S0psTzljelpuaTd1VHFIQmdIRlFVWjExS3JCNUQ0cUlza3V5bFlEQy1ialBWTi0yVDNrRzhHWnpwUTZoQVAzWGg0ZFdxcnYtMUxqOUVsOFlZaUk",
    "url": "https://www.scmp.com/news/china/politics/article/3371627/strongest-storm-year-barrels-towards-taiwan-and-mainland-china",
    "title": "Strongest storm of the year barrels towards Taiwan and mainland China",
    "source": "South China Morning Post",
    "sourceUrl": "https://www.scmp.com",
    "sourceDomain": "scmp.com",
    "publishedAt": "2026-10-21T08:00:06.000Z",
    "publishedTimestamp": 1792569606000,
    "publishedAtRaw": "Wed, 21 Oct 2026 08:00:06 GMT",
    "googleNewsUrl": "https://news.google.com/rss/articles/CBMiuwFBVV95cUxQOTJWaW9zNF9BSUp2T19LMXAzcGJrOXBYeUJpbVoxUWRZc2pZV2EzWkRjcHc1a1k2aVB3WUV4ejREU2MyVlNkNUt4bllYZC02VWFoT2Qzc1VnaXd5R2IzZHlDTWJfSnBUenllYVdYal9TdnQ1SEZ5TnhFczMtX3pXNHozcExHcld1ZGZMdXhYaExOU0NjdFQ3eEhaOWQtcjBQeF94d1Y3NnFjQzNkeldOZjRTOXVxRXdoX2pF0gG7AUFVX3lxTE9mRjNIczQ5NnU2TmNvczJQSzFkTTl3V3Y0cEVvbEZ1UmdrM0R2ZnFGanM1Tm9EUFprdWNCejhIYUVQSGhjQTFOMzdTRVN2YzRKWHp6bFVxOU93ekdtMGk1RHY1ck1iaG95S0psTzljelpuaTd1VHFIQmdIRlFVWjExS3JCNUQ0cUlza3V5bFlEQy1ialBWTi0yVDNrRzhHWnpwUTZoQVAzWGg0ZFdxcnYtMUxqOUVsOFlZaUk",
    "articleUrl": "https://www.scmp.com/news/china/politics/article/3371627/strongest-storm-year-barrels-towards-taiwan-and-mainland-china",
    "position": 7,
    "searchType": "topic",
    "query": null,
    "topic": "WORLD",
    "location": null,
    "regionLanguage": "US:en",
    "country": "US",
    "language": "en",
    "searchUrl": "https://news.google.com/rss/headlines/section/topic/WORLD?hl=en-US&gl=US&ceid=US%3Aen",
    "feedTitle": "World - Latest - Google News",
    "relatedArticles": [
        {
            "title": "Super Typhoon Champi’s Planet-Sized Eye Explodes on Satellite Graphics (Video)",
            "source": "Yahoo",
            "googleNewsUrl": "https://news.google.com/rss/articles/CBMingFBVV95cUxNLU9tX2UyZ0diNnlpbUk3YWRZdGxONjlDbC1DbXBHZXdYVldWcmE0Q3Y5U2tkZzdTYnZ5RnZIWEp5NW40M0tqUnJFSS1YNE5JdmM3VTV2NkdrUHUxcU5MTjVhSWVOZ25sTkVHS1ZjUlVDemk0T3lFUFZVcjZReFVlQWRyMS0ybU1qYUE1TGtsOXRpYTVTZEVQZzZwcGxlZw"
        },
        {
            "title": "Super Typhoon Champi, Churning Over Pacific, Becomes Strongest Storm of 2026",
            "source": "The New York Times",
            "googleNewsUrl": "https://news.google.com/rss/articles/CBMikwFBVV95cUxNQTh4YUtvdF9RZU9OelBXbEdNQlROQUxaejluR09RaTgwLWtmZkQ1a2tPaWxOT2FFNE96U3BLdHhmNklvLTVKZ0tEeXpySEY0NDc4X3JwM25Za1NtekFfdk04Mzc3Y1Vfa09OSV9FTl8wQV9jM05VTVR3OHQ2X21kNGEyWHA4V2R5UEl3UnVCZTZoc1E"
        },
        {
            "title": "Champi slams Guam after rapidly intensifying into violent typhoon, bringing life-threatening conditions",
            "source": "FOX Weather",
            "googleNewsUrl": "https://news.google.com/rss/articles/CBMi2wFBVV95cUxObmZzb2JLUHF3REd3MnBfQnNiQ3p1UDdRMkx1TmJYZ0diWGJGUzVpZXpYWDV4eFNyVHZGTFB3TVBoa2R2QmV4Vk5WSEJqVWhJV1RfT21rUVhYRzNnNlVHSnFtRjRNS2Z4RFlLUmRpNHQxVnRpVW0temJ6SUFqMlFXQjJvTG44bjJPSFFwSi1ackxXNld4NEJqejRuQ0cyQzBaM0Nsa1oxU3l1V1pOOTU1aHZUbFFrVm56RFY0WS1UOENmakpwemJsQUtqZTlnS1cyWWpOLUZORGpPS0XSAeABQVVfeXFMTVBSQnVDRnN5dTRDNTJZUTlXVjdkU0VWUGlwRFFRcWtlbUxmVzJiUUVkME5lLTVBT010TVlha1lvNk5vekVFbWc5YkdoMzdjZElHQjJ2LWJlcVNMbzdMb2hSUmZ4NnpRSlJqbjViMXlQT2dXdWlhdVJNOWxzd3VKMXpSQkg4enA1N0tiUkhGNGJBTjluempwNktCa051cktzNVFSRHYtbFJBS19ONEx0NFpGcXFXVDlvU05aMW1NMHNqcDJ0V1lQTldVQTFlZUJmX0VpNTVIUkdTYnRvOG9nOW4"
        },
        {
            "title": "See Super Typhoon Champi’s giant eye as it swirls across the Pacific",
            "source": "The Washington Post",
            "googleNewsUrl": "https://news.google.com/rss/articles/CBMisAFBVV95cUxQbVBnSWpwbGIwSlgyVVh0YWlNenhrSDBtQ1AtSS1Qck1ZN2RORTZBcFVFOFFmVFJhV096MnA0ei00dE5FYkdOX0dVR3dwWEhEMEtGalVMZnRHUGRRODc5UmtKMDRycFhuc1ROSFgxM2pjQ2RkZEtlSGhvSHd6Vm5rYUZLRTFNZkFfQzJZbHh0YnpEZVM3d0NQVjQzVHlWa3A0UktROGVqMGZCeFVPV3lSQg"
        }
    ],
    "relatedCount": 4,
    "description": "With Super Typhoon Champi approaching, authorities plan evacuations and urge those in its path to get ready.",
    "text": "As Super Typhoon Champi – now the strongest storm of the year worldwide – barrels towards eastern China, authorities are planning evacuations and urging those in its path to prepare. …",
    "wordCount": 428,
    "readingTimeMinutes": 2,
    "imageUrl": "https://cdn.i-scmp.com/sites/default/files/d8/images/canvas/2026/10/21/c5a1f556-d416-4371-b42c-198b8dffd7e7_b65478c5.jpg",
    "authors": ["Caroline Lin"],
    "keywords": ["Accidents, extreme weather and disasters in China", "China", "Shanghai", "Taiwan", "National Meteorological Centre (China)"],
    "section": "Politics",
    "modifiedAt": "2026-10-21T08:00:06.000Z",
    "articleLanguage": "en-GB",
    "detailsStatus": "ok",
    "scrapedAt": "2026-10-21T20:57:21.523Z"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV or Excel.

#### All 35 fields

| Fields | What you get |
| --- | --- |
| `id`, `title`, `position` | **Article**: Google News id (the same in every run and search), headline without the trailing publisher, rank in its feed (`7`) |
| `url`, `googleNewsUrl`, `articleUrl` | **Links**: the original URL when it was resolved, otherwise the Google News link; the Google News link; the publisher's URL (option) or `null` |
| `source`, `sourceUrl`, `sourceDomain` | **Publisher**: `South China Morning Post`, `https://www.scmp.com`, `scmp.com` |
| `publishedAt`, `publishedTimestamp`, `publishedAtRaw` | **Dates**: `2026-10-21T08:00:06.000Z` (what the date filters read), `1792569606000`, `Wed, 21 Oct 2026 08:00:06 GMT` |
| `searchType`, `query`, `topic`, `location` | **Where it was found**: `search`, `topic`, `local`, `story`, `publication` or `feed`; the query, topic or place that found it |
| `regionLanguage`, `country`, `language` | **Edition**: `US:en`, `US`, `en` |
| `searchUrl`, `feedTitle` | the Google News page or feed it was found on, and its title |
| `relatedArticles`, `relatedCount` | **Related coverage**: title, publisher and link of each other article on the same story, and how many. Google News gives it on topics and the front page (nearly every article), seldom on a search, never on local news |
| `description`, `text`, `wordCount`, `readingTimeMinutes` | **Full text** (option): summary, full text, `428` words, `2` minutes |
| `imageUrl`, `authors`, `keywords`, `section`, `modifiedAt`, `articleLanguage` | **Full text** (option): main image, `["Caroline Lin"]`, tags, `Politics`, last update, `en-GB` |
| `detailsStatus` | **Status** of the full text: `ok`, `blocked` (the publisher refused), `no_text` (paywall or no text found), `failed`; `null` when the option is off |
| `scrapedAt` | ISO timestamp of the extraction |

### 💡 Tips

#### How to get more results

Leave **Get more than 100 articles per search** on and set `maxItems` to what you need (or `0`): a search that reaches 100 articles is read again period by period, down to single days, over **Posted after** → **Posted before**, or the `lookbackDays` days before **Posted before** (or before now). Broaden with `searchQueries` and `regionLanguages`: an article found by several searches or editions is saved — and charged — once.

#### How to reduce costs

The price is per article, plus the options you tick. The levers are `maxItems`, `maxItemsPerQuery`, the filters (a filtered-out article costs only the filter fee, lower than an article), `onlyNew` for recurring runs (you never pay twice for the same article), and the options: leave **Original article URL** and **Full article text** off when the Google News link and the headline are enough.

#### Several searches in one run

Fill `searchQueries`, `topics`, `locations` and / or `regionLanguages`: the Actor reads every query, topic and place in every edition (2 queries × 3 editions = 6 searches, up to 1000 per run). The single `query`, `location` and `regionLanguage` fields still work and are added to the lists. Set `maxItemsPerQuery` to give every search its own cap: without it the first searches can use up the whole `maxItems` budget. You can also paste several Google News URLs into `startUrls`: each one is a search of its own, with the same cap.

#### Monitoring: only the new articles

Tick **Only new articles** (`onlyNew`) and schedule the Actor. The first run returns everything; each later run skips the articles already delivered: they are not saved, not charged, and their page is not even opened. The memory lives in a named key-value store of your account (`google-news-scraper-seen`, up to 150,000 articles per key) and is only updated with articles that really reached the dataset, so a failed run never hides anything. Give each schedule its own `stateKey` (two schedules sharing a key would hide each other's articles), and tick `resetState` once to start over. Pair it with a short **Time period** (`timeframe`) or `postedAfter` so that each run only reads the recent news.

#### Filter by publication date

`postedAfter` and `postedBefore` take a date (`2026-09-01`, the whole day is included) or a period before now (`7 days`, `2 weeks`, `1 month`; via the API also `24 hours` or a full ISO date-time). The range is sent to Google News with the search, and every article is checked again on its `publishedAt`; an article without a publication date is dropped as soon as a date bound is set. Filtered-out articles are not saved and do not count in `maxItems` (on a topic, a place or a pasted feed each article dropped costs the filter fee, see Pricing; a dated article of a search dropped by its dates is free, Google News was asked for those dates); the run summary tells how many were filtered.

### 🔌 Integrations and API

Call the Actor via the Apify API, the JavaScript or Python clients, or connect it with integrations and webhooks (Make, Zapier, n8n, Google Sheets, Slack, Airtable…). The dataset can be fetched as JSON or CSV from any tool.

### 🤖 Use with AI agents (MCP)

AI agents (Claude, ChatGPT, Cursor…) can find and run this Actor through the [Apify MCP server](https://mcp.apify.com), billed to their Apify account like any run. It returns one item per Google News article. Actor id: `nice_dev/google-news-scraper`; MCP server with this Actor only: `https://mcp.apify.com/?tools=fetch-actor-details,nice_dev/google-news-scraper`.

Smallest input, for a cheap first call:

```json
{
    "query": "artificial intelligence",
    "maxItems": 10
}
```

Key output fields: `title`, `source`, `publishedAt`, `url`, `articleUrl` (with `resolveUrls`), `text` and `detailsStatus` (with `extractDetails`), `relatedArticles`.

Cost: per article saved, plus the options ticked and a small fee per run start — the prices are in the Pricing tab. Cap each call with `maxItems` and, through the API, with the run option `maxTotalChargeUsd`.

### ❓ FAQ

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

The Actor only reads what Google News and the publishers' websites show publicly to any anonymous visitor. It logs in to nothing and solves no captcha. Articles are protected by the copyright of their publishers: the headlines, links and short summaries are commonly used for monitoring and research, but republishing full texts needs the publisher's permission. Author names are personal data, protected by GDPR: do not store them without a legitimate reason. You are responsible for using the data in compliance with Google's and the publishers' Terms of Use and applicable law. This Actor is not affiliated with Google.

#### Does it need a login or a proxy?

No login, no API key. The proxy is included in the price: leave the default setting (the residential proxy is not available). A request Google News turns away is retried at once on a new proxy session, up to 10 times on top of the retries (without a proxy, after a pause of 5 seconds, doubled at each retry up to 150 seconds). A publisher that refuses the Actor is never retried: the article is saved with `detailsStatus: "blocked"` and is not charged for the full text.

#### Why is the full text missing for some articles?

Some publishers refuse automated visits (Reuters, The New York Times and The Wall Street Journal in our tests) or show their articles behind a paywall. The article is then saved with its headline, link and dates, `detailsStatus` says why (`blocked`, `no_text`, `failed`), and the **Full article text** option is not charged for it. In a test run of 40 articles on `tesla`, 25 full texts were read, 10 were refused by their publisher and 5 had no text.

#### Is the data safe to open in Excel or to show on a web page?

Headlines and texts are the publishers' own words, copied as they are. A text can begin with `-`, `+`, `=` or `@` (a headline such as `-20% today`): Excel and Google Sheets may read such a cell of a CSV file as a formula or as a number. The Actor leaves the text as it is, so that the JSON and the API give the real value: when you open a CSV, import these columns as text. On a web page, escape every field like any text written by a stranger.

#### Known limitations

- Google News gives each article's publication date, but no view or share counts.
- `articleUrl`, the full text and its fields are `null` / empty when the options are off (except `articleUrl` on a **Full coverage** page, whose cards carry the publisher's link), or when the publisher refused the visit.
- `onlyNew` remembers article ids, not their content: an article updated by its publisher is not returned again.
- Two runs sharing the same `stateKey` at the same time may both return the same new article.

**A run that reaches its timeout** stops itself about 45 seconds before it: no new page is asked, what it read is saved and, with `onlyNew`, remembered, and the run ends *Succeeded* with "Stopped before the run's timeout". Resurrect it to go on from there, or give the next run a longer timeout (Run options).

**A run the platform stops without warning** (out of memory)

- Resurrect it: it goes on from where it stood at most a minute before the stop. What it had read since is read again, and the articles already saved are skipped: none is delivered or charged twice, and `maxItems` still counts them.
- With `onlyNew`, the memory is saved after each write (at most once every 2 seconds): resurrect the stopped run and the articles it had saved meanwhile join the memory; leave it stopped for good, and the next run may return the articles of its last 2 seconds once more.

#### Something doesn't work?

The last line of the log counts the articles saved and filtered out, and the requests that failed after every retry. Those requests are listed, with the reason, in the `FAILED_REQUESTS` record of the run's key-value store. A run that saved nothing and had failed requests fails, and its last message gives the cause (a Google News URL that does not exist says so, instead of "run it again").

If Google News changes its pages, you are told instead of paying for blank rows. If the first 20 articles read all lack their headline, publication date or publisher — or, with **Original article URL** or **Full article text**, their original URL — the run saves nothing more, stops and fails, and its last message names the missing field: at most those first articles are charged. An article that `postedAfter` / `postedBefore` drops because it has no date at all counts among those 20. A run of fewer articles (a scheduled `onlyNew` run that finds a few new ones, a small **Max articles**) is checked at its end, from 5 articles: its articles are already saved, and the run fails with the missing field instead of ending green.

### 🛟 Support

Open an issue in the **Issues** tab with a link to your run: the run log and the `FAILED_REQUESTS` record of the key-value store show exactly which URLs failed and why.

# Actor input Schema

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

news.google.com pages or RSS feeds, as copied from the browser: a search (`https://news.google.com/search?q=tesla`), a topic or section, a local news page, a **Full coverage** story, a publisher page or any news.google.com RSS feed. The country / language of the URL (`hl`, `gl`, `ceid`) is kept. Added to the searches, topics and places below. Max 1 000 URLs.

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

What to search, exactly as on Google News. Search operators work: `"exact phrase"`, `OR`, `-word`, `site:reuters.com`, `intitle:word` (e.g. `artificial intelligence -crypto`).

## `searchQueries` (type: `array`):

Several searches in one run (one search per query and per edition below). Added to **Search query**; an article found by several searches is saved once.

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

Google News sections to read for each edition: top stories, world, business, technology… (about 40 articles for the front page, 60-75 for the other sections, per edition; most with their related coverage).

## `location` (type: `string`):

City whose local news to read (Google News **Local** section, e.g. `Paris`, `New York`, `Munich`), or a country in its own edition (`Germany` with `DE:de`). Google News has no local news for a region or a state (`Bavaria`, `Texas`: 0 articles). Read once per edition; not combined with the search queries.

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

Several places in one run: local news of each place. Added to **Local news for a place**.

## `regionLanguage` (type: `string`):

Google News edition used for the searches, topics and places: it decides the country and the language of the articles.

## `regionLanguages` (type: `array`):

Run every search, topic and place in several editions at once (e.g. the same query in France, Germany and Japan). Added to **Country and language**. A run reads at most 1 000 searches: each search, topic or place counts once per edition, each start URL once.

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

Maximum number of articles to save for the whole run (after deduplication and filters). 0 = no limit.

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

Cap for EACH search, topic, place or URL (per edition), so that the first one cannot use up the whole **Max articles** budget. 0 = no per-search cap.

## `fetchBeyond100` (type: `boolean`):

Google News returns at most 100 articles per search. When a search reaches 100, the Actor splits its date range into smaller periods (down to one day) and reads each one, so a search can return thousands of articles. The range is **Posted after** → **Posted before**, or the last **Look-back days** when they are empty. No effect on topics and places.

## `lookbackDays` (type: `integer`):

How far back to split a search that reaches 100 articles, when **Posted after** is empty: that many days before **Posted before**, or before the run's start. Up to 3 650 days (10 years).

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

Order of the articles of each search, topic or place: as ranked by Google News (relevance), or newest first.

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

Replace the Google News redirect link by the real article URL on the publisher's site (`articleUrl`), resolved through Google News itself. Charged per article resolved (see Pricing).

## `extractDetails` (type: `boolean`):

Open each article on the publisher's site and add its full text, word count, reading time, main image, author(s), summary, keywords, section and last-update date. Includes the original article URL. Some publishers refuse robots or show a paywall: the article is then saved without these fields and this option is not charged for it.

## `includeRelatedArticles` (type: `boolean`):

Add the other articles that Google News groups with each article (same story, other publishers: title, publisher, link), free of charge.

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

Only articles from this recent period (Google News `when:`). For an exact range, use **Posted after** / **Posted before** instead.

## `postedAfter` (type: `string`):

Only articles published on or after this date: `2026-09-01`, or a period before now such as `7 days`, `2 weeks`, `1 month` (API: `24 hours` and full ISO date-times work too). Reads the publication date given by Google News.

## `postedBefore` (type: `string`):

Only articles published on or before this date (the whole day is included), or older than a period such as `30 days`.

## `sites` (type: `array`):

Keep only articles from these sites (domain, e.g. `reuters.com`, `bbc.co.uk`). Added to every search as `site:`, and checked on topics and places.

## `excludeSites` (type: `array`):

Drop articles from these sites (domain, e.g. `yahoo.com`).

## `titleOnly` (type: `boolean`):

Match the search query in the article title only (Google News `intitle:`).

## `excludeKeywords` (type: `array`):

Drop the articles whose title contains one of these words or phrases, as whole words: `war` drops "War in…" but keeps "Warner" (case and accents ignored; in Chinese, Japanese, Korean, Thai… any part of the title counts).

## `onlyNew` (type: `boolean`):

Skip the articles that a previous run (same **Memory key**) already delivered: they are not saved and not charged, and their page is not even opened. First run = everything is new.

## `stateKey` (type: `string`):

Name of the memory used by **Only new articles**. Give each schedule / task its own key (e.g. `tesla-alerts`) so that they do not share their memory. Letters, digits, `-` and `_`.

## `resetState` (type: `boolean`):

Forget everything remembered under this **Memory key** before the run: this run returns (and charges) every article again. Untick it afterwards.

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

Apify Proxy or your own proxies. Keep the default: it is included in the price. The residential Apify proxy is not available in this Actor.

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

Maximum number of requests processed in parallel.

## `maxRequestsPerMinute` (type: `integer`):

Most requests to Google News and to publisher sites in any 60 seconds, all of them counted. A budget, not an even pace: up to this many can leave at once when the minute starts (spread them with the minimum delay below). Lower it if the log shows HTTP 429.

## `minRequestIntervalMs` (type: `integer`):

Smallest gap between two requests, in milliseconds. Unlike the per-minute rate, this spreads the requests evenly instead of letting them go out in a burst. 0 = no gap.

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

Retries per request before it is marked as failed. Behind a proxy, a request the site turns away is also retried on a new proxy session up to 10 times without using up these retries.

## `debugLog` (type: `boolean`):

Include debug messages in the run log.

## Actor input object example

```json
{
  "startUrls": [],
  "query": "artificial intelligence",
  "searchQueries": [],
  "topics": [],
  "locations": [],
  "regionLanguage": "US:en",
  "regionLanguages": [],
  "maxItems": 100,
  "maxItemsPerQuery": 0,
  "fetchBeyond100": true,
  "lookbackDays": 30,
  "sortBy": "relevance",
  "resolveUrls": false,
  "extractDetails": false,
  "includeRelatedArticles": true,
  "timeframe": "any",
  "sites": [],
  "excludeSites": [],
  "titleOnly": false,
  "excludeKeywords": [],
  "onlyNew": false,
  "stateKey": "default",
  "resetState": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxConcurrency": 8,
  "maxRequestsPerMinute": 120,
  "minRequestIntervalMs": 0,
  "maxRequestRetries": 5,
  "debugLog": 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 = {
    "query": "artificial intelligence",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

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

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

```

## MCP server setup

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