What the Snapchat scraper collects
Scrapes public Snapchat profiles (subscriber count, bio, category, website, ids), their Spotlight videos with view, share, comment and boost counts, and their story and highlight snaps with media URLs and timestamps. All three modes read the same server-rendered page, so each account costs one request; output is JSON or CSV with a run sidecar.
Profiles
Input: A username, @username, profile URL, or a comma-separated listOne row per account: subscriber count, bio, website, category, business profile id, creation date and counts of Spotlight, highlights and lenses.
Spotlight videos
Input: One or more usernamesOne row per Spotlight video: views, shares, comments, boosts, title, hashtags, duration, upload time, video URL and sound.
Stories and highlights
Input: One or more usernamesOne row per snap in the live story or a highlight: collection, highlight name, media type, media and preview URLs, posting time.
From zero to Snapchat data in 3 steps
Install
Clone the repository and install one browser engine. Python 3.9+.
$ git clone https://github.com/2scraper/snapchat-scraper $ cd snapchat-scraper $ python3 -m venv venv $ ./venv/bin/pip install -r requirements.txt -r requirements-playwright.txt $ ./venv/bin/python playwright_scraper.py --url nasa
Run a scraper
Pick what you need and run it. Every flag is documented in the README.
$ ./venv/bin/python playwright_scraper.py --url nasa$ ./venv/bin/python playwright_scraper.py --url nasa,mrbeast,kyliejenner --mode spotlight --concurrency 3 --format both$ ./venv/bin/python playwright_scraper.py --url kyliejenner --mode storyGet structured data
Rows land in JSON or CSV (
--format), with a.meta.jsonsidecar recording status, pages fetched and why the run stopped.
Snapchat data fields
33 columns per row in a predictable schema. The most useful ones:
| Field | What it holds |
|---|---|
sku | Business profile id, Spotlight id or snap id, depending on mode |
username | Snapchat username |
title | Display name (profile) or Spotlight title |
subscriber_count | Subscribers, rounded by Snapchat to the hundred; null when hidden |
bio | Profile bio |
website_url | Website linked from the profile |
category | Snapchat's profile category |
public_profile | Whether the account is a Public Profile |
spotlight_count | Spotlight videos on the profile page |
created_at | When the public profile was created |
view_count | Spotlight views (spotlight mode) |
share_count | Spotlight shares (spotlight mode) |
comment_count | Spotlight comments (spotlight mode) |
uploaded_at | Spotlight upload time (spotlight mode) |
media_url | Snap media URL (story mode) |
posted_at | Snap posting time (story mode) |
[
{
"source": "snapchat.com",
"scraped_at": "2026-10-05T20:38:37Z",
"url": "https://www.snapchat.com/@nasa",
"sku": "cb983b26-c537-474b-9699-065309205ea2",
"title": "NASA",
"username": "nasa",
"public_profile": true,
"business_profile_id": "cb983b26-c537-474b-9699-065309205ea2",
"host_user_id": "92ea5bae-4f78-4611-ba8c-a60235ac2b49",
"entity_type": "Organization",
"subscriber_count": 755800,
"spotlight_count": 7,
"highlight_count": 10,
"story_snap_count": 0,
"lens_count": 3,
"has_story": false,
"has_curated_highlights": true,
"has_spotlight_highlights": true,
"has_more_spotlight": false,
"has_more_highlights": true,
"bio": "Explore the universe and discover our home planet with official NASA snaps.",
"website_url": "https://www.nasa.gov",
"address": null,
"category": "public-profile-category-v3-business-group",
"subcategory": "public-profile-subcategory-v3-government-org",
"badge": 1,
"profile_picture_url": "https://cf-st.sc-cdn.net/aps/bolt/aHR0cHM6Ly9jZi1zdC5zYy1jZG4ubmV0L2QvUVg2VHZkaDBHNUMzc…",
"hero_image_url": "https://cf-st.sc-cdn.net/aps/bolt/aHR0cHM6Ly9jZi1zdC5zYy1jZG4ubmV0L2QvalRSaVBkS2NYWmJlV…",
"snapcode_url": "https://app.snapchat.com/web/deeplink/snapcode?username=nasa&type=SVG&bitmoji=enable",
"created_at": "2019-05-22T17:38:27Z",
"modified_at": "2026-10-05T16:34:06Z",
"page": 1,
"position": 1
},
{
"source": "snapchat.com",
"scraped_at": "2026-10-05T20:38:37Z",
"url": "https://www.snapchat.com/@mrbeast",
"sku": "fe63dec1-4fa4-476c-9c73-19b2bc2e8589",
"title": "MrBeast",
"username": "mrbeast",
"public_profile": true,
"business_profile_id": "fe63dec1-4fa4-476c-9c73-19b2bc2e8589",
"host_user_id": "cb1adae6-ecc9-4a5f-b979-3f34d4cf1681",
"entity_type": null,
"subscriber_count": 1468400,
"spotlight_count": 4,
"highlight_count": 6,
"story_snap_count": 0,
"lens_count": 0,
"has_story": false,
"has_curated_highlights": true,
"has_spotlight_highlights": true,
"has_more_spotlight": false,
"has_more_highlights": true,
"bio": null,
"website_url": null,
"address": null,
"category": null,
"subcategory": null,
"badge": 1,
"profile_picture_url": "https://cf-st.sc-cdn.net/aps/bolt/aHR0cHM6Ly9jZi1zdC5zYy1jZG4ubmV0L2QvR2M2MEJNODVEdjRHW…",
"hero_image_url": "https://cf-st.sc-cdn.net/aps/bolt/aHR0cHM6Ly9jZi1zdC5zYy1jZG4ubmV0L2QvQ3F4eklZZHVGZUI3T…",
"snapcode_url": "https://app.snapchat.com/web/deeplink/snapcode?username=mrbeast&type=SVG&bitmoji=enable",
"created_at": null,
"modified_at": null,
"page": 2,
"position": 1
}
]First 2 of 4 rows from a real run — sample_output.json. Long values shortened here.
Handles what breaks naive Snapchat scrapers
Hidden counts are not zero
Snapchat publishes a hidden subscriber count as "0". The page's JSON-LD tells hidden from real, and a hidden count is written as null so it never drags an average.
Empty Spotlight slots skipped
Some of a profile's 25 Spotlight slots are placeholders with no id; they are counted in the sidecar instead of being written as videos with no views.
Stable keys for highlight snaps
Snapchat gives highlight snaps no id; the scraper builds a stable key from the highlight id and the CDN content id, unique even when one snap sits in several highlights.
Moved fields surface, not silently null
The sidecar lists payload keys the parser expected and a served page no longer carried, and the daily canary fails if that list is not empty.
Scraping infrastructure included
The same tested core runs every 2scraper repository, so the hard parts work the same way on every site.
CAPTCHA handling
Detects the challenge a page really serves and, with a 2Captcha key, solves it only when it blocks the data — a capped number of solves per page.
Proxy rotation
Single proxy or a pool from a file, rotated on blocks with a fresh browser per exit. Credentials stay out of argv and logs.
Fingerprints
Optional complete device identity from the 2Captcha Fingerprint API — user agent, client hints, locale and timezone that agree with each other.
Honest run metadata
Every run writes a .meta.json sidecar and distinct exit codes: complete, blocked, empty and partial are never confused, and a failed run never overwrites good data.
Diff two runs
diff_runs.py compares two complete Snapchat snapshots by id — new, removed and changed rows for monitoring.
What teams do with Snapchat data
Creator and brand research
Collect subscriber counts, categories, bios and websites for public profiles to build influencer or brand lists.
Spotlight performance tracking
Diff daily Spotlight runs by sku to follow views, shares and comments as videos are watched.
Story and highlight archiving
Record story and highlight snaps with media URLs and timestamps before a live story expires.
Audience growth monitoring
Track subscriber counts for a list of accounts over time from a scheduled run.
Free to run. Pay only for what the site requires.
Runs with no key, proxy or account
Snapchat profile pages are server-rendered and were served to anyone in Sep 2026, including plain curl from a bare datacentre address, 30 of 30 requests in a row. So the default transport is plain HTTPS and no key, proxy or browser download is needed. The paid products buy volume from many addresses, a specific exit country and no infrastructure of your own, not access; captcha solving is wired in, but no captcha has been met.
Optional 2Captcha services — captcha solving, the Scraping Browser API, residential proxies and fingerprints — work behind one key.
Good to know
- Only the first ~25 Spotlight videos per account; Discover, Lenses, Snap Map, topic pages and Spotlight comments are not implemented.
- Ordinary (non-public) accounts yield a profile row with public_profile: false and no Spotlight or story rows.
- --locale changes the page chrome, not the data in the rows.
2scraper vs. hosted scraper APIs
| 2scraper | Typical hosted API | |
|---|---|---|
| Code | Open source, MIT — read and patch it | Closed |
| Cost | Free; optional services billed only when used | Subscription or per request / per result |
| Runs on | Your machine, server or CI | The vendor's infrastructure |
| Output | JSON/CSV files + run metadata | API responses |
| When the site changes | Fix it yourself or open an issue / PR | Wait for the vendor |
Snapchat scraper FAQ
Do I need a proxy, key or Snapchat account?
No. Profiles are public and served to plain HTTP requests; the daily canary runs from a bare GitHub runner with no secrets.
What can I pass to --url?
A username, an @username, a profile URL (snapchat.com/@name, /add/name, story.snapchat.com/@name), or a comma-separated list of any mixture.
How many Spotlight videos does it get per account?
About 25 — what a profile page lists. The cursor pages beyond that use Snapchat's protobuf API, which this repo does not implement; has_more_spotlight flags such accounts.
Why do subscriber counts end in 00?
Snapchat rounds them to the nearest hundred everywhere on the page; there is no exact figure to read.
Which output formats are supported?
JSON, CSV or both, plus <out>.meta.json with status, failed accounts, accounts with more content than the page, and the viewer country Snapchat saw.
Is scraping Snapchat legal?
It reads public profile pages without logging in. It is public data; follow the site's terms and the law.