# RSS to JSON API | RSS, Atom & Podcast Feeds (`xtech/feed-extractor`) Actor

Convert RSS, Atom, JSON Feed, and podcast feeds to structured JSON and spreadsheet-ready entries for monitoring and automation.

- **URL**: https://apify.com/xtech/feed-extractor.md
- **Developed by:** [Xtech](https://apify.com/xtech) (community)
- **Categories:** Automation, Developer tools, News
- **Features:** Limited permissions
- **Stats:** 23 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 feed entries

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?

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

## RSS Feed Scraper & RSS to JSON Converter

Turn any **RSS, Atom, or JSON Feed** URL into clean JSON and a spreadsheet-friendly table. Paste one or more feed links, run the Actor, and download results — no API keys for public feeds.

### Pricing

- **$0.002 per feed entry** saved to the dataset, plus the automatic **$0.00005** Actor start event.
- Example: a 50-entry feed costs **$0.10005**.
- The price applies only to entries successfully saved to the default dataset.

### Quick start

1. Add your feed URL(s) in **Feed URLs** (one per line).
2. Click **Start**.
3. Open the **Output** tab:
   - **Full feed JSON** — complete feed with all entries (ideal for APIs and “RSS to JSON” workflows).
   - **Feed entries** — one row per article, episode, or post (export to CSV/Excel).

#### Example input

```json
{
  "feedUrls": [
    "https://feeds.bbci.co.uk/news/rss.xml",
    "https://hnrss.org/frontpage"
  ]
}
```

### What you get

| Output | Best for |
|--------|----------|
| **OUTPUT** (JSON file) | Apps, webhooks, n8n, Make, custom scripts — full feed structure in one file |
| **Dataset** (table) | Spreadsheets, monitoring, filtering by title/date/link |

Each dataset row includes the entry fields (`title`, `link`, `published`, …) plus feed context (`feedTitle`, `feedUrl`).

#### Example output

```json
{
  "feedUrl": "https://feeds.bbci.co.uk/news/rss.xml",
  "feedTitle": "BBC News",
  "title": "Example headline",
  "link": "https://www.bbc.com/news/articles/example",
  "published": "2026-05-22T10:00:00.000Z"
}
```

When several feeds are supplied, a temporarily unavailable feed is reported in
the `OUTPUT` errors list and the unbillable `sourceResults` dataset while
successful feeds still produce dataset rows. The run fails only when none of
the supplied feeds can be read. A readable feed with zero entries remains a
successful conversion with `billableEntries: 0`; it does not create or charge a
synthetic feed-entry row.

### Input

| Field | Required | Description |
|-------|----------|-------------|
| **Feed URLs** | Yes | One or more RSS/Atom/JSON Feed URLs (up to 50 per run) |
| Normalize fields | No | Consistent output across feed types (default: on) |
| ISO date format | No | ISO-8601 dates (default: on) |
| Max description length | No | Truncate long HTML (default: 250; use `0` for full text) |
| Base URL | No | Only if relative links in the feed are not resolved |
| User-Agent / headers | No | Only if the feed blocks default requests |

### Use cases

- **RSS to JSON** — Convert feeds for apps, RAG pipelines, or databases
- **News & blogs** — Monitor multiple sites in one run
- **Podcasts** — Extract episodes and metadata from podcast RSS
- **Automation** — Schedule runs and connect via Apify API, webhooks, or integrations
- **Content pipelines** — Pair with [Article Extractor](https://apify.com/xtech/article-extractor) for feed-to-full-text workflows or [News Source Crawler](https://apify.com/xtech/news-source-crawler) for site-wide monitoring

### Notes

- Parses feed URLs you provide; it does not discover feeds from a website homepage.
- Some feeds omit fields (e.g. `published`); output reflects what the source provides.
- Older integrations can still pass a single `url` field instead of `feedUrls`.

# Changelog

This Actor's version history is a separate document: https://apify.com/xtech/feed-extractor/changelog.md

# Actor input Schema

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

RSS, Atom, or JSON Feed links. Add multiple URLs to combine blogs, news sites, or podcast feeds in one run.

## `url` (type: `string`):

Deprecated. Use Feed URLs instead. Kept for older API integrations.

## `normalization` (type: `boolean`):

Return consistent field names and formats across RSS, Atom, and JSON Feed.

## `useISODateFormat` (type: `boolean`):

Convert publication dates to ISO-8601 when possible.

## `descriptionMaxLen` (type: `integer`):

Truncate long HTML descriptions. Use 0 to keep the full text.

## `baseUrl` (type: `string`):

Only needed if the feed uses relative links and they are not resolved automatically.

## `userAgent` (type: `string`):

Sent when downloading the feed. Change only if the server rejects the default.

## `headers` (type: `object`):

Extra HTTP headers as JSON, e.g. {"Accept": "application/rss+xml"}.

## Actor input object example

```json
{
  "feedUrls": [
    "https://feeds.bbci.co.uk/news/rss.xml"
  ],
  "normalization": true,
  "useISODateFormat": true,
  "descriptionMaxLen": 250,
  "userAgent": "Mozilla/5.0 (compatible; FeedExtractor/1.0)"
}
```

# Actor output Schema

## `feedJson` (type: `string`):

Complete parsed feed with all entries. Best for RSS-to-JSON workflows, webhooks, and API integrations.

## `feedEntries` (type: `string`):

One row per article, episode, or post. Export to CSV, Excel, or connect via dataset API.

## `sourceResults` (type: `string`):

Unbillable diagnostics for feeds that could not be read.

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

No description

# 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://feeds.bbci.co.uk/news/rss.xml"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("xtech/feed-extractor").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://feeds.bbci.co.uk/news/rss.xml"] }

# Run the Actor and wait for it to finish
run = client.actor("xtech/feed-extractor").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://feeds.bbci.co.uk/news/rss.xml"
  ]
}' |
apify call xtech/feed-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,xtech/feed-extractor"
        }
    }
}
```

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/dyex1xs0NETuRT3Nd/builds/nd1kh87Q75Bvx01XZ/openapi.json
