1. 2scraper
  2. Social media & video
  3. Snapchat
Open source · MITRuns with no key, proxy or account

Snapchat Scraper

Public Snapchat profiles, Spotlight engagement and story snaps — one request per account, no key, proxy or account.

  • Plain HTTP
  • Playwright
  • Selenium
  • Puppeteer
  • Scraping Browser API
  • JSON
  • CSV
snapchat-scraper
# Profiles
$ ./venv/bin/python playwright_scraper.py --url nasa
✓ 4 sample rows · 33 columns in sample_output.json
3modes: profile, Spotlight, story
1request per account, whatever the mode
1.29 sfor three accounts over plain HTTP (Sep 2026)
0keys, proxies or accounts needed
Available Snapchat scrapers

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 list

One 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 usernames

One row per Spotlight video: views, shares, comments, boosts, title, hashtags, duration, upload time, video URL and sound.

Stories and highlights

Input: One or more usernames

One row per snap in the live story or a highlight: collection, highlight name, media type, media and preview URLs, posting time.

Quick start

From zero to Snapchat data in 3 steps

  1. 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
  2. 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
  3. Get structured data

    Rows land in JSON or CSV (--format), with a .meta.json sidecar recording status, pages fetched and why the run stopped.

Output

Snapchat data fields

33 columns per row in a predictable schema. The most useful ones:

FieldWhat it holds
skuBusiness profile id, Spotlight id or snap id, depending on mode
usernameSnapchat username
titleDisplay name (profile) or Spotlight title
subscriber_countSubscribers, rounded by Snapchat to the hundred; null when hidden
bioProfile bio
website_urlWebsite linked from the profile
categorySnapchat's profile category
public_profileWhether the account is a Public Profile
spotlight_countSpotlight videos on the profile page
created_atWhen the public profile was created
view_countSpotlight views (spotlight mode)
share_countSpotlight shares (spotlight mode)
comment_countSpotlight comments (spotlight mode)
uploaded_atSpotlight upload time (spotlight mode)
media_urlSnap media URL (story mode)
posted_atSnap 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.

Built for Snapchat

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.

Everything built in

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.

Use cases

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.

Access & pricing

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

2scraperTypical hosted API
CodeOpen source, MIT — read and patch itClosed
CostFree; optional services billed only when usedSubscription or per request / per result
Runs onYour machine, server or CIThe vendor's infrastructure
OutputJSON/CSV files + run metadataAPI responses
When the site changesFix it yourself or open an issue / PRWait for the vendor
FAQ

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.