Instagram Post Scraper avatar

Instagram Post Scraper

Pricing

from $2.99 / 1,000 posts

Go to Apify Store
Instagram Post Scraper

Instagram Post Scraper

Read public Instagram post, reel, TV, and legacy profile metadata. Returns available captions, author fields, structured metadata, and media URL references, or explicit access diagnostics when Instagram requires login. Media bytes are not downloaded.

Pricing

from $2.99 / 1,000 posts

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. Save captions or public descriptions, author fields, canonical URLs, media references and dimensions, available engagement counts, and profile links discovered from a username target. 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 post_urls, postUrls, or startUrls, and/or profile targets in username or usernames. At least one target is required.
  3. Set maxItems and maxPostsPerUsername 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 scheduled, discovered, 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
post_urlsstring arrayOne of the target fieldsNot supplied (prefill: one reel URL)Public Instagram post, reel, TV, or profile URLs, up to 100 entries. Tracking parameters are removed and duplicates deduplicated.
postUrlsstring arrayOne of the target fieldsNot suppliedCompatibility alias for post_urls; both lists are combined.
startUrlsobject arrayOne of the target fieldsNot suppliedCompatibility request-list alias of { "url": "..." } objects, combined with the other URL fields.
usernamestringOne of the target fieldsNot suppliedOne public username; a leading @ is accepted.
usernamesstring arrayOne of the target fieldsNot suppliedPublic usernames, combined with username. Each profile is read and bounded recent post discovery is attempted.
maxPostsPerUsernameintegerOptional3Maximum recent public post URLs discovered from each profile, 1–100, also bounded by the remaining maxItems.
maxItemsintegerOptional100Maximum unique requested and discovered targets processed, 1–100.
requestTimeoutSecsintegerOptional20Per-request timeout for public pages and oEmbed, 5–60 seconds.
maxRequestRetriesintegerOptional2Additional attempts for transient HTTP failures, 0–3.
requestDelayMsintegerOptional0Delay between target requests, 0–10,000 ms.
proxyConfigurationobjectOptional{"useApifyProxy":false}Optional Apify Proxy settings: useApifyProxy, apifyProxyGroups, and apifyProxyCountry. Direct access is the default.

Example input using the prefill and defaults:

{
"post_urls": [
"https://www.instagram.com/instagram/reel/Dc30nJeRKKz/"
],
"maxPostsPerUsername": 3,
"maxItems": 100,
"requestTimeoutSecs": 20,
"maxRequestRetries": 2,
"requestDelayMs": 0,
"proxyConfiguration": {
"useApifyProxy": false
}
}

Add username or usernames to discover posts from profile pages. URL aliases are merged, normalized, and deduplicated before maxItems is applied.

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. Media and profile pages expose different field sets.

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-post or instagram-profile-metadata.
targetTypestring enumAlwaysmedia or profile.
targetUrlstringAlwaysNormalized requested or discovered target URL.
postUrlstringFor media targetsPost, reel, or TV URL.
profileUrlstringFor profile targetsNormalized profile URL.
sourceUrlstringAlwaysPublic Instagram page requested for extraction.
discoveredFromProfilestringWhen discovered from a profileProfile URL that exposed the post link.
sourcestringAlwaysinstagram-public-page or instagram-public-page-and-oembed.
canonicalUrlstringAlwaysCanonical URL from Open Graph or oEmbed, with the target URL as fallback.
pageTitlestringWhen publishedPublic HTML or Open Graph title.
captionstringWhen publishedCaption or public description. For many pages this includes Instagram's social-description prefix with a like/comment summary and date, not only the creator's caption.
titlestringWhen publishedPublic title or page title.
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.
imageUrlstringWhen publishedPrimary public image URL.
mediaUrlstringWhen publishedPrimary public video URL.
mediaTypestring enumWhen a recognizable media node is exposedimage, video, or carousel. Can be absent even when an image URL is present.
widthintegerWhen publishedMedia width in pixels.
heightintegerWhen publishedMedia height in pixels.
durationstringWhen publishedSource duration representation.
durationSecondsnumberWhen publishedNormalized media duration in seconds.
uploadDatestringWhen embedded data publishes itPublication date/time. The like/comment prefix in caption is not parsed for a date.
likeCountintegerWhen embedded data publishes a numeric countLike count. Counts appearing only in the caption prefix are not parsed into this field.
commentCountintegerWhen embedded data publishes a numeric countComment count. Counts appearing only in the caption prefix are not parsed.
videoViewCountintegerWhen publishedVideo 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 from 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. Nothing is downloaded or stored.
transcriptAvailablebooleanAlwaysWhether a public transcript was observed. Current extraction reports false.
metadataobjectWhen publishedSmall page subset: openGraphType and contentLanguage.
scrapedAtstringAlwaysTime the row was emitted, in ISO UTC.

Example of a real saved row from the 2026-10-25 run. It contains the full saved image URL and its single media reference; no values are invented.

{
"id": "instagram:df697121c65cd31bbffda568",
"recordType": "instagram-post",
"targetType": "media",
"targetUrl": "https://www.instagram.com/instagram/reel/Dc30nJeRKKz/",
"postUrl": "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": "966K likes, 22K comments - instagram on September 4, 2026: \"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",
"authorUrl": "https://www.instagram.com/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=eyJlZmdfdGFnIjoiQ0xJUFMuYmVzdF9pbWFnZV91cmxnZW4uQzMifQ%3D%3D&_nc_ohc=GwEZWrttYssQ7kNvwHrf9BE&_nc_oc=AdqDKyv5H6uTBfcn1rLKf4rBUqIEGmVbhd_uPVHbJBcsX8aJ1a5IpqpoYiDmYxbJC9M&_nc_zt=23&_nc_ht=scontent-iad3-1.cdninstagram.com&_nc_gid=a-xlcFcF_nQnpXEg9f0vXg&_nc_ss=70689&oh=00_AQPKLJJPXNqquQ_XpwYdivvQiAO9u7Ckb8LwMAbAGHIO7Q&oe=6AE4502C",
"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=eyJlZmdfdGFnIjoiQ0xJUFMuYmVzdF9pbWFnZV91cmxnZW4uQzMifQ%3D%3D&_nc_ohc=GwEZWrttYssQ7kNvwHrf9BE&_nc_oc=AdqDKyv5H6uTBfcn1rLKf4rBUqIEGmVbhd_uPVHbJBcsX8aJ1a5IpqpoYiDmYxbJC9M&_nc_zt=23&_nc_ht=scontent-iad3-1.cdninstagram.com&_nc_gid=a-xlcFcF_nQnpXEg9f0vXg&_nc_ss=70689&oh=00_AQPKLJJPXNqquQ_XpwYdivvQiAO9u7Ckb8LwMAbAGHIO7Q&oe=6AE4502C",
"kind": "image",
"source": "open_graph"
}
],
"downloadAvailable": true,
"transcriptAvailable": false,
"metadata": {
"openGraphType": "article"
},
"scrapedAt": "2026-10-25T20:47:50.405Z",
"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 normalized targets supplied, before the maxItems cap.
scheduledTargetCountTargets queued after applying maxItems.
emittedCountNormal records written to the dataset.
normalCountNormal records written; matches emittedCount.
diagnosticCountSource diagnostics logged; diagnostics are not dataset rows.
datasetWriteFailureCountRecords that could not be written to the dataset.
failureCountDiagnostics other than NO_PUBLIC_METADATA, plus dataset write failures.
uniqueTargetCountDistinct target URLs seen in results, including failed targets.
discoveredPostCountSaved records that were discovered from a profile page.
oembedRequestsoEmbed endpoint attempts. A media target can try up to two endpoints.
blockedCountPages treated as blocked or challenge responses.
maxItemsTarget cap used for the run.
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.
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,
"datasetWriteFailureCount": 0,
"failureCount": 0,
"uniqueTargetCount": 1,
"discoveredPostCount": 0,
"oembedRequests": 2,
"blockedCount": 0,
"maxItems": 1,
"optionalFailureCount": 0,
"completedAt": "2026-10-25T20:47:50.487Z"
}

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 media 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. Media and CDN URLs are time-limited.

Username targets read one public profile page and discover the recent post shortcodes that page exposes. maxPostsPerUsername caps discovery per profile, and the remaining maxItems budget caps the shared queue. This is not a complete profile catalog. The profile record contains the fields available for that page; it does not include follower, following, bio, or verified fields in this dataset.

caption may be Instagram's public social description, including a like/comment prefix and date; the Actor does not parse that prefix into likeCount, commentCount, or uploadDate. Those fields appear only when embedded data exposes numeric values. mediaType, dimensions, and duration can be absent when the page exposes only a still image, even for a reel URL. A missing field means the public response did not expose it.

maxItems limits queued targets and saved rows; log diagnostics do not create rows. NO_PUBLIC_METADATA, HTTP errors, blocked/challenge responses, and request failures are reported through logs and OUTPUT, which 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 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.