Snapchat Spotlight Video Link & Caption Downloader
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.
Input schema
Input fields, types, required flags, descriptions, defaults, and prefills come from the published definition. Prefill examples are distinct from defaults.
| Field | Type | Required | Description |
|---|---|---|---|
spotlightUrls | array | required | 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 | boolean | optional | Parse WebVTT transcript if available (adds transcript[] array) |
includeAiMetadata | boolean | optional | Include LLM-generated title, description, keywords, context cards |
Show all input fields
| Field | Type | Required | Description |
|---|---|---|---|
spotlightUrls | array | required | 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 | boolean | optional | Parse WebVTT transcript if available (adds transcript[] array) |
includeAiMetadata | boolean | optional | Include LLM-generated title, description, keywords, context cards |
includeComments | boolean | optional | Decode and include comment threads from the page |
includeRelatedStories | boolean | optional | Include up to 24 related Spotlight stories from the feed |
proxyConfiguration | object | optional | Optional proxy settings. Snapchat public Spotlight pages work without a proxy in most regions. |
Download the published input schema
View complete JSON
{
"description": "Download video metadata and direct CDN URLs for Snapchat Spotlight posts.",
"properties": {
"includeAiMetadata": {
"default": true,
"description": "Include LLM-generated title, description, keywords, context cards",
"title": "Include AI Metadata",
"type": "boolean"
},
"includeComments": {
"default": false,
"description": "Decode and include comment threads from the page",
"title": "Include Comment Threads",
"type": "boolean"
},
"includeRelatedStories": {
"default": false,
"description": "Include up to 24 related Spotlight stories from the feed",
"title": "Include Related Stories",
"type": "boolean"
},
"includeTranscript": {
"default": true,
"description": "Parse WebVTT transcript if available (adds transcript[] array)",
"title": "Include Video Transcript",
"type": "boolean"
},
"proxyConfiguration": {
"description": "Optional proxy settings. Snapchat public Spotlight pages work without a proxy in most regions.",
"editor": "proxy",
"nullable": true,
"sectionCaption": "Proxy",
"title": "Proxy Configuration",
"type": "object"
},
"spotlightUrls": {
"description": "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/...).",
"editor": "stringList",
"items": {
"type": "string"
},
"minItems": 1,
"prefill": [
"https://www.snapchat.com/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYaXFxdmVobmp6AZ499vl-AZ499rsXAAAAAQ"
],
"title": "Spotlight URLs",
"type": "array"
}
},
"required": [
"spotlightUrls"
],
"schemaVersion": 1,
"title": "Snapchat Spotlight Video Downloader",
"type": "object"
}
Output schema
Published result links and storage locations. This schema is not an exhaustive contract for every field in a dataset record.
| Field | Type | Required | Description |
|---|---|---|---|
results | string | optional | Dataset containing scraped Spotlight video records |
Download the published output schema
View complete JSON
{
"actorOutputSchemaVersion": 1,
"description": "One record per Snapchat Spotlight link, with its direct video URL, caption, creator info, engagement counts and optional AI metadata, transcript and comments.",
"fields": {
"attachmentUrl": {
"description": "Attachment URL linked from the snap (sparse)",
"type": "string"
},
"audioTranscriptionObjectUrl": {
"description": "URL to audio transcription object (when available)",
"type": "string"
},
"caption": {
"description": "Video caption / description text",
"type": "string"
},
"commentCount": {
"description": "Total comment count (from engagementStats)",
"type": "integer"
},
"contextCards": {
"description": "Context card objects linked to the snap (when include_ai_metadata=true)",
"type": "array"
},
"creatorDisplayName": {
"description": "Creator display name",
"type": "string"
},
"creatorFollowerCount": {
"description": "Creator follower count",
"type": "integer"
},
"creatorUsername": {
"description": "Creator Snapchat username",
"type": "string"
},
"detectedLanguages": {
"description": "Detected language scores [{languageCode, score}] from cuSignals (when include_ai_metadata=true)",
"type": "array"
},
"durationSeconds": {
"description": "Video duration in seconds",
"type": "number"
},
"error": {
"description": "Error message if scraping failed for this URL",
"type": "string"
},
"hasAttachment": {
"description": "Whether this snap has an attachment",
"type": "boolean"
},
"hashtags": {
"description": "Hashtags associated with the snap (when include_ai_metadata=true)",
"type": "array"
},
"height": {
"description": "Video height in pixels",
"type": "integer"
},
"inputUrl": {
"description": "Original input URL supplied by the user",
"type": "string"
},
"intervalStartTimeMs": {
"description": "Snap interval start time in milliseconds (when present)",
"type": "integer"
},
"isAttributed": {
"description": "Whether the snap is attributed to a creator",
"type": "boolean"
},
"isSponsored": {
"description": "Whether this snap is sponsored content",
"type": "boolean"
},
"lat": {
"description": "Snap latitude (when geotagged)",
"type": "number"
},
"likeCount": {
"description": "Like/boost count (from engagementStats)",
"type": "integer"
},
"llmDescription": {
"description": "AI-generated description (when include_ai_metadata=true)",
"type": "string"
},
"llmKeywords": {
"description": "AI-generated keywords (when include_ai_metadata=true)",
"type": "array"
},
"llmTitle": {
"description": "AI-generated title (when include_ai_metadata=true)",
"type": "string"
},
"lng": {
"description": "Snap longitude (when geotagged)",
"type": "number"
},
"mediaPreviewUrl": {
"description": "Media preview image URL",
"type": "string"
},
"name": {
"description": "Video name from metadata (when available)",
"type": "string"
},
"overlayUrl": {
"description": "Overlay image URL (when present)",
"type": "string"
},
"profileUrl": {
"description": "Creator Snapchat profile URL",
"type": "string"
},
"recommendCount": {
"description": "Recommend count (from engagementStats)",
"type": "integer"
},
"relatedStories": {
"description": "Related spotlight story summaries with thumbnailUrl, storyPageUrl, durationSeconds, creatorUsername",
"type": "array"
},
"scrapedAt": {
"description": "ISO 8601 UTC timestamp when this record was scraped",
"type": "string"
},
"shareCount": {
"description": "Total share count",
"type": "integer"
},
"snapId": {
"description": "Spotlight snap ID",
"type": "string"
},
"snapSubtitles": {
"description": "Subtitle/caption data embedded in the snap (when present)",
"type": "array"
},
"snapTitle": {
"description": "Snap title (when present)",
"type": "string"
},
"textMetadataKeywords": {
"description": "Text metadata keywords (when include_ai_metadata=true)",
"type": "array"
},
"thumbnailUrl": {
"description": "Thumbnail image URL",
"type": "string"
},
"transcript": {
"description": "Parsed WebVTT transcript segments [{startTime, endTime, text}] (when includeTranscript=true)",
"type": "array"
},
"transcriptUrl": {
"description": "URL to original WebVTT transcript file (when transcript is available)",
"type": "string"
},
"uploadedAt": {
"description": "Upload timestamp in ISO 8601 UTC",
"type": "string"
},
"videoUrl": {
"description": "Direct CDN video URL (may expire)",
"type": "string"
},
"viewCount": {
"description": "Total view count (from engagementStats or videoMetadata)",
"type": "integer"
},
"width": {
"description": "Video width in pixels",
"type": "integer"
}
},
"properties": {
"results": {
"description": "Dataset containing scraped Spotlight video records",
"template": "{{links.apiDefaultDatasetUrl}}/items",
"type": "string"
}
},
"title": "Snapchat Spotlight Video Link & Caption Downloader Output",
"type": "object"
}
Dataset schema
Published dataset views and any declared field definitions. A view can select only a subset of the returned record fields.
Download the published dataset schema
View complete JSON
{
"actorSpecification": 1,
"title": "Snapchat Spotlight Videos",
"views": {
"detailed": {
"display": {
"component": "table",
"properties": {
"caption": {
"format": "text",
"label": "Caption"
},
"commentCount": {
"format": "number",
"label": "Comments"
},
"creatorDisplayName": {
"format": "text",
"label": "Display Name"
},
"creatorFollowerCount": {
"format": "number",
"label": "Followers"
},
"durationSeconds": {
"format": "number",
"label": "Duration (s)"
},
"error": {
"format": "text",
"label": "Error"
},
"hashtags": {
"format": "text",
"label": "Hashtags"
},
"height": {
"format": "number",
"label": "Height"
},
"inputUrl": {
"format": "link",
"label": "Input URL"
},
"isAttributed": {
"format": "text",
"label": "Is Attributed"
},
"keywords": {
"format": "text",
"label": "Keywords"
},
"likeCount": {
"format": "number",
"label": "Likes"
},
"llmDescription": {
"format": "text",
"label": "AI Description"
},
"llmTitle": {
"format": "text",
"label": "AI Title"
},
"name": {
"format": "text",
"label": "Video Name"
},
"profileUrl": {
"format": "link",
"label": "Profile"
},
"recommendCount": {
"format": "number",
"label": "Recommends"
},
"restricted": {
"format": "text",
"label": "Restricted"
},
"scrapedAt": {
"format": "text",
"label": "Scraped At"
},
"shareCount": {
"format": "number",
"label": "Shares"
},
"snapId": {
"format": "text",
"label": "Snap ID"
},
"thumbnailUrl": {
"format": "link",
"label": "Thumbnail"
},
"uploadedAt": {
"format": "text",
"label": "Uploaded At"
},
"username": {
"format": "text",
"label": "Username"
},
"videoUrl": {
"format": "link",
"label": "Video URL"
},
"viewCount": {
"format": "number",
"label": "Views"
},
"width": {
"format": "number",
"label": "Width"
}
}
},
"title": "Detailed View",
"transformation": {
"fields": [
"snapId",
"inputUrl",
"username",
"creatorDisplayName",
"creatorFollowerCount",
"profileUrl",
"caption",
"name",
"width",
"height",
"viewCount",
"shareCount",
"commentCount",
"likeCount",
"recommendCount",
"durationSeconds",
"uploadedAt",
"videoUrl",
"thumbnailUrl",
"llmTitle",
"llmDescription",
"hashtags",
"keywords",
"restricted",
"isAttributed",
"scrapedAt",
"error"
]
}
},
"overview": {
"display": {
"component": "table",
"properties": {
"caption": {
"format": "text",
"label": "Caption"
},
"commentCount": {
"format": "number",
"label": "Comments"
},
"durationSeconds": {
"format": "number",
"label": "Duration (s)"
},
"likeCount": {
"format": "number",
"label": "Likes"
},
"shareCount": {
"format": "number",
"label": "Shares"
},
"snapId": {
"format": "text",
"label": "Snap ID"
},
"thumbnailUrl": {
"format": "link",
"label": "Thumbnail"
},
"username": {
"format": "text",
"label": "Creator"
},
"videoUrl": {
"format": "link",
"label": "Video URL"
},
"viewCount": {
"format": "number",
"label": "Views"
}
}
},
"title": "Video Overview",
"transformation": {
"fields": [
"snapId",
"username",
"caption",
"viewCount",
"shareCount",
"commentCount",
"likeCount",
"durationSeconds",
"videoUrl",
"thumbnailUrl"
]
}
}
}
}
Key-value schema
Published key-value store definitions, when provided by this build.
This definition is not present in the default published build. See the published README for available documentation.
Published README
Read the full published documentation
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.comlinks) 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 |
viewCountis 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
{
"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
{
"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.
Python quickstart
Use a schema-derived input and the Python standard library to start a run. An Apify account and token are required for execution.
Source build WF5xhC9dsQb9pBA8U. Documentation is regenerated from the default published build; private drafts are not included.