# Instagram Reel Script Extractor — Voice, On-Screen Text & Hooks (`afanasenko/instagram-reel-script-extractor`) Actor

Extract Instagram reel transcripts, on-screen text, hooks, calls to action and structure — word for word, including silent music-only reels where audio-only tools return nothing. Paste reel links, or a handle for a creator's whole catalog. Export to CSV, JSON or Excel, run via API.

- **URL**: https://apify.com/afanasenko/instagram-reel-script-extractor.md
- **Developed by:** [Andrey Afanasenko](https://apify.com/afanasenko) (community)
- **Categories:** Social media, AI, Marketing
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $66.00 / 1,000 reels

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Instagram Reel Script Extractor — Voice, On-Screen Text & Hooks

[![Apify Actor](https://apify.com/actor-badge?actor=afanasenko/instagram-reel-script-extractor)](https://apify.com/afanasenko/instagram-reel-script-extractor)

> **Get what an Instagram reel actually contains — the spoken script, the text burned into the frame, the hook it opens with, and how it is built.**
> For content strategists, agencies and creators who need the *script*, not the caption. Works on silent music-only reels, where audio-only transcript tools return an empty string.

> **🆓 Free to start:** no card beyond your Apify account — leave the input empty, press Start, and the actor analyzes 3 real reels of a sample creator, capped so the trial stays cheap · Apify's Free plan includes $5 of monthly platform credit, around 66 reels here · every run also lists, ranked by views, the reels it did **not** analyze, so you always know what is still there.

### 🎯 What it does

Most Instagram tools read the **caption**. The caption is what the creator wrote afterwards. This actor reads the **video**: the audio track and the frames, in one pass.

| You get | Why it matters |
|---|---|
| **Spoken transcript**, word for word, never translated | The actual script, not a paraphrase |
| **On-screen text**, one entry per distinct card | Recipe quantities, prices, step numbers, code, URLs — usually the most valuable text in the reel, and invisible to audio-only tools |
| **Hook**, spoken and on-screen, plus the second it ends | The first three seconds decide the reel |
| **Hook type** as a closed value | `question`, `bold_claim`, `listicle`, `contrarian`, … — sortable, groupable, countable |
| **Structure** — beats with timestamps | `hook → context → proof → cta`, with the second each one starts |
| **Call to action**, verbatim and typed | What the creator actually asks for |
| **Format**, topics, summary, takeaways, named entities, language | The row a swipe file is built from |
| **Views vs this creator's median**, and an outlier flag | Measured, from real view counts — never an invented "virality score" |

**The one thing nothing else on the Store does:** a reel with no speech at all still returns a full row. Music-only recipes, text-on-screen listicles, silent tutorials — the whole category where the information lives in the frame rather than the audio.

### 📦 Output sample

One real row, exactly as the actor produced it. A reel with **3.8 million views in which nobody says a single word** — the whole tip is written on screen:

```json
{
  "url": "https://www.instagram.com/reel/DXuciRbjX2O/",
  "shortcode": "DXuciRbjX2O",
  "username": "buzzfeedtasty",
  "postedAt": "2026-04-29T19:30:07.000Z",
  "durationSeconds": 8.2,
  "postType": "reel",
  "caption": "Pre-shredded cheese is super convenient—but for the best results, it's actually worth giving it a quick rinse first! 🧀",
  "viewCount": 3842084,
  "likeCount": 15023,
  "commentCount": 800,
  "thumbnailUrl": "https://scontent-lax3-2.cdninstagram.com/v/t51.82787-15/…",
  "analysisStatus": "analyzed",
  "error": null,

  "hookSpoken": null,
  "hookOnScreen": "wash your pre-shredded cheese",
  "hookType": "how_to",
  "hookEndSeconds": 2,

  "spokenTranscript": null,
  "hasSpeech": false,
  "wordsPerMinute": null,
  "onScreenText": [
    "wash your pre-shredded cheese",
    "to remove anti-caking agents",
    "washed",
    "unwashed"
  ],
  "onScreenTextCount": 4,
  "onScreenTextIsCaptionsOnly": false,

  "beats": [
    { "startSeconds": 0, "label": "hook",    "text": "Washing pre-shredded cheese" },
    { "startSeconds": 2, "label": "context", "text": "Explaining the purpose of washing cheese to remove anti-caking agents" },
    { "startSeconds": 4, "label": "demo",    "text": "Comparing the melt of washed vs. unwashed cheese in grilled sandwiches" },
    { "startSeconds": 6, "label": "outro",   "text": "Reiterating the cheese washing process" }
  ],

  "cta": null,
  "ctaType": "none",
  "contentFormat": "how_to_demo",
  "topics": ["pre-shredded cheese", "anti-caking agents", "grilled cheese", "cheese melting", "kitchen hack", "cooking tips"],
  "summary": "This video demonstrates a kitchen hack of washing pre-shredded cheese. It explains that washing removes anti-caking agents, which can interfere with the cheese's melting quality. A visual comparison shows that washed cheese melts and stretches significantly better in a grilled cheese sandwich than unwashed cheese.",
  "takeaways": [
    "Pre-shredded cheese contains anti-caking agents.",
    "Washing pre-shredded cheese can remove these anti-caking agents.",
    "Washing pre-shredded cheese improves its melting and stretching properties for dishes like grilled cheese."
  ],
  "entities": [],
  "language": "en",
  "visualNotes": "The video shows a person washing pre-shredded cheese in a colander, then straining it to reveal milky water. It then presents a side-by-side comparison of two grilled cheese sandwiches, one made with washed cheese and one with unwashed cheese, demonstrating the superior melt and stretch of the washed cheese.",

  "viewsVsCreatorMedian": 4.24,
  "isOutlier": true,
  "qualityFlag": "ok",
  "qualityNote": null,
  "processedAt": "2026-07-30T06:12:04.072Z"
}
```

*Only the thumbnail signature is shortened above; every other value is verbatim.*

An audio-only transcript tool returns `{"transcript": ""}` for this reel. **The instruction, the reason behind it and the before-and-after labels only ever existed in the frame** — and this one reel beat its creator's median by 4.2×.

### ⚡ Quick start

1. Open the actor and leave the input **empty**.
2. Press **Start**. The demo run analyzes 3 real reels of a sample creator — capped at 3 to keep it cheap, about $0.23, which your free monthly credit covers.
3. Look at the **🔥 Hook Board** link in the run's Output tab.

Then run it for real:

- **One reel or a handful** → paste links into **Reel links**.
- **A whole creator** → put their handle into **Creator handles**. Fill in one field or the other, never both.

### ⭐ Choose your mode

#### 🎯 Mode 1: Break down specific reels

Paste reel links or shortcodes. One row per reel. Use this when a client sends you five links, when you want to check a single competitor post, or when you are calling the actor from a script.

#### 🎯 Mode 2: Break down a creator's reels

Give a public handle. Before spending anything on analysis, the run reads that creator's recent catalog, works out their **median view count**, and only then analyzes the reels you asked for — sorted by top-performing unless you say otherwise. That is where `viewsVsCreatorMedian` and the outlier flag come from, and it is why the Hook Board can tell you which openings actually beat this creator's own average.

### 🧭 When to use it

- **Building a swipe file.** Forty reels from three competitors, grouped by hook type, sorted by how far they beat the creator's median.
- **Reverse-engineering a format.** The beat timeline shows how long the hook runs, where proof lands, and when the ask arrives.
- **Writing scripts.** Export the transcripts of everything that outperformed and paste them into your writing tool: *"Here are 40 hooks from @handle that beat their median. Write 10 more in the same voice."*
- **Auditing your own account.** Which of your openings work, in your own numbers, not a scoring model's.
- **Cataloguing recipe, checklist and price content**, where the substance is burned into the frame and no audio tool can reach it.
- **Transcribing reels in bulk.** Speech-to-text on the audio and text read straight off the frames, in the same pass — a list of links comes back as text, including the burned-in subtitles a creator added by hand.
- **Researching UGC and ad creative.** What a brand's paid creators actually open with, how they phrase the ask, and which of those reels beat that creator's own median.
- **Vetting an influencer before you pay them.** What they say on camera, how they close, and whether their best reel is an outlier or their normal.
- **Reporting to a client.** One row per reel — transcript, hook, call to action and the multiple of the median in the same table, instead of a folder of screenshots.

### 🎯 Example tasks

Ready-to-run examples — each opens a pre-configured task you can run in one click (no setup):

- **[Extract the script from an Instagram reel](https://apify.com/afanasenko/instagram-reel-script-extractor/examples/extract-the-script-from-an-instagram-reel)** — Paste a reel link and get the spoken script word for word, plus the text on screen, the hook it opens with and the call to action.
- **[Transcribe an Instagram reel to text](https://apify.com/afanasenko/instagram-reel-script-extractor/examples/transcribe-an-instagram-reel-to-text)** — Turn a reel into readable text. Every word said out loud, plus anything written on screen that the audio never says.
- **[Get the words from an Instagram video](https://apify.com/afanasenko/instagram-reel-script-extractor/examples/get-the-words-from-an-instagram-video)** — Every word in a reel, spoken and written. Works on videos up to three minutes, and on the ones where nobody says anything at all.
- **[Get the on-screen text from an Instagram video](https://apify.com/afanasenko/instagram-reel-script-extractor/examples/get-the-on-screen-text-from-an-instagram-video)** — Read the text burned into the frame — steps, captions, prices, lists — in the order it appears. Audio-only tools cannot see any of it.
- **[Read the text in a reel with no sound](https://apify.com/afanasenko/instagram-reel-script-extractor/examples/read-the-text-in-a-reel-with-no-sound)** — Silent reels still say plenty. Get every line written on screen, in order, from videos where nobody speaks a single word.
- **[Extract text from a music-only Instagram reel](https://apify.com/afanasenko/instagram-reel-script-extractor/examples/extract-text-from-a-music-only-instagram-reel)** — Music playing, nobody talking, everything written on screen. Get the on-screen lines, the hook and how the reel is put together.
- **[Find the hooks that work for any Instagram creator](https://apify.com/afanasenko/instagram-reel-script-extractor/examples/find-the-hooks-that-work-for-any-instagram-creator)** — Give a handle. Get their reels ranked by how far each one beat their own median views, with the exact opening line of every one.
- **[See how a creator opens their best reels](https://apify.com/afanasenko/instagram-reel-script-extractor/examples/see-how-a-creator-opens-their-best-reels)** — The first seconds of a creator's biggest reels, written out: the spoken hook, the on-screen hook, and which kind of opening each one is.
- **[Find the call to action in top reels](https://apify.com/afanasenko/instagram-reel-script-extractor/examples/find-the-call-to-action-in-top-reels)** — What a creator actually asks for at the end of their best reels — save, follow, comment, link — and how far each reel beat their median.
- **[Build a swipe file from a competitor's reels](https://apify.com/afanasenko/instagram-reel-script-extractor/examples/build-a-swipe-file-from-a-competitors-reels)** — One row per reel: script, on-screen text, hook, structure and result. Paste a handle and get a working swipe file in minutes.
- **[Break down a creator's top performing reels](https://apify.com/afanasenko/instagram-reel-script-extractor/examples/break-down-a-creators-top-performing-reels)** — Their biggest reels taken apart: what was said, what was written on screen, how it opened, how it closed, how far it beat their median.
- **[Compare reel formats for any Instagram account](https://apify.com/afanasenko/instagram-reel-script-extractor/examples/compare-reel-formats-for-any-instagram-account)** — Talking head, voiceover, silent how-to, skit — see which format an account uses for its best reels, and how each one performed.

### 🛠 Input

| Field | Mode | Type | Default | Notes |
|---|---|---|---|---|
| `reelUrls` | 1 | array | — | Reel links or bare shortcodes. Share links do not carry a post id — copy the `/reel/` URL from a browser. |
| `maxItemsMode1` | 1 | integer | 50 | Stops after this many reels. |
| `usernames` | 2 | array | — | Public handles, without the `@`. |
| `sortBy` | 2 | select | `Top performing` | Or `Newest`. |
| `postedWithinDays` | 2 | integer | — | Leave empty for the whole catalog. |
| `minViews` | 2 | integer | — | Leave empty to include everything. |
| `maxItemsMode2` | 2 | integer | 50 | Per handle. Reels beyond the limit are still listed, ranked by views. |

**Pick your mode first.** Fields belonging to the other mode are ignored: if `reelUrls` has anything in it, the run is Mode 1 and every Mode 2 field is skipped.

### 💰 How much will analyzing Instagram reels cost?

**$0.075 per reel on every plan, including the free one**, dropping to **$0.06** at the highest volume tiers. Any length up to 3 minutes — there is no per-minute surcharge, so a 3-minute tutorial costs the same as a 15-second hook.

| Plan | Per reel | 50 reels |
|---|---|---|
| Free | $0.075 | — |
| Bronze | $0.075 | $3.75 |
| Silver | $0.070 | $3.50 |
| Gold | $0.066 | $3.30 |
| Platinum | $0.063 | $3.15 |
| Diamond | $0.060 | $3.00 |

Plans differ in how much you can run, not in what a reel costs. The demo run on empty input is capped at 3 reels — about $0.23 — so trying the actor stays cheap, and there is no limit on how often you run it.

**You are only charged for reels that were actually analyzed.** Private, deleted, photo, carousel, longer-than-3-minute, expired-link and failed reels are delivered as free rows with the reason in the `error` column. Results the built-in quality check flags as low-quality are delivered too — and also not charged.

### 🆓 Free vs paid plan

| | Free | Paid |
|---|---|---|
| Price per reel | $0.075 | $0.075 → $0.060 |
| Reels per run | 5 (Mode 1: 3) | your `maxItems` |
| Creators per run | 1 | unlimited |
| Runs per month | 15 | unlimited |
| Which reels Mode 2 picks | the **top 5 by views** | your `sortBy` |
| Every field, full transcript, full on-screen text | ✅ | ✅ |
| Hook Board and the pattern tables | ✅ | ✅ |
| Ranked list of what was not analyzed | ✅ | ✅ |
| Demo run on empty input | 3 reels (~$0.23), unlimited | 3 reels, unlimited |

Free rows are **not trimmed** — they are the same complete rows a paid run produces, at the same price per reel. What the free plan limits is how much you can do at once: five reels from one creator per run, fifteen runs a month, and the allowance resets on the 1st. A free Mode 2 run deliberately analyzes the creator's five *best* reels rather than their five most recent, because five great hooks is the most useful five rows we can hand over.

### 🧪 Filter recipes

- **What works for this creator right now** → handle + `postedWithinDays: 90` + `sortBy: Top performing` + `maxItemsMode2: 30`.
- **Their greatest hits, ever** → handle + `minViews: 100000`.
- **A fair read of their recent baseline** → handle + `sortBy: Newest` + `postedWithinDays: 30`.
- **A competitor set** → three handles + `maxItemsMode2: 20`. Every reel is scored against **its own creator's** median, so the comparison holds across accounts of different sizes.

### 🔁 Resume / checkpoint

Runs survive interruption. A migrating or aborted run records which reels it already finished, so resuming never re-analyzes a reel or charges for it twice. Everything finished before the interruption is already in the dataset — rows are pushed as each reel completes, not held to the end.

### 📡 Live status & storage records

| Record | What is in it |
|---|---|
| **🔥 Hook Board** (`status.html`) | Live progress while the run works, then: which hooks, formats and calls to action outperform for this creator; every analyzed reel as a card ranked by its multiple of the creator's median; and a CSS timeline of each reel's structure |
| `RUN_SUMMARY` | Status, counts, the creator's median views, duration, notes |
| `NOT_ANALYZED` | Every reel in the catalog this run did not analyze, ranked by views, with URL, length, date and multiple of the median |
| `USER_MESSAGE` | Plain-language account of what happened and what to do next — always written when a run returns no reels |
| `API_USAGE` | Upstream request count and approximate cost, by endpoint |
| `FREE_LIMITS_APPLIED` | Which free-plan caps applied, with the message shown |

### 🤖 Programmatic / API use

```bash
curl -X POST "https://api.apify.com/v2/acts/afanasenko~instagram-reel-script-extractor/runs?token=$APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"usernames":["mattmurphyai"],"maxItemsMode2":20,"sortBy":"Top performing"}'
```

Read the results:

```bash
curl "https://api.apify.com/v2/actor-runs/$RUN_ID/dataset/items"
curl "https://api.apify.com/v2/actor-runs/$RUN_ID/key-value-store/records/NOT_ANALYZED"
curl "https://api.apify.com/v2/actor-runs/$RUN_ID/key-value-store/records/USER_MESSAGE"
```

Every classification field is a closed set of values, so downstream code can switch on them without string matching. Every run writes `USER_MESSAGE`, so a script never has to guess why a run returned nothing.

### 💡 Tips & Best Practices

- **Sort by `viewsVsCreatorMedian`, then group by `hookType`.** That single move is what turns 40 rows into a content strategy.
- **`onScreenTextIsCaptionsOnly` tells you whether the burned-in text is worth reading.** When it is `true`, the creator only subtitled themselves; when it is `false`, the frame carries something the audio does not.
- **Scan wide, analyze narrow.** Reading a creator's catalog metadata is roughly 400× cheaper than analyzing a reel, so a large `postedWithinDays` window with a small `maxItemsMode2` costs almost nothing extra and gives a far better median.
- **Watch `qualityFlag`.** A `suspect` row means the built-in check caught the model repeating itself. Those rows are free, and `qualityNote` says exactly what was collapsed or dropped.
- **Reels only.** Carousels and photos come back as `not_video` rows with full metadata, free. If a creator posts mostly carousels, you will see that immediately rather than getting an empty run.

### ❓ FAQ

**Q: Does it work on reels with no talking?**
A: Yes — that is the main reason to use it. A silent, music-only reel returns `hasSpeech: false`, an empty `spokenTranscript`, and the complete on-screen text, hook, beats and call to action. Audio-only transcript tools return an empty string for these.

**Q: How do I get the text that is burned into an Instagram video?**
A: Run this actor on the reel link. `onScreenText` gives one entry per distinct card or slide. Word-by-word caption animations are collapsed to their final form, so you get the sentence once rather than twelve growing fragments of it.

**Q: Is there a free way to try it?**
A: Yes. Leave the input empty and press Start — the demo run analyzes 3 real reels of a sample creator, capped at 3 so it costs about $0.23, and there is no limit on how often you run it. Apify's Free plan includes $5 of monthly credit, so the trial costs you nothing out of pocket. When you switch to your own accounts, the free plan analyzes 5 reels per run, from one creator, up to 15 runs a calendar month, with every field included and at the same price per reel as a paid plan. The allowance resets on the 1st.

**Q: Can I use the Instagram API instead?**
A: Instagram's own API returns your own media and its caption. It does not transcribe audio, it does not read text burned into video frames, and it gives you nothing about accounts you do not own. This actor works on any public account.

**Q: What are the alternatives to an Instagram transcript tool?**
A: Plain transcript actors give you the spoken words and stop there. If your content is talking-head with no on-screen text, they are cheaper. If you care about hooks, structure, on-screen text, or anything silent, they return either nothing or only half the reel.

**Q: Is this speech-to-text, or OCR, or both?**
A: Both, in one pass. The audio track becomes `spokenTranscript`. The frames are read separately for text drawn on them — prices, quantities, step numbers, lists, URLs, code — and that lands in `onScreenText`. A video-to-text tool that only listens returns an empty string for a silent reel; this one still returns the whole frame.

**Q: Can I export the transcript as an SRT or VTT subtitle file?**
A: No. The transcript arrives as text in `spokenTranscript`, without word-level timings, so it is not a subtitle track you can burn in. What *is* timed is the shape of the reel: every beat in `structure` carries the second it starts, and `hookEndSeconds` marks where the opening ends — enough to line a script up against the video, not enough to build captions from.

**Q: Does it read the caption under the post, or Instagram's auto-captions?**
A: The written caption comes back in `caption`, because it is useful context — but nothing in the analysis depends on it, and Instagram's own auto-generated closed captions are not used at all. `spokenTranscript` is read from the audio and `onScreenText` from the frames, so a reel whose caption says nothing still returns a full row.

**Q: Does it translate?**
A: Never. The transcript and the on-screen text stay in the original language, mixed languages included, exactly as spoken and written. `language` reports what was detected.

**Q: Are song lyrics transcribed?**
A: No. A backing music track is not speech, so a reel whose only audio is a song returns an empty `spokenTranscript` and `hasSpeech: false`.

**Q: Why is there a 3-minute limit?**
A: 3 minutes is Instagram's own maximum length for a Reel. Longer posts are video or IGTV; they come back as free `too_long` rows with their metadata intact.

**Q: What if a reel errors out mid-run?**
A: It becomes a free row with `analysisStatus` naming the cause and `error` explaining it in plain words. Everything else in the run continues. Expired video links are re-resolved and retried once automatically.

**Q: Why do some rows have no `viewsVsCreatorMedian`?**
A: That column only exists in Mode 2, where the run has read the creator's catalog and can compute a real median. In Mode 1 there is nothing to compare against, and an invented baseline would be worse than an empty column.

**Q: How do I find which hooks work for a competitor?**
A: Run Mode 2 on their handle with `sortBy: Top performing`, then open the **🔥 Hook Board** in the run's Output tab. It groups every analyzed reel by hook type, format and call to action, and shows the average multiple of that creator's median each group achieved. On a recipe account we tested, `how_to_demo` reels averaged 5.8× the creator's median; on a software account, four of the top five reels opened with a warning rather than a question.

**Q: Can I analyze a reel that is longer than 3 minutes?**
A: Not in this actor. Instagram caps Reels at 3 minutes, and posts above that are video or IGTV — they come back as free `too_long` rows carrying full metadata, so you can see them and decide separately.

**Q: Does it download or store the videos?**
A: No. Each video is fetched, analyzed and discarded within the run. Nothing is kept, and you are not charged for bandwidth by the megabyte.

### 🔗 Other related actors (same author)

This actor is part of a family of focused tools — pick the one that matches your discovery model:

| You start with… | You want to find… | Use this actor |
|---|---|---|
| A reel link or a creator handle | What the reels actually say, show and ask for | **This actor** |
| A handle, keyword or location | Profiles with bio, contacts and engagement | [Instagram Profile Scraper](https://apify.com/afanasenko/instagram-profile-scraper) |
| A handle | Who follows that account | [Instagram Followers Scraper](https://apify.com/afanasenko/instagram-followers-scraper) |
| A handle | Similar accounts to it | [Instagram Related Profiles Scraper](https://apify.com/afanasenko/instagram-related-profiles-scraper) |
| A handle you want to watch | Who joined and who left, over time | [Instagram Follower Tracker & Monitor](https://apify.com/afanasenko/instagram-follower-tracker) |
| An AI agent (Claude, Cursor, ChatGPT) | The same Instagram profile data from inside your agent — MCP tools it picks by intent | [Instagram Profile MCP Server](https://apify.com/afanasenko/instagram-profile-scraper-mcp-server) |

Start from a profile scraper when you are looking for **accounts**; start here when you already know the accounts and want to know **what their content does**.

### 🛟 Support & feedback

- **Open an issue** on the actor's [Issues tab in Apify Console](https://console.apify.com/actors/DJX17GeCbe3K2LPvS/issues) — fastest way to get a fix shipped.
- **Feature requests** in the same tab; we read every one.
- **Ratings & reviews** on the [Apify Store page](https://apify.com/afanasenko/instagram-reel-script-extractor) help other users find the actor.

### ⚖️ Is it legal to scrape Instagram?

Yes — the actor reads **publicly available** posts from public Instagram accounts and does not log in, bypass authentication, access private content, or interact with anything on your behalf. Videos are downloaded, analyzed and discarded; nothing is stored. Use it in compliance with Instagram's Terms of Service and applicable privacy laws (GDPR, CCPA).

# Actor input Schema

## `reelUrls` (type: `array`):

Paste one or more reel links, or just their shortcodes. Leave this empty to use Mode 2 instead.

## `maxItemsMode1` (type: `integer`):

Stops after this many reels, so a long list cannot cost more than you expect.

## `usernames` (type: `array`):

One or more public Instagram handles, without the @.

## `sortBy` (type: `string`):

Top performing starts with the creator's biggest reels, which is what you want when you are looking for what works.

## `postedWithinDays` (type: `integer`):

Leave empty to search the whole catalog.

## `minViews` (type: `integer`):

Leave empty to include every reel.

## `maxItemsMode2` (type: `integer`):

Stops after this many reels per handle. Reels beyond the limit are still listed, ranked by views, so you can see what was left.

## Actor input object example

```json
{
  "reelUrls": [],
  "maxItemsMode1": 50,
  "usernames": [],
  "sortBy": "Top performing",
  "maxItemsMode2": 50
}
```

# Actor output Schema

## `liveStatus` (type: `string`):

No description

## `results` (type: `string`):

No description

## `scripts` (type: `string`):

No description

## `runSummary` (type: `string`):

No description

## `notAnalyzed` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "reelUrls": [],
    "usernames": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("afanasenko/instagram-reel-script-extractor").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "reelUrls": [],
    "usernames": [],
}

# Run the Actor and wait for it to finish
run = client.actor("afanasenko/instagram-reel-script-extractor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "reelUrls": [],
  "usernames": []
}' |
apify call afanasenko/instagram-reel-script-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=afanasenko/instagram-reel-script-extractor",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/DJX17GeCbe3K2LPvS/builds/gMVr6uUvEwEtGkV1d/openapi.json
