Snapchat Public Data API & Scraper
The Snapchat API returns public Snapchat data as clean JSON.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
The primary profile endpoint returns a username's display name, bio, subscriber count, website, profile picture and snapcode, and you can pull a story, highlights, lenses, spotlight, a spotlight detail and the lens directory. It is built for creator analytics and brand monitoring that need public Snapchat data without a login. One ReefAPI key, one shared credit pool, the standard envelope.
Which Snapchat fields are populated, and what the identifiers look like
This is the logged-out public surface, so several documented fields are absent on some accounts rather than null, and one flag disagrees with the data next to it. Measured 2026-08-27 on kyliejenner, nasa, the trending Spotlight feed and the top lens directory. These are the rows that trip people up when they wire a schema to the spec instead of to a response.
| Field | What it holds | When it is missing or misleading |
|---|---|---|
| profile.subscriber_count | The real public subscriber number | Populated on both accounts tested: kyliejenner 29,851,800 and nasa 762,700. |
| related_accounts[].subscriber_count | Suggested-account rows | Always 0. Every related account on both profiles returned 0, including ones that return millions when queried directly. |
| profile.bio | Free-text bio | Absent entirely on kyliejenner, present on nasa. The key is not returned rather than set to null, so use a safe accessor. |
| profile.category / subcategory | Account classification | Raw untranslated keys, not labels: "public-profile-category-v3-business-group" and "public-profile-subcategory-v3-government-org" on nasa. Both absent on kyliejenner. |
| profile.has_story | Flag for a live public story | Unreliable. kyliejenner returned has_story false while the story action returned 35 snaps timestamped over the previous four days. |
| story.story_id | Story identifier | Falls back to the username. kyliejenner's story returned story_id "kyliejenner" while each snap still carried a real 58-character snap_id. |
| highlights groups | Saved highlight reels | Each group carries highlight_id, a UUID such as 367bdbd7-d19a-4bf1-bc81-c3e73f7b1809, and story_id is null. kyliejenner returned 18 curated and 24 Spotlight highlight groups. |
| media_preview_url | Thumbnail for a snap | A nested object, {"value": "https://..."}, while media_url beside it is a plain string. Read .value. |
| spotlight story_id | Spotlight video id | A 58-character token, identical to snaps[0].snap_id and to the tail of snapchat.com/spotlight/<id>. Feed it straight to spotlight_detail. |
| lens scannable_uuid | Lens identifier | 32 lowercase hex characters, e.g. 565e7595ec4e4a0da689762b127308ef, and the same value sits in unlock_url as ?uuid=. Some lenses rows omit lens_id and scannable_uuid; recover the uuid from unlock_url. |
| Unknown username | profile, story, lenses | ok false with error.code NOT_FOUND, message "Snapchat returned 404 (no such public profile/resource)", retryable false. There is no empty-success case to guard against. |
media_type is 0 for an image snap and 1 for a video; kyliejenner's 35-snap story contained both. Media URLs are signed CDN links that expire, so download rather than store them.
Real request and response JSON
Captured from the indexed primary action, profile, on .
{
"method": "POST",
"url": "https://api.reefapi.com/snapchat/v1/profile",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"username": "kyliejenner"
}
}{
"ok": true,
"meta": {
"api": "snapchat",
"endpoint": "profile",
"mode": "live",
"latency_ms": 1377,
"record_count": 1,
"bytes": 1285363,
"cache_hit": false,
"charged_credits": 1,
"version": "0.1.0"
},
"data": {
"profile": {
"username": "kyliejenner",
"display_name": "King Kylie 👑",
"subscriber_count": 29262900,
"website_url": "kyliecosmetics.com",
"profile_pic": "https://cf-st.sc-cdn.net/aps/bolt/aHR0cHM6Ly9jZi1zdC5zYy1jZG4ubmV0L2QvaEJwN3Z0ZFl5NFVOeFpnWk04dXBYP2JvPUVna3lBUVJJQWxBWllBRSUzRCZ1Yz0yNQ._RS0,90_FMjpeg",
"hero_image": "https://cf-st.sc-cdn.net/aps/bolt/aHR0cHM6Ly9jZi1zdC5zYy1jZG4ubmV0L2QvakRGcnNVaW1ta2ZsamFPa1ZUTWVwP2JvPUVna3lBUVJJQWxBWllBRSUzRCZ1Yz0yNQ._RS0,1080_FMjpeg",
"snapcode_url": "https://app.snapchat.com/web/deeplink/snapcode?username=kyliejenner&type=SVG&bitmoji=enable",
"is_verified": true,
"badge": 1,
"business_profile_id": "e9bcdb52-a5cc-4dea-88ac-8baa91a78345",
"host_user_id": "7f445ef2-e1d3-4ef2-a235-a5aec8159168",
"has_story": false,
"has_curated_highlights": true,
"has_spotlight_highlights": true,
"created_at_ms": 1558548110393,
"updated_at_ms": 1789825152000,
"profile_url": "https://www.snapchat.com/add/kyliejenner",
"related_accounts": [
{
"username": "kimkardashian",
"display_name": "Kim Kardashian",
"subscriber_count": 0,
"profile_pic": "https://cf-st.sc-cdn.net/aps/bolt/aHR0cHM6Ly9jZi1zdC5zYy1jZG4ubmV0L2QvUjlZUUE2a0xHQlV0SHMxSjZhYmZhP2JvPUVnMGFBQm9BTWdFRVNBSlFHV0FCJnVjPTI1._RS0,640_FMjpeg",
"is_verified": true
},
{
"username": "kendalljenner",
"display_name": "Kendall Jenner",
"subscriber_count": 0,
"profile_pic": "https://cf-st.sc-cdn.net/aps/bolt/aHR0cHM6Ly9jZi1zdC5zYy1jZG4ubmV0L2QvWW1tSUZkY2JlZTNrZVl5bVlQbEpxP2JvPUVnMGFBQm9BTWdFRVNBSlFDR0FCJnVjPTg._RS0,640_FMpng",
"is_verified": true
},
{
"username": "kourtneykardash",
"display_name": "Kourtney Kardashian",
"subscriber_count": 0,
"profile_pic": "https://cf-st.sc-cdn.net/aps/bolt/aHR0cHM6Ly9jZi1zdC5zYy1jZG4ubmV0L2QvTlprQndFQk44VnJraXRwQkZ3cXdLP2JvPUVnMGFBQm9BTWdFRVNBSlFHV0FCJnVjPTI1._RS0,640_FMpng",
"is_verified": true
}
]
}
}
}What the Snapchat Public Data API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| profile | Full public Snapchat profile by username: display name, snapcode, subscriber count, bio, website, verified badge, profile picture, business id, related/suggested accounts, plus flags for whether the account has a live story and saved highlights. | Social-listening tools call profile to get full public Snapchat profile by username. | username |
| story | The account's current public story — the live snaps (image/video media URLs, timestamps, titles) that the profile is publicly broadcasting right now. | Creator and influencer platforms call story to get the account's current public story. | username |
| highlights | The account's saved public highlight stories (curated highlights + Spotlight highlights), each with its snaps. First page. | Brand-monitoring teams call highlights to get the account's saved public highlight stories (curated highlights + Spotlight highlights), eac…. | username |
| lenses | The creator's own public AR lenses listed on their profile: name, preview image/video, icon, unlock URL and scannable UUID. | Audience analysts call lenses to get the creator's own public AR lenses listed on their profile. | username |
| spotlight | The public trending Spotlight feed — ~25 popular Spotlight videos with engagement stats (views, shares, comments, boosts), creator, AI-generated title/description/keywords and media URLs. No input needed; returns what Snapchat is surfacing now. | Social-listening tools call spotlight to get the public trending Spotlight feed. | none |
| spotlight_detail | Full metadata for one public Spotlight video by its story id (from a spotlight result's story_id or a snapchat.com/spotlight/<id> URL): name, description, view count, duration, dimensions, creator and media URL. | Creator and influencer platforms call spotlight_detail to get full metadata for one public Spotlight video by its story id (from a spotlight result's story…. | story_id |
| lens_directory | Snapchat's public top/trending AR lens directory: the featured lenses plus the lens category list. First page. | Brand-monitoring teams call lens_directory to get snapchat's public top/trending AR lens directory. | none |
| lens_detail | Detail for one public AR lens by its scannable UUID (from a lens result's scannable_uuid or a snapchat.com/lens/<uuid> URL): name, creator, preview media, unlock URL, the Spotlight videos that use this lens, and related lenses. | Audience analysts call lens_detail to get detail for one public AR lens by its scannable UUID (from a lens result's scannable_uuid or a…. | uuid |
Call profile from your stack
curl -X POST https://api.reefapi.com/snapchat/v1/profile \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"username":"kyliejenner"}'import requests
r = requests.post(
"https://api.reefapi.com/snapchat/v1/profile",
headers={"x-api-key": REEF_KEY},
json={
"username": "kyliejenner"
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/snapchat/v1/profile", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"username": "kyliejenner"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.snapchat.profile with {"username":"kyliejenner"}.Who uses this API and why
- Creator analytics call profile to pull a public account's subscriber count.
- Brand monitoring uses story and spotlight to track content.
- AR tools use lenses and the lens directory to study creative trends.
Questions developers ask before integrating
profile says has_story false, so why does the story action return snaps?
Because the flag and the story payload come from different parts of Snapchat's own page data and they disagree. On 2026-08-27 kyliejenner returned has_story false, yet the story action returned 35 snaps timestamped from 2026-08-23 to 2026-08-27, none of which overlapped the 25 snaps inside her saved highlights. Treat has_story as a hint, and call story when you actually need to know.
Why are all the subscriber counts in related_accounts zero?
Snapchat does not put a subscriber number on the suggested-account cards, and the field defaults to 0 rather than null. Every related account under kyliejenner and under nasa returned 0, including kimkardashian and kendalljenner, both of which return real numbers when you query them as a username. Use related_accounts for discovery, then re-query each username for its count.
What is category "public-profile-category-v3-business-group" supposed to mean?
It is Snapchat's internal localization key, served instead of a display label. nasa came back with that category and subcategory "public-profile-subcategory-v3-government-org", so the meaning is readable once you strip the prefix, but you cannot show it to a user as-is. Accounts Snapchat has not classified omit both keys entirely, as kyliejenner did.
Spotlight videos are all called "Spotlight Snap". Where is the real title?
In ai_title. The name field is often Snapchat's generic label and description is the boilerplate "Another Spotlight Snap brought to you by Snapchat". Alongside them, ai_title, ai_description and ai_keywords carry Snapchat's own machine-generated summary of the clip, for example ai_title "Teee Dollar Gets a Fresh Cut at TD-CUTZ Barbershop" with keywords like "how to style dreads". Some videos do have a real name, such as "insane trick shot | @creator", so check both fields.
Which engagement numbers does a Spotlight video carry?
view_count, share_count, comment_count, boost_count and recommend_count, plus duration_ms, width, height and upload_date_ms. They do not scale together: one clip returned 779,899 views with 272 shares, 119 comments and 8,193 boosts, while a second returned 72,408 views with 335 shares, 9 comments and 10,110 boosts. Boosts are their own signal, not a fraction of views.
Why does media_preview_url break my parser?
It is an object where you expect a string. Every snap returns media_url as a plain URL string and media_preview_url as {"value": "https://..."} sitting right next to it. The same wrapped-value shape shows up in a few other nested blocks. Read media_preview_url.value, and treat any field that arrives as a one-key object with a value key the same way.
Do all lenses come with a preview video?
No. In the top lens directory, Snapchat's own lenses returned preview_image_url and preview_video_url on lens-storage.googleapis.com, while community lenses returned neither and had only icon_url plus creator_username. "Imagine" by Snapchat had full preview media with is_official true; "Drift Queen" by Haroon Zarr had an icon and unlock URL only, with is_official false. Check is_official before you plan on preview media.
What happens with a private or nonexistent username?
You get an explicit failure, not an empty success. A made-up handle returned ok false, error.code NOT_FOUND, message "Snapchat returned 404 (no such public profile/resource)", retryable false. Only accounts that exist at snapchat.com/add/<username> as public profiles resolve; an ordinary personal account has no public page and behaves the same way as a nonexistent one.
What is the Snapchat Public Data API?
Snapchat Public Data API is a ReefAPI endpoint group for snapchat public data It returns live JSON through POST requests under /snapchat/v1.
Is the Snapchat Public Data API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. Snapchat Public Data calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Snapchat Public Data login or account?
No login to Snapchat Public Data is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Snapchat Public Data data?
The page example is captured from a live profile call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Snapchat Public Data API use?
Snapchat Public Data actions currently cost 1 credit per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call Snapchat Public Data from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call snapchat actions with the same key, credit pool and JSON envelope used by normal REST requests.