# Instagram Reels Scraper

> Type a brand or creator's Instagram username and get their reels, with plays, likes, comments, caption, date, length, music and tagged accounts.

Instagram Reels Scraper gets the reels of any public Instagram profile, newest first and collabs included, or single reels from their links. Each reel is one row with plays, likes, comments, caption, date, length, music, location and tagged accounts. Each reel’s newest comments are an optional add-on.

- Web page: https://keklik.io/scrapers/instagram-reels-scraper
- Apify Actor: `keklik/instagram-reels-scraper` (https://apify.com/keklik/instagram-reels-scraper)
- You enter: Usernames or reel links
- You get: Plays, likes, comments, caption, date, length, music and tagged accounts
- Status: working, last tested 12 Nov 2026
- Needs: an Apify account (free is enough to try). No login to the site itself.

## Price per 1,000 reels

US dollars, on each Apify plan. Apify's platform costs are included. Add-ons are charged only when switched on in the input.

| Charge | Free | Starter | Scale | Business |
|---|---:|---:|---:|---:|
| Reel: Each reel the scraper saves. | $1.00 | $0.90 | $0.80 | $0.70 |
| Comment (add-on): Each comment added to a reel when Comments per reel is above 0. | $1.00 | $0.90 | $0.80 | $0.70 |

Apify's plans and a calculator: https://keklik.io/pricing.md

## Input

The run input is a JSON object with these keys:

- `urls` (array, required): 👤 Profiles or reels. One per line. A profile link or username returns that profile's reels, newest first. A reel link returns that one reel. Private profiles are skipped.
- `maxReelsPerProfile` (integer, optional): 🔢 Max reels per profile. Stops each profile after this many reels. Leave it empty for all of them. Reel links are not affected.
- `maxResults` (integer, optional): 🛑 Max reels in total. Stops the whole run after this many reels. Use it to cap what a run can cost.
- `newerThan` (string, optional): 📅 Posted after. Posted after: a date such as 2026-01-31, or a period back from now such as 7 days or 3 months (24h, 7d and 2w work too). Leave it empty for reels of any date.
- `postedBefore` (string, optional): 📅 Posted before. Pick a date, or a period back from now such as "1 year", to get only reels published before it. With Posted after, you get the reels between the two dates. Older dates take longer to reach on profiles with many reels; the reels passed over on the way are not charged.
- `skipPinnedReels` (boolean, optional, default false): 📌 Skip pinned reels. Drops the reels pinned to the top of a profile.
- `commentsPerPost` (integer, optional, default 0): 💬 Comments per reel ($). How many of each reel's newest comments to add. 0 adds none. Each comment is charged and makes the run slower.

Example input:

```json
{
  "urls": [
    "https://www.instagram.com/nike/"
  ],
  "maxReelsPerProfile": 12,
  "skipPinnedReels": true,
  "commentsPerPost": 3,
  "maxResults": 12
}
```

## Output: one row per reel

32 fields in 9 groups.

### Reel

- `reel_url`: Reel URL. Link to the reel (https://www.instagram.com/reel/<shortcode>/).
- `caption`: Caption. Caption text.
- `timestamp_datetime`: Posted. Publication time, ISO 8601 in UTC.
- `timestamp`: Posted (Unix). Publication time, Unix seconds.
- `is_pinned`: Pinned. Pinned to the top of the author's profile or reels tab.
- `is_sponsored`: Paid partnership. Labelled as a paid partnership.
- `paid_partners`: Paid partner. The brands a paid partnership names ("Paid partnership with ..."), by username. Empty when it isn't one, and on some paid partnerships that name no brand.
- `comments_disabled`: Comments off. The author turned comments off.
- `like_and_view_counts_disabled`: Counts hidden. The author hides like and view counts.

### Plays, likes and comments

- `views_count`: Plays. Number of plays. Empty for a reel URL that is not among its author's 60 latest reels; scrape the profile to get it.
- `likes_count`: Likes. Number of likes. Empty when the author hides like counts (like_and_view_counts_disabled is then true); the play count stays.
- `comments_count`: Comments. Number of comments.

### Author

- `owner_full_name`: Author name. Display name of the author.
- `owner_username`: Author username. Username of the author.
- `owner_id`: Author ID. Numeric Instagram user ID of the author, as a string.

### Video

- `video_duration_seconds`: Length (seconds). Video length in seconds.
- `media_dimensions`: Dimensions. Width x height of the video, in pixels.
- `video_url`: Video URL. Video file URL. Instagram media links expire.
- `display_url`: Cover image. Cover image URL. Instagram media links expire.

### Music and location

- `music_info`: Music. Audio of the reel: audio_id, song_name, artist_name, uses_original_audio, should_mute_audio, should_mute_audio_reason, is_trending, is_explicit.
- `location_name`: Location. Name of the tagged location.
- `location_id`: Location ID. ID of the tagged location.

### Hashtags and people

- `hashtags`: Hashtags. Hashtags in the caption, with the #.
- `mentions`: Mentions. Usernames mentioned in the caption, without the @.
- `co_authors`: Co-authors. Collab co-authors: id, username, full_name, is_verified, profile_pic_url.
- `tagged_users`: Tagged accounts. Accounts tagged in the reel: id, username, full_name, is_verified, profile_pic_url.

### Instagram IDs and links

- `reel_id`: Reel ID. Numeric Instagram media ID, as a string.
- `shortcode`: Shortcode. The code in the reel URL.
- `product_type`: Product type. Instagram's media type: "clips" for reels.

### Latest comments (add-on)

- `latest_comments`: Latest comments. With Comments per post set: the reel's newest top-level comments, each with comment_id, text, created_at (Unix seconds), likes_count, is_edited, is_covered (hidden by Instagram), giphy_id, giphy_url, owner_id, owner_username, owner_is_verified, owner_profile_pic_url. Empty when the reel has no comments.

### Search details

- `source_url`: Input. The input this reel came from, as you entered it.
- `scraping_time`: Scraped at. When the row was scraped, ISO 8601 in UTC.

## How it works

1. Type the profiles. Add as many usernames as you like, or paste links to single reels.
2. Every reel, newest first. You get each profile's reels from the newest down, collabs with other accounts included. Private profiles are skipped.
3. Keep only the reels you want. Keep only recent reels, stop each profile at a number, or leave out the reels pinned to the top.
4. Download your list. As a spreadsheet, in Google Sheets, or into your own reports.

## Use cases

- Comparing creators: Plays, likes and comments per reel side by side before you sign a creator, and a check that sponsored reels carry the paid partnership label.
- Brand monitoring: What rival brands post on Reels, how often, and which sounds and formats do best.
- Trend research: The audio, hashtags and lengths behind the top reels in a niche.
- Campaign reporting: A campaign's reels with their play counts, exported on a schedule to a dashboard.

## Good to know

A single reel link only gets its play count when the reel is among its author's 60 most recent. Older links come back with every other field, and scraping the author's profile fills the count in. Comments are top-level only, and photo posts and carousels are skipped.

## Questions

### How do I keep my first run small and cheap?

Start with one or two profiles and keep 🔢 Max reels per profile at 20, or set 🛑 Max reels in total: the run stops there. Leave 💬 Comments per reel at 0 until you know you need comments. To follow a creator over time, schedule a run with 📅 Posted after set to 1 day so each run gets only the new reels.

### Is it legal to scrape Instagram reels?

This scraper collects only public data that Instagram shows to visitors who are not logged in. Reels can still contain personal data, such as the usernames of tagged accounts and commenters. Personal data is protected by laws such as the GDPR in the EU, so make sure you have a lawful reason to collect and use it. If in doubt, ask a lawyer.

### Do I need an Instagram account?

No. You don't need an Instagram account, a login or cookies. Your own account is never used, so it cannot be blocked.

### Can I scrape private profiles?

No. Instagram shows a private profile's reels only to approved followers, so private profiles are skipped.

### Can I scrape photo posts and carousels?

No. A post URL that is not a video is skipped. Use the Instagram Post Scraper for photos and carousels.

### Why is the play count empty on some reels?

This happens only for reel URLs older than their author's 60 latest reels. Scrape the author's profile to get those play counts. Likes are also empty when the author hides like counts, which the Counts hidden column shows.

### How many reels can I get from a profile?

Every reel on the profile's Reels tab, newest first, including the reels it made as a collab with another account. Set 🔢 Max reels per profile to stop each profile at a number, 📅 Posted after (for example 30 days) to keep only recent reels, and 🛑 Max reels in total to cap the whole run.

### Can I get comment replies?

No. Instagram doesn't show replies to visitors who are not logged in, so only top-level comments are available.

### What happens when a run fails?

The run's status message says why, and the log names each input that failed. If a mistake in the input stops the run before anything is scraped, the run ends without results and its status message says what to change. Either way the Actor sends us a short error report, so we can fix the cause even if you never open an issue: the Actor's build, the reason, the counts from the end-of-run summary, whether your Apify plan is free or paid and, for an unexpected error, where in our code it happened. Web addresses and @usernames are blanked out first. The report never includes your input, your account, the pages you scraped or your results. Every run, failed or not, also sends one usage line as it ends, so we can see which options people use, what runs cost us and how well the data is filled: how many of each charged event it used (for example 120 full details) and the price your plan paid for them; the run's platform cost by item and its resources (time, memory, proxy traffic); whether it stopped at your maximum cost or maximum items; how it was started (Console, API, schedule, saved task, and for API runs the kind of tool, such as Make, Zapier or the Apify client, never the tool's full identity); our scraper's own retry and timing counts; and for each output field, how many results had it filled (counts only, never the values). That never includes your input, your account, your IP address, the pages you scraped or your results either. If you need help with a run, open an issue on the Issues tab and attach the run, or email support@kekliktech.com with the run's link; the run's log ends with both.

## Run it

- In Apify Console: https://apify.com/keklik/instagram-reels-scraper
- With the Apify API: POST https://api.apify.com/v2/acts/keklik~instagram-reels-scraper/run-sync-get-dataset-items?token=APIFY_TOKEN with the input JSON as the body. It returns the rows.
- From an AI agent: connect the Apify MCP server (https://mcp.apify.com), add the Actor `keklik/instagram-reels-scraper` and call it with the input.
