# Snapchat Profile & Spotlight Scraper 👻 (`tagadanar/snapchat-scraper`) Actor

Track public Snapchat profiles and Spotlight videos by creator or hashtag. Subscriber counts, views, shares, comments and media URLs in flat rows. $1.50 per 1,000 rows + $0.001/run, usage included. First public page only. No login.

- **URL**: https://apify.com/tagadanar/snapchat-scraper.md
- **Developed by:** [Tagada Data](https://apify.com/tagadanar) (community)
- **Categories:** Social media, Videos, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.05 / 1,000 public profile or spotlight videos

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Snapchat Profile & Spotlight Scraper

Track Snapchat public profiles and Spotlight performance as flat rows for a spreadsheet or a monitoring pipeline.

$1.50 per 1,000 delivered rows on Free ($1.05 on Gold), plus $0.001 per run, with platform usage included. Collect the first public page of profiles or hashtags and individual Spotlight videos. No Snapchat account or login is needed.

### What you get

Usernames and profile links produce `profile` and/or `spotlight` rows. Individual Spotlight links produce one video row. Hashtags find videos on the first public hashtag page and open their individual pages for playable media and engagement data. Each row is flat; `keywords` and `hashtags` are simple lists.

| Fields | Contents |
| --- | --- |
| `type`, `id`, `url` | `profile` or `spotlight`, the record ID and canonical page URL |
| `username`, `displayName` | Creator handle and displayed name |
| `subscriberCount`, `bio`, `websiteUrl` | Public profile fields; null on video rows |
| `avatarUrl`, `snapcodeUrl`, `badge`, `category` | Public profile images, Snapchat's numeric badge and raw category identifier |
| `createdAt`, `updatedAt` | Public profile timestamps, when present |
| `caption`, `hashtags` | Spotlight caption and tags |
| `viewCount`, `shareCount`, `commentCount`, `boostCount`, `recommendCount` | Public engagement counts, null when unavailable |
| `durationSeconds`, `width`, `height`, `publishedAt` | Video length, pixel dimensions and upload timestamp |
| `mediaUrl`, `thumbnailUrl` | Playable video and cover URLs |
| `title`, `description`, `keywords`, `language` | Snapchat's generated title, description, topic keywords and detected language, when supplied |
| `source`, `scrapedAt` | Input source and UTC capture time |

Generated titles and descriptions belong to Snapchat. They can be absent or inaccurate. A blank field stays `null`; an absent count is never invented as zero. Empty Spotlight cards add no rows. A video's page may include recommendations, but an individual link returns only the requested video.

### Examples

The prefill requests FC Barcelona's public profile and available videos, with a total cap:

```json
{
  "usernames": ["fcbarcelona"],
  "maxResults": 10
}
```

Profile snapshots for tracking subscriber counts over time:

```json
{
  "usernames": ["nasa", "https://www.snapchat.com/@fcbarcelona"],
  "resultType": "profiles",
  "maxResults": 20
}
```

Find videos for a hashtag:

```json
{
  "hashtags": ["#funny"],
  "maxResults": 20,
  "maxSpotlightsPerSource": 20
}
```

Collect videos from a creator list and skip IDs delivered by earlier runs:

```json
{
  "usernames": ["fcbarcelona"],
  "resultType": "spotlights",
  "maxResults": 100,
  "onlyNew": true,
  "monitorKey": "football-videos"
}
```

For individual videos, put canonical `https://www.snapchat.com/spotlight/<id>` or user-scoped `https://www.snapchat.com/@<username>/spotlight/<id>` URLs in `spotlightUrls`. Replace placeholders with real links. App share links, topic pages and general search are unsupported.

### Inputs

| Field | Effect |
| --- | --- |
| `usernames` | Usernames, `/add/username`, `/@username`, or `/@username/spotlight` profile links |
| `spotlightUrls` | Individual Spotlight URLs; each returns a video regardless of `resultType` |
| `hashtags` | Bare tags, `#tags` or `/tag/tag` URLs; returns videos regardless of `resultType` |
| `resultType` | `profiles`, `spotlights`, or `both` for profile sources; default `both` |
| `maxResults` | Total cap across all delivered row types; default 100, maximum 10,000 |
| `maxSpotlightsPerSource` | Maximum videos considered from each available profile/hashtag page; default 30 |
| `onlyNew` | Suppress previously delivered profile/video IDs; default false |
| `monitorKey` | History namespace within your Apify account; default `default` |

Inputs combine. Sources are processed in order: profiles, explicit video links, then hashtags. A small total cap can leave later sources unstarted. Up to 200 distinct sources per run. The runtime also accepts scalar, comma/newline separated strings and obvious URL/username objects; Apify's form schema expects lists.

### Monitoring and completeness

Leave `onlyNew` off for subscriber and engagement snapshots. Turn it on for discovery of previously unseen IDs. The same profile ID is suppressed even if its follower count changed. History is saved after successful billing and dataset delivery, retains the most recent 50,000 IDs, and is scoped by `monitorKey` in the named `snapchat-scraper-monitor` store. Avoid overlapping runs sharing a key. Storage is not transactional across concurrent runs; an interrupted delivery before history persistence may be repeated later.

**First public page only.** Profiles and hashtags return the public window embedded in their pages. A profile continuation cursor did not produce additional videos in platform tests; the site's story-player continuation returned temporary placeholders. This actor does not collect a full upload history. Raising a cap does not make older pages available. The run summary states `AVAILABLE_WINDOW` and names the pagination limitation.

Missing profiles (`NOT_FOUND`), add-user cards without a public profile (`NO_PUBLIC_PROFILE`), restricted videos (`RESTRICTED`), unreadable pages (`MARKUP_CHANGED`), refusals (`REFUSED`) and run deadlines (`CLOCK_STOPPED`) remain distinct. A run that delivers some rows succeeds and names any unfinished sources. A zero-row run succeeds when every source is already delivered or proven empty. It also succeeds when those proven sources accompany missing or non-public profiles, naming each source and its outcome. All-missing lists and zero-row runs with refused, errored, unresolved, clock-stopped or charge-limited work fail with named reasons. Invalid input fails with `BAD_INPUT` and makes no Snapchat requests.

`RUN_SUMMARY` in the run's key-value store records per-source outcomes, row counts and fetch diagnostics. It is operational metadata, not a billable dataset row.

### Pricing

| Plan | Price per 1,000 delivered rows |
| --- | --- |
| Free | $1.50 |
| Bronze | $1.35 |
| Silver | $1.20 |
| Gold | $1.05 |

Plus **$0.001 per run**, including invalid-input and zero-delivery runs. Platform usage is included. The custom events are `result` and `actor-start`. Only delivered rows incur a result charge.

### Who this is for

Creator agencies can compare public subscriber and Spotlight engagement snapshots. Social teams can collect campaign examples by creator or hashtag. Researchers can export captions, topic keywords and capture timestamps for public videos. The flat rows export through Apify datasets as JSON, CSV or Excel.

### Questions

**Can it scrape private Snapchat accounts or friends-only stories?** Only information on logged-out public pages is used. The actor collects profiles and Spotlight. Stories and messages are excluded.

**Does it need a Snapchat login or API key?** The routes use logged-out public pages without an account, login or API key, verified on Apify direct and datacenter exits.

**Does it download Snapchat videos?** It returns public media URLs. It does not fetch media files. Links can expire or stop playing when Snapchat removes a clip.

**Why are there fewer rows than requested?** A cap is an upper bound. The available page may be short, contain empty cards, repeat an ID, or have only records already delivered. The summary names these outcomes. There is no fabricated error row to pad the count.

**Can I monitor new Spotlights?** Turn on `onlyNew` and reuse the same `monitorKey` across runs. Keep it off to receive updated counts for videos you already know. When Snapchat's selected public records were all delivered earlier, the run succeeds with `NO_NEW`, names the sources and charges only the $0.001 run start. An origin-proven empty page also succeeds with `PROVEN_EMPTY`. Missing accounts are named alongside proven quiet sources; an entirely missing list or unresolved work still fails.

**What is excluded?** No emails or phone numbers are extracted, no comments or transcripts are collected, and no login-only data is requested.

For other public video sources, see [Bilibili Scraper](https://apify.com/tagadanar/bilibili-scraper) and [YouTube Channel Scraper](https://apify.com/tagadanar/youtube-channel-scraper).

Snapchat profile scraper, Snapchat Spotlight scraper, public Snapchat analytics, Snapchat hashtag videos, creator monitoring.

# Changelog

This Actor's version history is a separate document: https://apify.com/tagadanar/snapchat-scraper/changelog.md

# Actor input Schema

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

Public Snapchat usernames, /add/username or /@username links. Combined with the sources below. A /@username/spotlight link means that profile's available Spotlight window.

## `spotlightUrls` (type: `array`):

Individual /spotlight/id or /@username/spotlight/id URLs. Each returns just that video, even when Profile snapshots is selected. App share links are unsupported.

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

Hashtags such as #funny, funny, or https://www.snapchat.com/tag/funny. Returns videos from the first public hashtag page.

## `resultType` (type: `string`):

Choose the records returned for usernames. Explicit video and hashtag sources always return Spotlight rows.

## `maxResults` (type: `integer`):

Total delivered row cap across all sources, processed in order: profiles, individual videos, then hashtags.

## `maxSpotlightsPerSource` (type: `integer`):

Keeps up to this many videos from each available public page. A higher limit does not unlock older pages. The total row cap still applies.

## `onlyNew` (type: `boolean`):

Skip profile and video IDs already delivered under the same monitoring key. Leave off to receive updated engagement and subscriber snapshots. A proven quiet run succeeds with NO_NEW and charges only the run start.

## `monitorKey` (type: `string`):

Only-new history namespace for this Apify account. Use a different name for independent lists. Letters, digits, underscores and hyphens only. Keep schedules sharing a name from overlapping.

## Actor input object example

```json
{
  "usernames": [
    "fcbarcelona"
  ],
  "resultType": "both",
  "maxResults": 10,
  "maxSpotlightsPerSource": 30,
  "onlyNew": false,
  "monitorKey": "default"
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# 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": [
        "fcbarcelona"
    ],
    "maxResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("tagadanar/snapchat-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": ["fcbarcelona"],
    "maxResults": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("tagadanar/snapchat-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": [
    "fcbarcelona"
  ],
  "maxResults": 10
}' |
apify call tagadanar/snapchat-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tagadanar/snapchat-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/eiaR6TpHnYfh7krRv/builds/FeS89hSyZ4orvYelL/openapi.json
