Reddit API & Scraper
The Reddit API returns subreddit posts, comments, search and user data as clean JSON.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
The primary subreddit_posts endpoint returns posts with title, author, score, comment count, timestamp and URL, and you can pull a post's comments with deep pagination, search across Reddit, fetch a user profile, read subreddit_about and discover trending communities. It is built for social listening, market research and RAG pipelines that need live Reddit data — logged-out, no account pool — without a fragile scraper. One ReefAPI key, one shared credit pool, the standard envelope.
Reddit fullname prefixes, and which action hands you which one
Reddit gives every object a type-prefixed "fullname" alongside a bare base36 id, and the two are not interchangeable when you pass them back in. This table lists the prefixes that actually appeared in measured responses and the field each one arrives in. It also records what happens when you send a bad enum value versus a value that simply matches nothing, because those two failures look completely different.
| Prefix or field | What it identifies | Measured example |
|---|---|---|
| t3_ | A post. Every post row carries both id and fullname, and a comment's link_id points at it. | r/Python returned id 1vy0ywg with fullname t3_1vy0ywg |
| t1_ | A comment. Comment rows also carry parent_id, which is t3_ for a top-level comment and t1_ for a reply. | t1_fgs7erl with parent_id t3_f08dxb and link_id t3_f08dxb |
| t5_ | A subreddit. Only subreddit_about returns it. | r/Python returned fullname t5_2qh0y, subscribers 1507579 |
| user id | Base36 and unprefixed in the payload. There is no t2_ anywhere in the user record. | user with kind=about for spez returned id 1w72 |
| post_id parameter | Takes the bare post id, not the fullname. A full reddit URL is accepted too. | post_comments with post_id f08dxb resolved the AskReddit thread |
| created_utc | Unix seconds as a float, UTC, on posts, comments and subreddits alike. | 1581069212.0 on the post, 1201230879.0 for the r/Python subreddit itself |
| Bad enum value | Rejected before any fetch. INVALID_PARAM comes back with detail.param and detail.allowed listing the real vocabulary. | sort=bogus returned INVALID_PARAM in 1.9 ms |
| A flair that matches nothing | Not rejected. ok stays true, posts[] is empty, completeness_pct is 0.0, and pagination still offers a next_cursor. | flair=NoSuchFlairXyz on r/Python returned 0 posts with has_more true |
time only does anything when sort is top or controversial. Passing time=week alongside sort=hot is accepted and silently has no effect, so a "past week" feed that looks wrong is usually a sort that was never top in the first place.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/reddit/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"subreddit": "python",
"limit": 10
}
}{
"ok": true,
"meta": {
"api": "reddit",
"endpoint": "search",
"mode": "live",
"latency_ms": 2600.9,
"record_count": 10,
"bytes": 42214,
"cache_hit": false,
"completeness_pct": 100,
"requests": 3,
"source_used": "arctic",
"pagination": {
"next_cursor": null,
"has_more": false
},
"charged_credits": 1,
"version": "0.4.0"
},
"data": {
"results": [
{
"id": "1woijc7",
"fullname": "t3_1woijc7",
"title": "CryptoClipGuard: A real-time Windows clipboard-hijacking mitigation tool for crypto addresses",
"author": "Traditional_Bear5492",
"author_fullname": "t2_opcw5jkmi",
"subreddit": "Python",
"score": 1,
"upvote_ratio": 1,
"num_comments": 1,
"created_utc": 1790198234,
"url": "https://www.reddit.com/r/Python/comments/1woijc7/cryptoclipguard_a_realtime_windows/",
"permalink": "https://www.reddit.com/r/Python/comments/1woijc7/cryptoclipguard_a_realtime_windows/",
"selftext": "[removed]",
"flair": "Showcase",
"over_18": false,
"spoiler": false,
"stickied": false,
"locked": false,
"is_self": true,
"is_video": false,
"domain": "self.Python",
"thumbnail": null,
"num_crossposts": 0,
"total_awards_received": 0,
"edited": false
},
{
"id": "1woh8y4",
"fullname": "t3_1woh8y4",
"title": "What's new in Python 3.15?",
"author": "AlSweigart",
"author_fullname": "t2_369qx",
"subreddit": "Python",
"score": 1,
"upvote_ratio": 1,
"num_comments": 0,
"created_utc": 1790195217,
"url": "https://www.reddit.com/r/Python/comments/1woh8y4/whats_new_in_python_315/",
"permalink": "https://www.reddit.com/r/Python/comments/1woh8y4/whats_new_in_python_315/",
"selftext": "https://docs.python.org/3.15/whatsnew/3.15.html\n\n> Summary – Release highlights\n\n> Python 3.15 will be the latest stable release of the Python programming language, with a mix of changes to the language, the implementation, and the standard library. The biggest changes include lazy imports, frozendict and sentinel builtins, UTF-8 as the default encoding, unpacking in comprehensions, and a stable ABI for free-threaded builds.\n\n> The library changes include a new profiling package with Tachyon, a high-frequency statistical sampling profiler, more color in command-line output, as well as the usual deprecations and removals, and improvements in user-friendliness and correctness.\n\n> This article doesn’t attempt to provide a complete specification of all new features, but instead gives a convenient overview. For full details refer to the documentation, such as the Library Reference and Language Reference. To understand the complete implementation and design rationale for a change, refer to the PEP for a particular new feature; but note that PEPs usually are not kept up-to-date once a feature has been fully implemented.",
"flair": "News",
"over_18": false,
"spoiler": false,
"stickied": false,
"locked": false,
"is_self": true,
"is_video": false,
"domain": "self.Python",
"thumbnail": null,
"num_crossposts": 0,
"total_awards_received": 0,
"edited": false
},
{
"id": "1woct5v",
"fullname": "t3_1woct5v",
"title": "Built a post-quantum crypto lib in Python (ML-KEM + AES). Feedback?",
"author": "Bratva250",
"author_fullname": "t2_2nahm0tiji",
"subreddit": "Python",
"score": 1,
"upvote_ratio": 1,
"num_comments": 1,
"created_utc": 1790185319,
"url": "https://www.reddit.com/r/Python/comments/1woct5v/built_a_postquantum_crypto_lib_in_python_mlkem/",
"permalink": "https://www.reddit.com/r/Python/comments/1woct5v/built_a_postquantum_crypto_lib_in_python_mlkem/",
"selftext": "[removed]",
"flair": "Discussion",
"over_18": false,
"spoiler": false,
"stickied": false,
"locked": false,
"is_self": true,
"is_video": false,
"domain": "self.Python",
"thumbnail": null,
"num_crossposts": 0,
"total_awards_received": 0,
"edited": false
},
{
"id": "1woca2r",
"fullname": "t3_1woca2r",
"title": "Best Fun Beginners Guides for Python - 2026",
"author": "vkailas",
"author_fullname": "t2_3gdc7",
"subreddit": "Python",
"score": 1,
"upvote_ratio": 1,
"num_comments": 0,
"created_utc": 1790184130,
"url": "https://www.reddit.com/r/Python/comments/1woca2r/best_fun_beginners_guides_for_python_2026/",
"permalink": "https://www.reddit.com/r/Python/comments/1woca2r/best_fun_beginners_guides_for_python_2026/",
"selftext": "[removed]",
"flair": "Discussion",
"over_18": false,
"spoiler": false,
"stickied": false,
"locked": false,
"is_self": true,
"is_video": false,
"domain": "self.Python",
"thumbnail": null,
"num_crossposts": 0,
"total_awards_received": 0,
"edited": false
},
{
"id": "1wo7f3o",
"fullname": "t3_1wo7f3o",
"title": "jobHunt: a stdlib-only job search + CV tailoring tool with a local web UI",
"author": "TackleAlone5814",
"author_fullname": "t2_1q26nyrzzw",
"subreddit": "Python",
"score": 1,
"upvote_ratio": 1,
"num_comments": 1,
"created_utc": 1790173380,
"url": "https://www.reddit.com/r/Python/comments/1wo7f3o/jobhunt_a_stdlibonly_job_search_cv_tailoring_tool/",
"permalink": "https://www.reddit.com/r/Python/comments/1wo7f3o/jobhunt_a_stdlibonly_job_search_cv_tailoring_tool/",
"selftext": "[removed]",
"flair": "Showcase",
"over_18": false,
"spoiler": false,
"stickied": false,
"locked": false,
"is_self": true,
"is_video": false,
"domain": "self.Python",
"thumbnail": null,
"num_crossposts": 0,
"total_awards_received": 0,
"edited": false
},
{
"id": "1wo7a20",
"fullname": "t3_1wo7a20",
"title": "CutCutCodec: Streamlined Video Processing – A Signal Processing Oriented MoviePy Alternative",
"author": "robinechuca",
"author_fullname": "t2_22akfn4w7r",
"subreddit": "Python",
"score": 1,
"upvote_ratio": 1,
"num_comments": 0,
"created_utc": 1790173058,
"url": "https://www.reddit.com/r/Python/comments/1wo7a20/cutcutcodec_streamlined_video_processing_a_signal/",
"permalink": "https://www.reddit.com/r/Python/comments/1wo7a20/cutcutcodec_streamlined_video_processing_a_signal/",
"selftext": "After two years of work, *entierly hand-coded*, the audio and video editing library is finally up and running! \nHere is the project documentation: [https://cutcutcodec.readthedocs.io/latest/](https://cutcutcodec.readthedocs.io/latest/)\n\nThis project is aimed at developers and the signal processing and machine learning community. It is based on Torch and rigorously implements the standards of the International Telecommunication Union.\n\nUnlike moviepy, which is based on the concept of clips, CutCutCodec is based on the concepts of media streams and editing graphs, which are more powerful, but slightly more verbose.\n\n*Let see a little basic example:*\n\n import cutcutcodec\n container = cutcutcodec.read(\"input_video.mp4\") # open the file\n stream = (\n container.out_select(\"video\")[0] # first video stream\n .apply_video_subclip(0, 10) # keep the 10 first seconds\n .apply_video_equation(\"r0\", \"g0\", \".5*b0*sin(2*pi*0.5*t)+.5\") # blink blue\n )\n streams_settings = [{\"encodec\": \"libx264\", \"rate\": 30, \"shape\": (480, 720)}] # optional\n cutcutcodec.write([stream], \"output_video.mp4\", streams_settings=streams_settings)\n\nIf you have any feedback for me, I’d love to hear it!",
"flair": "Resource",
"over_18": false,
"spoiler": false,
"stickied": false,
"locked": false,
"is_self": true,
"is_video": false,
"domain": "self.Python",
"thumbnail": null,
"num_crossposts": 0,
"total_awards_received": 0,
"edited": false
},
{
"id": "1wo6jek",
"fullname": "t3_1wo6jek",
"title": "Sanka: open-source DRF → FastAPI migration engine with AI bench",
"author": "ageo89",
"author_fullname": "t2_5fzbfacc",
"subreddit": "Python",
"score": 1,
"upvote_ratio": 1,
"num_comments": 0,
"created_utc": 1790171347,
"url": "https://www.reddit.com/r/Python/comments/1wo6jek/sanka_opensource_drf_fastapi_migration_engine/",
"permalink": "https://www.reddit.com/r/Python/comments/1wo6jek/sanka_opensource_drf_fastapi_migration_engine/",
"selftext": "**What this guides show you**\n\nSanka is a migration engine plus CLI. \n\nFive commands take a Django REST Framework app to FastAPI: \n\n`scan` reads the app the way Django runs it (URLconf, routers, viewsets, serializers), \n\n`plan` writes a hash-locked plan you review, \n\n`apply` accepts only that exact hash and writes a separate FastAPI project (async handlers, Pydantic models, Tortoise ORM models on your existing tables) without touching your source, \n\n`test` runs the generated app's own suite, and \n\n`verify` replays requests against both apps and diffs the responses.\n\nRoutes outside the supported envelope are reported as manual work, never silently bridged. Everything runs locally; no account.\n\nRepo: [https://github.com/sankaHQ/sanka](https://github.com/sankaHQ/sanka)\n\nGuide (each step also runs in the browser): [https://sanka.com/docs/developers/migrate/django-to-fastapi/](https://sanka.com/docs/developers/migrate/django-to-fastapi/)\n\nWalkthrough video: [https://www.youtube.com/watch?v=iH1dgWGRn6g](https://www.youtube.com/watch?v=iH1dgWGRn6g)\n\n**Target Audience**\n\nTeams moving a DRF API to FastAPI (or Flask) who want a reviewable plan and a parity check instead of a one-off script.\n\nProduction intent; this is the first public release. Python 3.12+, uv, macOS/Linux installer. Engine AGPL-3.0, CLI/SDK Apache-2.0.\n\n**Comparison**\n\n\\- Hand port: no plan artifact, no differential verify; \"looks right\" is the review.\n\n\\- django-ninja: you stay on Django, which is the right call if you can; Sanka is for teams that have decided to leave.\n\n\\- One-shot LLM rewrite: no reviewable plan and no parity check. We measured the difference on 17 migrations with 8 models, same prompts with and without the CLI: 74.3% → 85.3% pass, and the weakest models gain the most (https://sanka.com/bench, evaluator and tasks open at https://github.com/sankaHQ/bench).",
"flair": "Tutorial",
"over_18": false,
"spoiler": false,
"stickied": false,
"locked": false,
"is_self": true,
"is_video": false,
"domain": "self.Python",
"thumbnail": null,
"num_crossposts": 0,
"total_awards_received": 0,
"edited": false
},
{
"id": "1wo6ak8",
"fullname": "t3_1wo6ak8",
"title": "Should dependency scanners flag unmaintained packages, or stick to CVEs?",
"author": "No_Wedding2230",
"author_fullname": "t2_qwwzaa2x",
"subreddit": "Python",
"score": 1,
"upvote_ratio": 1,
"num_comments": 0,
"created_utc": 1790170759,
"url": "https://www.reddit.com/r/Python/comments/1wo6ak8/should_dependency_scanners_flag_unmaintained/",
"permalink": "https://www.reddit.com/r/Python/comments/1wo6ak8/should_dependency_scanners_flag_unmaintained/",
"selftext": "Should a dependency scanner tell you a package is unmaintained, or only that it has a known vulnerability? \n\nThe case for CVEs only: a vulnerability is a fact, and \"unmaintained\" is a guess. The case against: a CVE-only scanner stays silent about a package with no maintainer, right up until someone finds a bug in it and nobody is there to fix it.\n\nI measured this on the pinned dependencies of 100 well-known open source Python projects (Django, FastAPI, Airflow, Home Assistant, Sentry, vLLM and others) on 23 September. 98 had dependency files I could read, with 4,791 distinct packages between them.\n\n**Release age is almost useless on its own.** 988 of those packages, about 1 in 5, haven't shipped a release in two years. Most are simply finished. Flag them all and nobody reads the report.\n\n**Some signals are facts rather than guesses.** 75 packages have no known vulnerability in the pinned version, but their source repository is archived, or the maintainer has marked them Inactive on PyPI. A CVE scanner says nothing about any of them. The most common:\n\n* `backoff`: archived, in 16 of the projects\n* `nest-asyncio`: 14\n* `bleach`: 11, deprecated by its maintainers\n* `click-plugins`: 10\n\n**Even the facts need judgement.** An archived repo isn't always an abandoned package: `google-cloud-bigquery`'s repo is archived because the code moved into a monorepo, and it still ships monthly. And `backoff` retries function calls, so nobody left to patch it matters much less than it would for an HTML sanitiser.\n\nSo what should a scanner do with maintenance signals?\n\n1. Nothing. CVEs only\n2. Report archived/deprecated packages, never fail a build\n3. Fail the build, but only when the abandoned package handles untrusted input (parsers, auth, sanitisers)\n4. A single health score",
"flair": "Discussion",
"over_18": false,
"spoiler": false,
"stickied": false,
"locked": false,
"is_self": true,
"is_video": false,
"domain": "self.Python",
"thumbnail": null,
"num_crossposts": 0,
"total_awards_received": 0,
"edited": false
},
{
"id": "1wo3o2r",
"fullname": "t3_1wo3o2r",
"title": "Anyone wanna be an AI Engineer , Can I use LangChain framework and Doing without SDK or else ??",
"author": "a9a_k8",
"author_fullname": "t2_114b605yyz",
"subreddit": "Python",
"score": 1,
"upvote_ratio": 1,
"num_comments": 1,
"created_utc": 1790163833,
"url": "https://www.reddit.com/r/Python/comments/1wo3o2r/anyone_wanna_be_an_ai_engineer_can_i_use/",
"permalink": "https://www.reddit.com/r/Python/comments/1wo3o2r/anyone_wanna_be_an_ai_engineer_can_i_use/",
"selftext": "",
"flair": "Help",
"over_18": false,
"spoiler": false,
"stickied": false,
"locked": false,
"is_self": true,
"is_video": false,
"domain": "self.Python",
"thumbnail": null,
"num_crossposts": 0,
"total_awards_received": 0,
"edited": false
},
{
"id": "1wo314v",
"fullname": "t3_1wo314v",
"title": "Someone hijacked MemoryOS PyPI releases by replacing the build backend",
"author": "BattleRemote3157",
"author_fullname": "t2_ewn6cu80w",
"subreddit": "Python",
"score": 1,
"upvote_ratio": 1,
"num_comments": 0,
"created_utc": 1790161930,
"url": "https://www.reddit.com/r/Python/comments/1wo314v/someone_hijacked_memoryos_pypi_releases_by/",
"permalink": "https://www.reddit.com/r/Python/comments/1wo314v/someone_hijacked_memoryos_pypi_releases_by/",
"selftext": "The attacker swapped in a custom `pyproject.toml` build backend that grabbed the PyPI token before the real upload ran. Then used that token to push the backdoored package themselves.\n\ncomplete - [safedep.io/memtensor-sckit-worm-npm-pypi](http://safedep.io/memtensor-sckit-worm-npm-pypi)",
"flair": "News",
"over_18": false,
"spoiler": false,
"stickied": false,
"locked": false,
"is_self": true,
"is_video": false,
"domain": "self.Python",
"thumbnail": null,
"num_crossposts": 0,
"total_awards_received": 0,
"edited": false
}
],
"count": 10,
"type": "post"
}
}What the Reddit API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| subreddit_posts | Posts in a subreddit, ranked by `sort`. Returns title/author/score/comment-count. Supports deep paging (`page`) and `flair` filtering. | Social-listening tools call subreddit_posts to get posts in a subreddit, ranked by `sort`. | subreddit, sub, sort, time, limit, ... |
| multi_subreddit_posts | ONE merged newest-first feed across a whole watchlist of subreddits — pass up to 5000 names in a single call instead of polling each one. Built for near-real-time monitoring: posts show up seconds after they go live, `since_utc` returns only what is new since your last poll. | Creator and influencer platforms call multi_subreddit_posts to get oNE merged newest-first feed across a whole watchlist of subreddits. | subreddits, subs, subreddit, sub, sort, ... |
| post_comments | Threaded comments for a post. Returns author/body/score per comment. | Brand-monitoring teams call post_comments to get threaded comments for a post. | post_id, id, url, sort, limit, ... |
| search | Search posts, comments, or users by `q` and/or `subreddit`/`author`. Returns results[]. Comment search reads Reddit's own live comment index. Cursor pagination + `flair` filter apply on the live source. An empty result is confirmed before it is returned (meta.empty_retries). | Audience analysts call search to search posts, comments, or users by `q` and/or `subreddit`/`author`. | q, query, subreddit, sub, author, ... |
| user | User profile or content. kind=about returns karma and the profile (display name, bio, banner, NSFW flag, is_employee); submitted/comments list items (with deep paging), and each comment carries the title and link of the post it was left on. Reddit keeps about the last 1,000 items of a user's listing and leaves removed ones out, so a listing can end before that. | Social-listening tools call user to get user profile or content. | username, user, name, kind, limit, ... |
| subreddit_about | Subreddit metadata: subscribers, description, created date, banner, status, etc. A private, quarantined or banned subreddit is refused by Reddit: the answer is NOT_FOUND with error.detail.status = private | quarantined | banned (a name that never existed has no status). | Creator and influencer platforms call subreddit_about to get subreddit metadata. | subreddit, sub, source |
| communities | Search subreddits by name/keyword — find communities matching a term, with each one's subscribers, title, description and over-18 flag. | Brand-monitoring teams call communities to search subreddits by name/keyword. | q, limit, include_nsfw |
| trending | Site-wide discovery — hot/popular posts from r/popular or r/all (what's trending across Reddit right now), or the most-popular communities. No subreddit needed. | Audience analysts call trending to get site-wide discovery. | scope, kind, sort, time, limit, ... |
| user_search | Find Reddit users by name/keyword — people search. Returns matching profiles with karma, display name, bio, banner, NSFW flag and is_employee. (Same as search with type=user.) | Social-listening tools call user_search to find Reddit users by name/keyword. | q, query, username, limit, after, ... |
| load_more_comments | Expand the collapsed 'more comments' nodes from a post_comments call — pass that response's more_ids to reveal the rest of the thread (build the FULL comment tree). | Creator and influencer platforms call load_more_comments to get expand the collapsed 'more comments' nodes from a post_comments call. | post_id, more_ids, link_id, id, url, ... |
| subreddit_extras | Public subreddit extras: the community's rules and its wiki page index/content. (Moderator list is mod-only on Reddit and is not available logged-out.) | Brand-monitoring teams call subreddit_extras to get public subreddit extras. | subreddit, sub, include, wiki_page, source |
Call search from your stack
curl -X POST https://api.reefapi.com/reddit/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"subreddit":"python","limit":10}'import requests
r = requests.post(
"https://api.reefapi.com/reddit/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"subreddit": "python",
"limit": 10
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/reddit/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"subreddit": "python",
"limit": 10
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.reddit.search with {"subreddit":"python","limit":10}.Who uses this API and why
- Market researchers call subreddit_posts and search to track what communities say about a product.
- RAG pipelines pull post_comments to ground an AI assistant in real Reddit discussion.
- Social-listening tools use trending and user to monitor rising topics and influential accounts.
Questions developers ask before integrating
What is the difference between id and fullname, and which one do I store?
id is the bare base36 key and fullname is the same key with a type prefix. A measured r/Python post came back as id 1vy0ywg and fullname t3_1vy0ywg; a comment on another thread as id fgs7erl and fullname t1_fgs7erl. Store the fullname if you are keeping posts and comments in one table, because the bare ids share a namespace and a comment id can collide with a post id. Pass the bare id back in: post_comments takes post_id f08dxb, not t3_f08dxb.
Is score the real number of upvotes?
No. Reddit deliberately fuzzes score, so it is an approximation and two reads seconds apart can disagree by a few points on a busy thread. upvote_ratio is the more stable signal and it sits right next to score on every post: a measured r/rust post had score 3 with upvote_ratio 1.0, and another had score 0 with upvote_ratio 0.33, which tells you far more about reception than the 0 does. For trend work, track the pair rather than score alone.
Does an empty selftext mean it is a link post?
No, and this one trips people up. A measured AskReddit post had is_self true and selftext "" because it is a title-only question, while a measured r/rust post had is_self false and domain i.redd.it (an image link) yet carried 573 characters of selftext underneath it. Classify a post from is_self and domain, and treat selftext as a body that may or may not be present in either case.
What do [deleted] and [removed] mean, and are they the same thing?
They are different, and a comment can be in three states. Inside a single measured thread, one comment came back with author "[deleted]" and body "[removed]" (a moderator removal), another with author "[deleted]" and body "[deleted]" (the user deleted it), and a third with author "[deleted]" but its body fully intact (the account went away, the comment stayed). These are literal string values, not nulls, so a filter on author != null will not catch any of them.
post_comments gave me 10 comments on a thread with 13,297. How do I get the rest?
The tree comes back with explicit stubs rather than silently truncating. At the top level the response carries more_ids and has_more (a measured AskReddit thread returned 241 ids there), and inside replies[] you get objects shaped {more_children: 65, more_ids: [...]} wherever Reddit collapsed a branch. Feed those ids into load_more_comments to expand a branch. A stub with more_children 0 and an empty more_ids is a leaf, not an error.
Which source should I use, and what does auto pick?
auto is the default and chooses between the live site and the archives based on what you asked for. Set source=live when you specifically need the newest posts and the live-only features, because flair filtering, page-based deep paging and the cursor in meta.pagination.next_cursor all apply to the live source; the archive sources page by after_utc and before_utc instead. Reach for the archives when you are pulling old threads, where coverage beats freshness.
How does deep paging work across the post actions?
Two ways, and they do not mix. page (1 to 20) chains the cursors server-side, so page 2 really is the batch after page 1 without you holding any state. Or take meta.pagination.next_cursor from the previous response and send it back as cursor. A measured r/Python top-of-week call returned next_cursor t3_1vxrna7 with has_more true, which is simply the fullname of the last row it handed you. Both stop at Reddit's own listing depth, not at a limit of ours.
Why does searching comments return less per row than post_comments does?
Because search with type=comment reads Reddit's live comment index, which is a discovery surface rather than a full record. Measured rows carry id, fullname, body, subreddit, permalink, link_id and post_title, but author, score, parent_id and depth all come back null. Treat it as a way to find which threads to open, then resolve the detail: post_comments returns author and score for every comment in a thread, and user with kind=comments returns them per account (a measured spez comment came back with author spez, score 8 and parent_id t1_p1wd2fi).
What is the Reddit API?
Reddit API is a ReefAPI endpoint group for posts, comments, subreddits and search. It returns live JSON through POST requests under /reddit/v1.
Is the Reddit API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. Reddit calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Reddit login or account?
No login to Reddit is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Reddit data?
The page example is captured from a live subreddit_posts call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Reddit API use?
Reddit actions currently cost 1-5 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call Reddit from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call reddit actions with the same key, credit pool and JSON envelope used by normal REST requests.