Instagram Transcript API & Profile Scraper - AI Video to Text avatar

Instagram Transcript API & Profile Scraper - AI Video to Text

Pricing

from $4.99 / 1,000 results

Go to Apify Store
Instagram Transcript API & Profile Scraper - AI Video to Text

Instagram Transcript API & Profile Scraper - AI Video to Text

Instagram Transcript API & Profile Scraper extracts public profile details and converts video content into text transcripts. Collect captions, creator data, video metadata, and transcripts for content research, SEO, AI analysis, and lead generation.

Pricing

from $4.99 / 1,000 results

Rating

0.0

(0)

Developer

Scraper Engine

Scraper Engine

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Instagram Transcript API & Profile Scraper - AI Video to Text

Turn any public Instagram Reel or video URL into a clean, timestamped transcript, and turn any public username into structured post data — both as typed JSON. The Actor extracts text, segments, caption, likeCount, hashtags, and videoUrl with no login and no third-party transcription API. Transcription runs locally with Whisper AI, and profile posts are pulled straight from Instagram's public feed. Paste a URL or username below and start a run to see the dataset fill in live.

🤔 What is the Instagram Transcript API & Profile Scraper?

It is a dual-mode Apify Actor: point it at Reel/video URLs and it downloads the audio and transcribes it locally with Whisper AI; point it at usernames and it paginates that profile's public post feed into structured JSON. Both modes can run in the same job. No Instagram account, login, cookie, or API token is required for either flow — the transcript path is re-verified as zero-secret at the start of every run, and the profile flow pulls its session values from a public, unauthenticated page fetch. It's built for developers, AI/ML engineers, and researchers or marketers who need Instagram video and post data as clean JSON instead of scraping HTML by hand.

🔓 What Instagram data is publicly available to scrape?

Everything this Actor returns — Reel captions, engagement counts, media URLs, creator identity, and a profile's recent public posts — is visible to any logged-out visitor on instagram.com; nothing behind a login wall is accessed.

Data categoryPublicly available (no login)Restricted (requires login as the account)
Reel/video caption & spoken-audio transcriptCaption yes; transcript is generated locally by this Actor, not scraped from Instagram
Video/audio download URLsYes (videoUrl, audioUrl)
Creator identity (username, full name, avatar)Yes
Profile's recent public posts (caption, media, engagement)Yes, via the anonymous feed endpoint
Hashtags & @mentions in a captionYes (parsed from caption)
Pinned-post flagYes (post-level metadata)
Share/reshare countNot exposed at all by Instagram's anonymous feed API — this Actor reports 0 rather than guessing
Private-account posts, Stories, DMs, full follower/following listsYes — requires logging in as the account owner; this Actor never does this

This Actor only returns publicly visible data — what any visitor sees. Nothing behind a login wall.

📊 What data can I extract with this Actor?

Every run returns one dataset item per processed Reel/video or per scraped profile post, discriminated by an itemType field — the field groups below cover every key the Actor actually writes to the dataset, not just the default view columns.

🎬 Reel/video identity & media fields (transcript flow)

Field nameDescription
itemType"transcript" for a Reel/video record
urlThe input Reel/video URL
codeInstagram media shortcode
pkInstagram internal post ID
idInstagram media ID
titleThe post's caption text
imgThumbnail/preview image URL (only when includeImg is enabled)
videoUrlDirect progressive MP4 URL, highest resolution available
audioUrlDirect audio-only DASH track URL
userPkCreator's Instagram user ID
userNameCreator's username
userFullNameCreator's display name
avatarUriCreator's avatar image URL

⏱️ Reel/video engagement, transcript & timing fields

Field nameDescription
durationVideo duration in seconds
createTimePost creation time (Unix timestamp)
likeCountLike count
commentCountComment count
textFull transcript text, generated locally by Whisper AI
segmentsArray of {start, end, text} timestamped transcript segments (present when includeSegments is enabled — on by default)
errMsgEmpty string on success; otherwise the reason this Reel/video could not be transcribed
timestampWhen this record was processed, ISO 8601

👤 Profile post fields (usernames flow)

Field nameDescription
itemType"profile_post" for a profile-scrape record
id / pkInstagram post ID
typeImage, Video, or Album
shortCodeInstagram media shortcode
captionPost caption text
urlCanonical instagram.com/p/<code>/ post URL
commentsCountComment count
likeCountLike count
dimensionsHeight / dimensionsWidthMedia dimensions in pixels
displayUrlCover/display image URL
imagesArray of image URLs (Album posts only)
childPostsArray of carousel child items — type, dimensionsHeight, dimensionsWidth, displayUrl, alt, id, pk, plus videoUrl/videoDuration on video children
videoUrlDirect video URL (Video posts only)
audioUrlAlways "" for profile-post records — not carried over from the feed API by design
videoPlayCountVideo play count (Video posts only)
videoDurationVideo duration in seconds (Video posts only)
timestampPost creation time (Unix timestamp, as a string)
ownerId / ownerUsername / ownerFullName / ownerProfilePicUrlPost owner's identity fields
productTypeInstagram's internal product-type label for the post
isCommentsDisabledWhether comments are disabled on the post
inputUrlThe username/profile URL you requested that produced this row
altAccessibility alt text, if Instagram generated one
artist_name / song_nameAudio track artist/title, when the post carries music metadata
should_mute_audio / should_mute_audio_reasonInstagram's own audio-mute flag and reason, when present
audio_idAudio asset ID, when present
hashtags / mentionsArrays of #hashtag / @mention strings parsed out of caption
sharesCountOnly present when includeSharesCount is enabled; always 0 — not exposed by the anonymous feed API
errMsgEmpty string on success; populated once per username if that target could not be resolved or scraped at all

🤖 Add-on: Need similar data from other platforms?

This Actor is Instagram-only. If your pipeline spans other short-form video or profile platforms, the same account also publishes TikTok Posts Scraper and Best TikTok AI Transcript Extractor for TikTok, plus LinkedIn People Profile Scraper and Twitter X Profile Viewer for professional and X/Twitter profile data — all returning the same kind of typed, structured JSON.

🆚 How does this Actor differ from the official Instagram API?

Meta's Instagram Platform (Graph) API is scoped to the app user's own connected professional account, with only a few limited public endpoints, and requires Advanced Access plus business verification to serve accounts you don't own or manage — per Meta's Instagram Platform documentation (developers.facebook.com/docs/instagram-platform/overview, checked 2026-09-03). This Actor instead runs against any public Reel/video URL or public username you supply.

FeatureInstagram Graph APIThis Actor
Account type requiredInstagram professional (business/creator) accountNone — no Instagram account of any kind
Access to accounts you don't ownRequires Advanced Access + business verificationYes, for any public username, by default
App review processRequired for Advanced AccessNone — run immediately from the Store
Video/audio transcriptionNot offeredBuilt in, via local Whisper AI
SetupRegister a Meta developer app, link a professional account, request reviewProvide URLs/usernames and click Start
OutputVersioned Graph API JSON, scoped to granted permissionsStable typed JSON dataset, same shape every run

Use the Graph API when you manage the Instagram account yourself and need to publish, moderate, or read insights on your own content within Meta's terms. Use this Actor when you need transcripts of arbitrary public Reels or bulk public post metadata from accounts you don't manage.

🚀 How to use this Actor

This Actor runs on the Apify platform — there's no separate signup, API key, or Instagram login to obtain before your first run.

  1. Open Instagram Transcript API & Profile Scraper - AI Video to Text on its Apify Store page and click Try for free (or Run, if you already have it in your Console).
  2. Provide input: paste Reel/video URLs into bulkUrls (or one URL into videoUrl) for transcripts, and/or usernames into usernames for profile posts. No single field is strictly required by the schema — at least one of the three must be filled in, or the run exits with a warning and does nothing.
  3. Optionally set filters: resultsLimit and onlyPostsNewerThan for profile scraping, whisperModel and language for transcription, skipPinnedPosts to drop pinned posts.
  4. Click Start.
  5. Open the Output tab, pick a view (Overview / Transcripts / Transcript Segments / Profile Posts), and export the results as JSON or CSV.

Scaling to bulk transcript & profile extraction

Both entry points are array inputs, not single fields: bulkUrls accepts any number of Reel/video URLs one per line, and usernames accepts any number of usernames or profile URLs — both processed in the same run, up to the concurrency setting. On the FREE userTier, bulkUrls is capped at freeBulkUrlsLimit (default 5); set userTier to paid to remove that cap. There's no separate bulk-mode toggle — arrays are simply how bulk works.

🎯 What can you do with Instagram Reel & profile data?

  • A content repurposing editor uses text and segments from a Reel's transcript to auto-generate subtitles and blog drafts from video content, without re-watching every clip.
  • A competitor researcher uses caption, hashtags, and likeCount from usernames results to track a rival account's messaging and engagement trends over time.
  • A growth marketer uses videoPlayCount, videoDuration, and ownerUsername from profile posts to benchmark a creator's short-form video cadence.
  • A researcher building a text corpus uses text, userName, and createTime to compile a timestamped, citable dataset of spoken Reel content.
  • An AI engineer feeds text (transcript) and caption (profile post) into a RAG pipeline as retrievable context chunks, using url as the citation source — the typed JSON drops straight into a vector store or an agent's tool response with no HTML parsing.

🛡️ How does this Actor handle rate limits and blocking?

Every request starts with no proxy at all. If Instagram returns a block signal (HTTP 403/429), the Actor escalates through Apify Proxy tiers — no proxy → Datacenter → Residential — retrying once per tier before moving up; once it reaches Residential, it stays there for every remaining request in the run rather than retreating. Once already on Residential (or a user-supplied custom proxy), a further block is retried up to 3 more times on that tier before giving up on that item. Ordinary server errors (500/502/503/504) are retried up to maxRetries times with backoff, independent of the block-escalation ladder. A polite requestDelay (plus random jitter) is applied before every fetch. If a run hits 12 consecutive transport failures, it stops issuing new requests entirely — a signal of a dead network/proxy path, not empty results — while keeping whatever was already saved. Any Reel/video or profile that ultimately fails still produces a dataset record with a populated errMsg instead of silently vanishing from your results.

⬇️ Input

At least one of bulkUrls, videoUrl, or usernames should be filled in — none is individually required by the schema, but a run with all three empty exits immediately with a warning.

ParameterRequiredTypeDescriptionExample value
bulkUrlsNoarrayPublic Reel/video/post URLs to transcribe, one per line. FREE tier is capped at freeBulkUrlsLimit.["https://www.instagram.com/reel/DXtvzz7B3dC/"]
videoUrlNostringA single Reel/video/post URL for a quick test run alongside or instead of bulkUrls.""
userTierNostringDefault "free". Enum: "free", "paid". free caps bulkUrls at freeBulkUrlsLimit; paid removes the cap."free"
freeBulkUrlsLimitNointegerDefault 5, min 1, max 10000. Max bulkUrls processed per run on the FREE tier; extras are skipped with a log warning.5
usernamesNoarrayPublic usernames or profile URLs to scrape recent posts from. This mode returns post metadata only, no transcripts.["bbcnews"]
resultsLimitNointegerDefault 10, min 0. Stop collecting posts for a profile after this many; 0 means unlimited, subject to maxScanned.10
onlyPostsNewerThanNostringAccepts YYYY-MM-DD, a full ISO timestamp, or a relative value like 1 day / 2 weeks / 3 months / 1 year, evaluated in UTC. Empty = no date filter."2 weeks"
skipPinnedPostsNobooleanDefault false. Exclude posts pinned to the top of the profile grid.false
includeSharesCountNobooleanDefault false. Attempt a share/reshare count per post; Instagram's public feed does not expose it, so it is emitted as 0 with a log warning rather than guessed.false
maxScannedNointegerDefault 2000, min 50, max 20000. Hard ceiling on raw posts examined per username before giving up.2000
whisperModelNostringDefault "base". Enum: "tiny", "base", "small", "medium". Local speech-to-text model size — bigger is more accurate but slower."base"
languageNostringISO 639-1 code (e.g. en, es, fr) to force Whisper's spoken-language detection. Empty = auto-detect.""
includeSegmentsNobooleanDefault true. Include the full array of timestamped {start, end, text} transcript segments.true
includeImgNobooleanDefault false. Include a thumbnail/preview image URL per transcribed Reel/video.false
proxyConfigurationNoobjectDefault connects with no proxy; auto-escalates No proxy → Datacenter → Residential on a block, retried up to 3× on Residential. Can be set to force a tier.{"useApifyProxy": false}
concurrencyNointegerDefault 5, min 1, max 10. How many Reels/profiles are processed in parallel.5
requestDelayNonumberDefault 1.0, min 0, max 10. Delay in seconds (plus jitter) before every page fetch.1.0
maxRetriesNointegerDefault 3, min 1, max 10. Retries per request before giving up (each may also trigger a proxy escalation).3

Example input

{
"bulkUrls": ["https://www.instagram.com/reel/DXtvzz7B3dC/"],
"videoUrl": "",
"userTier": "free",
"freeBulkUrlsLimit": 5,
"usernames": ["bbcnews"],
"resultsLimit": 10,
"onlyPostsNewerThan": "2 weeks",
"skipPinnedPosts": false,
"includeSharesCount": false,
"maxScanned": 2000,
"whisperModel": "base",
"language": "",
"includeSegments": true,
"includeImg": false,
"proxyConfiguration": { "useApifyProxy": false },
"concurrency": 5,
"requestDelay": 1.0,
"maxRetries": 3
}

⬆️ Output

Every processed Reel/video or scraped profile post is pushed to the dataset the instant it's ready, as typed, normalized JSON — no batching, so an interrupted run still leaves a usable partial dataset. Browse it as one of four Console views (Overview, Transcripts, Transcript Segments, Profile Posts), the full unfiltered record set, or export the whole dataset as CSV.

Example output

Transcript-flow record:

{
"itemType": "transcript",
"url": "https://www.instagram.com/reel/DXtvzz7B3dC/",
"code": "DXtvzz7B3dC",
"pk": "3885972322121119554",
"id": "POLARIS_3885972322121119554",
"title": "A quick look behind the scenes of today's shoot...",
"img": "",
"videoUrl": "https://instagram.fxyz1-1.fna.fbcdn.net/o1/v/t2/f2/m86/reel.mp4",
"audioUrl": "https://instagram.fxyz1-1.fna.fbcdn.net/o1/v/t2/f2/m86/reel-audio.mp4",
"duration": 59.9,
"createTime": 1777464000,
"likeCount": 62114,
"commentCount": 6692,
"userPk": "1501333655",
"userName": "examplecreator",
"userFullName": "Example Creator",
"avatarUri": "https://scontent.cdninstagram.com/v/t51/example-avatar.jpg",
"text": "Excuse me, miss. This briefcase needs to get to the studio by six...",
"segments": [
{ "start": 0.3, "end": 1.16, "text": " Excuse me, miss." },
{ "start": 1.16, "end": 3.42, "text": " This briefcase needs to get to the studio by six." }
],
"errMsg": "",
"timestamp": "2026-09-03T10:00:00.000Z"
}

Profile-post record:

{
"itemType": "profile_post",
"id": "3976434829319475479",
"pk": "3976434829319475479",
"type": "Video",
"shortCode": "DcvImjCFBEX",
"caption": "Breaking coverage from the ground, more updates through the day. #BreakingNews #Live",
"url": "https://www.instagram.com/p/DcvImjCFBEX/",
"commentsCount": 35,
"dimensionsHeight": 1920,
"dimensionsWidth": 1080,
"displayUrl": "https://instagram.fxyz1-1.fna.fbcdn.net/o1/v/t2/f2/m86/cover.jpg",
"images": [],
"childPosts": [],
"videoUrl": "https://instagram.fxyz1-1.fna.fbcdn.net/o1/v/t2/f2/m86/post.mp4",
"audioUrl": "",
"likeCount": 1306,
"timestamp": "1788248045",
"ownerId": "16278726",
"ownerUsername": "bbcnews",
"ownerFullName": "BBC News",
"ownerProfilePicUrl": "https://scontent.cdninstagram.com/v/t51/bbc-avatar.jpg",
"productType": "clips",
"isCommentsDisabled": false,
"inputUrl": "bbcnews",
"alt": "",
"videoPlayCount": 214500,
"videoDuration": 42.3,
"artist_name": "",
"song_name": "",
"should_mute_audio": false,
"should_mute_audio_reason": "",
"audio_id": "",
"hashtags": ["#BreakingNews", "#Live"],
"mentions": [],
"errMsg": ""
}

⚙️ How does it work?

For transcripts, the Actor fetches the Reel/post page with a browser-impersonated HTTP client — no headless browser — because the page already carries a server-rendered JSON blob with the media URLs, caption, and engagement counts. It downloads the audio track and transcribes it locally with Whisper AI (faster-whisper, running on CPU); nothing is sent to a third-party transcription service. For profiles, it paginates Instagram's own public, anonymous post-feed endpoint page by page, applying your date/pinned filters. Both parsers locate data by shape (recursively, by key names) rather than a fixed DOM path or array index, so the output schema stays stable even if Instagram reshuffles its page structure. Only publicly visible data is ever returned.

🔌 Integrations

This Actor is a standard Apify Actor, so it works with everything already built around the Apify platform: the API/SDK for your own code, Apify's MCP server for AI agents, and no-code automation tools.

Calling this Actor programmatically

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("<YOUR_APIFY_USERNAME>/instagram-transcript-profile-scraper").call(
run_input={
"bulkUrls": ["https://www.instagram.com/reel/DXtvzz7B3dC/"],
"usernames": ["bbcnews"],
"resultsLimit": 10,
}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

Works in Go, Ruby, Node.js, cURL — any language that can make an HTTP request.

MCP integration for AI agents

This Actor is callable through Apify's MCP server without any code of its own. Point an MCP client at https://mcp.apify.com (OAuth sign-in, or a bearer token in the Authorization header) and scope it to this Actor with ?tools=<your-apify-username>/instagram-transcript-profile-scraper. Compatible with any MCP-aware client, including Claude Desktop and Claude Code.

No-code tools (n8n, Make, LangChain)

In n8n, call this Actor's run-sync endpoint with the HTTP Request node (or Apify's own node) to drop transcripts and profile posts straight into your workflow. In Make, use Apify's Run Actor module inside a scenario to trigger a run and pass its dataset items to the next step. In LangChain, wrap the Actor as a tool via Apify's LangChain integration (ApifyWrapper) so an agent can request a transcript or profile scrape as part of its own reasoning loop.

Scraping publicly available data is generally lawful, and this Actor only returns data any logged-out visitor can already see on instagram.com — it never accesses private accounts or bypasses a login. Because profile-post records include personal data (usernames, full names, avatar images, captions), GDPR and CCPA govern how you may store and use that data if your users or use case fall under those regimes — you need a lawful basis for collection and a defined retention/use policy, not just the ability to fetch it. ⚠️ Consult legal counsel if your use case involves bulk storage of personal data.

❓ Frequently asked questions

What Instagram fields does this Actor return?

The top fields are text and segments for transcripts, and caption, likeCount, and hashtags for profile posts — see the full field tables above for everything else the Actor writes.

Does this Actor require an Instagram account or login?

No. Neither flow needs a login, cookie, or API token — the transcript path is re-verified as zero-secret at the start of every run, and the profile flow gets its session values from an unauthenticated public page fetch.

How many Reels or profiles can I process in one run?

bulkUrls and usernames both accept arrays, so you can queue as many as you like in one job; on the FREE userTier, bulkUrls is capped at freeBulkUrlsLimit (default 5) — switch to paid for an unlimited bulk list. Posts per username are separately capped by resultsLimit (default 10, or 0 for unlimited up to maxScanned).

What happens if a Reel is private, deleted, or not found?

The record is still saved, with errMsg set to something like "Media not found or not public" and every other field left empty — the item is never silently dropped from your dataset.

What happens if a profile is private, doesn't exist, or has no matching posts?

If the username can't be parsed or no session token could be obtained, one error record is returned with errMsg populated. If the profile is valid but simply has 0 posts matching your date/pinned filters, no records are returned for that username and the run log notes it.

Can I scrape multiple Instagram Reels and profiles at once?

Yes — bulkUrls and usernames are both list inputs, and every entry across both is processed within the same job, subject to the concurrency setting.

Does this Actor work with Claude, ChatGPT, and other AI agent tools?

Yes. It's reachable through Apify's MCP server (https://mcp.apify.com) for MCP-aware clients, and callable as a plain HTTP endpoint by any agent framework that can make a REST call.

Does this Actor use a third-party transcription API?

No. Transcription runs locally with faster-whisper inside the Actor's own container — no external transcription service is called and no separate API key is needed for it.

Does this Actor return data in a format LLMs can use directly?

Yes. Every record is typed, normalized JSON with consistent field names across runs — no HTML parsing or selectors involved. Pass it directly to an LLM, index it into a vector store, or feed it to an agent tool.

What happens when Instagram changes its layout or anti-bot system?

Both parsers locate data by shape (key names, not fixed positions), so a reshuffled page structure often doesn't break extraction. The Actor also re-checks the zero-secret transcript path at the start of every run and logs a warning if Instagram starts embedding signed-request token signatures, so a real breaking change surfaces in the run log rather than silently.

Can I use this Actor without managing proxies or browser infrastructure?

Yes. There's no headless browser to configure, and proxy tier selection and escalation (No proxy → Datacenter → Residential) is handled automatically — you can still force a specific tier through proxyConfiguration if you want to.

Which fields work best for AI training data and RAG indexing?

For RAG, index text (transcript flow) and caption (profile-post flow) as your retrievable content, with url as the citation source. For training data, userName/ownerUsername, likeCount, and timestamp return as consistently typed primitives across every record.

ScraperWhat it extracts
Best TikTok AI Transcript ExtractorLocal AI transcripts from public TikTok videos
TikTok Posts ScraperPublic TikTok profile posts and engagement metadata
TikTok Keyword Search ScraperTikTok search results by keyword
LinkedIn People Profile ScraperPublic LinkedIn profile data
Twitter X Profile ViewerPublic X/Twitter profile data

🛟 Your feedback

Found a bug or missing a field? Email dev.scraperengine@gmail.com with your run ID and what you expected — this Actor is actively maintained and field-level reports are the fastest way to get something fixed or added.