How to use it: 3 steps
- Make a free Apify accountApify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
https://hnrss.org/frontpagein Feed URLs. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
Read public RSS and Atom feeds into one Apify Dataset. Save article titles, links, dates, summaries, and feed metadata as JSON or CSV. Choose monitor mode to see which feed items are new or updated since the last saved baseline.
Who uses it
Content teams
Save the latest posts from blogs you follow into one table.
Developers
Turn RSS and Atom feeds into clean JSON for your app.
Market watchers
Track new posts from many feeds and filter them by keywords.
Price
Pay per event: you pay for each result the tool saves, plus a small start fee for each run. The price includes Apify platform costs. Apify bills you, not us. Prices below are for the Apify free plan.
| What you pay for | Price | When |
|---|---|---|
| Saved feed item | $0.00075 | One chargeable event for each ITEM or monitor status row saved to the default dataset. |
| Start fee | $0.0056 | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |
Examples
- One feed item: about $0.0063.
- 1,000 feed items: about $0.76.
- Every day 100 feed items, for 30 days: about $2.42 a month.
Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed. That is enough for about 6,600 feed items.
Prices checked on 24 October 2026. See the current price on Apify.
Questions
Can it get old posts that left the feed?
No. A feed shows only its recent items. Removed items cannot be read again.
Does it read the full article?
No. It saves what is inside the feed. It does not open the article pages.
Why did monitor mode return no items?
The first run makes a baseline. After that, quiet feeds return only the run summary.
Does it send me alerts?
No. Use an Apify schedule and an integration to send results where you want.
Details
Step by step on Apify
- Open the Actor's Input tab and choose a new input. The form already contains
feedUrls: ["https://hnrss.org/frontpage"],maxItemsPerFeed: 10, andmaxItemsTotal: 10. - Leave
modeassnapshot, or keep the form's other default settings. Do not replace the feed with a website homepage. - Click Start. Open the Dataset tab after the run ends.
- Check that the first
ITEMhastitle,link,feedType, anditemKey. The last row isRUN_SUMMARY; checkfeedResultsandstatusthere. - Export the Dataset as JSON or CSV, or read it through the Apify API.
Use cases
| Need | Key input | Result |
|---|---|---|
| Save the latest posts from a public blog | mode: "snapshot", feedUrls | ITEM rows with title, link, and optional dates |
| Read several RSS and Atom feeds | Several feedUrls, maxItemsTotal | Rows tagged with feedIndex, feedType, feedUrl |
| Find feed changes across runs | mode: "monitor", same stateKey and storage | NEW, UPDATED, and optional UNCHANGED / NO_LONGER_IN_CURRENT_FEED |
| Limit a topic list | includeKeywords, excludeKeywords | Filtered item rows and filteredCount in summary |
| Inspect a feed that gave no rows | Read final RUN_SUMMARY | Per-feed outcome, httpStatus, and errorCode |
Tips for better results
- Use the direct feed URL, not the site homepage. The tool does not search for feeds.
- In monitor mode, keep the same state key each run. Then it can compare with the last baseline.
- Use include and exclude keywords to keep only the topics you care about.
Limits and good to know
The Actor reads feed files via direct HTTP(S) calls with bounded requests, redirects, decompressed bytes, retries, item limits, and concurrency. It rejects URL credentials, private/reserved IP targets, unsupported ports, and unsafe redirects. XML DTD, external entities, and unsafe entity expansion are refused. Item links and enclosure URLs are returned as data only.
Recent updates
Update · 18 September 2026
- Closed post-Publish release reconciliation as
RELEASE_CLOSED. Publiclatestis builduNNoNvRAZQWoHmGoF/0.2.11from sourceb371827, annotated tagv0.2.11; the prior 0.2.10 build remains a rollback reference. - Reconciled the owner-selected public
rss-itemprice at USD0.00075and aligned README/Store copy. Final public default canaryrY5YhbcSotd4cipi3produced 10 ITEM rows plusRUN_SUMMARY, committed 10 charge events and a settled conservative cost of USD0.007982402858808637. - Verified public visibility, non-deprecated state, unchanged icon, ordinary PR #8 merge, release tag push, temporary-tag removal and no schedules or webhooks. Exact Publish timestamp is not exposed by the Actor API.
- Closed post-Publish release reconciliation as
Update
- M04 maintenance: bounded fresh-form prefill, fixed source-work deadline, resource-error diagnostics, strict malformed XML rejection and one-pass XML entity decoding, pre-write item charging limits, dependency remediation, full Input/Output reference and functional README banner.
- Completed TZ-05 private finalization. Build
pdMeFD6WZwBHEeYS2/0.2.8from sourceaca635cis assigned to privatelatestandproduction, the rollback tagtz04-candidate-abb8a0bremains available, and the Actor is still private with no icon or Publish action. - Applied private pay-per-event pricing:
rss-itemat USD0.0005per acknowledged ITEM row, no start fee, no synthetic default-dataset event, and a USD0.0005minimum total-charge guard. Final latest/production and cap checks reconcile one charge receipt per ITEM and a free RUN_SUMMARY.
Update
- Completed TZ-01 audit and design with a GO verdict for the bounded direct public RSS/Atom/RDF reader/monitor.
- Added implementation-ready input, output, error, state, pricing, performance and test contracts.
- Recorded exact OSS provenance and rejected reuse of unsafe transport/state patterns.
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"schemaVersion": 1,
"rowType": "ITEM",
"mode": "snapshot",
"feedUrl": "https://hnrss.org/frontpage",
"feedType": "rss2",
"feedTitle": "Hacker News: Front Page",
"itemKey": "v1:sourceId:fc45d683916c42bc268704901045f040",
"title": "OTel-Native by Design – Building Products That Export to Any Observability Stack",
"link": "https://opentelemetry.io/blog/2026/otel-native-by-design/",
"publishedAt": "2026-10-09T06:54:45.000Z",
"changeType": "SNAPSHOT",
"presentInCurrentFeed": true,
"deletionConfirmed": false
}Use it from code
Actor ID: cliqtomedia/rss-atom-feed-reader-monitor. You need your Apify API token from Apify Console → Settings → API & Integrations.
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/rss-atom-feed-reader-monitor").call(run_input={
"feedUrls": [
"https://hnrss.org/frontpage"
],
"mode": "snapshot"
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~rss-atom-feed-reader-monitor/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"feedUrls": ["https://hnrss.org/frontpage"], "mode": "snapshot"}'# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool
tool = ApifyActorsTool("cliqtomedia/rss-atom-feed-reader-monitor")
result = tool.invoke({"run_input": {"feedUrls": ["https://hnrss.org/frontpage"], "mode": "snapshot"}})
print(result)The cURL call waits for the results, up to 300 seconds. For longer runs, start a run (/runs) and get the results with a webhook or by checking the run. Apify API docs. LlamaIndex, MCP for AI agents and the JavaScript client: AI agents & MCP.
Data fields (18)
| Field | Type | Meaning |
|---|---|---|
schemaVersion | integer | Output contract version. |
rowType | string | Dataset row type. |
runId | string | Run identifier. |
observedAt | string | UTC emission time. |
mode | string | Execution mode. |
status | string | Change type or run outcome. |
feedUrl | string | Canonical feed URL for ITEM rows. |
effectiveFeedUrl | string | Validated final feed URL after redirects. |
feedType | string | Detected feed format. |
itemKey | string | Versioned stable item identity. |
title | string | Feed-provided item title. |
link | string | Feed-provided item link; never fetched. |
publishedAt | string | Normalized item publication time. |
changeType | string | SNAPSHOT, NEW, UPDATED, UNCHANGED or NO_LONGER_IN_CURRENT_FEED. |
deletionConfirmed | boolean | The Actor always sets false; a missing item is not confirmed deleted. |
errorCode | string | Canonical run/feed outcome when present. |
chargedItemRows | integer | Count of acknowledged PPE item charges. |
chargeStatus | string | Shows whether item charges were not needed, committed, limited or unclear. |
Input settings (21)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| Feed URLs required | feedUrls | array | ["https://hnrss.org/frontpage"] |
| Mode | mode | string | "snapshot" |
| Maximum items per feed | maxItemsPerFeed | integer | 10 |
| Maximum total items | maxItemsTotal | integer | 10 |
| Order | sort | string | "source" |
| Published after | publishedAfter | string | |
| Published before | publishedBefore | string | |
| Include keywords | includeKeywords | array | [] |
| Exclude keywords | excludeKeywords | array | [] |
| Remove repeated items across feeds | dedupeAcrossFeeds | boolean | false |
| Include feed content | includeContent | boolean | false |
| Maximum summary characters | maxSummaryChars | integer | 4000 |
| Maximum content characters | maxContentChars | integer | 20000 |
| Request timeout | requestTimeoutMs | integer | 15000 |
| Maximum retries | maxRetries | integer | 2 |
| Maximum concurrency | maxConcurrency | integer | 5 |
| Monitor name | stateKey | string | |
| Start a new baseline | resetState | boolean | false |
| Show baseline items | emitBaselineItems | boolean | false |
| Show unchanged items | emitUnchanged | boolean | false |
| Show missing current items | emitNoLongerCurrent | boolean | false |
Use cases with this tool
Each guide shows all the steps and the other tools.