# Snapchat Public Profile Scraper (subscribers, bio, no login) (`datahamster/snapchat-profiles`) Actor

Snapchat Public Profiles by handle or link: one row per creator or business profile with subscriber count, name, bio, website, address, category, badge, Snapcode and spotlight, story and lens counts. No login. Monitor mode alerts on subscriber and bio changes; you pay only for the rows you get.

- **URL**: https://apify.com/datahamster/snapchat-profiles.md
- **Developed by:** [Viktor Dubnytskiy](https://apify.com/datahamster) (community)
- **Categories:** Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.60 / 1,000 result items

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/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 Public Profile Scraper (subscribers, bio, no login)

Read any **Snapchat Public Profile** — the creator and business accounts Snapchat lists publicly — as one flat row: subscriber count, display name, bio, website, business address, category, verified badge, avatar, Snapcode, and how many spotlights, story highlights and lenses the profile shows. Give it handles or profile links. No login, no cookies, no API key.

### What you get

One row per public profile: `id`/`username`, `url`, `displayName`, `bio`, `subscriberCount`, `subscriberCountText`, `badge`, `isVerified`, `website`, `address`, `category`, `subcategory`, `profileImageUrl`, `snapcodeUrl`, `hasStory`, `spotlightCount`, `storyCount`, `lensCount`, `query`, `scrapedAt`.

### Example output

A real row (`usernames: ["nba"]`):

```json
{
  "id": "nba",
  "url": "https://www.snapchat.com/add/nba",
  "username": "nba",
  "displayName": "NBA",
  "bio": "30 teams, 1 goal.",
  "subscriberCount": 3590800,
  "subscriberCountText": "3.6m",
  "badge": 1,
  "isVerified": true,
  "website": "NBA.com",
  "address": null,
  "category": "business-group",
  "subcategory": "sports-league",
  "profileImageUrl": "https://cf-st.sc-cdn.net/aps/bolt/aHR0cHM6Ly9jZi1zdC5zYy1jZG4ubmV0L2QvcGxQanhqRDFZRk9IUWdGMUZLRHNqP2JvPUVna3lBUVJJQWxBWllBRSUzRCZ1Yz0yNQ._RS0,90_FMjpeg",
  "snapcodeUrl": "https://app.snapchat.com/web/deeplink/snapcode?username=nba&type=SVG&bitmoji=enable",
  "hasStory": false,
  "spotlightCount": 24,
  "storyCount": 16,
  "lensCount": 16,
  "query": "nba",
  "scrapedAt": "2026-09-17T00:12:04Z"
}
```

Two more, shortened:

| Field | `nike` | `mrbeast` |
|---|---|---|
| `displayName` | `Nike` | `MrBeast` |
| `subscriberCount` | `null` (Snapchat publishes none) | `1464700` |
| `bio` | `Just Do It.` | `null` |
| `website` | `https://www.nike.com` | `null` |
| `address` | `Beaverton, Oregon, United States` | `null` |
| `spotlightCount` / `storyCount` / `lensCount` | `30` / `1` / `16` | `4` / `6` / `0` |

### Use cases

- Size up creators and brands before a Snapchat campaign: subscriber count, category and whether the profile is actually active (`hasStory`, spotlight and highlight counts).
- Build a competitor sheet for a niche: one row per brand profile with bio, website and business address as the brand itself publishes them.
- Verify a media kit: the subscriber figure a creator quotes against the one Snapchat prints today.
- Monitor mode: get an alert when a profile's subscriber count, bio or display name changes — useful for tracking growth or a rebrand.

### Input

| Field | Meaning | Default |
|---|---|---|
| `usernames` | Handles or profile links to read: `nba`, `@nike`, `https://www.snapchat.com/add/mrbeast`, `https://www.snapchat.com/@nba` | `["nba", "nike"]` |
| `includeCounts` | Count the spotlights, story highlights and lenses on the profile page | `true` |
| `maxItems` | Stop after this many rows | `100` |
| `mode` | `scrape` or `monitor` (only new/changed since last run) | `scrape` |
| `monitorStateId`, `webhookUrl`, `telegramBotToken`, `telegramChatId` | Monitor-mode state key and alert targets | empty |

### How it works

1. Each entry is turned into a handle — a bare handle, `@handle`, `/add/<handle>` or the canonical `/@<handle>` link all work; site sections (`/discover`, `/spotlight`, `/lens`, `/invite`) and other hosts are rejected before a request is made.
2. The public profile page is opened once per handle and read from the payload Snapchat server-renders into it, so the figures are the ones Snapchat itself shows a logged-out visitor.
3. Duplicated handles are read once, and one row is pushed per public profile.
4. A handle that has no account comes back as nothing (counted as not found). A handle whose account is not a Public Profile is skipped too — see below. A page that is not a profile page at all is reported as a block, never as an empty result.

### Pricing

| Event | Price |
|---|---|
| result | $0.002 per profile ($2 per 1,000) |
| monitor-check | $0.005 per monitor run |
| change | $0.002 per new/changed profile |

Charged only for rows actually pushed: a handle that is unknown or not a Public Profile costs nothing. No proxy is needed, so platform usage stays small.

### Public Profiles only — and what is NOT collected

Snapchat serves two kinds of account on the same URL, and this actor returns exactly one of them:

- A **Public Profile** is a creator or business account that opted into being listed publicly, with a subscriber count, a bio, a category and a website. Those become rows.
- An **ordinary account** has no public profile object. Its display name is in the page too — and it is dropped, unread, together with the whole handle. There is no input that turns that off.

Also never collected: friends, subscribers or viewers of a profile; snap, story or spotlight content and its comments; anyone's e-mail address or phone number. There is no `email` and no `phone` field in the output schema, a `website` value that is really a messenger deep link (`wa.me/<number>`, `signal.me/#p/+…`, `t.me/+…`, `tel:`, `mailto:`) is dropped, and an e-mail address or a dialable phone number typed into a bio is scrubbed out of `bio` before the row is built (8+ digits starting with `0` or `+`, or a shorter group introduced by a phone word; prices, dates and counts are left alone).

### Limits

- Public Profiles only. There is no keyword search on Snapchat's public web surface, so you bring the handles.
- `subscriberCount` is `null` when Snapchat publishes no figure for that profile — the page then shows no counter either (Nike is a live example). It is not a zero, and it is not an error.
- `spotlightCount`, `storyCount` and `lensCount` are what the profile page delivers on its first load; the page lazy-loads more as you scroll, so treat them as a floor, not a catalogue total. Set `includeCounts: false` to leave all three empty.
- Story and spotlight *content* is not returned, only whether a story was live (`hasStory`) and how many tiles the page showed.
- `category` / `subcategory` are Snapchat's own tags and are often empty.
- The bio scrub works on the shape of the digits, not on a list of keywords: a number written in words, or a contact hidden in an image, is out of its reach.
- Views, engagement and audience demographics are private to the profile owner and are not served to any visitor.

### FAQ

**Does it need a Snapchat account, cookies or an API key?** No. Every request is a plain public web request to the profile page.

**Can it find profiles by keyword?** No — Snapchat has no public keyword search for profiles. Supply the handles you care about.

**Why did my handle return nothing?** Either Snapchat has no account under it, or the account is not a Public Profile. The `RUN_SUMMARY` record in the run's key-value store carries `emptyReason`, which separates that from "the source answered with a wall".

**Will it give me the e-mail address in the bio?** No, by design. See the section above.

### Changelog

- 0.1: initial release — public profiles by handle or link, subscriber count, bio, website, address, category, badge, Snapcode, spotlight/story/lens counts, monitor mode on subscribers, bio and display name; ordinary accounts skipped and bio contacts scrubbed by design.

***

If this actor saved you time, a short review on its Store page genuinely helps other people find it. Found a bug or need a field that is missing? Open a ticket on the **Issues** tab.

# Actor input Schema

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

Stop after this many results (you are charged only for pushed items)

## `mode` (type: `string`):

scrape = full results; monitor = only new/changed items since the previous run of this task

## `monitorStateId` (type: `string`):

Optional state id when not running as a saved task (monitor mode)

## `webhookUrl` (type: `string`):

POST a change summary here in monitor mode

## `telegramBotToken` (type: `string`):

Optional: bot token for monitor-mode change summaries

## `telegramChatId` (type: `string`):

Optional: chat id that receives monitor-mode summaries

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

Public profiles to read, one per line: "nba", "@nike", "https://www.snapchat.com/add/mrbeast" or "https://www.snapchat.com/@nba". Only Public Profiles (creator and business accounts) return a row; ordinary accounts are skipped and cost nothing.

## `includeCounts` (type: `boolean`):

Count the spotlight highlights, story highlights and lenses the profile page delivers on its first load. The page lazy-loads more as you scroll, so these are a floor, not a catalogue total. Turn off to leave spotlightCount, storyCount and lensCount empty.

## Actor input object example

```json
{
  "maxItems": 100,
  "mode": "scrape",
  "usernames": [
    "nba",
    "nike"
  ],
  "includeCounts": true
}
```

# Actor output Schema

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

All pushed rows (dataset, JSON)

## `resultsTable` (type: `string`):

Dataset in the Console viewer

## `runSummary` (type: `string`):

RUN\_SUMMARY record

# 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": [
        "nba",
        "nike"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("datahamster/snapchat-profiles").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": [
        "nba",
        "nike",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("datahamster/snapchat-profiles").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": [
    "nba",
    "nike"
  ]
}' |
apify call datahamster/snapchat-profiles --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,datahamster/snapchat-profiles"
        }
    }
}
```

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/vOkSrEOw4CXmWnop8/builds/Am1FqEBoSpEQcrCok/openapi.json
