Instagram Media Metadata Scraper avatar

Instagram Media Metadata Scraper

Pricing

from $2.99 / 1,000 media metadata

Go to Apify Store
Instagram Media Metadata Scraper

Instagram Media Metadata Scraper

Read public Instagram post and profile metadata, captions, author fields, media URLs, and structured data without downloading media bytes.

Pricing

from $2.99 / 1,000 media 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 post, reel, TV, and profile metadata from page HTML, Open Graph tags, embedded public JSON, JSON-LD, and the public oEmbed endpoint. Saved records can include captions, author and profile fields, canonical URLs, engagement counts, media references and dimensions, profile statistics, and links discovered on a profile. Media bytes are never downloaded.

Get started

  1. Open the Actor Store page and select Try for free or open the Input tab.
  2. Supply media URLs in postUrls (or the legacy post_urls) and/or profile usernames. At least one target is required.
  3. Set maxItems and maxPosts_per_username to bound the run. Keep both small for the first run.
  4. Start the Actor, open the dataset, and export the records as JSON, CSV, or Excel. Open Run summary (OUTPUT) to check record and failure counts.

Input

At least one target is required at runtime, although the schema marks every field optional. Unsupported field names and out-of-range values are rejected before requests start.

FieldTypeRequired?DefaultMeaning
postUrlsstring arrayOne of postUrls / post_urls / usernamesNot supplied (prefill: one reel URL)HTTPS Instagram post, reel, or TV URLs, 1–100 entries. Public page metadata is read; media bytes are not downloaded.
post_urlsstring arrayOne of postUrls / post_urls / usernamesNot suppliedLegacy snake_case alias for postUrls. Both lists are combined and deduplicated.
usernamesstring arrayOne of postUrls / post_urls / usernamesNot supplied (prefill: instagram)Public usernames with an optional leading @. Each profile emits a profile record, and up to maxPosts_per_username observed media links are enriched within the remaining maxItems.
maxPosts_per_usernameintegerOptional10Maximum media links discovered from each profile page, 1–100. Discovery is also capped by the remaining global target budget.
maxItemsintegerOptional100Global cap, 1–100, on unique scheduled targets and saved normal records across direct URLs and profile-discovered media. Diagnostics are logged, not written as rows.
requestTimeoutSecsintegerOptional20Per-page request timeout, 5–60 seconds. oEmbed requests use the lower of this value and 30 seconds.
maxRequestRetriesintegerOptional2Retries for transient network and 429/5xx responses, 0–3. Access blocks are not retried indefinitely.
requestDelayMsintegerOptional0Delay before each target after the first, 0–10,000 ms.
proxyConfigurationobjectOptional{"useApifyProxy":false}Optional Apify Proxy settings: useApifyProxy, apifyProxyGroups, and apifyProxyCountry. Direct requests are the default; proxy credentials are never written to output.

Example input using the prefill and defaults:

{
"postUrls": [
"https://www.instagram.com/instagram/reel/Dc30nJeRKKz/"
],
"usernames": ["instagram"],
"maxPosts_per_username": 10,
"maxItems": 100,
"requestTimeoutSecs": 20,
"maxRequestRetries": 2,
"requestDelayMs": 0,
"proxyConfiguration": {
"useApifyProxy": false
}
}

Remove either target list if it is not needed. Supplying both is valid; duplicate normalized targets are processed once.

Output

The dataset contains one row per saved media or profile record. Optional values are omitted when Instagram does not expose them, and source failures produce log diagnostics instead of placeholder rows. Public pages can expose different fields for posts, reels, TV pages, and profiles.

FieldTypeAvailabilityMeaning
urlstringAlwaysNormalized target URL; added by the dataset sanitizer.
searchUrlstringAlwaysCompatibility alias equal to sourceUrl.
idstringAlwaysStable deterministic identifier derived from the normalized target URL.
recordTypestring enumAlwaysinstagram-media-metadata or instagram-profile-metadata.
targetTypestring enumAlwaysmedia or profile.
targetUrlstringAlwaysNormalized target URL requested or discovered from a profile.
sourceUrlstringAlwaysPublic Instagram page URL used for extraction.
discoveredFromProfilestringWhen discovered from a profileProfile URL that exposed the media link.
sourcestringAlwaysinstagram-public-page or instagram-public-page-and-oembed.
canonicalUrlstringAlwaysCanonical URL from Open Graph or oEmbed, with the target URL as fallback.
pageTitlestringWhen publishedHTML or Open Graph page title.
captionstringWhen publishedPublic caption or description. Instagram may shorten it in page metadata.
titlestringWhen publishedPublic media title, or the profile display name for profile rows.
authorstringWhen publishedPublic author or creator name.
authorUsernamestringWhen publishedPublic author username.
authorUrlstringWhen publishedPublic author profile URL.
authorIdstring or numberWhen publishedPublic author identifier from oEmbed or embedded data.
profileUsernamestringWhen publishedProfile username for a profile target or the media owner.
profileFullNamestringWhen publishedPublic profile display name.
profileBiostringWhen publishedPublic profile biography from embedded page data.
profileFollowersintegerWhen publishedPublic follower count.
profileFollowingintegerWhen publishedPublic following count.
profilePostCountintegerWhen publishedPublic profile post count.
profileIsVerifiedbooleanWhen publishedPublic verification flag.
profileIsPrivatebooleanWhen publishedPublic private-profile flag.
profileImageUrlstringWhen publishedProfile image URL.
profileExternalUrlsstring arrayWhen publishedPublic external links exposed by the profile, capped at 20.
highlightUrlsstring arrayWhen publishedPublic profile highlight URLs, capped at 50.
recentPostUrlsstring arrayWhen publishedPublic media URLs observed on a profile, capped at 100.
imageUrlstringWhen publishedPrimary image URL for the target media.
mediaUrlstringWhen publishedPrimary public video URL for the target media.
mediaTypestring enumWhen publishedExposed media type: image, video, or carousel. This describes observed media references, so a reel URL can produce image when only an image is exposed.
widthintegerWhen publishedMedia width in pixels.
heightintegerWhen publishedMedia height in pixels.
durationstringWhen publishedSource duration representation.
durationSecondsnumberWhen publishedNormalized media duration in seconds.
uploadDatestringWhen publishedPublication date/time from embedded data or page text.
likeCountintegerWhen publishedPublic like count; display labels may be rounded or abbreviated.
commentCountintegerWhen publishedPublic comment count; display labels may be rounded.
videoViewCountintegerWhen publishedPublic video view or play count.
carouselItemCountintegerWhen publishedNumber of carousel children.
embedHtmlstringWhen publishedPublic oEmbed HTML snippet.
oembedProviderstringWhen publishedoEmbed provider name.
structuredDataobject arrayWhen publishedUp to 10 public JSON-LD objects embedded in the page.
mediaReferencesobject arrayWhen publishedDeduplicated media references with url, kind, width, height, durationSeconds, and source, capped at 30.
downloadAvailablebooleanAlwaysWhether a public media URL was observed. No bytes are stored or downloaded.
transcriptAvailablebooleanAlwaysWhether a public transcript was observed. Current page extraction reports false.
metadataobjectWhen publishedSmall page subset: contentLanguage and openGraphType.
scrapedAtstringAlwaysTime the row was emitted, in ISO UTC.

Example of a real saved row from the 2026-10-25 run. The mediaReferences array contains its single real entry; no values are invented.

{
"id": "instagram:df697121c65cd31bbffda568",
"recordType": "instagram-media-metadata",
"targetType": "media",
"targetUrl": "https://www.instagram.com/instagram/reel/Dc30nJeRKKz/",
"sourceUrl": "https://www.instagram.com/instagram/reel/Dc30nJeRKKz/",
"source": "instagram-public-page",
"canonicalUrl": "https://www.instagram.com/instagram/reel/Dc30nJeRKKz/",
"pageTitle": "Instagram on Instagram: \"that’s his spa now 🚰 #InTheMoment Video by @misterbeanito\"",
"caption": "that’s his spa now 🚰 #InTheMoment Video by @misterbeanito\".",
"title": "Instagram on Instagram: \"that’s his spa now 🚰 #InTheMoment Video by @misterbeanito\"",
"author": "Instagram",
"authorUsername": "instagram",
"imageUrl": "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&efg=eyJlZmdfdGFnIjoiQ0xJUFMuYmVzdF9pbWFnZV91cmxnZW4uQzIifQ%3D%3D&_nc_ohc=GwEZWrttYssQ7kNvwF_eWHA&_nc_oc=AdpXONfQnWz4X2sS_weAaiFcNEvOPiKbLk5NNEYI1h1OWChqpM4_Y5PDhepHmg55IFU&_nc_zt=23&_nc_ht=scontent-iad3-1.cdninstagram.com&_nc_gid=VtCqvTbex-3yOFn4wow_fQ&_nc_ss=70689&oh=00_AQMVUkQHRiKQRf3_1uzFjpLY_HQzVwgTHo5XI4vqx5x8Zg&oe=6AE4502C",
"mediaType": "image",
"uploadDate": "2026-09-04T00:00:00.000Z",
"likeCount": 966000,
"commentCount": 22000,
"mediaReferences": [
{
"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&efg=eyJlZmdfdGFnIjoiQ0xJUFMuYmVzdF9pbWFnZV91cmxnZW4uQzIifQ%3D%3D&_nc_ohc=GwEZWrttYssQ7kNvwF_eWHA&_nc_oc=AdpXONfQnWz4X2sS_weAaiFcNEvOPiKbLk5NNEYI1h1OWChqpM4_Y5PDhepHmg55IFU&_nc_zt=23&_nc_ht=scontent-iad3-1.cdninstagram.com&_nc_gid=VtCqvTbex-3yOFn4wow_fQ&_nc_ss=70689&oh=00_AQMVUkQHRiKQRf3_1uzFjpLY_HQzVwgTHo5XI4vqx5x8Zg&oe=6AE4502C",
"kind": "image",
"source": "open_graph"
}
],
"downloadAvailable": true,
"transcriptAvailable": false,
"metadata": {
"openGraphType": "article"
},
"scrapedAt": "2026-10-25T20:47:35.308Z",
"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.

FieldMeaning
statusActor process outcome: SUCCEEDED or FAILED.
runStatusCanonical run status; matches status.
dataStatusCompleteness of saved rows: COMPLETE, PARTIAL, NO_RESULTS, or FAILED.
requestedTargetCountUnique targets left after normalization and the maxItems cap.
scheduledTargetCountTarget pages attempted, including failed pages.
emittedCountNormal records written to the dataset.
normalCountNormal records written; matches emittedCount.
diagnosticCountSource diagnostics logged; diagnostics are not dataset rows.
failureCountDiagnostics other than NO_PUBLIC_METADATA and PAGE_UNAVAILABLE, plus dataset write failures.
uniqueTargetCountDistinct target URLs seen in results, including failed targets.
profileRecordCountNormal profile records produced before dataset-write failures.
mediaRecordCountNormal media records produced before dataset-write failures.
discoveredPostCountMedia links discovered from profile pages and queued within the target budget.
oembedRequestsoEmbed endpoint attempts. A media target can try up to two endpoints.
blockedCountPages treated as blocked or challenge responses.
maxItemsGlobal target and record cap used for the run.
datasetWriteFailureCountRecords that could not be written to the dataset.
optionalFailureCountOptional summary-write failures.
completedAtTime the summary was written, in ISO UTC.
StatusData statusMeaning
SUCCEEDEDCOMPLETERecords were saved without diagnostics.
SUCCEEDEDPARTIALRecords were saved, but at least one diagnostic or dataset write failure occurred. Saved rows remain available.
SUCCEEDEDNO_RESULTSThe run completed cleanly with no usable public metadata and no counted failures.
FAILEDFAILEDNo record was saved and at least one counted failure occurred.

Example OUTPUT from the 2026-10-25 run:

{
"status": "SUCCEEDED",
"runStatus": "SUCCEEDED",
"dataStatus": "COMPLETE",
"requestedTargetCount": 1,
"scheduledTargetCount": 1,
"emittedCount": 1,
"normalCount": 1,
"diagnosticCount": 0,
"failureCount": 0,
"uniqueTargetCount": 1,
"profileRecordCount": 0,
"mediaRecordCount": 1,
"discoveredPostCount": 0,
"oembedRequests": 2,
"blockedCount": 0,
"maxItems": 1,
"datasetWriteFailureCount": 0,
"optionalFailureCount": 0,
"completedAt": "2026-10-25T20:47:35.385Z"
}

Coverage and limitations

The Actor reads only public page HTML, embedded public JSON, Open Graph metadata, JSON-LD, and Instagram's public oEmbed endpoints. It does not log in, use cookies or private APIs, solve challenges, bypass rate limits, download image or video bytes, fetch transcripts, or collect comments. transcriptAvailable currently reports false, and downloadAvailable only means a public media URL was observed; it does not grant reuse rights.

Profile targets produce one profile record plus up to maxPosts_per_username discovered media targets, all within the remaining maxItems budget. Discovered links are whatever the public page exposes; recentPostUrls is not a complete profile catalog. A reel URL can yield mediaType: "image" when Instagram exposes only a still image for that request. Media and CDN URLs are time-limited and can expire after the run. Engagement counts parsed from display text may be rounded. Captions may be shortened by the page metadata, and a blank field means the public response did not expose it.

maxItems limits normalized targets and saved rows; log diagnostics do not create rows. oEmbed is optional enrichment, so records without oEmbed fields are still valid. NO_PUBLIC_METADATA, PAGE_UNAVAILABLE, BLOCKED_OR_CHALLENGE, HTTP errors, and request failures are reported through logs and OUTPUT, and can leave the run PARTIAL or FAILED. Apify Proxy is optional; direct requests are the default.

Usage and support

Cost depends on the number of unique targets, profile discovery, oEmbed attempts, page size, retries, and proxy use. Start with a single URL or profile and a low maxItems, inspect the dataset and OUTPUT, then scale. 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 run 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 Instagram's terms, robots guidance, and applicable law. Public pages can contain personal information; use the output only for lawful purposes.