# Snapchat Public Profile Stories Scraper (`automation-lab/snapchat-public-profile-stories`) Actor

Extract currently visible Story snaps, media links, previews, timestamps, and creator details from public Snapchat profiles.

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

## Pricing

Pay per event

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/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 Public Profile Stories Scraper

Monitor currently visible **Snapchat public profile stories** and export one structured record per Story snap.

Provide public Snapchat usernames or profile URLs. The Actor resolves each profile and returns current Story snap IDs, direct media links, previews, timestamps, media types, creator identity, and source URLs.

It is designed for influencer teams, campaign analysts, social-media researchers, and automation builders who need repeatable snapshots of public creator Stories before they expire.

### What does Snapchat Public Profile Stories Scraper do?

The Actor visits logged-out public Snapchat profile pages and reads the Story data Snapchat exposes to web visitors.

It can:

- accept usernames such as `nfl` or `@nfl`;
- accept `https://www.snapchat.com/add/...` profile URLs;
- combine both input routes in one run;
- remove duplicate profiles;
- export one dataset item per visible Story snap;
- stop at a global `maxItems` limit;
- preserve image and video media links without downloading the files;
- return a successful empty dataset when a valid public profile has no current Story;
- isolate a failed profile while continuing with other supplied profiles.

The Actor does not log in, open private profiles, or retrieve expired Stories.

### Who is it for?

#### Influencer marketing teams

Take scheduled snapshots of public creator Stories during campaigns. Use stable snap IDs to identify newly visible items between runs.

#### Brand and competitor analysts

Collect public Story media types, timestamps, and creator context into a dataset that can be compared over time.

#### Researchers and journalists

Capture structured metadata for currently public Stories while retaining the source profile and collection timestamp.

#### Data and automation teams

Send the default dataset to spreadsheets, databases, webhooks, or data warehouses without building a Snapchat page parser.

### Why use this Actor?

- **Profile-focused output:** the dataset is limited to current public profile Stories rather than mixing Spotlight, Discover, lenses, and profile records.
- **One row per snap:** every item has its own snap ID, media URL, preview, type, and timestamp.
- **Two input routes:** use usernames for compact automation or URLs copied from Snapchat.
- **HTTP-only collection:** no browser or media download is used, reducing runtime and transfer.
- **Monitoring-ready IDs:** compare `snapId` values between scheduled runs to detect additions and removals.
- **Bounded runs:** cap the total accepted records with `maxItems`.

### What Snapchat Story data can I extract?

| Field | Meaning |
|---|---|
| `profileUsername` | Username that owns the Story |
| `profileDisplayName` | Public creator display name |
| `profileUrl` | Canonical public profile URL |
| `profilePictureUrl` | Creator image URL, when exposed |
| `businessProfileId` | Stable public profile identifier, when exposed |
| `storyId` | Identifier of the current Story |
| `storyType` | Snapchat's numeric Story type |
| `storyTitle` | Story title, when available |
| `storyThumbnailUrl` | Story-level thumbnail URL |
| `snapId` | Identifier of the Story snap |
| `snapIndex` | Zero-based position inside the Story |
| `snapMediaType` | Normalized `image`, `video`, or `unknown` value |
| `snapMediaTypeCode` | Original Snapchat media type code |
| `mediaUrl` | Direct public Snapchat CDN media URL |
| `previewUrl` | Public preview image URL, when available |
| `overlayUrl` | Overlay asset URL, when available |
| `attachmentUrl` | Attached public URL, when available |
| `postedAt` | ISO publication time, when exposed |
| `postedTimestamp` | Unix publication timestamp in seconds |
| `isSponsored` | Sponsored flag, when Snapchat supplies it |
| `scrapedAt` | ISO time when the Actor collected the item |

Nullable fields remain `null` when Snapchat does not expose them.

### How to scrape Snapchat public profile Stories

1. Open the Actor input page.
2. Enter one or more values in **Snapchat usernames**, or add public profile URLs.
3. Set **Maximum Story snaps** to bound the output.
4. Click **Start**.
5. Open the **Dataset** tab when the run finishes.
6. Export the records as JSON, CSV, Excel, XML, or RSS.

For repeat monitoring, save the input as an Apify Task and add a schedule.

### Input parameters

#### `usernames`

An array of up to 100 public Snapchat usernames.

The Actor accepts values with or without `@`. Usernames are matched case-insensitively and deduplicated.

```json
{
  "usernames": ["nfl", "@kyliejenner"],
  "maxItems": 25
}
```

#### `startUrls`

An array of up to 100 Snapchat profile URLs in either supported form:

- `https://www.snapchat.com/add/nfl`
- `https://www.snapchat.com/@nfl`

Other domains and non-profile Snapchat URLs fail validation.

#### `maxItems`

Maximum total Story snap records saved across all profiles.

- minimum: `1`
- maximum: `10000`
- default: `100`

At least one username or profile URL is required.

### Output example

The default dataset contains one item per current Story snap. This shortened record reflects the real output shape:

```json
{
  "profileUsername": "nfl",
  "profileDisplayName": "NFL Official",
  "profileUrl": "https://www.snapchat.com/add/nfl",
  "businessProfileId": "21f4e252-2d8b-44f7-a7ac-21a767730b7f",
  "storyId": "nfl",
  "storyType": 5,
  "storyTitle": null,
  "snapId": "Rm9NJEHmSy6saC3njUVAVAAAga2lncmJmenJrAaAK9NPkAaAK9F59AAAAAA",
  "snapIndex": 0,
  "snapMediaType": "video",
  "snapMediaTypeCode": 1,
  "mediaUrl": "https://cf-st.sc-cdn.net/...",
  "previewUrl": "https://cf-st.sc-cdn.net/...",
  "postedAt": "2026-08-16T14:23:02.000Z",
  "postedTimestamp": 1786890182,
  "isSponsored": null,
  "scrapedAt": "2026-08-17T14:12:14.495Z"
}
```

CDN links are controlled by Snapchat and may expire. Copy or process media promptly when your lawful workflow requires retention.

### How much does it cost to scrape Snapchat public profile Stories?

The Actor uses pay-per-event pricing:

- **$0.01000** once when a run starts;
- one item event for each Story snap saved.

The BRONZE item price is **$0.001896 per Story snap**. Higher subscription tiers receive progressively lower item prices.

| Tier | Price per Story snap |
|---|---:|
| FREE | $0.0021804 |
| BRONZE | $0.001896 |
| SILVER | $0.0014789 |
| GOLD | $0.0011376 |
| PLATINUM | $0.0007584 |
| DIAMOND | $0.00053088 |

Example BRONZE Actor charges:

| Saved snaps | Estimated Actor charge |
|---:|---:|
| 1 | $0.011896 |
| 10 | $0.02896 |
| 25 | $0.05740 |
| 100 | $0.19960 |

A valid profile with no currently visible Story produces no item event. Platform usage charges may be separate according to your Apify plan and the active pricing display.

### Monitor new Snapchat Story snaps

A scheduled Apify Task can turn each run into a timestamped snapshot:

1. Save the usernames and limit as a Task.
2. Schedule it at a frequency appropriate for your use case.
3. Store each dataset or send it through a webhook.
4. Compare `profileUsername` plus `snapId` against the previous run.
5. Treat unseen IDs as additions and missing IDs as no longer visible.

The Actor reports current state. It does not maintain history or send alerts by itself.

### Export Snapchat Story data

Apify datasets support:

- JSON for applications and APIs;
- CSV or Excel for campaign analysts;
- XML and RSS for compatible tools;
- Google Sheets through Apify integrations;
- webhooks for event-driven pipelines;
- dataset API reads from ETL jobs.

For large monitoring programs, schedule bounded profile groups and persist the resulting snap IDs in your own database.

### Run with the Apify API

Replace `YOUR_TOKEN` with an Apify API token.

#### cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~snapchat-public-profile-stories/run-sync-get-dataset-items" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"usernames":["nfl"],"maxItems":10}'
```

#### 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-profile-stories').call({
  usernames: ['nfl', 'kyliejenner'],
  maxItems: 25,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
from apify_client import ApifyClient
import os

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/snapchat-public-profile-stories').call(
    run_input={'usernames': ['nfl'], 'maxItems': 10}
)
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### Use with MCP and AI agents

Add this Actor to Claude Code through Apify MCP:

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

#### Claude Desktop setup

Use this MCP configuration in Claude Desktop:

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

#### Cursor setup

Add the same server URL in Cursor under **Settings → MCP → Add server**.

#### VS Code setup

Add the same HTTP MCP server URL to your VS Code MCP configuration.

Example prompts:

- "Run the Snapchat Public Profile Stories Scraper for nfl and return the newest video snap IDs."
- "Check these public Snapchat profile URLs and save up to 50 current Story items."
- "Compare this run's snap IDs with yesterday's dataset and list additions."

The comparison step uses your agent or downstream storage; the Actor itself returns the current snapshot.

### Integrations and automation patterns

#### Campaign evidence pipeline

Schedule a Task, send the dataset ID to a webhook, and copy allowed media into approved campaign storage before source links expire.

#### Creator activity dashboard

Load `profileUsername`, `snapId`, `snapMediaType`, `postedAt`, and `scrapedAt` into a warehouse. Build counts and freshness metrics there.

#### Spreadsheet review

Export a run to Google Sheets so reviewers can open preview and source links without handling raw page HTML.

#### Change detection

Use `snapId` as the source key and `profileUsername` as the partition key. Compare snapshots rather than relying only on timestamps.

### Limits and responsible operation

- Only anonymously reachable public profile data is supported.
- Private, friends-only, restricted, removed, and expired Stories are unavailable.
- A public profile may have no current Story; this is a valid empty result.
- Snapchat can change its public page structure or CDN link lifetime.
- Media URLs may expire even though the dataset record remains.
- The Actor does not download media or bypass access controls.
- The Actor does not expose view counts, replies, private audience data, or Story history.
- `maxItems` is global across all supplied profiles.
- Profiles are fetched in conservative bounded batches.

Use schedules that are proportionate to your monitoring need.

### Errors and troubleshooting

#### Why is the dataset empty?

The supplied public profile may not have a currently visible Story. Check the profile in a logged-out browser. The Actor logs `visibleStorySnaps: 0` for a valid empty profile.

#### Why was a profile skipped?

The username may be invalid, missing, private, unavailable in the public web experience, or temporarily failing upstream. In multi-profile runs, other valid profiles continue.

#### Why does a media link no longer open?

Snapchat controls CDN link validity. Run the Actor again to collect the currently exposed URL, or copy permitted media promptly in your downstream workflow.

#### Why did the whole run fail?

A run fails when the input is malformed or none of the supplied profiles can be processed as public profiles. This prevents a misleading successful run with only upstream failures.

### Legal and ethical use

This Actor accesses data that Snapchat exposes on logged-out public profile pages.

You are responsible for:

- following applicable laws and regulations;
- respecting Snapchat's terms and content rights;
- collecting only data needed for a legitimate purpose;
- avoiding harassment, surveillance, or sensitive profiling;
- protecting exported data and deleting it when no longer needed;
- obtaining any permissions required to retain or republish media.

Public availability does not remove copyright, privacy, publicity, or contractual obligations. This Actor is not affiliated with or endorsed by Snapchat or Snap Inc.

### FAQ

#### Can I use Snapchat profile URLs instead of usernames?

Yes. Use `/add/username` or `/@username` HTTPS URLs on `snapchat.com`.

#### Can I mix usernames and URLs?

Yes. They are normalized and deduplicated before collection.

#### Does it scrape saved Highlights or Spotlight posts?

No. This Actor is intentionally limited to the current public profile Story. Use related Actors for profile metadata, Discover, or supplied Spotlight video URLs.

#### Does it retrieve expired Story history?

No. It reports only the Story currently exposed on the public profile page.

#### Does it download images or videos?

No. It exports current direct media and preview links, which keeps runs lightweight.

#### Can I monitor many profiles?

A run supports up to 100 unique profiles. For recurring monitoring, use a scheduled Task and a bounded `maxItems` value.

#### Are timestamps always available?

No. `postedAt` and `postedTimestamp` are `null` if Snapchat does not expose a valid publication time.

#### How do I avoid duplicates between runs?

Store the pair `profileUsername` and `snapId` in your destination, then upsert or compare each new snapshot.

### Related automation-lab Actors

- [Snapchat Scraper](https://apify.com/automation-lab/snapchat-scraper) — public profile metadata such as bio, subscriber count, badges, Highlights, lenses, and related accounts.
- [Snapchat Discover Scraper](https://apify.com/automation-lab/snapchat-discover-scraper) — Story snap records from Snapchat Discover surfaces.
- [Snapchat Public Video Downloader](https://apify.com/automation-lab/snapchat-public-video-downloader) — download supplied public Spotlight videos and export their metadata.

Choose this Actor when the unit you need is a currently visible Story snap tied to a supplied public creator profile.

# Actor input Schema

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

Public profile usernames, with or without the @ prefix. You can combine these with profile URLs.

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

Snapchat /add/username or /@username profile URLs. Only public profile pages are supported.

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

Maximum total number of current Story snap records saved across all supplied profiles.

## Actor input object example

```json
{
  "usernames": [
    "nfl",
    "kyliejenner"
  ],
  "startUrls": [
    {
      "url": "https://www.snapchat.com/add/khloekardashian"
    }
  ],
  "maxItems": 20
}
```

# Actor output Schema

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

Dataset items with creator identity, Story and snap IDs, media links, previews, media types, and timestamps.

# 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": [
        "nfl",
        "kyliejenner"
    ],
    "startUrls": [
        {
            "url": "https://www.snapchat.com/add/khloekardashian"
        }
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/snapchat-public-profile-stories").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": [
        "nfl",
        "kyliejenner",
    ],
    "startUrls": [{ "url": "https://www.snapchat.com/add/khloekardashian" }],
    "maxItems": 20,
}

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

```

## MCP server setup

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

```

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/oVk4HKYM3yynEGlZ3/builds/PS5nabscfn8daKMAG/openapi.json
