RedditAPIs
NPM · REDDITAPIS-MCP · 2 COMPONENTS
Reddit API as MCP tools: search, subreddits, posts, comments, users, monitors, webhooks, feedback.
Available components
Last scanned (1 hour ago)
Scores higher than 81% of npm servers
Category News and Social
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security98
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- No install/post-install scripts declared.Pass
- 30 of 92 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency45
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 0 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability76
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 20633 tokens (~327/item across 63 items; 60 tools + 3 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 6 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 62 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 5 Nov 26 0
- Package version: 0.15.0 → 0.16.0 functional
- 4 Nov 26 0
- Security disclosure: unverified → fail ▼ functional
- 3 Nov 26 0
- Security disclosure: fail → unverified ▼ functional
- 30 Oct 26 0
- Stability: 0.97 → pass security
- Security disclosure: unverified → fail ▼ functional
- 29 Oct 26 +1
- Security disclosure: fail → unverified ▼ functional
- 27 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.
- 25 Oct 26 +1
- Stability: 0.80 → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- Schema quality: 18114 → 20342 ▼ functional
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Schema quality: 100 → unverified ▼ functional
- Package version: 0.12.0 → 0.15.0 functional
- Package version: 0.12.0 → 0.14.1 functional
- 23 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 73 to 77. That category is still filling its 30-day observation window: 22 days of observed history at the previous scan, 23 at this one. The score rises as the window fills, whether or not the server changes.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Analysed npm/redditapis-mcp@0.16.0
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | npm |
Background: How many MCP packages publish verified provenance →
Dependencies 92 packages
| Packages resolved | 92 |
|---|---|
| Stale | 30 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
reddit_account_me Get Account Balance ~58
Returns the remaining credit balance and usage totals of the account behind this API key. Free: not metered, and costs no credit. A 402 from a metered call means the balance is exhausted; that response carries a top-up URL.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
reddit_account_payments List Account Payments ~54
Returns the payment history of the account behind this API key: each top-up's amount, the credits it added, its status and when it happened, newest first. Free: not metered, and costs no credit.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
reddit_ads_search Search Reddit Ads ~291
Search the Reddit ads library: promoted posts advertisers run on Reddit, with advertiser, title, landing page, call to action, media, every subreddit each ad appeared in, first and last seen dates and sightings. Reddit's own house ads are excluded. Newest first; page with cursor. Billed at the read rate, the same as a post search.
| Name | Type | Req | Description |
|---|---|---|---|
| advertiser | string | – | Advertiser username. A u/ prefix is stripped. |
| campaign_id | string | – | Reddit campaign id, as returned in an ad's `campaign_id`. |
| cursor | string | – | Pagination cursor: the previous response's `after` value, passed back exactly. A null `after` (has_more false) means there is no next page. Absent on the opening page. |
| domain | string | – | Landing page hostname, e.g. shop.example.com. |
| limit | integer | – | Number of ads to return, 1 to 100 (default 25). |
| q | string | – | Text to find in the ad title or the advertiser name, up to 200 characters. |
| since | string | – | ISO 8601 date: only ads last seen on or after it. |
| subreddit | string | – | Subreddit the ad was seen in. An r/ prefix is stripped. |
| until | string | – | ISO 8601 date: only ads first seen on or before it. |
No output schema declared.
No examples provided.
reddit_by_id Get Posts by ID ~199
Bulk-fetches posts by their t3_ fullnames in ONE call (up to 100), in place of a request per post. Takes a comma-separated list of fullnames from a search or listing. Returns posts with title, author, score, comment count, and permalink, the same post shape as the listing endpoints. The result is not necessarily one-to-one with the request, and `meta` reports which: `listing_status` is `complete` only when every fullname came back, `truncated` is a boolean, and `missing_fullnames` names exactly which ids did not come back. Example: fullnames='t3_abc123,t3_def456'.
| Name | Type | Req | Description |
|---|---|---|---|
| fullnames | string | yes | Comma-separated post fullnames, each a t3_ prefix followed by the base-36 id (e.g. 't3_abc123,t3_def456'). Up to 100. Required (path parameter). |
No output schema declared.
No examples provided.
reddit_comment Post Comment ~93
Posts a comment on a Reddit post as the connected account. A public action on Reddit under the customer's name, marked as a write so a client can ask before it runs. The text is posted as Reddit markdown. Billed at the write rate. With no connected session it answers 400 asking for cookies.
| Name | Type | Req | Description |
|---|---|---|---|
| post_url | string | yes | Any reddit.com post URL. |
| text | string | yes | The comment text. |
No output schema declared.
No examples provided.
reddit_connect Connect Reddit Account ~187
Stores the customer's own Reddit session once, so the comment, submit, vote and DM tools in this server act as that account without cookies in later calls. The session is kept server-side, encrypted (AES-256-GCM, key held only by the API), against this API key's account, after a check with Reddit: a logged-out session is refused with SESSION_LOGGED_OUT. Takes Reddit's session and loid cookies (from the REST login endpoint or the customer's own browser), plus the CSRF cookie for voting and messaging. Connecting again replaces the stored session. Free.
| Name | Type | Req | Description |
|---|---|---|---|
| csrf_token | string | – | The CSRF cookie. Needed for voting and messaging. |
| loid | string | yes | The loid cookie. |
| reddit_session | string | yes | Reddit's session cookie. |
| token_v2 | string | – | The token_v2 cookie, when the session has one. |
No output schema declared.
No examples provided.
reddit_deep_comment_search Deep Comment Search ~962
Comment search that returns the ACTUAL comments whose body matches the keyword, sorted by score (highest first), with body, score, author, a comment-deep permalink, and the parent post. It fetches each matching post's comment tree and filters the comment bodies, so the results are first-hand opinions and answers rather than parent posts. Premium call (it fans out into several reads): `limit` sets how many parent POSTS to expand, 1-25 (default 5), not how many comments come back. The response's `after` cursor expands the NEXT batch of parent posts. `max_comments` optionally caps how many comments come back (the top-scored are kept). Matching is on the visible comment text at word boundaries (link URLs are ignored), so every result mentions the query where a reader can see it. Best-effort: a deleted or deeply-nested comment may be missed (meta.truncated flags when a tree was too deep). Each parent post is its own comment-tree read and one can fail while the others succeed: meta.partial is true with meta.trees_failed and meta.trees_fetched when that happened, so the result covers fewer parent posts than it scanned; the call fails only when every tree failed and at least one was refused upstream. group_by='author' switches to a research mode that returns WHO is talking about the query (distinct people ranked by matching-comment count) in place of a flat comment list, capped by max_authors. Example: q='best mechanical keyboard' sort='relevance' t='year'.
| Name | Type | Req | Description |
|---|---|---|---|
| after | string | – | Opaque pagination cursor: the previous response's `after` value, exactly as it was returned. The format is not stable, and a hand-written Reddit fullname loses the paging depth the cursor carries. Ab… |
| group_by | string | – | 'author' selects the RESEARCH mode: the distinct PEOPLE who mentioned the query, ranked by how many of their comments matched (then total score), in place of a flat comment list. Each author has comm… |
| limit | integer | – | Number of parent POSTS to expand into their comment trees (1-25, default 5). Each is one upstream read, so higher = deeper coverage but slower and more expensive. Beyond 25, the `after` cursor pages… |
| max_authors | integer | – | Applies only with group_by='author'. Optional cap on how many people are returned (the most prolific first). Absent, every author is returned. meta.authors_capped is true when this trimmed the list. |
| max_comments | integer | – | Optional cap on how many comments are returned; the highest-scored are kept. Absent, every match is returned. meta.capped is true when this trimmed the result. |
| nsfw | string | – | 'true' includes over-18 / NSFW results; 'false' or omitted excludes them (default). |
| q | string | yes | Search query text. Supports Reddit search syntax (e.g. `subreddit:webdev`, `author:spez`, `"exact phrase"`, `title:...`). |
| sort | string | – | Sort order for search. 'relevance' = best match (default), 'top' = highest score in the `t` window, 'new' = most recent, 'hot' = trending, 'comments' = most-discussed. Only 'relevance' weights how we… |
| t | string | – | Time window that bounds which posts the search returns, e.g. 'week' = only posts from the past week. Unlike a subreddit listing, search applies this to the 'relevance' and 'top' sorts too. When omitt… |
No output schema declared.
No examples provided.
reddit_disconnect Disconnect Reddit Account ~52
Deletes the stored Reddit session for this account. After this, the write tools answer with a request for cookies until a session is connected again. Idempotent: `deleted` is false when nothing was stored. Free.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
reddit_dm Send Direct Message ~112
Sends a private Reddit chat message as the connected account. A direct message to a real person under the customer's name, marked as a write so a client can ask before it runs. Messaging needs the CSRF cookie in the stored session. Billed at the DM rate.
| Name | Type | Req | Description |
|---|---|---|---|
| message | string | yes | Plain-text message body. |
| to_user_t2 | string | – | Recipient t2_ id directly, instead of to_username. |
| to_username | string | – | Recipient username. Provide this or to_user_t2. |
No output schema declared.
No examples provided.
reddit_explain Explain Fetched Rows ~253
Returns the provenance of the rows this server has already fetched in this session: per completed call, the tool that made it, the endpoint it reached, the timestamp the response arrived, how many seconds old that copy now is, the upstream request id and the response size. Provenance is recorded per call, so every row in one response shares it. The redditapis.com read path holds no response cache for customer reads, so each call is served live at the moment it runs and the age reported here is the age of this session's copy of the rows rather than the age of a stored row; `response_cache` says so in the result. The ledger holds the 20 most recent completed calls, lives in memory, starts empty, is scoped to this server and carries no other caller's calls. How long each category of data is kept is published at https://www.redditapis.com/privacy-and-data-handling.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Optional count of calls returned, 1 to 20, newest first. Default 5. |
| tool | string | – | Optional tool name that restricts the result to calls made by that tool. Absent, the most recent calls by any tool are returned. |
No output schema declared.
No examples provided.
reddit_feedback_get Get Feedback Report ~103
Returns the status of a feedback report this account sent earlier, by its server id: status new, triaged, shipped or declined, the team's response text if any, and updated_at, which moves only when the team acts on it. Free per call. 404 if the id is not on this account.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | The server id of a sent report (a UUID), as returned when the report was sent. Not a local draft id. |
No output schema declared.
No examples provided.
reddit_feedback_list List Feedback Reports ~296
Lists the feedback reports this account has sent, newest first, with each one's current status. The server id is returned only once, when a report is sent, so this listing is how a report whose id was not kept is found again; it also shows whether a report landed and whether the team has acted on it. Optional filters by status or type; paging uses the cursor from a previous response. Free per call, not metered. Returns {feedback: [...], count, limit, next_cursor}; pages continue while next_cursor is non-null, and an account that has filed nothing gets an empty list and a 200, not an error. It lists SENT reports on the server, which differ from the unsent local drafts on this machine.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | Optional. The next_cursor from a previous response, for the page after it. Keyset paging on (created_at, id), so a report filed during paging cannot make a row repeat or be skipped. A cursor this end… |
| limit | integer | – | Optional. How many are returned, 1 to 100 (default 25). Newest first. |
| status | string | – | Optional. Restricts the list to reports in this state; absent, every state. |
| type | string | – | Optional. Restricts the list to reports of this kind; absent, every kind. |
No output schema declared.
No examples provided.
reddit_feedback_send Send Feedback Report ~518
Reports a product problem or gap in redditapis.com to its team, through a local draft queue. action "draft" (the default) writes a report to a queue on this machine and sends nothing; it makes no network call. action "list" returns the pending drafts with their ids. action "send" posts the named draft ids to POST /feedback (free, not metered) and returns a server id per report. action "discard" drops the named drafts. The queue holds at most 10 drafts; a draft past that is refused. A draft takes `type`, a one-line `title` (at most 120 characters), `details` (at most 8000 characters) and optional `area` and `evidence`; evidence keys left out (tool, endpoint, HTTP status, request id) are filled from the last failing call in this session, and the MCP version and client name are attached to every report.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | – | "draft" (default) queues a new report locally and sends nothing. "list" returns the pending drafts with their ids. "send" posts the drafts named in `ids` to redditapis.com. "discard" drops the drafts… |
| area | string | – | Optional. The endpoint or feature the report is about, e.g. "posts/comments" or "monitoring". At most 80 characters. |
| details | string | – | Required for a draft. At most 8000 characters: three labelled bullets, What happened, Repro, Evidence, optionally preceded by a one-line summary of the goal. No quotes of the conversation. |
| evidence | object | – | Optional identifiers, {tool, endpoint, status, request_id}, at most 4096 bytes serialized. Keys left out are filled from the last failing call in this session; mcp_version and client are attached to… |
| ids | array | – | For action "send" or "discard": the draft ids to act on, as returned by action "list". |
| title | string | – | Required for a draft. One line, at most 120 characters, naming the tool or endpoint and the defect, e.g. "GET /api/reddit/comments returns 502 when the post is deleted". |
| type | string | – | Required for a draft. "bug": a tool or endpoint misbehaved. "idea": a change that would have made the task easier. "missing_capability": a needed capability that no tool provides. |
No output schema declared.
No examples provided.
reddit_home_feed Home Feed ~521
Reads the caller's own Reddit home feed, the front page their subscriptions produce. The other read tools are served from a shared pool of accounts and so cannot return a personal feed; this one sends the caller's session. Requires the caller's Reddit session cookies (session and loid) from POST /api/reddit/login on the REST API, which is not an MCP tool. Without them it returns 400, because Reddit's logged-out front page is a different feed belonging to nobody rather than a thinner version of the caller's. Same post shape and `after` cursor as the subreddit listing. Example: sort='best' limit=25.
| Name | Type | Req | Description |
|---|---|---|---|
| after | string | – | Opaque pagination cursor: the previous response's `after` value, exactly as it was returned. The format is not stable, and a hand-written Reddit fullname loses the paging depth the cursor carries. Ab… |
| limit | integer | – | Maximum items returned, 1 to 100. The API clamps out-of-range values; the endpoint default applies when omitted. |
| loid | string | yes | The caller's Reddit loid cookie, from the same login response. Required, together with the session cookie. |
| proxy | string | – | Optional proxy this read egresses through, so the request reaches Reddit from the IP this account normally acts from. http://user:pass@host:port or host:port. Pinned across retries. |
| reddit_session | string | yes | The caller's Reddit session cookie, from POST /api/reddit/login on the REST API (a REST call, not an MCP tool). Sent as a request header, not in the URL. Required. |
| sort | string | – | Feed sort. 'best' (default) is Reddit's own logged-in home sort. 'top'/'controversial' also take `t`. |
| t | string | – | Time window, only applied when sort is 'top' or 'controversial'. E.g. 'week' = top of the past week. Ignored for other sorts. |
| token_v2 | string | – | The caller's Reddit token_v2 cookie, from the same login response. Optional. |
No output schema declared.
No examples provided.
reddit_monitor_add Create Monitor ~1,778
Creates a Reddit monitor: watches one or more subreddits, or ALL of Reddit, for new posts (or comments, via `kind`) matching a filter, and delivers every match to the account's registered webhooks. With `subreddit` absent and `q` set, it is a sitewide keyword monitor covering every subreddit at once (posts only). By default matches go to EVERY active webhook on the account; `webhook_ids` routes this monitor's matches to specific webhooks. Every redditapis.com account holds a free entitlement of ONE all-of-Reddit post watch at a 60s cadence (up to 10,000 deliveries a day), so that monitor needs no subscription. Naming a `subreddit`, matching comments, a faster cadence and any additional watch require a paid plan. Needs at least one free monitor slot (the `slots` object in the monitor list). Forward-looking only, from the moment of creation or from `baseline_item_id` if given; posts that already existed are not backfilled. Returns the created monitor (with its `id`) on success, or `subscription_required` (402) if the account holds no recognised entitlement at all, `subreddit_scope_requires_paid_plan` (402) if a free account named a `subreddit`, `monitor_slots_exhausted` (402) if the plan's slot limit is reached, `sitewide_slots_exhausted` (402) if the plan's separate sitewide cap is reached, `distinct_subreddit_limit_reached` (402) if the account already watches as many DIFFERENT subreddits as the plan covers (the limit counts distinct subreddits across all the account's monitors, not monitors, and the same subreddit in two monitors counts once; `slots.distinct_subreddits_total` in the monitor list), `sitewide_comment_monitoring_not_available` (501) if a sitewide monitor asks for comments, `subreddit_reserved` (400) if `subreddit` names 'all', `subreddit_not_found` (400) if a named subreddit does not exist, or `webhook_not_found` (400) if a `webhook_ids` entry is not on this account.
| Name | Type | Req | Description |
|---|---|---|---|
| author | string | – | Matches only posts by this Reddit username (without u/). |
| baseline_item_id | string | – | A Reddit post fullname (e.g. 't3_abc123') used as the starting point in place of 'now': matching starts strictly after this item. Absent, matching starts from the moment of creation. |
| cadence_s | integer | – | Requested poll interval in seconds. A value at or above the plan tier's floor is honoured; a lower value is silently clamped up to the tier's minimum. Absent, the tier's default applies. |
| domain | array | – | Outbound link domains to watch for (e.g. ['example.com']). Matches the post's link URL, any URL inside a self-post/comment body, and a crosspost's original link, including one that only appeared in t… |
| exclude_subreddits | array | – | Subreddits to SUPPRESS, without the r/ prefix (e.g. ['politics', 'AskReddit']). SITEWIDE MONITORS ONLY: accepted when `subreddit` is absent and `q` anchors the monitor; sent together with `subreddit`… |
| exclude_terms | array | – | Posts containing any of these terms are suppressed even when they otherwise match, e.g. 'giveaway' excluded from a brand-mention monitor. |
| group | string | – | Optional label that bundles multiple matches into one delivery in place of one webhook call per match. Absent, each matching item is its own delivery. |
| include_all | array | – | A post qualifies only when EVERY one of these terms appears (AND match), on top of any `q`. |
| include_any | array | – | A post qualifies when at least ONE of these terms appears (OR match), on top of any `q`. |
| kind | string | – | What to watch in the named subreddits: 'post' (default when omitted), 'comment', or 'both'. Comment monitoring requires a Growth, Pro or Scale plan; on a lower tier this returns `comment_monitoring_r… |
| min_relevance | integer | – | AI relevance floor, 0-100. 0 (the default) is off. Above 0, every match is scored by a language model against this monitor's own keywords and anything below the floor is NOT delivered: it is recorded… |
| min_score | integer | – | Matches only posts with at least this many upvotes. |
| nsfw | boolean | – | false EXCLUDES NSFW/over-18 posts. Omitted or true both let NSFW through; there is no exclude-by-default, and only an explicit false filters it. POSTS ONLY: nsfw=false is REJECTED with a field-level… |
| q | string | – | Free-text keyword or phrase to match, against the fields in `search_in` (default title+body+url). Absent, every new post in the watched subreddits matches. |
| search_in | array | – | Which fields keyword/term matching is scoped to. Default ['title', 'body', 'url']. A narrower scope avoids false positives, e.g. a term that only appears in a URL slug matching a post that does not m… |
| subreddit | array | – | Subreddits to watch, without the r/ prefix (e.g. ['SaaS', 'startups']). 1 to 50. Absent, with `q` set, the monitor watches ALL of Reddit for that keyword. A monitor is anchored by a subreddit list, a… |
| webhook_ids | array | – | Webhook ids that restrict this monitor's delivery to those webhooks. Omitted or an empty array means the default: delivery to every active webhook on the account. An id that is not a webhook on this… |
No output schema declared.
No examples provided.
reddit_monitor_deliveries List Monitor Deliveries ~427
Delivery history: the actual Reddit posts a monitor's webhook has received (or attempted), newest first, including the real post content (title, subreddit, permalink, author). It records what was sent, not only how many (the counts are in monitor health). Every delivered item also carries `payload.items[].enrichment`: a `relevance.score` (0-1, how much of THIS monitor's own keyword criteria the item matched; not a model's confidence), a `sentiment` (`polarity` -1 to 1 plus a positive/negative/mixed/neutral `label`), and an `intent.tag` (question, recommendation_request, complaint, promotion, praise, or discussion). All three are deterministic keyword, lexicon and rule heuristics computed at no extra cost; each carries its own `method` field and none of them is a machine-learning or LLM call. Without `id`, the history aggregates across every monitor on the account.
| Name | Type | Req | Description |
|---|---|---|---|
| before | string | – | ISO 8601 timestamp cursor for pagination: the `created_at` of the oldest row from the previous page returns older deliveries. |
| id | string | – | Narrows to one monitor's history. Absent, the history aggregates across every monitor on the account. |
| limit | integer | – | Maximum rows returned, 1 to 200. Default 50. |
| status | string | – | Filters to one delivery status. 'dead' = retries exhausted, gave up. 'suppressed' = matched but deliberately not sent, and `payload.suppressed.reason` says which of the two reasons applied: 'delivery… |
No output schema declared.
No examples provided.
reddit_monitor_health Monitor Health ~1,236
Per-monitor health: active state, poll cadence, when it last matched something, and delivery counts for the last 24h (`delivered_24h`, `failed_24h`, `suppressed_24h`), plus whether its delivery ceiling has been hit (`ceiling_reached`) and what that ceiling is (`daily_delivery_ceiling`). `suppressed_24h` COUNTS TWO DIFFERENT THINGS AND `suppressed_breakdown` SPLITS THEM: `ceiling` (the monitor's daily cap was reached) and `stale` (the item was already older than the freshness window when first seen, so it was withheld rather than delivered as if it were new). A stale withhold is the usual reason a monitor's delivered count sits far below its matched count with no error anywhere; it is the freshness gate working as intended, not a failure or a plan limit, and retrying cannot recover the items. `ceiling_reached` is the field that indicates the daily cap was hit, and a stale withhold does not set it. When `suppressed_breakdown.resolved` is false the split does not add up to the total and `unresolved_reason` says why; `ceiling_reached` stays conservative in that case rather than being cleared. THOSE COUNTS COVER ONLY POSTS THAT WERE FETCHED. A post that was not fetched was not matched and leaves no row behind, so it is absent from all three counters; zeros there mean no matches were recorded, not that nothing was missed. `coverage_24h` is the separate field that speaks to fetching. Its `status` is `complete` (every poll reached the point where the previous poll finished), `degraded` (at least one poll was truncated and posts were lost unrecoverably; detail in `gaps[]`, `posts_in_window_at_least` and the estimated `posts_missed_estimate`), `partial` (nothing found, but not every kind of loss was checked; detail in `unobserved_events`), or `unknown` (the check could not be run at all; detail in `reason`). `unknown`, `partial` and a null count each mean the question went unanswered. `coverage_24h` is fed by the poll log and covers BOTH ways a poll loses posts unrecoverably…
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | The monitor's id, as returned when the monitor was created or listed. |
No output schema declared.
No examples provided.
reddit_monitor_list List Monitors ~147
Lists every monitor on the caller's account, with each one's filter, active state, and cadence, plus a `slots` object ({used, total, tier}) showing how many monitor slots are purchased vs in use. Reading the list requires no active plan (a lapsed subscription shows an empty or paused list, not an error). A null `webhook_ids` is the default and means matches go to EVERY active webhook on the account, the normal healthy state, not a monitor without a destination; a non-empty array narrows delivery to those webhook ids. Where a monitor's matches actually went is recorded per delivery, as the resolved `webhook_id` on each delivery row.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
reddit_monitor_remove Delete Monitor ~114
Deletes a monitor. There is no undo endpoint: it stops matching immediately, its slot is freed for a new monitor, and it disappears from the monitor list. Its past deliveries are NOT erased; they remain queryable in the delivery history (both by monitor id and in the aggregate, no-id view) indefinitely. Returns 404 `monitor_not_found` if the id does not exist or is not on this account.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | The monitor's id, as returned when the monitor was created or listed. |
No output schema declared.
No examples provided.
reddit_monitor_update Update Monitor ~1,530
Updates an existing monitor: pauses or resumes it (`active`), changes its poll interval (`cadence_s`), switches between posts and comments (`kind`), replaces its filter entirely, or re-targets which webhooks it delivers to (`webhook_ids`). Any filter field (subreddit, q, kind, domain, etc.) REPLACES the whole filter: it does not merge with the existing one, so a field absent from the request is cleared, and a request without `kind` reverts the monitor to posts-only. `webhook_ids` likewise REPLACES the monitor's targeting outright (an empty array clears back to every active webhook); a request without it leaves the existing targeting untouched. A request with only `active` and/or `cadence_s` changes only those. Returns 404 `monitor_not_found` if the id does not exist or is not on this account, or 400 `webhook_not_found` if a `webhook_ids` entry is not on this account.
| Name | Type | Req | Description |
|---|---|---|---|
| active | boolean | – | false pauses the monitor (stops matching and delivering); true resumes it. |
| author | string | – | Matches only posts by this Reddit username (without u/). |
| cadence_s | integer | – | New poll interval in seconds, clamped to the tier floor the same way as at creation. |
| domain | array | – | Outbound link domains to watch for (e.g. ['example.com']). Matches the post's link URL, any URL inside a self-post/comment body, and a crosspost's original link, including one that only appeared in t… |
| exclude_subreddits | array | – | Subreddits to SUPPRESS, without the r/ prefix (e.g. ['politics', 'AskReddit']). SITEWIDE MONITORS ONLY: accepted when `subreddit` is absent and `q` anchors the monitor; sent together with `subreddit`… |
| exclude_terms | array | – | Posts containing any of these terms are suppressed even when they otherwise match, e.g. 'giveaway' excluded from a brand-mention monitor. |
| group | string | – | Optional label that bundles multiple matches into one delivery in place of one webhook call per match. Absent, each matching item is its own delivery. |
| id | string | yes | The monitor's id, as returned when the monitor was created or listed. |
| include_all | array | – | A post qualifies only when EVERY one of these terms appears (AND match), on top of any `q`. |
| include_any | array | – | A post qualifies when at least ONE of these terms appears (OR match), on top of any `q`. |
| kind | string | – | What to watch in the named subreddits: 'post' (default when omitted), 'comment', or 'both'. Comment monitoring requires a Growth, Pro or Scale plan; on a lower tier this returns `comment_monitoring_r… |
| min_relevance | integer | – | AI relevance floor, 0-100. 0 (the default) is off. Above 0, every match is scored by a language model against this monitor's own keywords and anything below the floor is NOT delivered: it is recorded… |
| min_score | integer | – | Matches only posts with at least this many upvotes. |
| nsfw | boolean | – | false EXCLUDES NSFW/over-18 posts. Omitted or true both let NSFW through; there is no exclude-by-default, and only an explicit false filters it. POSTS ONLY: nsfw=false is REJECTED with a field-level… |
| q | string | – | Free-text keyword or phrase to match, against the fields in `search_in` (default title+body+url). Absent, every new post in the watched subreddits matches. |
| search_in | array | – | Which fields keyword/term matching is scoped to. Default ['title', 'body', 'url']. A narrower scope avoids false positives, e.g. a term that only appears in a URL slug matching a post that does not m… |
| subreddit | array | – | Subreddits to watch, without the r/ prefix (e.g. ['SaaS', 'startups']). 1 to 50. Absent, with `q` set, the monitor watches ALL of Reddit for that keyword. A monitor is anchored by a subreddit list, a… |
| webhook_ids | array | – | Webhook ids that restrict this monitor's delivery to those webhooks. Omitted or an empty array means the default: delivery to every active webhook on the account. An id that is not a webhook on this… |
No output schema declared.
No examples provided.
reddit_monitor_webhook_create Create Webhook ~297
Registers a delivery target for monitors to send matches to. Requires an active monitoring plan (a webhook with no plan could not receive anything). Returns the webhook with its signing `secret` SHOWN ONCE: the webhook list does not return it again. HTTPS only; the URL is re-validated (including a fresh DNS check) at every delivery, not just at creation.
| Name | Type | Req | Description |
|---|---|---|---|
| kind | string | – | Payload shape. Absent, the kind is inferred from the host for a hooks.slack.com or discord.com/api/webhooks URL, and the response reports the inference in `kind_inferred_from`. 'slack'/'discord' form… |
| url | string | yes | HTTPS URL that receives matches. Accepted: a publicly reachable HTTPS URL with no embedded credentials and no loopback, private or link-local address. |
No output schema declared.
No examples provided.
reddit_monitor_webhook_delete Delete Webhook ~95
Permanently deletes a webhook. A monitor still pointing at it fails to deliver until it is repointed at a different webhook: deletion does NOT cascade-delete or pause the monitors using it. Cannot be undone. Returns 404 `webhook_not_found` if the id does not exist or is not on this account.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | The webhook's id, as returned when the webhook was created or listed. |
No output schema declared.
No examples provided.
reddit_monitor_webhook_list List Webhooks ~36
Lists every webhook registered on the caller's account. The signing secret is not included; it is shown once, at creation.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
reddit_monitor_webhook_test Send Webhook Test ~224
Sends a one-off test delivery to a registered webhook (rate-limited to 10/min), confirming it is wired up correctly before a real match arrives. The test payload is formatted by the webhook's `kind`, the same way a real delivery would be. On failure the response carries `reason` and `status`, plus `hint`, a sentence naming the fix (most often that the target's `kind` does not match its host, which no test can succeed through), and `detail`, a bounded, sanitised copy of what the destination itself replied. `hint` carries the remedy; a bare `reason` such as `http_error` with a 400 names no field, no value and no remedy. Returns 404 `webhook_not_found` if the id does not exist or is not on this account, or `webhook_url_rejected` if the URL fails re-validation (e.g. now resolves to a private address).
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | The webhook's id, as returned when the webhook was created or listed. |
No output schema declared.
No examples provided.
reddit_post Get Post ~93
Fetches a single Reddit post by its id. Returns the full post object (title, author, score, text, permalink, subreddit, url). Example: id='abc123' (the base-36 id, no t3_ prefix).
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | The post's base-36 id (e.g. 'abc123'), without the 't3_' fullname prefix. Required (path parameter). |
No output schema declared.
No examples provided.
reddit_post_comments Get Post Comments ~321
Fetches a single post and its comment tree by permalink. Returns the post plus threaded comments (author, body, score, replies) and an `after` cursor. The `permalink` is the one carried by any post result. Size a big thread with the three knobs: `limit` caps top-level comments (1-500, default 100), `depth` caps reply depth (1-10; `depth=1` is top-level only; absent is the full tree) and `sort` orders them (confidence = Reddit's best, top, new, controversial, old, qa). `limit=20, depth=1, sort='top'` reads the twenty best top-level comments and nothing below them, which keeps a 2,700-comment thread readable. `meta` echoes limit_used, depth_used and sort_used.
| Name | Type | Req | Description |
|---|---|---|---|
| depth | integer | – | Maximum reply depth, 1-10. depth=1 returns top-level comments only. Absent, Reddit's full tree is returned. |
| limit | integer | – | Maximum top-level comments, 1-500 (default 100). A small value with depth=1 gives a readable summary of a large thread. |
| permalink | string | yes | The post permalink path from a prior post result, e.g. '/r/programming/comments/abc123/some_title/'. Required. |
| sort | string | – | Comment ordering: confidence (Reddit's best), top, new, controversial, old or qa. Absent, Reddit's default for the thread. |
No output schema declared.
No examples provided.
reddit_post_duplicates Get Post Duplicates ~211
Every other Reddit post that shares this post's link: the list Reddit shows on a post's "other discussions" tab, across all subreddits, so every conversation about one article, video or product page can be read, not only the first thread found. Returns the original `post`, `duplicates` (up to 100 in one read, not paged, `after` is null) and `available` (how many Reddit returned). A made-up or removed post id is a 404 NOT_FOUND. A text post usually has none.
| Name | Type | Req | Description |
|---|---|---|---|
| crossposts_only | boolean | – | true returns only crossposts and leaves out independent submissions of the same URL. |
| id | string | yes | Reddit post id, e.g. '1sgjld3'. A t3_ prefix is optional. |
| limit | integer | – | How many duplicates to return, 1-100 (default 100). |
| sort | string | – | num_comments (default, most discussed first) or new. |
No output schema declared.
No examples provided.
reddit_post_visibility Post Visibility ~235
Is a post still publicly visible, or did it quietly stop being so? A removed Reddit post still returns when fetched by id, so the post alone does not answer this. This fetches the post and then one page of its author's submitted listing and compares them. Returns a verdict of live, not_visible or undecidable, a plain-language reason, and a confident flag. By design it does not say WHY a post is not visible: a moderator removal, an admin removal, a spam filter and an author who has hidden their history are indistinguishable from outside. undecidable is a real answer, not a failure. When the post resolves but the author listing read fails, the answer is still returned as undecidable with checked.author_listing false and checked.listing_error naming why (upstream_unavailable or upstream_timeout: our read was refused, not billed; listing_unavailable: Reddit answered the listing with 403 or 404, billed). Two upstream calls, billed as one $0.004 dual read.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Reddit post id, base36, with or without the t3_ prefix |
No output schema declared.
No examples provided.
reddit_scheduled_cancel Cancel Scheduled Action ~125
Cancels a scheduled post or comment by its id, while it has not run yet. Returns `cancelled`, the `action` and a `message`. An action that was still scheduled comes back with cancelled true: it will not run and is not charged. An action that already ran, or is running, comes back with cancelled false and its current status, and nothing changes. 404 NOT_FOUND when the id is not a scheduled action on this account. Free.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | The action id, as returned when the action was scheduled or listed. |
No output schema declared.
No examples provided.
reddit_scheduled_create Schedule Reddit Action ~436
Schedules a Reddit post or comment to be made later as the connected account, at `run_at` (60 seconds to 30 days ahead). At that time the stored request runs through the same path a live post submission or comment takes, as the Reddit session connected when it runs, so a session logged out in between makes the run fail without a charge. A public action on Reddit under the customer's name, marked as a write so a client can ask before it runs; a subreddit's rules decide whether a post stays up. Due actions are picked up every 30 seconds and run one at a time, normally within about a minute of `run_at`. A failed run is not retried: it is recorded as failed with Reddit's reason. Up to 100 actions can wait per account (409 SCHEDULE_LIMIT_REACHED past that). Scheduling is free; a run that succeeds is billed at the write rate to this API key, and a failed or cancelled one is not charged. With no connected session it answers 400 SESSION_NOT_CONNECTED. Returns 201 with `action`: `id`, `type`, `status` (scheduled), `run_at`, the stored `request`, `created_at`, `finished_at`, `result`, `error` and `billed`.
| Name | Type | Req | Description |
|---|---|---|---|
| request | object | yes | The body the live route takes, without cookies or a proxy. A post takes subreddit, kind and title, plus text or url and the optional flair and flag fields; a comment takes post_url and text. A field… |
| run_at | – | yes | When it runs: an ISO 8601 timestamp with a time zone (e.g. '2026-10-21T15:00:00Z' or '2026-10-21T17:00:00+02:00') or Unix seconds. 60 seconds to 30 days ahead. A timestamp without a zone is refused. |
| type | string | yes | post = a new post in a subreddit, comment = a comment on a post. |
No output schema declared.
No examples provided.
reddit_scheduled_list List Scheduled Actions ~205
Lists this account's scheduled posts and comments, newest first. Returns `actions` and `count`. Each action carries `id`, `type`, `status` (scheduled, running, succeeded, failed or cancelled), `run_at`, the stored `request`, `created_at`, `finished_at`, `result` (what the post or comment returned, when the run succeeded), `error` (`code`, `message` and `http_status`, when the run failed) and `billed`: true for a run that succeeded, false for one that failed with an answer or was cancelled, null when the outcome was not confirmed (error EXECUTION_UNCONFIRMED or EXECUTION_INTERRUPTED, where the post or comment may still have been made and charged). Free.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Maximum actions returned, 1 to 100. Default 50. |
| status | string | – | Only actions in this status. Absent, every status is listed. |
No output schema declared.
No examples provided.
reddit_search Search Posts ~1,036
Searches Reddit posts across all of Reddit or within one subreddit. Returns matching posts with author, score, comments, permalink, and an `after` cursor. `subreddit` scopes the search to one community. Optional advanced filters narrow the results by minimum/maximum score, comment count, media type, and post flags, with an optional re-sort of the page. Filters apply to the returned page, so a filtered response carries a `meta` object with page-completeness counts, and the next page comes from `after`. SORT BEHAVIOUR, measured 2026-09-11: `top`, `new` and `comments` order the MATCHING set by score, date or comment count alone, and Reddit matches loosely (image OCR, comments, and the word 'reddit' is in almost every big post), so a generic multi-word query with sort='top' and no subreddit returns the site-wide viral listing, not the topic. Even a distinctive term is ranked by score alone (q='pgvector' sort='top': 1 of 5 results was about pgvector, the rest were large posts that mention it once). Best match then highest score comes from sort='relevance' with a large `limit`, where sort_type='score' re-orders that returned page (it does not reach past the page); a quoted phrase (q='"rust vs go"') or a `subreddit` scope also narrows the matching set. Example: q='rust vs go' sort='relevance' t='year' limit=100 sort_type='score'.
| Name | Type | Req | Description |
|---|---|---|---|
| after | string | – | Opaque pagination cursor: the previous response's `after` value, exactly as it was returned. The format is not stable, and a hand-written Reddit fullname loses the paging depth the cursor carries. Ab… |
| contest_mode | boolean | – | Filters by the contest_mode flag. |
| is_self | boolean | – | true = only self/text posts, false = only link posts. |
| is_video | boolean | – | true = only video posts, false = only non-video. |
| limit | integer | – | Maximum items returned, 1 to 100. The API clamps out-of-range values; the endpoint default applies when omitted. |
| locked | boolean | – | Filters by the locked flag. |
| max_comments | integer | – | Keeps only posts with comment count <= this. |
| max_score | integer | – | Keeps only posts with score <= this. |
| min_comments | integer | – | Keeps only posts with comment count >= this. |
| min_score | integer | – | Keeps only posts with score >= this (applied to the returned page). |
| nsfw | string | – | 'true' includes over-18 / NSFW results; 'false' or omitted excludes them (default). |
| over_18 | boolean | – | Filters the page by NSFW flag (distinct from nsfw, which controls inclusion in the search). |
| q | string | yes | Search query text. Supports Reddit search syntax (e.g. `subreddit:webdev`, `author:spez`, `"exact phrase"`, `title:...`). |
| sort | string | – | Sort order for search. 'relevance' = best match (default), 'top' = highest score in the `t` window, 'new' = most recent, 'hot' = trending, 'comments' = most-discussed. Only 'relevance' weights how we… |
| sort_type | string | – | Re-sorts the filtered page (descending) by this field. Page-local: it re-orders only the posts this call returned, not the whole result set, so its reach is bounded by `limit`. |
| spoiler | boolean | – | Filters by the spoiler flag. |
| stickied | boolean | – | Filters by the stickied flag. |
| subreddit | string | – | Optional subreddit name (without r/) that restricts the search to one community. Absent, the search covers all of Reddit. |
| t | string | – | Time window that bounds which posts the search returns, e.g. 'week' = only posts from the past week. Unlike a subreddit listing, search applies this to the 'relevance' and 'top' sorts too. When omitt… |
No output schema declared.
No examples provided.
reddit_search_comments Search Posts by Comment ~561
Searches Reddit by COMMENT text. Reddit's comment search matches the keyword against comment bodies but returns the PARENT POSTS, not the individual comments, so each result is a post whose discussion mentions the query, carrying that post's title, selftext, score, and comment count. It surfaces threads where a topic comes up in the replies, which a post-title search misses. Reddit does not expose which specific comment matched or its text, so the results are posts, not comment bodies. Example: q='best mechanical keyboard' sort='relevance' t='year'.
| Name | Type | Req | Description |
|---|---|---|---|
| after | string | – | Opaque pagination cursor: the previous response's `after` value, exactly as it was returned. The format is not stable, and a hand-written Reddit fullname loses the paging depth the cursor carries. Ab… |
| limit | integer | – | Maximum items returned, 1 to 100. The API clamps out-of-range values; the endpoint default applies when omitted. |
| nsfw | string | – | 'true' includes over-18 / NSFW results; 'false' or omitted excludes them (default). |
| q | string | yes | Search query text. Supports Reddit search syntax (e.g. `subreddit:webdev`, `author:spez`, `"exact phrase"`, `title:...`). |
| sort | string | – | Sort order for search. 'relevance' = best match (default), 'top' = highest score in the `t` window, 'new' = most recent, 'hot' = trending, 'comments' = most-discussed. Only 'relevance' weights how we… |
| t | string | – | Time window that bounds which posts the search returns, e.g. 'week' = only posts from the past week. Unlike a subreddit listing, search applies this to the 'relevance' and 'top' sorts too. When omitt… |
No output schema declared.
No examples provided.
reddit_search_communities Search Communities ~272
Searches for subreddits (communities) by name or topic. Returns matching subreddits with title, subscriber count, description, and NSFW flag. Example: q='machine learning'.
| Name | Type | Req | Description |
|---|---|---|---|
| after | string | – | Opaque pagination cursor: the previous response's `after` value, exactly as it was returned. The format is not stable, and a hand-written Reddit fullname loses the paging depth the cursor carries. Ab… |
| limit | integer | – | Maximum items returned, 1 to 100. The API clamps out-of-range values; the endpoint default applies when omitted. |
| nsfw | string | – | 'true' includes over-18 / NSFW results; 'false' or omitted excludes them (default). |
| q | string | yes | Search query text. Supports Reddit search syntax (e.g. `subreddit:webdev`, `author:spez`, `"exact phrase"`, `title:...`). |
No output schema declared.
No examples provided.
reddit_search_media Search Media Posts ~540
Searches Reddit posts filtered to media (images, video, gifs). Returns media posts with the media URL/type, author, score, and the post url. `kind` narrows the results to one media type. Example: q='aurora borealis' kind='image'.
| Name | Type | Req | Description |
|---|---|---|---|
| after | string | – | Opaque pagination cursor: the previous response's `after` value, exactly as it was returned. The format is not stable, and a hand-written Reddit fullname loses the paging depth the cursor carries. Ab… |
| kind | string | – | Media type filter. 'image', 'video', 'gif', or 'all' (default). Filters the raw Reddit results to that media kind. |
| limit | integer | – | Maximum items returned, 1 to 100. The API clamps out-of-range values; the endpoint default applies when omitted. |
| nsfw | string | – | 'true' includes over-18 / NSFW results; 'false' or omitted excludes them (default). |
| q | string | yes | Search query text. Supports Reddit search syntax (e.g. `subreddit:webdev`, `author:spez`, `"exact phrase"`, `title:...`). |
| sort | string | – | Sort order for search. 'relevance' = best match (default), 'top' = highest score in the `t` window, 'new' = most recent, 'hot' = trending, 'comments' = most-discussed. Only 'relevance' weights how we… |
| t | string | – | Time window that bounds which posts the search returns, e.g. 'week' = only posts from the past week. Unlike a subreddit listing, search applies this to the 'relevance' and 'top' sorts too. When omitt… |
No output schema declared.
No examples provided.
reddit_search_users Search Users ~263
Searches for Reddit users (redditors) by name or keyword. Returns matching accounts with username, karma, and account age. Example: q='spez'.
| Name | Type | Req | Description |
|---|---|---|---|
| after | string | – | Opaque pagination cursor: the previous response's `after` value, exactly as it was returned. The format is not stable, and a hand-written Reddit fullname loses the paging depth the cursor carries. Ab… |
| limit | integer | – | Maximum items returned, 1 to 100. The API clamps out-of-range values; the endpoint default applies when omitted. |
| nsfw | string | – | 'true' includes over-18 / NSFW results; 'false' or omitted excludes them (default). |
| q | string | yes | Search query text. Supports Reddit search syntax (e.g. `subreddit:webdev`, `author:spez`, `"exact phrase"`, `title:...`). |
No output schema declared.
No examples provided.
reddit_session_status Reddit Connection Status ~60
Whether a Reddit session is connected for this account: `connected`, the Reddit username, `status` (active, or dead after Reddit rejected it), and when it was first stored, last updated and last used. The cookies are not returned. Free.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
reddit_set_watch Create Watch ~469
Creates a Reddit watch from a plain-words description in one call: the description is compiled into a monitor filter, the account's own plan capabilities are read, the monitor is created, and an HTTPS delivery target given in `deliver_to` is registered, pointed at this monitor and test-fired. The compiler reads subreddit names written as r/Name, quoted phrases as keyword terms (two or more become an any-of set), 'comments' or 'posts and comments' as the match kind, terms after 'except' or 'ignoring' as exclusions, and 'at least N upvotes' as a score floor; everything it derived comes back in `understood` and `compiled_filter`. A description naming neither a subreddit nor a keyword is refused before any request is sent, because a monitor is anchored by one or the other. On an account whose plan carries no subreddit-scoped watches, a description that names subreddits and also carries a keyword is built over every subreddit instead, and the swap is reported in `notes`. Monitor and webhook calls are not metered. The result carries the created monitor, the delivery target and its test outcome, and the account's current slot and capability figures.
| Name | Type | Req | Description |
|---|---|---|---|
| cadence_s | integer | – | Optional poll interval in seconds. A value below the plan tier's floor is clamped up to that floor. Absent, the tier default applies. |
| deliver_to | string | – | Optional HTTPS URL that receives matches. A hooks.slack.com or discord.com/api/webhooks URL has its payload shape inferred from the host; any other HTTPS URL receives the generic signed JSON envelope… |
| test_delivery | boolean | – | false skips the one-off test delivery that otherwise follows a successful `deliver_to` registration. Default true. Ignored when no `deliver_to` is given. |
| watch | string | yes | The watch, in plain words, e.g. 'watch r/SaaS and r/startups for "pricing page" except giveaways' or 'every comment mentioning "cold email" with at least 5 upvotes'. Subreddits are written as r/Name,… |
No output schema declared.
No examples provided.
reddit_submit Submit Post ~207
Submits a new post to a subreddit as the connected account: a text post (kind self) or a link post (kind link). A public action on Reddit under the customer's name, marked as a write so a client can ask before it runs; a subreddit's rules decide whether the post stays up. Billed at the write rate.
| Name | Type | Req | Description |
|---|---|---|---|
| flair_id | string | – | Post flair template id, for subreddits that require flair. |
| flair_text | string | – | Post flair text, when the flair template allows editing it. |
| kind | string | yes | self = text post, link = URL post. |
| nsfw | boolean | – | Mark the post NSFW. |
| spoiler | boolean | – | Mark the post as a spoiler. |
| subreddit | string | yes | Subreddit name, without r/. |
| text | string | – | Body text, for kind self. |
| title | string | yes | Post title. |
| url | string | – | Target URL, for kind link. |
No output schema declared.
No examples provided.
reddit_subreddit_about Get Subreddit Info ~91
Fetches a subreddit's public metadata by name (Reddit's /r/<name>/about data). Returns the subreddit's title, public description, subscriber count, active-user count, creation timestamp, type, and NSFW flag. Example: name='python'.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Subreddit name WITHOUT the r/ prefix (e.g. 'python'). Required (path parameter). |
No output schema declared.
No examples provided.
reddit_subreddit_comments List Subreddit Comments ~262
Streams the NEWEST comments across an entire subreddit (Reddit's /r/<name>/comments feed), not one post's thread. Returns comments with body, author, score, subreddit, the parent post link, and timestamp, plus an `after` cursor. Repeated calls surface new comments in a community as they are posted. Example: name='python'.
| Name | Type | Req | Description |
|---|---|---|---|
| after | string | – | Opaque pagination cursor: the previous response's `after` value, exactly as it was returned. The format is not stable, and a hand-written Reddit fullname loses the paging depth the cursor carries. Ab… |
| limit | integer | – | Maximum items returned, 1 to 100. The API clamps out-of-range values; the endpoint default applies when omitted. |
| name | string | yes | Subreddit name WITHOUT the r/ prefix (e.g. 'python'). Required (path parameter). |
No output schema declared.
No examples provided.
reddit_subreddit_flairs List Subreddit Post Flairs ~288
Lists a subreddit's post (link) flair templates by name: the flairs a new post in that community can carry. Returns `subreddit`, `count` and `flairs`, each with `id` (the value a post submission takes as flair_id), `text`, `editable` (true when a custom flair_text is accepted with that id), `type` (text or richtext), `background_color`, `text_color`, `css_class`, `mod_only`, `max_emojis`, `allowable_content` and `richtext`. Many subreddits remove a post that has no flair. Reddit lists flairs only to signed-in accounts, so the read runs as the Reddit session connected for this API key; with none connected it answers 503 SESSION_REQUIRED before Reddit is asked, and that answer is not charged. A moderator's session sees every template, mod-only ones included; any other account sees the templates it can post with, listed with mod_only false. A subreddit with no post flairs returns an empty list. Billed at the read rate, including a 403 or 404 from Reddit. Example: name='SaaS'.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Subreddit name WITHOUT the r/ prefix (e.g. 'SaaS'), 1 to 21 letters, digits or underscores. Required (path parameter). |
No output schema declared.
No examples provided.
reddit_subreddit_moderators List Subreddit Moderators ~106
Fetches a subreddit's moderator team by name (Reddit's /r/<name>/about/moderators data). Returns a `moderators` list, each with `name`, `id`, `mod_permissions`, `flair_text`, and `added` (when they joined the mod team). Example: name='python'.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Subreddit name WITHOUT the r/ prefix (e.g. 'python'). Required (path parameter). |
No output schema declared.
No examples provided.
reddit_subreddit_posts List Subreddit Posts ~440
Lists posts from a subreddit by sort order: newest, hot, top of a time window, rising, controversial or best. Returns post title, author, score, comment count, and permalink, plus an `after` cursor for paging. When `after` comes back null the response carries `listing_status`: `complete` means no older posts and is only claimed when the whole run came back in under one page, `truncated` means Reddit's cap cut the listing off, and `unknown` means completeness could not be established. A busy feed that Reddit stops serving reports `unknown`, not `complete`. Example: subreddit='programming' sort='top' t='week'.
| Name | Type | Req | Description |
|---|---|---|---|
| after | string | – | Opaque pagination cursor: the previous response's `after` value, exactly as it was returned. The format is not stable, and a hand-written Reddit fullname loses the paging depth the cursor carries. Ab… |
| limit | integer | – | Maximum items returned, 1 to 100. The API clamps out-of-range values; the endpoint default applies when omitted. |
| sort | string | – | Sort order for a subreddit listing. 'hot' = trending now, 'new' = most recent (default), 'top' = highest score in the `t` window, 'rising' = gaining fast, 'controversial' = polarizing, 'best' = Reddi… |
| subreddit | string | yes | Subreddit name WITHOUT the r/ prefix (e.g. 'programming', 'AskReddit'). Required. |
| t | string | – | Time window, only applied when sort is 'top' or 'controversial'. E.g. 'week' = top of the past week. Ignored for other sorts. |
No output schema declared.
No examples provided.
reddit_subreddit_rules Get Subreddit Rules ~114
Fetches a subreddit's posting rules by name (Reddit's /r/<name>/about/rules data). Returns a `rules` list, each with name, description, what it applies to (posts, comments, or all), violation reason, priority, and creation date, plus a `site_rules` list of Reddit's site-wide rules. Example: name='python'.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Subreddit name WITHOUT the r/ prefix (e.g. 'python'). Required (path parameter). |
No output schema declared.
No examples provided.
reddit_subreddit_top Top Subreddit Posts ~280
Gets the TOP posts of a subreddit for a time window, the highest-scoring posts of a community. Returns posts with score, author, comments, and permalink plus an `after` cursor. Example: name='science' t='month'.
| Name | Type | Req | Description |
|---|---|---|---|
| after | string | – | Opaque pagination cursor: the previous response's `after` value, exactly as it was returned. The format is not stable, and a hand-written Reddit fullname loses the paging depth the cursor carries. Ab… |
| limit | integer | – | Maximum items returned, 1 to 100. The API clamps out-of-range values; the endpoint default applies when omitted. |
| name | string | yes | Subreddit name WITHOUT the r/ prefix (e.g. 'science'). Required (path parameter). |
| t | string | – | Time window, only applied when sort is 'top' or 'controversial'. E.g. 'week' = top of the past week. Ignored for other sorts. |
No output schema declared.
No examples provided.
reddit_subreddit_wiki Subreddit Wiki Page ~176
Fetches a subreddit's wiki page by name and page (Reddit's /r/<name>/wiki/<page> data). Returns a single object with `content_md` and `content_html`, a `may_revise` flag, and the last revision (`revision_id`, `revision_date`, `revised_by`, `reason`). A wiki commonly holds a community's rules or FAQ. The page may be multi-segment, for example index, rules, or config/sidebar. Example: name='python', page='index'.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Subreddit name WITHOUT the r/ prefix (e.g. 'python'). Required (path parameter). |
| page | string | yes | Wiki page name (e.g. 'index'). Required (path parameter). May be multi-segment like 'config/sidebar'. |
No output schema declared.
No examples provided.
reddit_subreddits_default List Default Subreddits ~217
Browses Reddit's default front-page set of subreddits, with no keyword. Returns a `subreddits` list (each with name, title, subscriber count, description, type, and NSFW flag) plus an `after` cursor for paging.
| Name | Type | Req | Description |
|---|---|---|---|
| after | string | – | Opaque pagination cursor: the previous response's `after` value, exactly as it was returned. The format is not stable, and a hand-written Reddit fullname loses the paging depth the cursor carries. Ab… |
| limit | integer | – | Maximum items returned, 1 to 100. The API clamps out-of-range values; the endpoint default applies when omitted. |
No output schema declared.
No examples provided.
reddit_subreddits_new List New Subreddits ~218
Browses the newest subreddits, the communities most recently created, with no keyword. Returns a `subreddits` list (each with name, title, subscriber count, description, type, and NSFW flag) plus an `after` cursor for paging.
| Name | Type | Req | Description |
|---|---|---|---|
| after | string | – | Opaque pagination cursor: the previous response's `after` value, exactly as it was returned. The format is not stable, and a hand-written Reddit fullname loses the paging depth the cursor carries. Ab… |
| limit | integer | – | Maximum items returned, 1 to 100. The API clamps out-of-range values; the endpoint default applies when omitted. |
No output schema declared.
No examples provided.
reddit_subreddits_popular List Popular Subreddits ~220
Browses the most-subscribed, trending subreddits right now, with no keyword. Returns a `subreddits` list (each with name, title, subscriber count, description, type, and NSFW flag) plus an `after` cursor for paging.
| Name | Type | Req | Description |
|---|---|---|---|
| after | string | – | Opaque pagination cursor: the previous response's `after` value, exactly as it was returned. The format is not stable, and a hand-written Reddit fullname loses the paging depth the cursor carries. Ab… |
| limit | integer | – | Maximum items returned, 1 to 100. The API clamps out-of-range values; the endpoint default applies when omitted. |
No output schema declared.
No examples provided.
How do I install the RedditAPIs MCP server?
RedditAPIs runs locally as an npm package, launched with npx -y redditapis-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · redditapis-mcp
claude mcp add redditapis-redditapis-mcp -- npx -y redditapis-mcp
What is the RedditAPIs MCP server?
RedditAPIs is an MCP server listed in the public MCP registry as io.github.redditapis/redditapis-mcp. Reddit API as MCP tools: search, subreddits, posts, comments, users, monitors, webhooks, feedback. This page covers its npm package (redditapis-mcp).
Is the RedditAPIs MCP server safe to use?
RedditAPIs scores 84 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the RedditAPIs MCP server expose?
RedditAPIs exposes 60 tools: reddit_subreddit_posts, reddit_verify_comments, reddit_home_feed, reddit_search, reddit_post_visibility, and 55 more. Their descriptions and schemas cost roughly 20,054 tokens of context every time the server is loaded.
Is the RedditAPIs MCP server still maintained?
RedditAPIs is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the RedditAPIs MCP server under?
RedditAPIs declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.