# Snapchat Creator Profile & Highlights Extractor (`vexaloom-labs/snapchat-creator-profile-and-highlights-extractor`) Actor

Turn Snapchat usernames into structured profile records with bio, subscriber count, verification status, story highlights, Spotlight videos, AR lenses, and related creators.

- **URL**: https://apify.com/vexaloom-labs/snapchat-creator-profile-and-highlights-extractor.md
- **Developed by:** [vexaloom-labs](https://apify.com/vexaloom-labs) (community)
- **Categories:** Social media, Videos, Lead generation
- **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 Creator Profile & Highlights Extractor

Paste a list of Snapchat usernames or profile links and receive one structured record per account: identity, bio and links, subscriber and verification signals, curated highlights, Spotlight videos with captions and engagement, active story snaps, lenses, contacts and the accounts Snapchat lists as related. No Snapchat login, cookies or API key is needed.

### What this actor does

- Normalises bare usernames, `@username`, `/add/` links and `https://www.snapchat.com/@username` links, then reads the public profile page once per account.
- Builds a flat, joinable record instead of dumping raw page data: identity, coverage, flags, counts, highlights, Spotlight, story, lenses, comments, contacts and related accounts.
- Merges each Spotlight card with its metadata, so every entry carries the real `storyId`, `spotlightUrl`, view/share/comment/boost/recommend counts, caption, hashtags, AI title/description/keywords and a transcript URL when one exists.
- Drops empty Spotlight slots, placeholder rows, `1970` timestamps, negative sentinel counts and empty strings at every depth. A field the source genuinely lacks is omitted, never zero-filled.
- Derives `hasStory` from the actual active story snaps instead of the stale page flag.
- Can expand one hop into related accounts, with `isSeed`, `sourceUsername` and `discoveryDepth` recorded so seed rows and discovered rows stay distinguishable.
- Supports optional full highlight snap lists with a per-highlight snap cap, and caps the total number of profile records.

### Output per profile

#### Core fields

| Field | Description |
|---|---|
| `username` | Snapchat username. |
| `displayName` | Public display name. |
| `accountType` | `"public"` or `"private"` (personal account). |
| `profileStatus` | `"public"`, `"personal"`, `"not_found"` or `"invalid"`. |
| `recordType` | `"profile"` for profile rows, `"error"` for failed entries. |
| `isVerified` | Whether the account carries Snapchat's verification badge. |
| `subscriberCount` | Subscriber count when Snapchat publishes it. Hidden counts are omitted. |
| `bio` / `websiteUrl` | Profile bio and linked website, when present. |
| `profileUrl` | Canonical profile URL (`/@username`). |
| `profilePictureUrl` / `snapcodeImageUrl` / `squareHeroImageUrl` | Avatar, Snapcode and hero image URLs. |
| `category` / `subcategory` / `publisherType` | Content category and publisher identifiers. |
| `businessProfileId` / `hostUserId` | Business profile and host identifiers, when exposed. |
| `address` / `mutableName` / `primaryColor` | Optional profile presentation fields. |
| `shouldHideUsername` | Whether Snapchat hides the username in its own UI. |
| `hasStory` / `hasCuratedHighlights` / `hasSpotlightHighlights` | Whether each content type is present now. |
| `storySnapCount` / `curatedHighlightCount` / `spotlightCount` / `lensCount` / `relatedAccountCount` | Flat counts. `storySnapCount` and `lensCount` describe the profile even when those sections are disabled; `curatedHighlightCount`, `spotlightCount` and `relatedAccountCount` reflect the entries returned after caps. |
| `createdAt` / `lastUpdatedAt` | Account creation and last-update timestamps in ISO 8601 UTC. |
| `sameAsLinks` | Cross-platform links listed for the profile. |
| `contacts` | Locally parsed emails, phones, social handles, Linktree and website URLs. |
| `engagementSummary` | Spotlight totals for the returned entries (after `maxHighlightsPerUser`): views, shares, comments, boosts, recommends and average views. |
| `isSeed` / `sourceUsername` / `discoveryDepth` | `isSeed` is set on every profile row; `sourceUsername` and `discoveryDepth` appear on discovered rows. |
| `scrapedAt` | Timestamp this actor fetched the record (ISO 8601 UTC). |

#### `curatedHighlights[]`

Each entry keeps `highlightId`, `storyTitle`, `thumbnailUrl`, `snapCount`, `firstSnapUrl` and `firstSnapType`. With `includeHighlightSnaps` enabled, each entry also contains `snaps[]` with `snapIndex`, `snapId` (only when non-empty), `mediaUrl`, `mediaPreviewUrl`, `mediaType`, `postedAt`, `snapTitle`, `lat`, `lng`, `isSponsored`, `hasAttachment` and `transcriptUrl`.

#### `spotlightHighlights[]`

The canonical Spotlight list. Every entry has a `storyId` and `spotlightUrl`, plus `thumbnailUrl`, `mediaUrl`, `mediaPreviewUrl`, `mediaType`, `transcriptUrl`, `uploadedAt`, `durationMs`, `width`, `height`, `caption`, `hashtags`, `viewCount`, `shareCount`, `commentCount`, `boostCount`, `recommendCount`, creator fields, `aiTitle`, `aiDescription`, `aiKeywords`, `contentKeywords`, `contextCards` and `detectedLanguages` when the page provides them.

#### `spotlightMetadata[]` (when `includeSpotlightMeta` is true)

A backward-compatible metadata array with the same placeholder and sentinel fixes, plus `storyId` and `spotlightUrl`. It is capped by `maxHighlightsPerUser`. `spotlightHighlights[]` is the recommended, merged view.

#### `activeStorySnaps[]` and `activeStoryMeta` (when `includeActiveStory` is true)

Per snap: `snapIndex`, `snapId`, `mediaUrl`, `mediaPreviewUrl`, `mediaType`, `postedAt`, `snapTitle`, `lat`, `lng`, `hasAttachment`, `audioTranscriptionObjectUrl`, `isSponsored` and `storySource`. Story-level metadata appears in `activeStoryMeta` when the page exposes it.

#### `lenses[]` (when `includeLenses` is true)

`scannableUuid`, `lensName`, `lensCreatorDisplayName`, `lensCreatorUsername`, `lensId`, `lensPreviewImageUrl`, `lensPreviewVideoUrl`, `iconUrl`, `unlockUrl`, `userProfileUrl`, `lensCreatorSearchTags`, `isOfficialSnapLens`, `lastUpdatedAt` and `lensUrl`. The UUID is recovered from the unlock link when the page omits the dedicated field.

#### `spotlightComments[]` (when `includeComments` is true)

`commentId`, `snapId`, `replyText`, `reactionCounts`, `likeCount`, `commenterDisplayName`, `commenterBitmojiAvatarId`, `commenterBitmojiSelfieId`, `commenterProfileLogoUrl`, `commenterId`, `commenterProfileId`, `approvalState`, `postedAt`, `updatedAt`, `rankingScore`, `threadedReplyCount` and `reportCount`. Duplicate comments are removed within a profile.

#### `relatedAccounts[]`

`username`, `displayName`, `profileUrl`, `profilePictureUrl`, `isVerified`, `subscriberCount` (only when published), `bio`, `snapcodeImageUrl`, `category`, `websiteUrl`, presence flags and `subscribeLink` with `oneLinkBaseUrl`, `deepLinkUrl` and `iosAppStoreUrl`.

#### Personal and error records

Personal accounts return `username`, `displayName`, `profileUrl`, `snapcodeImageUrl`, optional Bitmoji URLs, `accountType: "private"`, `profileStatus: "personal"`, `isVerified: false`, `recordType` and `scrapedAt`.

An unknown or unparseable profile returns `inputUsername`, `profileStatus`, `recordType: "error"`, `error` and `scrapedAt`. Error rows count toward `maxItems`.

#### Legacy `cursors`

`cursors` is retained for compatibility: `curatedHighlightsCursor`, `spotlightHighlightsCursor` and `lensCursor`. It is a raw cursor object and is not required to read the records.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `usernames` | Array of strings | – | Required. Snapchat usernames or profile URLs: `brentrivera`, `@brentrivera`, `https://www.snapchat.com/add/brentrivera`, `https://www.snapchat.com/@brentrivera`. |
| `includeLenses` | Boolean | `true` | Include lenses published by the profile. |
| `includeSpotlightMeta` | Boolean | `true` | Merge Spotlight metadata into `spotlightHighlights[]` and keep the legacy metadata array. |
| `includeActiveStory` | Boolean | `true` | Include the current public story snaps. |
| `includeHighlightSnaps` | Boolean | `false` | Add the full snap list to each curated highlight. |
| `includeComments` | Boolean | `false` | Include embedded Spotlight comments. |
| `maxRelatedAccounts` | Integer | – | Cap related accounts per profile. `0` excludes them. |
| `maxHighlightsPerUser` | Integer | – | Cap curated highlights, Spotlight entries and legacy `spotlightMetadata[]` rows per profile. `0` excludes all three; counts and engagement totals follow the capped list. |
| `maxSnapsPerHighlight` | Integer | `0` | With `includeHighlightSnaps`, cap snaps per highlight. `0` means no cap, maximum `500`. |
| `maxItems` | Integer | – | Stop after this many profile rows, including error rows. |
| `relatedProfilesLimit` | Integer | `0` | Scrape up to this many unique related accounts after the supplied profiles. One hop only. |
| `proxyConfiguration` | Object | – | Optional proxy configuration. Public profiles work without one. |

#### Example: quick profile lookup

```json
{
  "usernames": ["brentrivera", "https://www.snapchat.com/@khaby.lame"]
}
```

#### Example: lightweight run

```json
{
  "usernames": ["teamsnapchat"],
  "includeLenses": false,
  "includeSpotlightMeta": false,
  "includeActiveStory": false,
  "maxRelatedAccounts": 0
}
```

#### Example: full enrichment with comments and highlight snaps

```json
{
  "usernames": ["kyliejenner"],
  "includeLenses": true,
  "includeSpotlightMeta": true,
  "includeActiveStory": true,
  "includeHighlightSnaps": true,
  "maxSnapsPerHighlight": 10,
  "includeComments": true,
  "maxHighlightsPerUser": 5
}
```

#### Example: related-account discovery

```json
{
  "usernames": ["nba"],
  "relatedProfilesLimit": 3,
  "maxItems": 4
}
```

### Use cases

- **Influencer vetting** — check verification, published subscriber counts, recent Spotlight performance and the links a creator lists.
- **Campaign benchmarking** — compare total Spotlight views, shares and comments across a roster of accounts.
- **Contact discovery** — collect public emails, phone numbers and social handles from bios and linked pages without extra requests.
- **Content research** — export captions, hashtags, AI titles and transcript URLs for a creator's current Spotlight catalog.
- **Network mapping** — expand one hop into the accounts Snapchat associates with a brand, with provenance on every discovered row.
- **Media archiving** — capture highlight, story and Spotlight media URLs for a point-in-time snapshot.

### FAQ

**Do I need a Snapchat account or cookies?**
No. The actor reads the same public profile page that opens in a browser without signing in.

**Why is `subscriberCount` missing on some records?**
Snapchat hides the count on some accounts. A hidden count is omitted rather than written as `0`. When Snapchat publishes a count it is rounded by Snapchat, commonly to the nearest 100.

**Why does a Spotlight entry have no view count?**
Some entries have no public engagement data. A count is included only when Snapchat supplies a non-negative value; negative sentinels are dropped.

**What is the difference between `curatedHighlights` and `spotlightHighlights`?**
Curated highlights are albums saved from the creator's story. Spotlight highlights are Spotlight videos pinned to the profile. Both are limited to what the public profile page exposes.

**How many highlights, Spotlights, lenses or related accounts can a profile have?**
The public page currently exposes about 30 Spotlight slots, about 18 curated highlights, up to 16 lenses and up to 3 related accounts per profile. The actor reports exactly what the page returns; it does not promise full history.

**Why are some media URLs no longer playable later?**
Snapchat's CDN links can carry expiring tokens. Download or cache media promptly after a run.

**Does a personal account return highlights or stories?**
Personal accounts expose very little publicly. They return identity, Snapcode and Bitmoji assets when available, and `profileStatus: "personal"` explains the reduced record.

**How does related-account expansion work?**
Set `relatedProfilesLimit` above `0`. The actor reads the related list from the supplied profiles, de-duplicates usernames, and scrapes one hop only. Discovered profiles keep `isSeed: false`, `sourceUsername` and `discoveryDepth: 1`.

**Are empty fields written as null?**
No. Empty strings, nulls, empty arrays and empty objects are removed at every depth. Legitimate `false` values and numeric `0` from the source are preserved.

**Is this affiliated with Snapchat?**
No. This actor reads public profile pages and is not affiliated with, endorsed by, or supported by Snap Inc.

### Limitations

- Subscriber counts are rounded by Snapchat and hidden on some accounts.
- The profile page exposes a fixed batch of highlights and Spotlight entries, not the account's full history.
- Full comment-thread pagination and transcript text are owned by separate actors; this actor returns the embedded comments and transcript URLs only.
- Personal accounts expose minimal public data.
- Snapchat can change its page format at any time. When the page cannot be parsed, the actor returns an explicit error row instead of invented values.

# Actor input Schema

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

Snapchat usernames or profile URLs. Accepts brentrivera, @brentrivera, https://www.snapchat.com/add/brentrivera and https://www.snapchat.com/@brentrivera.

## `includeLenses` (type: `boolean`):

Include lenses published by the profile.

## `includeSpotlightMeta` (type: `boolean`):

Merge each Spotlight's view, share, comment, boost and recommend counts, caption, hashtags and AI metadata into the record.

## `includeActiveStory` (type: `boolean`):

Include the currently live public story snaps with media and preview URLs.

## `includeHighlightSnaps` (type: `boolean`):

Add the full snap list to each curated highlight. Can make records much larger.

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

Include the public comment threads Snapchat embeds on the profile page. Full thread pagination is a separate actor.

## `maxRelatedAccounts` (type: `integer`):

Cap the related accounts listed inside each record. 0 excludes them. Leave blank for no limit.

## `maxHighlightsPerUser` (type: `integer`):

Cap curated highlights and Spotlight slots per profile. 0 excludes both. Leave blank for no limit.

## `maxSnapsPerHighlight` (type: `integer`):

Used only when includeHighlightSnaps is on. 0 means no limit; 1-500 caps each highlight.

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

Stop after this many profile records. Leave blank for no cap.

## `relatedProfilesLimit` (type: `integer`):

After the supplied profiles, scrape up to this many unique accounts from their related lists (one hop only). 0 disables expansion.

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

Optional. Public Snapchat profiles work without a proxy.

## Actor input object example

```json
{
  "usernames": [
    "brentrivera"
  ],
  "includeLenses": true,
  "includeSpotlightMeta": true,
  "includeActiveStory": true,
  "includeHighlightSnaps": false,
  "includeComments": false,
  "maxSnapsPerHighlight": 0,
  "relatedProfilesLimit": 0
}
```

# Actor output Schema

## `profiles` (type: `string`):

Dataset containing one record per requested Snapchat profile.

# 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": [
        "brentrivera"
    ],
    "includeLenses": false,
    "includeSpotlightMeta": false,
    "includeActiveStory": false,
    "includeHighlightSnaps": false,
    "includeComments": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("vexaloom-labs/snapchat-creator-profile-and-highlights-extractor").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": ["brentrivera"],
    "includeLenses": False,
    "includeSpotlightMeta": False,
    "includeActiveStory": False,
    "includeHighlightSnaps": False,
    "includeComments": False,
}

# Run the Actor and wait for it to finish
run = client.actor("vexaloom-labs/snapchat-creator-profile-and-highlights-extractor").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": [
    "brentrivera"
  ],
  "includeLenses": false,
  "includeSpotlightMeta": false,
  "includeActiveStory": false,
  "includeHighlightSnaps": false,
  "includeComments": false
}' |
apify call vexaloom-labs/snapchat-creator-profile-and-highlights-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,vexaloom-labs/snapchat-creator-profile-and-highlights-extractor"
        }
    }
}
```

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/FpzhExyefgz9gLqBd/builds/oMu5xPu9KJDoORDdT/openapi.json
