RSS / Atom Feed Normalizer
Pricing
from $0.005 / actor start
RSS / Atom Feed Normalizer
Fetch and normalize public RSS 2.0, Atom 1.0, and RDF/RSS 1.0 feeds into consistent structured JSON. Handles mixed feed formats and returns a unified schema every time. Built for content aggregation, feed monitoring, and marketing automation pipelines.
Pricing
from $0.005 / actor start
Rating
0.0
(0)
Developer
Sanskar Jaiswal
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Security
Limited permissionsShare
Fetch and normalize public RSS 2.0, Atom 1.0, and RDF/RSS 1.0 feeds into consistent structured JSON. Auto-detects feed format and returns a unified schema regardless of source. Atom article links resolve relative references and inherited xml:base against the final feed URL, so moved feeds remain usable in content pipelines.
Use cases
- Content aggregation - merge feeds from multiple sources into one consistent schema
- Feed monitoring - track updates across many feeds with a single API call
- Marketing automation - pull blog and news feeds into scheduling pipelines
- News aggregation - normalize heterogeneous feeds before loading into a data warehouse
- Brand monitoring - track RSS feeds for mentions and updates
Input
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
feedUrls | array<string> | yes | - | Public RSS/Atom/RDF feed URLs (max 50 per run) |
maxItemsPerFeed | integer | no | 20 | Max items to normalize per feed (1-100) |
timeoutSeconds | integer | no | 10 | Whole-feed fetch deadline, including DNS and redirects (3-30 seconds) |
Example input
{"feedUrls": ["https://hnrss.org/frontpage","https://blog.cloudflare.com/rss/"],"maxItemsPerFeed": 20,"timeoutSeconds": 10}
Output
Each feed produces one dataset item:
| Field | Type | Description |
|---|---|---|
inputUrl | string | The feed URL provided |
feedUrl | string | Normalized requested feed URL, before redirects |
ok | boolean | Whether fetch and parse succeeded |
status | integer | HTTP status code |
format | string | Detected format: rss2, atom, rdf, or unknown |
finalUrl | string | Final URL after redirects |
contentType | string | HTTP content-type header |
checkedAt | string | ISO timestamp |
channel | object | Feed metadata: title, link, description, itemCount, itemsReturned |
items | array | Normalized feed items (see below) |
error | string | Error message on failure |
Normalized item fields
Every item has the same fields regardless of feed format:
| Field | Type | Description |
|---|---|---|
title | string | Item title |
link | string or null | Item URL; for Atom, an absolute HTTP/HTTPS alternate link, or null when none is usable |
guid | string or null | Unique identifier; RSS GUID text and Atom IDs remain strings, including numeric-looking IDs with leading zeroes. Missing/empty identifiers return null |
description | string | Summary or content text |
pubDate | string | Publication date in ISO 8601 format |
author | string | Author name or email |
categories | array | Category or tag strings |
Example output
{"inputUrl": "https://hnrss.org/frontpage","feedUrl": "https://hnrss.org/frontpage","ok": true,"status": 200,"format": "rss2","channel": {"title": "Hacker News: Front Page","link": "https://news.ycombinator.com/","description": "Hacker News RSS","itemCount": 30,"itemsReturned": 20},"items": [{"title": "Show HN: A new tool","link": "https://news.ycombinator.com/item?id=12345","guid": "https://news.ycombinator.com/item?id=12345","description": "Description text...","pubDate": "2026-07-06T12:00:00.000Z","author": null,"categories": []}]}
Security
- Only public HTTP/HTTPS feed URLs are accepted
- SSRF protection: localhost, private IPv4/IPv6 ranges, and DNS-resolving-to-private IPs are blocked
- URLs with embedded credentials (
user:pass@host) are rejected - Each redirect is revalidated before fetching (maximum five); sockets use the validated DNS address while retaining the original hostname for HTTP and TLS
- Feed bodies capped at 2,000,000 bytes while streaming; oversized feeds fail rather than returning truncated XML
- Requests ask for uncompressed responses; unsolicited compressed bodies are rejected
- The whole-feed deadline includes DNS, all redirect hops and response reading
- Article links,
xml:basetargets and embedded content are never fetched. Feed text/HTML is untrusted and must be sanitized before rendering - No browser automation, no proxies, no login credentials
Pricing
Pay-per-event pricing:
| Event | Price |
|---|---|
| Actor start | $0.005 per GB of Actor memory, minimum one event |
| Feed result (including error results) | $0.005 |
At the default 512 MB memory, a run returning 10 feed results costs approximately $0.055. Apify's displayed pricing is authoritative; results are charged per feed dataset row, not per article.
FAQ
What feed formats are supported?
RSS 2.0, Atom 1.0, and RDF/RSS 1.0. The actor auto-detects the format and returns it in the format field.
What if a feed is down or returns an error?
The actor returns an item with ok: false and the error details. Other feeds in the same run continue normally.
Is there a limit on feed size? Feed bodies are capped at 2,000,000 bytes per fetch. XML nesting and entity-expansion limits also apply, so a feed within the byte limit can still be rejected for parser safety.
Which Atom URL is returned?
channel.link and each item's link use rel="alternate" (including omitted rel), preferring HTML/XHTML representations, then source order for ties. Feed, entry and link-level xml:base values are inherited. Without an explicit base, the final feed URL after redirects is used. Self, enclosure and related links are not substituted for article links. Missing, malformed, credentialed or non-HTTP/HTTPS alternatives return null. Article destinations are metadata, not independently DNS-validated or fetched. This does not rewrite URLs inside embedded HTML or implement HTTP Content-Location bases.
How are RSS GUIDs handled?
RSS GUIDs are opaque identifiers. Attribute-bearing GUIDs use element text, not attribute values. Numeric-looking text stays a string, preserving leading zeroes and large IDs for deduplication. An explicit item link takes precedence. When it is absent, a GUID supplies the article link only if isPermaLink is omitted or exactly true and the GUID is an absolute HTTP/HTTPS URL without credentials. A GUID marked false, an invalid flag, a non-HTTP scheme or a relative reference does not supply a link. GUID destinations are never fetched or DNS-validated. This is not full RSS conformance validation.
Who is this for compared with a feed parsing library?
Content operations and marketing automation teams that need scheduled, batched JSON delivery through an Actor rather than hosting a parser. Universal Feed Parser already supports relative URI resolution and more embedded-content handling; this Actor is a hosted workflow convenience, not a claim of broader parsing coverage. Store keywords: RSS to JSON, Atom normalization, content aggregation, feed monitoring.
How will this offering be evaluated? After a purchasable listing exists, keep if days 61-90 produce at least 30 paid runs, five paying users, positive contribution margin and at least 95% success on supported public feeds. Revisit listing/pricing after 100 qualified impressions with fewer than five paying users. Archive at day 90 if fewer than five paying users and under $10 gross revenue, with no repeat customer or concrete inbound request. These are proposed evaluation thresholds, not measured demand.
Can I use this for authenticated or private feeds? No. This actor only fetches public feeds without credentials.