Docs · Profile and stories
Profile and stories
A public profile with its live story, highlights and Spotlight videos, with direct media links.
https://api.lurkapi.com/v1/snapchat/profileWhen to use this
Use it to see what a creator or brand is posting on Snapchat right now, without an account. One call returns the profile, the live public story (story), saved highlights and up to ~25 recent Spotlight videos.
Only Public Profiles post to the web. For a regular account you get the username, display name and Snapcode, isPublic: false and empty lists; that's not an error. Friends-only and private stories are never visible.
Media links point straight at Snapchat's CDN and open without cookies. Story snaps are temporary (usually 24 hours; some creators keep theirs up for several days), so save what you need.
Unknown usernames return 404 not_found.
Parameters
All parameters go in the query string.
| Parameter | Description |
|---|---|
handlestringrequired | Snapchat username, with or without @ (e.g. nba), or the profile URL (snapchat.com/add/nba, snapchat.com/@nba).
|
Example request
Replace YOUR_API_KEY with your key, or set LURKAPI_KEY for the code. Get a free key.
curl "https://api.lurkapi.com/v1/snapchat/profile?handle=nba" \
-H "x-api-key: YOUR_API_KEY"const params = new URLSearchParams({
handle: "nba",
});
const res = await fetch(`https://api.lurkapi.com/v1/snapchat/profile?${params}`, {
headers: { "x-api-key": process.env.LURKAPI_KEY },
});
const data = await res.json();
if (!data.success) throw new Error(`${data.code}: ${data.error}`);
console.log(data.story);import os
import requests
res = requests.get(
"https://api.lurkapi.com/v1/snapchat/profile",
params={
"handle": "nba",
},
headers={"x-api-key": os.environ["LURKAPI_KEY"]},
timeout=60,
)
data = res.json()
if not data["success"]:
raise RuntimeError(f"{data['code']}: {data['error']}")
print(data["story"])Example response
A real response from this endpoint, captured from the live API and trimmed to a couple of items. Strings over 96 characters (mostly signed media URLs) are cut short and end in ….
Show the example response (6 KB)Hide
{
"success": true,
"credits_remaining": 999999,
"credits_charged": 1,
"profile": {
"username": "nba",
"displayName": "NBA",
"bio": "30 teams, 1 goal.",
"subscriberCount": 3572700,
"website": "https://NBA.com",
"avatarUrl": "https://cf-st.sc-cdn.net/aps/bolt/aHR0cHM6Ly9jZi1zdC5zYy1jZG4ubmV0L2QvcG…",
"snapcodeUrl": "https://app.snapchat.com/web/deeplink/snapcode?username=nba&type=SVG&bitmoji=enable",
"category": "business-group",
"subcategory": "sports-league",
"badge": "star",
"verified": true,
"isPublic": true,
"hasStory": true,
"createdAt": "2018-05-17T22:48:15.058Z",
"url": "https://www.snapchat.com/@nba"
},
"story": [
{
"id": "2wzhbo4SSiWIG-fd9lWR2wAAgc3pueWZkaGV1AaDuF62BAaDt-_1RAAAAAA",
"type": "video",
"thumbnailUrl": "https://cf-st.sc-cdn.net/d/y5Z3yeCzQGozfAaHB1jA5.256.IRZXSOY?mo=GlMaDjIC…",
"mediaUrl": "https://cf-st.sc-cdn.net/d/y5Z3yeCzQGozfAaHB1jA5.1034.IRZXSOY?mo=Gl8aGDI…",
"postedAt": "2026-09-29T16:25:09.000Z"
},
{
"id": "2wzhbo4SSiWIG-fd9lWR2wAAgdHB4dmdtdWt2AaDuF7BAAaDuDo3MAAAAAA",
"type": "video",
"thumbnailUrl": "https://cf-st.sc-cdn.net/d/ASfxTY9T1IATr8Yh7lf0R.256.IRZXSOY?mo=GlMaDjIC…",
"mediaUrl": "https://cf-st.sc-cdn.net/d/ASfxTY9T1IATr8Yh7lf0R.1034.IRZXSOY?mo=Gl8aGDI…",
"postedAt": "2026-09-29T16:45:26.000Z"
}
],
"highlights": [
{
"id": "029f2cc3-c0df-46c2-b610-485c137f9a0a",
"title": "2025-26 NBA Finals 🏆",
"thumbnailUrl": "https://cf-st.sc-cdn.net/d/ZXSSacNIpSYqxAm21SSGc.410?mo=GjcaFjIBBDoBfUIG…",
"snaps": [
{
"id": null,
"type": "image",
"thumbnailUrl": "https://cf-st.sc-cdn.net/d/ZXSSacNIpSYqxAm21SSGc.410?mo=GjcaFjIBBDoBfUIG…",
"mediaUrl": "https://cf-st.sc-cdn.net/d/ZXSSacNIpSYqxAm21SSGc.400?mo=Gk8aDDIBBDoBfVBe…",
"postedAt": "2026-06-01T17:36:48.000Z"
},
{
"id": null,
"type": "image",
"thumbnailUrl": "https://cf-st.sc-cdn.net/d/FgntIqJi6clNRLmaxXkXN.410?mo=GjcaFjIBBDoBfUIG…",
"mediaUrl": "https://cf-st.sc-cdn.net/d/FgntIqJi6clNRLmaxXkXN.400?mo=Gk0aDjIBBDoBfUgC…",
"postedAt": "2026-06-01T17:36:48.000Z"
}
]
},
{
"id": "2941c1a3-96ba-45aa-bdf4-30b344e63e42",
"title": "Your 2025-26 Kia NBA MVP 🏆",
"thumbnailUrl": "https://cf-st.sc-cdn.net/d/iqFfVpTceYNBTtMJvlQns.410.IRZXSOY?mo=GkAaFjIB…",
"snaps": [
{
"id": null,
"type": "image",
"thumbnailUrl": "https://cf-st.sc-cdn.net/d/iqFfVpTceYNBTtMJvlQns.410.IRZXSOY?mo=GkAaFjIB…",
"mediaUrl": "https://cf-st.sc-cdn.net/d/iqFfVpTceYNBTtMJvlQns.400.IRZXSOY?mo=GlwaCTIB…",
"postedAt": "2026-05-17T23:43:34.000Z"
},
{
"id": null,
"type": "video",
"thumbnailUrl": "https://cf-st.sc-cdn.net/d/eHfqR7qRY9kuVjZbupqN4.410.IRZXSOY?mo=GkAaFjIB…",
"mediaUrl": "https://cf-st.sc-cdn.net/d/eHfqR7qRY9kuVjZbupqN4.1034.IRZXSOY?mo=GlgaDDI…",
"postedAt": "2026-05-17T23:50:52.000Z"
}
]
}
],
"spotlight": [
{
"id": "W7_EDlXWTBiXAEEniNoMPwAAYZGl0Ym1wZ3ZsAaDvhddzAaDvhbJSAAAAAQ",
"url": "https://www.snapchat.com/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYZGl0Ym1wZ3ZsAaDvhddzAaDvhbJSAAAAAQ",
"title": "WEMBY ON THE OUTCOME OF THE 2026 NBA FINALS: | “I COULDN’T IMAGINE A BETTER MOTIVATION.” 😤",
"description": "Victor Wembanyama’s mindset is built for greatness 🔥🗣️ #NBA #Basketball #Wemby #Spurs",
"thumbnailUrl": "https://cf-st.sc-cdn.net/d/24TV6xVxTujwNzwlpEVXB.256.IRZXSOY?mo=GkYaCTIB…",
"videoUrl": "https://cf-st.sc-cdn.net/d/24TV6xVxTujwNzwlpEVXB.27.IRZXSOY?mo=Gl0aCTIBB…",
"durationMs": 15080,
"views": 2019,
"shares": 12,
"comments": 2,
"postedAt": "2026-09-29T23:35:11.698Z",
"hashtags": [
"#nba",
"#wemby",
"#basketball",
"#spurs"
]
},
{
"id": "W7_EDlXWTBiXAEEniNoMPwAAYdW10aGdlY2h3AaDvVhSqAaDvVgVGAAAAAQ",
"url": "https://www.snapchat.com/spotlight/W7_EDlXWTBiXAEEniNoMPwAAYdW10aGdlY2h3AaDvVhSqAaDvVgVGAAAAAQ",
"title": "Steph Curry & Jordan Poole's Golden State Warriors Photo Shoot Fun",
"description": null,
"thumbnailUrl": "https://cf-st.sc-cdn.net/d/jJMXmhYbdFnf15nBog0BX.256.IRZXSOY?mo=GkYaCTIB…",
"videoUrl": "https://cf-st.sc-cdn.net/d/jJMXmhYbdFnf15nBog0BX.27.IRZXSOY?mo=Gl0aCTIBB…",
"durationMs": 13630,
"views": 2077,
"shares": 0,
"comments": 3,
"postedAt": "2026-09-29T22:43:07.206Z",
"hashtags": []
}
],
"relatedAccounts": [
{
"username": "warriors",
"displayName": "Golden State Warriors",
"avatarUrl": "https://cf-st.sc-cdn.net/aps/bolt/aHR0cHM6Ly9jZi1zdC5zYy1jZG4ubmV0L2QvNj…",
"verified": true,
"url": "https://www.snapchat.com/@warriors"
},
{
"username": "nfl",
"displayName": "NFL Official",
"avatarUrl": "https://cf-st.sc-cdn.net/aps/bolt/aHR0cHM6Ly9jZi1zdC5zYy1jZG4ubmV0L2QvT3…",
"verified": true,
"url": "https://www.snapchat.com/@nfl"
}
]
}Response fields
Every field of a successful response. [] marks a list: a[].b is the b of each item in a. nullable fields can be null; optional fields can be missing.
Show all 54 fieldsHide
| Field | Type | Description |
|---|---|---|
| success | true | Always true here; errors have success: false. |
| credits_remaining | number | Your balance after this call. On anonymous playground calls: free tries left today. |
| credits_charged | number | Credits this call cost; 0 on free endpoints. On anonymous playground calls: tries used (1). |
| profile | object | The account. |
| profile.username | string | Username, lowercase. |
| profile.displayName | stringnullable | Display name. |
| profile.bio | stringnullable | Bio; null if empty or not public. |
| profile.subscriberCount | numbernullable | Subscribers, rounded by Snapchat (to 100). null when the creator hides it or the account isn't public. |
| profile.website | stringnullable | Website link from the profile, with https:// added when the creator left it out. |
| profile.avatarUrl | stringnullable | Profile picture. |
| profile.snapcodeUrl | stringnullable | The account's Snapcode (SVG), scannable to add them. |
| profile.category | stringnullable | Profile category, e.g. people or business-group. |
| profile.subcategory | stringnullable | Profile subcategory, e.g. artist or sports-league. |
| profile.badge | stringnullable | Badge next to the name: star (Snap Star), tick (verified checkmark) or snapchat_plus; null without one. |
| profile.verified | boolean | Has a Snap Star or checkmark badge. |
| profile.isPublic | boolean | Has a Public Profile. Only public profiles show stories, highlights and Spotlight on the web; for other accounts the lists are empty. |
| profile.hasStory | boolean | A public story is live right now (story isn't empty). |
| profile.createdAt | stringnullable | When the Public Profile was created; null if not public, ISO 8601. |
| profile.url | string | Profile on snapchat.com. |
| story | object[] | The public story that's live now, oldest snap first. Empty when there's none. |
| story[].id | stringnullable | Snap id. null in highlights, where Snapchat serves snaps without one. |
| story[].type | string | image or video. |
| story[].thumbnailUrl | stringnullable | Small preview image on Snapchat's CDN. |
| story[].mediaUrl | string | The full image or video on Snapchat's CDN. Opens in a browser as is: no login, no cookies. |
| story[].postedAt | stringnullable | When it was posted, ISO 8601. |
| highlights | object[] | Saved story highlights, as ordered on the profile. |
| highlights[].id | stringnullable | Highlight id. |
| highlights[].title | stringnullable | The highlight's title, as the creator named it. |
| highlights[].thumbnailUrl | stringnullable | Cover image. |
| highlights[].snaps | object[] | The snaps saved in this highlight, in order. |
| highlights[].snaps[].id | stringnullable | Snap id. null in highlights, where Snapchat serves snaps without one. |
| highlights[].snaps[].type | string | image or video. |
| highlights[].snaps[].thumbnailUrl | stringnullable | Small preview image on Snapchat's CDN. |
| highlights[].snaps[].mediaUrl | string | The full image or video on Snapchat's CDN. Opens in a browser as is: no login, no cookies. |
| highlights[].snaps[].postedAt | stringnullable | When it was posted, ISO 8601. |
| spotlight | object[] | Recent Spotlight videos (up to ~25), newest first. |
| spotlight[].id | string | Spotlight id. |
| spotlight[].url | string | The Spotlight's page on snapchat.com. |
| spotlight[].title | stringnullable | The creator's title or on-screen caption. When there's none, Snapchat's own AI-generated title; null if neither exists. |
| spotlight[].description | stringnullable | The creator's description, hashtags included; null if empty. |
| spotlight[].thumbnailUrl | stringnullable | Cover image. |
| spotlight[].videoUrl | string | The video on Snapchat's CDN. Opens in a browser as is. |
| spotlight[].durationMs | numbernullable | Length in milliseconds. |
| spotlight[].views | numbernullable | View count; null if hidden. |
| spotlight[].shares | numbernullable | Share count; null if Snapchat didn't include it. |
| spotlight[].comments | numbernullable | Comment count; null if Snapchat didn't include it. |
| spotlight[].postedAt | stringnullable | When it was posted, ISO 8601. |
| spotlight[].hashtags | string[] | Hashtags, as written, e.g. #nba. |
| relatedAccounts | object[] | Accounts Snapchat suggests alongside this one. |
| relatedAccounts[].username | string | Username. |
| relatedAccounts[].displayName | stringnullable | Display name. |
| relatedAccounts[].avatarUrl | stringnullable | Profile picture. |
| relatedAccounts[].verified | boolean | Has a Snap Star or checkmark badge. |
| relatedAccounts[].url | string | Profile on snapchat.com. |
Caching and freshness
Responses are cached for up to 15 minutes, so a repeat call within that window can return the same data. It still costs 1 credit.
Errors
Errors return { success: false, error, code, docs } with the HTTP status below. Validation errors, 401/402/429 rejections and 5xx failures are free; not_found is charged (how charging works). All error codes.
| Status | Code | Meaning |
|---|---|---|
| 401 | missing_api_key | No API key. Send it in the x-api-key header. |
| 401 | invalid_api_key | The key is unknown or was revoked. |
| 402 | insufficient_credits | Not enough credits for this call. Buy a pack or wait for tomorrow's top-up. |
| 404 | not_found | The endpoint, or the thing you asked for (ad, post, subreddit), doesn't exist. Charged when the platform was checked. |
| 405 | method_not_allowed | Endpoints take GET with query params. |
| 429 | rate_limited | Too many calls at once. Wait for the retry-after seconds, then retry. |
| 500 | internal_error | Something broke on our side. Retry; 5xx errors are free. |
| 502 | upstream_error | The platform didn't give a usable answer. Retry; 5xx errors are free. |
| 503 | upstream_busy | All our connections to the platform are busy. Retry in a few seconds; 5xx errors are free. |
| 504 | upstream_timeout | The platform took over 30 seconds to answer. Retry; timeouts are free. |
Use it in Claude
Once LurkAPI is connected to Claude, this endpoint is the snapchat_profile tool. Ask in plain English, for example:
Use LurkAPI's snapchat_profile with handle "nba" and summarize what you find.Claude calls snapchat_profile with arguments like these, and each call costs 1 credit:
{
"handle": "nba"
}Tool results skip nulls and empty lists to save tokens.