Busabase
Busabase is an open-source (MIT) database and workspace for AI agents — data, docs, skills, and apps in one place. Run it locally, self-host it inside your network, or use Busabase Cloud, and turn age
Convert RSS, Atom and JSON Feed URLs into clean JSON items with content, authors, dates, images and podcast enclosures. $0.0005 per item; failed feeds f...
DataTypeScript · DockerfileGitHub @josh99smithOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Convert RSS, Atom and JSON Feed into clean, consistent JSON items: title, link, author, date, content, images and podcast enclosures. Paste a site URL and it finds the feed for you. Pay per item; failed feeds are free. Runs on Apify Store: https://apify.com/josh99smith/rss-feed-to-json
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
RSS to JSON converter and RSS feed parser API: turn any RSS, Atom or JSON feed into clean, consistent JSON. Paste feed URLs (or website URLs; the Actor finds the feed) and get one normalized record per article, episode or post: title, link, author, date, categories, HTML and plain-text content, lead image and media enclosures.
Built for developers, content teams, newsletter builders and automation users: a small flat price per item, no monthly subscription, and feeds that cannot be found, fetched or parsed are reported free of charge.Read the full README ↗RSS to JSON converter and RSS feed parser API: turn any RSS, Atom or JSON feed into clean, consistent JSON. Paste feed URLs (or website URLs; the Actor finds the feed) and get one normalized record per article, episode or post: title, link, author, date, categories, HTML and plain-text content, lead image and media enclosures.
Built for developers, content teams, newsletter builders and automation users: a small flat price per item, no monthly subscription, and feeds that cannot be found, fetched or parsed are reported free of charge.
contentText is ready for embeddings, summarisation or classification.Each URL is downloaded (gzip and redirects handled) and its feed format detected. For a web page, the Actor reads the <link rel="alternate" type="application/rss+xml"> / atom+xml / feed+json head tags, otherwise probes common paths such as /feed, /rss.xml and /atom.xml, and uses the first working feed. CDATA, escaped HTML, entities, content:encoded, dc:creator, categories, media:content, itunes:image and enclosures are normalized into one item shape, and dates become ISO 8601.
contentText stays available).{
"feedUrls": ["https://blog.apify.com/rss/", "https://hnrss.org/frontpage", "https://www.theverge.com"],
"maxItemsPerFeed": 100,
"publishedAfter": "2026-01-01",
"includeContent": true,
"plainText": true
}
One record per feed item (trimmed):
{
"feedUrl": "https://blog.apify.com/rss/",
"feedTitle": "Apify Blog",
"feedType": "rss",
"id": "64884d212b8e8a0001df7576",
"title": "12 LangChain alternatives for building AI agents in 2026",
"url": "https://blog.apify.com/langchain-alternatives/",
"author": "Theo Vasilis",
"publishedAt": "2026-09-15T12:00:00.000Z",
"updatedAt": null,
"summary": "LangChain is a powerful framework for developing LLM apps, but it's not without its disadvantages. So what are the alternatives?",
"contentHtml": "<img src=\"https://storage.ghost.io/.../langchain-alternatives-1.png\" alt=\"...\"><p>LangChain is still the most widely used framework ...</p>",
"contentText": "LangChain is still the most widely used framework for building LLM applications ...",
"categories": ["AI", "Tool comparisons"],
"enclosures": [{ "url": "https://storage.ghost.io/.../langchain-alternatives-1.png", "type": null, "length": null }],
"imageUrl": "https://storage.ghost.io/.../langchain-alternatives-1.png",
"fetchedAt": "2026-09-18T19:55:04.974Z",
"isNew": true
}
Failed feeds are recorded too:
{ "feedUrl": "https://example.com/no-feed-here", "success": false, "errorType": "not-found", "error": "No RSS, Atom or JSON feed found for this page", "fetchedAt": "..." }
| Field | Description |
|---|---|
feedUrl | Parsed feed URL; discoveredFrom is the page it was discovered from. |
feedTitle / feedType | Feed title and format: rss, atom, rss1 or json. |
id | guid, Atom id or JSON id, falling back to the link. |
title / url / author | Title (HTML stripped), absolute link, author (dc:creator, author, Atom author/name, or feed-level author). |
publishedAt / updatedAt | ISO 8601 timestamps, or null. |
summary | Plain-text summary (description, Atom summary, JSON summary), max 5,000 characters. |
contentHtml | Full HTML body (content:encoded, Atom content, JSON content_html), max 50,000 characters; null with Include full HTML content off. |
contentText | Plain-text body with paragraph breaks, max 5,000 characters; null with Add plain-text content off. |
categories[] | Categories, tags or dc:subject values, de-duplicated. |
enclosures[] | url, type (MIME) and length (bytes) from enclosures, Media RSS and JSON Feed attachments. |
imageUrl | Lead image: Media RSS, itunes:image, an image enclosure or the first <img> in the content. |
isNew | true unless an earlier run with the same state store delivered the item; always present. |
errorType | Failures only: invalid-url, not-found, invalid-feed, http-error, , , , or . |
One HTTP call:
curl -X POST "https://api.apify.com/v2/acts/josh99smith~rss-feed-to-json/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"feedUrls": ["https://blog.apify.com/rss/"], "maxItemsPerFeed": 20}'
Python (apify-client):
from apify_client import ApifyClient
client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("josh99smith/rss-feed-to-json").call(
run_input={"feedUrls": ["https://hnrss.org/frontpage"], "maxItemsPerFeed": 20, "publishedAfter": "2026-09-01"}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item.get("publishedAt"), item.get("title"), item.get("url"))
JavaScript or TypeScript (apify-client):
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('josh99smith/rss-feed-to-json').call({
feedUrls: ['https://blog.apify.com/rss/', 'https://www.theverge.com'],
maxItemsPerFeed: 20,
includeContent: false,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((item) => [item.title, item.url]));
The Actor is exposed as a tool by the Apify MCP server, so an AI agent can call it by name. Add this to your MCP client configuration (Claude Desktop, Claude Code, Cursor, VS Code, Windsurf and others):
{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=josh99smith/rss-feed-to-json",
"headers": { "Authorization": "Bearer <YOUR_API_TOKEN>" }
}
}
}
Then ask, for example: "Fetch the latest 10 items from https://blog.apify.com/rss/ with josh99smith/rss-feed-to-json." The agent fills in the input, runs the Actor and reads the dataset back; you pay the same per-result price as in the Console.
The Actor can also be scheduled, or connected to Zapier, Make, n8n and Google Sheets in the Integrations tab.
With Only new items since the last run on, the Actor stores the id of every delivered item (feed guid or id, else the link, else a hash of title and date) in a named key-value store (rss-feed-to-json-seen by default). The first run returns everything; later runs return only items not seen before. Skipped items are never billed.
Unlike Published after, this needs no date bookkeeping between runs and also catches items without a publication date. The store is shared by all runs in your account, so give each feed group its own State store name (for example competitor-blogs and podcasts).
Ids absent for Forget seen items after (days) (default 90) are dropped and count as new if they return; the store holds at most 100,000 ids. With monitor mode off, isNew still marks previously seen items. SUMMARY in the key-value store reports newItems, alreadySeen and stateStoreName.
You pay a flat price per delivered item (shown next to the Start button); 2,000 items cost about $1. Nothing is charged for Actor start-up, items skipped by monitor mode or feeds that fail. Max items per feed and Published after limit what is fetched; the Actor stops when a run reaches the maximum cost you set.
How it compares (September 2026). Comparable feed readers charge $0.00115 per item plus a $0.035 start fee, or $0.008 per item. This Actor charges $0.0005 per item with no start fee, supports RSS, Atom, RSS 1.0 and JSON Feed, discovers feeds from a plain site URL, and offers monitor mode so scheduled runs return only new items, with skipped items never billed.
https://www.theverge.com is enough; if a site advertises several feeds the first working one is used, so paste the exact URL for a specific feed.RSS 2.0 (including podcast feeds with iTunes and Media RSS extensions), Atom 1.0, RSS 1.0 / RDF and JSON Feed 1.0 and 1.1, gzip-compressed or behind redirects.
contentHtml short or missing for some items?The Actor reads feeds only, never linked articles, so you get what the feed contains: full text for most blogs, a summary for many news sites. For full articles, pass the url values to a content-extraction Actor.
RFC 822 (Tue, 10 Jun 2003 04:00:00 GMT), ISO 8601 and common timezone abbreviations become UTC ISO 8601. Unparseable dates give publishedAt: null and are never filtered by Published after.
Max items per feed goes up to 10,000 per run (default 100). contentHtml is capped at 50,000 characters, summary and contentText at 5,000 each. Feed files may be up to 32 MB, up to 10 feeds are fetched in parallel, and each request times out after at most 120 seconds.
Delete the store named in State store name (rss-feed-to-json-seen unless you changed it) under Storage > Key-value stores in Apify Console; the next run returns everything again. Or set a new State store name to keep the old watchlist.
Feeds are published for syndication and read as a feed reader would (a couple of requests per feed); only what the publisher includes is stored. Complying with the publisher's terms and applicable law is your responsibility.
No. Existing fields are never renamed or removed without a major version bump announced in the changelog; new fields are only ever added.
Best Damn RSS to JSON Converter plugs into the tools you already use through Apify integrations, so results can flow on without anyone downloading a file. Ready-made connectors include:
You can also attach webhooks to trigger your own endpoint whenever a run succeeds, fails or times out. For example, forward new feed items to Slack or Discord, or append them to a Google Sheet as they are published.
Found a feed that is not parsed correctly? Open a ticket in the Issues tab with the feed URL. Open source under the MIT licence. If this Actor saved you time, a review on its Store page helps other people find it.
The full source code is on GitHub: josh99smith/rss-feed-to-json. Stars and pull requests are welcome.
blockeddnstimeoutnetworkother