Snapchat User Stories Scraper
Pricing
$19.99/month + usage
Snapchat User Stories Scraper
Snapchat User Stories Scraper collects publicly available Snapchat user stories using usernames or profile links. Use it to gather story metadata and content for research, monitoring, or analysis with structured, automation-ready output.
Pricing
$19.99/month + usage
Rating
0.0
(0)
Developer
Scraper Engine
Maintained by CommunityActor stats
1
Bookmarked
40
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Snapchat Story Scraper — Highlights, Snaps and Media URLs
Snapchat Story Scraper extracts a public Snapchat profile's current story and every saved highlight, returning each snap's mediaUrl, mediaPreviewUrl, and createTime as structured JSON — no HTML parsing required. Point it at a username or profile URL; no Snapchat login, cookies, or API key needed. Rows are written to the dataset as each story or highlight finishes scraping, so results start appearing before the run ends. Run it now on the Actor's Apify Console page.
🧭 What is Snapchat Story Scraper?
Snapchat Story Scraper is an Apify Actor that reads a public Snapchat profile page and returns the current Story plus every curated Highlight as separate dataset rows, each carrying its full snap list (media URLs, preview thumbnails, timestamps). It requires no Snapchat account, login, or cookies — it works entirely from what a public visitor can already see. It's built for social media researchers, brand and influencer monitoring teams, and developers who want Snapchat story data as clean JSON instead of scraping the page themselves.
🌐 What Snapchat story data is publicly available to scrape?
A public Snapchat profile page exposes the account's current story, its curated highlights, and every snap inside them without requiring a login. Content that only exists inside the Snapchat app — friends-only snaps, direct messages, and live location — stays inaccessible regardless of tooling.
| Data Category | Public (no login) | Restricted (in-app, friends-only) |
|---|---|---|
| Current story snaps (media, timestamps) | ✅ | — |
| Curated highlights and their snap lists | ✅ | — |
| Profile display name / story title | ✅ | — |
| Sponsored flag / geotag on a snap, when present | ✅ | — |
| Private-account content | ❌ | ✅ requires being an accepted friend |
| Direct snaps and chats | ❌ | ✅ friends-only, in-app |
| View/screenshot notifications | ❌ | ✅ sender-only, in-app |
| Snap Map live location | ❌ | ✅ friends-only, in-app |
Snapchat Story Scraper only returns publicly visible data — what any visitor sees on a public profile page. Nothing behind a login wall.
📦 What data can I extract with Snapchat Story Scraper?
Every dataset row is one story or one highlight, with identity fields describing the row and a nested snapList carrying every snap's media and metadata.
| Field Name | Description |
|---|---|
username | The Snapchat username the row belongs to |
type | "story" for the profile's current story, "highlight" for a saved highlight |
isChild | false for the current story, true for a highlight |
storyTitle | Title of the story/highlight (falls back to the profile's display name, then the title-cased username) |
highlightId | Highlight ID; null for the current story, which has no highlight ID |
thumbnailUrl | Cover/thumbnail image URL for the story or highlight |
snapList | Array of every snap in the story/highlight — see fields below |
scrapedAt | ISO 8601 UTC timestamp of when this row was scraped |
snapIndex | 0-based position of the snap within the returned snapList (re-indexed after filtering) |
createTime | ISO 8601 UTC timestamp the snap was posted |
mediaUrl | Full-resolution media URL (image or video) |
mediaPreviewUrl | Lower-resolution preview/thumbnail URL |
snapTitle | Caption text on the snap, when Snapchat provides one |
snapSubtitles | Subtitle text on the snap, when Snapchat provides one |
isSponsored | Whether the snap is flagged as sponsored content |
lat | Geotag latitude, when the snap carries a location |
lng | Geotag longitude, when the snap carries a location |
hasAttachment | Whether the snap carries an attachment (e.g. a link) |
intervalStartTimeMs | Snap interval start time, in milliseconds |
audioTranscriptionObjectUrl | URL to an audio transcription object, when present |
Story & highlight fields
username, type, isChild, storyTitle, highlightId, thumbnailUrl, scrapedAt identify the row and where it came from. type/isChild are the two columns to filter or group on when you need to separate the current story from highlight reels.
Snap fields (inside snapList)
snapIndex, createTime, mediaUrl, and mediaPreviewUrl are the core media fields present on every real snap. snapTitle, snapSubtitles, isSponsored, lat, lng, hasAttachment, intervalStartTimeMs, and audioTranscriptionObjectUrl come straight from Snapchat's payload and are null whenever that snap doesn't carry the attribute — they aren't dropped, just left unset.
🤖 Add-on: Need additional Snapchat or social data?
Pair this with ../Instagram-Story-Details-Scraper/Instagram-Story-Details-Scraper for the same story format on Instagram, or ../TikTok-User-Profile-Scraper/tiktok-user-profile-scraper-with-engagement-analytics if your monitoring workflow also tracks TikTok creators. Both are Scraper Engine Actors and slot into the same dataset-per-run pipeline.
🛠️ Why not build this yourself?
Snapchat does not publish a public API for reading another account's stories or highlights, so a DIY script means reverse-engineering the profile page's embedded data yourself, re-patching it every time Snapchat changes its page structure, and running your own proxy pool to avoid getting blocked. Snapchat Story Scraper already handles the page parsing, snap-list normalization, date filtering, and proxy escalation (see below) — you get consistent JSON without owning that maintenance burden.
⚡ How to use Snapchat Story Scraper
Snapchat Story Scraper runs from its Apify Console listing — no separate signup or API key beyond your Apify account.
- Open the Actor's page in Apify Console and click Try for free (or Start, if you already have it saved).
- Fill in
startUrls— the only required field — with one or more Snapchat usernames or profile URLs. - Optionally set
maxSnapsto cap snaps per story/highlight,oldestSnapDateto drop older content, andproxyConfigurationif you expect blocking. - Start the run.
- Download results as JSON or CSV from the dataset, or stream them via the Apify API as they're written.
How to scale to bulk story extraction
startUrls is an array (stringList editor), so a single run accepts any number of usernames or URLs — there's no schema-enforced maximum. Each username is processed fully (its current story, then every highlight) before the run moves to the next one, so usernames are handled sequentially within a run rather than in parallel; scaling further means either listing more usernames in one run or triggering additional runs.
💡 What can you do with Snapchat story data?
- 📊 Brand monitoring teams track a competitor's Snapchat activity, using
storyTitleandcreateTimeto log when new highlights go up and how often accounts post. - 🎯 Influencer marketing analysts pull
mediaUrlandthumbnailUrlacross multiplestartUrlsto archive campaign creative for reporting, since Snapchat CDN links expire. - 🔬 Researchers studying platform content trends use
isSponsoredandhasAttachmentacross many profiles to flag sponsored or link-carrying snaps. - 🏢 Content teams use
highlightIdandisChildto distinguish permanent highlight reels from the 24-hour story when building an archive. - 🤖 AI engineers feed
snapTitle,snapSubtitles, andstoryTitletext fields into a RAG index or agent context to answer questions about a brand's Snapchat presence.
🛡️ How does Snapchat Story Scraper handle rate limits and blocking?
By default, requests go out with no proxy. If Snapchat responds with a block or rate-limit status (403, 429, or 503) — or the connection itself fails — the Actor automatically escalates: first to Apify's datacenter proxy, then to residential proxy, retrying up to 3 times as it steps through the tiers. Once a run has escalated to residential proxy, it stays on residential proxy rather than dropping back down. Requests use browser-like headers (Chrome user agent, standard accept/sec-fetch-* headers), but this is a plain HTTP fetch of the profile page — there is no headless browser rendering and no CAPTCHA solving. If a username can't be scraped after retries and fallback are exhausted, the Actor logs the failure and moves on to the next username rather than stopping the run.
⬇️ Input
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
startUrls | Yes | array of strings | List one or more Snapchat usernames (e.g., fcbarcelona) or profile URLs (e.g., https://www.snapchat.com/@fcbarcelona). | ["fcbarcelona", "https://www.snapchat.com/@nike"] |
maxSnaps | No | integer (default: 100, minimum: 1) | Maximum number of snaps to return for each story or highlight. Example: maxSnaps=20 caps every story/highlight at its 20 most recent snaps. Default is 100. | 50 |
oldestSnapDate | No | string (datepicker, absolute or relative) | Skip snaps older than this date. Accepts an absolute date (e.g. 2026-01-01) or a relative expression (e.g. "7 days", "2 weeks", "1 month"). Leave empty to return all available snaps. | "30 days" |
proxyConfiguration | No | object (proxy editor) | Choose which proxies to use. By default, no proxy is used. If Snapchat rejects or blocks the request, the actor will automatically fallback to datacenter proxy, then residential proxy with 3 retries. | { "useApifyProxy": false } |
⚠️ maxSnaps only trims what Snapchat's own page already embeds — the Actor doesn't paginate or lazy-load beyond the initial page response. If a highlight has more snaps than Snapchat ships in that response, only the embedded subset is ever available, regardless of maxSnaps.
Example input
{"startUrls": ["fcbarcelona", "https://www.snapchat.com/@nike"],"maxSnaps": 50,"oldestSnapDate": "30 days","proxyConfiguration": { "useApifyProxy": false }}
⬆️ Output
Results are typed, normalized JSON with a consistent schema across runs — one row per story or highlight, each pushed as row_result the moment it's collected. Download the dataset as JSON, JSONL, CSV, Excel, or XML from the Apify Console or API. Every pushed row is a charged row_result event; if a username returns no public story or highlight content, no row is pushed for it and nothing is charged for that username.
Example output
{"username": "fcbarcelona","type": "highlight","isChild": true,"storyTitle": "NEW KIT","highlightId": "b8a8f6bc-d373-4dcc-9f06-0690b8c48fb1","thumbnailUrl": "https://cf-st.sc-cdn.net/d/abc123.jpg","snapList": [{"snapIndex": 0,"isSponsored": null,"snapTitle": null,"snapSubtitles": null,"lat": null,"lng": null,"hasAttachment": false,"intervalStartTimeMs": 0,"audioTranscriptionObjectUrl": null,"createTime": "2026-07-28T12:02:36.000Z","mediaPreviewUrl": "https://cf-st.sc-cdn.net/d/preview123.jpg","mediaUrl": "https://cf-st.sc-cdn.net/i/media123.mp4"}],"scrapedAt": "2026-07-29T10:15:00.000Z"}
⚙️ How does it work?
Snapchat Story Scraper fetches a profile's public page (https://www.snapchat.com/@username) directly over HTTP, with automatic proxy escalation and retries if Snapchat blocks the request. Instead of parsing rendered HTML, it locates the page's embedded __NEXT_DATA__ JSON payload — the same hydration data the site's own frontend uses — and reads the story and highlight objects out of it directly, so no CSS-selector scraping is involved. Only what's already public on that page is ever returned; there's no login step and no access to friends-only content. Because the Actor reads a structured JSON payload rather than the visual layout, the output schema stays stable even if Snapchat changes its page design.
🔌 Integrations
Snapchat Story Scraper runs like any Apify Actor, so it works with the tools you already use to call Apify.
Calling Snapchat Story Scraper programmatically
from apify_client import ApifyClientclient = ApifyClient("<APIFY_API_TOKEN>")run = client.actor("your-username/snapchat-user-stories-scraper").call(run_input={"startUrls": ["fcbarcelona", "https://www.snapchat.com/@nike"],"maxSnaps": 50,"oldestSnapDate": "30 days",})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["username"], item["type"], len(item["snapList"]))
Works in Go, Ruby, Node.js, cURL — any language that can make an HTTP request.
No-code tools (n8n, Make, LangChain)
In n8n, use the Apify node (or an HTTP Request node) pointed at the Actor's run endpoint with your API token. In Make, use the Apify app's "Run an Actor and get dataset items" module. In LangChain, wrap the Apify client call in a custom tool so an agent can trigger a run and read the resulting dataset items as context.
⚖️ Is it legal to scrape Snapchat stories and highlights?
Scraping publicly available data — content anyone can view on a Snapchat profile page without logging in — is generally permitted. Snapchat Story Scraper only returns this kind of publicly visible content; it never accesses private accounts or friends-only content. Because story and highlight content is tied to an identifiable Snapchat username, it can constitute personal data under GDPR and CCPA when the account belongs to an individual, which affects how you may store and use it. Consult legal counsel if your use case involves bulk storage of personal data.
❓ Frequently asked questions
What Snapchat story fields does Snapchat Story Scraper return?
The top fields are username, storyTitle, type/isChild, thumbnailUrl, and snapList (with mediaUrl, mediaPreviewUrl, and createTime per snap). See the full field table above.
Does Snapchat Story Scraper require a Snapchat account or login?
No. It reads the public profile page over plain HTTP with no cookies and no session — the input schema has no login or cookie field at all.
How many Snapchat stories or highlights can I extract in one run?
As many usernames as you add to startUrls — the array has no fixed maximum. For each username, the Actor returns the current story (if any) plus every curated highlight; maxSnaps (default 100, minimum 1) caps how many snaps come back per story or highlight, up to whatever Snapchat's own page embeds.
What happens if a Snapchat profile is private or doesn't exist?
The Actor can't locate the page's embedded data, logs a warning that the profile "may not exist or is private," and returns zero rows for that username — no error is thrown, and the run continues to the next username in startUrls.
Can I scrape multiple Snapchat usernames at once?
Yes — startUrls accepts a list of usernames or profile URLs. Each is processed in sequence within the same run, with results for each one written to the dataset as soon as they're scraped.
Does Snapchat Story Scraper work with Claude, ChatGPT, and other AI agent tools?
It's callable as an HTTP endpoint through the Apify API, so any agent framework that can make an HTTP request — LangChain, a custom Claude or GPT tool, or another orchestrator — can trigger a run and read back the dataset.
Why do results appear before the run finishes?
Each story or highlight is pushed to the dataset as row_result immediately after it's scraped, rather than batched at the end of the run — useful when you're processing many usernames and want to start consuming early results without waiting for the whole run to complete.
Does Snapchat Story Scraper return data in a format LLMs can use directly?
Yes. Output is typed, normalized JSON with consistent field names across runs — no HTML parsing or CSS selectors involved. Pass it directly to an LLM, index it into a vector store, or feed it to an agent tool.
What happens when Snapchat changes its layout or anti-bot system?
The Actor is maintained and its output schema is designed to stay stable across Snapchat page changes, since it reads structured JSON rather than the visual layout. No specific update turnaround time is published.
Can I use Snapchat Story Scraper without managing proxies or browser infrastructure?
Yes. The Actor makes plain HTTP requests itself and handles proxy selection and escalation (no proxy → datacenter → residential, with retries) internally — you don't need to run a browser or manage your own proxy pool.
Which Snapchat story fields work best for AI training data and RAG indexing?
For RAG, index the text-bearing fields — storyTitle, snapTitle, and snapSubtitles — alongside username for attribution. For training data, type, isChild, and createTime are the fields with the most consistent structure across every row. All fields return as typed primitives (strings, booleans, numbers, or null), never nested strings to re-parse.
🔗 Related scrapers
| Scraper | What it extracts |
|---|---|
| Instagram Story Details Scraper | Instagram story media and details for profiles viewable with your own logged-in session |
| Instagram Posts Scraper | Instagram posts with creator profile bios, follower counts and engagement metrics |
| Instagram Profile Post Scraper | Instagram profile posts, including pinned posts and recent comments |
| TikTok User Profile Scraper | TikTok profile stats with follower/following/likes counts and run-over-run engagement deltas |
💬 Your feedback
Found a bug or missing a field? Let us know via the Issues tab on this Actor's Apify Console page — we actively maintain this scraper and read every report.