{
  "data": {
    "id": "eT62IYQwMrFIL2lPB",
    "actId": "YHFsQuZfS5N4jvQRb",
    "userId": "9Um4NEFR7z42j35AD",
    "startedAt": "2026-09-04T19:00:14.288Z",
    "finishedAt": "2026-09-04T19:00:21.375Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 6738,
      "runTimeSecs": 6.738,
      "computeUnits": 0.007486666666666667,
      "imageSizeBytes": 597788160
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "V6hxXfbmFahEEG2I4",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Snapchat Comments Scraper input\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"startUrls\": {\n      \"title\": \"Spotlight URLs\",\n      \"type\": \"array\",\n      \"description\": \"Paste one or more public Snapchat Spotlight URLs.\",\n      \"editor\": \"stringList\",\n      \"minItems\": 1,\n      \"uniqueItems\": true,\n      \"items\": {\n        \"type\": \"string\",\n        \"pattern\": \"^https://(www\\\\.)?snapchat\\\\.com/@[^/?#]+/spotlight/[^/?#]+(?:[/?#].*)?$\"\n      },\n      \"prefill\": [\n        \"https://www.snapchat.com/@mrbeast/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYbHZzZmtrYm1jAZhMOQmTAZhMOQfqAAAAAQ\"\n      ]\n    },\n    \"includeReplies\": {\n      \"title\": \"Include replies\",\n      \"type\": \"boolean\",\n      \"description\": \"Save public replies as separate paid rows.\",\n      \"default\": false\n    }\n  },\n  \"required\": [\n    \"startUrls\"\n  ]\n}",
    "readme": "# Snapchat Comments Scraper\n\n## 💬 What does Snapchat Comments Scraper do?\n\nSnapchat Comments Scraper collects public comments from known Snapchat Spotlight\nURLs. Add one or more Spotlight URLs and get clean rows with the original input,\ncanonical post URL, stable post and comment IDs, text, public author details,\ndates, likes, reply links, and run status.\n\nPaste the URLs, choose whether to include direct replies, and run. Each dataset\nrow represents one saved public comment or reply. Rows are deduplicated before\nthey are saved and charged, then written as they are collected. This makes the\nActor easy to add to a manual research task or an automated data pipeline.\n\nUse it for:\n\n- 🔎 Audience research and public feedback analysis.\n- 📣 Brand and campaign monitoring.\n- 🧑‍🎨 Creator research and public conversation studies.\n- 💬 Comment analysis, topic work, and language research.\n- 🧱 Spreadsheets, databases, dashboards, and scheduled data pipelines.\n\nWith Snapchat Comments Scraper, you can:\n\n- 💬 Collect public top-level comments from known Spotlight posts.\n- 🧵 Save public replies as separate rows with their parent comment ID.\n- 🔁 Deduplicate repeated comment IDs before saving and charging.\n- 🆔 Keep the original URL, canonical URL, Spotlight ID, comment ID, and author IDs.\n- 👤 Get public author names, usernames, and profile images when shown.\n- 📊 Capture comment text, publish time, likes, reply count, and the public post comment count.\n- 🚦 See saved rows and run-level input failures separately.\n- 📦 Export results as JSON, JSONL, CSV, Excel, XML, RSS, or HTML.\n\nThis Actor uses public, logged-out Snapchat Spotlight data. It does not need a\nlogin, account credentials, or an API key. It does not access private posts,\nuse account state, solve challenges, or discover posts from profiles or search.\nIt returns only data available from the public Spotlight page and its public\ncomments at run time.\n\n## 📦 What Snapchat comment data can I extract?\n\nEach default-dataset row represents one public Snapchat comment or direct reply.\nTop-level comments have `depth: 0`. Reply rows have `depth: 1` and carry the\nsource `parentCommentId` when Snapchat provides it.\n\n| Data group         | Example fields                                                             |\n| ------------------ | -------------------------------------------------------------------------- |\n| 🔗 Post identity   | `inputUrl`, `postUrl`, `snapId`                                            |\n| 🧵 Thread links    | `commentId`, `parentCommentId`, `depth`                                    |\n| 👤 Public author   | `authorId`, `postAuthorId`, `isPostAuthor`, `authorName`, `authorUsername` |\n| 🖼️ Author profile  | `authorImageUrl`                                                           |\n| 💬 Comment content | `text`, `publishedAt`                                                      |\n| ❤️ Public counts   | `likes`, `replyCount`, `postCommentCount`                                  |\n| 🚦 Row state       | `status`, `statusReason`, `observedAt`                                     |\n\nThe original `inputUrl` is kept beside the cleaned `postUrl`. Search parameters,\nfragments, and a final slash are removed from `postUrl`. Public author fields,\ndates, and `postCommentCount` can be `null` when Snapchat does not expose them.\nSaved `likes` and `replyCount` fields are integers. The dataset does not add a\nseparate precision field for these counts.\n\n## ⚙️ Can I use this Actor through an API?\n\nYes. Run Snapchat Comments Scraper in Apify Console or connect it to:\n\n- 🔌 Apify API.\n- 🐍 Python SDK.\n- 🟢 Node.js SDK.\n- 🪝 Webhooks.\n- ⏰ Scheduled runs.\n- 🧩 Apify integrations.\n\n### 🔌 API example\n\nKeep your Apify token in an environment variable or secret store. Do not place\nit in source code.\n\n```bash\ncurl -X POST \\\n  \"https://api.apify.com/v2/acts/chronometrica~snapchat-comments-scraper/runs?token=$APIFY_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"startUrls\": [\n      \"https://www.snapchat.com/@mrbeast/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYbHZzZmtrYm1jAZhMOQmTAZhMOQfqAAAAAQ\"\n    ],\n    \"includeReplies\": true\n  }'\n```\n\nUse the returned run ID to check the run, read the default dataset, or attach a\nwebhook. The same JSON input works with the Apify Python and Node.js clients.\n\n## 🎯 Why collect Snapchat comments?\n\nPublic comments show what viewers say about a Spotlight post. They can help you\nfind questions, reactions, repeated themes, and language from a known post.\n\n| Use case             | How the data helps                                     |\n| -------------------- | ------------------------------------------------------ |\n| 🔎 Audience research | Find public questions, opinions, and recurring themes. |\n| 📣 Brand monitoring  | Review public reactions to products and campaigns.     |\n| 🕵️ Creator research  | Study public responses and reply relationships.        |\n| 💡 Content planning  | Find topics, objections, and follow-up ideas.          |\n| 🤖 Text analysis     | Send clean comment text to your own analysis workflow. |\n| 🧱 Data pipelines    | Load stable rows into a database or dashboard.         |\n\nThe Actor collects source data. It does not add sentiment labels, infer a\nperson's intent, or make decisions about people.\n\n## 💵 Pricing\n\nYou pay for saved results. The result unit is one public comment or reply row\nsaved to the default dataset. The Actor sends one `snapchat-comment` event at\nthat same save boundary.\n\n| 🪙 Apify plan | Price per 1,000 saved rows | Price per saved row |\n| ------------- | -------------------------- | ------------------- |\n| 🆓 Free       | $4.00                      | $0.0040             |\n| 🥉 Starter    | $3.50                      | $0.0035             |\n| 🥈 Scale      | $3.00                      | $0.0030             |\n| 🥇 Business   | $2.50                      | $0.0025             |\n\nPlatform usage is included. There is no Actor start fee. Invalid URLs, failed\npage reads, and public posts with no saved comments do not create dataset rows\nor paid result events.\n\n## 🚀 How do I use Snapchat Comments Scraper?\n\n1. 🧭 Open **Snapchat Comments Scraper** in Apify Console.\n2. 🔗 Paste one or more known public Snapchat Spotlight URLs.\n3. 🧵 Leave **Include replies** off for top-level comments only, or turn it on to save direct replies too.\n4. ▶️ Click **Start**.\n5. 📤 Open **Output** to inspect the dataset and the `OUTPUT` run summary.\n6. 📦 Download the data or send it to another tool through an integration.\n\n## ⬇️ Input\n\nThe main input is `startUrls`. Add one or more full public Spotlight URLs.\nThe input schema accepts `https://snapchat.com/@username/spotlight/POST_ID` and\n`https://www.snapchat.com/@username/spotlight/POST_ID` forms. Query parameters,\nfragments, and a trailing slash are allowed in the input and removed from the\ncanonical `postUrl`.\n\nThe form requires at least one URL and rejects duplicate URL values. There is no\ndocumented maximum number of URLs in the input schema.\n\n```json\n{\n  \"startUrls\": [\n    \"https://www.snapchat.com/@mrbeast/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYbHZzZmtrYm1jAZhMOQmTAZhMOQfqAAAAAQ\"\n  ],\n  \"includeReplies\": true\n}\n```\n\nFor top-level comments only, use the default:\n\n```json\n{\n  \"startUrls\": [\n    \"https://www.snapchat.com/@mrbeast/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYbHZzZmtrYm1jAZhMOQmTAZhMOQfqAAAAAQ\"\n  ],\n  \"includeReplies\": false\n}\n```\n\n### 🔗 Supported URL inputs\n\n- 🔗 Full `https://www.snapchat.com/@username/spotlight/POST_ID` URLs.\n- 🔗 Full `https://snapchat.com/@username/spotlight/POST_ID` URLs.\n- 🧾 The optional query string, fragment, or final slash may be present.\n- 🚫 HTTP URLs, profiles, search pages, channel pages, and unknown Snapchat paths are not supported inputs.\n\n### 🎛️ Settings\n\n| Setting          | What it controls                                                              |\n| ---------------- | ----------------------------------------------------------------------------- |\n| `startUrls`      | One or more known public Snapchat Spotlight URLs to collect.                  |\n| `includeReplies` | `false` by default. When `true`, save public direct replies as separate rows. |\n\nThere is no `maxComments` input and no numeric reply cap. The Actor reads public\ncomment pages until the public source is exhausted, the run times out, or an\nApify charge limit stops row saving. When replies are enabled, it reads public\nreply pages for saved top-level comments until those reply pages are exhausted.\nIt does not recursively request another reply level, and reply rows use\n`depth: 1`.\n\n## ⬆️ Output sample\n\nResults are stored in the default dataset. The field order is stable for JSON,\nCSV, spreadsheets, API, and database workflows.\n\n```json\n{\n  \"inputUrl\": \"https://www.snapchat.com/@mrbeast/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYbHZzZmtrYm1jAZhMOQmTAZhMOQfqAAAAAQ\",\n  \"postUrl\": \"https://www.snapchat.com/@mrbeast/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYbHZzZmtrYm1jAZhMOQmTAZhMOQfqAAAAAQ\",\n  \"snapId\": \"W7_EDlXWTBiXAEEniNoMPwAAYbHZzZmtrYm1jAZhMOQmTAZhMOQfqAAAAAQ\",\n  \"commentId\": \"123456789-987654321\",\n  \"parentCommentId\": null,\n  \"depth\": 0,\n  \"authorId\": \"789012345-678901234\",\n  \"postAuthorId\": \"345678901-234567890\",\n  \"isPostAuthor\": false,\n  \"authorName\": \"Example Author\",\n  \"authorUsername\": \"example_author\",\n  \"authorImageUrl\": \"https://example.com/avatar.jpg\",\n  \"text\": \"Example public comment\",\n  \"publishedAt\": \"2026-08-06T12:00:00.000Z\",\n  \"likes\": 12,\n  \"replyCount\": 2,\n  \"postCommentCount\": 34,\n  \"status\": \"ok\",\n  \"statusReason\": null,\n  \"observedAt\": \"2026-08-06T12:01:00.000Z\"\n}\n```\n\nReply rows use the same fields. A reply has `depth: 1`, a `parentCommentId`,\nand its own `commentId`. `commentId` is the stable ID for that saved row.\n\n### 📌 `OUTPUT` run summary\n\nThe `OUTPUT` record is stored in the default key-value store. It includes:\n\n- 📥 `inputCount`: number of input URLs after input normalization.\n- 🗃️ `datasetId`: the default dataset that holds comment rows.\n- ✅ `successfulInputs`: URLs whose public Spotlight page was read and matched.\n- ⚠️ `failedInputs`: URLs that could not be read or matched.\n- 💬 `usefulRows`: saved comment and reply rows.\n- 🛑 `stopReason`: normally `inputs_exhausted`, or `charge_limit_reached` when saving stops at the Apify charge limit.\n- 🕐 `startedAt` and `finishedAt`: run times in ISO format.\n- 🧾 `schemaVersion`: summary contract version.\n\nExample:\n\n```json\n{\n  \"schemaVersion\": \"1.0\",\n  \"startedAt\": \"2026-08-06T12:00:00.000Z\",\n  \"finishedAt\": \"2026-08-06T12:01:00.000Z\",\n  \"inputCount\": 1,\n  \"datasetId\": \"exampleDatasetId\",\n  \"usefulRows\": 34,\n  \"successfulInputs\": 1,\n  \"failedInputs\": 0,\n  \"stopReason\": \"inputs_exhausted\"\n}\n```\n\n## 🚦 Status, identity, and data quality\n\n- ✅ Every saved dataset row has `status: \"ok\"` and `statusReason: null`.\n- ⚠️ Invalid or unavailable inputs do not become placeholder rows. They increase `failedInputs` in `OUTPUT` instead.\n- 🛑 If every input fails, the Actor writes `OUTPUT` and then marks the run as failed.\n- 🔗 Top-level comments use `parentCommentId: null` and `depth: 0`.\n- 🧵 Reply rows use the public parent ID when available and `depth: 1`.\n- 🆔 Comment and author IDs are returned as stable source ID strings when exposed.\n- 👤 `isPostAuthor` is `true` or `false` when both author IDs are present; otherwise it can be `null`.\n- 🕐 `observedAt` is when the row was collected. `publishedAt` is the public comment time when available.\n- 📊 `postCommentCount` is the public post-level comment count when available. It can be higher than the rows returned by the public source.\n\nRows from a later run are new observations. The Actor does not update or merge\nrows from earlier datasets.\n\n## 🔒 Public-source boundary\n\nSnapchat Comments Scraper uses public, logged-out Snapchat Spotlight pages and\nthe public comments and replies exposed for those pages at run time.\n\nIt does not:\n\n- 🚫 Ask for a Snapchat login, account credentials, or private account access.\n- 🚫 Read private, account-only, deleted, hidden, or otherwise unavailable posts.\n- 🚫 Collect profiles, search results, channels, or content not tied to a supplied Spotlight URL.\n- 🚫 Solve challenges or bypass an access control.\n- 🚫 Download Spotlight media or add sentiment, intent, or sensitive-trait labels.\n\n## ⚠️ Limits and interpretation\n\n- 📉 Public comment availability can change between runs. Deleted, hidden, moderated, or region-limited comments may not be returned.\n- 🧮 A requested post comment count can be higher than the rows available from the public comment pages.\n- 🧭 `startUrls` is a known-object input. This Actor does not discover Spotlight posts by username, keyword, profile, or search.\n- 🧵 `includeReplies` adds direct reply rows and more work. It has no numeric reply limit; public reply pages can end before all displayed replies are available.\n- ⏱️ There is no numeric comment cap. A run can stop when public pages end, the Apify timeout is reached, or an Apify charge limit stops saving.\n- 🔁 Exact duplicate URL values are removed before processing. Repeated comment IDs are removed within each public comment or reply traversal.\n- 🧾 The public comment count, reply count, likes, author fields, and dates can change or be missing at collection time.\n\n## ❓ FAQ\n\n### Does this Actor need a Snapchat login or API key?\n\nNo. It uses public, logged-out Spotlight data and does not require a Snapchat\nlogin, account credentials, or an API key.\n\n### Does this Actor collect every comment on a Spotlight post?\n\nIt keeps reading until the public comment pages end, subject to the run timeout\nand Apify charge limit. Snapchat may expose fewer comments than its displayed\ncount, and the public list can change between runs.\n\n### Is there a hidden comment or reply cap?\n\nNo. The input has no numeric comment or reply cap. The Actor keeps reading the\npublic pages until they end, the run times out, or an Apify charge limit stops\nrow saving. Snapchat can still expose fewer rows than the count shown on a post.\n\n### Are replies separate results?\n\nYes. Turn on `includeReplies`. Each saved reply is a separate dataset row with\nits own `commentId`, a `parentCommentId`, and `depth: 1`. There is no numeric\nreply cap in the input.\n\n### Why did I receive fewer rows than expected?\n\nThe public source may have ended, the post may have no readable public comments,\nthe input may have failed, the run may have timed out, or an Apify charge limit\nmay have stopped saving. Check `OUTPUT` for `usefulRows`, `successfulInputs`,\n`failedInputs`, and `stopReason`.\n\n### How are duplicates handled?\n\nExact duplicate input URL values are removed before collection. Within a public\ncomment or reply traversal, repeated source comment IDs are saved once.\n\n### Does this Actor search Snapchat for posts?\n\nNo. Provide the full public Spotlight URL for each post you want to inspect.\n\n### What happens when a post has no public comments?\n\nNo comment rows are saved. The public page can still count as a successful input,\nwhile `usefulRows` remains zero. A failed page read is counted in `failedInputs`.\n\n### What do I pay for?\n\nThe result unit is one saved public comment or reply row. The `snapchat-comment`\nevent is sent once at the save boundary for each saved row. Inputs that do not\nproduce rows do not create result events.\n\n## ⚖️ Responsible use\n\nThis Actor collects data that Snapchat exposes to logged-out public viewers at\nrun time. You are responsible for using the data lawfully and for following\napplicable privacy, data-protection, research, and platform rules. Do not use\npublic comments to harass people, infer sensitive traits, or make automated\nhigh-impact decisions about individuals.\n\n## 🛟 Support\n\nFor help, include the Apify run ID, one input Spotlight URL, the result you\nexpected, and the observed dataset or `OUTPUT` summary. Say whether the issue\naffects one URL, one row, or the whole run. Do not send account credentials or\nprivate Snapchat links.\n\n## 🔗 Related social media Actors\n\nContinue the same workflow on this platform or compare public data across\nplatforms.\n\n### Continue on Snapchat\n\n- [Snapchat Spotlight Metrics Scraper](https://apify.com/chronometrica/snapchat-metrics-scraper)\n  — collect public Spotlight post views, engagement, creator, and media data.\n\n### Compare comments across platforms\n\n- [Facebook Comments Scraper](https://apify.com/chronometrica/facebook-comments-scraper)\n  — collect public comments, replies, authors, dates, and reactions.\n- [Instagram Comments Scraper](https://apify.com/chronometrica/instagram-comments-scraper)\n  — collect public comments, authors, dates, likes, and reply counts.\n- [TikTok Comments Scraper](https://apify.com/chronometrica/tiktok-comments-scraper)\n  — collect public comments, replies, authors, likes, and thread links.\n- [YouTube Comments Scraper](https://apify.com/chronometrica/youtube-comments-scraper)\n  — collect public comments, replies, authors, likes, pins, and creator\n  hearts.\n- [Reddit Comments Scraper](https://apify.com/chronometrica/reddit-comments-scraper)\n  — collect public thread comments, replies, authors, scores, and dates.\n- [LinkedIn Comments Scraper](https://apify.com/chronometrica/linkedin-comments-scraper)\n  — collect public comments, replies, authors, dates, and reactions.\n",
    "changelog": "# Changelog\n\n## September 2026\n\n- Improved messages for Spotlight posts that are no longer available.\n\n## August 2026\n\n- First public release for Spotlight comments and replies.\n",
    "actorDefinition": {
      "$schema": "https://apify.com/schemas/v1/actor.ide.json",
      "actorSpecification": 1,
      "name": "snapchat-comments-scraper",
      "title": "Snapchat Comments Scraper",
      "description": "Collect public Snapchat Spotlight comments and direct replies from known post URLs. Get deduplicated rows with text, authors, dates, likes, stable IDs, and parent links.",
      "seoTitle": "Snapchat Comments Scraper | Comments & Replies",
      "seoDescription": "Scrape public Snapchat Spotlight comments and direct replies from known URLs. Export deduplicated rows with text, authors, dates, likes, IDs, and parent links.",
      "categories": [
        "SOCIAL_MEDIA"
      ],
      "version": "1.0",
      "buildTag": "latest",
      "defaultMemoryMbytes": 256,
      "maxMemoryMbytes": 256,
      "defaultRunOptions": {
        "build": "latest",
        "timeoutSecs": 1800,
        "memoryMbytes": 256
      },
      "exampleRunInput": {
        "contentType": "application/json; charset=utf-8",
        "body": "{\n  \"startUrls\": [\n    \"https://www.snapchat.com/@mrbeast/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYbHZzZmtrYm1jAZhMOQmTAZhMOQfqAAAAAQ\"\n  ],\n  \"includeReplies\": true\n}"
      },
      "input": {
        "title": "Snapchat Comments Scraper input",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "startUrls": {
            "title": "Spotlight URLs",
            "type": "array",
            "description": "Paste one or more public Snapchat Spotlight URLs.",
            "editor": "stringList",
            "minItems": 1,
            "uniqueItems": true,
            "items": {
              "type": "string",
              "pattern": "^https://(www\\.)?snapchat\\.com/@[^/?#]+/spotlight/[^/?#]+(?:[/?#].*)?$"
            },
            "prefill": [
              "https://www.snapchat.com/@mrbeast/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYbHZzZmtrYm1jAZhMOQmTAZhMOQfqAAAAAQ"
            ]
          },
          "includeReplies": {
            "title": "Include replies",
            "type": "boolean",
            "description": "Save public replies as separate paid rows.",
            "default": false
          }
        },
        "required": [
          "startUrls"
        ]
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Snapchat Comments Scraper output",
        "description": "Comment rows are in the default dataset. OUTPUT contains a short run summary.",
        "properties": {
          "results": {
            "type": "string",
            "title": "Comment results",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          },
          "output": {
            "type": "string",
            "title": "Run summary",
            "template": "{{links.apiDefaultKeyValueStoreUrl}}/records/OUTPUT"
          }
        }
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "fields": {
            "$schema": "http://json-schema.org/draft-07/schema#",
            "type": "object",
            "properties": {
              "inputUrl": {
                "title": "Input URL",
                "type": "string"
              },
              "postUrl": {
                "title": "Post URL",
                "type": "string"
              },
              "snapId": {
                "title": "Post ID",
                "type": "string"
              },
              "commentId": {
                "title": "Comment ID",
                "type": "string"
              },
              "parentCommentId": {
                "title": "Parent Comment ID",
                "type": [
                  "string",
                  "null"
                ]
              },
              "depth": {
                "title": "Depth",
                "type": "integer"
              },
              "authorId": {
                "title": "Author ID",
                "type": [
                  "string",
                  "null"
                ]
              },
              "postAuthorId": {
                "title": "Post Author ID",
                "type": [
                  "string",
                  "null"
                ]
              },
              "isPostAuthor": {
                "title": "Post Author",
                "type": [
                  "boolean",
                  "null"
                ]
              },
              "authorName": {
                "title": "Author",
                "type": [
                  "string",
                  "null"
                ]
              },
              "authorUsername": {
                "title": "Author Username",
                "type": [
                  "string",
                  "null"
                ]
              },
              "authorImageUrl": {
                "title": "Author Image",
                "type": [
                  "string",
                  "null"
                ]
              },
              "text": {
                "title": "Comment",
                "type": "string"
              },
              "publishedAt": {
                "title": "Published At",
                "type": [
                  "string",
                  "null"
                ],
                "format": "date-time"
              },
              "likes": {
                "title": "Likes",
                "type": "integer"
              },
              "replyCount": {
                "title": "Replies",
                "type": "integer"
              },
              "postCommentCount": {
                "title": "Post Comment Count",
                "type": [
                  "integer",
                  "null"
                ]
              },
              "status": {
                "title": "Status",
                "type": "string"
              },
              "statusReason": {
                "title": "Status Reason",
                "type": [
                  "string",
                  "null"
                ]
              },
              "observedAt": {
                "title": "Observed At",
                "type": "string",
                "format": "date-time"
              }
            },
            "required": [
              "inputUrl",
              "postUrl",
              "snapId",
              "commentId",
              "depth",
              "text",
              "observedAt",
              "status"
            ]
          },
          "views": {
            "overview": {
              "title": "Comments",
              "transformation": {
                "fields": [
                  "inputUrl",
                  "postUrl",
                  "commentId",
                  "parentCommentId",
                  "depth",
                  "isPostAuthor",
                  "authorName",
                  "text",
                  "publishedAt",
                  "likes",
                  "replyCount"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "inputUrl": {
                    "label": "Input",
                    "format": "link"
                  },
                  "postUrl": {
                    "label": "Post",
                    "format": "link"
                  },
                  "commentId": {
                    "label": "Comment ID"
                  },
                  "parentCommentId": {
                    "label": "Parent ID"
                  },
                  "depth": {
                    "label": "Depth",
                    "format": "number"
                  },
                  "isPostAuthor": {
                    "label": "Post Author"
                  },
                  "authorName": {
                    "label": "Author"
                  },
                  "text": {
                    "label": "Comment"
                  },
                  "publishedAt": {
                    "label": "Published",
                    "format": "date"
                  },
                  "likes": {
                    "label": "Likes",
                    "format": "number"
                  },
                  "replyCount": {
                    "label": "Replies",
                    "format": "number"
                  }
                }
              }
            }
          }
        }
      },
      "dockerfile": "../Dockerfile",
      "changelog": "# Changelog\n\n## September 2026\n\n- Improved messages for Spotlight posts that are no longer available.\n\n## August 2026\n\n- First public release for Spotlight comments and replies.\n",
      "readme": "# Snapchat Comments Scraper\n\n## 💬 What does Snapchat Comments Scraper do?\n\nSnapchat Comments Scraper collects public comments from known Snapchat Spotlight\nURLs. Add one or more Spotlight URLs and get clean rows with the original input,\ncanonical post URL, stable post and comment IDs, text, public author details,\ndates, likes, reply links, and run status.\n\nPaste the URLs, choose whether to include direct replies, and run. Each dataset\nrow represents one saved public comment or reply. Rows are deduplicated before\nthey are saved and charged, then written as they are collected. This makes the\nActor easy to add to a manual research task or an automated data pipeline.\n\nUse it for:\n\n- 🔎 Audience research and public feedback analysis.\n- 📣 Brand and campaign monitoring.\n- 🧑‍🎨 Creator research and public conversation studies.\n- 💬 Comment analysis, topic work, and language research.\n- 🧱 Spreadsheets, databases, dashboards, and scheduled data pipelines.\n\nWith Snapchat Comments Scraper, you can:\n\n- 💬 Collect public top-level comments from known Spotlight posts.\n- 🧵 Save public replies as separate rows with their parent comment ID.\n- 🔁 Deduplicate repeated comment IDs before saving and charging.\n- 🆔 Keep the original URL, canonical URL, Spotlight ID, comment ID, and author IDs.\n- 👤 Get public author names, usernames, and profile images when shown.\n- 📊 Capture comment text, publish time, likes, reply count, and the public post comment count.\n- 🚦 See saved rows and run-level input failures separately.\n- 📦 Export results as JSON, JSONL, CSV, Excel, XML, RSS, or HTML.\n\nThis Actor uses public, logged-out Snapchat Spotlight data. It does not need a\nlogin, account credentials, or an API key. It does not access private posts,\nuse account state, solve challenges, or discover posts from profiles or search.\nIt returns only data available from the public Spotlight page and its public\ncomments at run time.\n\n## 📦 What Snapchat comment data can I extract?\n\nEach default-dataset row represents one public Snapchat comment or direct reply.\nTop-level comments have `depth: 0`. Reply rows have `depth: 1` and carry the\nsource `parentCommentId` when Snapchat provides it.\n\n| Data group         | Example fields                                                             |\n| ------------------ | -------------------------------------------------------------------------- |\n| 🔗 Post identity   | `inputUrl`, `postUrl`, `snapId`                                            |\n| 🧵 Thread links    | `commentId`, `parentCommentId`, `depth`                                    |\n| 👤 Public author   | `authorId`, `postAuthorId`, `isPostAuthor`, `authorName`, `authorUsername` |\n| 🖼️ Author profile  | `authorImageUrl`                                                           |\n| 💬 Comment content | `text`, `publishedAt`                                                      |\n| ❤️ Public counts   | `likes`, `replyCount`, `postCommentCount`                                  |\n| 🚦 Row state       | `status`, `statusReason`, `observedAt`                                     |\n\nThe original `inputUrl` is kept beside the cleaned `postUrl`. Search parameters,\nfragments, and a final slash are removed from `postUrl`. Public author fields,\ndates, and `postCommentCount` can be `null` when Snapchat does not expose them.\nSaved `likes` and `replyCount` fields are integers. The dataset does not add a\nseparate precision field for these counts.\n\n## ⚙️ Can I use this Actor through an API?\n\nYes. Run Snapchat Comments Scraper in Apify Console or connect it to:\n\n- 🔌 Apify API.\n- 🐍 Python SDK.\n- 🟢 Node.js SDK.\n- 🪝 Webhooks.\n- ⏰ Scheduled runs.\n- 🧩 Apify integrations.\n\n### 🔌 API example\n\nKeep your Apify token in an environment variable or secret store. Do not place\nit in source code.\n\n```bash\ncurl -X POST \\\n  \"https://api.apify.com/v2/acts/chronometrica~snapchat-comments-scraper/runs?token=$APIFY_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"startUrls\": [\n      \"https://www.snapchat.com/@mrbeast/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYbHZzZmtrYm1jAZhMOQmTAZhMOQfqAAAAAQ\"\n    ],\n    \"includeReplies\": true\n  }'\n```\n\nUse the returned run ID to check the run, read the default dataset, or attach a\nwebhook. The same JSON input works with the Apify Python and Node.js clients.\n\n## 🎯 Why collect Snapchat comments?\n\nPublic comments show what viewers say about a Spotlight post. They can help you\nfind questions, reactions, repeated themes, and language from a known post.\n\n| Use case             | How the data helps                                     |\n| -------------------- | ------------------------------------------------------ |\n| 🔎 Audience research | Find public questions, opinions, and recurring themes. |\n| 📣 Brand monitoring  | Review public reactions to products and campaigns.     |\n| 🕵️ Creator research  | Study public responses and reply relationships.        |\n| 💡 Content planning  | Find topics, objections, and follow-up ideas.          |\n| 🤖 Text analysis     | Send clean comment text to your own analysis workflow. |\n| 🧱 Data pipelines    | Load stable rows into a database or dashboard.         |\n\nThe Actor collects source data. It does not add sentiment labels, infer a\nperson's intent, or make decisions about people.\n\n## 💵 Pricing\n\nYou pay for saved results. The result unit is one public comment or reply row\nsaved to the default dataset. The Actor sends one `snapchat-comment` event at\nthat same save boundary.\n\n| 🪙 Apify plan | Price per 1,000 saved rows | Price per saved row |\n| ------------- | -------------------------- | ------------------- |\n| 🆓 Free       | $4.00                      | $0.0040             |\n| 🥉 Starter    | $3.50                      | $0.0035             |\n| 🥈 Scale      | $3.00                      | $0.0030             |\n| 🥇 Business   | $2.50                      | $0.0025             |\n\nPlatform usage is included. There is no Actor start fee. Invalid URLs, failed\npage reads, and public posts with no saved comments do not create dataset rows\nor paid result events.\n\n## 🚀 How do I use Snapchat Comments Scraper?\n\n1. 🧭 Open **Snapchat Comments Scraper** in Apify Console.\n2. 🔗 Paste one or more known public Snapchat Spotlight URLs.\n3. 🧵 Leave **Include replies** off for top-level comments only, or turn it on to save direct replies too.\n4. ▶️ Click **Start**.\n5. 📤 Open **Output** to inspect the dataset and the `OUTPUT` run summary.\n6. 📦 Download the data or send it to another tool through an integration.\n\n## ⬇️ Input\n\nThe main input is `startUrls`. Add one or more full public Spotlight URLs.\nThe input schema accepts `https://snapchat.com/@username/spotlight/POST_ID` and\n`https://www.snapchat.com/@username/spotlight/POST_ID` forms. Query parameters,\nfragments, and a trailing slash are allowed in the input and removed from the\ncanonical `postUrl`.\n\nThe form requires at least one URL and rejects duplicate URL values. There is no\ndocumented maximum number of URLs in the input schema.\n\n```json\n{\n  \"startUrls\": [\n    \"https://www.snapchat.com/@mrbeast/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYbHZzZmtrYm1jAZhMOQmTAZhMOQfqAAAAAQ\"\n  ],\n  \"includeReplies\": true\n}\n```\n\nFor top-level comments only, use the default:\n\n```json\n{\n  \"startUrls\": [\n    \"https://www.snapchat.com/@mrbeast/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYbHZzZmtrYm1jAZhMOQmTAZhMOQfqAAAAAQ\"\n  ],\n  \"includeReplies\": false\n}\n```\n\n### 🔗 Supported URL inputs\n\n- 🔗 Full `https://www.snapchat.com/@username/spotlight/POST_ID` URLs.\n- 🔗 Full `https://snapchat.com/@username/spotlight/POST_ID` URLs.\n- 🧾 The optional query string, fragment, or final slash may be present.\n- 🚫 HTTP URLs, profiles, search pages, channel pages, and unknown Snapchat paths are not supported inputs.\n\n### 🎛️ Settings\n\n| Setting          | What it controls                                                              |\n| ---------------- | ----------------------------------------------------------------------------- |\n| `startUrls`      | One or more known public Snapchat Spotlight URLs to collect.                  |\n| `includeReplies` | `false` by default. When `true`, save public direct replies as separate rows. |\n\nThere is no `maxComments` input and no numeric reply cap. The Actor reads public\ncomment pages until the public source is exhausted, the run times out, or an\nApify charge limit stops row saving. When replies are enabled, it reads public\nreply pages for saved top-level comments until those reply pages are exhausted.\nIt does not recursively request another reply level, and reply rows use\n`depth: 1`.\n\n## ⬆️ Output sample\n\nResults are stored in the default dataset. The field order is stable for JSON,\nCSV, spreadsheets, API, and database workflows.\n\n```json\n{\n  \"inputUrl\": \"https://www.snapchat.com/@mrbeast/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYbHZzZmtrYm1jAZhMOQmTAZhMOQfqAAAAAQ\",\n  \"postUrl\": \"https://www.snapchat.com/@mrbeast/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYbHZzZmtrYm1jAZhMOQmTAZhMOQfqAAAAAQ\",\n  \"snapId\": \"W7_EDlXWTBiXAEEniNoMPwAAYbHZzZmtrYm1jAZhMOQmTAZhMOQfqAAAAAQ\",\n  \"commentId\": \"123456789-987654321\",\n  \"parentCommentId\": null,\n  \"depth\": 0,\n  \"authorId\": \"789012345-678901234\",\n  \"postAuthorId\": \"345678901-234567890\",\n  \"isPostAuthor\": false,\n  \"authorName\": \"Example Author\",\n  \"authorUsername\": \"example_author\",\n  \"authorImageUrl\": \"https://example.com/avatar.jpg\",\n  \"text\": \"Example public comment\",\n  \"publishedAt\": \"2026-08-06T12:00:00.000Z\",\n  \"likes\": 12,\n  \"replyCount\": 2,\n  \"postCommentCount\": 34,\n  \"status\": \"ok\",\n  \"statusReason\": null,\n  \"observedAt\": \"2026-08-06T12:01:00.000Z\"\n}\n```\n\nReply rows use the same fields. A reply has `depth: 1`, a `parentCommentId`,\nand its own `commentId`. `commentId` is the stable ID for that saved row.\n\n### 📌 `OUTPUT` run summary\n\nThe `OUTPUT` record is stored in the default key-value store. It includes:\n\n- 📥 `inputCount`: number of input URLs after input normalization.\n- 🗃️ `datasetId`: the default dataset that holds comment rows.\n- ✅ `successfulInputs`: URLs whose public Spotlight page was read and matched.\n- ⚠️ `failedInputs`: URLs that could not be read or matched.\n- 💬 `usefulRows`: saved comment and reply rows.\n- 🛑 `stopReason`: normally `inputs_exhausted`, or `charge_limit_reached` when saving stops at the Apify charge limit.\n- 🕐 `startedAt` and `finishedAt`: run times in ISO format.\n- 🧾 `schemaVersion`: summary contract version.\n\nExample:\n\n```json\n{\n  \"schemaVersion\": \"1.0\",\n  \"startedAt\": \"2026-08-06T12:00:00.000Z\",\n  \"finishedAt\": \"2026-08-06T12:01:00.000Z\",\n  \"inputCount\": 1,\n  \"datasetId\": \"exampleDatasetId\",\n  \"usefulRows\": 34,\n  \"successfulInputs\": 1,\n  \"failedInputs\": 0,\n  \"stopReason\": \"inputs_exhausted\"\n}\n```\n\n## 🚦 Status, identity, and data quality\n\n- ✅ Every saved dataset row has `status: \"ok\"` and `statusReason: null`.\n- ⚠️ Invalid or unavailable inputs do not become placeholder rows. They increase `failedInputs` in `OUTPUT` instead.\n- 🛑 If every input fails, the Actor writes `OUTPUT` and then marks the run as failed.\n- 🔗 Top-level comments use `parentCommentId: null` and `depth: 0`.\n- 🧵 Reply rows use the public parent ID when available and `depth: 1`.\n- 🆔 Comment and author IDs are returned as stable source ID strings when exposed.\n- 👤 `isPostAuthor` is `true` or `false` when both author IDs are present; otherwise it can be `null`.\n- 🕐 `observedAt` is when the row was collected. `publishedAt` is the public comment time when available.\n- 📊 `postCommentCount` is the public post-level comment count when available. It can be higher than the rows returned by the public source.\n\nRows from a later run are new observations. The Actor does not update or merge\nrows from earlier datasets.\n\n## 🔒 Public-source boundary\n\nSnapchat Comments Scraper uses public, logged-out Snapchat Spotlight pages and\nthe public comments and replies exposed for those pages at run time.\n\nIt does not:\n\n- 🚫 Ask for a Snapchat login, account credentials, or private account access.\n- 🚫 Read private, account-only, deleted, hidden, or otherwise unavailable posts.\n- 🚫 Collect profiles, search results, channels, or content not tied to a supplied Spotlight URL.\n- 🚫 Solve challenges or bypass an access control.\n- 🚫 Download Spotlight media or add sentiment, intent, or sensitive-trait labels.\n\n## ⚠️ Limits and interpretation\n\n- 📉 Public comment availability can change between runs. Deleted, hidden, moderated, or region-limited comments may not be returned.\n- 🧮 A requested post comment count can be higher than the rows available from the public comment pages.\n- 🧭 `startUrls` is a known-object input. This Actor does not discover Spotlight posts by username, keyword, profile, or search.\n- 🧵 `includeReplies` adds direct reply rows and more work. It has no numeric reply limit; public reply pages can end before all displayed replies are available.\n- ⏱️ There is no numeric comment cap. A run can stop when public pages end, the Apify timeout is reached, or an Apify charge limit stops saving.\n- 🔁 Exact duplicate URL values are removed before processing. Repeated comment IDs are removed within each public comment or reply traversal.\n- 🧾 The public comment count, reply count, likes, author fields, and dates can change or be missing at collection time.\n\n## ❓ FAQ\n\n### Does this Actor need a Snapchat login or API key?\n\nNo. It uses public, logged-out Spotlight data and does not require a Snapchat\nlogin, account credentials, or an API key.\n\n### Does this Actor collect every comment on a Spotlight post?\n\nIt keeps reading until the public comment pages end, subject to the run timeout\nand Apify charge limit. Snapchat may expose fewer comments than its displayed\ncount, and the public list can change between runs.\n\n### Is there a hidden comment or reply cap?\n\nNo. The input has no numeric comment or reply cap. The Actor keeps reading the\npublic pages until they end, the run times out, or an Apify charge limit stops\nrow saving. Snapchat can still expose fewer rows than the count shown on a post.\n\n### Are replies separate results?\n\nYes. Turn on `includeReplies`. Each saved reply is a separate dataset row with\nits own `commentId`, a `parentCommentId`, and `depth: 1`. There is no numeric\nreply cap in the input.\n\n### Why did I receive fewer rows than expected?\n\nThe public source may have ended, the post may have no readable public comments,\nthe input may have failed, the run may have timed out, or an Apify charge limit\nmay have stopped saving. Check `OUTPUT` for `usefulRows`, `successfulInputs`,\n`failedInputs`, and `stopReason`.\n\n### How are duplicates handled?\n\nExact duplicate input URL values are removed before collection. Within a public\ncomment or reply traversal, repeated source comment IDs are saved once.\n\n### Does this Actor search Snapchat for posts?\n\nNo. Provide the full public Spotlight URL for each post you want to inspect.\n\n### What happens when a post has no public comments?\n\nNo comment rows are saved. The public page can still count as a successful input,\nwhile `usefulRows` remains zero. A failed page read is counted in `failedInputs`.\n\n### What do I pay for?\n\nThe result unit is one saved public comment or reply row. The `snapchat-comment`\nevent is sent once at the save boundary for each saved row. Inputs that do not\nproduce rows do not create result events.\n\n## ⚖️ Responsible use\n\nThis Actor collects data that Snapchat exposes to logged-out public viewers at\nrun time. You are responsible for using the data lawfully and for following\napplicable privacy, data-protection, research, and platform rules. Do not use\npublic comments to harass people, infer sensitive traits, or make automated\nhigh-impact decisions about individuals.\n\n## 🛟 Support\n\nFor help, include the Apify run ID, one input Spotlight URL, the result you\nexpected, and the observed dataset or `OUTPUT` summary. Say whether the issue\naffects one URL, one row, or the whole run. Do not send account credentials or\nprivate Snapchat links.\n\n## 🔗 Related social media Actors\n\nContinue the same workflow on this platform or compare public data across\nplatforms.\n\n### Continue on Snapchat\n\n- [Snapchat Spotlight Metrics Scraper](https://apify.com/chronometrica/snapchat-metrics-scraper)\n  — collect public Spotlight post views, engagement, creator, and media data.\n\n### Compare comments across platforms\n\n- [Facebook Comments Scraper](https://apify.com/chronometrica/facebook-comments-scraper)\n  — collect public comments, replies, authors, dates, and reactions.\n- [Instagram Comments Scraper](https://apify.com/chronometrica/instagram-comments-scraper)\n  — collect public comments, authors, dates, likes, and reply counts.\n- [TikTok Comments Scraper](https://apify.com/chronometrica/tiktok-comments-scraper)\n  — collect public comments, replies, authors, likes, and thread links.\n- [YouTube Comments Scraper](https://apify.com/chronometrica/youtube-comments-scraper)\n  — collect public comments, replies, authors, likes, pins, and creator\n  hearts.\n- [Reddit Comments Scraper](https://apify.com/chronometrica/reddit-comments-scraper)\n  — collect public thread comments, replies, authors, scores, and dates.\n- [LinkedIn Comments Scraper](https://apify.com/chronometrica/linkedin-comments-scraper)\n  — collect public comments, replies, authors, dates, and reactions.\n"
    },
    "buildNumber": "1.0.36",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "release-candidate",
      "versionNumber": "1.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.007486666666666667
    }
  }
}