# Snapchat Spotlight Comment & Reaction Scraper (`dataspryva/snapchat-spotlight-comment-and-reaction-scraper`) Actor

Get comment threads from Snapchat Spotlight videos, by direct video URL or by creator username. Each comment includes text, commenter display name and Bitmoji IDs, reaction counts, posting time, and reply count.

- **URL**: https://apify.com/dataspryva/snapchat-spotlight-comment-and-reaction-scraper.md
- **Developed by:** [Dataspryva](https://apify.com/dataspryva) (community)
- **Categories:** Social media, Videos, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Snapchat Spotlight Comment & Reaction Scraper

Scrape public **Snapchat Spotlight** comment threads — not just the handful of comments Snapchat embeds on a video page. Collect root comments and their direct replies for specific Spotlight videos, a creator's pinned Spotlights, a hashtag or topic, or the trending Spotlight feed of a country. Every row can include commenter details, reaction breakdowns, moderation fields, timestamps and hydrated video context such as the creator, caption, thumbnail and engagement counts.

### What this actor does

- **Four modes:** `bySpotlightUrls`, `byUsername`, `byTopic`, `byFeed`
- **Full threads:** pages through the public comment service instead of stopping at the first embedded page
- **Optional replies:** emits depth-1 replies as separate rows linked by `parentCommentId`
- **Video context:** attaches creator, caption, hashtags, media URLs and engagement counts to every comment
- **Global row cap:** `maxItems` stops the run at a predictable dataset size
- **Omit-empty:** fields the source does not publish for a record are left out, never sent as `null`

### Services

| Service | What it gives you |
|---|---|
| Spotlight URL or ID lookup | Every root comment and optional reply for one or more specific videos |
| Creator profile lookup | Comments for the Spotlight videos pinned on a public creator profile |
| Hashtag / topic discovery | Comments for videos found on public tag, explore and topic pages |
| Country trending feed | Comments for videos in the public Spotlight feed of one country |
| Video hydration | Creator, caption, hashtags, thumbnail, video URL, duration, dimensions, post time and engagement counts |
| Error rows | A readable error row when an input cannot be resolved, so one bad input does not fail the whole run |

### How it works

The actor reads the same public Spotlight pages and public comment data that any visitor can see on snapchat.com. It discovers videos first, then pages through the comment service for each video, optionally follows the reply cursor for comments that have replies, and hydrates video details in batches. It runs without a login, cookies, API key or proxy configuration. Requests are paced politely and repeated briefly when Snapchat returns a temporary server error.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `byUsername` | `bySpotlightUrls` / `byUsername` / `byTopic` / `byFeed` |
| `spotlightUrls` | array | – | Spotlight URLs, `@user/spotlight` links, `t.snapchat.com` links or raw snap IDs (mode=bySpotlightUrls) |
| `usernames` | array | `["brentrivera"]` | Snapchat usernames, `@names` or profile URLs (mode=byUsername) |
| `topics` | array | `["food"]` | Hashtags, topic slugs or `/tag`, `/explore`, `/topic` URLs (mode=byTopic) |
| `country` | string | `US` | ISO 3166-1 alpha-2 country code for the trending feed (mode=byFeed) |
| `maxVideosPerSource` | integer | `50` | Stop after this many videos per username, topic or feed (1–100); ignored for explicit URLs |
| `maxCommentsPerVideo` | integer | `100` | Maximum comment rows per video, including replies (1–100000) |
| `includeReplies` | boolean | `false` | Emit direct replies as separate rows |
| `maxItems` | integer | `1000000` | Global dataset row cap (1–1000000) |

Older tasks that send `maxCommentsPerSnap` are mapped automatically to `maxCommentsPerVideo`; an explicit non-default `maxCommentsPerVideo` takes precedence. The former `bySpotlightUrl` mode value is still accepted.

#### Example: full thread for one video, with replies

```json
{
  "mode": "bySpotlightUrls",
  "spotlightUrls": [
    "https://www.snapchat.com/@brentrivera/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYdXd0bndkZmd1AZrNg9asAZrNg8LXAAAAAQ"
  ],
  "maxCommentsPerVideo": 5000,
  "includeReplies": true,
  "maxItems": 10000
}
```

#### Example: comments for a creator's pinned Spotlights

```json
{
  "mode": "byUsername",
  "usernames": ["brentrivera", "waqarzaka"],
  "maxVideosPerSource": 10,
  "maxCommentsPerVideo": 200
}
```

#### Example: discover videos by hashtag

```json
{
  "mode": "byTopic",
  "topics": ["food", "https://www.snapchat.com/tag/travel"],
  "maxVideosPerSource": 20,
  "maxCommentsPerVideo": 100,
  "includeReplies": true
}
```

#### Example: trending feed in the United Kingdom

```json
{
  "mode": "byFeed",
  "country": "GB",
  "maxVideosPerSource": 25,
  "maxCommentsPerVideo": 50
}
```

### Output

Every comment row is a flat object. Identity and thread fields come first, followed by commenter, engagement, video context and scrape metadata.

- `recordType` — `comment` or `error`
- `commentId`, `snapId`, `snapUrl`
- `sourceUsername`, `inputUrl`, `topic`, `topicUrl`, `feedCountry` — mode context
- `parentCommentId`, `depth` — `0` for root comments, `1` for replies
- `replyText`
- `postedAt`, `updatedAt`
- `threadedReplyCount`
- `commenterDisplayName`, `commenterId`, `commenterProfileId`, `commenterUsername`, `commenterProfileUrl`, `commenterIsPostAuthor`
- `commenterBitmojiAvatarId`, `commenterBitmojiSelfieId`, `commenterProfileLogoUrl`
- `reactionCounts` — array of `{reactTypeId, count}`
- `likeCount` — sum of all reaction counts
- `reportCount`, `approvalState` — Snapchat moderation fields
- `rankingScore`
- `creatorUsername`, `creatorDisplayName`, `creatorProfileUrl`, `creatorIsOfficial`
- `videoCaption`, `videoHashtags`, `videoThumbnailUrl`, `videoUrl`
- `videoDurationSeconds`, `videoWidth`, `videoHeight`, `videoPostedAt`
- `videoViewCount`, `videoShareCount`, `videoCommentCount`, `videoBoostCount`, `videoRecommendCount`
- `videoAiTitle`, `videoAiDescription`, `videoKeywords`
- `scrapedAt`

Error rows use `recordType: "error"`, the relevant input field (`inputUrl`, `inputUsername`, `topic`, `topicUrl` or `feedCountry`), an optional `snapId`, an `error` message and `scrapedAt`.

### Use cases

- **Audience research** — read what viewers say under a creator's or a brand's Spotlights.
- **Campaign monitoring** — collect comment volume, reactions and replies around a hashtag or country feed.
- **Moderation and safety** — export public comments, reports and moderation state for review.
- **Sentiment and trend analysis** — feed comment text and timestamps into NLP or dashboard pipelines.
- **Creator benchmarking** — compare comment engagement across several creators or videos.
- **Video-level reporting** — join comments with captions, hashtags and video engagement in one dataset.

### Usage cost

Apify charges for the compute your runs use, based on the actor's memory setting and run time. This actor runs at 1 GB by default. Cost grows with the number of videos and comment pages you request, so use `maxVideosPerSource`, `maxCommentsPerVideo` and `maxItems` to keep runs inside your budget. A small run over one video or one creator costs a fraction of a cent; a large full-thread crawl across many videos costs more because it makes more requests. No paid proxy or external API is required.

### FAQ

**Do I need a Snapchat account, cookies or an API key?**
No. The actor reads public Snapchat pages and public comment data without logging in.

**Do I need to configure a proxy?**
No. The actor connects to Snapchat automatically.

**Why are there fewer comments than Snapchat shows on a video?**
Snapchat can display a total comment count that is larger than the number of comments it pages out to anonymous visitors. The actor pages until the source stops returning a cursor, and records the reported `videoCommentCount` when Snapchat publishes one. It never invents rows.

**What is the difference between a comment and a reply?**
Root comments have `depth: 0`. Direct replies have `depth: 1` and a `parentCommentId`. Enable `includeReplies` to emit them.

**Why is a commenter username or Bitmoji missing?**
Snapchat only exposes some commenter profile fields for some accounts. When a field is not published for that comment, it is omitted from the row.

**Why does byUsername return only a few videos?**
Public creator profiles list the creator's pinned Spotlight highlights, not their complete Spotlight history. Increase `maxVideosPerSource` to use every pinned video that is available.

**Can I scrape comments for a hashtag that has no /tag page?**
Yes. The actor falls back to Snapchat's explore page for the same term, and also accepts an explicit `/topic/<slug>` URL.

**What happens when a video was removed?**
Snapchat may keep its comment thread available even when the video page and metadata are gone. Such rows keep the comments and omit the missing video fields.

**Is this affiliated with Snapchat?**
No. This is an independent third-party actor that reads publicly visible Snapchat data and has no relationship with Snap Inc.

### Notes

- Comment text is returned exactly as published, including emoji and non-Latin scripts.
- Timestamps are ISO 8601 UTC.
- Duplicate comment IDs from Snapchat's own pages are removed within a run.
- One invalid URL, username or topic produces an error row and the run continues with the remaining inputs.
- The default task is deliberately small: one profile, one video and a few comments.

### Limitations

- Creator profiles expose only pinned Spotlight videos, not the full back catalogue.
- Replies are depth-1 only; nested reply chains are not followed recursively.
- Commenter usernames and some profile fields are published for a minority of comments.
- Snapchat may page out fewer comments than the count shown in its interface.
- Topic and tag pages expose a limited set of videos (roughly 20–30 per page) with no pagination.
- The trending feed is personalised and changes between requests; results are a snapshot of the moment the run executes.
- Removed videos can keep comments while losing metadata, so video context may be absent on those rows.

# Actor input Schema

## `mode` (type: `string`):

Choose what to scrape: specific Spotlight videos, creator profiles, hashtags/topics, or the trending country feed.

## `spotlightUrls` (type: `array`):

(mode=bySpotlightUrls) One or more Spotlight URLs, @user/spotlight links, t.snapchat.com links, or raw snap IDs.

## `usernames` (type: `array`):

(mode=byUsername) Snapchat usernames, @names, /add/name or /@name profile URLs.

## `topics` (type: `array`):

(mode=byTopic) Hashtags or topics, or /tag, /explore and /topic URLs.

## `country` (type: `string`):

(mode=byFeed) Country whose trending Spotlight feed is used.

## `maxVideosPerSource` (type: `integer`):

For username, topic and feed modes, stop after this many Spotlight videos per source. Ignored for explicit URLs.

## `maxCommentsPerVideo` (type: `integer`):

Maximum comment rows per Spotlight video, including replies when enabled. Set high (for example 100000) for the full public thread.

## `includeReplies` (type: `boolean`):

Emit direct replies as separate rows with parentCommentId and depth 1.

## `maxItems` (type: `integer`):

Global cap on dataset rows. The default is effectively unlimited for backward compatibility.

## Actor input object example

```json
{
  "mode": "byUsername",
  "usernames": [
    "brentrivera"
  ],
  "topics": [
    "food"
  ],
  "country": "US",
  "maxVideosPerSource": 1,
  "maxCommentsPerVideo": 3,
  "includeReplies": false,
  "maxItems": 3
}
```

# Actor output Schema

## `comments` (type: `string`):

Dataset containing all scraped Snapchat Spotlight comment, reply and error rows.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "mode": "byUsername",
    "usernames": [
        "brentrivera"
    ],
    "topics": [
        "food"
    ],
    "country": "US",
    "maxVideosPerSource": 1,
    "maxCommentsPerVideo": 3,
    "includeReplies": false,
    "maxItems": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("dataspryva/snapchat-spotlight-comment-and-reaction-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "mode": "byUsername",
    "usernames": ["brentrivera"],
    "topics": ["food"],
    "country": "US",
    "maxVideosPerSource": 1,
    "maxCommentsPerVideo": 3,
    "includeReplies": False,
    "maxItems": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("dataspryva/snapchat-spotlight-comment-and-reaction-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "mode": "byUsername",
  "usernames": [
    "brentrivera"
  ],
  "topics": [
    "food"
  ],
  "country": "US",
  "maxVideosPerSource": 1,
  "maxCommentsPerVideo": 3,
  "includeReplies": false,
  "maxItems": 3
}' |
apify call dataspryva/snapchat-spotlight-comment-and-reaction-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dataspryva/snapchat-spotlight-comment-and-reaction-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/4XR18BddISADEml9C/builds/gAELgOsLCExTByN8L/openapi.json
