Instagram Stories Scraper API avatar

Instagram Stories Scraper API

Pricing

from $2.80 / 1,000 profiles

Go to Apify Store
Instagram Stories Scraper API

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

LanceAPI

Maintained by Community

Actor 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 storyId values 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 storyId to 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

FieldTypeRequiredDescription
usernamesstring[]YesInstagram 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

FieldTypeMeaning
inputstringOriginal supplied value
usernamestring | nullNormalized username
userIdstring | nullInstagram profile ID when available
profileUrlstring | nullCanonical profile URL
statusstringsuccess, no_stories, invalid, restricted, or failed
reasonstring | nullStable reason code when applicable
errorMessagestring | nullHuman-readable result explanation
chargedbooleanWhether processing this profile incurred a charge
isPrivateboolean | nullConfirmed privacy state when available
isAccessiblebooleanWhether Story data was accessible
activeStoryCountintegerTotal active Stories returned for this profile
requestedAtstringISO 8601 processing timestamp

Story fields

FieldTypeMeaning
storyIdstring | nullStory identifier
mediaTypestring | nullimage, video, or unknown
postedAtstring | nullPublication time in ISO 8601 UTC
expiresAtstring | nullExpected expiration time in ISO 8601 UTC
mediaUrlstring | nullPrimary image or video URL
imageUrlstring | nullImage or video-cover URL
videoUrlstring | nullDirect video URL
width, heightnumber | nullMedia dimensions in pixels
durationSecondsnumber | nullVideo duration
hasAudioboolean | nullReported video audio availability
captionstring | nullStory caption when available
accessibilityCaptionstring | nullAccessibility description when available
mentionsobject[]Mentioned accounts
hashtagsstring[]Hashtags without #
linksobject[]Link stickers
locationsobject[]Location metadata
musicobject | nullTitle, artist, and audio ID when available
stickersobject[]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

StatusMeaningCharged?
successProcessing completed and at least one active Story was returnedYes
no_storiesThe profile was processed successfully but has no active StoriesYes
invalidThe input was clearly malformed, nonexistent, or deleted before processingNo
restrictedThe profile may be valid, but access is private, login-restricted, challenged, or otherwise restrictedYes
failedFormal processing began but did not complete, or the run budget prevented processingYes 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 os
from apify_client import ApifyClient
client = 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().items
print(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.