# Article Extractor - News & Blog Text, Author, Date, Image (`actor-forge/article-extractor`) Actor

Extract news and blog articles from URLs or a site's home/section page: headline, authors, published and modified dates, lead image, language, site, section, tags, word count, paywall flag, clean text and Markdown. No browser, robots.txt respected. $0.40 per 1,000 articles.

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

## Pricing

from $0.40 / 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

## Article Extractor - News & Blog Text, Author, Date, Image

Extract news and blog articles from URLs or a site's home/section page: headline, authors, published and modified dates, lead image, language, site, section, tags, word count, paywall flag, clean text and Markdown. No browser, robots.txt respected. $0.40 per 1,000 articles.

**Turn news and blog article URLs into clean, structured data.** Give it article links, or just a site's **home or section page** (it finds the articles linked from it), and get one row per article with the **headline, authors, published and modified dates (ISO 8601), lead image, description, language, site name, section, tags, word count, reading time, a paywall flag, and the full body as clean text and Markdown** with ads, navigation, cookie banners and related-story boxes removed. Metadata comes from the page's own **JSON-LD (NewsArticle, BlogPosting, Article)**, Open Graph and article meta tags, with the reader-view body from **Mozilla Readability** (the engine behind Firefox Reader View). Use it for **news monitoring and media intelligence, content research, SEO and competitor content audits, building LLM / RAG datasets from articles, archiving, and feeding AI agents** clean article text. It works with WordPress, Ghost, Substack, Medium-style blogs and most news sites that serve HTML. It runs with limited permissions and pay-per-event pricing, so it suits automations and AI agents: **$0.40 per 1,000 articles**; section pages, failed pages and non-articles are free.

### What data does it return?

Every run outputs clean, schema-validated rows like these:

| url | title | authors | publishedAt | siteName | wordCount | isPaywalled |
| --- | --- | --- | --- | --- | --- | --- |
| https://blog.apify.com/introducing-x402-agentic-payments/ | Let your AI agent pay for 20,000+ Apify Actors with x402 | Štěpán Škopek | 2026-06-30T12:52:48.000Z | Apify Blog | 1752 | false |
| https://blog.apify.com/announcing-mcp-connectors/ | Announcing MCP connectors | Jan Čurn | 2026-06-09T10:49:17.000Z | Apify Blog | 1049 | false |

### How much does it cost?

Transparent pay-per-event pricing — you only pay for what you get, and the
actor **always respects your run budget**: set a maximum total charge and it
stops cleanly at the cap instead of overrunning.

| Event | Price | Charged | Worked example |
| --- | --- | --- | --- |
| `article-extracted` | $0.0004 | per article extracted (section pages, failed pages and non-articles are free) | 1,000 articles = $0.40 |
| `apify-actor-start` | $0.00005 | per run per GB of memory (platform start fee) | One run at 0.5 GB = $0.000025 |

### Input options

| Field | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `startUrls` | array | yes | — | Article URLs, and/or a site's home or section page (e.g. https://blog.example.com/ or https://news.example.com/world/): with 'Discover articles' on, the articles it links to on the same site are extracted. |
| `discoverArticles` | boolean | no | `true` | When a start URL is a home/section/listing page rather than an article, follow its same-site links that look like articles (one level deep). Off: only the given URLs are extracted. |
| `maxArticles` | integer | no | `100` | Stop after this many extracted (charged) articles. |
| `minWords` | integer | no | `120` | Pages with less reader-view text than this are not treated as articles (not charged). Lower it for short news briefs. |
| `includeText` | boolean | no | `true` | Add the article body as plain text (text). |
| `includeMarkdown` | boolean | no | `true` | Add the article body as Markdown with headings, lists, links and images (markdown), ready for LLMs and RAG. |
| `includeHtml` | boolean | no | `false` | Add the cleaned article HTML (html). |
| `respectRobotsTxt` | boolean | no | `true` | Skip pages the site's robots.txt disallows (free status row). Recommended. |

### Limits & honest notes

- No browser: pages are fetched as static HTML. Sites that build articles with JavaScript only get a free "needs-javascript" status row. Pages behind logins, CAPTCHAs or bot walls are not supported, and the actor does not try to get around them (no proxies, no browser fingerprints).
- Paywalled articles: only the text the site serves publicly is returned; isPaywalled is true when the page declares it (JSON-LD isAccessibleForFree: false) or shows paywall markup with a short body.
- Discovery follows one level of same-site links that look like articles (slugs with words, dated paths or numeric IDs); tag, category, author and utility pages are skipped. For full archives, give article URLs directly (for example from Sitemap Extractor or RSS Feed Reader).
- Authors are the public bylines the publisher puts on the article; no other personal data is collected.
- robots.txt is respected by default (RFC 9309), and requests identify themselves honestly as ActorForge-ArticleExtractor. Internal and private network addresses are refused at every redirect hop.
- Dates are converted to ISO 8601 UTC; date-only values stay YYYY-MM-DD. Duplicate articles (same canonical URL) are delivered once.
- Article text is copyrighted by its publishers: use the output for analysis, research, indexing and other lawful purposes, and respect each site's terms.

### Related ActorForge actors

- [News Search](https://apify.com/actor-forge/news-search) — find news article URLs by keyword worldwide
- [RSS Feed Reader](https://apify.com/actor-forge/rss-feed-reader) — new article URLs from any feed
- [Website to Markdown](https://apify.com/actor-forge/website-to-markdown) — whole sites as Markdown for LLMs

### Changelog

- **2026-10-23** — Initial release: article URLs or section pages → headline, authors, dates, lead image, language, site, section, tags, word count, paywall flag, text and Markdown.

***

*Built and maintained by **ActorForge**. Reliability first: every actor in the
portfolio is monitored by an automated nightly self-test, and breakages are
typically fixed the same day.*

# Actor input Schema

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

Article URLs, and/or a site's home or section page (e.g. https://blog.example.com/ or https://news.example.com/world/): with 'Discover articles' on, the articles it links to on the same site are extracted.

## `discoverArticles` (type: `boolean`):

When a start URL is a home/section/listing page rather than an article, follow its same-site links that look like articles (one level deep). Off: only the given URLs are extracted.

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

Stop after this many extracted (charged) articles.

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

Pages with less reader-view text than this are not treated as articles (not charged). Lower it for short news briefs.

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

Add the article body as plain text (text).

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

Add the article body as Markdown with headings, lists, links and images (markdown), ready for LLMs and RAG.

## `includeHtml` (type: `boolean`):

Add the cleaned article HTML (html).

## `respectRobotsTxt` (type: `boolean`):

Skip pages the site's robots.txt disallows (free status row). Recommended.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://blog.apify.com/"
    }
  ],
  "discoverArticles": true,
  "maxArticles": 2,
  "minWords": 120,
  "includeText": true,
  "includeMarkdown": true,
  "includeHtml": false,
  "respectRobotsTxt": true
}
```

# Actor output Schema

## `results` (type: `string`):

One row per article: title, authors, dates, lead image, language, site, section, tags, word count, paywall flag, text and Markdown. Free status rows explain pages that could not be extracted.

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

Articles delivered, section pages scanned, pages failed or skipped, why the run stopped and billing.

# 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 = {
    "startUrls": [
        {
            "url": "https://blog.apify.com/"
        }
    ],
    "maxArticles": 2
};

// Run the Actor and wait for it to finish
const run = await client.actor("actor-forge/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 = {
    "startUrls": [{ "url": "https://blog.apify.com/" }],
    "maxArticles": 2,
}

# Run the Actor and wait for it to finish
run = client.actor("actor-forge/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 '{
  "startUrls": [
    {
      "url": "https://blog.apify.com/"
    }
  ],
  "maxArticles": 2
}' |
apify call actor-forge/article-extractor --silent --output-dataset

```

## MCP server setup

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