{
  "data": {
    "id": "PVaxSDk15Jpxj1NkU",
    "actId": "kB6j4bIZI9O1NNQzf",
    "userId": "9Um4NEFR7z42j35AD",
    "startedAt": "2026-08-16T17:54:30.262Z",
    "finishedAt": "2026-08-16T17:54:45.392Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 15068,
      "runTimeSecs": 15.068,
      "computeUnits": 0.01674222222222222,
      "imageSizeBytes": 561878016
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Snapchat Spotlight Metrics 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      \"maxItems\": 500,\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_EDlXWTBiXAEEniNoMPwAAYeHprYmRwYXJhAZPbUvpEAZPbUvjcAAAAAQ\"\n      ]\n    }\n  },\n  \"required\": [\n    \"startUrls\"\n  ]\n}",
    "readme": "# Snapchat Spotlight Metrics Scraper\n\n## 📊 What does Snapchat Spotlight Metrics Scraper do?\n\nSnapchat Spotlight Metrics Scraper turns known public Spotlight URLs into\nreliable post insight rows. Get current views, likes, comments, shares,\nrecommendations, creator details, and media links for up to 500 posts per run.\n\nEvery accepted input gets an ordered success or failure row. Clear status\ndetails show why a public post could not be read, and only successful result\nrows are billed. This Actor accepts known URLs; it does not discover posts or\nprofiles.\n\nUse it for:\n\n- 📈 Tracking known Spotlight posts over time.\n- 🕵️ Comparing public post performance for creators, brands, or campaigns.\n- 📣 Checking public metrics for campaign and creator deliverables.\n- 📊 Feeding post snapshots into dashboards, spreadsheets, and data warehouses.\n- 🔎 Researching the public content, creator, sound, and media details shown for\n  a Spotlight post.\n\nThe Actor does not log in, use account session data, read private posts, or\ncollect comment text. It only uses information available from public Spotlight\npages at run time.\n\n## 📦 What Snapchat Spotlight data can I extract?\n\nEach successful dataset row represents one public Snapchat Spotlight post. A\nfailed or unsupported input keeps the same flat row shape and includes a status\nreason so the input is still easy to audit.\n\n| Data group        | Example fields                                                                                   |\n| ----------------- | ------------------------------------------------------------------------------------------------ |\n| 🔗 Post identity  | `inputUrl`, `url`, `snapId`                                                                      |\n| 👤 Creator        | `creatorId`, `username`, `creatorName`, `creatorUrl`, `creatorImageUrl`                          |\n| 🧾 Post details   | `generatedTitle`, `generatedDescription`, `generatedKeywords`, `detectedLanguage`, `publishedAt` |\n| 🎵 Sound          | `soundId`, `soundTitle`, `soundCreator`                                                          |\n| 📊 Public metrics | `views`, `likes`, `comments`, `shares`, `recommendations`                                        |\n| 🎬 Media          | `durationMs`, `width`, `height`, `mediaUrl`, `thumbnailUrl`, `transcriptUrl`                     |\n| 🚦 Row state      | `status`, `statusReason`, `observedAt`                                                           |\n\nThe Actor keeps creator and sound fields as post context. It does not discover\nprofiles, search sounds, collect comments, or return a list of recommended\nposts.\n\n## ⚙️ Can I use this Actor through an API?\n\nYes. You can run Snapchat Spotlight Metrics Scraper in Apify Console or use it\nthrough:\n\n- 🔌 Apify API.\n- 🐍 Python SDK.\n- 🟢 Node.js SDK.\n- 🔔 Webhooks.\n- 🗓️ Scheduled runs.\n- 🔗 Apify integrations.\n\nThe default output is available as dataset items. The `OUTPUT` record contains\na short run summary with input, useful-row, failed-row, and stop information.\n\n## 🎯 Why scrape Snapchat Spotlight post metrics?\n\nPublic Spotlight snapshots help you compare known posts and keep a time-stamped\nrecord of what Snapchat showed when the run happened.\n\n| Use case                     | How the data helps                                                              |\n| ---------------------------- | ------------------------------------------------------------------------------- |\n| 📈 Track post performance    | Compare views, likes, comments, shares, and recommendations across runs.        |\n| 🧑‍🎤 Research creators         | Keep the public creator name, username, URL, and image shown for each post.     |\n| 📣 Measure campaigns         | Check public metrics for known campaign or creator post URLs.                   |\n| 🎵 Study post context        | Keep generated summaries, detected language, and public sound details together. |\n| 🧱 Build reporting workflows | Load flat rows into dashboards, spreadsheets, APIs, or warehouse tables.        |\n\n## 💵 How much does it cost?\n\nThe Actor uses pay-per-event pricing. One `snapchat-post` event represents one\nsuccessful post row and is charged when that row is saved.\n\n| Apify plan | Price per 1,000 successful rows |\n| ---------- | ------------------------------- |\n| Free       | $2.00                           |\n| Bronze     | $1.75                           |\n| Silver     | $1.50                           |\n| Gold       | $1.25                           |\n\nInvalid, unsupported, and failed inputs are written as free audit rows. They do\nnot fire the success event and are not billed as successful results.\n\n## 🚀 How do I use Snapchat Spotlight Metrics Scraper?\n\n1. Create or log in to your Apify account.\n2. Open **Snapchat Spotlight Metrics Scraper**.\n3. Paste one or more public Snapchat Spotlight URLs.\n4. Leave the default settings for your first run.\n5. Click **Start**.\n6. Open the **Output** tab to inspect dataset rows and the run summary.\n7. Download the dataset as JSON, JSONL, CSV, Excel, XML, RSS, or HTML.\n\n## ⬇️ Input\n\nThe required input is `startUrls`. It must contain at least one full public\nSpotlight URL using `https://`.\n\n```json\n{\n  \"startUrls\": [\n    \"https://www.snapchat.com/@mrbeast/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYeHprYmRwYXJhAZPbUvpEAZPbUvjcAAAAAQ\"\n  ]\n}\n```\n\n### 🔗 Supported URL shapes\n\nThe input form accepts URLs in this shape:\n\n```text\nhttps://www.snapchat.com/@creator/spotlight/SNAP_ID\nhttps://snapchat.com/@creator/spotlight/SNAP_ID\nhttps://www.snapchat.com/@creator/spotlight/SNAP_ID?tracking=value\n```\n\nThe `www` subdomain is optional. Query strings and fragments are removed when\nthe clean post URL is created. Other Snapchat pages, profile-only URLs, search\nURLs, and non-HTTPS URLs are not supported.\n\n### 🎛️ Settings\n\nThere are no other public input controls in the current schema.\n\n| Setting        | What it does                                                                                             |\n| -------------- | -------------------------------------------------------------------------------------------------------- |\n| 🔗 `startUrls` | One to 500 public Snapchat Spotlight URLs. Duplicate input strings are removed before processing.        |\n| 🚫 `maxItems`  | Not a separate input. Every run has the same built-in 500-URL ceiling.                                   |\n| 🚫 `mode`      | Not supported. This Actor accepts known Spotlight URLs only; it has no profile or search discovery mode. |\n\n## ⬆️ Output sample\n\nThe results are stored in the default dataset. This example shows the public\nrow shape; live counts, links, and timestamps can change between runs.\n\n```json\n{\n  \"inputUrl\": \"https://www.snapchat.com/@mrbeast/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYeHprYmRwYXJhAZPbUvpEAZPbUvjcAAAAAQ\",\n  \"url\": \"https://www.snapchat.com/@mrbeast/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYeHprYmRwYXJhAZPbUvpEAZPbUvjcAAAAAQ\",\n  \"snapId\": \"W7_EDlXWTBiXAEEniNoMPwAAYeHprYmRwYXJhAZPbUvpEAZPbUvjcAAAAAQ\",\n  \"creatorId\": \"fe63dec1-4fa4-476c-9c73-19b2bc2e8589\",\n  \"username\": \"mrbeast\",\n  \"creatorName\": \"MrBeast\",\n  \"creatorUrl\": \"https://www.snapchat.com/@mrbeast\",\n  \"creatorImageUrl\": \"https://cdn.example/creator.jpg\",\n  \"generatedTitle\": \"Example Spotlight post\",\n  \"generatedDescription\": \"Example generated description\",\n  \"generatedKeywords\": [\"example\", \"spotlight\"],\n  \"detectedLanguage\": \"en\",\n  \"soundId\": \"sound-123\",\n  \"soundTitle\": \"Example Sound\",\n  \"soundCreator\": \"Example Artist\",\n  \"publishedAt\": \"2023-11-14T22:13:20.000Z\",\n  \"views\": 1234,\n  \"likes\": 179,\n  \"comments\": 29,\n  \"shares\": 5,\n  \"recommendations\": 18,\n  \"durationMs\": 12000,\n  \"width\": 1080,\n  \"height\": 1920,\n  \"mediaUrl\": \"https://cdn.example/video.mp4\",\n  \"thumbnailUrl\": \"https://cdn.example/thumbnail.jpg\",\n  \"transcriptUrl\": \"https://cdn.example/captions.json\",\n  \"status\": \"ok\",\n  \"statusReason\": null,\n  \"observedAt\": \"2026-08-06T00:00:00.000Z\"\n}\n```\n\n`inputUrl` keeps the submitted value. `url` is the cleaned public post URL.\n`observedAt` records when the row was collected.\n\n### 📌 Run summary\n\nThe Actor writes an `OUTPUT` record to the default key-value store. It contains:\n\n- 🏷️ `actorName`: `snapchat-post-metrics`.\n- 🔢 `schemaVersion`: the run summary schema version.\n- 🕒 `startedAt` and `finishedAt`: run timestamps.\n- 📥 `inputCount`: number of input URLs after input validation.\n- 🗃️ `datasetId`: the default dataset used for the run.\n- ✅ `usefulRows`: successful rows saved with the `snapchat-post` event.\n- ⚠️ `failedRows`: invalid, unsupported, or failed rows saved without that\n  event.\n- 🛑 `stopReason`: normally `inputs_exhausted`, or\n  `charge_limit_reached` when the event limit stops processing.\n\nFor a complete run, `usefulRows + failedRows` matches `inputCount`. If a charge\nlimit stops the run, remaining inputs are not attempted.\n\n## 🎯 Status and quality behavior\n\nThe row-level `status` and `statusReason` fields explain the outcome:\n\n| Status               | Meaning                                                              |\n| -------------------- | -------------------------------------------------------------------- |\n| ✅ `ok`              | The requested public Spotlight post was found and a row was created. |\n| ✏️ `invalid_url`     | The input is not a valid full URL.                                   |\n| 🚫 `unsupported_url` | The URL is not a supported public Spotlight URL.                     |\n| ⚠️ `failed`          | The public post could not be read after the bounded retry window.    |\n\nThe current public row schema does not include per-metric status or precision\nfields. Metric columns are plain values or `null`:\n\n- 🔢 Non-negative public count values are returned as numbers.\n- ❔ Negative source sentinel values, missing values, and invalid numeric values\n  become `null`; they are not changed to zero.\n- 🕒 Public counts can change after a run, so compare snapshots using\n  `observedAt`.\n- 🧭 The Actor matches the requested `snapId` before reading post fields. A\n  nearby Spotlight item cannot fill the requested row.\n- 🗣️ `detectedLanguage` is returned only when the source language score is at\n  least 0.5. Weak guesses stay `null`.\n- 🏷️ Duplicate generated keywords are removed before they are written to the row.\n\n## 🔒 Source boundary\n\nThis Actor reads public, logged-out Snapchat Spotlight pages.\n\n- ✅ It accepts known public Spotlight post URLs.\n- ✅ It reads fields Snapchat exposes publicly for the requested post.\n- ❌ It does not log in or use account session data, account tokens, or private\n  access.\n- ❌ It does not solve challenges or bypass access controls.\n- ❌ It does not scrape private, deleted, or login-only post data.\n- ❌ It does not collect comments, replies, profile-wide metrics, sound search results, or\n  recommended-post lists.\n\nCreator, sound, and media fields are included only when the public post data\nshows them. A missing field is not proof that the source value is zero.\n\n## ⚠️ Limits and interpretation\n\n- 🔗 The public input is limited to full HTTPS Spotlight URLs with a creator\n  path and post ID.\n- 🔢 The Actor processes up to 500 unique input URLs in the submitted order.\n  There is no public discovery mode or batch-size tuning control.\n- ⏱️ The current default run timeout is 1,800 seconds.\n- 💾 The current default and maximum Actor memory is 256 MB. The Node process\n  also uses a 128 MB heap limit.\n- 🔁 Temporary public request errors use a bounded retry window. A post can\n  still finish with `failed` when the public page cannot be read.\n- 📉 Snapchat may hide, omit, or mark a public count as unavailable. These\n  fields remain `null`.\n- 🔄 Counts are point-in-time values and may change between runs.\n- 🎬 Media and thumbnail links may expire or stop working after the run.\n- 🧩 A public post can return a partial row when some optional creator, sound,\n  detected language, metric, or media fields are not shown.\n\n## ❓ FAQ\n\n### 🔑 Does this Actor need login or an API key?\n\nNo. It reads public Spotlight pages without a Snapchat login, account session\ndata, or a customer API key.\n\n### 💬 Does it collect comments or replies?\n\nNo. The `comments` field is a public count when Snapchat exposes it. This Actor\ndoes not collect comment text, authors, or replies.\n\n### 📈 Why is a metric `null`?\n\nThe public page did not provide a usable value, or Snapchat used an unavailable\nnegative sentinel. The Actor keeps the field `null` instead of guessing zero.\n\n### 🧭 Why did I get a failure row?\n\nThe URL may be invalid, outside the supported Spotlight shape, unavailable, or\ntemporarily unreadable. Check `status` and `statusReason` in the dataset row.\n\n### 🔁 Can I monitor a post over time?\n\nYes. Run the Actor on the same public Spotlight URL on a schedule and compare\nrows by `snapId` and `observedAt`. Counts are snapshots, not a permanent history\nmaintained by the Actor.\n\n### 🧾 Can I use the media link later?\n\nUse media links soon after collection. Public media links can expire.\n\n## ⚖️ Legal and use notes\n\nThis Actor collects public Snapchat data available without login. You are\nresponsible for using the data in line with applicable laws, platform terms, and\nprivacy rules. Do not collect or process personal data unless you have a valid\nreason and legal basis.\n\nSnapchat is a trademark of its owner. This Actor is independent and is not\naffiliated with, endorsed by, or sponsored by Snapchat.\n\n## 🛟 Support\n\nIf a run does not return what you expected, include:\n\n- 🆔 The Apify run ID.\n- 🔗 The exact Spotlight input URL.\n- 🧾 The affected dataset row.\n- 🚦 The row `status` and `statusReason`.\n- 📌 The `OUTPUT` run summary.\n- 🕒 The approximate time of the run and the `observedAt` value.\n\nThis helps separate an invalid URL, unsupported surface, missing public field,\nsource change, and temporary read failure without sharing account session data\nor private account data.\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 Comments Scraper](https://apify.com/chronometrica/snapchat-comments-scraper)\n  — collect public comments and replies from Snapchat Spotlight posts.\n\n### Compare metrics across platforms\n\n- [Facebook Metrics Scraper](https://apify.com/chronometrica/facebook-metrics-scraper)\n  — collect public post, Reel, video, photo, and profile metrics.\n- [Instagram Metrics Scraper](https://apify.com/chronometrica/instagram-metrics-scraper)\n  — collect public post, Reel, carousel, profile, and collaboration metrics.\n- [TikTok Metrics Scraper](https://apify.com/chronometrica/tiktok-metrics-scraper)\n  — collect public video, profile, engagement, hashtag, and music data.\n- [YouTube Metrics Scraper](https://apify.com/chronometrica/youtube-metrics-scraper)\n  — collect public video, Short, channel, and engagement metrics.\n- [X Post Metrics Scraper](https://apify.com/chronometrica/x-post-metrics)\n  — collect public post views, engagement, media, and author details.\n",
    "changelog": "# Changelog\n\n## 1.0.0\n\n- ⚡ First public release: collect public Snapchat Spotlight metrics, creator\n  details, generated post context, and media links from known post URLs.\n",
    "actorDefinition": {
      "$schema": "https://apify.com/schemas/v1/actor.ide.json",
      "actorSpecification": 1,
      "name": "snapchat-metrics-scraper",
      "title": "Snapchat Spotlight Metrics Scraper",
      "description": "Get reliable Snapchat Spotlight insights from known post URLs. Extract views, likes, comments, shares, recommendations, creator details, and media links for up to 500 posts per run.",
      "seoTitle": "Snapchat Spotlight Metrics Scraper | Views, Likes & Comments",
      "seoDescription": "Get reliable Snapchat Spotlight insights from known post URLs. Extract views, likes, comments, shares, recommendations, creator details, and media links for up to 500 posts per run.",
      "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_EDlXWTBiXAEEniNoMPwAAYeHprYmRwYXJhAZPbUvpEAZPbUvjcAAAAAQ\"\n  ]\n}"
      },
      "input": {
        "title": "Snapchat Spotlight Metrics 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,
            "maxItems": 500,
            "uniqueItems": true,
            "items": {
              "type": "string",
              "pattern": "^https://(www\\.)?snapchat\\.com/@[^/?#]+/spotlight/[^/?#]+(?:[/?#].*)?$"
            },
            "prefill": [
              "https://www.snapchat.com/@mrbeast/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYeHprYmRwYXJhAZPbUvpEAZPbUvjcAAAAAQ"
            ]
          }
        },
        "required": [
          "startUrls"
        ]
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Snapchat Spotlight Metrics Scraper output",
        "description": "Post rows are in the default dataset. OUTPUT contains a short run summary.",
        "properties": {
          "results": {
            "type": "string",
            "title": "Post 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",
                  "null"
                ]
              },
              "url": {
                "title": "Post URL",
                "type": [
                  "string",
                  "null"
                ]
              },
              "snapId": {
                "title": "Post ID",
                "type": [
                  "string",
                  "null"
                ]
              },
              "creatorId": {
                "title": "Creator ID",
                "type": [
                  "string",
                  "null"
                ]
              },
              "username": {
                "title": "Creator Username",
                "type": [
                  "string",
                  "null"
                ]
              },
              "creatorName": {
                "title": "Creator Name",
                "type": [
                  "string",
                  "null"
                ]
              },
              "creatorUrl": {
                "title": "Creator URL",
                "type": [
                  "string",
                  "null"
                ]
              },
              "creatorImageUrl": {
                "title": "Creator Image",
                "type": [
                  "string",
                  "null"
                ]
              },
              "generatedTitle": {
                "title": "Generated Title",
                "type": [
                  "string",
                  "null"
                ]
              },
              "generatedDescription": {
                "title": "Generated Description",
                "type": [
                  "string",
                  "null"
                ]
              },
              "generatedKeywords": {
                "title": "Generated Keywords",
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "detectedLanguage": {
                "title": "Detected Language",
                "type": [
                  "string",
                  "null"
                ]
              },
              "soundId": {
                "title": "Sound ID",
                "type": [
                  "string",
                  "null"
                ]
              },
              "soundTitle": {
                "title": "Sound",
                "type": [
                  "string",
                  "null"
                ]
              },
              "soundCreator": {
                "title": "Sound Creator",
                "type": [
                  "string",
                  "null"
                ]
              },
              "publishedAt": {
                "title": "Published At",
                "type": [
                  "string",
                  "null"
                ],
                "format": "date-time"
              },
              "views": {
                "title": "Views",
                "type": [
                  "integer",
                  "null"
                ]
              },
              "likes": {
                "title": "Likes",
                "type": [
                  "integer",
                  "null"
                ]
              },
              "comments": {
                "title": "Comments",
                "type": [
                  "integer",
                  "null"
                ]
              },
              "shares": {
                "title": "Shares",
                "type": [
                  "integer",
                  "null"
                ]
              },
              "recommendations": {
                "title": "Recommendations",
                "type": [
                  "integer",
                  "null"
                ]
              },
              "durationMs": {
                "title": "Duration (ms)",
                "type": [
                  "integer",
                  "null"
                ]
              },
              "width": {
                "title": "Width",
                "type": [
                  "integer",
                  "null"
                ]
              },
              "height": {
                "title": "Height",
                "type": [
                  "integer",
                  "null"
                ]
              },
              "mediaUrl": {
                "title": "Media URL",
                "type": [
                  "string",
                  "null"
                ]
              },
              "thumbnailUrl": {
                "title": "Thumbnail URL",
                "type": [
                  "string",
                  "null"
                ]
              },
              "transcriptUrl": {
                "title": "Transcript URL",
                "type": [
                  "string",
                  "null"
                ]
              },
              "status": {
                "title": "Status",
                "type": "string"
              },
              "statusReason": {
                "title": "Status Reason",
                "type": [
                  "string",
                  "null"
                ]
              },
              "observedAt": {
                "title": "Observed At",
                "type": "string",
                "format": "date-time"
              }
            },
            "required": [
              "inputUrl",
              "observedAt",
              "status"
            ]
          },
          "views": {
            "overview": {
              "title": "Post metrics",
              "transformation": {
                "fields": [
                  "inputUrl",
                  "url",
                  "username",
                  "soundTitle",
                  "publishedAt",
                  "views",
                  "likes",
                  "comments",
                  "shares",
                  "recommendations",
                  "status"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "inputUrl": {
                    "label": "Input",
                    "format": "link"
                  },
                  "url": {
                    "label": "Post",
                    "format": "link"
                  },
                  "username": {
                    "label": "Creator"
                  },
                  "soundTitle": {
                    "label": "Sound"
                  },
                  "publishedAt": {
                    "label": "Published",
                    "format": "date"
                  },
                  "views": {
                    "label": "Views",
                    "format": "number"
                  },
                  "likes": {
                    "label": "Likes",
                    "format": "number"
                  },
                  "comments": {
                    "label": "Comments",
                    "format": "number"
                  },
                  "shares": {
                    "label": "Shares",
                    "format": "number"
                  },
                  "recommendations": {
                    "label": "Recommendations",
                    "format": "number"
                  },
                  "status": {
                    "label": "Status"
                  }
                }
              }
            }
          }
        }
      },
      "dockerfile": "../Dockerfile",
      "changelog": "# Changelog\n\n## 1.0.0\n\n- ⚡ First public release: collect public Snapchat Spotlight metrics, creator\n  details, generated post context, and media links from known post URLs.\n",
      "readme": "# Snapchat Spotlight Metrics Scraper\n\n## 📊 What does Snapchat Spotlight Metrics Scraper do?\n\nSnapchat Spotlight Metrics Scraper turns known public Spotlight URLs into\nreliable post insight rows. Get current views, likes, comments, shares,\nrecommendations, creator details, and media links for up to 500 posts per run.\n\nEvery accepted input gets an ordered success or failure row. Clear status\ndetails show why a public post could not be read, and only successful result\nrows are billed. This Actor accepts known URLs; it does not discover posts or\nprofiles.\n\nUse it for:\n\n- 📈 Tracking known Spotlight posts over time.\n- 🕵️ Comparing public post performance for creators, brands, or campaigns.\n- 📣 Checking public metrics for campaign and creator deliverables.\n- 📊 Feeding post snapshots into dashboards, spreadsheets, and data warehouses.\n- 🔎 Researching the public content, creator, sound, and media details shown for\n  a Spotlight post.\n\nThe Actor does not log in, use account session data, read private posts, or\ncollect comment text. It only uses information available from public Spotlight\npages at run time.\n\n## 📦 What Snapchat Spotlight data can I extract?\n\nEach successful dataset row represents one public Snapchat Spotlight post. A\nfailed or unsupported input keeps the same flat row shape and includes a status\nreason so the input is still easy to audit.\n\n| Data group        | Example fields                                                                                   |\n| ----------------- | ------------------------------------------------------------------------------------------------ |\n| 🔗 Post identity  | `inputUrl`, `url`, `snapId`                                                                      |\n| 👤 Creator        | `creatorId`, `username`, `creatorName`, `creatorUrl`, `creatorImageUrl`                          |\n| 🧾 Post details   | `generatedTitle`, `generatedDescription`, `generatedKeywords`, `detectedLanguage`, `publishedAt` |\n| 🎵 Sound          | `soundId`, `soundTitle`, `soundCreator`                                                          |\n| 📊 Public metrics | `views`, `likes`, `comments`, `shares`, `recommendations`                                        |\n| 🎬 Media          | `durationMs`, `width`, `height`, `mediaUrl`, `thumbnailUrl`, `transcriptUrl`                     |\n| 🚦 Row state      | `status`, `statusReason`, `observedAt`                                                           |\n\nThe Actor keeps creator and sound fields as post context. It does not discover\nprofiles, search sounds, collect comments, or return a list of recommended\nposts.\n\n## ⚙️ Can I use this Actor through an API?\n\nYes. You can run Snapchat Spotlight Metrics Scraper in Apify Console or use it\nthrough:\n\n- 🔌 Apify API.\n- 🐍 Python SDK.\n- 🟢 Node.js SDK.\n- 🔔 Webhooks.\n- 🗓️ Scheduled runs.\n- 🔗 Apify integrations.\n\nThe default output is available as dataset items. The `OUTPUT` record contains\na short run summary with input, useful-row, failed-row, and stop information.\n\n## 🎯 Why scrape Snapchat Spotlight post metrics?\n\nPublic Spotlight snapshots help you compare known posts and keep a time-stamped\nrecord of what Snapchat showed when the run happened.\n\n| Use case                     | How the data helps                                                              |\n| ---------------------------- | ------------------------------------------------------------------------------- |\n| 📈 Track post performance    | Compare views, likes, comments, shares, and recommendations across runs.        |\n| 🧑‍🎤 Research creators         | Keep the public creator name, username, URL, and image shown for each post.     |\n| 📣 Measure campaigns         | Check public metrics for known campaign or creator post URLs.                   |\n| 🎵 Study post context        | Keep generated summaries, detected language, and public sound details together. |\n| 🧱 Build reporting workflows | Load flat rows into dashboards, spreadsheets, APIs, or warehouse tables.        |\n\n## 💵 How much does it cost?\n\nThe Actor uses pay-per-event pricing. One `snapchat-post` event represents one\nsuccessful post row and is charged when that row is saved.\n\n| Apify plan | Price per 1,000 successful rows |\n| ---------- | ------------------------------- |\n| Free       | $2.00                           |\n| Bronze     | $1.75                           |\n| Silver     | $1.50                           |\n| Gold       | $1.25                           |\n\nInvalid, unsupported, and failed inputs are written as free audit rows. They do\nnot fire the success event and are not billed as successful results.\n\n## 🚀 How do I use Snapchat Spotlight Metrics Scraper?\n\n1. Create or log in to your Apify account.\n2. Open **Snapchat Spotlight Metrics Scraper**.\n3. Paste one or more public Snapchat Spotlight URLs.\n4. Leave the default settings for your first run.\n5. Click **Start**.\n6. Open the **Output** tab to inspect dataset rows and the run summary.\n7. Download the dataset as JSON, JSONL, CSV, Excel, XML, RSS, or HTML.\n\n## ⬇️ Input\n\nThe required input is `startUrls`. It must contain at least one full public\nSpotlight URL using `https://`.\n\n```json\n{\n  \"startUrls\": [\n    \"https://www.snapchat.com/@mrbeast/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYeHprYmRwYXJhAZPbUvpEAZPbUvjcAAAAAQ\"\n  ]\n}\n```\n\n### 🔗 Supported URL shapes\n\nThe input form accepts URLs in this shape:\n\n```text\nhttps://www.snapchat.com/@creator/spotlight/SNAP_ID\nhttps://snapchat.com/@creator/spotlight/SNAP_ID\nhttps://www.snapchat.com/@creator/spotlight/SNAP_ID?tracking=value\n```\n\nThe `www` subdomain is optional. Query strings and fragments are removed when\nthe clean post URL is created. Other Snapchat pages, profile-only URLs, search\nURLs, and non-HTTPS URLs are not supported.\n\n### 🎛️ Settings\n\nThere are no other public input controls in the current schema.\n\n| Setting        | What it does                                                                                             |\n| -------------- | -------------------------------------------------------------------------------------------------------- |\n| 🔗 `startUrls` | One to 500 public Snapchat Spotlight URLs. Duplicate input strings are removed before processing.        |\n| 🚫 `maxItems`  | Not a separate input. Every run has the same built-in 500-URL ceiling.                                   |\n| 🚫 `mode`      | Not supported. This Actor accepts known Spotlight URLs only; it has no profile or search discovery mode. |\n\n## ⬆️ Output sample\n\nThe results are stored in the default dataset. This example shows the public\nrow shape; live counts, links, and timestamps can change between runs.\n\n```json\n{\n  \"inputUrl\": \"https://www.snapchat.com/@mrbeast/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYeHprYmRwYXJhAZPbUvpEAZPbUvjcAAAAAQ\",\n  \"url\": \"https://www.snapchat.com/@mrbeast/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYeHprYmRwYXJhAZPbUvpEAZPbUvjcAAAAAQ\",\n  \"snapId\": \"W7_EDlXWTBiXAEEniNoMPwAAYeHprYmRwYXJhAZPbUvpEAZPbUvjcAAAAAQ\",\n  \"creatorId\": \"fe63dec1-4fa4-476c-9c73-19b2bc2e8589\",\n  \"username\": \"mrbeast\",\n  \"creatorName\": \"MrBeast\",\n  \"creatorUrl\": \"https://www.snapchat.com/@mrbeast\",\n  \"creatorImageUrl\": \"https://cdn.example/creator.jpg\",\n  \"generatedTitle\": \"Example Spotlight post\",\n  \"generatedDescription\": \"Example generated description\",\n  \"generatedKeywords\": [\"example\", \"spotlight\"],\n  \"detectedLanguage\": \"en\",\n  \"soundId\": \"sound-123\",\n  \"soundTitle\": \"Example Sound\",\n  \"soundCreator\": \"Example Artist\",\n  \"publishedAt\": \"2023-11-14T22:13:20.000Z\",\n  \"views\": 1234,\n  \"likes\": 179,\n  \"comments\": 29,\n  \"shares\": 5,\n  \"recommendations\": 18,\n  \"durationMs\": 12000,\n  \"width\": 1080,\n  \"height\": 1920,\n  \"mediaUrl\": \"https://cdn.example/video.mp4\",\n  \"thumbnailUrl\": \"https://cdn.example/thumbnail.jpg\",\n  \"transcriptUrl\": \"https://cdn.example/captions.json\",\n  \"status\": \"ok\",\n  \"statusReason\": null,\n  \"observedAt\": \"2026-08-06T00:00:00.000Z\"\n}\n```\n\n`inputUrl` keeps the submitted value. `url` is the cleaned public post URL.\n`observedAt` records when the row was collected.\n\n### 📌 Run summary\n\nThe Actor writes an `OUTPUT` record to the default key-value store. It contains:\n\n- 🏷️ `actorName`: `snapchat-post-metrics`.\n- 🔢 `schemaVersion`: the run summary schema version.\n- 🕒 `startedAt` and `finishedAt`: run timestamps.\n- 📥 `inputCount`: number of input URLs after input validation.\n- 🗃️ `datasetId`: the default dataset used for the run.\n- ✅ `usefulRows`: successful rows saved with the `snapchat-post` event.\n- ⚠️ `failedRows`: invalid, unsupported, or failed rows saved without that\n  event.\n- 🛑 `stopReason`: normally `inputs_exhausted`, or\n  `charge_limit_reached` when the event limit stops processing.\n\nFor a complete run, `usefulRows + failedRows` matches `inputCount`. If a charge\nlimit stops the run, remaining inputs are not attempted.\n\n## 🎯 Status and quality behavior\n\nThe row-level `status` and `statusReason` fields explain the outcome:\n\n| Status               | Meaning                                                              |\n| -------------------- | -------------------------------------------------------------------- |\n| ✅ `ok`              | The requested public Spotlight post was found and a row was created. |\n| ✏️ `invalid_url`     | The input is not a valid full URL.                                   |\n| 🚫 `unsupported_url` | The URL is not a supported public Spotlight URL.                     |\n| ⚠️ `failed`          | The public post could not be read after the bounded retry window.    |\n\nThe current public row schema does not include per-metric status or precision\nfields. Metric columns are plain values or `null`:\n\n- 🔢 Non-negative public count values are returned as numbers.\n- ❔ Negative source sentinel values, missing values, and invalid numeric values\n  become `null`; they are not changed to zero.\n- 🕒 Public counts can change after a run, so compare snapshots using\n  `observedAt`.\n- 🧭 The Actor matches the requested `snapId` before reading post fields. A\n  nearby Spotlight item cannot fill the requested row.\n- 🗣️ `detectedLanguage` is returned only when the source language score is at\n  least 0.5. Weak guesses stay `null`.\n- 🏷️ Duplicate generated keywords are removed before they are written to the row.\n\n## 🔒 Source boundary\n\nThis Actor reads public, logged-out Snapchat Spotlight pages.\n\n- ✅ It accepts known public Spotlight post URLs.\n- ✅ It reads fields Snapchat exposes publicly for the requested post.\n- ❌ It does not log in or use account session data, account tokens, or private\n  access.\n- ❌ It does not solve challenges or bypass access controls.\n- ❌ It does not scrape private, deleted, or login-only post data.\n- ❌ It does not collect comments, replies, profile-wide metrics, sound search results, or\n  recommended-post lists.\n\nCreator, sound, and media fields are included only when the public post data\nshows them. A missing field is not proof that the source value is zero.\n\n## ⚠️ Limits and interpretation\n\n- 🔗 The public input is limited to full HTTPS Spotlight URLs with a creator\n  path and post ID.\n- 🔢 The Actor processes up to 500 unique input URLs in the submitted order.\n  There is no public discovery mode or batch-size tuning control.\n- ⏱️ The current default run timeout is 1,800 seconds.\n- 💾 The current default and maximum Actor memory is 256 MB. The Node process\n  also uses a 128 MB heap limit.\n- 🔁 Temporary public request errors use a bounded retry window. A post can\n  still finish with `failed` when the public page cannot be read.\n- 📉 Snapchat may hide, omit, or mark a public count as unavailable. These\n  fields remain `null`.\n- 🔄 Counts are point-in-time values and may change between runs.\n- 🎬 Media and thumbnail links may expire or stop working after the run.\n- 🧩 A public post can return a partial row when some optional creator, sound,\n  detected language, metric, or media fields are not shown.\n\n## ❓ FAQ\n\n### 🔑 Does this Actor need login or an API key?\n\nNo. It reads public Spotlight pages without a Snapchat login, account session\ndata, or a customer API key.\n\n### 💬 Does it collect comments or replies?\n\nNo. The `comments` field is a public count when Snapchat exposes it. This Actor\ndoes not collect comment text, authors, or replies.\n\n### 📈 Why is a metric `null`?\n\nThe public page did not provide a usable value, or Snapchat used an unavailable\nnegative sentinel. The Actor keeps the field `null` instead of guessing zero.\n\n### 🧭 Why did I get a failure row?\n\nThe URL may be invalid, outside the supported Spotlight shape, unavailable, or\ntemporarily unreadable. Check `status` and `statusReason` in the dataset row.\n\n### 🔁 Can I monitor a post over time?\n\nYes. Run the Actor on the same public Spotlight URL on a schedule and compare\nrows by `snapId` and `observedAt`. Counts are snapshots, not a permanent history\nmaintained by the Actor.\n\n### 🧾 Can I use the media link later?\n\nUse media links soon after collection. Public media links can expire.\n\n## ⚖️ Legal and use notes\n\nThis Actor collects public Snapchat data available without login. You are\nresponsible for using the data in line with applicable laws, platform terms, and\nprivacy rules. Do not collect or process personal data unless you have a valid\nreason and legal basis.\n\nSnapchat is a trademark of its owner. This Actor is independent and is not\naffiliated with, endorsed by, or sponsored by Snapchat.\n\n## 🛟 Support\n\nIf a run does not return what you expected, include:\n\n- 🆔 The Apify run ID.\n- 🔗 The exact Spotlight input URL.\n- 🧾 The affected dataset row.\n- 🚦 The row `status` and `statusReason`.\n- 📌 The `OUTPUT` run summary.\n- 🕒 The approximate time of the run and the `observedAt` value.\n\nThis helps separate an invalid URL, unsupported surface, missing public field,\nsource change, and temporary read failure without sharing account session data\nor private account data.\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 Comments Scraper](https://apify.com/chronometrica/snapchat-comments-scraper)\n  — collect public comments and replies from Snapchat Spotlight posts.\n\n### Compare metrics across platforms\n\n- [Facebook Metrics Scraper](https://apify.com/chronometrica/facebook-metrics-scraper)\n  — collect public post, Reel, video, photo, and profile metrics.\n- [Instagram Metrics Scraper](https://apify.com/chronometrica/instagram-metrics-scraper)\n  — collect public post, Reel, carousel, profile, and collaboration metrics.\n- [TikTok Metrics Scraper](https://apify.com/chronometrica/tiktok-metrics-scraper)\n  — collect public video, profile, engagement, hashtag, and music data.\n- [YouTube Metrics Scraper](https://apify.com/chronometrica/youtube-metrics-scraper)\n  — collect public video, Short, channel, and engagement metrics.\n- [X Post Metrics Scraper](https://apify.com/chronometrica/x-post-metrics)\n  — collect public post views, engagement, media, and author details.\n"
    },
    "buildNumber": "1.0.49",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.01674222222222222
    }
  }
}