# Changelog of Instagram Profile Posts Scraper — Post History by Profile (`foxlabs/instagram-profile-posts-scraper`) Actor

- **URL**: https://apify.com/foxlabs/instagram-profile-posts-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/foxlabs/instagram-profile-posts-scraper.md

## Changelog

### 0.1 — 2026-10-09

First version.

- The posts of public Instagram profiles — photos, carousels and reels — from each profile's own list as Instagram shows it to a visitor who is not signed in: 12 posts a request, the posts the owner pinned first, then newest first, until the list ends or a limit is reached.
- A row from the list carries the post's ID, short code and address, its kind, the caption with its hashtags and mentions, Instagram's description of the image, the image's address, the number of items of a carousel, the account the post belongs to and the profile it was listed under, and two approximate times: a time read from the post's ID (`takenAtApprox`: when the post was made, which can be hours before it went up) and the day Instagram's own description of the image names (`publishedDayApprox`; `null` when the description does not open with a day, as when its owner wrote it; read by its English month name). The list carries no like count, no comment count and no exact time.
- `includeDetails`: one more request per post adds the like and comment counts, the exact time, location, co-authors, tagged accounts, every item of a carousel, Instagram's topic labels, size, and for a video its length, file address and sound. A hidden like count is `null` with `likesHidden: true`. A post whose details Instagram does not give is still delivered as the list has it (`detailsSource: null`), and the status message counts such rows and says why.
- `postTypes`: only photos, carousels or videos (reels included); other kinds are skipped before anything more is read for them.
- `onlyNewPosts` with a `listName`: a run delivers only the posts the list has not delivered before, looking at the first `maxPostsPerProfile` posts of each profile.
- A line that brings no posts gets a free status row that says why, each in its own words: not a profile, no such user name, not shown to visitors who are not signed in, private, no posts, the same profile as another line. A post that two of the profiles list is delivered once.
- Exact limits: rows per profile, rows in total and the run's spending limit. A run the platform restarts continues from the rows it already wrote.
- Two events: `post` for a row made from the list alone, `post-detailed` for a row with details. Status rows are free.
- The start-up check asks a page of a post list — the Actor's own kind of request — and ends a run before anything is read when Instagram does not answer or has changed the queries of its public page. When twelve lists in a row get no answer during a run, the run stops asking and its status message names the lines it did not get to.
- Requests leave from the run's own address. If Instagram turns it away, the Actor moves to Apify Proxy by itself, and a request that every datacenter address has turned away goes once more through a residential address if the account has them. The run's log and its `SOURCE_REPORT` record say which road was used.
- 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.

### 0.1.2 — 2026-10-10

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).
- **`listName` is looked at only when `onlyNewPosts` is on**, and the form refuses a name that does not fit before the run starts. Before, a name left in the form ended a run that did not use it.
- **The start-up check** requires a post list with entries for the check profile: an empty answer ends the run before anything is read.
- **Lines:** Instagram's app link `instagram.com/_u/<name>` is read as the profile; a post address with the user name in front (`instagram.com/natgeo/p/…`), a highlight link and an invitation link are refused as profile lines with a free status row.
- **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 events is said in the log of every run.
- **`post-detailed` only for real details:** a details answer that holds none of them — not even the post's exact time — no longer counts as details; the row is delivered from the list alone, carries the `post` event, and the status message counts it under "answered by Instagram without the post's details". Not seen in any run; the rule follows an independent review of a sister Actor.
