# Google News Scraper API: Real Article URLs & History (`inter974/google-news-scraper`) Actor

Scrape Google News by keyword, topic or city in 60 editions. Get headline, publisher, date and the real article URL (decoded), up to 1,000 articles per search and years of history. No browser, failed searches free.

- **URL**: https://apify.com/inter974/google-news-scraper.md
- **Developed by:** [kev Data Tools](https://apify.com/inter974) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 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: Real Article URLs & History

Get **Google News articles by keyword, topic or city** in seconds - with the **real publisher URL** of every article, not Google's redirect link.

No headless browser: the Actor reads Google News directly, so it is **fast** (100 articles with their real URLs in about a minute, 10 seconds without URL decoding), **cheap** and **reliable**. Searches that fail are listed separately and **never charged**.

### What data can you get?

| Data | Description |
|---|---|
| 🔎 **Search** | Any keyword, with Google News operators: `"exact phrase"`, `OR`, `-exclude`, `site:reuters.com`, `intitle:` |
| 🔗 **Real article URL** | Google News links are redirects (`news.google.com/rss/articles/...`). The Actor decodes them and returns the publisher's URL in `url` |
| 📅 **History** | Past hour, day, week, month, year - or any dates, years back (`dateFrom` / `dateTo`) |
| 📈 **Up to 1,000 articles per search** | Google stops at 100 articles per feed; the Actor goes day by day to collect more |
| 🗞️ **Topics** | Today's headlines: Top stories, World, Nation, Business, Technology, Entertainment, Sports, Science, Health |
| 📍 **Local news** | Headlines for any city or region: `Austin, Texas`, `Lyon`, `Bavaria`... |
| 🌍 **60 editions** | United States, United Kingdom, France, Germany, Spain, Brazil, India, Japan... each in its own language |
| 🧩 **Related coverage** | For topics and local news: the other outlets covering the same story |
| ♻️ **No duplicates** | An article found by several searches is returned (and charged) once |

### How to use it

1. Enter one or more **search queries** (one per line), and/or pick **topics** or **local news** places.
2. Pick the **edition** (country and language) and the **time range**, or set exact dates.
3. Set **Max articles per input** (up to 1,000).
4. Click **Start**. Download the results as JSON, CSV, Excel or HTML, or get them through the API.

#### Example input

```json
{
    "queries": ["artificial intelligence", "\"OpenAI\" site:reuters.com"],
    "topics": ["TECHNOLOGY"],
    "edition": "US:en",
    "timeRange": "7d",
    "maxArticles": 100
}
```

#### Example output

```json
{
    "type": "search",
    "input": "tesla",
    "edition": "US:en",
    "rank": 1,
    "title": "Tesla's China-made EV sales quicken in September",
    "source": "Reuters",
    "url": "https://www.reuters.com/business/autos-transportation/teslas-china-made-ev-sales-quicken-september-2026-10-09/",
    "publishedAt": "2026-10-09T10:17:44Z",
    "sourceUrl": "https://www.reuters.com",
    "googleNewsUrl": "https://news.google.com/rss/articles/CBMirwFBVV95cUxO...",
    "relatedCoverage": [],
    "scrapedAt": "2026-10-12T17:07:14Z"
}
```

Topic and local news items also have `relatedCoverage`: a list of `{ title, source, googleNewsUrl }` for the other articles about the same story.

### Use cases

- **Brand & PR monitoring** - schedule a search for your brand and competitors every hour and send new articles to Slack, email or a spreadsheet.
- **Market & investment research** - follow companies, tickers and industries across countries and languages.
- **SEO & content** - see which outlets cover a topic and what angles get published.
- **AI agents & RAG** - give your agent fresh news with real URLs it can open; works as a tool through the Apify MCP server.
- **Media analysis & research** - build datasets of articles over months or years.

### Integrations

Run it from **n8n, Make, Zapier, Google Sheets**, the **Apify API** (Python / JavaScript clients) or as a tool for AI agents via the **Apify MCP server**. Schedule it to monitor a topic.

#### Call it from your code

```python
from apify_client import ApifyClient  # pip install apify-client

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("inter974/google-news-scraper").call(run_input={
    "queries": ["nvidia"],
    "timeRange": "1d",
    "maxArticles": 20,
})
for article in client.dataset(run.default_dataset_id).iterate_items():
    print(article["publishedAt"], article["source"], article["title"], article["url"])
```

Or with a single HTTP request (returns the articles directly):

```bash
curl -X POST "https://api.apify.com/v2/acts/inter974~google-news-scraper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer <YOUR_APIFY_TOKEN>" -H "Content-Type: application/json" \
  -d '{"queries": ["nvidia"], "timeRange": "1d", "maxArticles": 20}'
```

### Pricing

Pay per article: you are charged for each article in the dataset. Searches that fail or return nothing are **free**, and duplicates are removed before you pay.

| Apify plan | Price per 1,000 articles |
|---|---|
| Free | $2.00 |
| Bronze | $1.50 |
| Silver | $1.00 |
| Gold | $0.80 |

Examples on the Free plan:

- The 20 latest articles about your brand: **$0.04**
- Your brand checked every hour (past hour, up to 5 articles per check): **$7 a month at most**
- 1,000 articles about a topic over a year: **$2**

Apify's free plan includes monthly credits, enough for thousands of articles. See the *Pricing* tab for the current rates.

### Tips & limits

- Google returns at most **100 articles per feed**. With a time range of 7 days or more (or dates), the Actor collects up to 1,000 by going day by day. With *Past hour* or *Past 24 hours*, the maximum is 100.
- Search results follow Google's relevance order. When the Actor goes day by day, results are sorted from newest to oldest.
- Dates are in UTC. `dateTo` is included.
- `url` is `null` in the rare case where Google refuses to decode a link; `googleNewsUrl` always works in a browser.
- Topics and local news are the headlines Google shows today; time range and dates apply to searches only.
- The Actor returns headlines and metadata only, not the text of the articles.

### FAQ

**Why decode the links?** Google News RSS links point to `news.google.com`, not to the article. They need a browser to redirect, so they are useless in a spreadsheet, a database or for an AI agent. This Actor returns the publisher URL directly.

**Is there an official Google News API?** No. Google shut down its News API years ago. This Actor gives programmatic access to the public Google News results.

**Is it legal?** The Actor collects public headlines, publisher names, dates and links - no personal data and no article text. Google's terms restrict the use of its news feeds; you are responsible for using the data in line with applicable laws and Google's terms.

**Something doesn't work?** Open an issue in the *Issues* tab with your run ID and we'll look into it.

# Actor input Schema

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

Keywords to search in Google News, one per line. Google News operators work: "exact phrase", OR, -exclude, site:reuters.com, intitle:word.

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

Today's headlines of the edition, by section. Each article comes with the other outlets covering the same story.

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

Local headlines for a city, region or country, e.g. 'Austin, Texas', 'Lyon', 'Bavaria'.

## `edition` (type: `string`):

The Google News edition to use: it sets the country and the language of the results.

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

How far back to search. Ignored when you set dates below. Topics and local news are always today's headlines.

## `dateFrom` (type: `string`):

Optional, YYYY-MM-DD (UTC). Search articles published from this day, years back if you want.

## `dateTo` (type: `string`):

Optional, YYYY-MM-DD (UTC), included. Defaults to today.

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

Google returns at most 100 articles per feed. For search queries with a time range of 7 days or more (or with dates), the Actor goes day by day to collect up to 1,000.

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

Google News links are redirects (news.google.com/rss/articles/...). When enabled, each article also gets its publisher URL in 'url'.

## `includeRelatedCoverage` (type: `boolean`):

For topics and local news: the other outlets covering the same story (title, source, Google News link).

## `deduplicate` (type: `boolean`):

If the same article is found by several inputs, keep (and pay for) it only once.

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

Inputs processed at the same time.

## `maxRetries` (type: `integer`):

Retries on a fresh IP when Google rate-limits.

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

Proxies used to reach Google News.

## Actor input object example

```json
{
  "queries": [
    "artificial intelligence"
  ],
  "edition": "US:en",
  "timeRange": "7d",
  "maxArticles": 50,
  "resolveUrls": true,
  "includeRelatedCoverage": true,
  "deduplicate": true,
  "maxConcurrency": 3,
  "maxRetries": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `failedInputs` (type: `string`):

No description

## `noDataInputs` (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": [
        "artificial intelligence"
    ],
    "maxArticles": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("inter974/google-news-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "queries": ["artificial intelligence"],
    "maxArticles": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("inter974/google-news-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "queries": [
    "artificial intelligence"
  ],
  "maxArticles": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call inter974/google-news-scraper --silent --output-dataset

```

## MCP server setup

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