# Instagram Reel Scraper⚡ (`premiumscraper/instagram-reel-scraper`) Actor

Instagram Reel Scraper returns Reel view-play counts, likes, comment counts, caption, audio type, can reply, can reshare, can see insights as brand, can view more preview comments, can viewer reshare, can viewer save, caption, caption data, caption is edited, carousel media count, client cache key.

- **URL**: https://apify.com/premiumscraper/instagram-reel-scraper.md
- **Developed by:** [Premium Scraper](https://apify.com/premiumscraper) (community)
- **Categories:** Social media, Developer tools, Automation
- **Stats:** 16 total users, 9 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 reels

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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 Scraper** pulls public reel data out of Instagram and hands it back as clean, ready-to-use rows. The instagram reel scraper takes what you paste in, works through it one item at a time, and writes every result straight to your dataset as it goes.

### 🌟 What You Get

What the **instagram reel scraper** brings back is public reel information out of Instagram, arranged as a table for your spreadsheet or served over the API. Each row is stored the instant it is finished, which keeps a long job from being all or nothing.

This instagram reel scraper does one job on one platform and nothing else. You are better served by a single-purpose instagram reel downloader than by a jack-of-all-trades that handles ten sites poorly, because here the fields match what Instagram genuinely publishes.

- Only what is **already public** is read by the instagram reel scraper, never anything behind a login.
- Every row carries its origin along with it, so you can verify any result you like.
- Nothing waits for the end of the run; each result is handed over the moment it turns up, ready to be used.
- Stop a run whenever you like; whatever it had gathered by that moment stays with you.

### 🙋 Who This Is For

- **Marketers and researchers** — bring Instagram reel data into a sheet so you can spot trends there, rather than working through pages one click at a time
- **Agencies** — put client reporting on Instagram reel activity together without any of the manual effort
- **Analysts and data teams** — set a recurring timetable that delivers Instagram reel rows to a dashboard or a database
- **Creators** — follow how their reel content is performing and hold on to a record of their own output
- **Developers** — reach it through the API and receive tidy reel rows in return, leaving you no page reading of your own to look after

Instagram reel data is far more useful in a spreadsheet than in a browser tab, and that is exactly what you get from value from this instagram reel scraper. Pull it once by hand or leave it on a schedule behind a dashboard; the and the instagram data scraper output does not change between the two.

### 💬 What People Use It For

- Gathering Instagram reel data into a spreadsheet you can research or report from.
- Holding a copy of your own, so the reel information is still there for you if the original page is altered.
- Tracking reel activity over the longer term with by running the instagram reel scraper on a schedule.
- Lining up a few accounts or sources next to one another in a single table.
- Handing Instagram reel rows onward to a dashboard, a database or some other tool.
- Reviewing your own reel presence, then exporting what you find for a client report.

Those are the usual ones. The instagram reel scraper hands you a plain table, so anything a spreadsheet can do, it can do to these results, the next it into another instagram reel extractor step included.

### 🏆 Why This One

Getting the data right on the first attempt is what the instagram reel scraper was written for. Anyone who has been burned by any have tried a instagram reel extractor that came back with half-empty rows will care about the differences below.

| What comes back | Why it helps you |
|---|---|
| Complete rows | You get every field the Instagram page puts on public view, not some cut-down handful. |
| Rows you can see early | Results reach the dataset while the run is still going, not just once it wraps up. |
| Messages in plain English | When something is off, you are told what it is and how to put it right. |
| No alarming red errors | You get an explanation, the faulty link is set aside, and the run carries on. |
| A storage name you choose | Keeps every run's output apart, so you can find it again later. |

Nothing here is guesswork. Where a field has not been published, the instagram reel scraper leaves it blank instead of inventing a value, because an instagram reel export tool that stuffs its rows with filler is worse company than one that admits what is missing.
Five Instagram reels can be copied out by hand; fifty cannot. The instagram reel scraper clears away precisely the part of the work that refuses to scale.

| The manual approach | With this tool |
|---|---|
| Visiting each page and copying every field | One paste of your list, and a table comes back |
| Typos and blank fields creep in | Each row is completed the same way on every run |
| No way to tell when it was gathered | Each run is dated and saved for you |
| Repeating it means doing it again | Put a instagram reel downloader on a schedule and it repeats itself |
| Just you and one window at a time | Works away quietly while you get on with other things |

The larger your list, the more you feel the difference. Across ten items a instagram reel extractor hands you back an afternoon; across a thousand it decides whether the work happens at all or simply never gets done.

### 🎛️ Your Settings, Explained

Every setting the instagram reel scraper offers has a place in this list. Nothing has been kept back, and no entry here points to a setting the actor has since removed.

| Option | Control type | Starting value | Its purpose |
|---|---|---|---|
| **Instagram Username(s)** | text list | everything | Enter one or more Instagram usernames such as nba, natgeo, or cristiano. |
| **Instagram URLs** | link list | everything | Add one or more Instagram profile URLs, reels-tab profile URLs, or direct reel URLs. |
| **Reels Per Profile** | number box | `10` | How many public reels to return for each profile input. |
| **Region** | dropdown | `US` | Choose the Region used for this run for public Instagram requests. |
| **Skip Pinned Reels** | toggle | off | Turn on to skip pinned reels. |
| **Skip Trial Reels** | toggle | off | Turn on to skip trial/test reels. |
| **Extract Reels That Are Newer Than** | text box | not set | Only keep profile reels created on or after this date. |
| **Include Comments ($)** | toggle | off | Turn on to collect public comments for each returned reel. Extra charge per comment returned. |
| **Comments Limit Per Reel** | number box | `20` | Maximum number of comments to return per reel when comment collection is enabled. |
| **Store Reels & Music in Storage ($)** | toggle | off | If ON, the highest-quality reel video and its audio/music track are downloaded and saved to Apify Key-Value Storage with permanent non-expiring public download URLs. Charged per media asset saved. |
| **Key-Value Store Name / Prefix** | text box | not set | Enter a custom Key-Value Store Name (e.g. `Cristiano` or `my-store_1`). |

Filling in every box is optional. Defaults are enough to get the instagram reel scraper going, and each setting is there to tighten or loosen the results. Leave a box blank and to let the instagram reel downloader will cover the lot.

### 📦 What Lands in Your Dataset

You get one row per item back from the instagram reel scraper. Every row carries the fields listed here.

| Field | Type | What you will find in it |
|---|---|---|
| `saved_audio_urls` | list | The audio on its own link. If the site publishes none, it is taken out of the video for you. |
| `saved_video_urls` | list | Your own copies of the video — every quality the site offered — on links that do not expire. |
| `technical_data` | object | Machine-only values kept out of the way — tracking blobs and internal ids. Grouped into one column so the results table stays readable. Nothing is lost, it is one level deeper. |
| `accessibility_caption` | text | **The accessibility caption for this item. One row per result.** |
| `are_remixes_crosspostable` | text | The are remixes crosspostable exactly as it is published. |
| `audio_type` | text | The audio type exactly as it is published. |
| `can_reply` | text | The can reply exactly as it is published. |
| `can_reshare` | text | The can reshare exactly as it is published. |
| `can_see_insights_as_brand` | text | The can see insights as brand exactly as it is published. |
| `can_view_more_preview_comments` | list | The can view more preview comments exactly as it is published. |
| `can_viewer_reshare` | text | The can viewer reshare exactly as it is published. |
| `can_viewer_save` | text | The can viewer save exactly as it is published. |
| `caption` | text | Taken straight from the page, unchanged. |
| `caption_data` | text | The caption data exactly as it is published. |
| `caption_is_edited` | text | The caption is edited exactly as it is published. |
| `carousel_media_count` | number | The carousel media count, as published at the time of the run. |
| `client_cache_key` | text | Inside `technical_data`. The client cache key exactly as it is published. |
| `clips_metadata` | text | The clips metadata exactly as it is published. |
| `clips_tab_pinned_user_ids` | text | The clips tab pinned user ids exactly as it is published. |
| `coauthor_producer_can_see_organic_insights` | text | The coauthor producer can see organic insights exactly as it is published. |
| `coauthor_producers` | text | The coauthor producers exactly as it is published. |
| `code` | text | Taken straight from the page, unchanged. |
| `collaborator_edit_eligibility` | text | The collaborator edit eligibility exactly as it is published. |
| `comment_count` | number | The comment count, as published at the time of the run. |
| `comment_inform_treatment` | text | The comment inform treatment exactly as it is published. |
| `commenting_disabled_for_viewer` | text | The commenting disabled for viewer exactly as it is published. |
| `comments_connection` | list | The comments connection exactly as it is published. |
| `comments_disabled` | list | The comments disabled exactly as it is published. |
| `created_at` | text | The created at exactly as it is published. |
| `deleted_reason` | text | The deleted reason exactly as it is published. |
| `detail_source` | text | The detail source exactly as it is published. |
| `device_timestamp` | text | The device timestamp exactly as it is published. |
| `disable_caption_and_comment` | text | The disable caption and comment exactly as it is published. |
| `display_uri` | text | The display uri exactly as it is published. |
| `display_url` | text | The display url, so every row can be traced back to its source. |
| `eligible_insights_entrypoints` | text | The eligible insights entrypoints exactly as it is published. |
| `enable_media_notes_production` | text | The enable media notes production exactly as it is published. |
| `engagement_counts_hidden` | number | The engagement counts hidden, as published at the time of the run. |
| `fb_like_count` | number | The fb like count, as published at the time of the run. |
| `fb_play_count` | number | The fb play count, as published at the time of the run. |
| `fbid` | text | Taken straight from the page, unchanged. |
| `filter_type` | text | The filter type exactly as it is published. |
| `gen_ai_detection_method` | text | The gen ai detection method exactly as it is published. |
| `has_audio` | on / off | True when the item is marked as has audio. |
| `has_delayed_metadata` | on / off | True when the item is marked as has delayed metadata. |
| `has_liked` | on / off | True when the item is marked as has liked. |
| `has_privately_liked` | on / off | True when the item is marked as has privately liked. |
| `has_shared_to_fb` | on / off | True when the item is marked as has shared to fb. |
| `has_tagged_users` | on / off | True when the item is marked as has tagged users. |
| `has_viewer_saved` | on / off | True when the item is marked as has viewer saved. |
| `has_views_fetching` | number | The has views fetching, as published at the time of the run. |
| `hidden_likes_string_variant` | number | The hidden likes string variant, as published at the time of the run. |
| `hide_view_all_comment_entrypoint` | text | The hide view all comment entrypoint exactly as it is published. |
| `id` | text | The reference the platform uses for this item. |
| `ig_media_sharing_disabled` | text | The ig media sharing disabled exactly as it is published. |
| `ig_play_count` | number | The ig play count, as published at the time of the run. |
| `image_versions2` | text | The image versions2 exactly as it is published. |
| `integrity_review_decision` | text | The integrity review decision exactly as it is published. |
| `is_affiliate_commission_eligible` | on / off | True when the item is marked as affiliate commission eligible. |
| `is_artist_pick` | on / off | True when the item is marked as artist pick. |
| `is_comments_gif_composer_enabled` | on / off | True when the item is marked as comments gif composer enabled. |
| `is_cutout_sticker_allowed` | on / off | True when the item is marked as cutout sticker allowed. |
| `is_dash_eligible` | on / off | True when the item is marked as dash eligible. |
| `is_eligible_content_for_post_roll_ad` | on / off | True when the item is marked as eligible content for post roll ad. |
| `is_eligible_for_autodub` | on / off | True when the item is marked as eligible for autodub. |
| `is_eligible_for_autodub_upsell` | on / off | True when the item is marked as eligible for autodub upsell. |
| `is_eligible_for_organic_eager_refresh` | on / off | True when the item is marked as eligible for organic eager refresh. |
| `is_eligible_for_poe` | on / off | True when the item is marked as eligible for poe. |
| `is_eligible_for_poe_premium` | on / off | True when the item is marked as eligible for poe premium. |
| `is_eligible_for_rta` | on / off | True when the item is marked as eligible for rta. |
| `is_in_profile_grid` | on / off | True when the item is marked as in profile grid. |
| `is_meta_ai_invocation_blocked_by_author` | on / off | True when the item is marked as meta ai invocation blocked by author. |
| `is_open_to_public_submission` | on / off | True when the item is marked as open to public submission. |
| `is_organic_product_tagging_eligible` | on / off | True when the item is marked as organic product tagging eligible. |
| `is_paid_partnership` | on / off | True when the item is marked as paid partnership. |
| `is_photo_comments_composer_enabled_for_author` | on / off | True when the item is marked as photo comments composer enabled for author. |
| `is_pinned` | on / off | True when the item is marked as pinned. |
| `is_post_live_clips_media` | on / off | True when the item is marked as post live clips media. |
| `is_quiet_post` | on / off | True when the item is marked as quiet post. |
| `is_reshare_of_text_post_app_media_in_ig` | on / off | True when the item is marked as reshare of text post app media in ig. |
| `is_reuse_allowed` | on / off | True when the item is marked as reuse allowed. |
| `is_short_drama` | on / off | True when the item is marked as short drama. |
| `is_social_ufi_disabled` | on / off | True when the item is marked as social ufi disabled. |
| `is_tagged_media_shared_to_viewer_profile_grid` | on / off | True when the item is marked as tagged media shared to viewer profile grid. |
| `is_third_party_downloads_eligible` | on / off | True when the item is marked as third party downloads eligible. |
| `is_trial_reel` | on / off | True when the item is marked as trial reel. |
| `is_video` | on / off | True when the item is marked as video. |
| `is_visual_reply_commenter_notice_enabled` | on / off | True when the item is marked as visual reply commenter notice enabled. |
| `lat` | text | Taken straight from the page, unchanged. |
| `like_and_view_counts_disabled` | number | The like and view counts disabled, as published at the time of the run. |
| `like_count` | number | The like count, just as it stood when the run took place. |
| `lng` | text | Taken straight from the page, unchanged. |
| `location` | text | Taken straight from the page, unchanged. |
| `media_cropping_info` | text | The media cropping info exactly as it is published. |
| `media_id` | text | The media id used by the platform to identify this item. |
| `media_repost_count` | number | The media repost count, as published at the time of the run. |
| `media_reposter_bottomsheet_enabled` | text | The media reposter bottomsheet enabled exactly as it is published. |
| `media_type` | text | The media type exactly as it is published. |
| `music_info` | text | The music info exactly as it is published. |
| `number` | number | What was showing when your run took place. |
| `number_of_qualities` | number | The number of qualities, as published at the time of the run. |
| `original_height` | number | The original height, as published at the time of the run. |
| `original_lang_for_translations` | text | The original lang for translations exactly as it is published. |
| `original_width` | number | The original width, as published at the time of the run. |
| `owner` | text | Taken straight from the page, unchanged. |
| `photo_of_you` | text | The photo of you exactly as it is published. |
| `pinned_position` | text | The pinned position exactly as it is published. |
| `pk` | text | Taken straight from the page, unchanged. |
| `play_count` | number | The play count, as published at the time of the run. |
| `post_url` | text | The post url, so every row can be traced back to its source. |
| `premium_reaction_count` | number | The premium reaction count, as published at the time of the run. |
| `product_type` | text | The product type exactly as it is published. |
| `profile_grid_control_enabled` | text | The profile grid control enabled exactly as it is published. |
| `profile_url` | text | The profile url, giving you a way to trace any row back to where it came from. |
| `reel_type` | text | The reel type exactly as it is published. |
| `reel_url` | text | The reel url, so every row can be traced back to its source. |
| `related_ads_pivots_media_info` | text | The related ads pivots media info exactly as it is published. |
| `related_ads_pivots_response` | text | The related ads pivots response exactly as it is published. |
| `related_topic_pills` | text | The related topic pills exactly as it is published. |
| `share_count` | number | The share count, as published at the time of the run. |
| `share_count_disabled` | number | The share count disabled, as published at the time of the run. |
| `sharing_friction_info` | text | The sharing friction info exactly as it is published. |
| `shortcode` | text | Taken straight from the page, unchanged. |
| `should_request_ads` | text | The should request ads exactly as it is published. |
| `should_show_author_pog_for_tagged_media_shared_to_profile_grid` | text | The should show author pog for tagged media shared to profile grid exactly as it is published. |
| `sponsor_tags` | text | The sponsor tags exactly as it is published. |
| `strong_id` | text | The strong id used by the platform to identify this item. |
| `strong_id__` | text | The strong id   used by the platform to identify this item. |
| `subscribe_cta_visible` | text | The subscribe cta visible exactly as it is published. |
| `subtype_name_for_REST__` | text | The subtype name for REST   exactly as it is published. |
| `taken_at` | text | The taken at exactly as it is published. |
| `timeline_pinned_user_ids` | text | The timeline pinned user ids exactly as it is published. |
| `translated_langs_for_autodub` | text | The translated langs for autodub exactly as it is published. |
| `user` | text | Taken straight from the page, unchanged. |
| `usertags` | text | Taken straight from the page, unchanged. |
| `video_dash_manifest` | text | The video dash manifest exactly as it is published. |
| `video_duration` | number | The video duration, as published at the time of the run. |
| `video_sticker_locales` | text | The video sticker locales exactly as it is published. |
| `video_url` | text | The video url, giving you a way to trace any row back to where it came from. |
| `video_versions` | text | The video versions exactly as it is published. |
| `view_count` | number | The view count, just as it stood when the run took place. |
| `view_state_item_type` | text | The view state item type exactly as it is published. |

From the dataset tab you can take your the instagram reel scraper results away as CSV, Excel, JSON or XML, or read them directly through the API. Where Instagram publishes nothing for an item, that field stays empty, and you will never find a guess in its place.

### 💾 Permanent Download Links

A media address published by the source site is signed and short-lived — export a few hundred rows today and most of those links are dead tomorrow. Switch the storage options on and every asset is fetched once and re-published at an address that keeps working after the run has finished.

**⚠️ Please read this before turning it on.** Saving copies is not free — it costs you time and money. When it is switched on, the actor waits to download each media file **before** it writes that result, so your run will take noticeably longer, and just how much longer comes down to how big and how long the media is. One large video on its own can add several minutes. You will also use more proxy bandwidth, and that is charged separately from the per-file fee.

**If speed matters most to you, leave this switched off.** Your results already include the source links — the only catch is that those links stop working after a few hours. Saving copies is there for when you need a link that keeps working, and you do not mind waiting a little for it.

**🧠 Please raise the memory before you switch this on.** With more memory the downloads finish faster and far fewer runs stall or fail. If you only change one thing, change this — when a run hangs or dies on a large video, it is almost always because it did not have enough memory.

While a file is coming down the log stays quiet, unless it really is being slow. Once a file passes 30 seconds, your run tells you what it is fetching and how long it has been waiting, so you never have to wonder whether the actor has frozen.

**What you pay.** Each saved file costs the same flat amount no matter what it is — an image costs you exactly what a video does, and if one result carries two files, that is two charges. You are charged nothing while the option is off, nothing when a download does not succeed, and nothing for any of the technical-detail options, which are always free.

**What this adds to your results.** Your original address is left untouched — nothing is overwritten. You simply get one more field next to it:

| Field | Type | What you will find in it |
|---|---|---|
| `kvs_video_download_url` | text | Permanent non-expiring download link for the highest-resolution MP4 video stored in Key-Value Store. |
| `kvs_music_download_url` | text | Permanent non-expiring download link for the companion MP3 music/audio track stored in Key-Value Store. |
| `storage_mode` | object | Complete storage payload containing store name, store ID, video dimensions, file keys, and audio extraction sources. |

**Choosing a name for your storage.** Give your run a name and everything it saves is gathered under that name, so one job's files never get mixed up with another's. If you leave it empty, the files simply stay with the run. You can use letters, numbers, hyphens and underscores, up to 63 characters — anything else is flagged in the log and your run continues without a name rather than stopping.

### ▶️ Running It

1. Launch the instagram reel scraper and put whatever it should cover into the box at the top.
2. Fine-tune whichever of the settings listed above you need, or move straight on without touching any of them.
3. Hit **Start** and follow the log — it keeps you posted on progress from beginning to end.
4. Head to the **Dataset** tab once the first rows start showing up.
5. Take the results away in CSV, Excel, JSON or XML form, or fetch them through the API.

Try a first run on two or three items and you will see whether quickly whether the instagram reel scraper brings back what you were hoping for. Push the volume up when you feel comfortable, since the instagram reel export tool behaves just the same at any size.

### 🧳 Before Your First Run

- Give your list a quick look to be sure it covers what you intend. The instagram reel scraper will explain anything it cannot use, though a tidy list will finish sooner.
- Work out first whether you need the full picture or only a sample, then set your limits to suit.
- Choose a storage name if you expect to run this again.
- Put a ceiling on what any one run may cost when the job is a big one, and a instagram data scraper job holds no surprises.
- Kick off with a small test. That settles quickly whether to confirm the instagram reel scraper returns what you want.

Five steps in, the instagram reel downloader is set for serious use, and none of the setup has to be repeated on later runs.
Give the instagram reel scraper a target and it has everything it needs. Paste that target in, click Start, and rows begin landing in your dataset well before the run has finished.

1. Drop your list into the first field.
2. Press **Start**.
3. Switch to the **Dataset** tab while rows come in.

Beyond this, the page is all refinement. The defaults mean chosen so the instagram reel scraper does the right thing with no configuring at all, and a instagram reel downloader you never adjust will still return complete rows.

Should something not make sense to you, or should the instagram reel extractor hand back results you were not expecting, your quickest path to an answer is the support section further down.

### 🎚️ Picking the Right Settings

Sensible defaults come built into the instagram reel scraper, so the quickest way in is to paste your input and hit Start. Once you want a firmer hand on the results, the settings below are the ones that shift the outcome most.

**Limits.** Any limit you set is a trade: completeness on one hand, time and cost on the other. A small ceiling has limit on the instagram reel scraper return a quick sample; a larger one fills in the whole picture. Try small first, look the rows over, and then go bigger.

**Toggles.** What each toggle does is add a further set of fields, or a further step. Skip it and off makes the instagram reel scraper finishes sooner; use it and the results carry more detail. Nothing is ever enabled that you did not ask for.

**Storage name.** Hand a run its own storage name and everything it saves stays walled off from every other run, which is worth doing when you use you use the instagram reel downloader regularly and want last week's output kept clear of today's.

**Region.** Wherever that setting is on offer, your choice of region governs which variant of a page gets read. If the haul looks thinner than you expected, moving to a different region is normally the quickest thing to try with a instagram reel extractor.

### 💎 Getting More From It

- **Paste it in just as it is.** The instagram reel scraper takes whatever you hand over and explains anything it cannot work with, so tidying your list beforehand is not something you need to do.
- **Re-run rather than retry by hand.** When a source drops out for a moment, simply starting the instagram data scraper over again will normally sort it for you.
- **Work in smaller batches.** A handful of modest runs is far easier to review than one giant one, and every run holds on to its own dataset.
- **Compare across time.** Put the same instagram reel scraper on a schedule and it will show you what changed, something one export on its own can never do.
- **Export sooner rather than later.** Rows are saved as they arrive, so the export from a instagram reel downloader run can be exported before it has finished.
- **Open narrow, then broaden.** A brief run proves the instagram reel scraper is set up exactly as you want.
- **Give storage a name.** Assign each run a storage name of its own, and its files will never mix with another run's.
- **Set it on a timer.** Let it go automatically, and each pass adds a new dataset with the time it was taken.
- **Keep an eye on the log.** The instagram reel scraper reports each thing it is doing, so even a slow run can be seen making progress.
- **Give each run a maximum cost** whenever a large job needs a firm ceiling.

Most people take the instagram data scraper output straight on into a spreadsheet or a database, and since the column names never shift from one run to the next, an import you set up once will carry on working.

### 📶 Bigger Jobs

The instagram reel scraper was designed for repeat use rather than a single outing. Rows appear while the run is still going, so a big job is useful to you before it ends, and a job that stops early is never a write-off.

1. **Begin with a tiny run.** Two or three are plenty to prove items confirm the instagram reel scraper is configured just as you meant.
2. **Cap the spend.** Attach a maximum cost to each run and a sizeable job holds no surprises.
3. **Put it on a schedule.** Every scheduled run leaves its own dataset behind, so your history grows on its own.
4. **Collect by API.** Bring each dataset directly across into whatever system you work in, taken from the instagram reel export tool output.
5. **Keep an eye on the log.** Progress keeps updating throughout, so a lengthy run never leaves you wondering whether it has stalled.

You are only charged for what the instagram reel scraper actually returns, so a run that turns up nothing costs you nothing. That makes it perfectly safe to aim at a wide list and let it work out what really exists.

### 💷 What It Costs

Billing follows the rows the instagram reel scraper genuinely hands over, so a result with nothing in it is free. Throw a broad list at it without worry, and the actor will establish which entries are real.

- Apply a **maximum cost per run** if a sizeable job calls for a firm upper limit.
- Once the ceiling is reached the run closes down neatly, and everything gathered before that point is kept.
- You are only ever billed for rows that actually arrived, which keeps the cost of a instagram reel extractor run easy for you to forecast.
- A limit in the settings trims the work before the run even begins, and that is the cheaper way to stay in control.
- Stopping a run does not spoil it; it still counts as successful, and the rows remain yours.

With a ceiling on the whole run plus the caps you set for each one, you can size a instagram reel export tool job right down or right up and still know exactly what you are in for.

### 🧺 Keeping Your Results Tidy

Every run of the instagram reel scraper puts its results in a separate dataset, so one run never wipes out another. Keep to a handful of habits and the runs can accumulate without becoming a nuisance.

- Label each run's storage with something that describes what it covered, and your instagram reel export tool archive will still make sense to you later.
- Send it directly to CSV or Excel if someone will be reading it.
- Where a program is going to read the results, take them as JSON through the API, which is how the instagram data scraper is most often wired up.
- Hold on to the source field. It is what allows a row to be verified months down the line.
- Put a date on your exports. The instagram reel scraper captures what was public at that moment, and public data keeps moving.

When the job comes round regularly, setting a spreadsheet or the database at the instagram reel downloader output up once and letting it refresh itself usually beats exporting by hand.

### 🔎 A Real Example

Rows from the instagram reel scraper hands over turn up in the order they were found. Load them into a spreadsheet and the layout is plain: a line per item, a column per field, ready to sort or filter without any cleanup beforehand.

- **Stable columns.** You get an identical set of fields every time, which means an import you saved earlier, or a instagram reel export tool pipeline you built, will not break on you.
- **Every row is checkable.** The address a row came from travels alongside it, so if a result looks odd you can open it and confirm it yourself.
- **Honest gaps.** If Instagram has published nothing, the field arrives empty. The instagram reel scraper will not invent a value just to make a row look finished.
- **Repeats are merged.** Entries that show up more than once are folded together, so listing the same item twice will not cost you twice.

Roll those together and what makes the instagram reel scraper stops being a one-time export and starts being a source you can rely on. Columns that drift between runs make instagram data scraper useless to any automation.

### 🚧 What It Will Not Do

- Whatever the instagram reel scraper hands back was **already published in public** before it got there. No private material, no pages sitting behind a login, no account required of you.
- What comes back reflects what a source has actually made public. Where a source is sparse or newly created, you will see fewer rows, and you are told as much rather than having the list padded out.
- Missing values are never guessed at by the instagram reel scraper. An empty field simply means the platform published nothing there.
- Nothing protected is worked around, and you only ever receive what any visitor who is not signed in could view.
- How you put the results to work is your call and your responsibility: GDPR, CAN-SPAM, CCPA, PECR and whichever local rules cover your situation all still apply.

### 🩹 Messy Input

Plenty of tools throw away an entire run because one entry was bad. The instagram reel scraper takes a gentler approach: your entries are all checked before any collecting begins, and anything it cannot use gets its own line in the report, telling you the reason, what that box will accept, and what it will not.

| The entry you pasted | How it gets handled |
|---|---|
| A link that belongs to some other site | You are told which site it points to; that one is left out and the rest go ahead |
| Plain wording typed into a link box | You are told a link is needed, with an example to follow |
| An empty line | Passed over without fuss, and noted in the summary |
| Nothing at all worth keeping | You are given the reason, and the run still ends successfully rather than in red |

That behaviour is why is why a instagram reel downloader run is safe to put on a schedule. A single dead link among two hundred costs you that one link, never the whole run, and the instagram reel scraper always names the entry involved.

Should the source shift underneath you or the connection drop partway through, the instagram reel scraper stops with a brief note, holds on to every row already gathered, and still closes as a successful run. By contrast, instagram reel extractor that crashed outright would take the rows you have already paid for with it.

### 🔧 If Something Goes Wrong

The same few causes are behind most problems. Whichever one it is, the instagram reel scraper spells it out in the log, and the remedies are below.

**Your run completed with an empty result.**
In most cases the input you gave pointed somewhere private, or somewhere that has since disappeared. The instagram reel scraper lists every skipped entry alongside the reason, so your log names the culprit for you. Try opening the address while signed out of the site: if it is not visible to you, it is not visible to neither can a instagram reel downloader.

**You expected more rows than you received.**
Look at the limit in your settings first — that is normally the answer. Raise it, rerun, and if the total still falls short, the source simply does not publish as much as you thought; and the instagram reel scraper shows what genuinely exists instead of inflating the count.

**Some of your entries were passed over.**
Consider it is the instagram reel scraper protecting your run. Each entry that was passed over appears in the report with the fault and with what that box expects. Put those right and send just them through again, since a instagram reel extractor run is inexpensive while the list stays short.

**Your run ended sooner than planned.**
This points to one of two things: your cost limit was hit, or the source stopped responding. Either way you get told in ordinary words, and whatever had already been gathered is safely stored. A second pass with the instagram reel export tool normally finishes the job.

**This week's results differ from last week's.**
Public data does not sit still. The instagram reel scraper captures what was published at the moment of the run, which is precisely why running a instagram data scraper on a schedule serves you better than one export taken once.

### 🤔 Questions People Ask

**Does the Instagram Reel Scraper need a Instagram login or password?**

No. Pages that are already public are all the instagram reel scraper ever reads, so there is no account or password to supply and you will never be asked for one.

**How big a list can results can the instagram reel scraper return?**

However many the source has made public. If you would rather a run wrapped up sooner, or you want the spend to stay predictable, put a cap in the limit settings.

**What if the link you paste is the wrong sort?**

You are told which entry was at fault and what that box will accept, and the instagram reel scraper skips that one alone. Everything else keeps going, and the run still finishes successfully.

**Can the export the instagram reel scraper results go into Excel or CSV?**

Yes. Each run builds up a dataset, and from there the results come out as CSV, Excel, JSON or XML, or straight through the API.

**What if a run comes to a halt midway?**

Whatever had been collected by then is already safe. Because the instagram reel scraper saves each row the moment it appears, a run that stops early still leaves you with data you can use, plus a message telling you what went on.

**Is there a way to run the instagram reel scraper automatically?**

Yes. Set a schedule and every run leaves behind a dataset of its own, so a history builds up for you with no further effort.

**Does the data from the instagram reel scraper give accurate data?**

What you receive mirrors whatever Instagram had on display the moment the run took place. Nothing gets made up on your behalf; where a field is not published, you get a blank back instead of an estimate.

### 🔤 Plain-Word Glossary

| Term | How we use it here |
|---|---|
| Run | One execution of the instagram reel scraper, with its own dataset and log. |
| Dataset | Where the results collect as a table, ready to take away as a file or pull in through the API. |
| Row | A single item, with everything known about it kept on one line. |
| Field | Any single column making up a row, a title or an address for instance. |
| Storage | Files that come down during a run are held here, on an account belonging to you. |
| Storage name | A label you choose so one instagram reel downloader run's files stay separate. |
| Limit | The point at which a run stops taking on more, so both time and cost stay in hand. |
| Schedule | A timer you set that starts the instagram reel extractor on your behalf and holds on to each result. |

Nothing here is unique to this particular actor; the platform leans on the same vocabulary right across its tools, so whatever you pick up now carries straight over to the next instagram reel export tool you decide to run.

### 🛡️ Your Data

- Reading public pages and writing rows into your dataset is all the instagram reel scraper does. Nothing more.
- The list you paste serves that one run only, and nothing is retained afterwards.
- Downloads sit in storage that belongs to your account alone, reached by links with no sign-in details attached.
- You will never be asked to hand over an account, a password or a personal login for the instagram data scraper.
- Ownership of the results sits with you: take them elsewhere, wipe them, or leave them where they are indefinitely.

The data goes three places with path for the instagram reel scraper and no further: in from you, out of public pages, into your dataset. A demand for your account credentials would put instagram reel downloader outside that path, and this one never makes such a demand.

### 🧷 Related Tools

If the **instagram reel scraper** has earned its place for you, the ones below handle neighbouring jobs. Each is built around its own source instead of stretching to cover everything poorly.

- [Instagram Comment Scraper](https://apify.com/premiumscraper/Instagram-Comment-Scraper) — Instagram data, exported the same way.
- [Instagram Highlight Scraper](https://apify.com/premiumscraper/Instagram-Highlight-Scraper) — Instagram data, exported the same way.
- [Instagram Post Scraper](https://apify.com/premiumscraper/Instagram-Post-Scraper) — Instagram data, exported the same way.
- [Instagram Profile Scraper](https://apify.com/premiumscraper/Instagram-Profile-Scraper) — Instagram data, exported the same way.
- [Instagram Tagged Post Scraper](https://apify.com/premiumscraper/Instagram-Tagged-Post-Scraper) — Instagram data, exported the same way.

Browse everything at [apify.com/premiumscraper](https://apify.com/premiumscraper).

### ✉️ Get in Touch

Questions about the **instagram reel scraper**, a bug, or a filter you would like added? Email **premiumscraper@gmail.com** and you will get a reply.

Where the instagram reel scraper did not give you what you expected, pass along the run ID, since that alone is usually enough to work out what happened.

Feature requests are welcome. You can reach the team at **premiumscraper@gmail.com** for anything at all — a question before you buy, or a source you would like covered next.

# Actor input Schema

## `username` (type: `array`):

Enter one or more Instagram usernames such as nba, natgeo, or cristiano. Each username is automatically converted into a profile URL and scraped through the public reels tab.

## `instagram_urls` (type: `array`):

Add one or more Instagram profile URLs, reels-tab profile URLs, or direct reel URLs. Supported formats:
• Username: nba
• Profile URL: https://www.instagram.com/nba/
• Reels tab URL: https://www.instagram.com/nba/reels/
• Direct reel URL: https://www.instagram.com/reel/DYFIVfYM4ib/

Profile inputs use the public reels clips API paging flow. Direct reel URLs are scraped from the public reel page.

## `reels_count` (type: `integer`):

How many public reels to return for each profile input. This applies only to profile scraping, not direct reel URLs. If fewer public reels are available, the output clearly shows the requested and returned totals.

## `proxyCountry` (type: `string`):

Choose the Region used for this run for public Instagram requests. US is recommended for the broadest public coverage.

## `skip_pinned_reels` (type: `boolean`):

Turn on to skip pinned reels. Pinned reels will be skipped during profile feed scanning. Skipped pinned reels do not count towards the requested 'Reels Per Profile' limit, and they do NOT incur any pay-per-event charges (skipping them is free).

## `skip_trial_reels` (type: `boolean`):

Turn on to skip trial/test reels. Trial reels are an Instagram feature creators use to test a video with non-followers temporarily before sharing it with followers. Since these test videos are very rare, keeping this option enabled ensures you only scrape final, permanent public reels. Skipped trial reels do not count towards the requested limit and do NOT incur any pay-per-event charges (skipping them is free).

## `reels_newer_than` (type: `string`):

Only keep profile reels created on or after this date. Leave empty for no lower date limit. If fewer public reels match this filter, the output clearly shows the requested and returned totals.

## `include_comments` (type: `boolean`):

Turn on to collect public comments for each returned reel. Comments are placed under comment\_details together with request feedback. ⚠️ Extra charge per returned comment.

## `comments_limit` (type: `integer`):

Maximum number of comments to return per reel when comment collection is enabled. ⚠️ Higher limits take proportionally longer — scraping 3000 comments can take 10+ minutes per reel. Please be patient. If fewer public comments are available, the output clearly shows the requested and returned totals.

## `keyValueStorePrefix` (type: `string`):

Enter a custom Key-Value Store Name (e.g. `Cristiano` or `my-store_1`). ⚠️ RULES: Only letters (a-z, A-Z), numbers (0-9), hyphens (-) and underscores (\_), max 63 characters. Leave empty to use the default unnamed store.

## `storeVideo` (type: `boolean`):

If ON, the highest-quality reel video and its audio/music track are downloaded and saved to Apify Key-Value Storage with permanent, non-expiring public download URLs. Charged per media asset saved.

## Actor input object example

```json
{
  "username": [
    "cristiano"
  ],
  "instagram_urls": [
    {
      "url": "https://www.instagram.com/nba/"
    },
    {
      "url": "https://www.instagram.com/reel/DYFIVfYM4ib/"
    }
  ],
  "reels_count": 10,
  "proxyCountry": "US",
  "skip_pinned_reels": false,
  "skip_trial_reels": false,
  "include_comments": false,
  "comments_limit": 20,
  "storeVideo": false
}
```

# Actor output Schema

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

Every row this run delivered. Use the Export button on the Output tab for CSV, Excel, JSON or XML.

# 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 = {
    "username": [
        "cristiano"
    ],
    "instagram_urls": [
        {
            "url": "https://www.instagram.com/nba/"
        },
        {
            "url": "https://www.instagram.com/reel/DYFIVfYM4ib/"
        }
    ],
    "reels_count": 10,
    "proxyCountry": "US",
    "comments_limit": 20,
    "keyValueStorePrefix": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("premiumscraper/instagram-reel-scraper").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 = {
    "username": ["cristiano"],
    "instagram_urls": [
        { "url": "https://www.instagram.com/nba/" },
        { "url": "https://www.instagram.com/reel/DYFIVfYM4ib/" },
    ],
    "reels_count": 10,
    "proxyCountry": "US",
    "comments_limit": 20,
    "keyValueStorePrefix": "",
}

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

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

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

```

## CLI example

```bash
echo '{
  "username": [
    "cristiano"
  ],
  "instagram_urls": [
    {
      "url": "https://www.instagram.com/nba/"
    },
    {
      "url": "https://www.instagram.com/reel/DYFIVfYM4ib/"
    }
  ],
  "reels_count": 10,
  "proxyCountry": "US",
  "comments_limit": 20,
  "keyValueStorePrefix": ""
}' |
apify call premiumscraper/instagram-reel-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,premiumscraper/instagram-reel-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/WrmqUhjaLk60GqoKw/builds/LplvOocORgVHwfebn/openapi.json
