# News & Blog Article Extractor: Diffbot Alternative, with RSS (`nebulacolors/article-extractor`) Actor

Extracts news and blog articles from URLs you give, or finds the newest ones on a site, section page or RSS feed. Returns headline, authors, publish date, tags, lead image and the body as clean Markdown. Obeys robots.txt. $0.002 per article.

- **URL**: https://apify.com/nebulacolors/article-extractor.md
- **Developed by:** [Nebula Colors LLC](https://apify.com/nebulacolors) (community)
- **Categories:** News, AI, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 article extracteds

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

## News & Blog Article Extractor: Diffbot Alternative, with RSS

Get clean news and blog articles with headline, author, date and full text, the fields Diffbot's Article API gives, for $2 per 1,000 articles. Pages that fail or aren't articles are free, and there's no plan.

### News article extractor use cases

- Pull the latest posts from a list of news sites or blogs every morning.
- Keep only what's new: "Only newer than: 24 hours".
- Give an AI agent the full text of an article, with its date and author.
- Feed articles into a RAG index, a newsletter or a summary.

### What you get for each article

Give it article URLs, or a news site, blog, section page or RSS feed, and get each article back with its headline, authors, publish date, tags, lead image and the full text as clean Markdown. From a site or section page it finds the newest articles itself, using the site's own feed first. It obeys robots.txt and paces its requests. $0.002 per article, and pages that fail or aren't articles are free. It works for people and for AI agents through Apify's MCP server.

### Input

| Field | What to put |
|---|---|
| Article URLs | Articles to extract, one per line. Each one is extracted, whatever Max articles says. |
| Start URLs | A home page, section page or RSS feed, like `https://blog.cloudflare.com/`. The newest articles on it are extracted. |
| Max articles | The most articles to take from the start URLs. Default 20. |
| Only newer than | A date like `2026-10-01`, or a span like `7 days` or `24 hours`. Older articles are skipped and not charged. |
| Add plain text | Off by default. On: a `text` field with the article as plain text, next to the Markdown. |
| Proxy | Off by default. Turn on Apify Proxy for a site that blocks cloud servers. |

Give article URLs, start URLs or both. Example:

```json
{
  "startUrls": ["https://blog.cloudflare.com/"],
  "maxArticles": 10,
  "newerThan": "7 days"
}
```

### Output

One row per article. This one came from a test run on October 15, 2026 (Markdown cut short here):

```json
{
  "type": "article",
  "url": "https://www.bbc.co.uk/news/articles/c8wy9veedgygo",
  "requestedUrl": "https://www.bbc.co.uk/news/articles/c8wy9veedgygo?at_medium=RSS&at_campaign=rss",
  "foundOn": null,
  "title": "Starlink: Musk says US government may be behind slowdown of Ukraine drone speeds",
  "authors": ["Tiffany Wertheimer"],
  "publishedAt": "2026-10-14T20:17:09.546Z",
  "modifiedAt": "2026-10-14T20:55:24.210Z",
  "description": "Ukraine says Starlink access has improved but it is still facing speed limits which are disrupting its battlefield \"missions\".",
  "siteName": "BBC News",
  "language": "en-GB",
  "image": "https://ichef.bbci.co.uk/ace/branded_news/1200/cpsprodpb/9f7e/live/76dbc1b0-c848-11f1-94ec-7f952cae1636.jpg",
  "tags": [],
  "section": "Europe",
  "canonicalUrl": "https://www.bbc.co.uk/news/articles/c8wy9veedgygo",
  "isArticle": true,
  "markdown": "**Elon Musk has suggested that the US government may be behind restrictions on the speed at which some of Ukraine's weapons can travel...**\n\nStarlink is a vital tool allowing Kyiv to guide drones...",
  "wordCount": 734,
  "statusCode": 200,
  "extractedAt": "2026-10-15T04:41:12.000Z"
}
```

- The body comes from Mozilla's Readability, the engine behind Firefox's reader view. Menus, ads, related links and images are removed; headings, lists, tables, quotes and links stay.
- Authors, dates, tags and the image come from the site's own data (schema.org, Open Graph and article tags). A field the site doesn't publish is empty or null.
- An article URL you gave that failed (a 404, not a web page, no article text, or disallowed by robots.txt) has `error` instead, and isn't charged.

The run's `SUMMARY` record counts articles saved and failed, and links skipped because they weren't articles, were older than your date, or robots.txt disallows them.

### Price

- $0.002 per article saved, so $2 per 1,000.
- Free: failed URLs, pages that aren't articles, articles older than your date filter, and pages robots.txt disallows.
- You can set a maximum charge for a run. It stops when it's reached and keeps what it already saved.

### Good to know

- **Finding articles.** From a start page it takes the links that look like articles (a date or a headline in the address), with the site's RSS or Atom feed first, and keeps only pages that are articles. It reads the page you give, not the whole site.
- **Polite.** It reads each site's robots.txt and skips what it disallows, and asks one site for one page a second. Different sites run side by side.
- **It reads the HTML the site sends.** Most news sites and blogs work. A page that draws its text with JavaScript, or sits behind a paywall or login, gives an error or a short text.
- **Your use of the articles.** Articles belong to their publishers. Make sure you have the right to use what you extract, for example for your own reading, research or analysis, and check a site's terms before you republish anything.

### Use it from an AI agent

The Actor works through Apify's MCP server like any Store Actor. An agent can find it, read its input and call it. To read one article, pass it in `articleUrls`; that usually finishes within the MCP call's wait (up to 45 seconds). A bigger run takes longer, so the call returns the run's status and dataset ID, and the agent reads the rows with `get-dataset-items`.

### FAQ

**How do I get the latest articles from a news site or blog?** Put the home page, a section page or its RSS feed in Start URLs. It finds the newest articles itself, 20 by default.

**Can I get only new articles each day?** Yes. Set "Only newer than" to 24 hours and schedule the run.

**What do I get for each article?** Headline, authors, publish date, tags, lead image and the full text as clean Markdown.

**What if a page isn't an article?** It's skipped and costs nothing.

### More tools from us

- [AI Brand Mention Checker](https://apify.com/nebulacolors/ai-visibility): is your brand named by ChatGPT and Gemini, and who comes first.
- [Google Ads Transparency Scraper](https://apify.com/nebulacolors/google-ads-transparency): every Google, YouTube and Display ad a competitor runs.
- [Website to Markdown Crawler](https://apify.com/nebulacolors/website-content-markdown): a whole site as clean Markdown for LLMs and RAG.
- [Website Screenshot](https://apify.com/nebulacolors/website-screenshot): full page or mobile screenshots of any URL, PNG or JPEG.
- [Image Downloader](https://apify.com/nebulacolors/image-downloader): every image on a page, full size, in one ZIP.

### Questions or problems

Open an issue on this Actor's Issues tab. I read them.

# Actor input Schema

## `articleUrls` (type: `array`):

Articles to extract, one per line, like https://blog.cloudflare.com/yandex-outage/. Each one is extracted, whatever Max articles says.

## `startUrls` (type: `array`):

A site's home page, a section page or an RSS feed, like https://blog.cloudflare.com/. The newest articles linked from it are extracted, up to Max articles. Pages that aren't articles are skipped for free.

## `maxArticles` (type: `integer`):

The most articles to take from the start URLs. Each saved article is one charged event.

## `newerThan` (type: `string`):

Skip articles published before this: a date like 2026-10-01, or a span like 7 days, 24 hours or 2 weeks. Skipped articles aren't charged. Articles with no date are kept.

## `includeText` (type: `boolean`):

Off: the article comes as Markdown only. On: also as plain text in a text field.

## `proxyConfiguration` (type: `object`):

Off by default. Turn on Apify Proxy for a site that blocks cloud servers.

## Actor input object example

```json
{
  "articleUrls": [
    "https://blog.cloudflare.com/yandex-outage/"
  ],
  "maxArticles": 20,
  "includeText": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `articles` (type: `string`):

All article rows as JSON: url, title, authors, publishedAt, description, siteName, image, tags, markdown and wordCount. A failed URL has an error and no markdown.

## `summary` (type: `string`):

Articles saved and failed, links skipped because they weren't articles, were too old or robots.txt disallows them, and why the run stopped.

# 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 = {
    "articleUrls": [
        "https://blog.cloudflare.com/yandex-outage/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("nebulacolors/article-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 = { "articleUrls": ["https://blog.cloudflare.com/yandex-outage/"] }

# Run the Actor and wait for it to finish
run = client.actor("nebulacolors/article-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 '{
  "articleUrls": [
    "https://blog.cloudflare.com/yandex-outage/"
  ]
}' |
apify call nebulacolors/article-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nebulacolors/article-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/rfVqeuWRcF9ECxyRy/builds/iPBXf0P9i60KcbWJA/openapi.json
