# X (Twitter) Video Downloader & Tweet Scraper (`hipersoft/twitter-downloader`) Actor

Paste X / Twitter post URLs and get each tweet's full data plus downloadable video (MP4) and image URLs. Text, photos, videos and GIFs supported — author, caption, likes, retweets, replies, views, hashtags and media links, one row per URL as JSON, CSV or Excel. For creators, research and n8n.

- **URL**: https://apify.com/hipersoft/twitter-downloader.md
- **Developed by:** [hiper soft](https://apify.com/hipersoft) (community)
- **Categories:** Social media, Videos
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.0025 / tweet extracted

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

## X (Twitter) Video Downloader & Tweet Scraper — MP4, Images + Full Tweet Data

Paste one or more X (formerly Twitter) post links and get the tweet's full data back plus direct, downloadable **video (MP4)** and **image** URLs — one clean row per URL. Grab the caption, author, upload date, language, hashtags and every engagement number (likes, retweets, replies, quotes, bookmarks, views), together with ready-to-save media links for videos, GIFs and photos. Export as JSON, CSV or Excel, or pull straight into Make, n8n or your own pipeline.

This is the cheap, no-nonsense way to download X / Twitter videos and images at scale and extract tweet data in bulk — for content creators, marketers, journalists, researchers and anyone building an automated media workflow.

### Why use this X (Twitter) downloader

- 🎬 **Download tweet videos** — every video and GIF post returns a direct MP4 link you can save, with no login.
- 🖼️ **Save tweet images** — photo posts return every full-resolution image URL in the tweet.
- 📊 **Full tweet data** — caption, author handle and name, follower count, upload date, language, hashtags and the complete engagement set: likes, retweets, replies, quotes, bookmarks and views.
- 🔗 **Any tweet link works** — `x.com/user/status/123…`, `twitter.com/user/status/123…`, `/i/status/123…`, links with query strings, or a bare tweet ID.
- 📦 **Bulk in one run** — drop in a whole list of URLs and get one tidy record per post.
- 💸 **Cheapest per-tweet pricing** — pay only for the posts you actually extract, with volume discounts as you scale.
- 📤 **Export anywhere** — JSON, CSV or Excel, or feed the dataset straight into Make, n8n or your own tools.

### What you get

Each tweet is one dataset record like this:

```json
{
  "source": "twitter",
  "inputUrl": "https://x.com/NASA/status/1491475671058681863",
  "id": "1491475671058681863",
  "url": "https://x.com/NASA/status/1491475671058681863",
  "text": "A closer look at Venus… #VisionsOfVenus",
  "authorName": "NASA",
  "authorScreenName": "NASA",
  "authorFollowers": 92388789,
  "authorAvatar": "https://pbs.twimg.com/profile_images/.../avatar.jpg",
  "createdAt": "2022-02-09T18:14:44.000Z",
  "lang": "en",
  "replyCount": 213,
  "retweetCount": 640,
  "likeCount": 3358,
  "quoteCount": 44,
  "bookmarkCount": 129,
  "viewCount": 0,
  "hashtags": ["VisionsOfVenus"],
  "mediaType": "video",
  "videoUrls": ["https://video.twimg.com/.../1280x720/video.mp4"],
  "imageUrls": [],
  "thumbnailUrl": "https://pbs.twimg.com/.../thumb.jpg",
  "mediaCount": 1
}
```

### Input

Give the downloader a list of X / Twitter post URLs. That's it.

```json
{
  "postUrls": [
    "https://x.com/NASA/status/1491475671058681863",
    "https://x.com/jack/status/20"
  ],
  "maxItems": 0
}
```

| Field | Description |
| --- | --- |
| `postUrls` | One or more X / Twitter post (status) URLs (required). `x.com` and `twitter.com` links, `/i/status/…` links, URLs with query strings and bare numeric tweet IDs all work. Plain strings or `{ "url": "..." }` objects. |
| `maxItems` | Maximum number of tweets to extract (0 = no limit; process every URL). |
| `proxyConfiguration` | Optional. Not needed for normal use — leave it off. |

### Output fields

| Field | Description |
| --- | --- |
| `id` | Tweet ID. |
| `url` | Canonical tweet URL. |
| `text` | Tweet text / caption. |
| `authorName` / `authorScreenName` | Author display name and @handle. |
| `authorFollowers` | Author follower count. |
| `authorAvatar` | Author avatar image URL. |
| `createdAt` | Post time (ISO 8601). |
| `lang` | Detected tweet language. |
| `replyCount` / `retweetCount` / `likeCount` / `quoteCount` / `bookmarkCount` / `viewCount` | Engagement stats. |
| `hashtags` | Array of hashtags used in the tweet. |
| `mediaType` | `video`, `photo`, `gif` or `text`. |
| `videoUrls` | Array of direct MP4 download links (video and GIF posts). |
| `imageUrls` | Array of full-resolution image URLs (photo posts). |
| `thumbnailUrl` | Preview / cover image for the post's media. |
| `mediaCount` | Number of media items attached to the tweet. |

### Use cases

- **Save tweet videos** — grab MP4 links from X / Twitter video and GIF posts for reposting, editing or archiving.
- **Download tweet images** — pull every image from photo posts in one run.
- **Content research** — collect captions, hashtags and engagement stats across a batch of tweets to study what performs.
- **Media monitoring & journalism** — archive the media and public data behind posts you're tracking, one row per URL.
- **Automation** — feed a list of URLs from a spreadsheet, Make or n8n and get structured records back with direct download links.

### FAQ

**Can I download the video from a tweet?** Yes — for video and GIF posts, `videoUrls` contains a direct MP4 link you can save.

**Does it get the images too?** Yes. Photo posts return every full-resolution image URL in `imageUrls`.

**Can I extract many tweets at once?** Yes. Put as many URLs as you like in `postUrls` and you get one record per post.

**What link formats are accepted?** `x.com` and `twitter.com` status links, `/i/status/…` links, URLs with query strings and bare numeric tweet IDs all work.

**Do I get the tweet's stats and text, not just media?** Yes — every record includes the text, author, hashtags and the full engagement set (likes, retweets, replies, quotes, bookmarks, views).

**Do I need a proxy?** No. Proxy is optional and off by default.

**How much does it cost?** Pay-per-event: a tiny charge per run plus a small charge per tweet extracted, with tier discounts as your volume grows. See the **Pricing** tab for current rates.

### Notes

This tool retrieves media and public data for X / Twitter posts whose URLs you provide. It is an independent tool and is not affiliated with, endorsed by or connected to X Corp. or Twitter; all names and trademarks belong to their respective owners. Only download content you own or have the right to use, and respect X's terms and applicable copyright law. Public content only.

# Actor input Schema

## `postUrls` (type: `array`):

One or more X / Twitter post (status) URLs to extract. Accepts any form: https://x.com/user/status/123..., https://twitter.com/user/status/123..., /i/status/123..., links with query strings, or a bare numeric tweet ID. You can paste plain strings or {"url": "..."} objects.

## `maxItems` (type: `integer`):

Maximum number of tweets to extract (0 = no limit; process every URL you provide).

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

Optional proxy. Not required — leave off to run on a direct connection. Enable only if you specifically want requests routed through a proxy.

## Actor input object example

```json
{
  "postUrls": [
    "https://x.com/NASA/status/1491475671058681863",
    "https://x.com/jack/status/20"
  ],
  "maxItems": 0,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

The results as dataset items.

# 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 = {
    "postUrls": [
        "https://x.com/NASA/status/1491475671058681863",
        "https://x.com/jack/status/20"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("hipersoft/twitter-downloader").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 = {
    "postUrls": [
        "https://x.com/NASA/status/1491475671058681863",
        "https://x.com/jack/status/20",
    ],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("hipersoft/twitter-downloader").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 '{
  "postUrls": [
    "https://x.com/NASA/status/1491475671058681863",
    "https://x.com/jack/status/20"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call hipersoft/twitter-downloader --silent --output-dataset

```

## MCP server setup

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

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/CKgbjKvFV5Bud58QQ/builds/OzeQ3H3WcCTxF7dtn/openapi.json
