Instagram Stories Scraper API
Pricing
from $2.80 / 1,000 profiles
Instagram Stories Scraper API
Scrape active Instagram Stories from public profiles. Get images, videos, direct media URLs, timestamps, mentions, hashtags, links, music, locations, stickers, and structured Story data via API.
Pricing
from $2.80 / 1,000 profiles
Rating
0.0
(0)
Developer
LanceAPI
Maintained by CommunityActor stats
0
Bookmarked
47
Total users
31
Monthly active users
3 days ago
Last modified
Categories
Share
Enter an Instagram username, @username, or profile URL to collect that public account's currently active Instagram Stories. Get images, videos, direct media URLs, posting and expiration times, mentions, hashtags, links, locations, music, stickers, captions, and other useful Story metadata in structured Dataset rows.
Use the results for competitor and brand monitoring, creator research, active Story archiving, scheduled tracking, AI analysis, and automated workflows. All users can process up to 50 profiles per run, with predictable pricing per processed profile—not per Story returned.
The Actor is focused exclusively on active Instagram Stories. It does not collect Highlights, historical Stories, posts, Reels, comments, transcripts, OCR, translations, or private content.
Key features
- Active Instagram Stories extraction — Collect the Stories currently available from a public profile before they disappear.
- Direct image and video URLs — Send Story media to authorized archiving, review, or downstream content workflows.
- Rich Story metadata — Capture posting and expiration times, dimensions, duration, audio state, captions, mentions, hashtags, links, locations, music, and stickers.
- Complete, traceable results — Receive one row per Story and a clear status row when a profile has no Stories or cannot return Story data.
- Batch profile processing — Process up to 50 unique profiles per run for broader monitoring and research.
- Scheduled Story monitoring — Run with Apify Schedules and compare
storyIdvalues to identify newly published Stories. - Automation-ready output — Use clean Dataset rows in APIs, dashboards, AI analysis, and recurring workflows.
- Predictable per-profile pricing — Pay once for each processed profile, regardless of whether it returns 0, 1, or 20 Stories.
Use cases
- Competitor and brand Story monitoring — Track active campaigns, links, mentions, and creative assets before they disappear.
- Influencer and creator research — Review current Story activity, partnerships, topics, formats, and calls to action.
- Active Story archiving — Capture temporary media URLs and metadata for content you are authorized to retain.
- Scheduled Story monitoring — Run recurring checks with Apify Schedules and use
storyIdto spot newly published Stories. - AI analysis workflows — Feed structured Story metadata into your own classification, trend, or reporting workflows.
- API and automation pipelines — Send consistent Dataset rows to dashboards, alerts, databases, and other connected systems.
Quick start
Use a username:
{"usernames": ["instagram"]}
Equivalent accepted values include @instagram and https://www.instagram.com/instagram/. Duplicate representations of the same username are processed once.
Input
| Field | Type | Required | Description |
|---|---|---|---|
usernames | string[] | Yes | Instagram usernames, @usernames, or profile URLs. All users can process up to 50 profiles per run. |
Clearly malformed usernames, non-Instagram URLs, and post, Reel, or Story URLs are rejected before Story processing.
Output
Each active Story is a separate Dataset row with its profile context. If a profile returns no Story item, the Actor emits exactly one profile status row. Every accepted unique input therefore remains traceable.
Profile and result fields
| Field | Type | Meaning |
|---|---|---|
input | string | Original supplied value |
username | string | null | Normalized username |
userId | string | null | Instagram profile ID when available |
profileUrl | string | null | Canonical profile URL |
status | string | success, no_stories, invalid, restricted, or failed |
reason | string | null | Stable reason code when applicable |
errorMessage | string | null | Human-readable result explanation |
charged | boolean | Whether processing this profile incurred a charge |
isPrivate | boolean | null | Confirmed privacy state when available |
isAccessible | boolean | Whether Story data was accessible |
activeStoryCount | integer | Total active Stories returned for this profile |
requestedAt | string | ISO 8601 processing timestamp |
Story fields
| Field | Type | Meaning |
|---|---|---|
storyId | string | null | Story identifier |
mediaType | string | null | image, video, or unknown |
postedAt | string | null | Publication time in ISO 8601 UTC |
expiresAt | string | null | Expected expiration time in ISO 8601 UTC |
mediaUrl | string | null | Primary image or video URL |
imageUrl | string | null | Image or video-cover URL |
videoUrl | string | null | Direct video URL |
width, height | number | null | Media dimensions in pixels |
durationSeconds | number | null | Video duration |
hasAudio | boolean | null | Reported video audio availability |
caption | string | null | Story caption when available |
accessibilityCaption | string | null | Accessibility description when available |
mentions | object[] | Mentioned accounts |
hashtags | string[] | Hashtags without # |
links | object[] | Link stickers |
locations | object[] | Location metadata |
music | object | null | Title, artist, and audio ID when available |
stickers | object[] | Supported poll, question, quiz, countdown, and slider metadata |
Output examples
These excerpts use real public Instagram profiles. Temporary CDN URLs are omitted for readability; Dataset rows include the complete mediaUrl, imageUrl, and videoUrl values available at run time.
Active Story
The public natgeo profile returned one active video Story:
{"input": "natgeo","username": "natgeo","userId": "787132","profileUrl": "https://www.instagram.com/natgeo/","status": "success","reason": null,"charged": true,"isPrivate": false,"isAccessible": true,"activeStoryCount": 1,"storyId": "3981132462985100812","mediaType": "video","postedAt": "2026-09-07T19:03:30.000Z","expiresAt": "2026-09-08T19:03:30.000Z","width": 720,"height": 1280,"durationSeconds": 60.022,"hasAudio": true,"caption": null,"mentions": [],"hashtags": [],"locations": [],"music": null,"stickers": []}
No active Stories
The public instagram profile returned zero active Stories in this example:
{"input": "instagram","username": "instagram","userId": "25025320","profileUrl": "https://www.instagram.com/instagram/","status": "no_stories","reason": "no_active_stories","charged": true,"isPrivate": false,"isAccessible": true,"activeStoryCount": 0,"storyId": null,"mediaType": null}
Story availability changes continuously, so a later run may return a different count.
Status and reason
| Status | Meaning | Charged? |
|---|---|---|
success | Processing completed and at least one active Story was returned | Yes |
no_stories | The profile was processed successfully but has no active Stories | Yes |
invalid | The input was clearly malformed, nonexistent, or deleted before processing | No |
restricted | The profile may be valid, but access is private, login-restricted, challenged, or otherwise restricted | Yes |
failed | Formal processing began but did not complete, or the run budget prevented processing | Yes after processing begins; no for a pre-processing budget block |
Possible reason values are:
no_active_stories, invalid_username, invalid_profile_url, profile_not_found, profile_deleted, private_profile, login_required, access_restricted, challenge_required, temporarily_unavailable, rate_limited, processing_failed, and budget_limit_reached.
Login restrictions, challenges, temporary blocks, and inconclusive profile responses are not treated as proof that a profile is invalid.
Pricing
You pay per processed profile, not per Story. Pricing starts from $2.80 per 1,000 processed profiles, depending on your Apify plan. An Actor start costs $0.099.
Billing examples
- 1 processed profile with 0 active Stories → 1 profile-processing charge
- 1 processed profile with 1 active Story → 1 profile-processing charge
- 1 processed profile with 20 active Stories → still 1 profile-processing charge
- Clearly invalid input rejected before processing → no profile-processing charge
Profiles that require processing to determine availability, restrictions, or Story status are charged once. A processing error after formal Story processing begins is also charged once.
See the Pricing tab for the current price available for your Apify plan.
Batch limit
All users can process up to 50 unique valid profiles per run. The limit is applied after duplicate removal. Requests over the limit fail before Story processing and are never silently truncated.
API usage
Actor ID:
lance_api/instagram-stories-scraper-api
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('lance_api/instagram-stories-scraper-api').call({usernames: ['instagram'],});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Python
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("lance_api/instagram-stories-scraper-api").call(run_input={"usernames": ["instagram"]})items = client.dataset(run["defaultDatasetId"]).list_items().itemsprint(items)
cURL
curl -X POST \"https://api.apify.com/v2/acts/lance_api~instagram-stories-scraper-api/run-sync-get-dataset-items" \-H "Authorization: Bearer $APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"usernames":["instagram"]}'
Scheduled monitoring
Turn the Actor into a recurring Story monitor with Apify Schedules. Run it at the interval that fits your use case, store the Dataset results you are authorized to retain, and compare storyId values with previous runs to identify newly published Stories before they expire.
Media URL notice
mediaUrl, imageUrl, and videoUrl are temporary Instagram CDN URLs and may expire. Download or persist media you are authorized to retain as soon as practical.
Limitations
- Only currently active Stories are returned.
- Private content is not accessed.
- Highlights, historical Stories, posts, Reels, and comments are not collected.
- Transcription, OCR, and translation are not included.
- Instagram can require login, present a challenge, rate-limit requests, or temporarily restrict access.
- Metadata fields can be null or empty when Instagram does not expose them for a Story.
- Story availability and CDN URLs can change between runs.
Privacy and responsible use
Use the Actor only for lawful purposes and only process data you are authorized to access. Respect Instagram's terms, privacy rights, intellectual-property rights, and applicable data-protection laws. Do not provide passwords, cookies, login sessions, or access tokens as input.
FAQ
Does an account with no Stories fail?
No. It returns one row with status: "no_stories", reason: "no_active_stories", and activeStoryCount: 0.
Why is a profile charged if it returns no Story?
The Actor must process the profile to determine its current Story state. The charge covers that profile-processing operation, not the number of Story rows.
Can one profile create multiple processing charges?
No. One unique profile entering formal processing creates exactly one profile-processing charge, regardless of Story count.
Are invalid profiles charged?
Clearly malformed, nonexistent, or deleted profiles rejected before processing are not charged. Profiles that must be processed to determine availability or restrictions are charged once.
Can it access private profiles?
No. A private or restricted profile receives a transparent status row.
Are media URLs permanent?
No. They may expire. Persist authorized media promptly if you need it later.
Support
For support, open an issue on the Actor page or email lanceapi2026@hotmail.com. Include the Apify Run ID, public username, and expected versus actual result. Never send passwords, cookies, or API tokens.