# Twitter Article Scraper – X Text, Authors & Media (`scrapingmonkey/twitter-article-details-scraper`) Actor

Extract public X Articles from post URLs. Get titles, available text, authors, publication dates, images, content blocks and entities in one Article row.

- **URL**: https://apify.com/scrapingmonkey/twitter-article-details-scraper.md
- **Developed by:** [ScrapingMonkey](https://apify.com/scrapingmonkey) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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

Extract public X Articles from the posts that contain them. **Twitter Article Scraper** collects the title, preview, available full text, author, publication dates, cover image and article content details in one row per Article.

Use it to build a source-linked reading library, review long-form publishing or retain article structure alongside readable text.

| At a glance | Details |
|---|---|
| 📥 Input | Full X or Twitter post URLs that contain an X Article |
| 📤 Output | Title, text, author, dates, images, content blocks and entities |
| 🔐 Login required | No Twitter (X) credentials or cookies |
| ⚡ Processing | Up to 5 requests concurrently with automatic retries |
| 💾 Delivery | One Article row in one table, with matching JSON fields |

### What the Twitter (X) Article scraper extracts 🔎

The Actor reads the Article attached to a known post. It keeps both reader-facing content and available formatting or reference details.

- Article ID, containing post ID, canonical post URL and Article type
- Title, preview text and available plain text
- Author identity, bio, public counts, account flags and links
- Creation, first-publication and modification dates with timestamps
- Cover image and article media with dimensions and alt text
- Content blocks, inline-formatting ranges and referenced entities when exposed

### How to scrape Twitter (X) Articles 🚀

1. Copy the full X or Twitter post URL containing the Article.
2. Add it to `inputList`, with other Article post links if needed.
3. Start the Actor and review the result status.
4. Export readable text and the accompanying article details.

```json
{
  "inputList": [
    "https://x.com/i/status/2066523671456579828"
  ]
}
```

Repeated valid links that resolve to the same ID are normally processed once per run.

### Twitter (X) Article data fields and complete output 📦

| Field group | Included data |
|---|---|
| Article identity | Article ID, containing post ID, source URL and type |
| Content | Title, preview and available plain text |
| Author | Public profile identity, links, counts and account flags |
| Publication and media | Dates, timestamps, cover image and media details |
| Structure and references | Content-block and entity path/value columns |

Complete illustrative success item with fictional content, not a live result:

```json
{
  "input": "https://x.com/northstar_lab/status/2088355206723477000",
  "status": "success",
  "id": "2088355206723477100",
  "post_id": "2088355206723477000",
  "url": "https://x.com/northstar_lab/status/2088355206723477000",
  "type": "article",
  "title": "Planning a field research season",
  "preview_text": "A practical starting point for organizing field observations.",
  "plain_text": "Start with a clear question\n\nUse the field guide to plan sampling days and keep a record of each observation.",
  "author.id": "100100100",
  "author.username": "northstar_lab",
  "author.name": "Northstar Lab",
  "author.profile_url": "https://x.com/northstar_lab",
  "author.description": "Research, field notes and conversations about science.",
  "author.location": "Singapore",
  "author.created_at": "2021-01-15T09:00:00Z",
  "author.created_timestamp": 1610701200,
  "author.followers_count": 4200,
  "author.following_count": 180,
  "author.posts_count": 640,
  "author.media_posts_count": 86,
  "author.likes_given_count": 320,
  "author.highlights_count": 8,
  "author.avatar_url": "https://example.com/northstar_lab_normal.jpg",
  "author.avatar_url_hd": "https://example.com/northstar_lab_400x400.jpg",
  "author.banner_url": "https://example.com/lab-banner.jpg",
  "author.website.url": "https://t.co/LabSite",
  "author.website.expanded_url": "https://example.com/lab",
  "author.bio_links.url": ["https://t.co/LabSite"],
  "author.bio_links.expanded_url": ["https://example.com/lab"],
  "author.bio_links.display_url": ["example.com/lab"],
  "author.is_verified": false,
  "author.verified_type": "",
  "author.is_blue_verified": false,
  "author.is_identity_verified": false,
  "author.verification_description": "",
  "author.verified_since_at": "",
  "author.is_protected": false,
  "author.possibly_sensitive": false,
  "author.professional_type": "Business",
  "author.affiliates_count": 0,
  "author.creator_subscriptions_count": 0,
  "author.can_highlight_posts": true,
  "author.can_receive_messages": false,
  "author.can_be_media_tagged": false,
  "author.description_language": "en",
  "author.profile_image_shape": "Circle",
  "author.pinned_post_ids": ["2088355206723477000"],
  "author.birthdate.day": 0,
  "author.birthdate.month": 0,
  "author.birthdate.year": 0,
  "author.birthdate.visibility": "",
  "author.birthdate.year_visibility": "",
  "created_at": "2026-09-01T09:00:00Z",
  "created_at_timestamp": 1788253200,
  "first_published_at": "2026-09-01T10:00:00Z",
  "first_published_at_timestamp": 1788256800,
  "modified_at": "2026-09-01T11:00:00Z",
  "modified_at_timestamp": 1788260400,
  "cover_media.id": "200100100",
  "cover_media.type": "ApiImage",
  "cover_media.url": "https://example.com/field-season-cover.jpg",
  "cover_media.width": 1600,
  "cover_media.height": 900,
  "cover_media.alt_text": "A notebook and sampling tools ready for fieldwork",
  "media.id": ["200100200"],
  "media.type": ["ApiImage"],
  "media.url": ["https://example.com/sampling-plan.jpg"],
  "media.width": [1200],
  "media.height": [800],
  "media.alt_text": ["A weekly sampling plan"],
  "content_blocks.path": ["/0/key", "/0/type", "/0/text", "/0/data", "/0/inline_style_ranges", "/0/entity_ranges", "/1/key", "/1/type", "/1/text", "/1/data", "/1/inline_style_ranges", "/1/entity_ranges/0/offset", "/1/entity_ranges/0/length", "/1/entity_ranges/0/key"],
  "content_blocks.value": ["intro", "header-two", "Start with a clear question", null, null, null, "body", "unstyled", "Use the field guide to plan sampling days and keep a record of each observation.", null, null, 8, 11, 0],
  "entities.path": ["/0/key", "/0/type", "/0/data/url"],
  "entities.value": ["0", "LINK", "https://example.com/field-guide"]
}
```

The table and JSON use literal names such as `author.name` and `cover_media.url`. Article media fields align by position in their lists.

`content_blocks.path` pairs with `content_blocks.value`, and `entities.path` pairs with `entities.value`. Each path locates a value in the article structure, such as `/1/text` for the second block's text. Matching positions belong together; an empty structural item is represented by null. These columns keep the available formatting and references in the same Article row.

Successful rows can contain empty strings, zero counts, false flags, empty lists or null optional branches when a value is unavailable. A failed row retains `input`, sets `status` to `failed` and leaves the entity data fields null.

### Input requirements and coverage ⚙️

| Parameter | Type | Required | Default and rules |
|---|---|---|---|
| `inputList` | array of strings | Yes | No default; at least one item. No fixed input-count maximum. |

Submit full HTTP or HTTPS post links on `x.com` or `twitter.com`, including standard `/username/status/ID` and `/i/status/ID` forms. Bare post IDs and profile URLs are not accepted. An ordinary post without an attached X Article produces a failed row.

The Actor requires an Article ID and title for success. Available plain text, media and formatting details can still be incomplete. It does not discover Articles by keyword, scrape a publication feed or return post engagement and replies.

### Twitter (X) Article data use cases 🎯

#### Long-form content research

Collect titles, text, dates and author context from a selected set of X Articles.

#### Reading-library records

Index article text with the containing post URL so readers can return to its source.

#### Publishing reviews

Compare themes, article lengths and publication timing in content you manage or have permission to analyze.

#### Formatting and reference analysis

Inspect available blocks, inline ranges and entities when you need more context than plain text alone.

### Pricing and billable articles 💰

Check the Actor's **Pricing** tab for the current charging model and rate. The Store configuration is authoritative.

Under dataset-item pricing, each saved success or failed row can count as a billable item. Automatic retries do not independently add result rows.

One processed Article link creates one result row. Images, blocks, entities and author details are part of that row.

### Twitter (X) Article API and integrations 🔌

Replace `$ACTOR_ID` with the ID shown in the Actor API tab and `$APIFY_TOKEN` with your Apify token.

```bash
curl -X POST "https://api.apify.com/v2/acts/$ACTOR_ID/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"inputList":["https://x.com/i/status/2066523671456579828"]}'
```

Start runs through REST, Apify client libraries or schedules. Use webhooks to handle completion, then export the dataset as JSON, CSV or Excel, or send it to Google Sheets, Make, Zapier and your reporting tools.

### Reliability and limits ⚠️

Temporary request failures and selected access errors are retried automatically. Missing posts, posts without an Article, or responses without a usable Article ID and title produce failed rows.

A successful Article may still have empty plain text or optional media because those fields are not always supplied. Content blocks preserve available structure; the Actor does not render an HTML document or download media. Dates describe the Article rather than necessarily matching the publication time of its containing post.

### Frequently asked questions ❓

#### Can I submit an ordinary post?

The URL format is accepted, but a post without an attached X Article produces a failed row. Use Post Details Scraper for regular posts.

#### Why is there both an Article ID and a post ID?

The Article is attached to a post. The fields identify those two related records, while the URL points to the containing post.

#### Does it return HTML?

No rendered HTML document is generated. It returns available plain text and article content or entity fields.

#### Can a successful row have empty article text?

Yes. An Article ID and title are required for success, but X may omit its plain text or other optional content.

#### Does it collect Article replies or engagement?

No. Use Post Details Scraper for available post-level engagement metadata; this Actor focuses on the Article content.

### Support, responsible use, and related actors 🛟

For a reproducible issue, contact support with the run ID, approximate time and a safe public input. Keep credentials and private data out of support messages.

Use public data in line with applicable privacy, copyright and platform requirements.

# Actor input Schema

## `inputList` (type: `array`):

Add one full X Article post URL per item. Raw post IDs and ordinary non-Article posts are not accepted as successful results.

## Actor input object example

```json
{
  "inputList": [
    "https://x.com/i/status/2066523671456579828"
  ]
}
```

# Actor output Schema

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

Dataset rows with success or failed status.

# 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 = {
    "inputList": [
        "https://x.com/i/status/2066523671456579828"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapingmonkey/twitter-article-details-scraper").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 = { "inputList": ["https://x.com/i/status/2066523671456579828"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapingmonkey/twitter-article-details-scraper").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 '{
  "inputList": [
    "https://x.com/i/status/2066523671456579828"
  ]
}' |
apify call scrapingmonkey/twitter-article-details-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapingmonkey/twitter-article-details-scraper"
        }
    }
}

```

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/chWNgehFPM5C3lN7c/builds/OCiREXPGwP61UQ2aJ/openapi.json
