# Snapchat Spotlight Video Link & Caption Downloader (`nimbryxo-studio/snapchat-spotlight-video-link-and-caption`) Actor

Give this actor one or more Snapchat Spotlight links and get back a direct video link, thumbnail, caption, creator info and engagement counts per video, with optional AI-generated metadata, transcript and comments.

- **URL**: https://apify.com/nimbryxo-studio/snapchat-spotlight-video-link-and-caption.md
- **Developed by:** [Nimbryxo-studio](https://apify.com/nimbryxo-studio) (community)
- **Categories:** Social media, Videos, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 1,000 results

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/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 Spotlight Video Link & Caption Downloader

A Snapchat Spotlight link on its own doesn't give you a file you can save or embed. This actor turns one or more of those links into a direct video URL alongside thumbnail, caption, creator info, and engagement counts — with AI-generated descriptions, a WebVTT transcript, comment threads, and related videos available on request. No login or cookies required.

### What this actor does

- Resolves a Spotlight link (including short `t.snapchat.com` links) into a direct, downloadable video URL
- Captures caption, creator info, and full engagement stats — shares, likes, comments, recommendations
- Adds AI-generated title, description, keywords and detected languages, on request
- Parses the video's WebVTT transcript into timestamped segments, on request
- Can also pull comment threads and up to 24 related Spotlight stories from the same feed
- Leaves a field out of the record when Snapchat didn't provide a value for it, rather than sending it empty

### Input

| Field | Type | Required | Default | Description |
|-------|------|----------|---------|-------------|
| `spotlightUrls` | string\[] | Yes | — | One or more Snapchat Spotlight URLs to process |
| `includeTranscript` | boolean | No | `true` | Parse WebVTT transcript into timestamped segments |
| `includeAiMetadata` | boolean | No | `true` | Include LLM title, description, keywords, context cards, detected languages |
| `includeComments` | boolean | No | `false` | Decode comment threads from the page |
| `includeRelatedStories` | boolean | No | `false` | Include up to 24 related Spotlight stories |
| `proxyConfiguration` | object | No | — | Optional proxy settings |

#### Supported URL Formats

```
https://www.snapchat.com/spotlight/{id}
https://www.snapchat.com/@{username}/spotlight/{id}
https://t.snapchat.com/{id}
```

Short links (`t.snapchat.com`) are resolved automatically before scraping.

### Output Fields

#### Core Fields (always present on success)

| Field | Type | Description |
|-------|------|-------------|
| `snapId` | string | Unique Spotlight snap identifier |
| `inputUrl` | string | The URL you provided as input |
| `videoUrl` | string | Direct CDN video URL (expires — download promptly) |
| `thumbnailUrl` | string | Thumbnail image URL |
| `caption` | string | Caption or description text on the snap |
| `creatorUsername` | string | Creator's Snapchat username |
| `profileUrl` | string | Full profile URL (`snapchat.com/@username`) |
| `creatorDisplayName` | string | Creator's display name |
| `durationSeconds` | number | Video duration in seconds |
| `uploadedAt` | string | ISO 8601 upload timestamp |
| `scrapedAt` | string | ISO 8601 timestamp of when this record was collected |
| `shareCount` | integer | Number of times the video was shared |
| `commentCount` | integer | Number of comments |
| `likeCount` | integer | Number of likes (boosts) |
| `recommendCount` | integer | Number of recommendations |
| `mediaPreviewUrl` | string | Preview/thumbnail variant URL |
| `width` | integer | Video width in pixels (video snaps only) |
| `height` | integer | Video height in pixels (video snaps only) |
| `restricted` | boolean | Whether the content is age-restricted |
| `isAttributed` | boolean | Whether the snap is attributed to Snapchat's own feed |

> `viewCount` is omitted for very recent videos — Snapchat returns -1 as a sentinel value for posts still accumulating views.

#### AI Metadata (when `includeAiMetadata: true`)

| Field | Type | Description |
|-------|------|-------------|
| `llmTitle` | string | LLM-generated title for the video |
| `llmDescription` | string | LLM-generated description of the video content |
| `llmKeywords` | string\[] | LLM-generated keyword tags |
| `textMetadataKeywords` | string\[] | Text-based keyword tags extracted from metadata |
| `hashtags` | string\[] | Hashtags associated with the snap |
| `contextCards` | object\[] | Context cards shown on the snap (sound info, creator card, etc.) |
| `detectedLanguages` | object\[] | Detected languages with confidence scores (`languageCode`, `score`) |

#### Transcript (when `includeTranscript: true`)

| Field | Type | Description |
|-------|------|-------------|
| `transcript` | object\[] | Array of `{startTime, endTime, text}` WebVTT segments |
| `transcriptUrl` | string | URL of the raw WebVTT transcript file |

#### Comments (when `includeComments: true`)

Each item in `comments[]`:

| Field | Type | Description |
|-------|------|-------------|
| `commentId` | string | Unique comment identifier |
| `snapId` | string | ID of the snap this comment belongs to |
| `replyText` | string | Comment text |
| `reactionCounts` | object\[] | Array of `{reactTypeId, count}` reaction tallies |
| `commenterDisplayName` | string | Commenter's display name |
| `approvalState` | any | Moderation approval state |
| `postedAt` | string | ISO 8601 timestamp when the comment was posted |

#### Related Stories (when `includeRelatedStories: true`)

Each item in `relatedStories[]`:

| Field | Type | Description |
|-------|------|-------------|
| `thumbnailUrl` | string | Thumbnail URL of the related story |
| `storyPageUrl` | string | Full Spotlight URL of the related story |
| `durationSeconds` | number | Duration of the related story in seconds |
| `creatorUsername` | string | Creator's username |

#### Error Records

If a URL fails, an error record is saved instead of a video record:

| Field | Type | Description |
|-------|------|-------------|
| `inputUrl` | string | The URL that failed |
| `snapId` | string | Snap ID if it could be extracted |
| `error` | string | Human-readable error message |
| `scrapedAt` | string | ISO 8601 timestamp |

### Example Input

```json
{
  "spotlightUrls": [
    "https://www.snapchat.com/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYZmRwYmVqcm5wAZ8Kxg_vAZ8Kxgn9AAAAAQ",
    "https://www.snapchat.com/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYZG5iaHJuY2phAZ8KF10GAZ8KETc1AAAAAQ"
  ],
  "includeTranscript": true,
  "includeAiMetadata": true,
  "includeComments": false,
  "includeRelatedStories": false
}
```

### Example Output

```json
{
  "snapId": "W7_EDlXWTBiXAEEniNoMPwAAYZG5iaHJuY2phAZ8KF10GAZ8KETc1AAAAAQ",
  "inputUrl": "https://www.snapchat.com/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYZG5iaHJuY2phAZ8KF10GAZ8KETc1AAAAAQ",
  "videoUrl": "https://bolt-gcdn.sc-cdn.net/v/udlVbjK0wdjHbPx1FRph0.27.IRZXSOY?...",
  "thumbnailUrl": "https://bolt-gcdn.sc-cdn.net/v/udlVbjK0wdjHbPx1FRph0.256.IRZXSOY?...",
  "caption": "Another Spotlight Snap brought to you by Snapchat",
  "creatorUsername": "waqarzaka",
  "profileUrl": "https://www.snapchat.com/@waqarzaka",
  "creatorDisplayName": "Waqar Zaka",
  "durationSeconds": 130.23,
  "width": 540,
  "height": 960,
  "shareCount": 0,
  "likeCount": 3,
  "commentCount": 0,
  "recommendCount": 0,
  "uploadedAt": "2026-06-27T17:12:08.245000+00:00",
  "scrapedAt": "2026-06-28T06:43:34.588497+00:00",
  "isAttributed": true,
  "textMetadataKeywords": ["bitcoin", "hacker", "crypto", "cryptocurrency", "blockchain"],
  "contextCards": [
    {
      "contextType": 3,
      "title": "Waqar Zaka",
      "subtitle": "waqarzaka",
      "url": "https://www.snapchat.com/@waqarzaka",
      "thumbnailType": 0,
      "hasBadge": true,
      "id": "36d0088b-39d5-4765-a237-bb147a292272"
    }
  ],
  "detectedLanguages": [
    { "languageCode": "hi", "score": 0.910262405872345 }
  ]
}
```

### FAQ

**Does this require a Snapchat account or cookies?**
No. All data is extracted from public Snapchat Spotlight pages. No login, no cookies, and no proxy are required in most regions.

**Do video URLs expire?**
Yes. Snapchat CDN URLs include signed tokens that expire after a short period. Download the video as soon as the actor completes — do not store the URL and try to fetch it later.

**Why is `viewCount` missing from some records?**
Snapchat returns -1 as a sentinel for videos that are too new to have an accurate view count. The actor omits this field rather than storing a misleading -1.

**Are `width` and `height` always present?**
Only for video snaps. Some Spotlight posts are images or have incomplete metadata, in which case these fields are absent.

**Can I scrape a large batch of URLs at once?**
Yes. Provide all URLs in the `spotlightUrls` array. The actor processes them sequentially with a short delay between requests to stay respectful of rate limits.

**What is the `isAttributed` flag?**
When `true`, Snapchat itself attributed the snap to its own Discover/Spotlight feed rather than to a specific creator account.

**Can I get comments from all videos?**
Set `includeComments: true`. Comments are decoded from data embedded in the page, so availability depends on what Snapchat includes per snap.

**Is this affiliated with Snapchat?**
No. This is an independent data extraction tool and has no connection to Snap Inc.

# Actor input Schema

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

One or more Snapchat Spotlight URLs to download. Supports standard URLs (snapchat.com/spotlight/...), profile URLs (snapchat.com/@user/spotlight/...), and short links (t.snapchat.com/...).

## `includeTranscript` (type: `boolean`):

Parse WebVTT transcript if available (adds transcript\[] array)

## `includeAiMetadata` (type: `boolean`):

Include LLM-generated title, description, keywords, context cards

## `includeComments` (type: `boolean`):

Decode and include comment threads from the page

## `includeRelatedStories` (type: `boolean`):

Include up to 24 related Spotlight stories from the feed

## `proxyConfiguration` (type: `object`):

Optional proxy settings. Snapchat public Spotlight pages work without a proxy in most regions.

## Actor input object example

```json
{
  "spotlightUrls": [
    "https://www.snapchat.com/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYaXFxdmVobmp6AZ499vl-AZ499rsXAAAAAQ"
  ],
  "includeTranscript": true,
  "includeAiMetadata": true,
  "includeComments": false,
  "includeRelatedStories": false
}
```

# Actor output Schema

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

Dataset containing scraped Spotlight video records

# 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 = {
    "spotlightUrls": [
        "https://www.snapchat.com/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYaXFxdmVobmp6AZ499vl-AZ499rsXAAAAAQ"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("nimbryxo-studio/snapchat-spotlight-video-link-and-caption").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 = { "spotlightUrls": ["https://www.snapchat.com/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYaXFxdmVobmp6AZ499vl-AZ499rsXAAAAAQ"] }

# Run the Actor and wait for it to finish
run = client.actor("nimbryxo-studio/snapchat-spotlight-video-link-and-caption").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 '{
  "spotlightUrls": [
    "https://www.snapchat.com/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYaXFxdmVobmp6AZ499vl-AZ499rsXAAAAAQ"
  ]
}' |
apify call nimbryxo-studio/snapchat-spotlight-video-link-and-caption --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nimbryxo-studio/snapchat-spotlight-video-link-and-caption"
        }
    }
}
```

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/XgHgPRuRuydAmORvP/builds/WF5xhC9dsQb9pBA8U/openapi.json
