Full nested comment tree for a post, with a real comment count. 1 credit per call. One call returns the whole tree, so there's no pagination — cursor/has_more are always null/false. Fresh posts (under ~36 hours old) can briefly report a score of 1 and 0 comments on GET /v1/posts — use this endpoint for live comment counts instead.
An invalid or malformed post_id comes back as a 400 (credit refunded, see Errors) — retrying with the same bad id won't help.
| Param | Type | Default | Notes |
|---|---|---|---|
| post_id * | string | — | With or without the t3_ prefix. |
| limit | integer | 50 | 1–500. |
curl "https://api.threadsnoop.com/v1/comments/tree?post_id=1abcxyz&limit=50" \
-H "x-api-key: ts_live_YOUR_KEY"const res = await fetch(
"https://api.threadsnoop.com/v1/comments/tree?post_id=1abcxyz&limit=50",
{ headers: { "x-api-key": "ts_live_YOUR_KEY" } },
);
const data = await res.json();
console.log(data.data);type CommentNode = {
kind: "t1";
data: { id: string; body: string; author: string; created_utc: number; score: number };
replies: CommentNode[];
};
type CommentTreeResponse = {
data: CommentNode[];
_threadsnoop: { cursor: null; has_more: false; credits_used: number; credits_remaining: number };
};
const res = await fetch(
"https://api.threadsnoop.com/v1/comments/tree?post_id=1abcxyz&limit=50",
{ headers: { "x-api-key": "ts_live_YOUR_KEY" } },
);
const data: CommentTreeResponse = await res.json();
console.log(data.data);import requests
r = requests.get(
"https://api.threadsnoop.com/v1/comments/tree",
headers={"x-api-key": "ts_live_YOUR_KEY"},
params={"post_id": "1abcxyz", "limit": 50},
)
data = r.json()
print(data["data"]){
"data": [
{
"kind": "t1",
"data": {
"id": "kxyzabc",
"body": "I've been looking for exactly this",
"author": "some_founder",
"created_utc": 1753001200,
"score": 3
},
"replies": []
}
],
"_threadsnoop": {
"cursor": null,
"has_more": false,
"credits_used": 1,
"credits_remaining": 330
}
}See also: GET /v1/comments, GET /v1/posts.