You can read public Threads data with five REST calls: one post by URL, a user profile by handle, the recent posts of a user, a keyword search of posts and a search for users. Every call returns JSON and only needs one API key header, so there is no access token to request, refresh or keep alive. You pay per successful call instead of a monthly tier.
| Endpoint | What it returns | Credits/call | USD/call (Freelance plan) |
|---|---|---|---|
/v1/threads/post | Post | 1 | $0.0017 |
/v1/threads/user | Profile | 1 | $0.0017 |
/v1/threads/search | Search by Keyword | 1 | $0.0017 |
/v1/threads/search_users | Search Users | 1 | $0.0017 |
/v1/threads/user_posts | Posts | 1 | $0.0017 |
/v1/threads/postPost 1,000 calls = 1,000 credits = $1.67 on the Freelance plan.
| Parameter | Type | Required | Description |
|---|---|---|---|
url | string | yes | The URL of the post to get |
trim | boolean | no | Set to true for a trimmed down version of the response |
cache_max_age | string | no | If we have a response in the cache that is this many days old or newer, return the cached response (0 credits, with "cached": true and a "cached_at" timestamp). |
Sample response (trimmed):
{
"post": {
"id": "3656367813102434565_63055343223",
"pk": "3656367813102434565",
"caption": {
"text": "Spoiler alert: We're testing a way for you to hide spoilers in your Threads posts.",
"pk": "17978979272714446",
"has_translation": null
},
"code": "DK-BydcJHkF",
"like_count": 96439,
"taken_at": 1750093031,
"user": {
"pk": "63055343223",
"friendship_status": null,
"profile_pic_url": "https://scontent-hou1-1.cdninstagram.com/v/t51.2885-19/452737457_1313286386312102_744138929735022550_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_ht=scontent-hou1-1.cd...",
"username": "zuck",
"id": "63055343223",
"full_name": "Mark Zuckerberg",
"transparency_label": null,
"transparency_product": null,
"transparency_product_enabled": false,
"is_verified": true,
"text_post_app_is_private": false,
"has_onboarded_to_text_post_app": true
}
},
"comments": [
{
"id": "3658534918151603488_74973899807",
"pk": "3658534918151603488",
"caption": {
"text": "意味分からない",
"pk": "18306832783208063",
"has_translation": true
},
"code": "DLFuh_SygUg",
"like_count": 0,
"taken_at": 1750351370,
"user": {
"pk": "74973899807",
"friendship_status": null,
"profile_pic_url": "https://scontent-hou1-1.cdninstagram.com/v/t51.2885-19/491446152_17850244230449803_8764028655689505242_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_ht=sconten/v1/threads/userProfile 1,000 calls = 1,000 credits = $1.67 on the Freelance plan.
| Parameter | Type | Required | Description |
|---|---|---|---|
handle | string | yes | Threads username |
cache_max_age | string | no | If we have a response in the cache that is this many days old or newer, return the cached response (0 credits, with "cached": true and a "cached_at" timestamp). |
/v1/threads/searchSearch by Keyword 1,000 calls = 1,000 credits = $1.67 on the Freelance plan.
| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | yes | Keyword to search for |
start_date | string | no | Start date to search for |
end_date | string | no | End date to search for |
trim | boolean | no | Set to true for a trimmed down version of the response |
/v1/threads/search_usersSearch Users 1,000 calls = 1,000 credits = $1.67 on the Freelance plan.
| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | yes | Username to search for |
/v1/threads/user_postsPosts 1,000 calls = 1,000 credits = $1.67 on the Freelance plan.
| Parameter | Type | Required | Description |
|---|---|---|---|
handle | string | yes | Threads username |
trim | boolean | no | Set to true for a trimmed down version of the response |
curl -H "X-Scapi-Key: $SCAPI_KEY" "https://api.scrapall.bipsport.com/scapi/v1/threads/post"import os, requests
r = requests.get("https://api.scrapall.bipsport.com/scapi/v1/threads/post",
headers={"X-Scapi-Key": os.environ["SCAPI_KEY"]})
print(r.json())No. You only send your Scrapall API key in the request header. There is no app review, no OAuth flow and no token to refresh, and only public posts and profiles are read.
Yes. The search endpoint takes a keyword and returns matching public posts as JSON. A separate endpoint searches for users, so you can build lists of accounts around a topic.
Yes. Call the user posts endpoint with the public handle to get the recent posts of that account as JSON. Use the profile endpoint with the same handle to read the public profile details.
The post endpoint takes the public post URL and returns the caption together with like_count, view_counts and reshare_count. Keyword search returns up to 10 posts per call with caption text, like count and reshare count, and you can limit results with start_date and end_date.
Each successful call is billed from your credit balance, with no monthly tier. The exact cost per endpoint is shown in the cost table on this page and comes from the live price list.
Open the Buy page, pick the Freelance plan and pay in USDT on TRC20 or ERC20. The key is shown once, right after the payment is confirmed on-chain.
The cost table on this page lists credits per call for each endpoint. The Freelance plan is $45 for 27,000 credits per 30 days.
Full reference: all threads endpoints.