Snapchat Profile Scraper With Email & Phone Leads avatar

Snapchat Profile Scraper With Email & Phone Leads

Pricing

from $3.99 / 1,000 results

Go to Apify Store
Snapchat Profile Scraper With Email & Phone Leads

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

Scrapio

Maintained by Community

Actor stats

0

Bookmarked

18

Total users

1

Monthly active users

a day ago

Last modified

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 bio
  • primaryPhone / phones — de-duplicated phone numbers, normalised to an E.164-style +<countrycode><digits> string
  • locationRaw, locationCity, locationRegion, locationCountry — the creator's self-reported location, split
  • websiteUrl, websiteDomain, isLinkInBio — the profile's website, normalised to an absolute URL, flagged if it's a known link-in-bio host
  • socialProfileUrls, socialLinks, socialProfilesCount — handles resolved from Snapchat's own verified links and, optionally, from crawling the website
  • contactCompleteness, contactCompletenessLabel — a weighted 0–100 score (email 40 + phone 25 + website 15 + socials 12 + location 8) and a high/medium/low/none label
  • subscriberCountInt, isVerified, category, subcategory — audience size, verification badge and Snapchat's own category taxonomy, cleaned (public-profile-category-v3-beautybeauty)

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.

FeatureSnapchat Profile Scraper With Email & Phone Leadsgocreative.ai Instagram Profile Scraperpeakydev Leads Scraper (PPE)
Platform scrapedSnapchatInstagramNot platform-scraped — a pre-built contact database
Source of contact dataPublic bio text, regex-extractedBusiness/public contact fields + bio (incl. obfuscated forms)~700M-record third-party contact index
Non-contact content in the same rowFull base profile + Spotlight clips + highlightsUp to 12 recent postsNot documented
Login/account requiredNoNoNo
Pricing model (observed 2026-07-26)Pay per event (row_result)Pay per event, $2.25 per 1,000 profilesPay per event, $1 per 1,000 leads, 100-lead minimum charge per run
Proxy defaultDirect connection, auto-fallback to Residential on a blockAuto (datacenter first, residential fallback)Not documented
Weighted contact-completeness scoreYes, 0–100Not documentedNot 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.

ParameterRequiredTypeDefault / ConstraintsDescription
urlsYesarray of stringsminItems: 1, unique itemsAdd 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.
extractContactsNobooleandefault trueRuns 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.
includeLocationNobooleandefault trueReads 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.
crawlWebsiteForSocialsNobooleandefault falseOpens 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.
websiteCrawlTimeoutSecsNointegerdefault 20, min 5, max 120 (seconds)Timeout for each website / link-in-bio request.
useProxyForWebsiteCrawlNobooleandefault falseOff by default: the Snapchat page needs no proxy and neither do most creator websites.
onlyProfilesWithContactNobooleandefault falseDrops 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.
minContactCompletenessNointegerdefault 0, min 0, max 100Keep 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.
maxRetriesNointegerdefault 3, min 1, max 10How many times a profile request is retried before the row is marked failed.
requestTimeoutSecsNointegerdefault 30, min 5, max 180 (seconds)Timeout for each Snapchat profile request.
proxyConfigurationNoobject (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 usernamedjkhaled305 or @djkhaled305 (leading @ is stripped)
  • Profile URLhttps://www.snapchat.com/@djkhaled305 (the segment after /@ up to the next / or ? is taken as the username)
  • Add-friend URLhttps://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

StrategyBest forRun patternOutput format
Real-time enrichmentCRM/pipeline enrichment on new leadsSingle-username on-demand run via the Apify APIJSON row read back via the API
Scheduled monitoringTracking a fixed list over timeRecurring run on an Apify Schedule, diffed run-over-runDataset compared across runs
Bulk lead-list buildQualifying a large one-off listOne run, full urls list, contact filters appliedCSV/Excel export

ScraperWhat 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 csv
from apify_client import ApifyClient
client = 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.


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.