List posts by subreddit/author, or fetch specific posts by id in one call. 1 credit per call, either mode. Every 200 response carries x-credits-used and x-credits-remaining headers alongside the JSON body's _threadsnoop block.
Two modes on one route. Pass subreddit and/or author to page through a listing (newest-first by default). Or pass ids (comma-separated, capped at 100) to fetch exact posts by id — in that mode every other listing param is ignored, and the response has cursor: null, has_more: false (there's no next page for a fixed id list). See Pagination for how after/before/q work in listing mode.
| Param | Type | Default | Notes |
|---|---|---|---|
| subreddit | string | — | Subreddit name, no r/. One of subreddit/author/ids is required. |
| author | string | — | Reddit username, no u/. |
| ids | string | — | Comma-separated post ids (max 100). When set, listing params below are ignored. |
| after | string | — | Epoch seconds or relative form (e.g. 7d), passed through as-is. |
| before | string | — | Same accepted forms as after. |
| limit | integer | 25 | 1–100. |
| sort | asc | desc | desc | By created_utc. |
| fields | string | — | Restricted allowlist, not the full Reddit schema — many real fields (permalink, hide_score, domain...) are rejected with a 400 naming the bad field. Safe set: id,title,selftext,author,created_utc,subreddit,score,num_comments,url,over_18,link_flair_text,spoiler. Omit if unsure. |
| q | string | — | Client-side exact-phrase filter over title + selftext. See the pagination guide. |
curl "https://api.threadsnoop.com/v1/posts?subreddit=startups&limit=2" \
-H "x-api-key: ts_live_YOUR_KEY"const res = await fetch(
"https://api.threadsnoop.com/v1/posts?subreddit=startups&limit=2",
{ headers: { "x-api-key": "ts_live_YOUR_KEY" } },
);
const data = await res.json();
console.log(data.data, data._threadsnoop);type Post = {
id: string;
title: string;
selftext: string;
author: string;
created_utc: number;
subreddit: string;
permalink: string;
url: string;
num_comments: number;
score: number;
hide_score: boolean;
};
type PostsResponse = {
data: Post[];
_threadsnoop: { cursor: number | null; has_more: boolean; credits_used: number; credits_remaining: number };
};
const res = await fetch(
"https://api.threadsnoop.com/v1/posts?subreddit=startups&limit=2",
{ headers: { "x-api-key": "ts_live_YOUR_KEY" } },
);
const data: PostsResponse = await res.json();
console.log(data.data, data._threadsnoop);import requests
r = requests.get(
"https://api.threadsnoop.com/v1/posts",
headers={"x-api-key": "ts_live_YOUR_KEY"},
params={"subreddit": "startups", "limit": 2},
)
data = r.json()
print(data["data"], data["_threadsnoop"]){
"data": [
{
"id": "1abcxyz",
"title": "Anyone know a tool that watches Reddit for me?",
"selftext": "Tired of manually searching every day...",
"author": "some_founder",
"created_utc": 1753000000,
"subreddit": "startups",
"permalink": "/r/startups/comments/1abcxyz/anyone_know_a_tool_that_watches_reddit_for_me/",
"url": "https://www.reddit.com/r/startups/comments/1abcxyz/anyone_know_a_tool_that_watches_reddit_for_me/",
"num_comments": 4,
"score": 12,
"hide_score": false
}
],
"_threadsnoop": {
"cursor": 1753000000,
"has_more": true,
"credits_used": 1,
"credits_remaining": 332
}
}See also: GET /v1/comments, GET /v1/comments/tree, Errors.