# Snapchat User Spotlight Scraper By Keyword & Hashtag (`simpleapi/snapchat-user-spotlight-scraper`) Actor

Snapchat User Spotlight Scraper finds and extracts public Spotlight content by keyword and hashtag, including creator profiles, usernames, captions, video details, timestamps, engagement data, and more for content research and trend analysis.

- **URL**: https://apify.com/simpleapi/snapchat-user-spotlight-scraper.md
- **Developed by:** [SimpleAPI](https://apify.com/simpleapi) (community)
- **Categories:** Automation, Lead generation, Social media
- **Stats:** 3 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.99 / 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.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### Snapchat Spotlight Scraper — Videos, Creators & Hashtag Topics

Snapchat Spotlight Scraper By Keyword & Hashtag returns Spotlight videos, creator accounts and hashtag topics for any search term — no starting username required. Each row carries `viewCount`, `shareCount`, `commentCount`, `boostCount`, `hashtags`, `subscriberCount` and `snapCount` read straight from Snapchat's own public pages, plus the keyword that produced it. Influencer researchers, trend analysts and content teams use it to go from a topic idea to a ranked list of matching videos, creators and hashtag topics in one run. Add a known username and its own Spotlight set is collected alongside the keyword results.

### 🧭 What is Snapchat Spotlight Scraper By Keyword & Hashtag?

It is a keyword-first Snapchat scraper: give it a term or hashtag, and it reads Snapchat's public `/explore/<term>` discovery page to return the Spotlight videos, creator accounts and hashtag topics Snapchat itself associates with that term. No Snapchat login, account or API key is used anywhere in the run — every page it reads is publicly reachable.

- **Discovery by keyword or hashtag** — a leading `#` is optional; `football` and `#football` normalize the same way.
- **Known accounts too** — add usernames or profile URLs in `startUrls` and their public Spotlight videos are collected in the same run.
- **Creator identity and reach** — `username`, `displayName`, `profileUrl`, `subscriberCount`, `businessProfileId` for every discovered account.
- **Real engagement, not the rounded tile label** — `viewCount`, `shareCount`, `commentCount`, `boostCount` and `recommendCount` come from Snapchat's own numeric fields; the rounded `"415K"`-style label is kept separately as `approxPlayCount`.
- **Two expansion paths** — follow discovered hashtag topics one or two steps further, or open every discovered creator's full public Spotlight set.
- **Quality and volume filters** — `minViews`, `minSubscribers`, `oldestVideoDate`, `skipDuplicates` and `maxResults`, all applied to data already fetched.
- **Standard Apify export** — results land in the run's dataset and download as JSON, CSV, Excel or the other formats the Apify dataset export supports.

### 📊 What data can I extract with Snapchat Spotlight Scraper?

Every selected `discoverySources` value becomes its own row type, and lineage fields tie every row back to the term or account that produced it.

#### Spotlight video fields

| Field | Example value | Use case |
| --- | --- | --- |
| `type` | `"spotlightVideo"` | Tell this row apart from creator, topic, lens or status rows |
| `username` | `"nxrlnrblx"` | Who posted the video |
| `displayName` | `"TrendCrateFootball"` | Human-readable creator name |
| `profileUrl` | `"https://www.snapchat.com/@nxrlnrblx"` | Link straight to the creator's profile |
| `spotlightId` | `"W7_EDlXWTBiXAEEniNoMPwAA..."` | Stable identifier for the video |
| `spotlightUrl` | `"https://www.snapchat.com/spotlight/W7_..."` | Canonical public link to the video |
| `videoTitle` | `"What is Tuchel doing bro"` | Snapchat's own on-tile label, when present |
| `llmTitle` | `"England vs Argentina Match Moment"` | Snapchat's AI-generated descriptive title |
| `description` | `"#football #spotlight #worldcup"` | Creator's own caption text |
| `hashtags` | `["#football", "#spotlight"]` | Content and trend tagging |
| `viewCount` | `374442` | Rank by real popularity |
| `shareCount` | `13244` | Virality signal |
| `commentCount` | `581` | Engagement depth |
| `boostCount` | `31822` | Snapchat's "boost" reaction count |
| `recommendCount` | `7008` | Recommend count |
| `approxPlayCount` | `"415K"` | Snapchat's rounded tile label — a string, not a number |
| `publishedAt` | `"2026-07-17T21:43:35.954000Z"` | ISO timestamp for recency filtering |
| `uploadDate` | `1784324615954` | Same timestamp as epoch milliseconds, numeric |
| `uploadDateMs` | `"1784324615954"` | Same value, as a string |
| `durationMs` | `"6030"` | Video length in milliseconds |
| `width` / `height` | `540` / `960` | Video dimensions |
| `thumbnailUrl` | `"https://.../"` | Preview image link |
| `contentUrl` | `"https://.../"` | Direct media URL |
| `deeplink` | `"https://click.snapchat.com/..."` | App-open link |
| `isResolved` | `true` | Whether the creator/caption completion step ran on this row |
| `success` | `true` | Whether this row represents a fully-fetched item |

#### ├── Creator, hashtag topic, lens and show fields

- **Creator (`discoveredCreator`)** — `username`, `displayName`, `creatorDescription`, `creatorLogoUrl`, `profileUrl`, `businessProfileId`, `subscriberCount`, `isOfficialAccount`, `hasHighlights`. This is the decision-driving data for influencer sourcing: subscriber count and official-account status let you rank and filter candidates without opening each profile.
- **Hashtag topic (`hashtagTopic`)** — `topicText`, `snapCount`, `topicThumbnailUrl`, `topicUrl`. `snapCount` is the real number of Snaps behind the topic, straight from Snapchat, not a rounded label.
- **AR lens (`discoveredLens`)** — `lensName`, `lensId`, `lensIconUrl`, `lensUnlockUrl`, `lensCreatorName`, `isOfficialLens`.
- **Show / publisher (`discoveredPublisher`)** — `publisherName`, `publisherDescription`, `publisherId`, `businessProfileId`, `subscriberCount`, `publisherUrl`, `publisherIconUrl`.

#### └── Lineage, targeting and bookkeeping fields

These are the fields you filter and segment on, present on every row: `seedKeyword` (the term you submitted), `resolvedQuery` (the term Snapchat itself says it answered), `discoveredVia` (`keywordSpotlightVideo`, `keywordCreator`, `keywordHashtagTopic`, `keywordLens`, `keywordPublisher`, `creatorProfileExpansion` or `knownAccount`), `discoveryRank` (position within that term and source), `expandedFromTopic` (the hashtag topic this row came from, when topic expansion is on), `expansionDepth` (`0` for your own terms, `1` or `2` for followed topics and opened creators), `isChild`, `scrapedAt`. A `status` row (never charged) instead carries `target`, `targetKind`, `outcome`, `message`, `username`, `error` and `videoCount`, explaining a term or account that had nothing to return.

### How does Snapchat Spotlight Scraper differ from the official Snapchat API?

Snapchat's own developer platform, the [Public Profile API's Creator Discovery endpoint](https://developers.snap.com/marketing-api/Public-Profile-API/CreatorDiscovery), takes a `query` parameter — but as documented, that parameter searches creator metadata, not Spotlight video content, and its only Spotlight signal is `min_spotlight_views` / `max_spotlight_views`, restricted to the last 24 hours (checked 2026-08-15).

| Feature | Snap Public Profile API — Creator Discovery | Snapchat Spotlight Scraper By Keyword & Hashtag |
| --- | --- | --- |
| Keyword search over Spotlight video content | `query` searches creator metadata, not videos | Any keyword or hashtag returns matching Spotlight videos directly |
| Spotlight view metrics window | `min_spotlight_views`/`max_spotlight_views`, last 24 hours only | `viewCount`, `shareCount`, `commentCount`, `boostCount`, `recommendCount` as shown at request time, no fixed window |
| Hashtag topic discovery | Not exposed by this endpoint | Dedicated `hashtagTopics` source with 1–2 levels of expansion |
| Access | Bearer token issued through Snap's developer/business program | An Apify account; no Snapchat credentials |
| Result delivery | Authenticated REST call, cursor-paginated, `limit` default 100 | Apify dataset — JSON, CSV, Excel and other export formats |

#### ├── Can I just search Snapchat's own API by keyword?

Not for Spotlight video content. The Creator Discovery endpoint's `query` parameter is documented as a keyword search "on the creator's metadata and content" — it returns matching creators, not a ranked list of matching videos — and the only Spotlight-related figure it exposes, `min_spotlight_views`/`max_spotlight_views`, only covers the last 24 hours, so it cannot answer "what has this term produced historically." This actor reads Snapchat's own public discovery page for the term instead, which returns the videos, creator accounts and hashtag topics Snapchat currently ranks for it, with each video's full current engagement figures rather than a 24-hour window.

Use the official API when you already operate inside Snap's business/marketing tooling and only need creator-level metrics for accounts that have opted into data sharing. Use this actor when you need keyword- or hashtag-driven video discovery without applying for API access.

### 💡 How to use data extracted from Snapchat

#### ├── 🎯 Influencer and talent scouts

Run a niche keyword — a sport, a beauty category, a game title — with `discoverySources` including `creators`, set `minSubscribers` to your floor, and the run returns a ranked shortlist of public creator accounts with `subscriberCount`, `creatorDescription` and `profileUrl` ready to open. Turn on `expandDiscoveredCreators` to also pull each shortlisted creator's own Spotlight videos in the same run, so you can judge content quality before reaching out.

#### ├── 🏢 Social media agencies

Point the same keyword set at a client's category on a schedule and compare `viewCount`, `shareCount` and `boostCount` across runs to track how their Spotlight presence, and their competitors', is trending. Because `resolvedQuery` and `seedKeyword` are both recorded on every row, you can prove which term produced which numbers when reporting back to the client.

#### ├── 📈 Market research and trend intelligence

Enable `hashtagTopics` and `expandHashtagTopics` with `topicExpansionDepth: 2` to map how far a subject's hashtag cluster extends, using `snapCount` on each `hashtagTopic` row as the volume signal. `expandedFromTopic` and `expansionDepth` on every downstream row show exactly which branch of the topic tree it came from.

#### └── 🤖 AI agents and automated pipelines

Feed `description`, `hashtags` and `llmTitle` into a classification or RAG pipeline to summarize what a term's Spotlight content is actually about, or call the actor as a discovery step ahead of a video-download or transcription pipeline. The Actor is reachable as a standard Apify REST call, so any agent framework that can make an authenticated HTTP request can trigger a run.

### 🔼 Input sample

None of the 17 fields are required — an empty input still runs, using each field's own default, provided at least one keyword, hashtag or known account ends up in scope.

| Parameter | Required | Type | Description | Example value |
| --- | --- | --- | --- | --- |
| `searchKeywords` | No | array (`stringList`) | Words, phrases or hashtags to look up, for example 'football', 'makeup' or '#footballchallenge'. A leading # is optional. | `["football", "#makeup"]` |
| `discoverySources` | No | array (`select`, enum: `spotlightVideos`, `creators`, `hashtagTopics`, `lenses`, `publishers`) | Choose which kinds of results are collected. Every selected kind becomes its own labelled row type in the output. | `["spotlightVideos", "creators", "hashtagTopics"]` |
| `resolveVideoDetails` | No | boolean | A discovery result lists a video without naming its creator. Switch this on to complete each video with its creator handle, caption, hashtags, publish date and duration. | `true` |
| `maxVideoResolutions` | No | integer (0–50000) | Upper limit on how many videos are completed with creator and caption details in one run. Videos beyond the limit are still returned, with the details left empty rather than guessed. | `10` |
| `expandHashtagTopics` | No | boolean | Each hashtag topic found for your keyword becomes a new term of its own, producing a further set of videos, creators and topics with the parent topic recorded on every row. | `true` |
| `topicExpansionDepth` | No | integer (1–2) | 1 follows the topics found for your keyword. 2 also follows the topics those topics reveal. | `1` |
| `maxTopicsPerKeyword` | No | integer (0–200) | Upper limit on how many hashtag topics are followed from any single term. | `2` |
| `expandDiscoveredCreators` | No | boolean | Every creator account found for a term is opened and their public Spotlight videos are collected, carrying the term that led to them. | `false` |
| `maxCreatorsPerKeyword` | No | integer (0–500) | Upper limit on how many discovered creators are opened from any single term. | `3` |
| `maxVideosPerCreator` | No | integer (0–20000) | Upper limit on the Spotlight videos taken from any one creator profile. 0 means take everything the public profile shows. | `10` |
| `skipDuplicates` | No | boolean | The same video, creator or topic can surface under several terms. Leave this on to write each one exactly once and report how many repeats were skipped. | `true` |
| `minViews` | No | integer (min 0) | Only keep Spotlight videos with at least this many views. 0 keeps everything. | `0` |
| `minSubscribers` | No | integer (min 0) | Only keep discovered creator accounts with at least this many subscribers. 0 keeps everything. | `0` |
| `oldestVideoDate` | No | string (`datepicker`, absolute or relative) | Drop Spotlight videos published before this point. Accepts a date or a relative value such as '3 months'. Applies to videos whose publish date is known, which requires the creator and caption step above. | `"3 months"` |
| `maxResults` | No | integer (0–100000) | Hard ceiling on how many result rows the run writes, so a broad set of keywords cannot run away with your budget. 0 means no ceiling. | `10` |
| `startUrls` | No | array (`stringList`) | Optional list of Snapchat usernames (for example 'realmadrid') or profile URLs (for example 'https://www.snapchat.com/@realmadrid'). | `["realmadrid"]` |
| `proxyConfiguration` | No | object (`proxy`) | Choose the connection settings for this run. By default the run goes out directly. Enabling this can improve reliability on large runs. | `{ "useApifyProxy": false }` |

```json
{
  "searchKeywords": ["football", "#makeup"],
  "discoverySources": ["spotlightVideos", "creators", "hashtagTopics"],
  "resolveVideoDetails": true,
  "maxVideoResolutions": 25,
  "expandHashtagTopics": true,
  "topicExpansionDepth": 1,
  "maxTopicsPerKeyword": 2,
  "expandDiscoveredCreators": false,
  "maxCreatorsPerKeyword": 3,
  "maxVideosPerCreator": 20,
  "skipDuplicates": true,
  "minViews": 0,
  "minSubscribers": 0,
  "oldestVideoDate": "3 months",
  "maxResults": 500,
  "startUrls": [],
  "proxyConfiguration": { "useApifyProxy": false }
}
```

⚠️ **Common pitfall:** `maxVideoResolutions` is a run-wide budget, not a per-keyword one — it is spent in the order terms are processed, and every attempt counts against it even when Snapchat doesn't return a usable answer. With several keywords and a low value, videos from the first term get completed while later terms' videos are returned with `isResolved: false` and empty creator/caption fields. Raise `maxVideoResolutions` if you need completed rows across every term. Separately, `oldestVideoDate` only filters rows whose publish date is known — for keyword-discovered videos that requires `resolveVideoDetails: true`, since a bare discovery card carries no timestamp.

### 🔽 Output sample

Every result row is pushed as it is collected and billed under the `row_result` pay-per-event, except `status` rows, which explain an outcome (no page found, no usable answer, nothing to show) and are never charged — filter them out with `type != "status"` or keep only `success: true` rows. Discovered creators are additionally mirrored to a `<runId>-creators` dataset and hashtag topics to a `<runId>-topics` dataset. Results download as JSON, CSV, Excel or any other format the Apify dataset export supports.

```json
{
  "type": "spotlightVideo",
  "isChild": false,
  "username": "nxrlnrblx",
  "displayName": "TrendCrateFootball",
  "profileUrl": "https://www.snapchat.com/@nxrlnrblx",
  "spotlightId": "W7_EDlXWTBiXAEEniNoMPwAAYbW9tbGNpZmFsAZ9yCPzYAZ9yCO8SAAAAAw",
  "spotlightUrl": "https://www.snapchat.com/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYbW9tbGNpZmFsAZ9yCPzYAZ9yCO8SAAAAAw",
  "videoTitle": "What is Tuchel doing bro",
  "llmTitle": "England vs Argentina Match Moment: Coach Reaction & Player Action",
  "description": "#football #spotlight #worldcup #fifa #viral",
  "hashtags": ["#football", "#spotlight", "#worldcup", "#fifa", "#viral"],
  "viewCount": 374442,
  "shareCount": 13244,
  "commentCount": 581,
  "boostCount": 31822,
  "recommendCount": 7008,
  "approxPlayCount": "415K",
  "publishedAt": "2026-07-17T21:43:35.954000Z",
  "uploadDate": 1784324615954,
  "uploadDateMs": "1784324615954",
  "durationMs": "6030",
  "width": 540,
  "height": 960,
  "thumbnailUrl": "https://cf-st.sc-cdn.net/d/...",
  "contentUrl": "https://cf-st.sc-cdn.net/d/...",
  "deeplink": "https://click.snapchat.com/...",
  "isResolved": true,
  "seedKeyword": "football",
  "resolvedQuery": "football",
  "discoveredVia": "keywordSpotlightVideo",
  "discoveryRank": 1,
  "expandedFromTopic": null,
  "expansionDepth": 0,
  "success": true,
  "scrapedAt": "2026-08-08T10:04:43.514Z"
}
```

```json
{
  "type": "discoveredCreator",
  "isChild": true,
  "username": "footballarena11",
  "displayName": "Football Arena",
  "creatorDescription": "If you love football, you are in the right place.",
  "creatorLogoUrl": "https://cf-st.sc-cdn.net/d/...",
  "profileUrl": "https://www.snapchat.com/@footballarena11",
  "businessProfileId": "0bec0cce-3810-4d74-840e-f79ecd925af3",
  "subscriberCount": 1084,
  "isOfficialAccount": false,
  "hasHighlights": false,
  "seedKeyword": "football",
  "resolvedQuery": "football",
  "discoveredVia": "keywordCreator",
  "discoveryRank": 1,
  "expandedFromTopic": null,
  "expansionDepth": 0,
  "success": true,
  "scrapedAt": "2026-08-08T10:04:43.514Z"
}
```

```json
{
  "type": "hashtagTopic",
  "isChild": true,
  "topicText": "footballchallenge",
  "snapCount": 2348,
  "topicThumbnailUrl": "https://cf-st.sc-cdn.net/d/...",
  "topicUrl": "https://www.snapchat.com/explore/footballchallenge",
  "seedKeyword": "football",
  "resolvedQuery": "football",
  "discoveredVia": "keywordHashtagTopic",
  "discoveryRank": 1,
  "expandedFromTopic": null,
  "expansionDepth": 0,
  "success": true,
  "scrapedAt": "2026-08-08T10:04:43.514Z"
}
```

`discoveredLens` and `discoveredPublisher` rows follow the same lineage shape, carrying `lensName`/`lensId`/`lensIconUrl`/`lensUnlockUrl`/`lensCreatorName`/`isOfficialLens` or `publisherName`/`publisherDescription`/`publisherId`/`businessProfileId`/`subscriberCount`/`publisherUrl`/`publisherIconUrl` respectively, written only when `lenses` or `publishers` is included in `discoverySources`.

### 🎯 How do you filter and target specific Spotlight videos?

**Term vs. source selection.** `searchKeywords` is free text — Snapchat, not the actor, decides what matches. `discoverySources` then controls what you collect for each match: pick `spotlightVideos` alone for a lean video-only run, or add `creators` and `hashtagTopics` when you also need who is posting and what related topics exist.

**Scope precision.** Three independent knobs widen scope past the first discovery page: `expandHashtagTopics` with `topicExpansionDepth` follows the topic graph outward from your term; `expandDiscoveredCreators` opens every discovered creator's own Spotlight set; `startUrls` adds specific known accounts regardless of what any keyword finds. Each carries its own per-term ceiling (`maxTopicsPerKeyword`, `maxCreatorsPerKeyword`, `maxVideosPerCreator`).

**Quality thresholds.** `minViews` and `minSubscribers` are applied to figures Snapchat already returned with the result, so filtered-out items cost nothing extra. `oldestVideoDate` drops videos published before a date or a relative window like `"3 months"`.

**Volume controls.** `maxResults` is the hard ceiling for the whole run, `maxVideoResolutions` caps the completion step specifically, and `skipDuplicates` keeps the same video, creator or topic from being written twice when several terms surface it.

```json
{ "searchKeywords": ["footballchallenge"], "discoverySources": ["hashtagTopics", "spotlightVideos"], "expandHashtagTopics": true, "topicExpansionDepth": 2, "maxTopicsPerKeyword": 5 }
```

```json
{ "searchKeywords": ["makeup"], "discoverySources": ["creators"], "minSubscribers": 5000, "expandDiscoveredCreators": true, "maxCreatorsPerKeyword": 10, "maxVideosPerCreator": 5 }
```

```json
{ "searchKeywords": [], "startUrls": ["realmadrid", "https://www.snapchat.com/@teamsnapchat"], "minViews": 10000, "oldestVideoDate": "1 month" }
```

### ▶️ Want to try other Snapchat scrapers?

| Scraper name | What it extracts |
| --- | --- |
| **Snapchat Spotlight Scraper By Link, ID Or Share URL** | Full metadata for specific Spotlight videos you already have a link, ID or share URL for |
| **Snapchat Popular Accounts Scraper: Story & Spotlight Content** | Public profiles by keyword or URL, plus their Story and Spotlight items as individual listable snaps |
| **TikTok Scraper With Repost Insights Data** | TikTok profile videos, hashtag and keyword search, with repost analytics |
| **Instagram Post Details Scraper With Engagement Data** | Instagram post details with engagement figures |
| **Pinterest Autocomplete Scraper — Topic Audience & Reach** | Keyword-driven Pinterest topic suggestions with topic follower counts |
| **Facebook Video Transcript Extractor By Keyword Search** | Transcripts for public Facebook videos found by keyword, link or Page |

### How to extract Snapchat data programmatically

This actor runs like any Apify Actor: one authenticated call starts the run, and the results come back as structured JSON from the run's dataset.

#### ├── Python example

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")

run = client.actor("<store-username>/snapchat-user-spotlight-scraper-by-keyword-hashtag").call(
    run_input={
        "searchKeywords": ["football"],
        "discoverySources": ["spotlightVideos", "creators", "hashtagTopics"],
        "minViews": 5000,
        "maxResults": 200,
    }
)

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    if item.get("type") == "spotlightVideo":
        print(item["spotlightUrl"], item["viewCount"], item.get("hashtags"))
```

#### └── Export to spreadsheets or CRM

Export the dataset as CSV directly from the Apify Console or the API, and map columns straight onto their JSON keys: `username` and `displayName` to a contact-name column, `profileUrl` to a link column, `subscriberCount` and `viewCount` to numeric columns, `seedKeyword` to whatever campaign or tag field your CRM uses to group the import.

### ⚖️ Is it legal to scrape Snapchat?

Scraping publicly available data, such as public Spotlight videos and public creator profiles, is generally permitted — this is the same position taken in *hiQ Labs v. LinkedIn*. This actor only reads pages Snapchat serves without a login: public discovery pages, public video pages and public profile pages.

Because the output includes personal identifiers — creator usernames, display names and profile links tied to individual accounts — data protection law can still apply once you store or reuse it. If your use involves EU or California residents, GDPR and CCPA govern the lawful basis for storing and using that personal data, separately from whether the data was public when collected. Scraping is also still subject to Snapchat's Terms of Service. Consult legal counsel for commercial applications involving bulk storage of personal data.

### ❓ FAQ

**What happens when a keyword or account no longer has a page on Snapchat?**
You get a `status` row with `outcome: "unavailable"` and a plain explanation, and it is not charged. This is reported separately from `"noResults"` (Snapchat answered but had nothing for the term) and `"notReachable"` (no usable answer was received in this run) — a missing page, an empty answer and a failed attempt are never conflated.

**Can I get creator accounts and hashtag topics along with the videos?**
Yes. Select `creators` and `hashtagTopics` in `discoverySources` alongside `spotlightVideos`, and each becomes its own row type in the same dataset, carrying the term that produced it.

**How accurate are the view, share, comment and boost counts?**
`viewCount`, `shareCount`, `commentCount`, `boostCount` and `recommendCount` are Snapchat's own numeric figures at request time, not the rounded `"415K"`-style tile label — that label is kept separately as `approxPlayCount` precisely so it is never mistaken for the real number. Because these are live public counts, re-run the actor if you need a current reading rather than relying on a cached one.

**How many rows can I get per run?**
Up to `maxResults` (0–100000, 0 means no ceiling). Each keyword's Snapchat discovery page returns one fixed page of results — the underlying public page has no cursor-based pagination — so scale comes from adding more keywords and known accounts and from enabling topic and creator expansion, not from paging a single term further.

**How do I filter out low-quality creators and videos?**
`minViews` and `minSubscribers` apply to the figures already returned with each result, so unwanted rows cost nothing extra to exclude. Combine with `oldestVideoDate` to also drop older videos once `resolveVideoDetails` has filled in their publish dates.

**Does Snapchat Spotlight Scraper work with Claude, ChatGPT and other AI agent frameworks?**
Yes, as a standard HTTP endpoint. Any agent framework that can make an authenticated Apify API call can start a run and read back the dataset; no dedicated MCP server is documented for this actor.

**How does this differ from your other Snapchat scrapers?**
This one starts from a keyword or hashtag with no username needed. A sibling actor, Snapchat Spotlight Scraper By Link, ID Or Share URL, instead pulls one specific video you already have a link, ID or share URL for. Another sibling, Snapchat Popular Accounts Scraper, discovers profiles by keyword or URL and returns their Story and Spotlight items as individual listable snaps, rather than ranking Spotlight videos across the platform for a term.

**Can I use this without a Snapchat account, login or API key?**
Yes. Every page this actor reads is public. You only need an Apify account to run it — no Snapchat credentials of any kind.

**Does it download video files, or only metadata?**
Only metadata and URLs — `contentUrl`, `thumbnailUrl`, `spotlightUrl` and similar links. No video, image or audio file is downloaded or stored by the actor.

**Can it reach private accounts or Snaps?**
No. It only reads what Snapchat's public discovery, profile and video pages already show; private content is never accessed.

### Conclusion

Snapchat Spotlight Scraper By Keyword & Hashtag turns a keyword or hashtag into a structured, keyword-traceable set of Spotlight videos, creator accounts and hashtag topics — the step most Snapchat scrapers skip, since they assume you already know the handle. Influencer researchers, agencies and trend analysts use it to go from a topic idea to a filtered, ranked shortlist without touching a Snapchat login. Start a run from the Apify Console or the API with a single keyword to see the output shape before scaling up to a full keyword list.

# Actor input Schema

## `searchKeywords` (type: `array`):

Words, phrases or hashtags to look up, for example 'football', 'makeup' or '#footballchallenge'. A leading # is optional.

## `discoverySources` (type: `array`):

Choose which kinds of results are collected. Every selected kind becomes its own labelled row type in the output.

## `resolveVideoDetails` (type: `boolean`):

A discovery result lists a video without naming its creator. Switch this on to complete each video with its creator handle, caption, hashtags, publish date and duration.

## `maxVideoResolutions` (type: `integer`):

Upper limit on how many videos are completed with creator and caption details in one run. Videos beyond the limit are still returned, with the details left empty rather than guessed.

## `expandHashtagTopics` (type: `boolean`):

Each hashtag topic found for your keyword becomes a new term of its own, producing a further set of videos, creators and topics with the parent topic recorded on every row.

## `topicExpansionDepth` (type: `integer`):

1 follows the topics found for your keyword. 2 also follows the topics those topics reveal.

## `maxTopicsPerKeyword` (type: `integer`):

Upper limit on how many hashtag topics are followed from any single term.

## `expandDiscoveredCreators` (type: `boolean`):

Every creator account found for a term is opened and their public Spotlight videos are collected, carrying the term that led to them.

## `maxCreatorsPerKeyword` (type: `integer`):

Upper limit on how many discovered creators are opened from any single term.

## `maxVideosPerCreator` (type: `integer`):

Upper limit on the Spotlight videos taken from any one creator profile. 0 means take everything the public profile shows.

## `skipDuplicates` (type: `boolean`):

The same video, creator or topic can surface under several terms. Leave this on to write each one exactly once and report how many repeats were skipped.

## `minViews` (type: `integer`):

Only keep Spotlight videos with at least this many views. 0 keeps everything.

## `minSubscribers` (type: `integer`):

Only keep discovered creator accounts with at least this many subscribers. 0 keeps everything.

## `oldestVideoDate` (type: `string`):

Drop Spotlight videos published before this point. Accepts a date or a relative value such as '3 months'. Applies to videos whose publish date is known, which requires the creator and caption step above.

## `maxResults` (type: `integer`):

Hard ceiling on how many result rows the run writes, so a broad set of keywords cannot run away with your budget. 0 means no ceiling.

## `startUrls` (type: `array`):

Optional list of Snapchat usernames (for example 'realmadrid') or profile URLs (for example 'https://www.snapchat.com/@realmadrid').

## `proxyConfiguration` (type: `object`):

Choose the connection settings for this run. By default the run goes out directly. Enabling this can improve reliability on large runs.

## Actor input object example

```json
{
  "searchKeywords": [
    "football"
  ],
  "discoverySources": [
    "spotlightVideos",
    "creators",
    "hashtagTopics"
  ],
  "resolveVideoDetails": true,
  "maxVideoResolutions": 10,
  "expandHashtagTopics": true,
  "topicExpansionDepth": 1,
  "maxTopicsPerKeyword": 2,
  "maxCreatorsPerKeyword": 3,
  "maxVideosPerCreator": 10,
  "skipDuplicates": true,
  "maxResults": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All scraped items in the Actor's default dataset.

## `videos` (type: `string`):

Only the spotlightVideo rows, with the video-specific columns.

## `creators` (type: `string`):

Only the discoveredCreator rows.

## `topics` (type: `string`):

Only the hashtagTopic rows.

## `lensesAndShows` (type: `string`):

Only the discoveredLens and discoveredPublisher rows.

## `notes` (type: `string`):

Only the status rows explaining terms or accounts that returned nothing, were unreachable, or don't exist. Never charged.

## `runSummary` (type: `string`):

Aggregate counters for the run, recorded once in the key-value store under the RUN\_SUMMARY key.

# 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 = {
    "searchKeywords": [
        "football"
    ],
    "discoverySources": [
        "spotlightVideos",
        "creators",
        "hashtagTopics"
    ],
    "resolveVideoDetails": true,
    "maxVideoResolutions": 10,
    "expandHashtagTopics": true,
    "topicExpansionDepth": 1,
    "maxTopicsPerKeyword": 2,
    "expandDiscoveredCreators": false,
    "maxCreatorsPerKeyword": 3,
    "maxVideosPerCreator": 10,
    "skipDuplicates": true,
    "minViews": 0,
    "minSubscribers": 0,
    "maxResults": 10,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("simpleapi/snapchat-user-spotlight-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 = {
    "searchKeywords": ["football"],
    "discoverySources": [
        "spotlightVideos",
        "creators",
        "hashtagTopics",
    ],
    "resolveVideoDetails": True,
    "maxVideoResolutions": 10,
    "expandHashtagTopics": True,
    "topicExpansionDepth": 1,
    "maxTopicsPerKeyword": 2,
    "expandDiscoveredCreators": False,
    "maxCreatorsPerKeyword": 3,
    "maxVideosPerCreator": 10,
    "skipDuplicates": True,
    "minViews": 0,
    "minSubscribers": 0,
    "maxResults": 10,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("simpleapi/snapchat-user-spotlight-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 '{
  "searchKeywords": [
    "football"
  ],
  "discoverySources": [
    "spotlightVideos",
    "creators",
    "hashtagTopics"
  ],
  "resolveVideoDetails": true,
  "maxVideoResolutions": 10,
  "expandHashtagTopics": true,
  "topicExpansionDepth": 1,
  "maxTopicsPerKeyword": 2,
  "expandDiscoveredCreators": false,
  "maxCreatorsPerKeyword": 3,
  "maxVideosPerCreator": 10,
  "skipDuplicates": true,
  "minViews": 0,
  "minSubscribers": 0,
  "maxResults": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call simpleapi/snapchat-user-spotlight-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,simpleapi/snapchat-user-spotlight-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/9nkeVS7r3TdnHIexN/builds/N2BjHdHaZlonCzX55/openapi.json
