{
  "openapi": "3.0.1",
  "info": {
    "title": "Reddit Scraper - Posts, Comments, Search + AI Analysis ✅",
    "description": "Scrape any subreddit, search across all of Reddit, and pull complete comment threads with every reply intact. Also grabs video transcripts and subreddit profiles. Optional AI sentiment and pain-point analysis with your own key. No Reddit account, no login, no cookies, no run-start fee.",
    "version": "0.0",
    "x-build-id": "KKwr1oGCrgzpBlql3"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/unseenuser~Reddit-Scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-unseenuser-Reddit-Scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/unseenuser~Reddit-Scraper/runs": {
      "post": {
        "operationId": "runs-sync-unseenuser-Reddit-Scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/unseenuser~Reddit-Scraper/run-sync": {
      "post": {
        "operationId": "run-sync-unseenuser-Reddit-Scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "1. What do you want to collect?",
            "enum": [
              "subreddit_posts",
              "reddit_search",
              "post_comments",
              "subreddit_search",
              "subreddit_info",
              "post_transcript"
            ],
            "type": "string",
            "description": "Choose the job. Whatever you pick here decides what to paste into the box below - the option text tells you which. Example: pick \"Posts from a subreddit\" and paste r/SaaS.",
            "default": "subreddit_posts"
          },
          "targets": {
            "title": "2. Paste what you want to look at (one per line)",
            "type": "array",
            "description": "The option you chose above tells you what belongs here. Subreddit names work with or without r/ (r/SaaS, /r/SaaS and SaaS are all fine). For comments and transcripts paste the full post link. Example: r/SaaS",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "timeRange": {
            "title": "3. Which posts, and from when?",
            "enum": [
              "hot-now",
              "newest",
              "rising",
              "top-past-hour",
              "top-today",
              "top-this-week",
              "top-this-month",
              "top-this-year",
              "top-all-time",
              "controversial-today",
              "controversial-all-time",
              "most-relevant",
              "most-comments"
            ],
            "type": "string",
            "description": "Covers ranking and time window in one choice, so you never have to match two settings together. Example: \"Top of this week\" gives the week's best posts. Ignored where it makes no sense, such as subreddit profiles.",
            "default": "top-this-week"
          },
          "limit": {
            "title": "4. How many results? (0 = every result available)",
            "minimum": 0,
            "type": "integer",
            "description": "0 means no limit - you get everything Reddit will give. Any number is an exact cap. This is the main control on what you spend, so set a number if you are trying something out. Example: 50 for a first run. A safety ceiling still applies behind the scenes (10,000 posts or comments per search, 100 ads); go over it and the run tells you in the log rather than quietly cutting your results. That ceiling protects the shared data source and stops surprise bills - it is not a technical restriction.",
            "default": 0
          },
          "keywords": {
            "title": "Words to search for inside those subreddits",
            "type": "array",
            "description": "Only used by \"🔍 Search inside subreddits\". These are the words you are hunting for, inside the subreddits you pasted above. Example: pricing",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "commentDepth": {
            "title": "How deep into reply chains? (0 = follow every reply)",
            "minimum": 0,
            "type": "integer",
            "description": "Only used by \"💬 Comments on a post\". 0 follows every reply chain to the end. A number stops after that many levels. Example: 2 gives you top-level comments and their direct replies. A ceiling of 20 levels applies; Reddit threads deeper than that are almost never real conversation.",
            "default": 0
          },
          "includeSearchComments": {
            "title": "Also return comments that match",
            "type": "boolean",
            "description": "Only used by \"🔍 Search inside subreddits\". Reddit hands back matching comments alongside matching posts on the very same request, so leaving this on costs nothing extra at the source. Example: searching \"pricing\" in r/SaaS returns both posts and comments mentioning it.",
            "default": true
          },
          "includeSearchMedia": {
            "title": "Also return images and videos that match",
            "type": "boolean",
            "description": "Only used by \"🔍 Search inside subreddits\". Adds matching image and video results with their dimensions. Off by default because most people want text. Example: turn on when you are researching visual content.",
            "default": false
          },
          "transcriptLanguage": {
            "title": "Transcript language",
            "enum": [
              "en",
              "es",
              "pt",
              "fr",
              "de",
              "it",
              "nl",
              "sv",
              "no",
              "da",
              "fi",
              "pl",
              "cs",
              "ru",
              "uk",
              "tr",
              "ar",
              "he",
              "hi",
              "ja",
              "ko",
              "zh",
              "id",
              "vi",
              "th"
            ],
            "type": "string",
            "description": "Only used by \"🎬 Video transcript\". Pick the language the captions are in. Most Reddit videos are English. Example: choose German for a video from a German subreddit.",
            "default": "en"
          },
          "dateRange": {
            "title": "How far back to look",
            "enum": [
              "",
              "1h",
              "24h",
              "3d",
              "7d",
              "14d",
              "30d",
              "3mo",
              "6mo",
              "1y"
            ],
            "type": "string",
            "description": "The quick way to limit results by age. Example: choose \"Last 7 days\" for a weekly report. For an exact window like 1 March to 15 March, leave this on \"Any time\" and fill in the two boxes below instead.",
            "default": ""
          },
          "postedAfter": {
            "title": "Exact start date (optional)",
            "pattern": "^$|^\\d{4}-\\d{2}-\\d{2}([T ].*)?$|^\\d+\\s*[A-Za-z]+$",
            "type": "string",
            "description": "Only needed for an exact window the dropdown above cannot express. Pick a day from the calendar. Leave empty unless you need a specific date. If you set this, it overrides the dropdown above."
          },
          "postedBefore": {
            "title": "Exact end date (optional)",
            "pattern": "^$|^\\d{4}-\\d{2}-\\d{2}([T ].*)?$|^\\d+\\s*[A-Za-z]+$",
            "type": "string",
            "description": "Only needed for an exact window. Pick a day from the calendar. Pair it with the start date above to get exactly the first half of March, for example. Leave empty for no end date."
          },
          "includeNSFW": {
            "title": "Include adult content",
            "type": "boolean",
            "description": "On by default. Turn off to drop anything Reddit marks as over-18. Example: turn off when the results are going into a work report.",
            "default": true
          },
          "minScore": {
            "title": "Ignore anything below this many upvotes (0 = keep everything)",
            "minimum": 0,
            "type": "integer",
            "description": "0 keeps everything, including brand new posts with no votes yet. A number skips anything below it, for both posts and comments. Example: 100 keeps only posts the community clearly agreed with.",
            "default": 0
          },
          "minComments": {
            "title": "Ignore posts with fewer comments than this (0 = keep everything)",
            "minimum": 0,
            "type": "integer",
            "description": "0 keeps everything. A number skips quiet posts, which is the quickest way to find real discussion rather than drive-by links. Applies to posts only, never to individual comments. Example: 20 keeps only posts that started a conversation.",
            "default": 0
          },
          "filterKeywords": {
            "title": "Words that must (or must not) appear",
            "type": "array",
            "description": "Leave empty to skip this filter - and be careful with it, since it is the quickest way to end up with no results at all. Matches on the title and body text, ignoring capitals. Important: \"🔍 Search inside subreddits\" gets titles without post bodies from Reddit, so there the words have to appear in the title itself. Example: adding \"fan\" and \"noise\" will drop a post titled \"Cooling advice needed\" because neither word is in the title. Start without this filter, see what comes back, then add it.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "filterKeywordMode": {
            "title": "What to do with those words",
            "enum": [
              "include",
              "exclude"
            ],
            "type": "string",
            "description": "Ignored when the box above is empty. Example: choose \"Throw away\" and add \"hiring\" to strip job adverts out of your results.",
            "default": "include"
          },
          "cacheMaxAge": {
            "title": "Reuse recent results instead of fetching again",
            "enum": [
              "",
              "1d",
              "3d",
              "7d",
              "14d",
              "30d"
            ],
            "type": "string",
            "description": "If we already collected this within the window you pick, that copy is returned instead of going out to Reddit again, which costs nothing at the source. Ideal for a daily report where data from this morning is fine. Example: pick \"Up to 1 day old\" for a scheduled daily run. Leave as \"Always fetch fresh\" when you need the very latest.",
            "default": ""
          },
          "enrichments": {
            "title": "Add AI analysis to every result",
            "type": "array",
            "description": "Leave empty for no AI and no extra cost. Tick any combination and each post and comment comes back already analysed. Needs your own Claude API key in the next box - you pay Anthropic for usage directly, and this actor charges a small fee per analysed result. Example: tick \"How they feel about it\" and \"Problems they mention\" to find out what people dislike about a product and how strongly.",
            "items": {
              "type": "string",
              "enum": [
                "sentiment",
                "intent",
                "painPoints",
                "featureRequests",
                "buyingIntent"
              ],
              "enumTitles": [
                "😀 How they feel about it (positive, negative, and the emotion)",
                "🎯 Why they posted (a question, a complaint, a recommendation...)",
                "🔧 Problems they mention, quoted word for word",
                "💡 Things they wish existed, quoted word for word",
                "💰 How close they sound to buying"
              ]
            },
            "default": []
          },
          "llmApiKey": {
            "title": "Your Claude API key",
            "type": "string",
            "description": "Only needed if you ticked something above. Get one at console.anthropic.com. Your key is used for this run and never stored. Example: a key starting sk-ant-"
          },
          "llmModel": {
            "title": "Which Claude model",
            "enum": [
              "claude-haiku-4-5-20251001",
              "claude-sonnet-5",
              "claude-opus-5"
            ],
            "type": "string",
            "description": "Haiku is the cheapest and is genuinely good enough for sentiment and intent on short Reddit text - start there. Step up only if you are extracting nuanced quotes and the results are not sharp enough. Example: leave on Haiku for a first run.",
            "default": "claude-haiku-4-5-20251001"
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}