Instagram Video Metadata Scraper avatar

Instagram Video Metadata Scraper

Pricing

from $2.99 / 1,000 video metadata

Go to Apify Store
Instagram Video Metadata Scraper

Instagram Video Metadata Scraper

Read public Instagram video and reel page metadata and explicitly report when transcript data is unavailable.

Pricing

from $2.99 / 1,000 video metadata

Rating

0.0

(0)

Developer

w3crawler

w3crawler

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Read public Instagram reel, video, IGTV, and post pages in a real Chromium browser and save page-level metadata: canonical URL, title, caption, author, thumbnail, media type, dimensions, duration with a bounded provenance label, observed media references, JSON-LD, and public caption-track text when one exists. Only pages that expose usable public metadata produce dataset rows; blocked or empty pages are counted in the run summary without becoming fake records.

Get started

  1. Open the Actor Store page and select Try for free, or open the Input tab.
  2. Add one or more public Instagram reel, reels, tv, or p URLs to videoUrls; at most 100 are accepted.
  3. Set maxItems to the number of unique pages you want processed, and leave proxyConfiguration disabled for a first direct-browser run.
  4. Start the Actor, open the dataset, and export the rows as JSON, CSV, or Excel. Open Run summary (OUTPUT in the key-value store) to see the target, saved, and diagnostic counts.

Input

videoUrls is required. Every other field is optional and uses the default shown below. Unsupported field names and out-of-range values are rejected before the browser starts.

FieldTypeRequired?DefaultMeaning
videoUrlsstring arrayRequiredNot suppliedPublic Instagram video, reel, IGTV, or post URLs; 1–100 HTTPS instagram.com URLs with a reel, reels, tv, or p path.
maxItemsintegerOptional100Maximum number of unique normalized pages processed, 1–100.
requestTimeoutSecsintegerOptional45Per-page browser navigation timeout, 5–60 seconds.
maxRequestRetriesintegerOptional2Additional attempts for blocked or transient page responses, 0–3.
requestDelayMsintegerOptional0Delay before each subsequent video page, 0–10,000 ms.
proxyConfigurationobjectOptional{"useApifyProxy":false}Optional Apify Proxy settings with useApifyProxy, apifyProxyGroups, and an optional two-letter apifyProxyCountry. Direct browser access is the default.

The saved run used this input:

{
"videoUrls": [
"https://www.instagram.com/instagram/reel/Dc30nJeRKKz/"
],
"maxItems": 1,
"maxRequestRetries": 0,
"requestTimeoutSecs": 45,
"requestDelayMs": 0,
"proxyConfiguration": {
"useApifyProxy": false
}
}

The Actor navigates to public Instagram pages only. It does not log in, submit credentials, accept session cookies, or download media bytes. Optional proxyConfiguration is passed to the browser when supplied.

Output

The dataset contains one row per unique page that exposed usable public metadata. Values that Instagram did not publish are omitted rather than inferred; failed, blocked, or empty pages are counted in OUTPUT and logs, not written as diagnostic dataset rows.

FieldTypeAvailabilityMeaning
idstringAlwaysStable deterministic identifier for the normalized video URL.
recordTypestring enumAlwaysRecord type; always instagram-video-page-metadata.
targetTypestring enumAlwaysTarget entity type; always video.
videoUrlstringAlwaysNormalized requested video page URL.
sourceUrlstringAlwaysPublic Instagram page used for extraction.
canonicalUrlstringAlwaysCanonical page URL exposed by Instagram, falling back to the requested URL.
urlstringAlwaysNormalized video page URL (dataset view alias).
searchUrlstringAlwaysRequested page URL persisted as a compatibility alias.
mediaTypestring enumAlwaysNormalized media type: image, video, or carousel; defaults to video.
transcriptAvailablebooleanAlwaysWhether readable public caption-track text was observed.
transcriptStatusstring enumAlwaysPublic caption-track state: public_caption_track, public_caption_track_exposed, or not_available_from_public_page.
downloadAvailablebooleanAlwaysWhether a public media reference was observed; no bytes are downloaded.
scrapedAtstringAlwaysUTC time the row was emitted.
titlestringWhen publishedPublic video page title, usually the Open Graph title.
pageTitlestringWhen publishedObserved HTML or Open Graph page title before title selection.
captionstringWhen publishedPublic caption or page description.
authorstringWhen publishedPublic author display name.
authorUsernamestringWhen publishedPublic author username.
authorUrlstringWhen publishedPublic author profile URL.
imageUrlstringWhen publishedPublic thumbnail or image URL.
videoUrlFromPagestringWhen publishedExplicit public video URL observed in the page or player.
mediaUrlstringWhen publishedCompatibility alias for an observed video URL.
widthintegerWhen publishedObserved media width in pixels, at least 1.
heightintegerWhen publishedObserved media height in pixels, at least 1.
durationstringWhen publishedSource duration representation as a string.
durationSecondsnumberWhen publishedNormalized duration in seconds, at least 0.
durationSourcestring enumWhen publishedBounded provenance: public_video_element, public_media_metadata, public_embedded_metadata, public_json_ld, public_media_url_duration_s, or public_media_url_efg_duration_s. Signed media URLs are never used as the provenance label.
uploadDatestringWhen publishedPublic publication date/time in ISO format.
likeCountintegerWhen publishedPublic like count when exposed.
commentCountintegerWhen publishedPublic comment count when exposed.
videoViewCountintegerWhen publishedPublic video view count when exposed.
mediaReferencesobject arrayWhen publishedBounded public media references, each with url, kind (image or video), optional width, height, durationSeconds, durationSource, and source.
transcriptstringWhen publishedText from a public caption track; never inferred from audio.
transcriptSourceUrlstringWhen publishedPublic caption-track URL that supplied the transcript text.
jsonLdobject arrayWhen publishedBounded public JSON-LD objects.
structuredDataobject arrayWhen publishedCompatibility alias for the same public structured data.
metadataobjectWhen publishedSmall public page metadata subset, currently openGraphType when present.

Full JSON output

This is a real saved row from the 2026-10-25 run. The signed CDN URL in the second mediaReferences entry is shortened with an ellipsis; every other value is complete.

{
"id": "instagram-video:df697121c65cd31bbffda568",
"recordType": "instagram-video-page-metadata",
"targetType": "video",
"videoUrl": "https://www.instagram.com/instagram/reel/Dc30nJeRKKz/",
"sourceUrl": "https://www.instagram.com/instagram/reel/Dc30nJeRKKz/",
"canonicalUrl": "https://www.instagram.com/instagram/reel/Dc30nJeRKKz/",
"title": "Instagram on Instagram: \"that’s his spa now 🚰 #InTheMoment Video by @misterbeanito\"",
"pageTitle": "Instagram on Instagram: \"that’s his spa now 🚰 #InTheMoment Video by @misterbeanito\"",
"caption": "966K likes, 22K comments - instagram on September 4, 2026: \"that’s his spa now 🚰 #InTheMoment Video by @misterbeanito\".",
"author": "Instagram",
"authorUsername": "instagram",
"authorUrl": "https://www.instagram.com/instagram/",
"imageUrl": "https://static.cdninstagram.com/rsrc.php/y4/r/QaBlI0OZiks.ico",
"mediaType": "video",
"mediaReferences": [
{
"url": "https://static.cdninstagram.com/rsrc.php/y4/r/QaBlI0OZiks.ico",
"kind": "image",
"source": "public_media_response"
},
{
"url": "https://scontent-iad3-1.cdninstagram.com/v/t51.71878-15/795341832_1575427477361093_319242826385620795_n.jpg?stp=cmp1_dst-jpg_e35_s640x640_tt6&_nc_cat=108&ccb=7-5&_nc_sid=18de74&_nc_ohc=GwEZWrttYssQ7kNvwHLwSkT&_nc_oc=Adp9Co1ba6xG_j3Lrxe-wcu1kO6QDx37gSr3dS1tw65St2HUuPxt1JHq2-D6OrFOMNo&_nc_zt=23&_nc_ht=scontent-iad3-1.cdninstagram.com&_…",
"kind": "image",
"source": "open_graph"
}
],
"transcriptAvailable": false,
"transcriptStatus": "not_available_from_public_page",
"metadata": {
"openGraphType": "article"
},
"downloadAvailable": true,
"scrapedAt": "2026-10-25T20:48:49.478Z",
"url": "https://www.instagram.com/instagram/reel/Dc30nJeRKKz/",
"searchUrl": "https://www.instagram.com/instagram/reel/Dc30nJeRKKz/"
}

Run summary

Run summary is stored separately from the dataset in the run's key-value store under OUTPUT. It records request accounting and does not add diagnostic rows to the dataset.

FieldMeaning
statusActor outcome: SUCCEEDED or FAILED.
runStatusCanonical run status; matches status.
dataStatusCompleteness of saved rows: COMPLETE, PARTIAL, NO_RESULTS, or FAILED.
requestedTargetCountNumber of unique normalized URLs requested after applying maxItems.
emittedCountNormal video metadata rows saved to the dataset.
normalCountNormal video metadata rows saved; equals emittedCount.
diagnosticCountPages that returned no usable public metadata or were blocked; these are logged and counted but not saved as rows.
failureCountBlocked, failed, or incompletely accounted page requests plus run-level failures.
optionalFailureCountOptional output-write failures, normally 0.
transcriptCountSaved rows that contained public caption-track text.
maxItemsEffective page cap applied to the run, 1–100.
completedAtTime the summary was written, in ISO UTC.
StatusData statusMeaning
SUCCEEDEDCOMPLETEAll requested pages produced usable public rows without diagnostics or failures.
SUCCEEDEDPARTIALAt least one row was saved, but another page was blocked, empty, or failed. Saved rows remain available.
SUCCEEDEDNO_RESULTSThe run completed cleanly but no page exposed usable public metadata.
FAILEDFAILEDA fatal error occurred before any usable row was saved.

Example OUTPUT from the saved run:

{
"status": "SUCCEEDED",
"runStatus": "SUCCEEDED",
"dataStatus": "COMPLETE",
"requestedTargetCount": 1,
"emittedCount": 1,
"normalCount": 1,
"diagnosticCount": 0,
"failureCount": 0,
"optionalFailureCount": 0,
"transcriptCount": 0,
"maxItems": 1,
"completedAt": "2026-10-25T20:48:49.838Z"
}

Coverage and limitations

The Actor reads whatever the public page renders in Chromium. Instagram can serve a login wall, challenge, or empty shell depending on session, region, and rate limits; those outcomes are counted in OUTPUT and logs and are not written as metadata rows. Duration is reported only when a public player element, embedded metadata, JSON-LD, or a media URL exposes a value, and the selected durationSource records which evidence was used. Signed CDN URLs in mediaReferences can expire after the run, and no media bytes are saved.

Caption transcript is only the text of a public caption track. The Actor does not run speech-to-text, transcribe audio, or infer transcript content. Counts such as likes and comments are point-in-time values. Private, deleted, age-restricted, or login-gated pages cannot be read, and the page cap limits how many unique URLs are processed per run.

Usage and support

Cost depends on browser compute time, optional proxy traffic, and the number of pages processed. Start with one URL, inspect the row and OUTPUT, then raise maxItems and add proxies only if direct access is blocked. See the Actor's Pricing tab for current account rates.

Use the Actor Issues page to report a problem. Include the run ID, the input used, and the OUTPUT summary; do not include tokens, cookies, or private data. This Actor is not affiliated with Instagram or Meta. Use it only for public data and in accordance with the source's terms, robots guidance, and applicable law. Public pages can contain personal information; use the output only for lawful purposes.