{
  "openapi": "3.0.1",
  "info": {
    "title": "Reddit Brand Monitoring: AI mentions, sentiment and pain points",
    "description": "First 25 mentions free. Reddit brand monitoring for any subreddit: runs Reddit Scraper Lite, drops off-topic and seen posts free, adds AI sentiment, pain points, keyword alerts. $0.002 per qualified mention, below the median. Free demo on any plan; live search runs on your own Apify account.",
    "version": "0.2",
    "x-build-id": "ZQLeNX6bHtDEWxXli"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/rich_minds~reddit-brand-monitoring-ai/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-rich_minds-reddit-brand-monitoring-ai",
        "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/rich_minds~reddit-brand-monitoring-ai/runs": {
      "post": {
        "operationId": "runs-sync-rich_minds-reddit-brand-monitoring-ai",
        "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/rich_minds~reddit-brand-monitoring-ai/run-sync": {
      "post": {
        "operationId": "run-sync-rich_minds-reddit-brand-monitoring-ai",
        "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": [
          "sourceMode"
        ],
        "properties": {
          "brandTerms": {
            "title": "Brand / product names to monitor",
            "type": "array",
            "description": "The names Reddit is searched for, e.g. <code>notion</code> — case-insensitive, whole-word, plurals included. Type your own brand and press Start: the run switches to the live search, capped by the spend cap below. The free demo does not search it — set Where do the mentions come from? to Search Reddit live to search it live.",
            "items": {
              "type": "string"
            }
          },
          "sourceMode": {
            "title": "Where do the mentions come from?",
            "enum": [
              "actor",
              "dataset",
              "list"
            ],
            "type": "string",
            "description": "<b>list</b> (prefilled) — the free demo on sample mentions, or posts / comments you paste in. <b>actor</b> — search Reddit live for your brand terms on your Apify account. <b>dataset</b> — qualify a Reddit scraper dataset you already have. Plans and source prices: section 6.",
            "default": "actor"
          },
          "brandBrief": {
            "title": "What is your brand? (one or two lines)",
            "type": "string",
            "description": "Tells the AI which <i>notion</i> you mean — e.g. \"Notion — the docs and wiki app, not the word 'notion'\". The AI uses it to confirm each mention is really about you (and, with reply drafts on, as the only facts a draft may use). Leave empty to judge from the brand terms alone."
          },
          "maxDiscoveryChargeUsd": {
            "title": "Max Reddit scraper spend (USD)",
            "minimum": 0.03,
            "maximum": 1000,
            "type": "number",
            "description": "Hard cap on what the Reddit scraper run may charge your account in <b>actor</b> mode — $0.50 in the form and for an API or agent call that leaves it out (≈ 120 results with Reddit Scraper Lite, ≈ 240 with harshmaur's), so a first real search can never cost more. Raise it for bigger searches.",
            "default": 0.5
          },
          "maxQualified": {
            "title": "Max qualified mentions to output",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Hard cap on results — and the ceiling of what <b>this Actor</b> charges: at most this many × $0.009 with AI on (× $0.002 with AI off), e.g. 100 × $0.009 = $0.90; the scraper's own spend has its cap right above. The highest-relevance mentions are output first.",
            "default": 100
          },
          "enableAi": {
            "title": "AI assessment",
            "type": "boolean",
            "description": "Confirms each mention is about <i>your</i> brand and adds sentiment, type, the pain point with a verbatim quote, competitors named, priority and next action. <b>On (default) = $0.009 per qualified mention + AI tokens; off = $0.002</b> (rule-based). Keep it on for your first search — your 25 free mentions then show the AI tier.",
            "default": true
          },
          "notifyEmail": {
            "title": "E-mail me the new mentions (optional)",
            "type": "string",
            "description": "Make it a weekly monitor: after every run with new mentions the digest (top 10 with links, what changed since the last run) is e-mailed here. Schedule the run (Actions → Schedule) and the mentions come to your inbox — no Slack or Zapier needed. Never sent for the free demo."
          },
          "competitorTerms": {
            "title": "Competitor names",
            "type": "array",
            "description": "Searched as well; mentions that name them get <code>matchedTermType: competitor</code> and appear in <code>competitorsMentioned</code> and the share-of-voice digest. A competitor's unhappy user is suggested as a <b>reply</b> opportunity.",
            "items": {
              "type": "string"
            }
          },
          "extraSearchTerms": {
            "title": "Topic phrases to search too",
            "type": "array",
            "description": "Category phrases such as <code>best note taking app</code> — searched, tagged <code>topic</code>, and delivered when the phrase appears (they need no brand name). Good for finding \"what should I use?\" threads.",
            "items": {
              "type": "string"
            }
          },
          "subreddits": {
            "title": "Only these subreddits",
            "type": "array",
            "description": "Names, <code>r/…</code> or URLs, e.g. <code>SaaS</code>, <code>r/productivity</code>. Empty = all of Reddit. Each subreddit is one scraper run (at most 10, the result budget split across them).",
            "items": {
              "type": "string"
            }
          },
          "includeComments": {
            "title": "Include comments",
            "type": "boolean",
            "description": "Search comments as well as posts — most brand mentions are in comments. Off = posts only.",
            "default": true
          },
          "timeWindow": {
            "title": "Time window",
            "enum": [
              "hour",
              "day",
              "week",
              "month",
              "year",
              "all"
            ],
            "type": "string",
            "description": "How far back to look. Older mentions are skipped for free (live searches and datasets).",
            "default": "week"
          },
          "maxItemsPerSearch": {
            "title": "Max results per search term",
            "minimum": 5,
            "maximum": 1000,
            "type": "integer",
            "description": "Reddit results fetched per brand / competitor / topic term (newest first). 1 term × 75 ≈ $0.32 on your account with Reddit Scraper Lite (≈ 25 qualified mentions — your free ones); raise it once you see value. Always capped by <b>Max Reddit scraper spend</b>.",
            "default": 75
          },
          "minScore": {
            "title": "Minimum relevance (0–100)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "The field that decides what you pay: mentions whose relevance score is below this are discarded and <b>not charged</b>. 50 keeps clear mentions (brand in the title, or in the text with product context); raise it to pay only for the strongest, lower it to see passing mentions too.",
            "default": 50
          },
          "excludeTerms": {
            "title": "Exclude mentions containing",
            "type": "array",
            "description": "Drop any mention whose title or text contains one of these, for free — e.g. <code>notion of</code>, <code>giveaway</code>.",
            "items": {
              "type": "string"
            }
          },
          "minUpvotes": {
            "title": "Minimum upvotes",
            "minimum": 0,
            "type": "integer",
            "description": "Skip mentions with fewer upvotes (when the source reports them). 0 keeps brand-new posts too.",
            "default": 0
          },
          "mentionTypes": {
            "title": "Only these mention types",
            "type": "array",
            "description": "Deliver only these types (the AI's type when AI is on, else the rule type). Empty = every type.",
            "items": {
              "type": "string",
              "enum": [
                "pain_point",
                "feature_request",
                "alternative_seeking",
                "question",
                "complaint",
                "praise",
                "comparison",
                "news",
                "other"
              ],
              "enumTitles": [
                "Pain point",
                "Feature request",
                "Looking for an alternative",
                "Question",
                "Complaint",
                "Praise",
                "Comparison",
                "News",
                "Other"
              ]
            }
          },
          "sentimentFilter": {
            "title": "Only these sentiments",
            "type": "array",
            "description": "Deliver only these sentiments toward the brand. Empty = every sentiment.",
            "items": {
              "type": "string",
              "enum": [
                "positive",
                "neutral",
                "negative",
                "mixed"
              ],
              "enumTitles": [
                "Positive",
                "Neutral",
                "Negative",
                "Mixed"
              ]
            }
          },
          "includeNsfw": {
            "title": "Include NSFW posts",
            "type": "boolean",
            "description": "Off (default) skips posts marked NSFW, for free.",
            "default": false
          },
          "targetFlags": {
            "title": "Target flags (any of)",
            "type": "array",
            "description": "Only deliver mentions that have at least one of these flags. Use the names from the README's flag table, e.g. <code>alternative_seeking</code>, <code>competitor_mentioned</code>, <code>unanswered</code> (<code>alternativeSeeking</code> works too); an unknown name stops the run at once with the list of valid ones.",
            "items": {
              "type": "string"
            }
          },
          "suppressionList": {
            "title": "Exclude list (authors, URLs, ids)",
            "type": "array",
            "description": "Reddit usernames (your own team), mention URLs or ids (<code>t1_…</code>) to never output. Skipped before any processing and never charged.",
            "items": {
              "type": "string"
            }
          },
          "draftReplies": {
            "title": "Draft replies for high-priority mentions (AI)",
            "type": "boolean",
            "description": "With AI on, high-priority mentions get a short reply draft that uses only your brand brief and the thread — no prices or claims beyond the brief, and it suggests disclosing your affiliation. A draft for a human: nothing is ever posted.",
            "default": false
          },
          "llmProvider": {
            "title": "AI model access",
            "enum": [
              "apify",
              "byok"
            ],
            "type": "string",
            "description": "<b>Apify (no keys)</b> — the AI runs through Apify's built-in OpenRouter proxy; tokens are billed to your Apify account at OpenRouter's rates. <b>My own key</b> — use your OpenAI / Anthropic / Gemini / Groq key instead; a free-tier key is slower (2 calls at a time, one after a rate limit) — the AI stops before the run's timeout and the rest keep their rule score.",
            "default": "apify"
          },
          "llmModel": {
            "title": "AI model",
            "type": "string",
            "description": "Leave empty for the default (<code>anthropic/claude-haiku-4.5</code>). Apify mode takes an OpenRouter slug such as <code>openai/gpt-4o-mini</code>; own-key mode takes <code>provider:model</code>, e.g. <code>anthropic:claude-haiku-4-5-20251001</code>."
          },
          "llmApiKey": {
            "title": "Your API key (own-key mode only)",
            "type": "string",
            "description": "Required when <b>AI model access</b> is <i>My own API key</i>. Stored encrypted by Apify, never logged."
          },
          "aiCandidateMultiplier": {
            "title": "AI candidate pool (× max qualified)",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "The AI pass takes every mention scoring at least <b>Minimum relevance</b> − 20, best rule score first, up to this multiple × <b>Max qualified</b> (default 2 × 100 = 200). Higher = more thorough, slower, more tokens.",
            "default": 2
          },
          "slackWebhookUrl": {
            "title": "Post the new mentions to Slack (optional)",
            "type": "string",
            "description": "A Slack incoming-webhook URL (<code>https://hooks.slack.com/services/…</code>). After every run with at least one new mention, the digest (top 10 with links, priority, type and sentiment) is posted to that channel as a readable message — not raw JSON. Never sent for the free demo."
          },
          "webhookUrl": {
            "title": "Webhook URL (optional)",
            "type": "string",
            "description": "Qualified mentions are POSTed here as JSON with a Slack-compatible <code>text</code> line (Zapier, Make, n8n, your CRM, a Slack workflow). With batch size 1 only mentions at or above <b>Alert priority</b> are sent, the moment they are ready."
          },
          "alertMinPriority": {
            "title": "Alert priority (per-mention webhook)",
            "enum": [
              "low",
              "medium",
              "high"
            ],
            "type": "string",
            "description": "With webhook batch size 1, only mentions of this priority or higher are POSTed — so the urgent threads reach Slack / Zapier at once. Batches carry every mention.",
            "default": "high"
          },
          "webhookHeaders": {
            "title": "Webhook headers (optional)",
            "type": "object",
            "description": "Extra HTTP headers for the webhook, e.g. <code>{\"Authorization\": \"Bearer …\"}</code>."
          },
          "webhookBatchSize": {
            "title": "Webhook batch size",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "1 = one POST per mention (at or above Alert priority) the moment it is ready. Higher = one POST per N mentions, every priority.",
            "default": 1
          },
          "dedupeAcrossRuns": {
            "title": "Only new mentions (skip ones delivered before)",
            "type": "boolean",
            "description": "Remembers every mention delivered to you (by its Reddit id, in a named key-value store on your account) and skips it in future runs for free; the next live search also starts from the last run's date (<code>postDateLimit</code>).",
            "default": true
          },
          "dedupeStoreName": {
            "title": "Dedupe store name",
            "type": "string",
            "description": "Key-value store used for the cross-run memory. Left at the default, the memory is kept per monitor: another set of <code>brandTerms</code> / competitors / subreddits (another client brand) starts its own list, so one brand never hides mentions from another. Type your own name to share one memory, or to keep one per campaign.",
            "default": "reddit-brand-monitoring-ai-seen"
          },
          "datasetId": {
            "title": "Dataset",
            "type": "string",
            "description": "Only for <b>dataset</b> mode: a dataset from <code>trudax/reddit-scraper-lite</code>, <code>trudax/reddit-scraper</code> or <code>harshmaur/reddit-scraper</code>. Pick it so the Actor is granted read access."
          },
          "itemsList": {
            "title": "Posts / comments to process",
            "type": "array",
            "description": "Only for <b>list</b> mode. JSON array of Reddit rows in the <code>trudax/reddit-scraper-lite</code> or <code>harshmaur/reddit-scraper</code> shape — at least <code>id</code>, <code>url</code>, <code>dataType</code> and <code>title</code> / <code>body</code>. The prefilled rows are the free demo (sample mentions)."
          },
          "discoveryActorId": {
            "title": "Live Reddit scraper",
            "enum": [
              "trudax/reddit-scraper-lite",
              "harshmaur/reddit-scraper"
            ],
            "type": "string",
            "description": "The Store Actor <b>actor</b> mode runs on your account (its usage is billed by that Actor). <b>Reddit Scraper Lite</b> — $0.004 per result + $0.02 per start, the most used. <b>Reddit Scraper (harshmaur)</b> — $0.002 per result + $0.02 init and fewer failed runs (1.7 % vs 12 % in 30 days). Both feed the same output.",
            "default": "trudax/reddit-scraper-lite"
          },
          "discoveryInput": {
            "title": "Extra Reddit scraper input (advanced)",
            "type": "object",
            "description": "Only for <b>actor</b> mode. Merged over the input this Actor builds (<code>searches</code>, <code>sort: new</code>, <code>maxItems</code> …) and passed as-is — e.g. <code>{\"sort\": \"relevance\"}</code>. See the source Actor's input schema."
          },
          "discoveryTimeoutSecs": {
            "title": "Reddit scraper timeout (seconds)",
            "minimum": 60,
            "maximum": 3600,
            "type": "integer",
            "description": "Hard timeout for each Reddit scraper run. A run that times out or fails still hands over what it scraped, and those mentions are qualified.",
            "default": 600
          },
          "maxToProcess": {
            "title": "Max candidates to process",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "Upper bound on how many mentions are scored in one run and on the scraper's result budget (controls run time). Default = 3 × max qualified."
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}