# Google News Scraper - Keyword, Topic & Country (`aolmo/google-news`) Actor

Latest news from Google News for any keyword or topic, in any language and country: title, publisher, publish date and the real article URL instead of the Google redirect. Filter by period, schedule it and new articles come flagged. No browser, no API key. $0.001 per article.

- **URL**: https://apify.com/aolmo/google-news.md
- **Developed by:** [Antonio del Olmo Tena](https://apify.com/aolmo) (community)
- **Categories:** News, Marketing
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 article founds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

Get the latest news from Google News for any keyword or topic, in any language and country, as clean structured rows. Each article comes with its title, publisher, publish date and the real article URL on the publisher's site, not the Google redirect link that most feeds give you. Schedule it and every run flags the articles that are new since the previous one.

No browser, no proxies on your side, no API key and no quota: the Actor reads Google News' public feeds and resolves each link the same way the Google News website does. You pay $0.001 per article returned.

### What you get

One Dataset row per article:

- `title`, `url` (publisher's page), `googleUrl` (the Google News link), `resolved` (`true` when `url` is the publisher's URL), `id`.
- `source` and `sourceUrl`: the publisher.
- `publishedAt`: ISO date from the feed.
- `feed`, `query`, `topic`, `language`, `country`: where the row comes from.
- `isNew`: `true` when the article was not in the previous run of that keyword or topic.

A keyword with no results returns no rows and is not charged. A feed that cannot be read gives a single row with an `error` field, also free.

### How to use it

1. Open the **Input** tab.
2. In **Keywords** type one search per line, as in Google News: `artificial intelligence`, `"Apify" OR "web scraping"`, `Tesla earnings`.
3. Optionally pick **Topics** (Top stories, World, Business, Technology...) to read whole sections.
4. Set **Language** and **Country** (`en` and `US`, `es` and `ES`, `pt-BR` and `BR`...). Results follow Google News' edition for that pair.
5. Optionally restrict keywords to a **Period**: last hour, 24 hours, 7 days or 30 days.
6. Click **Start**. Read the rows in **Output** or export them as JSON, CSV or Excel.
7. To monitor a topic, schedule the Actor (hourly or daily) with the period set to the last 24 hours. New articles come with `isNew: true`; connect a webhook or an email integration to be notified.

### Input

```json
{
  "queries": ["artificial intelligence"],
  "topics": ["TECHNOLOGY"],
  "language": "en",
  "country": "US",
  "period": "1d",
  "maxArticles": 50,
  "resolveUrls": true
}
```

| Field         | Description |
|---------------|-------------|
| `queries`     | Google News searches, one per line. Up to 50 feeds per run (keywords plus topics). |
| `topics`      | `TOP`, `WORLD`, `NATION`, `BUSINESS`, `TECHNOLOGY`, `ENTERTAINMENT`, `SPORTS`, `SCIENCE`, `HEALTH`. |
| `language`    | Language code, default `en`. |
| `country`     | Two-letter country code, default `US`. |
| `period`      | Keywords only: `1h`, `1d`, `7d` or `30d`. Empty for Google's default ranking. |
| `maxArticles` | Per keyword or topic, 1 to 100. Default 50. |
| `resolveUrls` | Resolve the publisher's URL (default on). Off is faster but `url` is the Google link. |

### Output example

```json
{
  "feed": "https://news.google.com/rss/search?q=apify&hl=en&gl=US&ceid=US:en",
  "query": "apify",
  "topic": null,
  "language": "en",
  "country": "US",
  "id": "CBMirgFBVV95cUxPaENiWWxuZU1rVkdwR0ZvY3Zh...",
  "title": "Jan Čurn: how Apify taught AI agents to pay for themselves",
  "url": "https://aroundprague.cz/en/people/jan-curn-how-czech-startup-apify-taught-ai-to-pay-for-itself-without-humans",
  "googleUrl": "https://news.google.com/rss/articles/CBMirgFBVV95cUxPaENiWWxuZU1rVkdwR0ZvY3Zh...?oc=5",
  "resolved": true,
  "source": "Around Prague",
  "sourceUrl": "https://aroundprague.cz",
  "publishedAt": "2026-10-02T13:16:04.000Z",
  "isNew": false,
  "timestamp": "2026-10-04T16:30:00.000Z"
}
```

### Pricing

Pay per event, no subscription:

- **Article found**: $0.001 per article row. 1,000 articles cost $1.
- **New article**: $0.002 per article flagged as new in a scheduled run. Runs with nothing new only pay for the rows.

Feeds that cannot be read or return nothing are free. Compare with typical Google News scrapers at $0.001 to $0.005 per article, most of them returning the Google redirect link instead of the real URL.

### Use it as an API

Run it from your code with the Apify API or client libraries:

```bash
curl -X POST "https://api.apify.com/v2/acts/aolmo~google-news/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"queries": ["artificial intelligence"], "language": "en", "country": "US", "period": "1d"}'
```

The response is the list of article rows. You can also call it from AI agents through the Apify MCP server. To turn the articles into clean Markdown for an LLM, pass the `url` values to `aolmo/page-to-markdown`.

### FAQ

**How many articles per keyword?** Google News feeds return up to about 100 articles. Use the period filter and several specific keywords to cover more ground.

**Why is `resolved` sometimes false?** A few articles cannot be decoded by Google's own resolver; those keep the Google link in `url`, which still opens the article in a browser.

**Does it include the article text?** No, only the metadata from Google News. For the full text, send the `url` values to `aolmo/page-to-markdown`.

**Which languages and countries work?** Any pair Google News supports, for example `en`/`US`, `en`/`GB`, `es`/`ES`, `es`/`MX`, `pt-BR`/`BR`, `fr`/`FR`, `de`/`DE`.

**Where is the data stored between runs?** In a Key-Value Store of your account named `micro-saas-state-google-news`, one key per keyword or topic feed. Delete it to start fresh.

# Actor input Schema

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

One search per line, as you would type it in Google News (quotes and OR work, e.g. "artificial intelligence" OR "machine learning").

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

Optional. Google News sections to read in addition to the keywords.

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

Language code: en, es, fr, de, pt-BR...

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

Two-letter country code: US, GB, ES, MX, BR...

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

Only articles published in the last hour, day, week or month. Leave empty for Google's default ranking.

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

Google News returns up to about 100 per feed. Also caps what you pay.

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

Replaces the Google redirect link with the publisher's URL (one extra request per article, a few seconds per feed). Switch off for the fastest run.

## `product` (type: `string`):

Internal. Leave as is.

## Actor input object example

```json
{
  "queries": [
    "artificial intelligence"
  ],
  "topics": [],
  "language": "en",
  "country": "US",
  "maxArticles": 50,
  "resolveUrls": true,
  "product": "google-news"
}
```

# Actor output Schema

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

Dataset items: url, changed, events, data, timestamp and error (when the target failed).

# 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"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("aolmo/google-news").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"] }

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,aolmo/google-news"
        }
    }
}
```

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/kTsZVoRufaLoybhMz/builds/zPdB2fc246agEuVK9/openapi.json
