# News & RSS Monitor — Google Alerts Alternative (`khadinakbar/google-alerts-alternative`) Actor

Monitor topics and brands through GDELT and selected public feeds. Export deduplicated headlines, article links, matched queries, publisher details, and fresh-item flags for recurring news-monitoring workflows.

- **URL**: https://apify.com/khadinakbar/google-alerts-alternative.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 71.4% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 deduplicated alert item emitteds

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?

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

## News & RSS Monitor — Google Alerts Alternative

Monitor topics and brands through GDELT and selected public feeds. Export deduplicated headlines, article links, matched queries, publisher details, and fresh-item flags for recurring news-monitoring workflows. For communications teams, each dataset row is one deduplicated article alert with its matched query and freshness context.

### Workflow: put the results to work

Define explicit watch queries and the trusted feeds relevant to your coverage. Keep a stable alert ID when using cross-run deduplication, then route newly observed articles into your editorial or research queue. Review source coverage before interpreting a quiet result set.

### Best fit and workflow guidance

Choose this Actor when a founder, analyst, communications team, or AI workflow needs structured current-news alerts for an explicit watchlist. It works well for a saved Apify task that runs on a schedule, sends the dataset to a spreadsheet or webhook, and highlights items that have not appeared in earlier runs. Pair it with your own notification or reporting destination when the next step is email delivery, a team chat post, or a dashboard.

Use a dedicated media-intelligence suite when the workflow calls for a licensed media archive, broad social listening, broadcast coverage, PR outreach, or a collaborative enterprise workspace. This Actor focuses on current public-news and selected-feed collection with inspectable source provenance.

### Input

Start with one focused query and a daily-sized window. A stable `alertId` keeps the same deduplication state across scheduled runs.

```json
{
  "alertId": "ai-company-news",
  "watchQueries": ["OpenAI", "Anthropic"],
  "sourceMode": "gdeltOnly",
  "trustedSources": [],
  "lookbackHours": 24,
  "maxItems": 25,
  "excludeKeywords": ["sponsored"],
  "dedupeAcrossRuns": true,
  "includePreviouslySeen": false,
  "resetAlertState": false,
  "stateRetentionDays": 30
}
```

Choose `gdeltAndFeeds` to supplement the public-news query with RSS, Atom, or JSON feeds that you select. Feed URLs pass public-network checks, bounded redirect handling, and format validation before parsing. A feed-only mode is also available for a controlled publisher-watch workflow.

GDELT is an upstream public-news service, so temporary rate or network responses can occur. The Actor makes up to six bounded attempts for a transient GDELT response and returns a named diagnostic outcome with full run details. For the most controlled recurring workflow, include the relevant publisher feeds in `gdeltAndFeeds` or use `feedsOnly`.

### Output dataset

Each row is one normalized article identity after source merging and recurring-alert deduplication. Source-derived fields stay `null` when a source does not provide them, preserving a clear view of what was collected.

| Field | Meaning |
| --- | --- |
| `title`, `url`, `snippet`, `publishedAt` | Article details supplied by an upstream public source |
| `matchedQueries` | Configured watch queries that produced or matched the item |
| `publisherName`, `publisherUrl`, `language`, `sourceCountry` | Publisher and source metadata when available |
| `sourceTypes`, `sourceNames`, `sources` | GDELT and selected-feed provenance for the deduplicated item |
| `attributions` | Required source attribution records, including GDELT Project attribution |
| `isNew`, `alertId`, `collectedAt` | Recurring-alert state and collection-time details |

```json
{
  "id": "a5b9d359b42cc3d4dcfa3d8a1ea893e9e9398e30c2eb5dd31ea5a77786c27afb",
  "alertId": "ai-company-news",
  "title": "Example article headline",
  "url": "https://example.org/news/example-article",
  "matchedQueries": ["OpenAI"],
  "publisherName": "example.org",
  "publisherUrl": "https://example.org/",
  "sourceTypes": ["gdelt"],
  "sourceNames": ["GDELT Project DOC API"],
  "sourceTags": [],
  "snippet": null,
  "publishedAt": "YYYY-MM-DDTHH:mm:ss.sssZ",
  "language": "English",
  "sourceCountry": "United States",
  "collectedAt": "YYYY-MM-DDTHH:mm:ss.sssZ",
  "isNew": true,
  "sources": [
    {
      "sourceType": "gdelt",
      "sourceName": "GDELT Project DOC API",
      "sourceUrl": "https://api.gdeltproject.org/api/v2/doc/doc?query=OpenAI",
      "feedUrl": null,
      "feedType": null,
      "provider": "GDELT Project",
      "attributionName": "GDELT Project",
      "attributionUrl": "https://www.gdeltproject.org/"
    }
  ],
  "attributions": [
    {
      "name": "GDELT Project",
      "url": "https://www.gdeltproject.org/"
    }
  ]
}
```

Every terminal run also writes `OUTPUT` and `RUN_SUMMARY` key-value records. `COMPLETE` means the configured sources produced persisted rows without operational warnings. `PARTIAL` preserves useful rows alongside source or state diagnostics. `VALID_EMPTY` describes a successful collection window with no new matching items, and `INVALID_INPUT` gives an actionable input correction. `UPSTREAM_FAILED` and `CONFIG_ERROR` retain the same diagnostics contract for source and configuration follow-up.

### API quick start

Use your own Apify token to run the deployed Actor and read its returned dataset.

```bash
curl -X POST "https://api.apify.com/v2/acts/khadinakbar~google-alerts-alternative/run-sync-get-dataset-items" -H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" -d '{"alertId":"ai-company-news","watchQueries":["OpenAI"],"sourceMode":"gdeltOnly","lookbackHours":24,"maxItems":25}'
```

For a recurring alert, save the input as an Apify task, attach a schedule, and route the task run or dataset to your preferred notification workflow.

### AI agent and MCP prompt card

> As an AI agent, monitor the supplied watch queries for the stated news window. Return only source-linked alert rows from the Actor dataset, report the terminal outcome from `OUTPUT`, retain each row's provenance and collection time, observe the `maxItems` cost cap, and describe the result as current public-news and selected-feed coverage rather than a full-web claim.

The Actor accepts structured JSON input and emits a dataset, `OUTPUT`, and `RUN_SUMMARY`; it performs no outbound email delivery. An agent can read the dataset after the run, route new rows where appropriate, and use `PARTIAL` or `VALID_EMPTY` as a precise workflow signal.

### Workflow scenario: daily brand-news brief

A communications lead starts with a brand and two competitor names, then saves the bounded input as a daily Apify task. The scheduled run queries current public news, merges repeat article URLs, and remembers previously delivered identities for the chosen alert. Next, the lead routes only `isNew: true` records into an internal brief, while the full source provenance remains available for review. The same workflow can include a selected public trade feed when a topic benefits from a known publisher source.

### How this workflow compares with Google Alerts

| Decision point | This Actor | Google Alerts |
| --- | --- | --- |
| Scope and workflow | Structured public-news and selected-feed collection for explicit queries | Google-managed alert product experience |
| Billing and cost boundary | Pay per event for validated dataset items plus platform usage | Google product terms and account experience govern its delivery surface |
| Effective efficiency | A bounded JSON input yields source-linked rows that a downstream workflow can process | Alert emails provide a Google-managed notification format |
| Output contract | Dataset rows, `OUTPUT`, and `RUN_SUMMARY` with source provenance | Google-managed result and alert delivery surfaces |
| Integrations and automation | Apify API, saved tasks, schedules, datasets, and webhooks | Google alerts integrate through the Google product experience |
| Freshness and state | Collection timestamps and explicit retained deduplication state | Google manages its own alert evaluation and delivery behavior |

This Actor supports a bounded, inspectable news-monitoring workflow. Google Alerts remains the better route for users who prefer the Google alert product and its account-linked delivery surface.

### Best results with a focused standalone workflow

This Actor is designed as a focused standalone workflow. Provide specific watch queries, choose a time window that matches the schedule cadence, and set a clear maximum item count. Add selected public feeds when a publisher matters to the monitoring plan, then confirm their applicable terms before scheduling. Treat the returned source URLs and collection times as the scope of each run, and use the dataset as the handoff point for alerts, reports, or review.

### Builder's note

I built this workflow around a simple operational need: recurring monitoring is most useful when every retained item has a query label, a source URL, a collection timestamp, and an explicit deduplication decision. My goal was to make that bounded step easy to schedule and easy to connect to another system without overstating it as a replacement for every Google product surface.

### Responsible use

Use only public sources you are authorized to collect under applicable laws and source terms. Keep downstream handling aligned with publisher rights and your organization’s policies. GDELT-derived rows carry the required attribution record, and selected-feed rows preserve the source that supplied them.

GDELT Project is an independent third-party data source. This Actor is not affiliated with, associated with, or endorsed by the GDELT Project.

### Pricing and run costs

This Actor uses **Pay per event plus Apify platform usage**. The [Pricing tab](https://apify.com/khadinakbar/google-alerts-alternative/pricing) lists the current event rates and billing terms.

| Event | Billing unit | When it applies |
|---|---|---|
| `apify-actor-start` | Actor Start | Charged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event). |
| `alert-item-emitted` | Deduplicated alert item emitted | Charged only after one schema-valid, deduplicated article alert item is persisted in the default dataset. |

Run cost combines the charged events and Apify platform usage. Review the run charge limit and requested result count before starting.

### Connect an AI agent

Use the [Apify MCP configurator](https://mcp.apify.com) to choose an available client connection. Inspect this Actor’s current input schema and required credentials before running it.

# Actor input Schema

## `watchQueries` (type: `array`):

Provide one to five specific news queries, such as OpenAI, Anthropic, or a quoted company name. GDELT evaluates each query against its public news corpus. Public feeds use a simple case-insensitive text match against the query. Keep queries focused so each alert item has clear provenance.

## `alertId` (type: `string`):

Optional stable name for a recurring alert, such as ai-company-news. The same identifier shares deduplication state across future scheduled runs. When omitted, the Actor derives a stable ID from the topics, feeds, and source mode. Use a new identifier when you intentionally want a separate alert history.

## `sourceMode` (type: `string`):

Choose whether to query GDELT, selected public feeds, or both. GDELT is the open public-news primary source for the default workflow. Public feeds provide a caller-controlled secondary source and a graceful route for focused monitoring. Each retained row names every source that contributed the item.

## `trustedSources` (type: `array`):

Optionally add up to twenty public feeds or public webpages that advertise a feed. The Actor resolves each URL through public-network checks and follows a bounded redirect chain before parsing a feed. Feed-only mode requires at least one source. Use sources you are authorized to monitor and label them to preserve provenance.

## `lookbackHours` (type: `integer`):

Set the current news window from 1 to 168 hours. GDELT receives this window directly and public-feed records are filtered by their publication time when present. The setting scopes each collection run rather than creating a schedule. A 24-hour window is a practical starting point for daily alerts.

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

Cap the whole run at 1 to 100 normalized alert items. This cap applies after source merging, matching, filtering, and cross-run deduplication. It also caps the primary per-item charge for a predictable run budget. Start with 25 items for a focused daily alert.

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

Optionally exclude up to twenty-five literal terms from titles and snippets. Matching is case-insensitive and applies after a source returns a candidate. Exclusions help keep scheduled alerts focused on the intended topic. They use plain text rather than regular expressions.

## `dedupeAcrossRuns` (type: `boolean`):

Enable persistent cross-run deduplication for the alert identifier. The Actor saves only successfully persisted article identities and marks new rows with isNew. This keeps recurring schedules focused on newly seen article URLs. Disable it when every run should return the full matching snapshot.

## `includePreviouslySeen` (type: `boolean`):

Choose whether a deduplicated alert also returns items already seen in its retained state. Every returned item still carries the isNew flag for downstream routing. This is useful when a report needs both fresh and previously delivered items. The default keeps recurring alert datasets focused on new material.

## `resetAlertState` (type: `boolean`):

Set this to true for one run when the alert should begin with an empty deduplication state. The Actor rebuilds state only from rows it successfully stores during that run. Return it to false for future scheduled runs to continue normal deduplication. Use this intentionally when changing the meaning of a stable alert identifier.

## `stateRetentionDays` (type: `integer`):

Choose how long the alert remembers article identities, from 1 to 90 days. Shorter retention suits rapid news cycles and longer retention reduces repeat alerts over extended monitoring. The Actor prunes old state when it saves newly persisted items. This setting affects future deduplication rather than source coverage.

## Actor input object example

```json
{
  "watchQueries": [
    "OpenAI",
    "Anthropic"
  ],
  "alertId": "ai-company-news",
  "sourceMode": "gdeltAndFeeds",
  "trustedSources": [],
  "lookbackHours": 24,
  "maxItems": 25,
  "excludeKeywords": [
    "sponsored"
  ],
  "dedupeAcrossRuns": true,
  "includePreviouslySeen": false,
  "resetAlertState": false,
  "stateRetentionDays": 30
}
```

# Actor output Schema

## `alerts` (type: `string`):

Deduplicated article alert rows with watch-query, source, and collection-time provenance.

## `output` (type: `string`):

Compact terminal outcome and result count.

## `runSummary` (type: `string`):

Detailed source, state, warning, and billing diagnostics.

# 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 = {
    "watchQueries": [
        "OpenAI"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/google-alerts-alternative").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 = { "watchQueries": ["OpenAI"] }

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/google-alerts-alternative").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 '{
  "watchQueries": [
    "OpenAI"
  ]
}' |
apify call khadinakbar/google-alerts-alternative --silent --output-dataset

```

## MCP server setup

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

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/QJRbyHU9sCeSuu9GJ/builds/PoDfR91xY5a9f1HED/openapi.json
