Instagram Post Details Scraper With Engagement Data avatar

Instagram Post Details Scraper With Engagement Data

Pricing

from $2.99 / 1,000 results

Go to Apify Store
Instagram Post Details Scraper With Engagement Data

Instagram Post Details Scraper With Engagement Data

Instagram Post Details Scraper — Scrape detailed Instagram post data including captions, media, likes, comments, views, shares, saves, timestamps, hashtags, mentions, and engagement metrics. Analyze content performance, audience activity, competitors, and social media trends.

Pricing

from $2.99 / 1,000 results

Rating

0.0

(0)

Developer

SimpleAPI

SimpleAPI

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

2 days ago

Last modified

Share

Instagram Post Scraper — Likes, Comments and Engagement Rate

Instagram Post Details Scraper With Engagement Data returns one structured JSON row per Instagram post, reel, or IGTV URL you supply — caption, like count, comment count, media URLs, post date, and the newest visible comments, enriched with the owner's real biography, follower count, and following count, plus computed engagement rate, like-to-comment ratio, post age, and a high-engagement flag. Marketers, agencies, and researchers use it to vet creators and track post performance without hand-merging a separate profile scrape. Paste a list of URLs and get comparable, analysis-ready rows back.

What is Instagram Post Details Scraper With Engagement Data?

Instagram Post Details Scraper With Engagement Data is an Apify Actor that reads Instagram's public post pages directly — the same page a logged-out visitor sees — for whichever post, reel, or IGTV URLs you provide, and returns one clean row per post. No Instagram account, login, or API key is required; it reads only what's publicly visible.

Key features:

  • 🔗 Bulk URL input — paste any number of post, reel, or IGTV URLs, one per line (or a bare shortcode); duplicates are removed automatically
  • 👤 Owner enrichment — a second lookup fetches the post owner's real biography, external link, follower count, and following count, toggled with enrichOwnerProfile
  • 📈 Derived engagement analytics — engagement rate, like-to-comment ratio, post age in days, and a configurable isHighEngagement flag, computed locally from data already collected — no extra request, no AI
  • 💬 Post content & media — caption, display image, video URL for video posts, location tag, and a sample of the newest comments visible on the post
  • 🌐 Adaptive proxy routing — requests start direct and escalate through wider Apify Proxy groups automatically on a block, with no manual proxy tuning required
  • 📤 Standard Apify dataset export — JSON, CSV, Excel, and the other formats every Apify dataset export supports

What data can I extract with Instagram Post Details Scraper With Engagement Data?

Every row combines the post's own data with the owner-enrichment and engagement fields this Actor computes on top of it.

FieldExample ValueUse Case
url"https://www.instagram.com/p/Bq-mIJWgUAU/"The exact URL that was fetched
post_id"1927145376125632532"Stable post identifier
short_code"Bq-mIJWgUAU"Instagram's shortcode for the post
username"hikeinlandempire"Post owner's handle
thumbnail_url"https://...jpg"Smallest available display image
is_affiliatefalseBase-compatibility flag (see note below)
is_paid_partnershipfalseBase-compatibility flag (see note below)
is_adfalseBase-compatibility flag (see note below)
is_insights_as_brandfalseBase-compatibility flag (see note below)
is_caption_editedfalseWhether the caption was edited after posting
has_ranked_commentsfalseBase-compatibility flag (see note below)
like_count2132Raw like count at scrape time
comment_count98Raw comment count at scrape time
video_view_countnullView count, video posts only
video_play_countnullPlay count, video posts only
post_date"2018-12-04T18:00:52.000Z"When the post was published, ISO 8601
display_url"https://...jpg"Largest available display image
alt"Photo by ... on Instagram"Accessibility caption
locationnullLocation tag object, when set
caption"..."Full caption text
video_durationnullSeconds, video posts only
video_urlnullPlayable video URL, video posts only
sponsor_user[]Base-compatibility field (see note below)
upcoming_eventnullBase-compatibility field (see note below)
owner{id, username, is_verified, profile_pic_url, full_name, is_private, biography, external_url, follower_count, following_count, edge_followed_by: {count}, edge_following: {count}, edge_owner_to_timeline_media: {count}, ...}Post owner sub-object
latest_comments[{id, text, created_at, owner: {id, username, ...}, edge_liked_by: {count}, ...}]Newest comments visible on the post
scrapedAt"2026-08-15T09:12:41.000Z"UTC timestamp of this scrape
ownerBiography"..."Owner's bio text (enrichment field)
ownerExternalUrl"https://linktr.ee/..."First bio link, if any (enrichment field)
ownerFollowerCount104264509Owner follower count (enrichment field)
ownerFollowingCount92Owner following count (enrichment field)
ownerIsPrivatefalseWhether the owner account is private (enrichment field)
ownerProfilePicUrl"https://...jpg"Owner profile picture URL (enrichment field)
engagementRate0.0214(like_count + comment_count) / ownerFollowerCount, rounded to 4 decimals
likeToCommentRatio21.76like_count / comment_count, rounded to 4 decimals
postAgeDays2807Days between post_date and scrapedAt
isHighEngagementfalsetrue when engagementRate >= minEngagementRate
error(absent on success)Present only on a row that could not be collected — see the Output section below

Engagement & owner data

The fields that drive a go/no-go decision live in engagementRate, likeToCommentRatio, postAgeDays, and isHighEngagement, computed from like_count, comment_count, ownerFollowerCount, and post_date — all sourced from the same fetch, with no separate analytics call. Paired with ownerFollowerCount, ownerFollowingCount, ownerBiography, and ownerExternalUrl, they answer the question a sponsor or analyst actually has: is this creator's real engagement rate, on a real post, consistent with the follower count they advertise, or is the account inflated.

Fields you can filter or sort on

Since the Actor targets URLs directly rather than a search feed, filtering happens after the fetch: isHighEngagement (set by minEngagementRate) lets you sort a batch of rows into high- and low-performing posts, postAgeDays lets you separate recent activity from an old catalogue post, and ownerFollowerCount lets you segment by account size. location, when present, gives a geographic signal for posts that carry one.

How does Instagram Post Details Scraper With Engagement Data differ from the official Instagram API?

Meta's Instagram Graph API is the platform's own programmatic option, but it is not built for reading arbitrary public posts. Per Meta's own Instagram Platform Insights documentation (developers.facebook.com/docs/instagram-platform/insights/, checked 2026-08-15), the insights permissions it exposes only return data for a Business or Creator account that has explicitly connected to your app through OAuth — there is no endpoint for pulling insights or details on posts belonging to accounts you don't manage.

FeatureInstagram Graph APIThis Actor
Access requirementBusiness/Creator account linked to a Facebook Page, plus Meta App Review before serving real usersApify account only — no Instagram login
ScopeOnly accounts that have explicitly OAuth-authenticated your appAny public post, reel, or IGTV URL
Third-party / competitor postsNot available — no endpoint returns another account's insightsWorks on any public post URL, including creators or competitors you don't manage
SetupOAuth flow, a recorded demo per permission, and Meta App Review before going livePaste URLs, run
OutputInsights fields, scoped to the connected accountPost details + owner enrichment + computed engagement analytics, one row per URL

Can the Instagram Graph API return data for posts I don't own?

No. The Graph API's insights permissions are scoped to Business or Creator accounts that have individually connected to your app through OAuth, and Meta's own documentation gives no endpoint for retrieving another account's insights or post details without that connection. In practice, that rules out the API for competitor tracking, creator vetting, or any workflow touching accounts you don't manage — every one of those accounts would need to authorize your app first, which isn't realistic outside a small integration. This Actor covers that gap by reading the same public post page a logged-out browser already sees, for any post URL you supply, with no OAuth step and no account relationship required.

Use the Instagram Graph API when you manage the account yourself and need first-party insights under Meta's terms. Use this Actor when you need post-level data and owner context for accounts you don't control — competitor monitoring, creator vetting, or research — without an app-review process.

How to use data extracted from Instagram?

Marketers and brand teams vetting creators

Before a sponsorship deal, paste a candidate creator's recent post URLs with enrichOwnerProfile on and compare ownerFollowerCount against each post's real engagementRate. A media kit's follower count means little on its own; like_count, comment_count, and the computed engagementRate on actual recent posts show whether that audience is real, and isHighEngagement flags the posts worth citing back in negotiation without recalculating the ratio by hand for every post.

Agencies tracking clients and competitors

Agencies running the same URL list on a schedule — a client's own posts plus a set of competitor posts — get comparable engagementRate and likeToCommentRatio values across runs without re-deriving them each time. Feeding the URL list through an Apify schedule turns a one-off check into a recurring benchmark report.

Market research and social analysts

Building a dataset of public posts around a topic, hashtag campaign, or niche (collected as a URL list from search or a monitoring tool) and running them through this Actor produces a consistent, comparable set of engagement metrics and owner follower counts — useful for density mapping or comparing engagement distribution across a niche rather than reading one post at a time.

AI agents and automated pipelines

An agent that needs structured Instagram post data as a tool call gets typed JSON back — like_count, engagementRate, ownerFollowerCount — with no HTML to parse and no selectors to maintain. Post-level engagement context can feed a monitoring pipeline or a RAG store without a separate scraping step.

🔼 Input sample

ParameterRequiredTypeConstraintsDescription
urlsYesarrayeditor: stringList🔗 Post URLs — paste Instagram post / reel / TV URLs here. One per line — bulk input supported. Example: https://www.instagram.com/p/ABC123/ or https://www.instagram.com/reel/XYZ456/
enrichOwnerProfileNobooleandefault true👤 Enrich Owner Profile — when ON (default), each post's owner is looked up for real biography, external link, follower count and following count — fixing the base actor's follower/following data, which was almost always empty. Turn OFF to skip the extra lookup and return post data only.
minEngagementRateNonumberdefault 0.03, minimum 0🎯 High-Engagement Threshold — minimum engagementRate ((likes + comments) / followers) for a post to be flagged isHighEngagement = true in the output. Example: 0.03 = 3%. Default is 0.03.
proxyConfigurationNoobjecteditor: proxy🌐 Proxy (optional) — leave collapsed for the default automatic routing, which adapts on its own if a request needs a different route. Expand to pin a specific proxy configuration.

Example input:

{
"urls": [
"https://www.instagram.com/p/Bq-mIJWgUAU/",
"https://www.instagram.com/reel/CgzOZz5DWaQ/"
],
"enrichOwnerProfile": true,
"minEngagementRate": 0.03
}

⚠️ The most common input mistake is pasting a profile URL, or another Instagram page that isn't a post/reel/TV URL, into urls. The Actor doesn't reject it upfront — it's passed through to the fetch step and comes back as an error row ("Post not found or no longer public." or a temporary-access message) instead of a clean validation error. A bare shortcode (e.g. Bq-mIJWgUAU with no URL) is accepted too, but it is always normalized to a /p/<shortcode>/ URL — if that specific shortcode actually requires the /reel/ path, paste the full URL instead of the bare code.

🔽 Output sample

Results are written to the run's dataset as one JSON row per submitted URL, and can be exported as JSON, CSV, Excel, or the other formats the dataset export supports. The default dataset view surfaces 25 of these columns as a table; every field listed above is present in the underlying row.

Post fetched successfully (trimmed)

{
"post_id": "1927145376125632532",
"short_code": "Bq-mIJWgUAU",
"username": "hikeinlandempire",
"thumbnail_url": "https://scontent.cdninstagram.com/.../small.jpg",
"is_affiliate": false,
"is_paid_partnership": false,
"is_ad": false,
"is_insights_as_brand": false,
"is_caption_edited": false,
"has_ranked_comments": false,
"like_count": 2132,
"comment_count": 98,
"video_view_count": null,
"video_play_count": null,
"post_date": "2018-12-04T18:00:52.000Z",
"display_url": "https://scontent.cdninstagram.com/.../large.jpg",
"alt": "Photo by hikeinlandempire on Instagram",
"location": null,
"caption": "Sunrise from the ridge today.",
"video_duration": null,
"video_url": null,
"sponsor_user": [],
"upcoming_event": null,
"owner": {
"id": "123456789",
"username": "hikeinlandempire",
"is_verified": false,
"profile_pic_url": "https://scontent.cdninstagram.com/.../profile.jpg",
"full_name": "",
"is_embeds_disabled": false,
"is_private": false,
"is_unpublished": false,
"edge_owner_to_timeline_media": { "count": null },
"edge_followed_by": { "count": 104264509 },
"edge_following": { "count": 92 },
"biography": "Trails & sunrises 🏔️",
"external_url": "https://linktr.ee/hikeinlandempire",
"follower_count": 104264509,
"following_count": 92
},
"latest_comments": [
{
"id": "17912345678901234",
"text": "Stunning shot!",
"created_at": "2018-12-04T19:03:11.000Z",
"did_report_as_spam": false,
"owner": {
"id": "987654321",
"is_verified": false,
"profile_pic_url": "https://scontent.cdninstagram.com/.../commenter.jpg",
"username": "trailfan22"
},
"viewer_has_liked": false,
"edge_liked_by": { "count": 4 },
"is_restricted_pending": false,
"edge_threaded_comments": {
"count": 0,
"page_info": { "has_next_page": false, "end_cursor": null },
"edges": []
}
}
],
"scrapedAt": "2026-08-15T09:12:41.000Z",
"ownerBiography": "Trails & sunrises 🏔️",
"ownerExternalUrl": "https://linktr.ee/hikeinlandempire",
"ownerFollowerCount": 104264509,
"ownerFollowingCount": 92,
"ownerIsPrivate": false,
"ownerProfilePicUrl": "https://scontent.cdninstagram.com/.../profile.jpg",
"url": "https://www.instagram.com/p/Bq-mIJWgUAU/",
"engagementRate": 0.0214,
"likeToCommentRatio": 21.76,
"postAgeDays": 2807,
"isHighEngagement": false
}

Post that couldn't be collected

{
"url": "https://www.instagram.com/p/DELETEDPOST1/",
"error": "Post not found or no longer public."
}

The other two error messages this Actor pushes are "Temporarily unable to load this post. Please try again." (the page loaded but didn't carry the expected data after retries) and "Could not retrieve this post right now." (an unexpected failure). All three error shapes carry only url and error — none of the post, owner, or engagement fields.

⚠️ Error rows are pushed uncharged. Only a successfully collected post consumes a row_result charged event — the three error paths above call Actor.push_data() without a charged event name, so a not-found or failed URL costs nothing. To read only the paid, successful rows from the dataset, filter out any item that has an error key, e.g. [item for item in dataset_items if "error" not in item].

How do you filter and target specific posts?

Unlike a search-driven directory scraper, targeting here is direct: you supply the exact post, reel, or IGTV URLs you want (or bare shortcodes, normalized to a /p/ URL), rather than a query or category the Actor resolves on your behalf. There is no server-side filter that removes a row from the output — every valid URL you supply is attempted, and only enrichOwnerProfile (on/off) and minEngagementRate (the threshold behind isHighEngagement) shape what comes back, both applied after the post is already fetched. In practice, scope a run by curating the URL list itself — a competitor's recent posts, a shortlist of creators being vetted, or a fixed monitoring set — and use minEngagementRate downstream to sort the resulting rows by isHighEngagement rather than expecting the Actor to search or discover posts on its own.

▶️ Want to try other Instagram scrapers?

ScraperWhat it extracts
TikTok Scraper With Repost Insights DataTikTok videos with repost/share signal data
Facebook Reviews Scraper — Headlines, Tags & Reviewer DetailFacebook business reviews with headline, tags and reviewer detail
Facebook Video Transcript Extractor By Keyword SearchFacebook video transcripts found via keyword search
Snapchat Spotlight Scraper By Link, ID Or Share URLSnapchat Spotlight videos by link, ID, or share URL
Reddit Scraper: User Profiles & Subreddit ActivityReddit user profiles and subreddit activity

How to extract Instagram data programmatically

This Actor runs on the Apify platform like every other Apify Actor — one endpoint, one API token, structured JSON back.

Python example

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_API_TOKEN>")
run_input = {
"urls": [
"https://www.instagram.com/p/Bq-mIJWgUAU/",
"https://www.instagram.com/reel/CgzOZz5DWaQ/",
],
"enrichOwnerProfile": True,
"minEngagementRate": 0.03,
}
run = client.actor("instagram-post-details-scraper-with-engagement-data").call(
run_input=run_input
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
if "error" not in item:
print(item["short_code"], item["like_count"], item["engagementRate"])

Works the same way in Node.js, Go, Ruby, or cURL against the same Apify API endpoint.

Export to spreadsheets or CRM

Every dataset can be downloaded directly as CSV or Excel from the run's Storage tab, or pulled via the API. Map username, like_count, comment_count, engagementRate, ownerFollowerCount, and isHighEngagement straight to spreadsheet columns for a reporting sheet, or push the same fields into a CRM/BI tool through its own CSV or API import.

⚖️ Is it legal to scrape Instagram post data?

Scraping publicly available Instagram post pages is generally lawful; this Actor only returns what an unauthenticated visitor can already see on the post page — no private accounts, no login-gated content. That said, the output includes personal data — usernames, owner biography, follower/following counts, and commenters' usernames on latest_comments — so GDPR (if you're in or targeting the EU/EEA) and CCPA (for California residents) govern how you may store, process, and reuse it once collected; scraping a public page and retaining personal data long-term are treated differently under both regimes. Consult legal counsel for commercial applications involving bulk storage of personal data.

❓ FAQ

What happens if a post has been deleted or made private?

The row comes back as {"url": "...", "error": "Post not found or no longer public."} instead of post data — this is a genuine, stable outcome, not a temporary glitch, and it doesn't consume a charged event.

Can I get the post owner's profile data along with the post?

Yes. With enrichOwnerProfile on (the default), the Actor performs a second lookup and returns ownerBiography, ownerExternalUrl, ownerFollowerCount, ownerFollowingCount, ownerIsPrivate, and ownerProfilePicUrl alongside the base owner sub-object. Turn it off to skip that extra request and get post data only.

How accurate is the engagement and follower data?

The Actor returns whatever the public post and profile pages show at the exact moment of the request — like count, comment count, and follower count all reflect that instant, not a cached or averaged value. Because both numbers can change between runs, re-scrape a post shortly before you rely on its engagementRate for a time-sensitive decision.

How many posts can I get per run?

There's no maximum enforced in the input schema — every URL in urls becomes one row. Requests are processed with a fixed internal concurrency of 3 and a roughly 1-second delay (plus jitter) between them, with up to 3 retry attempts per post before it's marked as failed; none of these values are exposed as input parameters.

Does minEngagementRate filter out low-engagement posts?

No — it doesn't remove any row. It only sets the threshold used to compute isHighEngagement; every URL you submit that can be fetched is returned regardless of its engagement rate, so you can sort or filter on the flag downstream instead of losing data upfront.

Why is a post's total post count missing from the owner data?

It's left out deliberately rather than shown as a fabricated zero. The public, logged-out profile page this Actor reads doesn't reliably expose a post-count field for an anonymous viewer, so it's omitted instead of being shipped as an always-empty or misleading field.

Does Instagram Post Details Scraper With Engagement Data work with Claude, ChatGPT, and AI agent frameworks?

Yes, as an HTTP endpoint. It isn't published with its own MCP server, but any agent framework that can call the Apify API or apify_client — including tool-calling setups in Claude, ChatGPT, or a custom LangChain/LangGraph agent — can invoke it and parse the typed JSON response directly.

Can I use this Actor without an Instagram account or API key?

Yes. It reads public post pages the same way a logged-out visitor would — no Instagram login, password, or developer app is required. You only need an Apify account to run it.

Are the is_affiliate, is_paid_partnership, is_ad, and similar flags reliable?

No — treat them as placeholders, not real signals. is_affiliate, is_paid_partnership, is_ad, is_insights_as_brand, has_ranked_comments, sponsor_user, and upcoming_event are kept in the output for schema compatibility, but the public, logged-out page this Actor reads doesn't expose those signals for an anonymous viewer, so they're always returned at their honest default (false, [], or null) rather than a fabricated value.

Conclusion

Instagram Post Details Scraper With Engagement Data turns a list of post, reel, or IGTV URLs into one comparable JSON row per post — real post metrics, real owner follower/biography data, and computed engagement analytics, without chaining a separate profile scrape by hand. It fits marketers vetting creators, agencies benchmarking clients and competitors, researchers building comparable post datasets, and AI agents that need typed engagement data as a tool call. Add your URLs and run it directly from the Apify Console, schedule it, or call it through the Apify API.