# Snapchat Profile Scraper - Subscribers, Stories & Spotlight (`dami_studio/snapchat-profile-scraper`) Actor

Public Snapchat profiles by username: subscriber count, bio, category, website and pictures, the snaps in the current story, and the Spotlight videos on the profile with views, shares and comments. Accounts that aren't public profiles are skipped and never charged.

- **URL**: https://apify.com/dami\_studio/snapchat-profile-scraper.md
- **Developed by:** [Dami's Studio](https://apify.com/dami_studio) (community)
- **Categories:** Social media, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.75 / 1,000 profile scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Snapchat Profile Scraper

Paste Snapchat usernames and get one row for each public profile: the display name, subscriber count, bio, category, website, profile picture and snapcode. The same row carries the snaps in the profile's story right now and the Spotlight videos on the profile, each with its views, shares and comments.

No usernames yet? Give it hashtags or search words. It finds the profiles on Snapchat's own hashtag and search pages and reads each one the same way.

It reads the pages anyone can open at snapchat.com without logging in. You don't need a Snapchat account.

### What it doesn't do

- **Only public profiles.** Creators, brands and public figures have one. An ordinary personal account doesn't, so it gets no row, nothing from its page is kept, and it isn't charged. The run report marks it `not-public`.
- **Nothing behind a login.** No friends lists, no chats, no Snap Map.
- **Stories last 24 hours.** If the creator hasn't posted in the last day, `storySnaps` is an empty list. That's the profile's real state, not an error. Of 126 profiles checked while this was built, 29 had a story, the biggest with 184 snaps.
- **Spotlight means the videos the profile page lists,** not everything the creator ever posted. On those 126 profiles it was anywhere from none to 31 videos, 9 at the median, some of them from 2022.
- **A hashtag gives the creators on its page right now.** Snapchat's page for a hashtag lists about 32 Spotlight videos; on 13 September 2026, #football's page had 32 videos by 30 creators. Older videos under the hashtag aren't reached, and a creator without a public profile is skipped and not charged.
- **A creator who changed username can slip through.** A hashtag page still lists some creators under the username they posted with, and Snapchat now opens that name as a different one. Nothing on the page proves it's the same person, so the profile is left out and not charged, and the run report gives the name the page answered to. On #football, 3 of the 30 creators were like that.
- **A search gives 24 profiles at most.** That's how many public profiles Snapchat's search page lists for a term. "real madrid" listed 19.
- **Highlights come as titles and snap counts.** The snaps inside a highlight aren't included.
- **Spotlight comments are counted, not collected.** You get the number, not the text or who wrote it.
- **A hidden view count stays hidden.** When a creator hides the views on a video, `views` is empty rather than a guess.

### Input

**Usernames or profile links.** One per line. `kyliejenner`, `@kyliejenner`, `https://www.snapchat.com/add/kyliejenner` and `https://www.snapchat.com/@kyliejenner` all work. Up to 1,000 in one run. Capitals don't matter, and a username given twice is read once. A link to a single Spotlight video or a lens isn't a profile link, so it's skipped and listed in the run report. Leave the list empty if you only want the profiles your hashtags or searches find.

**Hashtags.** `football`, `#football` or `https://www.snapchat.com/tag/football`. Capitals don't matter. A hashtag is letters, numbers and underscores, so `real madrid` belongs under Search terms. Up to 20.

**Search terms.** Words, such as `cooking` or `real madrid`. Each one brings back the public profiles Snapchat's search lists for it. Up to 20.

Profiles found through hashtags and searches are read after your usernames, and a profile that turns up twice is read once. One run reads 1,000 profiles at most, however they came in.

**Include the current story** and **Include Spotlight videos.** Both on by default. Switch them off if you only want the profile and its numbers. The counts (`storySnapCount`, `spotlightCount`) stay; only the lists go.

```json
{
  "usernames": ["kyliejenner", "@djkhaled305"],
  "hashtags": ["football"],
  "searchTerms": ["cooking"],
  "includeStory": true,
  "includeSpotlight": true
}
```

Run it with nothing filled in and you get one sample row: DJ Khaled's profile as his page read on 13 September 2026, marked `_sample: true`, with the picture links and the lists left out. It isn't charged.

### Output

One row per public profile: your usernames first, in the order you gave them, then the ones your hashtags and searches found. The Output tab has three views: Profiles, Spotlight videos (one line per video) and Story snaps (one line per snap).

| Field | Example | Notes |
|---|---|---|
| `username` | `djkhaled305` | |
| `name` | `DJ Khaled` | the display name |
| `url` | `https://www.snapchat.com/@djkhaled305` | |
| `subscriberCount` | `11534200` | rounded to the hundred by Snapchat; can be 0 (see below) |
| `bio` | `FATHER \| CEO \| MOGUL` | |
| `category`, `subcategory` | `People`, `Artist` | from Snapchat's own category code; empty when the creator didn't choose one |
| `websiteUrl` | `kyliecosmetics.com` | as written on the profile |
| `address` | | usually empty; some businesses fill it in |
| `badge` | `1` | Snapchat's badge code, passed on as a number |
| `profilePictureUrl`, `heroImageUrl`, `snapcodeUrl` | | image links |
| `profileId` | | Snapchat's id for the public profile |
| `profileCreatedAt`, `profileUpdatedAt` | `2019-05-22T17:21:50.393Z` | when the public profile was set up and last changed |
| `storySnapCount`, `spotlightCount`, `highlightCount`, `lensCount` | `25`, `10`, `18`, `1` | |
| `storySnaps` | | `id`, `type` (`image` or `video`), `postedAt`, `mediaUrl`, `previewUrl` |
| `spotlightVideos` | | see below |
| `highlights` | | `id`, `title`, `snapCount`, `coverUrl` |
| `lenses` | | lenses the profile made: `name`, `previewImageUrl`, `previewVideoUrl`, `unlockUrl`, `updatedAt` |
| `relatedAccounts` | | the profiles Snapchat suggests next to this one: `username`, `name`, `url` |
| `foundVia` | `hashtag` | `username` for a profile you gave, `hashtag` or `search` for one the actor found |
| `input` | `#football` | the username you typed, or the hashtag or search term that found the profile |
| `scrapedAt` | | when the row was made |

Each Spotlight video has `id`, `url` (its page on Snapchat), `caption`, `hashtags`, `views`, `shares`, `comments`, `durationSeconds`, `width`, `height`, `postedAt`, `videoUrl` and `thumbnailUrl`, plus `boostCount` and `recommendCount`. Those two keep Snapchat's own names. Snapchat doesn't say exactly what they count, so compare them between videos rather than reading them as likes.

A Spotlight video posted without a caption has `caption` empty. Snapchat fills the gap with a stock sentence of its own, and that sentence is dropped so it can't pass for the creator's words.

The photo and video links (`mediaUrl`, `previewUrl`, `videoUrl`, `thumbnailUrl`) point at Snapchat's own servers. How long they keep working hasn't been measured, so if you want the files, download them soon after the run instead of keeping only the links.

`subscriberCount` comes rounded to the hundred: every one of the 126 profiles checked ended in 00. 21 of them showed 0, some of them big accounts. The page doesn't say whether that means a hidden count or no subscribers, so the row keeps the 0 it was given.

`category` and `subcategory` are Snapchat's category codes written out as words, so `musician-band` comes through as `Musician Band`. 53 of the 126 profiles had no category at all.

`badge` was 1 on 107 of the 126 profiles and 0 on the other 19. Snapchat doesn't document what the values mean, and the zeros don't line up with anything else in the row, so it comes through as the number rather than a yes or no.

### What you pay

Each public profile returned is one charge, whatever it holds: a profile with 25 story snaps and 24 Spotlight videos costs the same as one with neither. Looking up a hashtag or a search isn't charged by itself; you pay for the public profiles it leads to, the same as for usernames you typed. Usernames that don't exist, accounts that aren't public profiles and profiles that couldn't be loaded aren't charged, and neither are repeats. If you set a maximum charge for the run, it stops fetching once that is reached. The price is on the Pricing tab.

### The run report

`RUN_REPORT` in the key-value store has a line for every profile: `ok`, `not-found`, `not-public`, `different-account` (the page answered with another username, so it was left out), `unreachable` (couldn't be loaded; try it again later) or `skipped` (the run stopped first), and how it was found. It has a line for each hashtag and search too: how many profiles its page listed and how many were new to the run, or that Snapchat has no page for it. It also lists the entries that couldn't be used, and why the run stopped.

### Limits

- 1,000 profiles per run, counting the ones hashtags and searches find, plus 20 hashtags and 20 search terms. Split a longer list over several runs.
- Profiles are read one after another. In testing that came to about a third of a second each: 126 profiles in 48 seconds.
- If the first three profiles in a run can't be loaded, the rest aren't tried. They're listed in the run report and aren't charged.

### Questions

**A username I know exists came back as `not-public`.** It's a personal account without a public profile. Only its owner can make one.

**Why did a hashtag give me fewer profiles than it has creators?** Some of the creators on a hashtag's page have personal accounts, not public profiles. They're skipped and not charged, and the run report lists them as `not-public`.

**Can I get more Spotlight videos than the page shows?** Not with this actor. It returns what the profile page lists.

**Why is `subscriberCount` 0 on a big account?** That's the figure Snapchat put on the page. It may be a hidden count, and the row shows it as given rather than guessing.

# Actor input Schema

## `usernames` (type: `array`):

One per line: kyliejenner, @kyliejenner, https://www.snapchat.com/add/kyliejenner or https://www.snapchat.com/@kyliejenner. Up to 1,000 in one run. Only public profiles come back; the run report says what happened to the rest. Leave it empty if you only want the profiles your hashtags or search terms find.

## `hashtags` (type: `array`):

football, #football or https://www.snapchat.com/tag/football. Snapchat's page for a hashtag lists about 32 Spotlight videos, and the actor reads the profile of each creator among them. Creators without a public profile are skipped and not charged. Up to 20 hashtags.

## `searchTerms` (type: `array`):

Words to search Snapchat's public profiles for, like cooking or real madrid. Each search brings back the profiles Snapchat lists for it, 24 at most. Up to 20 searches.

## `includeStory` (type: `boolean`):

The snaps in the profile's public story right now, each with a link to the photo or video and the time it was posted. Stories disappear after 24 hours, so plenty of profiles have none when you look.

## `includeSpotlight` (type: `boolean`):

The Spotlight videos listed on the profile page, each with views, shares, comments, length, caption, hashtags and links to the video.

## Actor input object example

```json
{
  "usernames": [
    "kyliejenner",
    "djkhaled305"
  ],
  "includeStory": true,
  "includeSpotlight": true
}
```

# Actor output Schema

## `results` (type: `string`):

One row per public profile found: name, subscriber count, bio, category, website, pictures, the current story's snaps, the Spotlight videos on the profile, highlights, lenses and related accounts. Usernames that don't exist or aren't public profiles have no row; the run report lists them.

## `report` (type: `string`):

What happened to each username (returned, doesn't exist, not a public profile, couldn't be loaded, skipped), the entries that weren't usernames, and why the run stopped.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "usernames": [
        "kyliejenner",
        "djkhaled305"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("dami_studio/snapchat-profile-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "usernames": [
        "kyliejenner",
        "djkhaled305",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("dami_studio/snapchat-profile-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "usernames": [
    "kyliejenner",
    "djkhaled305"
  ]
}' |
apify call dami_studio/snapchat-profile-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/snapchat-profile-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Ha5nHoK3DKWkIEEog/builds/YkQEKFX7q6NCvg7kH/openapi.json
