GET/v1/posts

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.

ParamTypeDefaultNotes
subredditstringSubreddit name, no r/. One of subreddit/author/ids is required.
authorstringReddit username, no u/.
idsstringComma-separated post ids (max 100). When set, listing params below are ignored.
afterstringEpoch seconds or relative form (e.g. 7d), passed through as-is.
beforestringSame accepted forms as after.
limitinteger251–100.
sortasc | descdescBy created_utc.
fieldsstringRestricted 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.
qstringClient-side exact-phrase filter over title + selftext. See the pagination guide.
curl
curl "https://api.threadsnoop.com/v1/posts?subreddit=startups&limit=2" \
  -H "x-api-key: ts_live_YOUR_KEY"
JavaScript (fetch)
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);
TypeScript (fetch)
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);
python (requests)
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"])
response (truncated)
{
  "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.