First version.
- Input: a list of post and reel addresses (
/p/…, /reel/…, /reels/…, /tv/…, with a user name in front or a query string), short codes or numeric post ids.
- One row per post: likes, comment count, exact publish time, caption with hashtags and mentions, kind, the parts of a carousel, tagged accounts, co-authors, location, topics; for a video or reel its length, sound and file address.
includeVideoStats (on by default): the embed page of videos, reels and carousels is read too — videoViewCount, ownerFollowers, engagementRate, marked with videoStatsSource: "embed".
- Two addresses of one post are delivered once. Lines that are not a post address, posts that are not there or not shown, and posts Instagram did not answer for get free status rows.
- A hidden like count is
null with likesHidden: true, not the placeholder Instagram sends.
- Batch mode; the same code answers
GET /post?url=… in Standby mode.
- Event:
post-details, one per delivered row.
Added on 2026-10-09, before the first release:
playCount for reels (includeReelPlays, on by default): the play figure of the reel's tile on its owner's Reels tab. The tab is read from its top, at most three pages — 36 tiles — per different owner in a run, and each owner's tab once however many of the owner's reels are in the list. A reel further down has playCount: null; playCountSource is reels-tab or null, and the run's closing message says how many reels came without a play count and why. videoViewCount (the embed page's counter) stays: the two are different counters — on 18 reels that had both, the play count was 2.2 to 7.7 times the view count. Measured through Apify datacenter proxy: 18 of 20 reels from the top of five accounts' tabs came with a play count; of 55 reels on tiles 30 to 60 of two accounts' tabs, 12 did (12 of 12 on tiles 30–36, 0 of 43 further down).
ownerFollowers and engagementRate for single photos too. A photo's embed page shows the follower count only shortened, so the count is read from the owner's profile: one request per different owner, and none where an embed page of the same owner has already given the count in the run. The same road serves a post whose embed page gives nothing. ownerFollowersSource is embed, profile or null. Measured: 60 of 60 rows with a follower count and a rate (46 embed, 14 profile).
- Requests leave from the run's own address. When Instagram turns it away the Actor moves to Apify Proxy by itself, and a request for a post, a profile or a Reels tab that every datacenter address tried has turned away goes out once more through a residential address when the account has them. The run's log and the
SOURCE_REPORT record say which road was used. The input form's proxy field now starts as "no proxy".
- The start-up request is a post request, this Actor's own kind, instead of a profile request: a post query Instagram has changed ends the run before anything is read, and the start-up no longer spends one of the few profile requests Instagram allows an address.
- A request for an owner's Reels tab or profile that fails because Instagram changed the query behind it is reported as "this Actor could not read … (please report this run)", not as "did not answer"; the post is delivered either way.
- Output columns: 46 → 49 (
playCount, playCountSource, ownerFollowersSource). No column was renamed or removed.
- Requests to one address start at least 80 ms apart (12 a second): a platform run of a sister Actor that sent about 27 a second from its own address was answered HTTP 429 after 115 requests and had to move to the proxy.
- The closing message of a run in which Instagram answered for no post says "run them again later" once, not twice.
Shared modules after the independent reviews of the sister Actors (this Actor's README has not had its own review yet):
- A proxy set in the input is the road of every request: the run does not move to Apify Proxy or to a residential address by itself; a setting the platform refuses ends the run with a message before anything is read (it used to go on without a proxy).
- The start-up check of the Reels tab (asked when
includeReelPlays is on) requires a tab with entries and their play counts: an empty or figureless answer for the check profile ends the run before anything is read.
- Lines: Instagram's app link
instagram.com/_u/<name> and a post address with the user name in front are read as what they are (this Actor takes post lines; a profile line gets a free status row as before).
- Messages: a row whose write or charge failed "may be in the dataset" (the Actor cannot tell which half failed); a run whose rows could not be written no longer says "Instagram did not answer"; the closing log line says per event whether it was charged, and a price record that does not name this Actor's event is said in the log of every run.
- Requests to one address start at least 80 ms apart (12 a second): in a platform run of another Actor of this family, which shares this request code, about 27 requests a second from the run's own address were answered HTTP 429 after 115 requests.
- A post answer without the post's details — not even its time — is no post: the line gets a free status row that asks you to report the run, instead of a charged row of nulls. Not seen in any run; the rule follows an independent review of a sister Actor.