# Snapchat Scraper: Profile Spotlight Story Lens Hashtag Email (`memo23/snapchat-scraper`) Actor

Scrape Snapchat profiles, Spotlight clips, Stories, AR Lenses, search/hashtag feeds — all in one actor. Extract emails, phones and social handles from bios. AI titles, scene descriptions, audio transcripts, viewer comments, related-clip feeds. Pure HTTP. 31 fields. JSON + CSV.

- **URL**: https://apify.com/memo23/snapchat-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Social media, Lead generation, Agents
- **Stats:** 127 total users, 21 monthly users, 99.8% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.75 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 Profile, Spotlight, Story, Lens & Hashtag Scraper

<p align="center">
  <img src="https://apify.com/readme-stuff/logo.svg" alt="Snapchat Scraper" width="220" />
</p>

All-in-one Snapchat scraper — paste any mix of URL kinds in the same input list and the actor auto-classifies each one:

| Input | Row type emitted |
|---|---|
| **Profile URL** — `/@{u}`, `/add/{u}`, or bare `username` | profile row: bio, subscribers, AR Lenses, live 24h story, all Stories, all Spotlights with AI titles + keywords + scene descriptions + detected language + viewer comments, plus a **`contacts` panel (emails, phones, social handles, link aggregators)** |
| **Spotlight URL** — `/spotlight/{id}` | spotlight row: that clip + **full audio transcript** + **25 "more like this" related clips** + the clip's own comment thread |
| **Lens URL** — `/lens/{uuid}` or `/unlock?uuid={uuid}` | lens row: AR Lens detail + creator search tags + **12 related Lenses** + Spotlight clips that use this Lens |
| **Search / hashtag URL** — `/explore/{query}` (or `#hashtag`) | search row: matching Spotlights, creators, Lenses, Discover episodes, places and topics — all in one normalised payload |

One row per URL. JSON + CSV.

> Pure HTTP. No Puppeteer, no Playwright, no headless Chromium, no third-party CAPTCHA solvers.

***

### How it works

<p align="center">
  <img src="https://apify.com/readme-stuff/how-it-works-snapchat.svg" alt="How it works" width="100%" />
</p>

1. **Input.** Paste any mix of:
   - Profile URLs — `https://www.snapchat.com/@fcbayern` or `https://www.snapchat.com/add/fcbayern`
   - Spotlight clip URLs — `https://www.snapchat.com/spotlight/{shareId}` (or the canonical long form `/@{username}/spotlight/{shareId}`)
   - Lens URLs — `https://www.snapchat.com/lens/{uuid}` or `https://www.snapchat.com/unlock?type=SNAPCODE&uuid={uuid}`
   - Search / hashtag URLs — `https://www.snapchat.com/explore/{query}`
   - Bare usernames — `fcbayern` or `@fcbayern`
   - Bare hashtags — `#UCL`
   - Bare lens UUIDs — `8124c89bb79642518622ddebb088ccc0`

2. **Process.** Server-side resolve, fetch, extract and normalise. No browser overhead.

3. **Output.** One row per URL — a profile row, spotlight-clip row, lens row, or search row — written to the Apify dataset.

***

### Input

Field | Type | Required | Notes
\--- | --- | --- | ---
`profileUrls` | `string[]` | yes | Any mix of profile URLs (`/add/{u}`, `/@{u}`, bare usernames), Spotlight URLs (`/spotlight/{id}`), Lens URLs (`/lens/{uuid}` or `/unlock?uuid=...`), and search/hashtag URLs (`/explore/{q}` or `#hashtag`). Auto-classified. Default includes a profile, a Spotlight clip, a Lens, and a hashtag search.
`maxItems` | `integer` | no | Safety cap on how many URLs from the list get processed. One row per URL = one paid output record. Default `1000`. Free-tier users are capped at `100`.
`includeSpotlightComments` | `boolean` | no | Include the public viewer-comments thread under each Spotlight (default `true`). Turn OFF for compact rows / CSV-friendly exports / PII-light workflows. Comments typically run 300–500 per profile and are the heaviest field — disabling cuts row size by ~45%. The `spotlightComments[][]` shape is preserved (empty arrays), so downstream code that indexes by spotlight position keeps working.
`maxCommentsPerSpotlight` | `integer` | no | When `> 0`, keeps only the top-N comments per Spotlight by Snapchat's ranking score. Default `0` (no limit). Useful for sentiment analysis when you only need top engagement.
`maxConcurrency` / `minConcurrency` | `integer` | no | Per-actor parallelism. Default `5` / `1`.
`maxRequestRetries` | `integer` | no | Retries before a profile is given up. Default `5`.
`proxy` | object | no | Default: **off** (Snapchat profiles aren't gated). Enable a residential pool only if you hit rate limits on a very large input list.

#### Example input

Mix any URL kinds freely — auto-classified.

```json
{
  "profileUrls": [
    "https://www.snapchat.com/add/fcbayern",
    "@kyliejenner",
    "https://www.snapchat.com/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYamRxY2h6Znl4AZ34_8b_AZ34_5HDAAAAAQ",
    "https://www.snapchat.com/lens/8124c89bb79642518622ddebb088ccc0",
    "https://www.snapchat.com/explore/UCL",
    "#fcbarcelona"
  ],
  "maxItems": 50,
  "maxConcurrency": 5,
  "includeSpotlightComments": true,
  "maxCommentsPerSpotlight": 0,
  "proxy": { "useApifyProxy": false }
}
```

Yields **6 rows**: 2 profile rows (Bayern + Kylie Jenner, each with a `contacts` panel), 1 Spotlight clip row (with audio transcript + 25 related clips), 1 Lens row (FC Barcelona AR lens + 12 related lenses), and 2 search rows (one per query — each aggregating ~24 matching Spotlights, ~5 creators and ~24 lenses).

#### Comment-toggle cheat sheet (measured on fcbayern, 25 spotlights)

`includeSpotlightComments` | `maxCommentsPerSpotlight` | Comments kept | Row size
\--- | --- | --- | ---
`true` (default) | `0` (default) | all 467 | ~322 KB
`true` | `5` | top 125 by ranking | ~218 KB
`true` | `20` | top ~400 by ranking | ~290 KB
`false` | — | 0 (empty threads) | ~177 KB

***

### Output schema

Four row shapes, distinguished by the `rowType` field:

- `rowType: "profile"` — emitted for profile URLs. Includes a `contacts` panel.
- `rowType: "spotlight"` — emitted for Spotlight clip URLs. Includes audio transcript + related-feed.
- `rowType: "lens"` — emitted for Lens URLs. Includes 12 related lenses + clips using this lens.
- `rowType: "search"` — emitted for `/explore/{query}` URLs and bare `#hashtags`. Aggregates matching spotlights, creators, lenses, episodes, places and topics.

> **Eats five competitor SKUs.** This actor folds the use cases of *Profile Scraper*, *Spotlight Clip Scraper*, *Email Scraper*, *Lens Scraper*, and *Hashtag/Discovery Scraper* — five separately-sold sister products on the Apify marketplace — into a single multi-URL-aware actor. And it surfaces fields that *none* of them expose: Snapchat's AI-generated Spotlight titles & scene descriptions, per-clip detected-language scores, audio-transcription URLs on Story snaps, full WebVTT audio transcripts, 25-clip related-feed, viewer comment threads.

#### Profile-level (top-level row)

```jsonc
{
  "profileUrl":            "https://www.snapchat.com/@fcbayern",
  "username1":             "FC Bayern",                       // display name
  "username2":             "fcbayern",                        // handle
  "profileImageUrl":       "https://cf-st.sc-cdn.net/%E2%80%A6",
  "profileDescription":    "",                                // creator bio (when set)
  "profileLocation":       "Munich, Bavaria, Germany",
  "subscribers":           902000,                            // integer
  "category":              "Sports Team",
  "websiteUrl":            "https://fcbayern.com/",
  "snapcodeImageUrl":      "https://app.snapchat.com/%E2%80%A6",
  "badge":                 1,                                 // verified badge code
  "sameAsLinks":           [],                                // external profile links
  "creationTimestampMs":   "1557950746979",
  "lastUpdateTimestampMs": "1778352327000",

  "hasStory":              false,                             // is a live 24h story posted right now?
  "businessProfileId":     "f035a3c6-9e43-4a23-a160-…",       // UUID for joining datasets
  "publisherType":         null,
  "primaryColor":          null,                              // brand theme hex, if set
  "squareHeroImageUrl":    null,                              // wide hero banner, if set
  "pageDescription":       "FC Bayern is on Snapchat! (@fcbayern) | 902.0k Subscribers | Munich, Bavaria, Germany …",
  "oneLinkUrl":            "https://click.snapchat.com/aVHG?%E2%80%A6", // universal mobile deeplink
  "ogImageUrl":            "https://us-east1-aws.api.snapchat.com/web-capture/%E2%80%A6",

  "relatedAccounts": [                                        // Snapchat's curated affinity list
    { "username": "juventus",        "title": "Juventus",              "badge": 1, "snapcodeImageUrl": null },
    { "username": "mancityofficial", "title": "Man City",              "badge": 1, "snapcodeImageUrl": null },
    { "username": "chelseafc",       "title": "Chelsea Football Club", "badge": 1, "snapcodeImageUrl": null }
  ],

  "liveStory":         { /* current 24h story — see below */ },
  "lenses":            [ /* AR Lenses tab — see below */ ],
  "stories":           [ /* see below */ ],
  "spotlights":        [ /* see below */ ],
  "spotlightComments": [ /* per-spotlight viewer comments — see below */ ],

  "contacts": {                                                // see "Contacts" section below
    "emails":         ["press@example.com"],
    "phones":         ["+498912345678"],
    "socialHandles": {
      "instagram":  "fcbayern",
      "tiktok":     "fcbayern",
      "youtube":    "fcbayerntv",
      "twitter":    "fcbayern",
      "facebook":   "FCBayern",
      "telegram":   null
    },
    "linktreeUrls":   ["https://linktr.ee/%E2%80%A6"],
    "websiteUrls":    ["https://fcbayern.com/", "https://linktr.ee/%E2%80%A6"]
  },

  "scrapedAt":         "2026-05-11T08:21:09.412Z"
}
```

#### `contacts` — emails, phones, social handles extracted from bio + website

We run the profile's `profileDescription`, `websiteUrl`, and `sameAsLinks` through a contact-detection pass and surface:

- **`emails[]`** — every email address found in the bio
- **`phones[]`** — international-style phone numbers (digits-only, with leading `+`)
- **`socialHandles`** — Instagram, TikTok, YouTube, Twitter/X, Facebook, Telegram (bare handles, no `@`). Recognises both full URLs (`instagram.com/brand`) and bio shorthand (`IG: @brand`)
- **`linktreeUrls[]`** — `linktr.ee`, `linkin.bio`, `bio.link`, `beacons.ai`, `allmylinks.com`, `carrd.co` aggregator URLs
- **`websiteUrls[]`** — every http(s) URL found anywhere in the bio

If a creator hasn't put a given channel in their bio, the corresponding field is `null` or `[]`. The fields are always present so downstream code can index without null-guarding.

#### `stories[]` — curated highlight collections (chronological)

```jsonc
{
  "storyType":           3,
  "storyId":             "",
  "storyTitle":          "",
  "storySubtitle":       null,
  "emoji":               null,
  "thumbnailUrl":        "https://cf-st.sc-cdn.net/d/BvC2b4GL%E2%80%A6",
  "canonicalUrlSuffix":  null,
  "videoTrackUrl":       null,
  "snapList": [
    {
      "snapId":              "",
      "snapMediaType":       1,
      "mediaUrl":            "https://cf-st.sc-cdn.net/d/%E2%80%A6",
      "mediaPreviewUrl":     "https://cf-st.sc-cdn.net/d/%E2%80%A6",
      "overlayUrl":          null,
      "attachmentUrl":       null,
      "timestampInSec":      "1778311147",
      "snapTitle":           null,
      "snapSubtitles":       null,
      "lat":                 null,        // geo-tag if the snap was tagged with a location
      "lng":                 null,
      "isSponsored":         null,
      "audioTranscriptionUrl": null       // Snapchat-hosted WebVTT of the spoken audio, if available
    }
    // … up to ~15 snaps per story
  ]
}
```

#### `spotlights[]` — single-clip Spotlight posts with engagement + AI enrichments

```jsonc
{
  "storyId":         "W7_EDlXWTBiXAEEn…",
  "thumbnailUrl":    "https://bolt-gcdn.sc-cdn.net/bp/%E2%80%A6",
  "description":     "🟥😤🟥 What we need from our fans against PSG 🤜🤛 #UCL #FCBPSG",
  "hashtags":        ["#UCL", "#FCBPSG"],
  "timestampInSec":  "1777998991",
  "uploadDateMs":    "1777998991811",
  "durationMs":      "44170",
  "width":           540,
  "height":          960,
  "mediaUrl":        "https://bolt-gcdn.sc-cdn.net/bp/%E2%80%A6",
  "mediaPreviewUrl": "https://bolt-gcdn.sc-cdn.net/bp/%E2%80%A6",
  "contentUrl":      "https://bolt-gcdn.sc-cdn.net/bp/%E2%80%A6",
  "deeplink":        "https://click.snapchat.com/aVHG?%E2%80%A6",

  // Engagement
  "viewCount":       "15849",
  "shareCount":      "94",
  "commentCount":    "67",
  "boostCount":      "1455",
  "recommendCount":  "130",

  // On-screen text + AI enrichments — exclusive to this actor
  "embeddedTextCaption": null,
  "aiTitle":         "FC Bayern Players Urge Fans to Wear Red & Bring Energy for Champions League Match",
  "aiDescription":   "Athletes discussing fan engagement in soccer.",
  "aiKeywords": [
    "Bayern Munich training", "football fan energy", "Bayern Munich news",
    "football motivation", "matchday tips"
    // … up to ~25 LLM tags per clip
  ],
  "contentKeywords": ["athlete training", "soccer", "fan engagement", "football", "team support"],
  "detectedLanguages": [{ "languageCode": "de", "score": 0.9259 }],

  // Linked sounds / business profile cards attached to the clip
  "contextCards": [
    { "contextType": 2, "title": "Original Sound", "subtitle": "fcbayern", "url": null,                                       "snapcodeUrl": null,                                                                       "thumbnailUrl": "https://cf-st.sc-cdn.net/d/%E2%80%A6",       "hasBadge": false, "id": "108293712385" },
    { "contextType": 3, "title": "FC Bayern",      "subtitle": "fcbayern", "url": "https://www.snapchat.com/@fcbayern",       "snapcodeUrl": "https://app.snapchat.com/web/deeplink/snapcode?username=fcbayern&type=SVG&bitmoji=enable", "thumbnailUrl": "https://cf-st.sc-cdn.net/aps/bolt/%E2%80%A6", "hasBadge": true,  "id": "f035a3c6-9e43-4a23-a160-701dec6bb12b" }
  ]
}
```

#### `lenses[]` — the AR Lenses tab on the profile

```jsonc
{
  "lensName":               "FC Barcelona",
  "lensCreatorDisplayName": "FC Barcelona",
  "lensCreatorUsername":    null,
  "iconUrl":                "https://bolt-gcdn.sc-cdn.net/3/RBXv7yxQeo4VeQLNNAJmM?%E2%80%A6",
  "previewImageUrl":        "https://lens-preview-storage.storage.googleapis.com/previewmedia/preview_thumbnail/%E2%80%A6webp",
  "previewVideoUrl":        "https://lens-storage.storage.googleapis.com/previewvideo/%E2%80%A6",
  "unlockUrl":              "https://www.snapchat.com/unlock/?type=SNAPCODE&uuid=8124c89bb79642518622ddebb088ccc0&metadata=01",
  "isOfficialSnapLens":     false,
  "lastUpdatedEpoch":       1777434016
}
```

#### `liveStory` — the creator's currently-live 24-hour ephemeral story (or `null`)

Same shape as a `stories[]` entry, but the content **disappears 24 hours after posting** — scrape it now or lose it. `storyType` is typically `5` for the live story (vs `3` for curated highlights). FC Barcelona had **32 active snaps** within the last 14 hours at the time of writing.

#### `spotlightComments[][]` — public viewer comments under each Spotlight clip

A 2-D array indexed by Spotlight position. `spotlightComments[i]` is the comment thread under `spotlights[i]`.

```jsonc
[
  // comments under spotlights[0]:
  [
    {
      "snapId":                "W7_EDlXWTBiXAEEniNoMPwAA…",
      "text":                  "Hala madrid",
      "authorDisplayName":     "Oswald🇮🇪⚽️✝️",
      "authorBitmojiAvatarId": "105791014945_7-s5",
      "timestampMs":           "1778424523857",
      "threadedReplyCount":    4,
      "rankingScore":          1812,
      "reactions":             [{ "reactTypeId": "1", "reactCount": "10" }],
      "totalReactions":        10
    }
    // … typically 15–25 top-level comments per spotlight on active profiles
  ]
]
```

Real volume from a single FC Barcelona scrape: **331 comments across 16 spotlights**. Bayern Munich: **467 comments across 25 spotlights**.

#### Spotlight clip row (`rowType: "spotlight"`)

Emitted when the input URL is a Spotlight clip (`/spotlight/{id}` or `/@{u}/spotlight/{id}`).

```jsonc
{
  "rowType":           "spotlight",
  "spotlightUrl":      "https://www.snapchat.com/spotlight/W7_EDl%E2%80%A6",
  "storyId":           "W7_EDlXWTBiXAEEniNoMPwAA…",
  "shareId":           "W7_EDlXWTBiXAEEniNoMPwAA…",
  "creator": {
    "username":      "fcbarcelona",
    "displayName":   "FC Barcelona",
    "followerCount": "0",
    "websiteUrl":    null
  },

  // Same clip-level fields as a profile-row's spotlights[] entry:
  "thumbnailUrl":    "https://bolt-gcdn.sc-cdn.net/bp/%E2%80%A6",
  "description":     "#fcbarcelona",
  "hashtags":        ["#fcbarcelona"],
  "uploadDateMs":    "1778418164840",
  "durationMs":      "9930",
  "width":           540,
  "height":          960,
  "mediaUrl":        "https://bolt-gcdn.sc-cdn.net/bp/%E2%80%A6",
  "mediaPreviewUrl": "https://bolt-gcdn.sc-cdn.net/bp/%E2%80%A6",
  "contentUrl":      "https://bolt-gcdn.sc-cdn.net/bp/%E2%80%A6",
  "deeplink":        "https://click.snapchat.com/aVHG?%E2%80%A6",
  "viewCount":       "16408",
  "shareCount":      "97",
  "commentCount":    "93",
  "boostCount":      "2751",
  "recommendCount":  "305",
  "embeddedTextCaption": null,

  // AI enrichments (same shape as in profile-row spotlights):
  "aiTitle":           "FC Barcelona Players Celebrate Birthday with Teammates",
  "aiKeywords":        [ /* up to ~25 LLM tags */ ],
  "aiDescription":     "Athletes discussing fan engagement in soccer.",
  "contentKeywords":   ["athlete training", "soccer", "fan engagement"],
  "detectedLanguages": [{ "languageCode": "en", "score": 0.9921 }],
  "contextCards":      [ /* linked sound + business profile */ ],

  // SPOTLIGHT-URL EXCLUSIVES (not available from the profile page):
  "transcriptUrl": "https://bolt-gcdn.sc-cdn.net/3/pLovkAlk%E2%80%A6vtt?%E2%80%A6",
  "transcript":    "Hey coolers, it's Olivia Rodrigo and I am wishing the FC Barcelona team a successful El Clasico. Forza Barça!",
  "comments":      [ /* 22 comments under THIS clip, flat list */ ],
  "relatedSpotlights": [
    /* up to 25 "more like this" clips, each a full SnapchatSpotlight
       object with its own AI title / keywords / detected language
       / engagement stats / context cards. Snapchat ranks them by
       relevance to the input clip. */
  ],

  "scrapedAt": "2026-05-11T08:21:09.412Z"
}
```

**Why this is exclusive:** the WebVTT audio transcript and the 25-clip related-feed are only present on the Spotlight clip page. Scraping the creator's profile gives you the same clip's metadata + engagement + AI enrichments — but no transcript and no related-feed.

#### Lens row (`rowType: "lens"`)

Emitted from `/lens/{uuid}` or `/unlock?uuid={uuid}` URLs (bare 32-char hex UUIDs are also auto-canonicalised).

```jsonc
{
  "rowType":                "lens",
  "lensUrl":                "https://www.snapchat.com/lens/8124c89bb79642518622ddebb088ccc0",
  "scannableUuid":          "8124c89bb79642518622ddebb088ccc0",
  "lensId":                 "53181080886",
  "lensName":               "FC Barcelona",
  "lensCreatorDisplayName": "FC Barcelona",
  "lensCreatorUsername":    "fcbarcelona",
  "creatorProfileUrl":      "https://www.snapchat.com/@fcbarcelona",
  "iconUrl":                "https://bolt-gcdn.sc-cdn.net/3/%E2%80%A6",
  "previewImageUrl":        "https://lens-preview-storage.storage.googleapis.com/%E2%80%A6webp",
  "previewVideoUrl":        "https://lens-storage.storage.googleapis.com/previewvideo/%E2%80%A6",
  "unlockUrl":              "https://snapchat.com/unlock/?type=SNAPCODE&uuid=%E2%80%A6&metadata=01",
  "creatorSearchTags":      ["event", "football", "game", "sport", "Barcelona", "FCB"],
  "isOfficialSnapLens":     false,
  "lastUpdatedEpoch":       1777434016,
  "moreLenses":             [ /* up to 12 Snapchat-curated related Lenses */ ],
  "spotlightsUsingThisLens":[ /* Spotlight clips that USE this Lens — often empty for brand lenses, populated for trending creator lenses */ ]
}
```

#### Search row (`rowType: "search"`)

Emitted from `/explore/{query}` URLs and bare `#hashtags`. Aggregates all 6 of Snapchat's search sections into a single normalised payload.

```jsonc
{
  "rowType":   "search",
  "searchUrl": "https://www.snapchat.com/explore/UCL",
  "query":     "UCL",

  "spotlights": [
    /* up to 24 Spotlight clips matching the query — same shape as the
       per-profile spotlights[] entries (engagement stats, hashtags,
       content keywords, media URLs). AI enrichments are not on the search
       payload — use the Spotlight URL row type if you need aiTitle etc. */
  ],

  "creators": [
    {
      "username":          "ucl",
      "title":             "ᴬ ᴼ ᴬ 🌪️",
      "badge":             null,
      "subscriberCount":   805,
      "bio":               "🐎 …",
      "profilePictureUrl": "https://cf-st.sc-cdn.net/aps/bolt/%E2%80%A6",
      "snapcodeImageUrl":  null,
      "businessProfileId": "cfa17514-24d6-4e2d-9def-…"
    }
  ],

  "lenses": [
    {
      "lensName":               "UCL Final 2020",
      "lensCreatorDisplayName": "Nabhan Mohtesham",
      "lensCreatorUsername":    null,
      "iconUrl":                "https://lens-storage.storage.googleapis.com/png/%E2%80%A6",
      "previewImageUrl":        null,
      "previewVideoUrl":        null,
      "unlockUrl":              "https://www.snapchat.com/unlock/?type=SNAPCODE&uuid=%E2%80%A6",
      "isOfficialSnapLens":     false,
      "lastUpdatedEpoch":       null
    }
  ],

  "episodes":  [ { "title": "Beckham pulled this off for his first UCL match with PSG 😳", "publisherName": null } ],
  "places":    [ { "title": "Champions League Stadium", "subtitle": "London, UK" } ],
  "topics":    ["ucl"],

  "counts": { "spotlights": 24, "creators": 4, "lenses": 24, "episodes": 12, "places": 10, "topics": 1 }
}
```

#### What makes this richer than the competition

We surveyed all 17 Snapchat actors on the Apify marketplace (May 2026):

Capability | Competitor actors | **This actor**
\--- | --- | ---
Per-profile top-level fields | ~12 | **31**
Per-Spotlight fields | ~6 | **25**
Per-Spotlight-clip-row fields | n/a (separate SKU) | **33** (incl. transcript + 25-clip related feed)
Per-Story-snap fields | 4–5 | **13** (incl. geo, on-screen text, audio-transcript URL)
AI-generated `aiTitle` per Spotlight | ❌ | ✅ (15 / 16 clips for active creators)
AI-generated `aiKeywords` (up to 25) | ❌ | ✅
AI scene `aiDescription` | ❌ | ✅
Snapchat content-classification keywords | ❌ | ✅
Per-clip `detectedLanguages` with confidence | ❌ | ✅
**Public viewer comments under each Spotlight** | ❌ | ✅ (300–500 per profile)
**Live 24h ephemeral story snaps** | Separate sister product | ✅ (folded into the same row)
**AR `lenses[]` panel** | 1 of 17 actors | ✅
Snapchat's "Related Accounts" affinity panel | 2 of 17 actors | ✅
Live-story flag (`hasStory`) | ❌ | ✅
Business profile UUID (join key) | ❌ | ✅
Universal deeplink + OG share image | ❌ | ✅
Spotlight `contextCards` (linked sound + biz card) | ❌ | ✅
**Single Spotlight clip URL → row (separate product)** | `easyapi/snapchat-spotlight-detail-scraper`, `crawlerbros/snapchat-spotlight-video-downloader` | ✅ (folded into the same actor)
**Full WebVTT audio transcript** of a Spotlight clip | ❌ | ✅ (`transcript` + `transcriptUrl`)
**25-clip "more like this" related-feed** per Spotlight URL | ❌ | ✅ (with full AI enrichment per related clip)
**Email / phone / social-handle extraction** from profile bios | `easyapi/snapchat-email-scraper` (740 users — separate product) | ✅ (folded into every profile row's `contacts` panel)
**Lens URL → row (separate product)** | ❌ | ✅ (incl. 12 related lenses + clips using the lens)
**Search / hashtag URL → row (separate product)** | `crawlerbros/snapchat-hashtag-scraper` (7 users), `easyapi/snapchat-popular-accounts-scraper` (92 users — separate products) | ✅ (folded into one search row aggregating 6 sections)

***

### Pricing

Two-tier pay-per-event:

Event | When | Suggested rate
\--- | --- | ---
`outputrecord` | Once per dataset row pushed (profile, spotlight-clip, lens, or search row) | configured on the actor page
`additional-data` | Once per nested item inside a row — see counting rules below | **$0.75 per 1,000 items** ($0.00075 each)

#### What counts as `additional-data`

Row type | Items billed
\--- | ---
**Profile row** | every story + every spotlight clip + every AR Lens + every viewer comment + every related-account entry + every live-24h-story snap
**Spotlight-clip row** | every viewer comment under THIS clip + every entry in the 25-clip related-feed
**Lens row** | every related lens (`moreLenses`) + every clip that uses this lens (`spotlightsUsingThisLens`)
**Search / hashtag row** | every matching Spotlight + every matching creator + every matching Lens + every Discover episode + every place + every topic

#### Real-world cost preview

Measured on the default 4-URL prefill (1 profile + 1 spotlight + 1 lens + 1 search):

Row | Base `outputrecord` | Additional items | `additional-data` cost
\--- | --- | --- | ---
profile (`@fcbayern`) | 1× | **511** (16 stories + 25 spotlights + 467 comments + 3 related) | $0.383
spotlight (FC Bayern UCL clip) | 1× | **47** (22 comments + 25 related) | $0.035
lens (FC Barcelona AR) | 1× | **12** (12 moreLenses) | $0.009
search (`UCL`) | 1× | **75** (24 spotlights + 4 creators + 24 lenses + 12 episodes + 10 places + 1 topic) | $0.056
**Run total** | **4×** outputrecord | **645** | **$0.484** + base

#### Why two tiers

The base `outputrecord` rate keeps simple per-URL pricing predictable. The `additional-data` event aligns cost with delivered value — a profile row with 467 viewer comments and 25 AI-tagged Spotlight clips costs more than an empty-bio profile, exactly as it should.

Buyers who want to cap costs can turn `includeSpotlightComments` off (drops ~300–500 items per profile) or set `maxCommentsPerSpotlight: N` to keep only the top-N comments per Spotlight. Both knobs reduce the `additional-data` bill proportionally.

Free-tier users are capped at 100 rows per run (the `outputrecord` ceiling). The `additional-data` event has no separate cap.

***

### Pagination & limits

For each profile row, the actor returns **the first batch of items per tab** — the same set Snapchat itself shows on the anonymous profile landing page:

| Tab | Typical first-batch size |
|---|---|
| Stories (curated highlights) | up to **16** |
| Spotlight clips | up to **~25** |
| Lenses (AR) | typically 0–12 — full list |
| Live 24h story | all snaps in the active window |
| Related accounts | 3 (Snapchat's hard cap) |
| Spotlight comments per clip | all top-level comments (~15–30) |

**Why first-batch only:** Snapchat's profile page is server-rendered. The pagination cursors that would load older content (`curatedHighlightsCursor`, `spotlightHighlightsCursor`, `lensCursor`) point to an internal backend (`ingress-us-east1-aws.api.snapchat.com/web-stories-api`) that requires a server-side `SC-LCA-1` token Snapchat does not expose publicly. Loading deeper history would require an authenticated Snapchat account — out of scope for a public-data scraper.

This is the **same ceiling every other Snapchat scraper on the Apify marketplace hits** — none paginate. For most accounts the first batch covers all recent activity; for heavily-active creators with 50+ archived stories, older content is not retrievable without auth.

### Notes & limitations

- **Public profiles only.** Private accounts, age-gated content, and deactivated users are skipped and logged.
- **Stories vs spotlights.** `stories[]` are chronological collections of snaps a creator pinned to their profile. `spotlights[]` are single-clip TikTok-style snaps with engagement metrics (views, shares, comments).
- **Subscribers** are returned as an integer.
- **Category** is the human label that Snapchat displays on the profile (e.g. `"Sports Team"`).
- **Anti-bot.** A multi-stack fallback layer is wired up so the actor keeps working if Snapchat tightens up over time — no input changes needed on your end.

***

### Support

Issues, feature requests, or custom output shapes? Open a ticket on the actor's Apify page or message the maintainer.

***

### 🤖 For AI Agents & LLM Apps

Compact reference for AI agents calling this actor via the [Apify MCP server](https://mcp.apify.com) or the Apify API (actor: `memo23/snapchat-scraper`).

**Purpose:** All-in-one Snapchat scraper — profiles, Spotlight clips, Lenses, and search/hashtag feeds are auto-classified from one mixed URL list, emitting one dataset row per URL.

**Minimal input:**

```json
{
  "profileUrls": ["https://www.snapchat.com/add/fcbayern"],
  "maxItems": 25,
  "includeSpotlightComments": true,
  "maxCommentsPerSpotlight": 0,
  "maxConcurrency": 5,
  "minConcurrency": 1,
  "maxRequestRetries": 5,
  "proxy": { "useApifyProxy": false }
}
```

Bare usernames, `#hashtags`, Spotlight URLs (`/spotlight/{id}`), Lens URLs (`/lens/{uuid}`), and `/explore/{query}` search URLs can be mixed into `profileUrls` too.

**Output:** one row per URL, keyed by `rowType` (`profile` / `spotlight` / `lens` / `search`). Profile rows: profileUrl, username1, username2, subscribers, category, websiteUrl, businessProfileId, hasStory, relatedAccounts, liveStory, lenses, stories, spotlights (with aiTitle, aiKeywords, detectedLanguages, engagement counts), spotlightComments, contacts (emails, phones, socialHandles, linktreeUrls, websiteUrls), scrapedAt. Spotlight rows add transcript, transcriptUrl, comments, relatedSpotlights. Lens rows add scannableUuid, creatorSearchTags, moreLenses, spotlightsUsingThisLens. Search rows add query, spotlights, creators, lenses, episodes, places, topics, counts.

**Behaviors an agent should know:**

- Every `profileUrls` entry is auto-classified by URL shape; one row per URL.
- Set `maxItems` to cap URLs processed (default 1000; free-tier runs capped at 100).
- `includeSpotlightComments` (default true) is the heaviest field (~300–500 comments/profile); set false or `maxCommentsPerSpotlight: N` to shrink rows.
- Proxy is off by default — Snapchat public pages aren't Cloudflare-gated; enable residential only on rate limits.
- Billing: two-tier pay-per-event — `outputrecord` per row plus `additional-data` per nested item (~$0.75 per 1,000 items).
- Public profiles only, first-batch per tab (no deep pagination without auth); private/age-gated accounts are skipped.

***

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Snap Inc. or any of its subsidiaries. All trademarks mentioned — including Snapchat, Spotlight, and Snap — are the property of their respective owners.

The scraper accesses only publicly available Snapchat profile, Spotlight, Lens, and search pages — no authenticated endpoints, private accounts, age-gated content, or data behind the Snapchat login wall. Users are responsible for ensuring their use complies with Snapchat's Terms of Service, applicable data-protection law (GDPR, CCPA, etc.), and any contractual obligations of their own organisation.

***

### SEO Keywords

snapchat scraper, scrape snapchat, snapchat profile scraper, snapchat spotlight scraper, snapchat lens scraper, snapchat hashtag scraper, snapchat story scraper, snapchat api, Apify snapchat, snapchat email scraper, snapchat contacts scraper, snapchat data extraction, social media intelligence, influencer discovery data, creator analytics, spotlight video data, ar lens data, snapchat comments scraper, snapchat username scraper, snapchat marketing data

# Actor input Schema

## `profileUrls` (type: `array`):

Paste any mix of:
• Profile URLs — `https://www.snapchat.com/add/{u}` or `/@{u}` (or just `username`)
• Spotlight clip URLs — `https://www.snapchat.com/spotlight/{id}`
• Lens URLs — `https://www.snapchat.com/lens/{uuid}` or `/unlock?uuid={uuid}`
• Search / hashtag URLs — `https://www.snapchat.com/explore/{query}` (or just `#hashtag`)

Each entry is auto-classified and the scraper emits the matching row type — one row per URL. Profile rows include AR Lenses, live story, Stories, Spotlights with AI titles + audio-transcription URLs, viewer comments and a contacts panel. Spotlight rows include the full audio transcript + 25-clip 'more like this' feed. Lens rows include the AR Lens detail + clips using it. Search rows aggregate matching spotlights, creators, lenses, episodes, places and topics.

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

Safety cap on how many URLs from the list above will actually be processed. One row per URL = one paid output record. Useful when you paste a big list and want to test cost on the first N before running the full job.

## `includeSpotlightComments` (type: `boolean`):

Include the public viewer-comments thread under each Spotlight clip — reply text, reactions, author display name + bitmoji ID, timestamp, threaded reply count, ranking score. Typically 300–500 comments per profile and the heaviest field in the row. Turn OFF for compact rows / CSV-friendly exports / PII-light workflows.

## `maxCommentsPerSpotlight` (type: `integer`):

When > 0, keeps only the top-N comments per Spotlight by Snapchat's ranking score. Useful for sentiment analysis when you only need top engagement. Ignored when the toggle above is OFF.

## `maxConcurrency` (type: `integer`):

Maximum number of profile pages processed in parallel.

## `minConcurrency` (type: `integer`):

Minimum number of profile pages processed in parallel.

## `maxRequestRetries` (type: `integer`):

Number of retries before a failed request is given up.

## `proxy` (type: `object`):

Apify proxy settings. Snapchat's public profile pages are NOT Cloudflare-gated and respond cleanly to direct requests — leave proxy off for cheapest runs. Enable a residential pool only if you hit rate limits on a very large input list.

## Actor input object example

```json
{
  "profileUrls": [
    "https://www.snapchat.com/add/fcbayern",
    "https://www.snapchat.com/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYamRxY2h6Znl4AZ34_8b_AZ34_5HDAAAAAQ",
    "https://www.snapchat.com/lens/8124c89bb79642518622ddebb088ccc0",
    "https://www.snapchat.com/explore/UCL"
  ],
  "maxItems": 1000,
  "includeSpotlightComments": true,
  "maxCommentsPerSpotlight": 0,
  "maxConcurrency": 5,
  "minConcurrency": 1,
  "maxRequestRetries": 5,
  "proxy": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "profileUrls": [
        "https://www.snapchat.com/add/fcbayern",
        "https://www.snapchat.com/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYamRxY2h6Znl4AZ34_8b_AZ34_5HDAAAAAQ",
        "https://www.snapchat.com/lens/8124c89bb79642518622ddebb088ccc0",
        "https://www.snapchat.com/explore/UCL"
    ],
    "proxy": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/snapchat-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 = {
    "profileUrls": [
        "https://www.snapchat.com/add/fcbayern",
        "https://www.snapchat.com/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYamRxY2h6Znl4AZ34_8b_AZ34_5HDAAAAAQ",
        "https://www.snapchat.com/lens/8124c89bb79642518622ddebb088ccc0",
        "https://www.snapchat.com/explore/UCL",
    ],
    "proxy": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/snapchat-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 '{
  "profileUrls": [
    "https://www.snapchat.com/add/fcbayern",
    "https://www.snapchat.com/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYamRxY2h6Znl4AZ34_8b_AZ34_5HDAAAAAQ",
    "https://www.snapchat.com/lens/8124c89bb79642518622ddebb088ccc0",
    "https://www.snapchat.com/explore/UCL"
  ],
  "proxy": {
    "useApifyProxy": false
  }
}' |
apify call memo23/snapchat-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/snapchat-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/b0U2adke25SLUKTG5/builds/og2NNbV0g36RWolUj/openapi.json
