Instagram Reel Scraper

Extract public Instagram Reel rows from direct Reel URLs, including visible metadata and warning fields when Instagram hides logged-out data.

Data fields

FieldTypeDescription
inputUrlstringValue exported as inputUrl.
idstring | nullValue exported as id.
shortCodestring | nullValue exported as shortCode.
typestringValue exported as type.
urlstring | nullValue exported as url.
captionstring | nullValue exported as caption.
hashtagsarrayValue exported as hashtags.
mentionsarrayValue exported as mentions.

Input preview

startUrlsInstagram Reel URLs *
maxItemsMaximum reels
maxRuntimeSecsMaximum runtime
proxyConfigurationProxy configuration

API and agents

This actor can be run through Apify API, datasets, webhooks, schedules, and the official Apify MCP server.

How this actor works

See example inputs, outputs, API usage, and practical limits before running this actor on Apify.

Open Apify page

Extract structured rows from public Instagram Reel URLs. This Actor is built for social listening, creator research, UGC campaign checks, and workflow automation where you need a repeatable dataset with one row per Reel.

At a glance

  • Primary job: Turn public Instagram Reel links into CSV, JSON, Excel, or API-ready dataset rows.
  • Input: Direct public Reel URLs such as https://www.instagram.com/reel/Da-2R72yymt/.
  • Output: Reel shortcode, canonical URL, caption/hashtags/mentions when visible, public metrics when visible, media URLs when visible, warnings, and per-input errors.
  • Best for: Brand monitoring, creator/content research, short-video trend tracking, UGC QA, and enrichment pipelines.

Input recipes

  • Single Reel smoke test: Paste one public Reel URL and set maxItems to 1.
  • Batch Reel export: Paste multiple public Reel URLs and keep maxItems equal to the number of URLs you want processed.
  • Diagnostic monitoring: Keep the warnings, error, and errorDescription columns in exports so hidden or unavailable Reels are easy to review.

What data can you extract?

Field Description
inputUrl Original URL from your input.
id, shortCode Stable Reel shortcode used for deduplication.
url Canonical Instagram Reel URL.
caption Caption text when visible in the public payload.
hashtags, mentions Tags and mentions parsed from visible public text.
ownerUsername, ownerId Owner metadata when visible.
timestamp Published timestamp when visible.
likesCount, commentsCount, shareCount Public engagement metrics when visible.
videoPlayCount Public play count when Instagram labels a value as plays.
viewCount Compatibility field populated only when Instagram exposes a distinct view count; it is never copied from videoPlayCount.
thumbnailUrl, videoUrl Public media URLs when exposed by Instagram.
warnings Missing optional fields or degraded public payload notes.
error, errorDescription Per-input error details for invalid, blocked, or unavailable URLs.
fetchedAt ISO timestamp for the scrape.

Example input

{
  "startUrls": [
    { "url": "https://www.instagram.com/reel/Da-2R72yymt/" }
  ],
  "maxItems": 1
}

Example output

{
  "inputUrl": "https://www.instagram.com/reel/Da-2R72yymt/",
  "id": "Da-2R72yymt",
  "shortCode": "Da-2R72yymt",
  "type": "reel",
  "url": "https://www.instagram.com/reel/Da-2R72yymt/",
  "caption": null,
  "hashtags": [],
  "mentions": [],
  "ownerUsername": null,
  "likesCount": null,
  "commentsCount": null,
  "videoPlayCount": null,
  "viewCount": null,
  "thumbnailUrl": null,
  "warnings": [
    "Caption was not visible in the public response.",
    "Direct-URL availability does not prove that this Reel is visible in the owner profile grid."
  ],
  "error": null,
  "errorDescription": null,
  "fetchedAt": "2026-07-14T10:22:26.244Z"
}

Who is it for?

  • Social media teams checking public Reel links from campaigns or creators.
  • Creator researchers building a repeatable list of Reels for review.
  • Automation builders who need one structured dataset row per Reel URL.
  • Analysts who prefer explicit warnings over silent skips when public fields are hidden.

Tips for best results

  • Use direct public Reel URLs: Canonical /reel/SHORTCODE/ and profile-prefixed /USERNAME/reel/SHORTCODE/ links are accepted. Profile listing, hashtag, audio, location, and private routes are outside V1 scope.
  • Start small: Test 1-3 URLs before larger batches.
  • Expect nullable fields: Instagram frequently hides captions, metrics, owner details, or media URLs from logged-out public payloads.
  • Use warnings: The warnings array explains degraded payloads without dropping the row.
  • Resume safely: If the Actor reaches its runtime cutoff, resurrect the same run with the same input and storage. RUN_CHECKPOINT prevents already completed shortcodes from being processed twice.

API usage

Node.js

import { ApifyClient } from "apify-client";

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor("fetch_cat/instagram-reel-scraper").call({
  startUrls: [{ url: "https://www.instagram.com/reel/Da-2R72yymt/" }],
  maxItems: 1
});
console.log(run.defaultDatasetId);

Python

from apify_client import ApifyClient

client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("fetch_cat/instagram-reel-scraper").call(run_input={
    "startUrls": [{"url": "https://www.instagram.com/reel/Da-2R72yymt/"}],
    "maxItems": 1,
})
print(run["defaultDatasetId"])

cURL

curl -X POST "https://api.apify.com/v2/acts/fetch_cat~instagram-reel-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"startUrls":[{"url":"https://www.instagram.com/reel/Da-2R72yymt/"}],"maxItems":1}'

MCP and AI agents

Use this Actor from MCP-compatible tools through the official Apify MCP Server.

claude mcp add --transport http apify "https://mcp.apify.com?tools=fetch_cat/instagram-reel-scraper"
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=fetch_cat/instagram-reel-scraper"
    }
  }
}

Example prompt: "Run Instagram Reel Scraper on this Reel URL and summarize warnings and visible metrics."

Limits and caveats

  • Public data only: No login cookies, private accounts, private APIs, DMs, or paid source credentials are used.
  • Instagram can hide fields: Missing optional fields are returned as null with warnings instead of guessed values.
  • Plays and views differ: videoPlayCount and viewCount preserve Instagram's visible labels. The Actor does not alias plays into views.
  • Direct and profile visibility differ: A Reel can be available by direct URL without appearing in the owner's profile grid.
  • Bounded retries: The first request is direct; when it is blocked, retries use residential Apify Proxy (or your supplied proxy configuration) up to three times within the shared run deadline. Per-URL failures are isolated so other Reel URLs can still complete.
  • No video downloads in V1: The Actor returns URLs when visible, not binary media files.

Every run writes RUN_SUMMARY to the default key-value store. A deadline-limited run also retains RUN_CHECKPOINT; resurrecting that run with the same storage resumes pending URLs. An unexpected all-error workload fails the run after saving uncharged diagnostic rows.

Legality and responsible use

Process only data you are allowed to access. Follow Instagram's terms, Apify's terms, and applicable laws.

Support

Open an issue from the Actor page if a run fails or output looks wrong. Include the run ID or URL, input JSON, expected output, actual output, and a reproducible public URL such as https://www.instagram.com/reel/Da-2R72yymt/.

Common questions

Questions and answers reused from the canonical actor README.

Does this Actor log in to Instagram?

No. It only processes public Reel URLs and returns warning fields when Instagram hides optional data.

Why are some fields null?

Instagram can hide captions, metrics, media URLs, or owner details from public logged-out pages. The Actor keeps the row and explains the missing data in warnings.

Can I scrape profile reels?

Not in V1. Use direct public Reel URLs for the most predictable output.