Threads Scraper — Instagram Threads API, Posts, Replies, Videos
Pricing
from $1.00 / 1,000 posts
Threads Scraper — Instagram Threads API, Posts, Replies, Videos
Instagram Threads posts by handle: the latest posts as rows — text, date, likes, replies, reposts, quotes, image and video links — or paste a post link for its exact counts and top replies. Optional profile row: followers, bio, links. No login, no start fee. Threads shows 15 posts per profile.
Pricing
from $1.00 / 1,000 posts
Rating
0.0
(0)
Developer
Steadyfetch Team
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
21 hours ago
Last modified
Categories
Share
Type a handle and get its posts. Paste a post link and get that post with its replies. One JSON row per post: the post ID and its short code, the permalink, the handle and the stable numeric author ID, the post text, the moment it was published, the media type, the like, reply, repost, quote and reshare counts, the links and mentions pulled out of the text, an image link, a playable video link and the moment that link expires. Paste a post link instead and the row also carries that post's view count and its top replies. From $1.00 per 1,000 posts on the Business plan ($3.00 on the Apify free plan), platform usage included, no start fee. You are charged only when a row lands in your dataset: a handle Threads will not show, a profile that has published nothing, and a post link that is gone all cost $0.
Using an AI agent? Pin this actor in Apify's MCP server with one link: https://mcp.apify.com?tools=steadyfetch/threads-scraper
- Actor id:
steadyfetch/threads-scraper - Input:
{ "handles": ["natgeo"] }— the one field you have to set. Or{ "postUrls": ["https://www.threads.com/@zuck/post/ABC123"] }for individual posts. - Cap the bill: set
maxTotalChargeUsdon the run (a run option, not Actor input), e.g.0.50— the run stops when it reaches it. - Your cap is the cap.
resultsLimit(default 15) caps each handle andmaxItems(default 500) caps the whole run. Neither is ever overshot. If your input carrieslimit,countormax_postsinstead — the names other Threads scrapers use — they are read as the right one of the two and an uncharged note row says which.
Threads shows the last 15 posts of a profile to a logged-out reader, and there is no way to page further. That is Threads' ceiling, not ours: measured on four accounts on 11 September 2026, every one of them returned exactly 15 with no continuation token, whatever the account's posting rate. Ask for 30 and you get 15 plus one uncharged row per handle saying so. Nobody selling this data can do better without a login, and an actor that bills you for 30 rows to deliver 14 unique ones is the complaint this listing was built against.
Just want to see it work? Click Start with nothing set and the run returns built-in sample rows — the exact output shape, read from nothing, at no result fee.
What you get
| column | what it is |
|---|---|
postId · code · url | the post's stable numeric ID, its short code, and its permalink |
handle · authorId · isVerified | the author's handle, the stable numeric ID behind it, and whether the account is verified. A Threads handle is the Instagram handle and can be changed by its owner; authorId cannot. |
text | the post's own text, exactly as published |
createdAt | when it was published, ISO-8601 UTC |
mediaType | text, image, video or carousel |
likeCount · replyCount · repostCount · quoteCount · reshareCount | the five engagement counts. Real numbers, not zeros: a measured post carries 18,150 likes, 4,742 replies, 249 reposts and 144 quotes. An account that hides its counts gets countsHidden: true and explicit nulls — never a fake 0. |
viewCount | views, on a pasted post link only. A profile listing does not carry it and the column is an explicit null there. |
isReply · isPinned · isPaidPartnership | flags read off the post itself |
links · mentions | every link and every @mention inside the text, pulled out for you |
imageUrl · videoUrl · videoUrlExpiresAt | the media. Video links expire within about a day and a half and image links within about five days — videoUrlExpiresAt is the exact moment, decoded from the link itself, so you can fetch or re-run before it. |
carousel | a carousel post's items, each with its own media type, image link and video link |
repliesTotal · replies | on a pasted post link: a pasted post returns its top replies (about twenty) inside the row; there is no page 2 of replies. repliesTotal is how many exist, so a measured row reads "22 of 4,742" and you always know what you are looking at. |
charged · chargedEvents | whether this row was billed, and by which event |
status · statusReason | what happened, in a sentence, on every row including the ones that cost nothing |
A rowType: profile row — switched on with Include a profile row per handle — carries handle, id, fullName, biography, followerCount, isVerified, bioLinks and profilePicUrl.
What it costs
Three charged events. Nothing is charged for starting a run, and nothing is charged for a row that did not land.
| event | what one unit is | Apify free plan | paid plans, from |
|---|---|---|---|
| Post | one post row from a handle's listing | $0.003 | $0.001 |
| Profile | one profile row | $0.012 | $0.005 |
| Post lookup | one pasted post link, with its view count and its top replies | $0.012 | $0.005 |
Three handles at 15 posts each is 45 post rows: about $0.135 on the Apify free plan, $0.045 on the Business plan. A pasted post link costs one Post lookup whatever its replies contain — the replies ride along inside the row and are not charged separately.
Never charged: a handle Threads answers does not exist or is private, a profile that has published nothing, a post link Threads answers is gone, a read that failed on our side, a post your own date window dropped, a post this account already has, and every row a limit or the run clock stopped us from collecting. Each of those is still delivered as a row, labelled, with a sentence saying which it was.
Re-running the same handles
Every run remembers the posts it delivered to your account, in the key-value store threads-account in your own Apify account. A later run skips them — not delivered again, not charged — so a daily schedule on the same handles costs only what is new. Switch Include posts you already have on to get them anyway, marked repeat: true and still uncharged. The memory is a key-value store in your own Apify account, so a run started with a scoped API token in restricted-access mode needs key-value store Read, Write and Create permission, or Actor runs set to Full access (Write is what lets the run remember what it delivered; without it every run pays again); without it the run says so on its status line and cannot skip what you already have.
If something is wrong
This actor reads a public surface, and a public surface can change. When it does, failed items are never charged and the row says so in words rather than leaving you to guess from an empty dataset.
Open the Issues tab on this actor with your run ID and the input you used, and it gets looked at. If it earned its keep, a rating helps other buyers find it, and saving the actor keeps it one click away.
Related actors
- A Threads video you want the spoken words of: the
videoUrlcolumn is a direct MP4 link — hand it tosteadyfetch/media-transcriberin itsurlsfield while the link is still fresh, and it transcribes it by the minute. Pass thevideoUrl, not the threads.com page link. - Instagram profiles and their posts:
steadyfetch/instagram-profile-posts. - Instagram reels with their transcripts:
steadyfetch/instagram-reel-transcript-scraper.