
TikTok Shop Scraper
scrape.ly/store/shelfbright/tiktok-shop-scraperE-commerceSocial media
1 monthly user

Collect public Threads posts, replies, reposts, and profiles. Search by keyword or read an account, with engagement, media, and profile fields. No login.
Collect public Threads posts, replies, reposts and profiles without a login. Read one account, search posts by keyword or hashtag, and get text, timestamps, engagement, media and the public profile fields Threads shows to a signed-out visitor.
Each saved row costs $7 per 1,000 results, and runs that return nothing add no per-result fee.
OUTPUT says how many rows were saved and why collection stopped.@handle or a profile URL). For search, add Keywords. For find profiles, add Keywords to search accounts, or only Usernames to load those accounts' profiles.| Field | Required | Default | What it does |
|---|---|---|---|
mode | Yes | user | user, user_reposts, user_replies, search or profiles. |
usernames | For user modes | zuck | A handle, @handle or profile URL. Up to 20. |
keywords | For search | empty | Words or hashtags. Find profiles searches accounts by them (or loads the usernames' profiles when empty). In user modes they only tag matching rows. |
max_posts | No | 10 | Cap per username or per keyword (not per run), 1 to 500. Two keywords with 10 save up to 20 rows. |
search_filter | No | top | Search only: top or recent. |
search_language | No | english | Search only: english, japanese or chinese. |
start_date, end_date | No | empty | Search only: YYYY-MM-DD or a relative value such as 7 days, in UTC. |
proxyConfiguration | No | Datacenter | Proxy pool for requests. |
Posts from one account:
{
"mode": "user",
"usernames": ["zuck"],
"max_posts": 10
}
Keyword search, newest first, last week only:
{
"mode": "search",
"keywords": ["AI"],
"search_filter": "recent",
"start_date": "7 days",
"max_posts": 10
}
User posts, reposts, replies and search save one row per post. Find profiles saves one row per account.
| Field | Description |
|---|---|
record_type | post or profile. |
post_url, post_code, text_content | Link, short code and text. |
created_at | Publish time (ISO, UTC). |
like_count, reply_count, repost_count, quote_count, share_count | Engagement counts. |
view_count, view_count_status | Views when the post page shows them. |
media_type, media_url, has_media | Media details. |
username, user_id, followers_count, bio | Public profile fields. |
reposted_by_username, reposted_at | Present on repost rows. |
replied_to_post_url, replied_to_text | Present on reply rows when the thread shows them. |
Example item (trimmed):
{
"record_type": "post",
"post_url": "https://www.threads.com/@jane.doe/post/AbC123xyz",
"post_code": "AbC123xyz",
"text_content": "Sample post text shown here...",
"created_at": "2026-10-13T22:19:22+00:00",
"like_count": 9,
"reply_count": 3,
"repost_count": 0,
"quote_count": 0,
"share_count": 0,
"view_count": 144,
"view_count_status": "available",
"has_media": true,
"media_type": "photo",
"username": "jane.doe",
"user_id": "1000000001"
}
Image and video URLs point at Threads' media hosts and expire, so download files you need soon after the run. Post and profile links do not expire.
You pay $0.007 per saved row, which is $7 per 1,000 results, plus platform usage (compute at $0.30 per GB-hour, datacenter proxy at $1 per GB). Empty runs are not charged a per-result fee.
Worked example: a 10-post account read cost about $0.074 in our test: $0.07 in result fees plus about $0.003 compute and storage.
Is it legal to scrape Threads? The actor reads only public, signed-out content. You are responsible for using the data in line with applicable law and Threads' terms.
Do I need a Threads login or my own proxy? No. Private accounts and posts that are not public are skipped, and proxies are included.
Why are some view counts missing?
Threads does not show views on every post. Those rows have view_count empty and view_count_status set to not_public_yet.
Can I pass a single post URL? Use the account mode with the profile URL or username. The actor reads an account's posts, replies or reposts, not one permalink as its own mode.
What if a username is not a Threads profile? That entry is skipped and the run still collects the rest. If every entry is unusable, the run finishes with no rows and names the skipped entries in the summary.
Can I schedule it or use the API? Yes, through schedules or the API.
fediverse_enabled flag is not in the public payload, so it is left null.Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
modeenumRequireddefault "user"Mode
User posts, reposts, and replies read the usernames below. Search uses the keywords. Find profiles searches accounts by keyword, or loads the listed usernames' profiles when no keyword is given.
usernamesarrayOptionalUsernames
Threads usernames or profile URLs, such as zuck, @zuck, or https://www.threads.com/@zuck. Used by user posts, reposts, and replies, and by find profiles when no keyword is given. Search ignores them.
keywordsarrayOptionalKeywords
Keywords or hashtags. Required for search. Find profiles searches accounts by these keywords (usernames are then ignored). In the user modes, matching rows are tagged and nothing is removed.
max_postsintegerOptionaldefault 10Maximum results
Cap per username or per keyword, not per run: two keywords with 10 can save up to 20 rows. At most 500, because search results from all keywords are merged in memory before saving. Find profiles never returns more than 10 accounts per keyword.
Sort, language, and dates apply to search. Other modes ignore them.
search_filterenumOptionaldefault "top"Sort
Search mode only. Top is what Threads ranks as relevant. Recent starts with the newest posts.
search_languageenumOptionaldefault "english"Preferred language
Search mode only. Asks Threads for more posts in this language. Posts with no language tag are kept.
start_datestringOptionalStart date
Search mode only. Keep posts from this date onward. YYYY-MM-DD or a relative value such as 7 days. Dates are UTC.
end_datestringOptionalEnd date
Search mode only. Keep posts up to this date, inclusive. YYYY-MM-DD or a relative value such as 7 days. Dates are UTC.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
Datacenter proxies are used unless you choose another pool.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| record_type | string | |
| username | string | |
| requested_username | string | |
| display_name | string | |
| text_content | string | |
| created_at | string | |
| like_count | integer | |
| reply_count | integer | |
| repost_count | integer | |
| quote_count | integer | |
| share_count | integer | |
| view_count | integer | null | |
| followers_count | integer | null | |
| is_verified | boolean | |
| bio | string | |
| post_url | string | |
| profile_url | string | |
| media_type | string | |
| search_keyword | string | null | |
| source_tab | string | |
| emails | array | |
| external_links | array |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Result | One saved post or profile. | $0.007 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('echofield/threads-scraper').call({
"mode": "user",
"usernames": [
"zuck"
],
"max_posts": 10,
"search_filter": "top",
"search_language": "english",
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run echofield/threads-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=echofield/threads-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Top Threads posts for a keyword.
Profile details for zuck, natgeo and nasa.
A user's latest replies on Threads.
Threads accounts found by keyword.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.