Advanced Instagram Story Scraper – Metadata, OCR & Transcripts
Pricing
from $4.00 / 1,000 profiles
Advanced Instagram Story Scraper – Metadata, OCR & Transcripts
Scrape public Instagram Stories with rich metadata: mentions, links, music, reshares, media variants and labels. Add image OCR, original-language transcripts and media saving. No Instagram login required.
Pricing
from $4.00 / 1,000 profiles
Rating
0.0
(0)
Developer
LanceAPI
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
1
Monthly active users
11 hours ago
Last modified
Categories
Share
Instagram Story Scraper API – Advanced Metadata, OCR & Transcripts
Scrape public Instagram Stories with rich structured metadata, including mentions, link stickers, music, reshared Posts/Reels, optional image OCR, video transcription, and media saving.
Enter an Instagram username, @username, or profile URL to receive currently accessible public Stories as structured JSON. No Instagram login credentials are required.
- Rich Story metadata: work with available mentions, links, music, reshares, image/video variants, partnership metadata, and available platform-provided AI-label metadata in your own tools.
- Optional image OCR: extract visible text from image Stories and return the OCR text together with useful literal patterns such as mentions, links, prices, and promo codes.
- Optional video transcripts: turn spoken Story audio into original-language text for search and other downstream workflows.
- Optional media saving: save actual Story images and videos to your Apify storage for an authorized archive; standard Apify storage charges may apply while files are retained.
- Batch up to 100 unique valid profiles: usernames are normalized and deduplicated before processing, helping avoid duplicate work and charges within a run.
Predictable base pricing: budget by the number of unique profiles you submit for processing. The base model charges once per profile, whether it returns many Stories, no Stories, or an unsuccessful outcome. There is no additional charge per Story.
Optional OCR and media saving are charged for successfully delivered results. Video transcription is charged when paid speech recognition is performed, including when no spoken text is detected. Keep them off when you only need Story metadata.
Quick start
- Open the Actor and enter a public username, @username, or Instagram profile URL.
- For your first run, leave the three optional features off and click Start.
- Open the run's Dataset to inspect or export the Story rows. Check the run summary for each profile's outcome.
{"usernames": ["natgeo"]}
The usernames list is required. Story availability changes, so a public profile can return a confirmed no-active-Stories status instead of Story rows.
Short output example
Illustrative output — values are examples, not a captured live result. Selected fields from an image Story with OCR and media saving enabled are shown below; actual Story rows include additional metadata fields.
{"record_type": "story","status": "success","pk": "4000000000000000001","media_format": "image","taken_at_iso": "2026-10-20T12:00:00.000Z","user": { "username": "example_creator" },"media_url": "https://media.example.com/story.jpg","reel_mentions": [],"story_link_stickers": [],"music_metadata": null,"image_text": {"text": "USD 20.00\nPromo code: SAVE10","mentions": [], "hashtags": [], "urls": [], "emails": [],"phone_numbers": [], "prices": ["USD 20.00"], "discounts": [],"promo_codes": ["SAVE10"], "dates": [], "times": []},"transcript": null,"saved_media": {"url": "https://api.apify.com/v2/key-value-stores/EXAMPLE_STORE/records/story-4000000000000000001.jpg","key": "story-4000000000000000001.jpg","content_type": "image/jpeg","bytes": 12345}}
image_text applies to images and transcript applies to videos. Optional fields can be null when disabled, inapplicable, unsuccessful, or skipped for budget. A completed recognition with no spoken text also returns transcript: null; check transcript_status to distinguish these outcomes.
Input
| Field | Type | Required | Default | Prefill | What it does |
|---|---|---|---|---|---|
usernames | string array | Yes | ["instagram"] | ["instagram"] | Usernames, @usernames, or Instagram profile URLs; up to 100 unique valid profiles after canonical duplicate removal |
extractTextFromImages | boolean | No | false | None | Extract visible text from image Stories and return the OCR text and literal patterns |
transcribeStoryVideos | boolean | No | false | None | Transcribe spoken audio from Story videos in its original language |
saveMedia | boolean | No | false | None | Save a copy of actual Story images or videos to the run's Apify Key-Value Store; retained files may incur standard Apify storage charges |
Default and prefill values describe the Console input form; API calls must supply usernames. The three optional switches default to false when omitted. These are the only supported input fields.
Repeated references such as natgeo, @NatGeo, and https://www.instagram.com/natgeo/ count as one profile. The limit of 100 unique valid profiles per run applies after validation and duplicate removal. A larger canonical batch is rejected before processing; it is not silently shortened. Submit Instagram profile URLs, rather than individual Post, Reel, or Story URLs.
Optional features have separate charges. Enable only the features you need. Image OCR applies to image Stories; it does not scan video thumbnails or video frames.
Advanced Instagram Story metadata
A delivered Story produces one row with record_type: "story" and status: "success". The Actor's supported metadata fields are included whether or not you enable optional features. Field availability varies by Story; Advanced Metadata does not mean every possible Instagram feature is supported.
| Fields | Type and units | Meaning |
|---|---|---|
pk, id, code | string or null | Story identity and available shortcode; string IDs preserve large values for joins and duplicate checks |
user | object or null | Available owner identity, profile picture, privacy and verification information; individual values can be null |
media_format, media_type, product_type | string; number or null; string or null | Image/video format and available media type information |
taken_at, expiring_at, corresponding _iso fields | number or null, Unix seconds; string or null, UTC ISO 8601 | Available publication and expiry times |
media_url, image_url, video_url | string or null | Convenient URLs selected from available Story variants |
image_versions2, video_versions | object or null; array | Available image candidates and video renditions, including dimensions and rendition details |
original_width, original_height, video_duration, has_audio | number or null, pixels/seconds; boolean or null | Available dimensions, video duration, and audio availability |
caption_text, accessibility_caption | string or null | Available caption and accessibility text |
reel_mentions, story_link_stickers | array or null | Mention identities and link metadata, with available placement/timing |
story_music_stickers, music_metadata | array or null; object or null | Available music assets and summary, with distinct asset and cluster IDs |
story_feed_media | array or null | Available reshared Post/Reel identifiers and links |
is_paid_partnership, creative_config, ai_label_info | boolean or null; object or null; object or null | Explicit partnership information, selected creative details and available platform-provided AI-label information |
image_text, transcript, saved_media | object or null | Requested optional results, described below |
transcript_status | string, when present | Distinguishes completed speech recognition, no speech, technical failure, budget skipping, and unrequested work |
Unknown metadata remains null; collection fields can be null or empty arrays. Missing values are not filled with guesses. Public content URLs retain their query parameters and fragments. Sticker times and music durations use milliseconds; video duration uses seconds.
Extract text from Story images
image_text.text contains the full OCR text returned for that image, without trimming or rewriting it. Line breaks and whitespace are preserved. Other fields help you work with explicit patterns in that text:
mentions, hashtags, urls, emails, phone_numbers, prices, discounts, promo_codes, dates, and times are string arrays.
Arrays remove duplicates while keeping the order of first appearance. Extraction is conservative: unlabeled numbers are not guessed as telephone numbers, ambiguous dates are not converted, and a visible company name is not classified as a brand. The OCR text remains available even when every structured array is empty.
A successful extraction can return text: "" and empty arrays when no text is recognized. This is a successful, chargeable image text result. Technical failures leave image_text: null, keep the core Story, and do not incur an image text charge. OCR can contain recognition errors or miss visible text.
Transcribe Story videos
A completed transcript contains text and language. Text stays in its original language. Language is null when it cannot be reliably supplied; no translation or summary is added.
Video transcription is charged once per Story video when paid speech recognition is actually performed, including music-only, silent, and other no-speech results. It is not charged per minute. Requests that fail before recognition begins are not charged; a later technical failure is charged only when inference cost can be confirmed.
transcript_status distinguishes transcript_success, no_speech, technical_failure, budget_skipped, not_attempted, not_applicable, and not_requested. A normal no-speech result keeps the successful Story row with transcript: null and transcript_status: "no_speech". Recognition charges also apply if a later result-storage step fails, since recognition has already been performed.
Save Story media to Apify storage
saved_media contains url and key as strings, content_type as a MIME-type string, and bytes as the saved file size in bytes. An image Story saves its image; a video Story saves its video, not just its thumbnail. Keys use the Story ID and media extension.
The $0.005 Media saved event is the Actor fee for successfully copying one Story image or video to the run's Apify Key-Value Store and delivering its saved link. It does not include unlimited free storage. Retained files use your Apify Storage and may incur standard Apify storage charges. Unsuccessful saves leave saved_media: null and do not incur the media-saving event fee.
The run's default Key-Value Store is unnamed and follows your Apify account's data-retention settings. If you rename the store, it becomes named storage, which Apify retains indefinitely until you delete it; storage usage may still be charged while the data is retained. See the Apify Storage documentation for the current retention rules and pricing.
Profile outcomes and billing
Under the profile-based model, a unique, valid profile accepted for processing incurs one base fee once processing begins. The fee pays for the processing attempt and applies regardless of its outcome.
| Outcome | Dataset | Profile processing fee | Additional Story fee |
|---|---|---|---|
| Stories delivered | Story rows | Yes, once per profile | None |
Confirmed no_stories | Profile status row | Yes, once per profile | None |
| Not found | No row | Yes, if accepted and processing begins | None |
| Private / restricted | No row | Yes, if accepted and processing begins | None |
| Technical failure | No row, or already delivered partial rows | Yes, if processing begins | None |
| Invalid input rejected before processing | No row | No | None |
| Duplicate reference to the same profile in one run | No additional rows | No additional profile fee | None |
An empty or unsuccessful outcome does not refund the profile processing fee. Profiles that are rejected or never started are not processing attempts. Accepted profiles are counted after canonical duplicate removal.
A confirmed public profile without active Stories produces a profile_status record rather than a Story. For example, the following is an illustrative status record, not a captured live result:
{"record_type": "profile_status","status": "no_stories","reason": "no_active_stories","username": "example_creator","user_id": "123456789","profile_url": "https://www.instagram.com/example_creator/","story_count": 0}
The profile fee is the same whether the attempt returns zero, one, or many Stories. Partial delivery or technical failure does not remove that base fee. OCR and media saving add a fee for successful delivery; video transcription adds a fee for confirmed paid recognition, including no speech. A failed optional feature does not discard its core Story. Check the run summary for each profile's outcome.
Dataset views and run summary
Overview shows the record type, profile, main Story fields and optional results. Full Metadata preserves all of this Actor's public output fields as nested JSON; the name does not promise every possible Instagram metadata field. Marketing Signals focuses on mentions, links, music, reshared media and requested text/media results.
The run's OUTPUT record contains total counts and a final profiles[] summary. Each entry includes the submitted input, canonical username, user ID when known, final status/reason, delivered Story count, and confirmation of the profile processing charge. The summary can be SUCCEEDED, PARTIAL, or FAILED; check it even when the run has finished. One unavailable profile does not prevent other accepted profiles from completing.
Profile-based pricing and budget control
No per-Story fee. Pay once per unique Profile when processing starts. Core Story metadata is included, with rates as low as $4 per 1,000 profiles on Business.
| Apify plan | Profile processing | Per 1,000 |
|---|---|---|
| Free / No discount | $0.007 | $7.00 |
| Starter / Bronze discount | $0.005 | $5.00 |
| Scale / Silver discount | $0.0045 | $4.50 |
| Business / Gold discount | $0.004 | $4.00 |
On Starter, 100 unique profiles cost $0.50 in base Profile fees. Whether a profile returns zero, one, or many Stories, there is no additional per-Story Actor fee.
Each unique valid profile is charged once when processing starts, including attempts that find no Stories, cannot access or find the profile, or fail technically. Duplicate references within a run, invalid inputs, rejected batches, and profiles that cannot start because of the spending limit do not incur a processing fee. No processing starts if its charge cannot be confirmed.
Optional feature charges
Enable only the extra results you need. These add-ons are charged separately from the Profile fee. OCR and saving are billed on successful delivery; transcription is billed on confirmed paid recognition.
| Optional add-on | Free | Starter | Scale | Business | Billing unit |
|---|---|---|---|---|---|
| Image text | $0.005 | $0.005 | $0.005 | $0.005 | Per Story image with a successfully delivered OCR result |
| Video transcript | $0.015 | $0.012 | $0.011 | $0.010 | Per Story video with paid speech recognition performed, including no speech |
| Media saved | $0.005 | $0.005 | $0.005 | $0.005 | Per Story image/video successfully saved and delivered |
Video transcription is charged per video, not per minute. Successful OCR with empty text is still chargeable. Media saving is charged only after the actual copy is saved and its download link is delivered.
| Optional feature | Billing unit | Charged when | No optional fee when |
|---|---|---|---|
| Image text | Per Story image | Requested OCR succeeds and the result is delivered, including an empty text result | Disabled, skipped, or technically unsuccessful |
| Video transcript | Per Story video, not per minute | Paid speech recognition is confirmed, including no speech | Disabled, budget skipped, or failure without confirmed inference cost |
| Media saving | Per Story image or video | The file is saved and its link is delivered with the Story | Disabled, skipped, or saving fails |
A failed optional feature does not cancel the base profile fee. Optional charges depend on the work performed and the billing conditions above, so enable them only when needed. With all three options off, Story count does not add to the base processing charge. The Actor's Pricing tab currently shows Platform usage as Free for the Actor run, but this does not provide unlimited free post-run storage. The Media saved event covers the save operation; files retained afterward continue to use your Apify Storage and may incur standard storage charges according to your account and retention settings. See the Apify Storage documentation for current storage retention and pricing, and the Pricing tab for current Actor rates.
Use the run spending limit to control your budget and review the profile summary for the work actually started and delivered. A profile that is not started because the budget is insufficient does not incur a processing fee. An optional result can be null when its budget cannot be reserved.
Use cases for structured Story data
- Brand and creator monitoring: use the returned data for tracking public Story activity and changes across scheduled runs in your own monitoring workflow.
- Campaign monitoring: use the returned data for reviewing available mentions, link stickers, and partnership metadata alongside your campaign records.
- Promotion tracking: use the returned data for collecting literal OCR prices, discounts, and promo codes into your own comparison tools.
- Creator and competitor research: use the returned data for comparing available music, reshared Posts/Reels, and Story activity across profiles.
- Spoken-content workflows: use the returned data for searching or organizing original-language transcripts in your own tools.
- Authorized media archiving: use the returned data for archiving permitted Story media with
saveMediaand Apify storage, subject to your retention settings and standard Apify storage charges. - Automation and AI pipelines: use the returned data for n8n, Make, databases, and AI workflows that consume structured Story JSON; any downstream analysis is performed in your own tools.
API usage
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('lance_api/advanced-instagram-story-scraper').call({usernames: ['natgeo'],saveMedia: true,});// Read the first Dataset page; paginate for larger runs.const { items } = await client.dataset(run.defaultDatasetId).listItems();const summary = await client.keyValueStore(run.defaultKeyValueStoreId).getRecord('OUTPUT');console.log(items, summary?.value);
Python
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ['APIFY_TOKEN'])run = client.actor('lance_api/advanced-instagram-story-scraper').call(run_input={'usernames': ['natgeo'], 'saveMedia': True})items = list(client.dataset(run['defaultDatasetId']).iterate_items())summary = client.key_value_store(run['defaultKeyValueStoreId']).get_record('OUTPUT')print(items, summary['value'] if summary else None)
Use your own token and an account with access to the Actor. SDK calls wait for the run to finish before reading its results.
Limits and responsible use
Only currently accessible public Stories are supported. Availability and music permissions can change, media links can expire, and a fixed number of Stories or a historical archive is not guaranteed. Missing metadata is not proof that an Instagram feature was absent. Audio transcription depends on available speech. Image OCR can contain recognition errors; literal structured extraction deliberately leaves uncertain values empty.
Polls, questions, quizzes, countdowns, sliders, location/hashtag stickers, Story comments, video-frame OCR, semantic classifications and additional profile enrichment are outside this version.
Use data only where permitted and respect privacy, copyright, applicable law, and platform terms.
FAQ
Do I need Instagram login credentials?
No. Submit public usernames or profile URLs; no Instagram login, password, cookies, or session is required.
Can it scrape private Stories?
No. Private or otherwise restricted Stories are not delivered. Under the profile-based model, an accepted profile still incurs its processing fee if the attempt begins, even when access is restricted. The outcome appears in the run summary.
What happens when a public profile has no active Stories?
A confirmed empty public profile produces a profile_status row with status: "no_stories". The profile processing fee applies, with no additional Story fee. Technical failures also retain the profile processing fee but are not reported as confirmed empty results.
Does OCR work on video frames?
No. Image OCR processes image Stories only, not video frames or video thumbnails.
Does video transcription translate or summarize?
No. It returns recognized speech in its original language, with language information when reliably available. Translation and summarization are downstream tasks for your own tools.
Are Story media URLs permanent?
No. Original media links can expire or stop working. Use optional media saving for an authorized copy in Apify storage.
How long does saved media remain available?
Saved media is written to the run's default unnamed Apify Key-Value Store, so availability follows your account's data-retention policy. You can rename the store to make it named storage, which Apify retains indefinitely until you delete it. Retained storage is not necessarily free: standard Apify storage charges may apply based on usage and duration. See the Apify Storage documentation for current retention rules and pricing.
Are failed OCR, transcript, or media-save attempts charged?
OCR and media-save technical failures do not incur their optional fee. Video recognition is chargeable once performed, including no speech; technical failures are charged only with confirmed inference cost. Successful OCR with empty text is chargeable. These optional outcomes do not remove the base profile processing fee, and there is no separate per-Story fee under that model.
Why can Story counts differ between runs?
Stories are published, expire, are deleted, or become inaccessible between runs. Data availability can also affect delivery; review each profile's summary rather than assuming a fixed Story count. The base fee remains one charge per attempted profile, regardless of Story count.
What is included in Advanced Metadata?
Available Story identity and timestamps, image/video variants, owner identity, captions, mentions, links, music, reshared Posts/Reels, partnership information, selected creative details, and available platform-provided AI-label metadata. Fields can be null or empty, and unsupported interactive stickers and Story comments are not included. The Full Metadata view displays all public fields this Actor supports.
Support
Contact lanceapi2026@hotmail.com or open an issue on the Actor page. Include the Run ID, non-sensitive input, visible status/reason, and expected versus actual result.
Do not send Apify Tokens, Instagram cookies or sessions, passwords, API keys, proxy credentials, or Authorization headers.