# News Article Extractor (`mina_safwat/news-article-extractor`) Actor

Extracts clean article text, headline, authors, publish date, and images from any news site — or discovers the articles itself from a homepage

- **URL**: https://apify.com/mina\_safwat/news-article-extractor.md
- **Developed by:** [Mina](https://apify.com/mina_safwat) (community)
- **Categories:** News, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

Turn any **news article URL into clean structured data** — headline, full text, authors, publish date, and images, with the ads, navigation, and cookie banners stripped out. Point it at a news site and it finds the articles for you.

### What does News Article Extractor do?

Give it article links, or give it a news site and let it discover the articles itself. For each article you get the headline, the full body text with boilerplate removed, the authors, the publication date, the lead image, and the page's own metadata — description, keywords, tags, language, and canonical URL.

It works on any news site rather than a fixed list, so you are not limited to a set of supported publishers.

### Why use News Article Extractor?

- **Media monitoring** — track coverage of a brand, person, or topic across many outlets.
- **AI and RAG pipelines** — clean article text is far better training and retrieval input than raw HTML.
- **Content research** — study how competitors cover a subject, and how often.
- **Archiving** — keep a durable, readable copy of reporting that may change or disappear.
- **Newsletters and aggregation** — pull the day's stories from a set of sources on a schedule.

Running it on Apify adds scheduling, an API, integrations (Sheets, Slack, Zapier, S3), residential proxy rotation, and run monitoring.

### How to use News Article Extractor

1. Paste article links into **Article URLs**, or news site homepages into **News sites** — or both.
2. Set **Max articles**.
3. Click **Start**.

Results appear in the Output tab as they are extracted, and download as JSON, CSV, Excel, or XML.

### Input

| Field | Description |
| --- | --- |
| `article_urls` | Direct links to articles, one per line. |
| `site_urls` | Homepage or section URLs. The Actor finds article links on each page and extracts them. |
| `max_articles` | Total cap across every site and URL given. |
| `language` | Two-letter hint such as `en` or `ar`. Leave empty to detect it — set it only when detection gets a site wrong. |
| `include_article_html` | Also return the cleaned HTML of the article body, keeping links and formatting. |
| `max_concurrency` | How many pages to fetch at once. Lower it if a publisher rate-limits you. |
| `proxy_country` | Comma-separated country codes for the residential proxy rotation. |

### Output

```json
{
  "url": "https://techcrunch.com/2026/08/20/example-story/",
  "canonical_url": "https://techcrunch.com/2026/08/20/example-story/",
  "title": "Apollo Atomics wants to make nuclear power cheap",
  "text": "A nuclear start-up has raised forty million dollars...",
  "word_count": 498,
  "authors": ["Jane Roe"],
  "published_at": "2026-08-20T10:30:00+00:00",
  "language": "en",
  "site_name": "TechCrunch",
  "description": "The company plans to complete regulatory review this year.",
  "keywords": ["nuclear", "energy"],
  "tags": ["energy"],
  "top_image": "https://techcrunch.com/wp-content/uploads/lead.jpg",
  "images": ["https://techcrunch.com/wp-content/uploads/inline.jpg"],
  "videos": []
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

#### Data fields

| Field | Description |
| --- | --- |
| `url`, `canonical_url` | The link scraped, and the publisher's own canonical version of it. |
| `title`, `text`, `word_count` | Headline and clean body text. |
| `authors`, `published_at` | Byline and publication date, as an ISO timestamp where the page declares one. |
| `language`, `site_name` | Detected language and the publication's name. |
| `description`, `keywords`, `tags` | The page's own metadata. |
| `top_image`, `images`, `videos` | Lead image, other images in the article, and embedded video URLs. |
| `article_html` | Cleaned HTML of the body, when you ask for it. |
| `error` | Present only when a page could not be read, with the reason. |

### How much does it cost to extract articles?

Cost tracks the number of articles you extract, so **Max articles** is the main lever on what a run costs.

### Tips

- **Section pages beat homepages.** Pointing at `example.com/technology/` gives more focused results than the homepage.
- **Lower the concurrency** to 1 or 2 if a publisher starts refusing you. Five works well across mixed sources.
- **Schedule it** against the same sites daily and the dataset becomes a rolling archive.
- **Check the `error` field.** Rows that could not be read are still written, so nothing disappears silently.

### FAQ and support

**Which news sites does it support?** Any of them. There is no supported-site list to check against.

**Why did an article come back with no text?** Some articles are behind a paywall, and a few sites load their text in a way that cannot be read. Those rows come back with an `error` explaining why, rather than disappearing, so you can see exactly which links need another approach.

**Why is the publish date sometimes empty?** Not every publisher declares one in a machine-readable way. When it is missing from the page, it is missing from the output — the Actor does not guess.

**Is scraping news articles legal?** Article text is usually copyrighted. Extracting it for analysis, monitoring, or internal research is common practice, but republishing it is a different matter. You are responsible for how you use the output, including copyright and each publisher's terms. Consult a lawyer if you are unsure.

Found a bug or want a field that is missing? Open an issue on the Actor's Issues tab.

# Actor input Schema

## `article_urls` (type: `array`):

Direct links to articles you want extracted, one per line.

## `site_urls` (type: `array`):

Homepage or section URLs. The Actor finds the article links on each page and extracts them. Combine with Article URLs or use either on its own.

## `max_articles` (type: `integer`):

Stops after this many articles in total, across every site and URL given.

## `language` (type: `string`):

Two-letter code such as "en", "de", "ar". Leave empty to detect it from the page — only set it when detection gets a site wrong.

## `include_article_html` (type: `boolean`):

Add the cleaned HTML of the article body alongside the plain text. Useful when you need to keep links and formatting.

## `max_concurrency` (type: `integer`):

Higher is faster but more likely to be rate-limited by a publisher. Drop to 1–2 if you see failures.

## `proxy_country` (type: `string`):

Comma-separated 2-letter codes, rotated across retries. Residential proxies are recommended — many publishers block datacentre IPs.

## Actor input object example

```json
{
  "article_urls": [],
  "site_urls": [
    "https://techcrunch.com/"
  ],
  "max_articles": 50,
  "include_article_html": false,
  "max_concurrency": 5,
  "proxy_country": "US,GB,DE,NL,FR"
}
```

# Actor output Schema

## `dataset` (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 = {
    "site_urls": [
        "https://techcrunch.com/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("mina_safwat/news-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 = { "site_urls": ["https://techcrunch.com/"] }

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

```

## MCP server setup

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