# RSS Feed Monitor & Reader with Daily Digest (`brisaworks/rss-feed-monitor`) Actor

RSS feed monitor and reader: paste RSS, Atom or JSON feeds, or a website URL and it finds the feed. Get one dataset of items with title, link, date, summary, image and podcast enclosures; only new items per scheduled run, keyword filters and a ready-to-send Markdown and HTML digest.

- **URL**: https://apify.com/brisaworks/rss-feed-monitor.md
- **Developed by:** [Brisa Works](https://apify.com/brisaworks) (community)
- **Categories:** News, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.35 / 1,000 feed items

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

This **RSS feed** monitor and feed reader turns RSS, Atom and JSON feeds, or plain website URLs, into one clean, deduplicated dataset. Paste a blog's address and it finds the feed for you. Schedule it and each run returns only the items that are new since the last run, with title, link, date, summary, image and podcast enclosures, filtered by your keywords, plus an optional digest (Markdown and a ready-to-send HTML page) and an AI overview written by Claude with your own key.

**Contents:** [What it does](#what-it-does) · [Use cases](#use-cases) · [How to use](#how-to-use) · [Input](#input) · [Output](#output) · [Compared with other feed readers](#compared-with-other-rss-feed-readers) · [AI agents (MCP)](#use-with-ai-agents-mcp) · [API](#run-it-from-your-code-api) · [Scheduling and integrations](#scheduling-and-integrations) · [Example tasks](#ready-made-example-tasks) · [Pricing](#pricing) · [Limits](#limits) · [FAQ](#faq)

![How RSS Feed Monitor & Reader works: feeds or website URLs in, feed found and fetched with ETag, only new items kept, dataset and digest out](https://api.apify.com/v2/key-value-stores/rabUnlqsZdMugucmh/records/rss-feed-monitor--how-it-works.png)

### What it does

- Reads RSS 2.0, RSS 1.0 (RDF), Atom and JSON Feed, mixed in one run.
- **Website URL to feed:** paste `https://github.blog/` instead of the feed URL. The Actor reads the page's `<link rel="alternate">` tags and uses the feed the site advertises (comment feeds last). In new-items mode it remembers the feed it found, so later runs go straight to it.
- Returns title, link, publication date, summary, categories, the item's **image** (`imageUrl`) and its **enclosures** (podcast audio, video or files, with type and size in bytes), and optionally the full text.
- **New-items mode:** remembers what each feed returned and outputs only unseen items. It sends ETag and Last-Modified headers, so a feed that hasn't changed answers "304 Not Modified" and costs nothing.
- Keyword filter (any match in title, summary or categories) and a "published within N hours" filter.
- **Digest:** saves `DIGEST` (Markdown) and `DIGEST_HTML` to the run's key-value store, grouped by feed. With an Anthropic key it starts with a short overview and up to five highlights.
- Fetches politely: one request per second per site, up to five sites at a time.
- Feeds that fail, pages without a feed and unchanged feeds are free.

### Use cases

Each input below is ready to paste into the Actor's JSON input tab.

**1. Daily news digest for a team.** Five feeds, the five newest items each, only new items, one HTML page to email every morning.

```json
{
  "feedUrls": ["https://github.blog/feed/", "https://blog.cloudflare.com/rss/", "https://www.smashingmagazine.com/feed/", "https://news.ycombinator.com/rss", "https://blog.apify.com/rss/"],
  "maxItemsPerFeed": 5,
  "onlyNewItems": true,
  "digest": "markdown"
}
```

**2. Competitor blog alerts.** Paste the blogs' home pages; the feeds are found for you. Only posts from the last 7 days that mention your keywords.

```json
{
  "feedUrls": ["https://github.blog/", "https://blog.cloudflare.com/", "https://blog.apify.com/"],
  "onlyNewItems": true,
  "keywords": ["agent", "LLM", "pricing"],
  "publishedWithinHours": 168
}
```

**3. Release notes of the tools you depend on.** Every GitHub repository has a releases feed at `https://github.com/<owner>/<repo>/releases.atom`.

```json
{
  "feedUrls": ["https://github.com/nodejs/node/releases.atom", "https://github.com/microsoft/TypeScript/releases.atom"],
  "maxItemsPerFeed": 5,
  "onlyNewItems": true,
  "includeContent": true
}
```

**4. New podcast episodes with their MP3 files.** Each row carries the enclosure URL, MIME type and size, ready for a download or transcription step.

```json
{
  "feedUrls": ["https://changelog.com/podcast/feed"],
  "maxItemsPerFeed": 3,
  "onlyNewItems": true
}
```

### How to use

1. Paste feed URLs or website URLs into **Feed or website URLs**.
2. For monitoring, turn on **Only new items** and schedule the Actor (for example every morning at 07:00).
3. Optionally add keywords or a time window, choose a digest, and add your Anthropic key for the AI overview.
4. Read the dataset or the `DIGEST_HTML` record in Apify Console, through the API, or send them on with an integration (see [Scheduling and integrations](#scheduling-and-integrations)).

### Input

| Field | Description |
|---|---|
| `feedUrls` | Feed URLs or website URLs (required). Website URLs are resolved to the feed they advertise. |
| `maxItemsPerFeed` | Newest first (default 50, 1–1,000). |
| `onlyNewItems` | Monitor mode: only items not seen in earlier runs. |
| `keywords`, `publishedWithinHours` | Filters. |
| `includeContent` | Full item text (up to 20,000 characters). |
| `digest` | `none` or `markdown` (Markdown + HTML). |
| `anthropicApiKey`, `model` | Optional AI overview (default `claude-haiku-5-5`). |

```json
{ "feedUrls": ["https://blog.apify.com/"], "onlyNewItems": true, "keywords": ["agent"], "digest": "markdown" }
```

### Output

![RSS Feed Monitor & Reader dataset from a real run: eight blog posts found from three website URLs, with image, enclosure and matched keyword columns](https://api.apify.com/v2/key-value-stores/rabUnlqsZdMugucmh/records/rss-feed-monitor--output-table.png)

One row per item. These two rows come from real runs on 22 Oct 2026: the first from use case 2 (a website URL, so `discoveredFrom` is set), the second from use case 4 (summary shortened here).

```json
[
  {
    "feedUrl": "https://blog.apify.com/rss/",
    "discoveredFrom": "https://blog.apify.com/",
    "feedTitle": "Apify Blog",
    "status": "ok",
    "itemId": "6437b8355e1379004d395af2",
    "title": "What is data ingestion for large language models?",
    "link": "https://blog.apify.com/what-is-data-ingestion-for-large-language-models/",
    "publishedAt": "2026-10-19T09:00:00.000Z",
    "updatedAt": null,
    "summary": "Learn how data is collected and prepared for LLMs, including key steps, common challenges, and useful tools.",
    "categories": ["AI", "Data processing and analysis"],
    "imageUrl": "https://storage.ghost.io/c/f2/6e/f26ec999-9a90-4aee-a0d4-9b3ca2bb668f/content/images/2026/10/data-ingestion-for-llms.webp",
    "enclosures": [],
    "keywordMatches": ["LLM"]
  },
  {
    "feedUrl": "https://changelog.com/podcast/feed",
    "feedTitle": "The Changelog: Software Development, Open Source",
    "status": "ok",
    "itemId": "changelog.com/1/2834",
    "title": "From zero to NanoClaw (Interview)",
    "link": "https://changelog.com/podcast/686",
    "publishedAt": "2026-10-09T19:00:00.000Z",
    "updatedAt": null,
    "summary": "Gavriel Cohen, creator of NanoClaw and co-founder of NanoCo, joins Adam to explain how a 40-hour weekend project became a viral open source hit…",
    "categories": [],
    "imageUrl": "https://cdn.changelog.com/uploads/covers/changelog-interviews-original.png?v=63848368174",
    "enclosures": [
      {
        "url": "https://op3.dev/e/https://pscrb.fm/rss/p/https://cdn.changelog.com/uploads/podcast/686/the-changelog-686.mp3",
        "type": "audio/mpeg",
        "length": 234654580
      }
    ],
    "keywordMatches": []
  }
]
```

- `imageUrl` comes from, in order: Media RSS thumbnail or image, an image enclosure, `itunes:image`, the JSON Feed `image`, else the first `<img>` in the item's HTML (tracking pixels and author avatars are skipped). `null` when there is none.
- `enclosures` lists RSS `<enclosure>` elements, Atom `rel="enclosure"` links, non-image Media RSS content and JSON Feed attachments. `length` is the size in bytes as the feed states it, or `null`.
- Feeds that fail return a free row with `status` `error` or `not_a_feed` and an `error` message.

### Compared with other RSS feed readers

How this Actor compares with the three leading RSS feed readers in Apify Store, from their own README and input schema (read 22 Oct 2026). Prices are base prices before any subscription discount.

| | **This Actor** | technicaldost/rss-feed-scraper | automation-lab/rss-feed-reader | santamaria-automations/rss-feed-reader |
|---|---|---|---|---|
| Formats | RSS 2.0, RSS 1.0, Atom, JSON Feed | RSS, Atom | RSS 2.0, Atom, RSS 1.0 ("JSON Feed not currently supported") | RSS 2.0, Atom 1.0, JSON Feed |
| Website URL to feed | yes | yes | not listed | yes |
| Only new items across runs | yes, built in | no ("does not maintain a cross-run seen-item history"; separate Actor) | no ("deduplicate by guid" downstream) | not listed (duplicates inside one feed removed) |
| Unchanged feed (ETag / 304) costs nothing | yes | not listed | not listed | not listed |
| Keyword filter | yes | yes | not listed | not listed |
| Date filter | yes (hours) | yes (`publishedAfter`) | yes (`publishedAfter`) | yes (`filterByDate`) |
| Markdown + HTML digest, AI overview | yes | not listed | not listed | not listed |
| Image field | yes | media metadata (no separate image field listed) | yes (`imageUrl`) | yes (`item_image`) |
| Enclosures (podcast audio, video) | yes | yes | not listed | yes, plus podcast duration and episode fields |
| Author names | not collected | yes | yes | yes |
| Failed feeds | free status row | free (listed in `ERRORS`) | row with `error` field | not listed |
| Price | $0.0005 per item; $0.01 per digest | $8.00 / 1,000 dataset rows (one extra metadata row per feed) | $0.001 per item + $0.035 per run | $0.002 per feed + $0.001 per run |

Choose this Actor when you run the same feeds on a schedule and want each item once, a digest to send, and no charge for quiet feeds. Choose a per-feed price (santamaria) when you read very long feeds once and need podcast episode metadata.

### Use with AI agents (MCP)

Give Claude, ChatGPT, Cursor, VS Code or any MCP client this Actor as a tool through the hosted Apify MCP server at <https://mcp.apify.com>. The agent sees the input fields with their descriptions, runs the Actor and reads the items.

- MCP server URL for this Actor only: `https://mcp.apify.com/?tools=brisaworks/rss-feed-monitor`
- Tool name inside the agent: `brisaworks--rss-feed-monitor`

Client config (`mcp.json` or the client's MCP settings; Claude Code: `claude mcp add --transport http apify <URL>`):

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com/?tools=brisaworks/rss-feed-monitor",
      "headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }
    }
  }
}
```

Example prompt: *"Use brisaworks--rss-feed-monitor with {"feedUrls": \["https://github.blog/", "https://blog.cloudflare.com/"], "maxItemsPerFeed": 5, "keywords": \["agent"]} and list the posts as a table with title, date and link."*

### Run it from your code (API)

Get your token in Apify Console → Settings → API & Integrations. Each call below runs the Actor and returns its items.

cURL (waits up to 240 seconds and returns the dataset):

```bash
curl -X POST "https://api.apify.com/v2/acts/brisaworks~rss-feed-monitor/run-sync-get-dataset-items?timeout=240" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"feedUrls": ["https://blog.apify.com/rss/", "https://github.blog/"], "maxItemsPerFeed": 10, "onlyNewItems": true}'
```

Node.js (`npm install apify-client`):

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('brisaworks/rss-feed-monitor').call({
    feedUrls: ['https://blog.apify.com/rss/', 'https://github.blog/'],
    maxItemsPerFeed: 10,
    onlyNewItems: true,
    digest: 'markdown',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const digestHtml = await client.keyValueStore(run.defaultKeyValueStoreId).getRecord('DIGEST_HTML');
console.log(items.length, digestHtml?.value?.slice(0, 200));
```

Python (`pip install apify-client`):

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("brisaworks/rss-feed-monitor").call(run_input={
    "feedUrls": ["https://blog.apify.com/rss/", "https://github.blog/"],
    "maxItemsPerFeed": 10,
    "onlyNewItems": True,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    if item["status"] == "ok":
        print(item["publishedAt"], item["title"], item["link"])
```

New-items mode keeps its memory in a named key-value store in your account (`rss-feed-monitor`), so API runs and scheduled runs share it.

### Scheduling and integrations

- **Schedule:** in Apify Console, save your input as a task and add a schedule (for example daily at 07:00, or hourly for news). With **Only new items** on, each run returns only what appeared since the last one.
- **Webhooks:** add a webhook on "Run succeeded" to post the run to your own endpoint, then read the dataset or `DIGEST_HTML`.
- **n8n:** import the [starter workflow](https://api.apify.com/v2/key-value-stores/rabUnlqsZdMugucmh/records/rss-feed-monitor.n8n.json) (Workflows → Import from URL). It runs this Actor every morning at 07:00 with **Only new items** on, keeps rows whose `status` is `ok` and ends in a placeholder step for your Slack, email or Google Sheets node. On its HTTP node, add a Header Auth credential (name `Authorization`, value `Bearer <your Apify API token>`) and put your feeds in the body. Each run is capped at $1.
- **Make, Zapier, Slack, Google Sheets:** connect them through Apify's integrations (Console → the Actor or task → Integrations): run on a schedule, keep rows whose `status` is `ok`, then send them to your own step.

### Ready-made example tasks

Open one, check the input, and run it or copy it to your account:

- [Daily tech news digest from 5 RSS feeds](https://apify.com/brisaworks/rss-feed-monitor/examples/rss-daily-tech-news-digest)
- [Competitor blog alerts by keyword (website URLs)](https://apify.com/brisaworks/rss-feed-monitor/examples/rss-competitor-blog-keyword-alerts)
- [GitHub release notes monitor (releases.atom)](https://apify.com/brisaworks/rss-feed-monitor/examples/rss-github-release-notes-monitor)
- [Podcast new episodes tracker with MP3 links](https://apify.com/brisaworks/rss-feed-monitor/examples/rss-podcast-new-episodes-tracker)

### Pricing

| Event | Price | Per 1,000 | Charged when |
|---|---|---|---|
| `item` | $0.0005 | $0.50 | A feed item is saved (in new-items mode, only unseen items) |
| `digest` | $0.01 | $10.00 | A digest is saved (at most one per run) |

Apify subscription tiers pay less: an item costs $0.00045 on Bronze, $0.0004 on Silver and $0.00035 on Gold ($0.45, $0.40 and $0.35 per 1,000 items); a digest costs $0.009, $0.008 and $0.007.

Unchanged feeds, unreachable feeds, pages without a feed and non-feed URLs cost nothing. Finding a website's feed costs nothing extra. AI overviews use your Anthropic account.

#### How much does it cost to monitor RSS feeds?

- 20 feeds checked every morning in new-items mode, about 100 new items a day: $0.05 a day for items, $0.06 with a daily digest.
- The daily news digest task above (5 feeds, 5 items each): at most $0.0125 for items plus $0.01 for the digest on the first run; later runs charge only new items.
- A one-off export of 1,000 items: $0.50.
- Apify adds its standard small run-start fee per run.

Set a maximum cost per run in the run options: the Actor checks it before saving each item and before building the digest, and stops before going over it. In new-items mode, items it did deliver are remembered, so the next run neither repeats nor re-charges them.

### Limits

- Feeds usually carry only their latest 10–50 items; run often enough not to miss items on busy feeds.
- New-items mode remembers up to 2,000 item IDs per feed.
- Website URLs work when the page advertises its feed with a `<link rel="alternate">` tag (WordPress and Ghost blogs do, for example). The Actor doesn't guess feed paths. A page without such a tag returns a free `not_a_feed` row.
- Some sites refuse requests that don't come from a browser (for example HTTP 403). The Actor uses no proxies; such feeds return a free `error` row.
- Author names and avatars are not collected.
- Private or password-protected feeds are not supported.

### Data source

- The feeds and web pages you supply, fetched from their publishers. Formats per the RSS 2.0 specification (<https://www.rssboard.org/rss-specification>), Atom (RFC 4287, <https://www.rfc-editor.org/rfc/rfc4287>) and JSON Feed 1.1 (<https://www.jsonfeed.org/version/1.1/>), checked against live feeds on 2026-10-14; enclosures and images also per Media RSS (<https://www.rssboard.org/media-rss>) and feed autodiscovery per the RSS Advisory Board's autodiscovery spec (<https://www.rssboard.org/rss-autodiscovery>), checked against live sites on 2026-10-22. Respect each publisher's terms when you republish their content.
- Optional AI overview: Anthropic Messages API with structured outputs, <https://platform.claude.com/docs/en/build-with-claude/structured-outputs.md> (read 2026-10-14).

### FAQ

#### How do I get only new items every day?

Turn on **Only new items** and schedule the Actor. It remembers the item IDs each feed returned and sends ETag/Last-Modified headers, so unchanged feeds answer with a free "not modified".

#### Can I paste a website instead of a feed URL?

Yes. Paste the home page or blog page. The Actor reads the page's `<link rel="alternate">` tags, picks the main feed (comment feeds last) and adds `discoveredFrom` to each row. If you also list that feed directly, it is read once.

#### Can I get the digest by email or Slack?

The digest is saved as `DIGEST` (Markdown) and `DIGEST_HTML` in the run's key-value store. Use an Apify integration (Make, Zapier, n8n or a webhook) to send it on, or read the record through the API after the run.

#### Can I filter by keywords?

Yes. Items are kept when the title, summary or categories contain at least one keyword (case-insensitive, matched anywhere in a word, so `agent` also matches "agents"); each row lists the keywords it matched. Short keywords match inside longer words too (`ai` matches "again"), so prefer longer ones.

#### How much does a scheduled feed reader cost per month?

At 100 new items a day with a daily digest: about $0.06 a day, or $1.80 a month, plus Apify's run-start fee. Quiet days cost less: unchanged feeds are free.

#### Is it a feed reader app?

No. It has no reading interface; it gives you data (a dataset and a digest page) to read in Apify Console, your inbox, Slack, a spreadsheet or your own app.

### Related Actors

- [Wayback Machine website history](https://apify.com/brisaworks/wayback-history): for pages that publish no feed, see when and how a page changed over time.
- [Schema and JSON extractor](https://apify.com/brisaworks/schema-json-extractor): turn the articles your feeds link to into structured JSON.

### Privacy

Author names and avatars are dropped. When you use the AI overview, item titles and summaries are sent to Anthropic under your own API account.

### Support

Open an issue on the Actor's Issues tab; issues are answered within a few days and fixed within 14 days.

# Actor input Schema

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

RSS 2.0, RSS 1.0, Atom or JSON Feed URLs, one per line. A website URL works too: the Actor reads the feed link in the page head (link rel="alternate") and uses the feed it advertises, comment feeds last.

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

Newest items first.

## `onlyNewItems` (type: `boolean`):

Remember what each feed returned and output only items not seen in earlier runs. Schedule the Actor (e.g. daily) to get a stream of new items.

## `keywords` (type: `array`):

Keep only items whose title, summary or categories contain at least one of these words (case-insensitive).

## `publishedWithinHours` (type: `integer`):

Optional: skip items older than this.

## `includeContent` (type: `boolean`):

Add the item's full text (from content:encoded or Atom content), up to 20,000 characters.

## `digest` (type: `string`):

Save a digest of this run's items to the key-value store (DIGEST as Markdown, DIGEST_HTML as a page you can email or open).

## `anthropicApiKey` (type: `string`):

Adds an AI overview and highlights to the digest. Claude usage is billed to your Anthropic account.

## `model` (type: `string`):

Model ID for the digest overview.

## Actor input object example

```json
{
  "feedUrls": [
    "https://blog.apify.com/rss/",
    "https://github.com/apify/apify-sdk-js/releases.atom"
  ],
  "maxItemsPerFeed": 10,
  "onlyNewItems": false,
  "includeContent": false,
  "digest": "none",
  "model": "claude-haiku-5-5"
}
```

# Actor output Schema

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

One row per result, in the dataset (overview view).

## `digest` (type: `string`):

Ready-to-send HTML digest of the new items. Written only when a digest is requested and there are new items.

# 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 = {
    "feedUrls": [
        "https://blog.apify.com/rss/",
        "https://github.com/apify/apify-sdk-js/releases.atom"
    ],
    "maxItemsPerFeed": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("brisaworks/rss-feed-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 = {
    "feedUrls": [
        "https://blog.apify.com/rss/",
        "https://github.com/apify/apify-sdk-js/releases.atom",
    ],
    "maxItemsPerFeed": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("brisaworks/rss-feed-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 '{
  "feedUrls": [
    "https://blog.apify.com/rss/",
    "https://github.com/apify/apify-sdk-js/releases.atom"
  ],
  "maxItemsPerFeed": 10
}' |
apify call brisaworks/rss-feed-monitor --silent --output-dataset

```

## MCP server setup

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