# Threads Liker Scraper (`futurizerush/threads-liker-scraper`) Actor

Extract the people who liked, reposted or quoted a Threads post, with their usernames, display names, profile pictures and quote text.

- **URL**: https://apify.com/futurizerush/threads-liker-scraper.md
- **Developed by:** [Rush](https://apify.com/futurizerush) (community)
- **Categories:** Social media, AI, Agents
- **Features:** Limited permissions
- **Stats:** 42 total users, 0 monthly users, 70.0% runs succeeded, 1 bookmarks
- **User rating**: 5.00 out of 5 stars

## 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?

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

## Threads Liker Scraper

Extract the people who liked, reposted or quoted a Threads post: usernames, display names, profile pictures, follow relationships, quote text and timestamps, in a clean, flat dataset ready for analysis.

### What does Threads Liker Scraper do?

This scraper retrieves users who engaged with a specific Threads post. Choose from three engagement types — or extract all at once:

- **Likes** — Users who liked the post
- **Reposts** — Users who reposted (shared) the post
- **Quotes** — Users who quoted the post, with the text of each quote

### What you get

For each person, you get:

- **Username**, **display name**, and whether the account is **verified**
- **Profile picture URL**
- **Follow relationship** (whether they follow you and whether you follow them)
- **Engagement timestamp** (when they interacted with the post)
- **Quote text and a link to the quote post** (for quote-type engagement)
- **Total engagement count** for that type on the post

Every row also carries the post it belongs to — the author, when it was published, and the post's own text — so an export stands on its own without going back to Threads.

### How to use

#### 1. Get your session ID

Engagement data is only visible to a signed-in account, so the scraper needs a session ID from your own logged-in browser:

1. Open Threads in your browser and make sure you are logged in.
2. Open your browser's developer tools (**F12**, or **Cmd+Option+I** on a Mac).
3. Go to **Application** → **Cookies** → **threads.com** (in Firefox: **Storage** → **Cookies**).
4. Copy the value of the cookie named **`sessionid`**.

Treat that value as private. If a run tells you the session was not accepted, copy a fresh one the same way.

#### 2. Configure the scraper

- **Post URLs**: Paste one or more Threads post links (up to 50), one per line with nothing else on the line. A post's address, a short `threads.com/t/…` link, or the link from the app's Share button all work
- **Session ID**: Paste your session cookie value
- **Engagement Type**: Choose Likes, Reposts, Quotes, or All

#### 3. Run and export

Click **Start** and wait for the results. Export your dataset as JSON, CSV, Excel, or connect via API. If you set a maximum cost for the run, the run stops when it reaches it and keeps everything it collected.

### Input example

#### Extract likes (default)

```json
{
    "postUrls": [
        "https://www.threads.net/@zuck/post/DTa3-B1EbTp"
    ],
    "sessionId": "your_session_id_here"
}
```

#### Extract all engagement types

```json
{
    "postUrls": [
        "https://www.threads.net/@zuck/post/DTa3-B1EbTp",
        "https://www.threads.com/@zuck/post/DTa39_1EWf5"
    ],
    "sessionId": "your_session_id_here",
    "engagementType": "all"
}
```

### Output example

#### Like record

```json
{
    "post_url": "https://www.threads.net/@zuck/post/DTa3-B1EbTp",
    "post_id": "3808602590024938729",
    "post_author_username": "zuck",
    "post_author_is_verified": true,
    "post_published_at": "2026-01-12T18:00:30+00:00",
    "post_caption": "Today we're establishing a new top-level initiative...",
    "total_count": 2944,
    "engagement_type": "like",
    "username": "example_user",
    "user_id": "10000000001",
    "display_name": "Example User",
    "user_is_verified": false,
    "profile_pic_url": "https://instagram.ftpe7-1.fna.fbcdn.net/v/...",
    "is_following_you": false,
    "you_are_following": false,
    "is_private": null,
    "quote_text": null,
    "quote_url": null,
    "timestamp": "2026-02-12T13:12:54+00:00",
    "extracted_at": "2026-03-09T07:03:35.412088+00:00"
}
```

#### Quote record

```json
{
    "post_url": "https://www.threads.net/@zuck/post/DTa3-B1EbTp",
    "post_id": "3808602590024938729",
    "post_author_username": "zuck",
    "post_author_is_verified": true,
    "post_published_at": "2026-01-12T18:00:30+00:00",
    "post_caption": "Today we're establishing a new top-level initiative...",
    "total_count": 39,
    "engagement_type": "quote",
    "username": "example_quoter",
    "user_id": "12345678901",
    "display_name": "Example Quoter",
    "user_is_verified": true,
    "profile_pic_url": "https://instagram.ftpe7-1.fna.fbcdn.net/v/...",
    "is_following_you": true,
    "you_are_following": false,
    "is_private": null,
    "quote_text": "Great insights on this topic!",
    "quote_url": "https://www.threads.net/@example_quoter/post/EXAMPLECODE",
    "timestamp": "2026-02-10T08:30:00+00:00",
    "extracted_at": "2026-03-09T07:03:35.412088+00:00"
}
```

#### Output fields

| Field | Type | Description |
|-------|------|-------------|
| `post_url` | string | The post link as you submitted it, without the spaces or invisible characters around it, so your export joins back to your own list |
| `post_id` | string | Numeric post identifier |
| `post_author_username` | string | Username of the account that published the post |
| `post_author_is_verified` | boolean or null | Whether the post's author is verified |
| `post_published_at` | string or null | ISO 8601 timestamp of when the post was published |
| `post_caption` | string | Text of the post the engagement belongs to |
| `total_count` | integer or null | Total count Threads reports for this engagement type on the post. Null when the platform does not report a usable number |
| `engagement_type` | string | Type of engagement: `like`, `repost`, or `quote` |
| `username` | string | User's Threads username |
| `user_id` | string | User's numeric ID |
| `display_name` | string | User's display name |
| `user_is_verified` | boolean or null | Whether this account carries a verified badge. Null when Threads does not report it |
| `profile_pic_url` | string | User's profile picture link (Threads' default picture for an account without one; empty if Threads sends none) |
| `is_following_you` | boolean or null | Whether this user follows you. Null when Threads does not report the relationship |
| `you_are_following` | boolean or null | Whether you follow this user. Null when Threads does not report the relationship |
| `is_private` | boolean or null | Whether the account is private. Threads does not report this on engagement lists, so it is null in practice; it is in the full export, not the preview tables |
| `quote_text` | string or null | The text Threads shows for the quote: the quoter's own words, or, for a quote with no words of its own, a short line Threads adds, such as "Quoted with a photo" (null except on quote rows) |
| `quote_url` | string or null | Link to the quote post (null except on quote rows) |
| `timestamp` | string or null | When the person engaged (ISO 8601) |
| `extracted_at` | string | ISO 8601 timestamp of when the data was extracted |

### FAQ

**Will I get everyone who engaged with a post?**
Usually not. Threads often returns only part of the people it counts, and what it returns varies by post, engagement type, and what your account can see. Every row carries `total_count`, the total Threads reports for that engagement type, so you can compare it with what you received.

**What's the difference between Likes, Reposts, and Quotes?**

- **Likes**: Users who tapped the heart icon
- **Reposts**: Users who shared the post to their own profile (similar to a retweet)
- **Quotes**: Users who shared the post in a post of their own — the `quote_text` field holds their words, or, when the quote has no words of its own, a short line Threads adds, such as "Quoted with a photo"

**What does "All" engagement type do?**
Selecting "All" extracts likes, reposts, and quotes from each post in a single run. Each record includes an `engagement_type` field so you can filter by type.

**Do I need a Threads account?**
Yes. Engagement is only visible to a signed-in account, so the scraper uses a session ID from your own. It is a secret input: kept encrypted with your run and never shown in the logs or the output.

**Can I access engagement from private accounts?**
You can only access engagement for posts that are visible to your logged-in account.

**What if my session stops working?**
The scraper checks your session before it starts collecting, so a session that is no longer accepted is reported straight away. If it stops working part-way through, the run stops and keeps everything it collected: copy a fresh `sessionid` from your browser and start a new run as the run's log says.

**Can I process multiple posts at once?**
Yes. You can provide up to 50 post links in a single run. Each run reads with your own account, so with one session ID, start runs one after another rather than several at the same time.

**What if a run stops early?**
Everything it collected stays in your dataset, and its log says why it stopped and what to do next. Usually that is to open the run in Apify Console and click **Resurrect**: it goes on with the posts it had not finished. A post the log gives a step of its own, such as one the maximum cost cut short, needs that step instead. When the log gives another way for the run, such as a new run with a fresh session ID or a higher maximum cost, follow it; a new run starts its posts from the beginning. If the log says the tool needs an update, tell us in the Actor's **Issues** tab (first try again if it asks you to).

**Which links can I use?**
A post's own address on threads.com or threads.net, a short `/t/` link, or the link the app's Share button copies. Give each link its own line, with nothing else on it. Profile pages, searches and links to other sites are not posts and are skipped, and so is an entry that is not one complete post link — the log names each. If the same post appears twice, it is collected once.

**Where can I see what a run did not collect?**
In the run summary on the run's Output tab, which lists the entries it skipped, the posts it could not read (each with a reason), the posts it stopped before finishing, and any post its maximum cost cut short. The run's log says why, and the next step where there is one. The summary also counts the people Threads listed that could not be read, on the posts and engagement types it finished (`records_unreadable`); they are not in your results.

### Use cases

- **Engagement analysis**: Understand who likes, reposts, and quotes your content
- **Audience research**: Discover potential followers and collaborators
- **Content strategy**: Track which posts attract the most engagement across all types
- **Competitor analysis**: See who engages with competitor content
- **Community building**: Identify your most active supporters
- **Quote monitoring**: Track what people say when quoting your posts

### Need another Threads workflow?

- [Threads Scraper - Posts, Profiles & Search](https://apify.com/futurizerush/meta-threads-scraper): collect public posts, search keywords, discover profiles, and export account data.
- [Threads Replies Scraper](https://apify.com/futurizerush/threads-replies-scraper): collect public replies and comments for conversation analysis.

### Disclaimer

This tool is provided for educational and research purposes. By using this scraper, you acknowledge and agree to the following:

- **Platform changes**: Meta may update or modify the Threads platform at any time, which could temporarily or permanently affect this tool's functionality. We cannot guarantee uninterrupted service.
- **Platform limitations**: Available engagement details can vary by post, engagement type, account access, and platform behavior at run time.
- **Compliance responsibility**: You are solely responsible for ensuring your use complies with all applicable laws, regulations (including GDPR, CCPA, and other data protection laws), and the Threads/Meta Terms of Service.
- **Ethical use**: Please use this tool responsibly. Do not use extracted data for harassment, spam, unauthorized profiling, or any purpose that violates individuals' privacy or platform policies.
- **Data accuracy**: Extracted data reflects a point-in-time snapshot and may not be complete or current.
- **Session handling**: Your session ID is a secret input: kept encrypted with your run, never shown in logs or output, and sent only to Threads while the run is going. Log out of Threads to end that session.
- **No warranty**: The developer assumes no liability for any consequences arising from the use of this tool, including but not limited to account restrictions, data inaccuracies, or legal claims.

***

Threads Liker Scraper, Threads Like Scraper, Threads Likers, Threads Repost Scraper, Threads Quote Scraper, Threads Engagement, Threads Analytics, Threads Post Likes, Threads Post Reposts, Threads Post Quotes, Threads Quote Links, Social Media Scraper, Threads Data Extraction, Meta Threads API, Threads Audience Analysis, Claude Code, OpenClaw, Gemini, Antigravity, Codex, ChatGPT

# Actor input Schema

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

Threads post links you want the engagement for. Paste one per line, with nothing else on the line, up to 50. The link from the app's Share button works too. Example: https://www.threads.net/@zuck/post/DTa3-B1EbTp

## `sessionId` (type: `string`):

Your own Threads login, so the scraper sees engagement the way you do. In your browser, open Threads while logged in, go to Developer Tools → Application → Cookies → <b>threads.com</b> (in Firefox: Storage → Cookies), and copy the value of <b>sessionid</b>. Keep it private, and paste a fresh one if a run tells you the session was not accepted.

## `engagementType` (type: `string`):

Pick what to collect from each post. <b>All</b> collects likes, reposts and quotes in the same run and tags every row with its type.

## Actor input object example

```json
{
  "postUrls": [
    "https://www.threads.net/@zuck/post/DTa3-B1EbTp",
    "https://www.threads.com/@zuck/post/DTa39_1EWf5",
    "https://www.threads.com/@chef_on_the_rock/post/DTa5ubogZ0o"
  ],
  "engagementType": "like"
}
```

# Actor output Schema

## `overview` (type: `string`):

Every engagement record, with the post it came from

## `users` (type: `string`):

Who engaged, with the follow relationship — one row per engagement

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

What this run collected, and any links it skipped, could not finish or stopped before finishing

# 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://www.threads.net/@zuck/post/DTa3-B1EbTp",
        "https://www.threads.com/@zuck/post/DTa39_1EWf5",
        "https://www.threads.com/@chef_on_the_rock/post/DTa5ubogZ0o"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("futurizerush/threads-liker-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 = { "postUrls": [
        "https://www.threads.net/@zuck/post/DTa3-B1EbTp",
        "https://www.threads.com/@zuck/post/DTa39_1EWf5",
        "https://www.threads.com/@chef_on_the_rock/post/DTa5ubogZ0o",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("futurizerush/threads-liker-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 '{
  "postUrls": [
    "https://www.threads.net/@zuck/post/DTa3-B1EbTp",
    "https://www.threads.com/@zuck/post/DTa39_1EWf5",
    "https://www.threads.com/@chef_on_the_rock/post/DTa5ubogZ0o"
  ]
}' |
apify call futurizerush/threads-liker-scraper --silent --output-dataset

```

## MCP server setup

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