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
maxItemsto1. - Batch Reel export: Paste multiple public Reel URLs and keep
maxItemsequal to the number of URLs you want processed. - Diagnostic monitoring: Keep the
warnings,error, anderrorDescriptioncolumns 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
warningsarray 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_CHECKPOINTprevents 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
nullwith warnings instead of guessed values. - Plays and views differ:
videoPlayCountandviewCountpreserve 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/.