# Article Extractor: News & Blog Text, Author, Date to JSON (`precious_bathmat/article-extractor`) Actor

Extract clean article text and Markdown, title, authors, publish date, publisher, section, tags and image from any news or blog article. Give it a news site or section and it finds the newest articles through the RSS feed. No browser, no API key.

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

## Pricing

$1.00 / 1,000 articles

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

## Article Extractor: News & Blog Text, Author, Date to JSON

Turn any **news or blog article** into clean structured data: **title, authors, publish and update date, publisher, section, tags, main image, word count, reading time, paywall flag**, and the **article text as plain text and Markdown**, without menus, ads, related links or cookie banners.

Give it a **news site or a section** instead of an article and it finds the **newest articles** itself, through the site's RSS feed when it has one.

- **Articles in, JSON out**: one row per article with every field a news reader, a media monitor or an AI pipeline needs
- **Sites and sections in, newest articles out**: `https://techcrunch.com` or `https://www.bbc.com/news/technology`
- **Dates and authors from the site's own structured data**, then its meta tags, then the address
- **Markdown** with headings, lists, links and tables, ready for ChatGPT, Claude or a vector database
- **Daily monitoring**: keep only articles from the last day or week
- **No browser, no API key**

### What does this article extractor do?

```
https://techcrunch.com
 → feed found, 15 newest articles
 "Google brings agentic AI to Gemini, starting with businesses"
 Sarah Perez · TechCrunch · AI · 8 Oct 2026 · 605 words · tags: gemini, Google
```

1. Paste **article addresses**, or **home and section pages** of news sites and blogs.
2. Articles are extracted directly. Home and section pages are expanded into their newest articles: through the **RSS or Atom feed** when the site has one, otherwise through the **article links** on the page.
3. You get **one row per article** and a CSV of the metadata.

```mermaid
flowchart LR
    A[Article addresses] --> D[Extract text,<br/>author, date, tags]
    B[News sites<br/>and sections] --> C[RSS feed or<br/>article links]
    C --> D
    D --> E[One row per article<br/>text + Markdown]
```

### Who is it for?

- **Media monitoring and PR**: follow what tech, business or local news sites publish every day
- **AI and RAG pipelines**: clean article text and Markdown for summarising, classifying or embedding
- **Researchers and analysts** building news datasets with reliable dates and authors
- **Newsletter and content curators** collecting the day's stories from many sources at once
- **SEO and content teams** studying competitors' articles: length, sections, tags and publishing pace

### What data do you get?

**Articles** (dataset, one row per article)

| Field | What it tells you |
|---|---|
| `title`, `description`, `url`, `canonicalUrl`, `image` | The article |
| `authors`, `publisher` | Who wrote and published it |
| `publishedAt`, `modifiedAt` | When, as ISO dates |
| `section`, `tags`, `articleType` | The site's own section and tags; NewsArticle, BlogPosting, ... |
| `text`, `markdown` | The article body, without page furniture |
| `wordCount`, `readingTimeMinutes`, `language` | Length and language |
| `isPaywalled`, `linksInText` | Paywall flag; how many links the text has |
| `foundVia`, `sourcePage` | Listed by you, found in a feed, or found as a link |

`ARTICLES_CSV` has the metadata of every article as flat columns. `RUN_SUMMARY` lists which feed each site used and why any page was skipped.

### Example: 9 October 2026

**14 inputs, 127 articles in 5 minutes 56 seconds**: 12 news sites and sections, one essay and one single article.

| Source | Found through | Articles |
|---|---|---|
| techcrunch.com | RSS feed | 15 |
| arstechnica.com | RSS feed | 15 |
| wired.com | RSS feed | 15 |
| blog.cloudflare.com | RSS feed | 15 |
| cnbc.com/technology | article links | 15 |
| theguardian.com/technology | article links | 15 |
| spiegel.de/netzwelt | article links | 15 |
| theverge.com | RSS feed | 10 |
| bbc.com/news/technology | article links | 6 |
| openai.com/news | article links | 5 |
| paulgraham.com essay | listed | 1 |

- **120 of 127** articles came with a publish date and **106** with named authors (the rest are signed by the publication or by nobody). 15 are marked as paywalled (The Verge and Wired show a part to visitors).
- **Skipped, not charged**: Reuters (HTTP 401), Le Monde (HTTP 402) and The New York Times (HTTP 403) refuse automated visitors; 8 links on section pages were videos, series, topic or help pages; 1 Wired story had only 67 public words behind its paywall.

### Pricing

**$0.001 per article.** Pages that are not articles, paywalled stubs and pages that cannot be opened are free.

- 1,000 articles: **$1**
- The run above: 127 articles, **$0.13**

### Good to know

- **Paywalls**: articles are read as a logged-out visitor sees them. Sites that show the full text to search engines through structured data give the full text; others give what is public, flagged with `isPaywalled`.
- **Sites that refuse automated visitors** (some large newspapers) are listed in `RUN_SUMMARY` with the reason.
- **Sections without a feed** are read through the article links on the page; galleries, videos and series pages are recognised and skipped.
- **Daily schedule**: set **Only articles from the last (days)** to 1 and schedule the run every morning.
- **Personal data**: only the public byline of each article. Commenters are never collected.
- No login, no API key, no proxies needed.

### Input

| Field | Meaning |
|---|---|
| **Articles or news sites** | Article addresses, or home and section pages, one per line |
| **Maximum articles per site or section** | 1 to 1,000 (default 20) |
| **Only articles from the last (days)** | 0 = any date |
| **Plain text**, **Markdown** | Both on by default |
| **Images in Markdown** | Off by default |
| **Minimum words** | 80 by default; shorter pages are skipped |
| **Articles at once** | 1 to 20 (default 5) |

### Integrations

Export to JSON, CSV, Excel or Google Sheets, or connect through the Apify API, webhooks, Make, Zapier and n8n. Send the Markdown to an LLM for summaries, or to Pinecone, Qdrant or Weaviate for search.

# Actor input Schema

## `urls` (type: `array`):

One per line. An article address is extracted as it is. A home or section page (https://techcrunch.com, https://www.bbc.com/news/technology) is expanded into its newest articles, through its RSS feed when it has one.

## `maxArticlesPerSite` (type: `integer`):

For home and section pages: how many of the newest articles to extract. Article addresses you list are always extracted.

## `onlyNewerThanDays` (type: `integer`):

0 = any date. 1 keeps today's and yesterday's articles; handy for a daily schedule.

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

The article body as plain text, paragraphs separated by blank lines.

## `includeMarkdown` (type: `boolean`):

The article body as Markdown with headings, lists, links and tables, ready for AI tools.

## `keepImages` (type: `boolean`):

Keep the article's images in the Markdown as ![alt](address).

## `minWords` (type: `integer`):

Pages with less text than this are skipped as not being articles (galleries, videos, paywalled stubs).

## `concurrency` (type: `integer`):

How many articles are read in parallel.

## Actor input object example

```json
{
  "urls": [
    "https://techcrunch.com",
    "https://arstechnica.com",
    "https://www.paulgraham.com/greatwork.html"
  ],
  "maxArticlesPerSite": 20,
  "onlyNewerThanDays": 0,
  "includeText": true,
  "includeMarkdown": true,
  "keepImages": false,
  "minWords": 80,
  "concurrency": 5
}
```

# Actor output Schema

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

Title, authors, date, publisher, section, tags, image, text and Markdown.

## `csv` (type: `string`):

Metadata of every article, without the text.

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

Where articles were found and why some pages were skipped.

# 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 = {
    "urls": [
        "https://techcrunch.com",
        "https://arstechnica.com",
        "https://www.paulgraham.com/greatwork.html"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("precious_bathmat/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 = { "urls": [
        "https://techcrunch.com",
        "https://arstechnica.com",
        "https://www.paulgraham.com/greatwork.html",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("precious_bathmat/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 '{
  "urls": [
    "https://techcrunch.com",
    "https://arstechnica.com",
    "https://www.paulgraham.com/greatwork.html"
  ]
}' |
apify call precious_bathmat/article-extractor --silent --output-dataset

```

## MCP server setup

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