# Google News Scraper — Articles, Sources & Real URLs (`tidyfeed/google-news-scraper`) Actor

Google News results for any query as a table: headline, outlet, published time and the real article URL, not a Google redirect. Filter by days back, country and language. Or one coverage summary per query: articles per day, top outlets, share of voice against competitors. No login, no key.

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

## Pricing

from $2.10 / 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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Google News Scraper — Articles, Sources & Real URLs

**Who is writing about you this week, and where does it link?**

Google News results for any query as a table: headline, outlet, published time and the real article URL — the publisher's own link, not a Google redirect. Pick the country edition and language, set a window of days, and get every article Google lists, newest first. Or flip the switch and get one coverage summary per query — articles in the window, articles per day, how many outlets covered it and which ones — the share-of-voice table a PR desk builds by hand.

No API key. No login. No proxies.

***

### Two modes

**Articles — one row per article.** The default. Give it a brand, a person, a topic or an operator query, and get the articles Google News lists for it with the outlet, the time and the real link.

**Summary — one row per query.** Give it your name and your five competitors' and get six rows you can sort: who got covered most this month, by how many outlets, and who dominated each one's coverage.

Measured 15 September 2026, US edition, last 30 days:

| Query | Articles | Outlets | Top outlets |
|---|---|---|---|
| Shopify | 100 — Google's ceiling, window too wide | 39 | Shopify (27), Yahoo Finance (24) |
| WooCommerce | 31 | 24 | Hostinger (4) |
| BigCommerce | 15 | 9 | GetLatka (5), Hostinger (3) |

Three names, one table, and the difference between a company that is news and one that is not is in the first column.

***

### What you get

#### Articles mode

**The article** — `title` (the outlet's suffix stripped), `source` (outlet name as Google shows it), `sourceDomain`, `snippet`

**The link** — `articleUrl` (the publisher's URL), `urlResolved` (true when the redirect was decoded), `resolveNote` (why it was not, otherwise empty), `googleNewsUrl` (Google's link, always present)

**When** — `publishedAt`, `daysSincePublished`

**Which search** — `query`, `country`, `language`

#### Summary mode

`query`, `country`, `language`, `daysCovered`, `articles`, `articlesPerDay`, `outlets`, `topOutlets` (top five with counts), `topOutletShare`, `latestArticleAt`, `firstArticleAt`, `latestHeadline`, `hitGoogleCap`, `status`

***

### Typical uses

- **Weekly coverage report.** Articles mode, `daysBack: 7`, your brand and product names, on a schedule. Every run is a dated list of what was written and where.
- **Share of voice.** Summary mode on you and your competitors, `daysBack: 30`, once a month. Six rows, and the story is in the `articles` and `outlets` columns.
- **Monitor a topic or a person.** Operator queries work: `"chief executive" Shopify`, `site:reuters.com AI agents`, `Klaviyo -jobs`.
- **Feed a newsletter or a Slack channel.** Real links, so what you forward opens the article, not Google.

***

### Input

| Field | What it does |
|---|---|
| `queries` | One search per line. Quotes, `OR`, `-word` and `site:` work as in Google News. |
| `daysBack` | Window in days. Default 7. `0` returns whatever Google serves, roughly the last month. |
| `country` | Two-letter edition code (`us`, `gb`, `de`, `jp`, `kr`…). Decides the outlets and the default language. |
| `language` | Optional two-letter language override. |
| `mode` | `articles` (default) or `summary`. |
| `resolveUrls` | On by default. Off skips the decoding and returns Google's links only, faster. |
| `maxArticlesPerQuery` | Cap per query. Google's own ceiling is 100. |

***

### What it costs

**$3.00 per 1,000 articles** in articles mode, **$10.00 per 1,000 query summaries** in summary mode, plus $0.005 per run. Apify's Starter, Scale and Business plans get 10%, 20% and 30% off.

You pay for rows delivered. A query with no results costs nothing. Resolving the real URLs costs nothing extra.

For scale: a weekly report on five names is usually 100–300 articles — well under a dollar. A monthly share-of-voice table on ten names is ten cents.

***

### How it works

Google News publishes an RSS feed for any search, up to 100 articles, with headline, outlet and time. This actor reads that feed for each query and window.

The link in the feed points at Google. For each article the actor fetches the article's Google page, which carries a signature, and asks Google's own resolver for the publisher's URL — the same round trip the Google News app makes when you tap a headline. Measured 15 September 2026: about 0.7 seconds per article, run four at a time. No browser, no proxies.

***

### Honest limits

- **Google serves at most 100 articles per search.** For a busy name that is a few days, not a month. `status` and `hitGoogleCap` say when the ceiling was hit; narrow `daysBack` and the set is complete again.
- **The window is Google's, not a calendar.** `daysBack` uses Google's own `when:` operator; Google decides what counts as "the last 7 days" and occasionally includes an article a few hours outside it. Rows are still filtered by their published time, so nothing older than the window is returned.
- **Some links do not resolve, and occasionally a whole run does not.** When Google's resolver declines, the row keeps Google's link, `urlResolved` is `false`, `resolveNote` says why, and `status` counts them. Usually a few percent. Google also rate-limits the resolver by server address now and then, and then every link in that run keeps Google's URL; the run log says so, and running again a little later normally resolves them (measured 15 September 2026: 0 of 5 in one run, 5 of 5 two minutes later).
- **Headlines come from Google, not the page.** Google shortens some and appends the outlet name; the outlet suffix is stripped, the rest is as Google shows it.
- **Editions differ.** The same query in the `kr` and `us` editions returns different outlets in different languages. That is the point of the country field, not a bug.
- **Google may throttle heavy use.** Queries are read one at a time and links four at a time with a pause; a run of hundreds of queries may see HTTP 429, which is reported per query rather than failing the run.

***

### Scheduling

Coverage moves daily. Schedule articles mode with `daysBack: 7` on your names and each run adds the week's articles with real links; schedule summary mode monthly on your competitive set and you have a dated share-of-voice record.

***

### Legal

This actor reads only the public feeds and pages Google News serves to anyone, and returns headlines, outlet names, times and links — not article text. It requires no login and bypasses no access control. You remain responsible for how you use the exported data.

***

Questions, or a query that behaves oddly? Open an issue on the actor — issues are read and answered.

# Actor input Schema

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

One search per line, as you would type it into Google News: a brand, a person, a topic, or an operator query like "shopify" OR "bigcommerce". Quotes force exact phrases; site:reuters.com limits to one outlet.

## `daysBack` (type: `integer`):

7 for the last week, 30 for the last month. 0 means whatever Google returns, which is roughly the last month. Google serves at most 100 articles per query, so a narrower window returns a more complete set.

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

Two-letter country code for the Google News edition to search: us, gb, de, fr, jp, kr, br, in… Decides which outlets and which language Google favours.

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

Two-letter language code for the edition: en, de, fr, ja, ko, pt… Leave empty to use the country's main language.

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

"Articles" gives one row per article. "Summary" gives one row per query: articles in the window, articles per day, outlets covering it, top outlets, first and latest article — the share-of-voice table for a PR desk.

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

Google News links point at Google, not at the article. On by default: each link is decoded into the publisher's own URL, which costs two extra requests per article and a few seconds per hundred. Turn off for a faster run with Google's links only.

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

Upper limit per query. Google itself serves at most 100 per search, so 100 is the ceiling whatever you enter here.

## Actor input object example

```json
{
  "queries": [
    "Shopify",
    "\"Klaviyo\" -jobs",
    "site:techcrunch.com AI agents"
  ],
  "daysBack": 7,
  "country": "us",
  "language": "",
  "mode": "articles",
  "resolveUrls": true,
  "maxArticlesPerQuery": 100
}
```

# Actor output Schema

## `rows` (type: `string`):

No description

## `rowsCsv` (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": [
        "Shopify"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tidyfeed/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": ["Shopify"] }

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

```

## MCP server setup

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