Snapchat Profile Scraper With Email & Phone Leads
Pricing
from $3.99 / 1,000 results
Snapchat Profile Scraper With Email & Phone Leads
Snapchat Profile Scraper — Scrape public Snapchat profiles and extract usernames, display names, bios, follower metrics, profile details, and publicly available business contact information. Build structured creator and business lead lists for prospecting, research, and audience analysis.
Pricing
from $3.99 / 1,000 results
Rating
0.0
(0)
Developer
Scrapio
Maintained by CommunityActor stats
0
Bookmarked
18
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Snapchat Profile Scraper — Emails, Phone Numbers and Location Data
Snapchat profile scraper that turns a list of usernames into a contactable lead list. Every run reads the public profile page Snapchat already serves and returns typed JSON: business email, phone number, creator location split into city/region/country, website, link-in-bio social handles, subscriber count, category and verification badge — plus the full base profile, Spotlight clips and Spotlight highlight data in the same row. Unlike scraping frameworks that hand you raw HTML, this actor returns structured fields ready for a CRM, a spreadsheet or an LLM context window without any parsing.
No Snapchat account, login, cookie or API key is required — every request is logged out and unauthenticated, and the input schema carries no credential field of any kind (the only configurable connection setting is the optional Apify Proxy block, and it holds nothing marked as a secret). This guide covers every input and output field, the exact regex used to pull an email or phone number out of a bio, where that extraction can still misfire, and three ways teams run this actor in production — real-time enrichment, scheduled monitoring, and bulk list building.
What does the Snapchat Profile Scraper do?
It fetches the public snapchat.com/@<username> page for every handle you supply, pulls the embedded __NEXT_DATA__ JSON Snapchat's own front end uses to render the profile, and returns one row per profile. No Snapchat account or session is required for any of it — the actor never logs in. Alongside the lead fields it preserves the complete base profile object, so a single row answers both "can I contact this creator" and "what does their public profile actually look like."
- Extracts email and phone number from the public bio using a regex pattern hardened against Snapchat-specific false positives (
@mentions, follower counts, ratings) - Splits the creator's free-text location into city, region and country
- Optionally opens the profile website or link-in-bio page (Linktree, Bio.link, Stan Store, etc.) and pulls Instagram/TikTok/YouTube/X/Facebook/LinkedIn handles off it
- Computes a 0–100 contact-completeness score so you can filter a list down to only the leads worth a message
- Returns the full base profile record — bio, subscriber count, category, verification badge, profile picture, Snapcode
- Returns Spotlight clips and Spotlight highlight data (plays, shares, comments, media URL, transcript URL where available) in the same row
- Falls back from a direct connection to Apify's Residential proxy automatically if Snapchat starts blocking the run, and reports which mode actually served each request
⚡ Features & Capabilities
The actor covers three layers in one request per profile: contact extraction, the base public-profile record, and Spotlight/highlight content.
Core lead-extraction fields
primaryEmail/emails— de-duplicated, lower-cased email addresses found in the bioprimaryPhone/phones— de-duplicated phone numbers, normalised to an E.164-style+<countrycode><digits>stringlocationRaw,locationCity,locationRegion,locationCountry— the creator's self-reported location, splitwebsiteUrl,websiteDomain,isLinkInBio— the profile's website, normalised to an absolute URL, flagged if it's a known link-in-bio hostsocialProfileUrls,socialLinks,socialProfilesCount— handles resolved from Snapchat's own verified links and, optionally, from crawling the websitecontactCompleteness,contactCompletenessLabel— a weighted 0–100 score (email 40 + phone 25 + website 15 + socials 12 + location 8) and ahigh/medium/low/nonelabelsubscriberCountInt,isVerified,category,subcategory— audience size, verification badge and Snapchat's own category taxonomy, cleaned (public-profile-category-v3-beauty→beauty)
How this Snapchat scraper compares to other lead-gen scrapers
No other Snapchat-specific lead scraper turned up in an Apify Store search on this term, so the closest comparable listings are an Instagram profile-lead scraper and a generic B2B contact-database product. Both were checked live on 2026-07-26.
| Feature | Snapchat Profile Scraper With Email & Phone Leads | gocreative.ai Instagram Profile Scraper | peakydev Leads Scraper (PPE) |
|---|---|---|---|
| Platform scraped | Snapchat | Not platform-scraped — a pre-built contact database | |
| Source of contact data | Public bio text, regex-extracted | Business/public contact fields + bio (incl. obfuscated forms) | ~700M-record third-party contact index |
| Non-contact content in the same row | Full base profile + Spotlight clips + highlights | Up to 12 recent posts | Not documented |
| Login/account required | No | No | No |
| Pricing model (observed 2026-07-26) | Pay per event (row_result) | Pay per event, $2.25 per 1,000 profiles | Pay per event, $1 per 1,000 leads, 100-lead minimum charge per run |
| Proxy default | Direct connection, auto-fallback to Residential on a block | Auto (datacenter first, residential fallback) | Not documented |
| Weighted contact-completeness score | Yes, 0–100 | Not documented | Not documented |
If your use case is feeding structured data to an LLM or a CRM import job, the "source of contact data" row is the decision-maker: this actor only reports what a creator actually typed into their public bio — it does not invent, guess, or backfill a contact field Snapchat itself leaves empty.
When another tool might suit you better
If guaranteed email coverage is the requirement — not Snapchat specifically — a database product like peakydev's Leads Scraper genuinely fits better: it draws from a pre-built contact index rather than reading whatever a public bio happens to contain, and its own listing claims 70–90% work-email coverage. Snapchat carries no dedicated business-contact field at all; only creators who choose to type an email into their bio will ever have one. This actor is the right choice when Snapchat itself — its Spotlight content, its subscriber counts, its creator bios — is what you need, not a substitute source for contact coverage elsewhere.
Snapchat Profile Scraper within the Scrapio data stack
This actor covers Snapchat creator profiles and their contact leads. For Snapchat ad creative and impression data instead of creator profiles, use Snapchat Ads Scraper — Impressions & Share-of-Voice Ranking. For the same lead-generation shape on other platforms, see the Related Scrapers section below.
Why do developers and data teams scrape Snapchat profiles?
Influencer outreach and lead generation teams
Feed the actor a list of usernames pulled from Snapchat's explore surface or a campaign brief, get back primaryEmail, primaryPhone, websiteUrl and socialProfileUrls for each one, and filter to onlyProfilesWithContact: true or a minContactCompleteness threshold before anyone on the team writes an outreach message. contactCompleteness ranks the list so the highest-value leads surface first, and category/subcategory let a team split a mixed list by niche before assigning it out.
AI training data and RAG indexing
bio is the highest-information free-text field on the page — it is the field worth indexing for retrieval, since it is the only place a creator writes anything in their own words. For RAG enrichment, index bio alongside category, locationRaw and socialProfileUrls so a retrieval step can answer "creators in this niche, in this region, with these other channels." For training data, contactCompleteness, isVerified and subscriberCountInt are the fields with the most consistent structure across every row — they are typed primitives (integer, boolean, integer) on every profile regardless of how sparse the rest of the record is.
Competitive and market intelligence
Track subscriberCountInt, category and isVerified for a fixed list of accounts across repeated runs to watch audience growth and category shifts in a niche. websiteUrl and socialProfileUrls reveal which cross-platform channels a competitor's creators are actually driving traffic to, which is otherwise invisible from Snapchat's own app.
Research and academic use
locationRaw/locationCountry, category and bio support social and market-research datasets built from public Snapchat data — creator distribution by region, category prevalence, bio-language analysis. This is public-data-only scope: the actor never logs in and never accesses a private account's content.
🍚 Input Parameters
Every field below is read directly from .actor/actor.json, in schema order. Only urls is required.
| Parameter | Required | Type | Default / Constraints | Description |
|---|---|---|---|---|
urls | Yes | array of strings | minItems: 1, unique items | Add one or more Snapchat usernames (e.g. djkhaled305) or full profile URLs (e.g. https://www.snapchat.com/@djkhaled305). The snapchat.com/add/<user> form is accepted too. |
extractContacts | No | boolean | default true | Runs the hardened email/phone regex over the public bio. @mentions never become emails and follower counts never become phone numbers. Measured on 70 live profiles: bio present on 52 (74%), email found on 5 (7%), phone found on 1 (1%). Phone is emitted as null when absent. |
includeLocation | No | boolean | default true | Reads the free-text location a creator sets on their public profile and splits it into city/region/country. Measured on 70 live profiles: present on 31 (44%) — the highest-coverage lead-qualification field on the page. |
crawlWebsiteForSocials | No | boolean | default false | Opens the profile website and follows link-in-bio pages (Linktree, link.me, hoo.be, stan.store, …), extracting Instagram/TikTok/YouTube/X/Facebook/LinkedIn handles from the links on the page. Costs one extra request per profile that has a website. Measured on the 18 profiles with a website: 18/18 loaded, 15 returned at least one handle. It is not an email source. |
websiteCrawlTimeoutSecs | No | integer | default 20, min 5, max 120 (seconds) | Timeout for each website / link-in-bio request. |
useProxyForWebsiteCrawl | No | boolean | default false | Off by default: the Snapchat page needs no proxy and neither do most creator websites. |
onlyProfilesWithContact | No | boolean | default false | Drops rows with no email, no phone, no website and no social handle, so the dataset is a clean outreach list. Every profile is returned when this is off. |
minContactCompleteness | No | integer | default 0, min 0, max 100 | Keep only profiles scoring at or above this value. Score = email 40 + phone 25 + website 15 + socials 12 + location 8. Leave at 0 to keep everything. |
maxRetries | No | integer | default 3, min 1, max 10 | How many times a profile request is retried before the row is marked failed. |
requestTimeoutSecs | No | integer | default 30, min 5, max 180 (seconds) | Timeout for each Snapchat profile request. |
proxyConfiguration | No | object (editor: proxy) | prefill {"useApifyProxy": false} | Optional. Uses no proxy by default, which is what the Snapchat profile page needs. If you enable Apify Proxy and get blocked, the actor auto-switches to Residential; if Residential is not available on your account it degrades to a direct connection and reports that in effectiveProxyMode. No field in this object is marked isSecret — there is no credential to store. |
Input example
{"urls": ["djkhaled305","https://www.snapchat.com/@kyliejenner","https://www.snapchat.com/add/nba"],"extractContacts": true,"includeLocation": true,"crawlWebsiteForSocials": true,"onlyProfilesWithContact": false,"minContactCompleteness": 0,"maxRetries": 3,"requestTimeoutSecs": 30}
Supported URL types and input formats
Three input shapes are accepted per entry in urls, resolved by extract_username_from_input:
- Bare username —
djkhaled305or@djkhaled305(leading@is stripped) - Profile URL —
https://www.snapchat.com/@djkhaled305(the segment after/@up to the next/or?is taken as the username) - Add-friend URL —
https://www.snapchat.com/add/nba(the segment after/add/is taken as the username)
Any other snapchat.com URL shape, or a string that doesn't match one of these three forms, resolves to no username and is pushed as an invalid-input row rather than attempted.
📦 Output Format
Each successful run produces one dataset row per input entry. The default dataset view — the columns rendered by the Apify Console — surfaces 19 fields: username, displayName, primaryEmail, primaryPhone, locationRaw, locationCity, locationCountry, websiteUrl, socialProfileUrls, socialProfilesCount, contactCompleteness, contactCompletenessLabel, subscriberCountInt, isVerified, category, bio, profileType, url, ok. The view is a subset — a successfully scraped row actually carries 45 top-level keys, and every one of them is documented below.
Output for a scraped profile
{"ok": true,"username": "examplecreator","url": "https://www.snapchat.com/@examplecreator","data": {"search": "https://www.snapchat.com/add/examplecreator","spotlight": [{"spotlightId": "W7_EDlXWTBiEAEEACAAAAAE","link": "/@examplecreator/spotlight/W7_EDlXWTBiEAEEACAAAAAE","thumbnailSrc": "https://cf-st.sc-cdn.net/d/example_thumb.jpg","spotlightTitle": "Studio tour","plays": 48213,"shares": 612,"comments": 94,"isSponsored": null,"timestampInSec": 1737504000,"mediaUrl": "https://cf-st.sc-cdn.net/d/example_media.mp4","transcriptUrl": null}],"userProfile": {"publicProfileInfo": {"username": "examplecreator","title": "Example Creator","bio": "Bookings: hello@examplecreator.com | LA-based","address": "Los Angeles, CA, USA","websiteUrl": "linktr.ee/examplecreator","badge": 1,"subscriberCount": "182000","categoryStringId": "public-profile-category-v3-beauty"}},"spotlightHighlights": []},"attempt": 1,"proxyMode": "direct","profileType": "publicProfileInfo","profileExists": true,"displayName": "Example Creator","bio": "Bookings: hello@examplecreator.com | LA-based","hasBio": true,"emails": ["hello@examplecreator.com"],"primaryEmail": "hello@examplecreator.com","phones": [],"primaryPhone": null,"hasEmail": true,"hasPhone": false,"locationRaw": "Los Angeles, CA, USA","locationCity": "Los Angeles","locationRegion": "CA","locationCountry": "USA","locationParts": ["Los Angeles", "CA", "USA"],"hasLocation": true,"websiteUrl": "https://linktr.ee/examplecreator","websiteUrlRaw": "linktr.ee/examplecreator","websiteDomain": "linktr.ee","isLinkInBio": true,"websiteCrawl": {"attempted": true,"fetched": true,"status": 200,"finalUrl": "https://linktr.ee/examplecreator","impersonate": "chrome131","socialsFound": 2,"error": null},"socialLinks": {"instagram": ["examplecreator"], "tiktok": ["examplecreator"]},"socialProfileUrls": ["https://www.instagram.com/examplecreator", "https://www.tiktok.com/@examplecreator"],"socialProfilesCount": 2,"sameAsLinks": [],"contactCompleteness": 95,"contactCompletenessLabel": "high","hasAnyContact": true,"isVerified": true,"subscriberCountInt": 182000,"category": "beauty","subcategory": null,"profilePictureUrl": "https://cf-st.sc-cdn.net/d/example_avatar.jpg","snapcodeImageUrl": "https://app.snapchat.com/web/deeplink/snapcode?username=examplecreator","runGeoCountry": "US","runGeoLocale": "en-US","runGeoIsGdpr": false,"scrapedAt": "2026-07-26T14:02:11Z","effectiveProxyMode": "direct"}
All values above except the identifiers are illustrative — built to show the shape of every field, not a real scraped creator.
Output for a failed or filtered profile
A profile that exhausts maxRetries without a successful fetch is pushed as a short failure row, structurally different from a successful row:
{"ok": false,"username": "deletedhandle","url": "https://www.snapchat.com/@deletedhandle","error": "HTTPError 404: HTTP 404 for https://www.snapchat.com/@deletedhandle","attempt": 3,"proxyMode": "direct","effectiveProxyMode": "direct","profileType": "unknown","profileExists": false,"hasEmail": false,"hasPhone": false,"hasAnyContact": false,"contactCompleteness": 0,"contactCompletenessLabel": "none"}
An entry in urls that cannot be parsed into any username at all (see "Supported URL types" above) is pushed as an even shorter row: {"ok": false, "input": "<the raw value you supplied>", "error": "Invalid Snapchat username / URL"} — this row uses input instead of username/url, since no username was ever resolved.
A key-value store record named SUMMARY.json is also written at the end of every run, holding total, processed, successes, fallbackToResidential, withEmail, withPhone, withLocation, withWebsite, withSocials and filteredOut.
Pay-per-event charging
The actor charges a single row_result event for every row it pushes to the dataset — that covers a successful profile, a failed-fetch row, and an invalid-input row alike, since all three go through the same push call. A profile dropped by onlyProfilesWithContact or minContactCompleteness is never pushed to the dataset at all — the run loop skips the push entirely for a filtered-out profile — so you are not charged a row_result event for anything your filters excluded. Only rows that actually land in the dataset are billed.
Schema stability and export options
Field names in this output are the actor's own contract, not Snapchat's raw JSON keys, so they stay stable across Snapchat front-end changes — only the nested data.userProfile.publicProfileInfo block, which mirrors Snapchat's page payload directly, would shift if Snapchat restructures that payload. The dataset exports to JSON, CSV and Excel from the Apify Console, and is reachable through the Apify API and any integration built on an Apify dataset.
💡 Snapchat Profile Scraper Strategy Guide
Strategy 1: Real-time enrichment pipeline
Trigger a run from your own system the moment a new Snapchat handle enters your CRM or spreadsheet — a form submission, a campaign sign-up, a manually added lead. Call the actor with urls: ["<newhandle>"], wait for the run to finish, then read primaryEmail, primaryPhone, websiteUrl, socialProfileUrls and contactCompleteness straight off the single returned row and write them back into the source record. No polling loop is needed for a single-profile run — the Apify API run call returns once the actor finishes.
Strategy 2: Scheduled monitoring and alerting
Use an Apify Schedule to re-run the same urls list on a recurring cadence — weekly for an active outreach list, monthly for a static competitor set. Diff each run's contactCompleteness, subscriberCountInt, isVerified and primaryEmail against the previous run's dataset. Alert when contactCompleteness crosses your minContactCompleteness threshold for a profile that didn't clear it last time, or when a primaryEmail appears where there was none before — that's a creator who just became reachable.
Strategy 3: Bulk lead-list build
Feed the full list of usernames you want qualified in one run, with onlyProfilesWithContact: true or minContactCompleteness set to your working threshold, and export the resulting dataset directly to CSV for import into a CRM or spreadsheet. One documented behaviour matters for sizing a run: profiles inside a single run are processed one at a time, not concurrently — the main loop awaits each scrape_one call before starting the next. For wall-clock parallelism on a very large list, split the input across multiple concurrent runs rather than one large run.
Strategy comparison at a glance
| Strategy | Best for | Run pattern | Output format |
|---|---|---|---|
| Real-time enrichment | CRM/pipeline enrichment on new leads | Single-username on-demand run via the Apify API | JSON row read back via the API |
| Scheduled monitoring | Tracking a fixed list over time | Recurring run on an Apify Schedule, diffed run-over-run | Dataset compared across runs |
| Bulk lead-list build | Qualifying a large one-off list | One run, full urls list, contact filters applied | CSV/Excel export |
🌴 Related Snapchat Scrapers & Tools
| Scraper | What it extracts |
|---|---|
| Snapchat Ads Scraper — Impressions & Share-of-Voice Ranking (Scrapio) | Snapchat ad creative, impressions and share-of-voice ranking by advertiser |
| Instagram Influencer Finder by Keyword (Scrapio) | Instagram creators discovered by niche keyword, with follower/bio filters |
| TikTok Profile Scraper With Hashtag & Sound Analytics (Scrapio) | TikTok creator profiles with per-video hashtag and sound breakdowns |
| YouTube Channel Contact Extractor (Scrapio) | YouTube channel records with contact-signal extraction |
| Facebook Group Admin Contact Scraper (Scrapio) | Facebook group admin/moderator contact details |
Use the Snapchat Ads scraper alongside this one to pair a brand's ad spend and creative with the creators it's working with. Use the Instagram, TikTok and YouTube scrapers to build the same lead-qualification shape — bio, contact fields, audience size — on the other platforms your creator or lead list spans.
How to integrate the Snapchat Profile Scraper with your stack
This actor works with any language or tool that can make an HTTP request against the Apify API — it does not require a browser, a Snapchat login, or an API key of its own.
Python
import csvfrom apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_API_TOKEN>")usernames = ["djkhaled305", "https://www.snapchat.com/@kyliejenner", "nba"]run = client.actor("<YOUR_USERNAME>/snapchat-profile-scraper-email-phone-leads").call(run_input={"urls": usernames,"extractContacts": True,"includeLocation": True,"onlyProfilesWithContact": True,"minContactCompleteness": 40,})rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())with open("snapchat_leads.csv", "w", newline="", encoding="utf-8") as f:writer = csv.writer(f)writer.writerow(["username", "primaryEmail", "primaryPhone", "websiteUrl", "contactCompleteness"])for row in rows:writer.writerow([row.get("username"),row.get("primaryEmail"),row.get("primaryPhone"),row.get("websiteUrl"),row.get("contactCompleteness"),])print(f"Wrote {len(rows)} leads to snapchat_leads.csv")
Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_API_TOKEN>' });const run = await client.actor('<YOUR_USERNAME>/snapchat-profile-scraper-email-phone-leads').call({urls: ['djkhaled305', 'https://www.snapchat.com/@kyliejenner', 'nba'],extractContacts: true,includeLocation: true,onlyProfilesWithContact: true,minContactCompleteness: 40,});const { items } = await client.dataset(run.defaultDatasetId).listItems();for (const row of items) {console.log(row.username, row.primaryEmail, row.primaryPhone, row.contactCompleteness);}
Async and scheduled pipelines
For fire-and-forget jobs, call the run endpoint asynchronously (client.actor(...).start() in apify-client, or the equivalent async run in the Apify Console) and poll the run status or the dataset item count instead of blocking on .call(). For recurring jobs, an Apify Schedule re-runs the same input on a cron-style cadence without any code on your side — this is the mechanism behind Strategy 2 above.
Who needs the Snapchat Profile Scraper? (Use cases & industries)
Influencer marketing and outreach agencies
An agency building a Snapchat creator roster for a campaign pastes a list of candidate handles, sets minContactCompleteness to a working threshold, and gets back a ranked, contactable shortlist with primaryEmail, websiteUrl and category — instead of manually opening each profile to check whether it's even reachable.
Data teams building AI training or RAG datasets
Teams indexing creator-economy content for retrieval or model training pull bio, category and socialProfileUrls as the high-information fields, with contactCompleteness and isVerified as consistently structured signal fields across every row, regardless of how sparse the rest of a given profile is.
Competitive and market-intelligence analysts
Analysts tracking a competitor's creator network re-run the same username list on a schedule and watch subscriberCountInt, category and websiteUrl shift over time, surfacing new cross-platform channels or category repositioning before it shows up anywhere else.
Researchers
Academic and market researchers building public datasets on creator distribution, category prevalence or bio-language patterns use the actor strictly on public profile data — it never logs in, and it never accesses anything a logged-out visitor couldn't already see.
Is it legal to scrape Snapchat profiles?
Scraping publicly accessible web data is generally lawful in the United States: in hiQ Labs, Inc. v. LinkedIn Corp. (9th Cir. 2019), the court held that accessing publicly viewable pages does not violate the Computer Fraud and Abuse Act. That precedent concerns criminal computer-access law, not Snapchat's own Terms of Service — using Snapchat in a way its terms prohibit remains a contractual/civil matter between you and Snapchat, separate from criminal liability.
Because this actor extracts emails, phone numbers and locations that individual creators attached to their own public profile, that output is personal data under GDPR and CCPA even though it is publicly visible. runGeoIsGdpr is stamped on every row so you know whether the run was resolved from a GDPR-relevant region. Lawful basis for storing and using that data — for outreach, for a CRM, for a dataset — sits with you, not with the actor.
The Snapchat Profile Scraper returns only publicly accessible data. What you do with that data is your responsibility — consult legal counsel for commercial applications involving personal data.
❓ Frequently asked questions
Does the Snapchat Profile Scraper work without a Snapchat account?
Yes. Every request is a logged-out, unauthenticated GET to the public snapchat.com/@<username> page. No account, login, session cookie or API key is required or accepted anywhere in the input schema.
How does it handle Snapchat's anti-scraping measures?
By default the actor makes a direct connection — no proxy — since the public profile page doesn't need one. If a request returns HTTP 403/429, times out, or the underlying error text mentions blocking, the actor switches to Apify's Residential proxy group for all subsequent requests in that run and never switches back. If Residential isn't provisioned on your account, it detects the failed tunnel, gives up on that proxy group rather than burning your remaining retries on it, and continues on a direct connection — reported through effectiveProxyMode.
Can I run it at scale without getting blocked?
There is no published uptime or throughput guarantee. What is documented is the retry and fallback behaviour above, plus maxRetries (1–10, default 3) controlling how many attempts a single profile gets before it's marked failed. Profiles within one run are processed sequentially rather than concurrently — for a very large list, running several smaller jobs in parallel gets you more wall-clock throughput than one large run.
How fresh is the data it returns?
Every run does a live fetch — there is no cache. Each row is stamped with scrapedAt, the UTC timestamp of that specific fetch, so you always know exactly when a given row's data was current.
Which fields work best for AI training and RAG indexing?
For RAG, index bio — the only free-text field a creator writes themselves — alongside category, locationRaw and socialProfileUrls for filterable context. For training data, contactCompleteness, isVerified and subscriberCountInt are the most consistently structured fields: they return as typed primitives (integer, boolean, integer) on every row, whether or not the rest of the profile is sparse. Every field in the output is already a typed primitive or array — no string-parsing is needed before passing a row into an LLM context window.
Does the output count as personal data I need to handle carefully?
Yes, where it contains an email, phone number or location a creator attached to their own profile — that is personal data under GDPR/CCPA even though it was public. The actor returns publicly available data only; lawful basis for storing and using it sits with you.
Does it work with Claude, ChatGPT and other AI agent tools?
There is no MCP server documented for this actor. It is callable as an HTTP endpoint through the Apify API by any agent framework that can make a request — apify-client in Python or Node, a raw HTTP call, or an Apify integration. Every response is typed JSON, so no parsing step is needed before it enters an agent's context.
How does it compare to other Snapchat scrapers?
No directly competing Snapchat-lead scraper turned up in a Store search on this term as of 2026-07-26. Against the nearest comparable listings — an Instagram profile-lead scraper and a generic B2B contact-database product — this actor's advantage is Snapchat-specific coverage in a single row: full base profile plus Spotlight and highlight content alongside the contact fields. Its disadvantage against a database-style product is contact-hit rate: it can only report an email or phone that a creator actually typed into their bio, and on a 70-profile sample only 7% had one.
Why did a profile return no email?
Because the creator didn't put one in their bio, and Snapchat exposes no other public email field for a personal profile. Check hasBio — if it's false, there was no bio text to read at all. If it's true but primaryEmail is still null, the bio simply didn't contain anything the extraction pattern recognises as a real address.
Email and phone extraction — the exact patterns and their false-positive modes
extractContacts runs two independent regular expressions over the normalised bio text (src/contacts.py). Both were hardened specifically against Snapchat bio patterns and measured on 70 live profiles (52 with a non-empty bio).
Email regex:
(?<![A-Za-z0-9._%+\-@])([A-Za-z0-9](?:[A-Za-z0-9._%+\-]{0,62}[A-Za-z0-9])?)@((?:[A-Za-z0-9](?:[A-Za-z0-9\-]{0,61}[A-Za-z0-9])?\.)+)([A-Za-z]{2,24})(?![A-Za-z0-9\-])
A negative lookbehind/lookahead means the match can't be a fragment of a longer token, and — critically — no whitespace is allowed on either side of @. A matched local@domain.tld is then checked against a real-TLD allowlist (com, net, io, country codes, and roughly 80 others); anything outside that allowlist is treated as an @mention, not an email, and discarded. This is what stops IG @berbiedoll or tiktok @dhivya.sri from becoming an email — .sri is not on the allowlist. On the 70-profile sample, 9/9 bios containing an @mention were correctly rejected with 0 false positives.
Known false-positive mode: the TLD allowlist includes several strings that are simultaneously real ccTLDs and common vanity-domain endings (.co, .me, .id, .to, .gg). An @mention that happens to end in one of these — e.g. @brandname.co written as a handle rather than a domain — will still pass the allowlist check and be reported as an email. This case did not occur in the 70-profile measurement, but it is a structural possibility given how the allowlist is built.
Phone regex:
(?<![\d+])(\+\d[\d\s().\-]{6,20}\d|\(\d{3}\)\s?\d{3}[\s.\-]?\d{4}|\d{3}[\s.\-]\d{3}[\s.\-]\d{4})(?![\d])
Three branches: an explicit international number starting with +, a (xxx) xxx-xxxx NANP form, or an xxx-xxx-xxxx / xxx.xxx.xxxx NANP form. A bare, unseparated 10-digit run is never matched — real separators or a + prefix are mandatory, which is what stops a follower count like 280K, a rating like 4,9 Google, or 1.1 mil from ever becoming a phone number. URLs are stripped out of the bio before this regex runs, so a path like /2024/03/1234567 can't be misread as a number either. After a match, digits are normalised to +<countrycode><digits>; the result is discarded unless the digit count is 8–15 and the digits aren't all-one-value (0000000000, 1111111111 placeholders are rejected). On the 70-profile sample this produced 0 false positives.
Known false-positive mode: a code shaped exactly like a real NANP number with real separators — an event ticket code, a promo code, an internal reference formatted as xxx-xxx-xxxx — passes every check above, since the regex has no way to know the string isn't a phone number. This is inherent to matching on shape rather than semantics, and it did not occur in the 70-profile sample, which is why the actor reports 0 measured false positives rather than a guarantee of none.
Snapchat itself has no dedicated phone-number field on a public profile — a phone can only ever come from bio text a creator chose to type. In the 70-profile sample, exactly one bio contained a phone number. phones and primaryPhone are correctly null on essentially every profile as a result — that is the honest coverage rate, not a failure of the pattern.
Disclaimer
The Snapchat Profile Scraper extracts only publicly available data from Snapchat. This tool is intended for lawful use cases only. Users are responsible for complying with Snapchat's terms of service and applicable data protection laws in their jurisdiction.