# Threads Video Downloader (`maximedupre/threads-video-downloader`) Actor

Get direct source video links and available post details from public Threads post URLs. No login is needed for public posts.

- **URL**: https://apify.com/maximedupre/threads-video-downloader.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Videos, Social media, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.75 / 1,000 video links

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?

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

### 🎬 Download videos from public Threads posts

For creators, researchers, and developers who already have public Threads post URLs, this Actor gives you direct video links hosted by the source in a structured dataset. You can use these links in your own workflow. Each saved row includes the source post URL and any caption, author, post time, likes, comments, and video details that Threads provides. No Threads login is needed, and the Actor does not host or copy the media files.

- Download a public Threads video from its post URL with [**Threads Video Downloader**](https://apify.com/maximedupre/threads-video-downloader/examples/threads-video-downloader).
- Use a public Threads post URL on an Android device with [**How To Download Threads Videos On Android**](https://apify.com/maximedupre/threads-video-downloader/examples/how-to-download-threads-videos-on-android).
- Try a 4K download example from a public Threads post with [**Threads Video Download Without Watermark in 4K**](https://apify.com/maximedupre/threads-video-downloader/examples/threads-video-download-without-watermark-in-4k).
- Open the direct media address for a public post with [**Threads Download Link**](https://apify.com/maximedupre/threads-video-downloader/examples/threads-download-link).
- Use a public post URL for a no-watermark example with [**Threads Video Downloader Without Watermark**](https://apify.com/maximedupre/threads-video-downloader/examples/threads-video-downloader-without-watermark).

#### 📦 What each Threads video row contains

**Saved row**

Each row is the first saved match for a public Threads post with video available. It has the submitted post URL and one or more video entries. Other post and video details appear when Threads provides them.

Direct links are hosted by the source. They can expire or stop working when the source changes, so use important links soon after the run.

#### ▶️ Run the Threads video downloader

**Steps**

1. Paste one or more full public Threads post URLs into `postUrls`.
2. Start the Actor.
3. Open the `dataset` link or the overview view.
4. Use each `videos[].videoUrl` value in your own browser, downloader, or workflow.

To keep a run focused, submit only the post URLs you need. The Actor does not search Threads for posts. It does not handle private, login-gated, deleted, or otherwise unreachable posts. If the same post URL is submitted more than once, only its first saved match is kept and later repeats are ignored.

#### ⚙️ Input

**Input fields**

| Field | Type | What it does |
|---|---|---|
| `postUrls` | array of objects | Lists the public Threads post URL entries to process. |
| `postUrls[].url` | string (URL) | Gives one full public Threads post URL that contains video. |

The `postUrls` field is required and must contain at least one entry. The schema does not set a fixed maximum. Use full post URLs only. Profile, search, and private post links are not supported.

**Example input**

This is the public input from a successful beta run using the schema's default URL:

```json
{
  "postUrls": [
    {
      "url": "https://www.threads.com/@mariners/post/DKTSy7DN1eN"
    }
  ]
}
```

#### 🧾 Output

**Output link**

| Field | Type | What it does |
|---|---|---|
| `dataset` | string link | Opens the default dataset overview with the saved video rows. |

**Video result row**

| Field | Type | What it does |
|---|---|---|
| `postUrl` | string (URL) | Gives the public Threads post URL for this row. Required. |
| `postId` | string | Gives the stable Threads post identifier, when available. |
| `caption` | string | Gives the original post caption or text, when available. |
| `author` | object | Holds author details, when available. |
| `author.username` | string | Gives the author username shown by Threads. |
| `author.profileUrl` | string (URL) | Gives the public Threads profile URL for the author. |
| `publishedAt` | string (date-time) | Gives the original publication time, when available. |
| `likeCount` | integer | Gives the number of likes shown by the source, when available. |
| `commentCount` | integer | Gives the number of comments shown by the source, when available. |
| `videos` | array of objects | Lists the source video files found in the post. It contains at least one item. Required. |
| `videos.videoUrl` | string (URL) | Gives the direct source URL for downloading the video. Required for each video. |
| `videos.thumbnailUrl` | string (URL) | Gives the source thumbnail or preview image URL, when available. |
| `videos.mediaType` | string | Gives the source media type, when available. |
| `videos.fileExtension` | string | Gives the source file extension, when available. |
| `videos.quality` | string | Gives the source quality label, when available. |
| `videos.width` | integer | Gives the video width in pixels, when available. |
| `videos.height` | integer | Gives the video height in pixels, when available. |
| `videos.resolution` | string | Gives the source resolution label, when available. |
| `videos.duration` | number | Gives the video duration in seconds, when available. |

**Example video row**

This complete row comes from the newest successful run of the current beta build. Its source URLs and public values are shown as returned.

```json
{
  "postUrl": "https://www.threads.com/@mariners/post/DKTSy7DN1eN",
  "videos": [
    {
      "videoUrl": "https://scontent-sjc6-1.cdninstagram.com/o1/v/t2/f2/m367/AQPKA5XljwrS3qNUd9l5aXffcWE2BYTkn-927YrU7CYPV1Oi8ioGcSwYKLP4uv7QgGsqZLkb3pDfLnYgwmt73eFCg5F6Ic3-5ia7SR8.mp4?_nc_cat=104&_nc_sid=9ca052&_nc_ht=scontent-sjc6-1.cdninstagram.com&_nc_ohc=2Duz-gzPumkQ7kNvwFZw4X3&efg=eyJ2ZW5jb2RlX3RhZyI6ImlnLXhwdmRzLmZlZWQuYzItQzMuZGFzaF9yMmV2ZXZwOS1yMWdlbjJ2cDktaGZyX3E5MCIsInZpZGVvX2lkIjpudWxsLCJvaWxfdXJsZ2VuX2FwcF9pZCI6MjM4MjYwMTE4Njk3MzY3LCJjbGllbnRfbmFtZSI6ImlnIiwieHB2X2Fzc2V0X2lkIjo3MTA4OTgyNjgxNTYwNTEsImFzc2V0X2FnZV9kYXlzIjo0NTUsInZpX3VzZWNhc2VfaWQiOjEwMTY0LCJkdXJhdGlvbl9zIjozNCwiYml0cmF0ZSI6MTg1NzY2OCwidXJsZ2VuX3NvdXJjZSI6Ind3dyJ9&ccb=17-1&_nc_gid=hcW_GEtSq1OjFft5pj_xkA&_nc_ss=7a22e&_nc_zt=28&oh=00_AQJMKIDM-0GkfeeqVnmQukK7O4iPluyEPgugIi566oChgQ&oe=6A995199",
      "thumbnailUrl": "https://scontent-sjc6-1.cdninstagram.com/v/t51.71878-15/502082618_1221716316111560_1699719471127938819_n.jpg?stp=dst-jpg_e15_tt6&_nc_cat=100&ig_cache_key=MzY0NDMzOTE4NzY4ODYyNjA2MQ%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkZFRUQueHBpZHMuNjQwLnNkci52aWRlb19kZWZhdWx0X2NvdmVyX2ZyYW1lLkMzIn0%3D&_nc_ohc=DkIxwp7bY8wQ7kNvwHK70js&_nc_oc=AdojhBH8aQmCAcrc1aXT3jbrjocvry601hMW3lBniceR1UhfvDVVe7hffX81uoinLUg&_nc_ad=z-m&_nc_cid=0&_nc_zt=23&_nc_ht=scontent-sjc6-1.cdninstagram.com&_nc_gid=hcW_GEtSq1OjFft5pj_xkA&_nc_ss=7a22e&oh=00_AQJSy0QlNEiXOK2VK8X1Zu-J4yD9Bum1AUKOiTsErKKXzQ&oe=6A9951AD",
      "mediaType": "video/mp4",
      "fileExtension": "mp4",
      "quality": "720p",
      "width": 1280,
      "height": 720,
      "resolution": "1280x720",
      "duration": 34.688
    }
  ],
  "postId": "3644339187688626061_63242893209",
  "caption": "Back-to-back 💣! #TridentsUp",
  "author": {
    "username": "mariners",
    "profileUrl": "https://www.threads.com/@mariners"
  },
  "publishedAt": "2025-05-31T02:39:23.000Z",
  "likeCount": 206,
  "commentCount": 0
}
```

#### 💳 Pricing

**Event**

Pricing is pay per event. The buyer-facing event is **Video link**, and it costs `$0.00175` each. It covers one direct video link hosted by the source and saved when a public Threads post has video available.

#### 🔌 Integrations

**Dataset access**

Open the `dataset` link in Apify Console, export the dataset, or use the Apify dataset API in your own workflow. The Actor returns source links only, so your workflow must download or process them while they are valid.

**Video guide**

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### What makes a post eligible for a saved row?

The post must be public and reachable, and it must have at least one video. The saved row includes the post URL and the video entries that the source provides.

##### Can I use a private or login-gated post?

No. This Actor is for public Threads posts. Private, login-gated, deleted, and otherwise unreachable posts are outside its scope.

##### Does the Actor store the video file?

No. It returns direct source-hosted links. It does not copy, transcode, or permanently host the media.

##### Why can a video link stop working later?

The link comes from the source and can expire or change. Use important links soon after the run, or run the Actor again to get fresh links.

##### What happens if I submit the same post URL twice?

Only the first saved match is kept. A later repeat of the same source post is ignored.

##### Can I submit a profile or search URL?

No. Add full public Threads post URLs. The Actor does not find posts through profile, search, feed, hashtag, or keyword pages.

##### Do I need a Threads login?

No. Public post URLs can be processed without a Threads login.

##### Can one post contain more than one video?

Yes. The `videos` array can contain one or more source video objects when the post provides them.

##### How many post URLs can I submit?

At least one URL is required. The input schema does not set a fixed upper limit, so use the list size that fits your run and workflow.

### 📝 Changelog

**0.0: Initial release**

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~threads-video-downloader/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [Facebook Media Downloader](https://apify.com/maximedupre/facebook-media-downloader) retrieves direct links and available details from public Facebook videos, reels, and photos.
- [TikTok Video Downloader](https://apify.com/maximedupre/tiktok-video-downloader) returns direct video or audio links from known public TikTok video URLs.
- [Instagram Downloader API](https://apify.com/maximedupre/instagram-downloader-api) returns direct media links and public details from Instagram posts, reels, and TV pages.
- [Pinterest Video Downloader](https://apify.com/maximedupre/pinterest-video-downloader) returns video and image links from public Pinterest pins.
- [YouTube Shorts Downloader](https://apify.com/maximedupre/youtube-shorts-downloader) returns media links and metadata from known public YouTube Shorts URLs.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

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

Paste one or more full public Threads post URLs that contain video. Do not add profile, search, or private post links.

## Actor input object example

```json
{
  "postUrls": [
    {
      "url": "https://www.threads.com/@mariners/post/DKTSy7DN1eN"
    }
  ]
}
```

# Actor output Schema

## `dataset` (type: `string`):

Open direct source-hosted video links with available public post details.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/threads-video-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/threads-video-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 '{}' |
apify call maximedupre/threads-video-downloader --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maximedupre/threads-video-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/4xUrkK3IxiLufQZqj/builds/KugS3rntSOEHsd20y/openapi.json
