# Snapchat Video Downloader Scraper (`automation-lab/snapchat-public-video-downloader`) Actor

Download public Snapchat Spotlight MP4 files and export creator, upload date, views, thumbnail, and media metadata without login.

- **URL**: https://apify.com/automation-lab/snapchat-public-video-downloader.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Videos, Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event + usage

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

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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 Video Downloader

Download MP4 files and structured metadata from anonymously reachable public Snapchat Spotlight videos.
This **Snapchat video downloader** accepts supplied Spotlight or `/t/` share URLs, resolves the exact requested snap, and returns a fresh direct media URL, thumbnail, creator, upload date, visible engagement, dimensions, and duration.
It can also copy each MP4 into the run's Apify key-value store for durable access from your own workflows.

The Actor does not need a Snapchat account, cookies, or an API key.
It does not access private, friends-only, expired, removed, login-only, or DRM-protected content.

### What can the Snapchat Video Downloader do?

- Resolve public `snapchat.com/spotlight/...` URLs to their direct video assets.
- Follow public `snapchat.com/t/...` share links to the underlying video.
- Save original MP4 files in the run's default key-value store.
- Run in metadata-only mode to avoid copying video bytes.
- Export titles, descriptions, dates, views, creator fields, thumbnails, and media details.
- Process up to 100 supplied URLs in one bounded run.
- Deduplicate repeated URLs by stable Snapchat snap ID.
- Continue after an individual private, removed, oversized, or invalid URL.
- Fail clearly when no supplied URL produces a useful public video.

This is a supplied-URL downloader, not a keyword search, profile crawler, hashtag scraper, or private-content tool.

### Who is this Actor for?

**Content owners and creators** can archive their own public Spotlight uploads with source metadata.

**Social media teams** can preserve authorized campaign clips and attach engagement context to an asset library.

**Researchers and journalists** can create reproducible snapshots of public videos they are permitted to retain.

**Developers and data engineers** can turn a list of Snapchat links into typed JSON plus MP4 records for downstream processing.

**Compliance and brand teams** can schedule bounded archives of specifically approved public URLs.

Only download or retain media when you have the right to do so.

### Why use this Snapchat downloader?

A browser download often gives you only a file.
This Actor returns the file together with a structured record that can be sent to a spreadsheet, database, webhook, or automation.

The implementation uses Snapchat's logged-out server-rendered data for the exact supplied snap.
It does not launch a browser, collect unrelated feed items, or require account credentials.
That keeps runs lightweight while preserving the useful creator, date, engagement, thumbnail, and media fields exposed with the public page.

File saving is optional.
Use `saveVideos: true` for durable run storage, or `saveVideos: false` when a fresh CDN URL and metadata are enough.

### Supported Snapchat URLs

Supported inputs:

```text
https://www.snapchat.com/spotlight/<snap-id>
https://www.snapchat.com/@creator/spotlight/<snap-id>
https://www.snapchat.com/t/<share-id>
```

A short `/t/` URL must resolve anonymously to a public video.
Canonical creator Spotlight URLs are accepted after redirects.

Not supported:

- profile-only URLs such as `https://www.snapchat.com/@username`;
- the generic Spotlight feed without a snap ID;
- private or friends-only snaps;
- expired public Stories;
- login-gated content;
- deleted or non-video posts;
- arbitrary direct CDN URLs;
- Snapchat search, Discover, planets, login, chat, or Memories.

### Extracted Snapchat video data

| Field | Meaning |
| --- | --- |
| `snapId` | Stable snap ID for the requested video |
| `url` | Resolved canonical public Snapchat URL |
| `title` | Public or Snapchat-provided generated title, when available |
| `description` | Public description, when available |
| `uploadDate` | ISO 8601 upload timestamp |
| `viewCount` | Visible views, or `null` |
| `shareCount` | Visible shares, or `null` |
| `commentCount` | Visible comments, or `null` |
| `creatorName` | Public creator display name |
| `creatorUsername` | Public Snapchat username |
| `creatorUrl` | Public creator profile URL |
| `thumbnailUrl` | Fresh Snapchat CDN thumbnail URL |
| `mediaUrl` | Fresh direct Snapchat CDN video URL |
| `durationMs` | Video duration in milliseconds |
| `width`, `height` | Video dimensions in pixels |
| `videoFileKey` | Key-value store record key when saving is enabled |
| `videoFileUrl` | Apify API URL for the saved MP4 |
| `videoSizeBytes` | Size of the copied MP4 |
| `scrapedAt` | Time when the record was produced |

Public pages do not expose every counter or text field for every video.
Fields that Snapchat omits are returned as `null` rather than guessed.

### How to download a public Snapchat video

1. Open an anonymously reachable public Spotlight video.
2. Copy its Spotlight URL or public Snapchat share link.
3. Open this Actor in Apify Console.
4. Add the URL under **Spotlight or public share URLs**.
5. Leave **Save MP4 files** enabled if you need a stored copy.
6. Set a suitable per-file size limit.
7. Click **Start**.
8. Open the **Downloaded Snapchat videos** dataset view.
9. Use **Saved MP4** or open the run's key-value store to retrieve the file.

The exact prefilled Spotlight URL is a real logged-out public input and is suitable for a first run.
Public content can later be removed by its owner or Snapchat.

### Input parameters

| Input | Type | Default | Description |
| --- | --- | --- | --- |
| `startUrls` | array | required | Public Spotlight or `/t/` share URLs; 1–100 entries |
| `maxItems` | integer | `20` | Maximum unique successful records; 1–100 |
| `saveVideos` | boolean | `true` | Copy MP4 files into the default key-value store |
| `maxVideoSizeMb` | integer | `100` | Maximum accepted size for each saved MP4; 1–500 MB |

Example input:

```json
{
  "startUrls": [
    {
      "url": "https://www.snapchat.com/spotlight/W7_EXAMPLE_PUBLIC_SNAP_ID_123456789"
    }
  ],
  "maxItems": 1,
  "saveVideos": true,
  "maxVideoSizeMb": 100
}
```

Use the real prefilled URL in Console instead of the anonymized documentation ID above.

### Output example

The default dataset contains one record per successfully resolved unique video:

```json
{
  "snapId": "W7_EXAMPLE_PUBLIC_SNAP_ID_123456789",
  "url": "https://www.snapchat.com/@samplecreator/spotlight/W7_EXAMPLE_PUBLIC_SNAP_ID_123456789",
  "title": "A quick outdoor video",
  "description": "A short example clip recorded outdoors.",
  "uploadDate": "2025-01-15T12:00:00.000Z",
  "viewCount": 12500,
  "shareCount": 240,
  "commentCount": 18,
  "creatorName": "Sample Creator",
  "creatorUsername": "samplecreator",
  "creatorUrl": "https://www.snapchat.com/@samplecreator",
  "thumbnailUrl": "https://cf-st.sc-cdn.net/example-thumbnail",
  "mediaUrl": "https://cf-st.sc-cdn.net/example-video",
  "durationMs": 12790,
  "width": 540,
  "height": 960,
  "videoFileKey": "video-W7_EXAMPLE_PUBLIC_SNAP_ID_123456789.mp4",
  "videoFileUrl": "https://api.apify.com/v2/key-value-stores/abc123/records/video-W7_EXAMPLE_PUBLIC_SNAP_ID_123456789.mp4",
  "videoSizeBytes": 1291851,
  "scrapedAt": "2025-01-15T12:01:00.000Z"
}
```

The saved-file API URL may require the run owner's Apify token because run storage is private by default.
The direct `mediaUrl` is controlled by Snapchat and may expire or change.

### Where are downloaded MP4 files stored?

With `saveVideos: true`, the Actor writes each successful MP4 to the default key-value store.
Keys use this pattern:

```text
video-<snap-id>.mp4
```

The dataset record points to the same key through `videoFileKey` and `videoFileUrl`.
Download it from Console, the Apify API, or an authenticated integration.

With `saveVideos: false`, the three saved-file fields are `null` and `mediaUrl` still contains the fresh Snapchat CDN link returned during the run.
This mode uses less transfer and storage.

### How much does it cost to download Snapchat videos?

This Actor uses pay-per-event pricing with one start event and one `item` event for each successful video record.
Invalid, duplicate, private, removed, oversized, and failed URLs are not item events.
There is no separate charge event for the MP4 file, metadata fields, or thumbnail.

The start event is **$0.015**. Per-video prices decrease across the six Apify usage tiers:

| Tier | Price per successful video |
| --- | ---: |
| FREE | $0.0021436 |
| BRONZE | $0.001864 |
| SILVER | $0.0014539 |
| GOLD | $0.0011184 |
| PLATINUM | $0.0007456 |
| DIAMOND | $0.00052192 |

For example, at the BRONZE tier the Actor costs about **$0.016864 for 1 video**, **$0.03364 for 10 videos**, or **$0.2014 for 100 videos**.
Calculate any run as:

```text
run price = $0.015 start event + successful videos × your active item tier
```

Your Apify plan tier determines the per-video rate.
Large files can increase platform usage charged according to Apify's normal storage and transfer rules; use the input's file-size and item-count limits to keep archives bounded.
Metadata-only mode avoids MP4 copy transfer but uses the same successful-item event because it produces the same typed video record.

### Batch downloads and scheduled archives

For a bounded batch, supply several approved public URLs and set `maxItems` to the maximum number you want stored.
The Actor processes each URL independently and keeps useful records when another URL fails.

For scheduled authorized archiving:

1. Maintain the approved URL list in your task input.
2. Schedule the task at the frequency appropriate for your use case.
3. Export each run's dataset and key-value store before retention expires.
4. Deduplicate records in your destination using `snapId`.
5. Treat a missing post as removed, private, expired, or temporarily unavailable; do not infer why.

The Actor does not discover new videos automatically and does not compare runs for you.
Use an automation or database keyed by `snapId` for change tracking.

### Integrations and export workflows

Send records to:

- Google Sheets for an editorial archive index;
- Airtable or Notion for an approved asset library;
- Amazon S3, Google Cloud Storage, or another object store for long retention;
- a webhook for media processing or moderation;
- a database keyed by `snapId` for recurring authorized archives;
- another Actor for transcription, classification, or analysis.

Always pass authenticated storage URLs or copy the file bytes when the downstream system cannot access private Apify run storage.

### Run with the Apify API

Replace `YOUR_APIFY_TOKEN` and use real authorized Snapchat URLs.

#### cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~snapchat-public-video-downloader/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "startUrls": [{"url": "https://www.snapchat.com/spotlight/REAL_SNAP_ID"}],
    "maxItems": 1,
    "saveVideos": true,
    "maxVideoSizeMb": 100
  }'
```

#### JavaScript

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/snapchat-public-video-downloader').call({
  startUrls: [{ url: 'https://www.snapchat.com/spotlight/REAL_SNAP_ID' }],
  maxItems: 1,
  saveVideos: true,
  maxVideoSizeMb: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("automation-lab/snapchat-public-video-downloader").call(run_input={
    "startUrls": [{"url": "https://www.snapchat.com/spotlight/REAL_SNAP_ID"}],
    "maxItems": 1,
    "saveVideos": True,
    "maxVideoSizeMb": 100,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
```

Do not put tokens in source control.
Use environment variables or your platform's secret manager.

### Use with Apify MCP

Add this Actor to Claude Code:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/snapchat-public-video-downloader"
```

#### Claude Desktop setup

Add the following server configuration to Claude Desktop:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/snapchat-public-video-downloader"
    }
  }
}
```

#### Cursor setup

Add the same JSON server entry in **Cursor Settings → MCP**.

#### VS Code setup

Add the same server URL through your VS Code MCP extension or workspace MCP configuration.

Example prompts:

- "Download this public Snapchat Spotlight video and return the saved MP4 link plus upload date and views."
- "Resolve these approved Spotlight URLs in metadata-only mode and create a CSV-ready dataset."
- "Archive these three public campaign Spotlight videos with a 75 MB per-file limit."

Review tool inputs before running them and provide only URLs you are authorized to process.

### Reliability, limits, and failure behavior

Snapchat controls the source pages and CDN URLs.
A public video can be removed, made private, geo-restricted, or changed without notice.

The Actor:

- retries bounded transient page and media failures;
- validates final redirects remain on Snapchat;
- allows video downloads only from Snapchat CDN hosts;
- validates media response content types;
- stops reading a file when it exceeds the configured limit;
- skips failed URLs while preserving successful records;
- emits no item event for a failed URL;
- fails the run when every supplied URL fails;
- returns `null` for omitted metadata rather than inventing values.

The Actor does not guarantee that temporary CDN links remain valid after the run.
Enable MP4 saving when you need a run-owned copy.

### Troubleshooting

#### Why did a URL produce no record?

Confirm that it opens in a logged-out browser and points to one specific public video.
Profile pages, the generic Spotlight feed, expired Stories, private snaps, removed videos, and login-only content are unsupported.
Check the run log for the per-URL reason.

#### Why is the saved MP4 link unauthorized?

Default run storage is private.
Open the record while authenticated in Apify Console, include your Apify token in an authorized API request, or copy the file to your own storage.
Do not expose a long-lived token in a public URL.

#### Why is `videoFileUrl` null?

`saveVideos` was disabled.
Use `mediaUrl` during its validity window or rerun with file saving enabled.

#### Why was an oversized video skipped?

The MP4 exceeded `maxVideoSizeMb`.
Increase the limit only when you expect and can afford the extra transfer and storage.
The hard input maximum is 500 MB per video.

#### Why are views or descriptions null?

Snapchat does not expose every field for every post.
The Actor preserves missing values as null.

### Responsible and legal use

Use this Actor only for public content you are legally allowed to access, download, retain, and process.
Respect copyright, publicity rights, privacy, contractual restrictions, platform terms, and applicable law.
Do not use it to bypass access controls, impersonate users, collect private content, or redistribute media without permission.

Minimize retained personal data.
Choose an appropriate storage retention period, restrict access to downloaded files, and honor valid deletion requests.
The Actor is a technical tool; using it does not grant rights to third-party content.

### Related Snapchat Actors

- [Snapchat Scraper](https://apify.com/automation-lab/snapchat-scraper) — collect public profile metadata when your job starts from usernames rather than supplied video URLs.
- [Snapchat Discover Scraper](https://apify.com/automation-lab/snapchat-discover-scraper) — extract supported public Discover data for editorial monitoring.
- [Snapchat Ads Library Scraper](https://apify.com/automation-lab/snapchat-ads-library-scraper) — work with Snapchat's public political ads transparency archive.

These Actors serve different source surfaces.
They do not replace the supplied-URL MP4 download workflow here.

### FAQ

#### Does this Actor require a Snapchat login?

No.
It processes only content available to a logged-out visitor.

#### Can it download private snaps or Memories?

No.
Private, friends-only, account-only, and Memories content is outside scope.

#### Can it search Spotlight by keyword or username?

No.
Supply exact public video URLs.
Use a related profile or discovery Actor only when that separate product supports your source and workflow.

#### Does it remove watermarks or modify videos?

No.
It copies the source video response as returned by Snapchat and does not re-encode or alter it.

#### Are duplicate URLs charged twice?

No.
The Actor deduplicates successful records by snap ID within a run.

#### Are failed URLs charged as items?

No.
Only successfully resolved records produce the `item` event.
The one-time start event still applies to the run.

#### Can I keep files permanently?

Apify storage retention depends on your plan and storage settings.
Copy files to your own durable storage when you need longer retention.

#### Is metadata-only mode supported?

Yes.
Set `saveVideos` to `false` to receive fresh media links and metadata without copying MP4 bytes into run storage.

# Actor input Schema

## `startUrls` (type: `array`):

One or more anonymously reachable https://www.snapchat.com/spotlight/... or https://www.snapchat.com/t/... video URLs.

## `maxItems` (type: `integer`):

Maximum number of unique successful video records to save from the supplied URLs.

## `saveVideos` (type: `boolean`):

When enabled, each MP4 is downloaded to the default key-value store and the dataset includes its record key and API URL.

## `maxVideoSizeMb` (type: `integer`):

Safety limit for each saved MP4. Videos above this size are skipped. This does not affect metadata-only runs.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.snapchat.com/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYY2Zyc3RyaWZhAZ6UgjS7AZ6UgjSUAAAAAQ"
    }
  ],
  "maxItems": 3,
  "saveVideos": true,
  "maxVideoSizeMb": 100
}
```

# Actor output Schema

## `overview` (type: `string`):

Open the overview table with post metadata, engagement, direct media URLs, and saved MP4 links.

## `videoFiles` (type: `string`):

Open the run's key-value store containing MP4 files when Save MP4 files is enabled.

# 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 = {
    "startUrls": [
        {
            "url": "https://www.snapchat.com/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYY2Zyc3RyaWZhAZ6UgjS7AZ6UgjSUAAAAAQ"
        }
    ],
    "maxItems": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/snapchat-public-video-downloader").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 = {
    "startUrls": [{ "url": "https://www.snapchat.com/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYY2Zyc3RyaWZhAZ6UgjS7AZ6UgjSUAAAAAQ" }],
    "maxItems": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/snapchat-public-video-downloader").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 '{
  "startUrls": [
    {
      "url": "https://www.snapchat.com/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYY2Zyc3RyaWZhAZ6UgjS7AZ6UgjSUAAAAAQ"
    }
  ],
  "maxItems": 3
}' |
apify call automation-lab/snapchat-public-video-downloader --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/snapchat-public-video-downloader"
        }
    }
}

```

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/LIdfZyy13VzOzEUNx/builds/Hq8cy2WKF3DBQyxjL/openapi.json
