# News Monitor: Keyword News Search + RSS/Atom Feeds (`eddie-power-dev/news-monitor`) Actor

Monitor the news for any keyword across 100,000+ outlets worldwide (via the open GDELT news index) and any RSS or Atom feed. Direct publisher links, dates, sources, de-duplicated, with only-new mode for alerts. Cheap per-article pricing.

- **URL**: https://apify.com/eddie-power-dev/news-monitor.md
- **Developed by:** [Eddie Power](https://apify.com/eddie-power-dev) (community)
- **Categories:** News, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.50 / 1,000 article returneds

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

## News Monitor: Keyword News Search + RSS/Atom Feeds

**Track any topic, brand or competitor across world news, plus any RSS or Atom feed, in one run.** Give it keywords and/or feed URLs and get a clean, de-duplicated list of articles with the **direct publisher link**, headline, outlet, date, language and country. Turn on **Only new articles since last run**, schedule it, and you have a cheap news alert that only bills you for new stories.

Keyword search uses the **open GDELT news index** (100,000+ outlets in 100+ languages, updated every 15 minutes), which is free for commercial use. Feeds are read straight from the publisher. No login, no browser, no proxies.

Great for:

- 📰 **Brand and competitor monitoring:** who's writing about you this week
- 📈 **PR, comms and investor relations:** daily coverage reports
- 🤖 **AI agents, newsletters and blogs:** a reliable feed of fresh stories to summarise
- 🔔 **Alerts:** schedule hourly or daily with only-new mode, then send to Slack, email or a webhook with Apify integrations

### Input

| Field | What to put in | Default |
|---|---|---|
| `queries` | Keywords, one per line. `"exact phrase"`, `(a OR b)`, `-exclude`, `domain:abc.net.au` | – |
| `timespan` | Last hour … last 3 months | last 24 hours |
| `language` / `country` | e.g. `english`, `australia` | any |
| `maxArticlesPerQuery` | Newest first, up to 250 | 100 |
| `feedUrls` | RSS/Atom feed URLs, or a website URL that advertises a feed (we find it) | – |
| `feedKeywords` | Only keep feed items mentioning one of these | keep all |
| `onlyNewSinceLastRun` | Remember returned articles and output only new ones next time | off |

```json
{
  "queries": ["\"interest rates\" RBA", "(Canva OR Atlassian) -sport"],
  "timespan": "24h",
  "country": "australia",
  "feedUrls": ["https://www.abc.net.au/news/feed/51120/rss.xml"],
  "onlyNewSinceLastRun": true
}
```

### Output

One row per article: `title`, `url` (publisher link), `domain`, `source`, `publishedAt`, `snippet` (feeds), `author`, `imageUrl`, `language`, `sourceCountry`, `categories`, `origin` (`gdelt` or `feed`), `query` / `feedUrl`. Articles found by several queries or feeds appear once (tracking parameters are ignored when matching). A **SUMMARY** record lists each query and feed with how many articles were found and returned, and any errors.

### Pricing

Pay per result: you're charged **per article returned**. Duplicates, filtered-out items, failed feeds and the SUMMARY are free. Set a **maximum cost per run** and the Actor stops when it's reached.

### Notes and limits

- **News search returns headlines and links, not article text.** GDELT gives the headline, link, outlet, language, country and first-seen time; feeds add a summary. Read the full story on the publisher's site.
- Queries run one at a time with a short pause (GDELT asks for at most one request every 5 seconds), so 10 queries take about a minute.
- Very short or very common single words may be rejected by the index; the reason is shown in SUMMARY.
- Feeds must be public. Pages that aren't feeds and don't advertise one are reported in SUMMARY.

### Responsible use

Articles belong to their publishers. This Actor returns headlines, short summaries and links so you can find and read stories at the source; don't republish full articles without permission. Google News is deliberately **not** used, because its feed terms allow personal, non-commercial use only.

Built by [Eddie Power](https://apify.com/eddie-power-dev).

# Actor input Schema

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

Keywords to search world news for, one per line. Use quotes for exact phrases ("electric vehicles"), OR inside brackets ((Tesla OR Rivian)), a minus to exclude (-sport), and domain:abc.net.au to restrict to one site. Up to 50.

## `timespan` (type: `string`):

Only articles first seen in this window (search queries only).

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

Only articles in this language, as an English word, e.g. english, spanish, german.

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

Only outlets based in this country, as one word, e.g. australia, unitedkingdom, us.

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

Newest first. The news index returns at most 250 per query.

## `feedUrls` (type: `array`):

Any public RSS or Atom feed URL, or a website/blog URL that advertises a feed (we find it). Up to 200.

## `maxItemsPerFeed` (type: `integer`):

Newest items first, as ordered by the feed.

## `feedKeywords` (type: `array`):

Only keep feed items whose title or summary contains one of these words (case-insensitive). Leave empty to keep everything.

## `onlyNewSinceLastRun` (type: `boolean`):

Remembers article URLs already returned (in a named key-value store in your account) and only outputs new ones next time. Ideal for scheduled alerts: you only pay for new articles.

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

Use different names to keep separate memories for different monitors (letters, numbers and dashes).

## `maxArticlesTotal` (type: `integer`):

Stop after this many articles (also bounded by your maximum cost per run).

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

The news index allows one request per 5 seconds per IP address, and Apify's shared IPs often hit that. By default news search uses Apify Proxy (datacenter IPs, included in Apify plans) and switches IP if it's rate-limited. Feeds are always fetched directly.

## Actor input object example

```json
{
  "queries": [
    "\"artificial intelligence\" Australia"
  ],
  "timespan": "24h",
  "maxArticlesPerQuery": 100,
  "maxItemsPerFeed": 50,
  "onlyNewSinceLastRun": false,
  "stateKey": "default",
  "maxArticlesTotal": 10000,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `articles` (type: `string`):

One row per article: title, publisher link, source, date, snippet (feeds) and where it came from.

## `summary` (type: `string`):

Counts and per-input status for the run (JSON record SUMMARY in the default key-value store).

# 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\" Australia"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("eddie-power-dev/news-monitor").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\" Australia"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("eddie-power-dev/news-monitor").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\\" Australia"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call eddie-power-dev/news-monitor --silent --output-dataset

```

## MCP server setup

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

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/CO3hCAa4LMKhqFDiu/builds/lbzQwUqfbo0sNEnDR/openapi.json
