# Changelog of Instagram Comments Scraper — Top-Level Comments, No Login (`foxlabs/instagram-comments-scraper`) Actor

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

## Changelog

### 0.1 — 2026-10-09

First version.

- The top-level comments of Instagram posts and reels, newest first, to the end of Instagram's list or to `maxCommentsPerPost`: text, time, like count, GIF mark, the author's verified badge — and on every row the post, its owner and the number of comments Instagram shows for it.
- Authors are not named by default: each row carries `authorCode`, a pseudonym that is the same for the same author in every run. `includeAuthorNames` adds the user name and user id Instagram shows. No profile picture is ever written.
- Replies are not delivered: Instagram shows a visitor who is not signed in neither their texts nor their number.
- "Only comments not delivered before": a named list follows each post and delivers its new comments oldest first, so what does not fit into one run is delivered by the next one.
- A line that is not a post, a post Instagram does not show to a visitor who is not signed in, comments turned off, a post without comments: each gets a free status row that says which.
- One event per delivered comment (`comment`); status rows are free. A spending limit that is kept; runs that continue after a restart by the platform.
- Standby-ready (`GET /comments`), published as a batch Actor.

Changed before release (2026-10-09, after the first measurements):

- **No `replyCount` column.** The first build carried one. Instagram sent a reply count for none of the 4,156 comments read while the Actor was built (11 posts; its second comments query gave none either), so the column would have been empty on every row. Rows now have 20 columns.
- **Requests leave from the run's own address.** The first build sent every request through Apify Proxy. Now the proxy is the second road: when Instagram turns the run's address away the Actor moves to Apify Proxy by itself, and a request 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. The input form's proxy field is off by default; turn it on only to send every request through a proxy.
- Requests to one address start at least 80 ms apart (12 a second), a rule of the shared client; in a platform run of another Actor of this family about 27 requests a second from the run's own address were answered HTTP 429 after 115 requests. This Actor's own long run on the platform (3,027 comments) was turned away after 52 requests in 15 seconds and went on through Apify Proxy; the pause does not change that.
- Measured on the Apify platform on 2026-10-09 (build 0.1.1, 512 MB): a post read to its end gave 432 comments in 13 seconds; a post with 3,027 listed comments was read to its end in 187 seconds, and when Instagram turned the run's address away the Actor went on through Apify Proxy without losing a row; a run restarted part-way on our request delivered no comment twice. The runs are listed in the README.

### 0.1.3 — 2026-10-10

After an independent review of the README (23 findings, `_qa/q15-refutation-2026-10-09.md`):

- **`authorCode` is a keyed code of your account.** It is the first 16 hex characters of the HMAC-SHA-256 of the numeric user id under a random key that is made on your first run and kept in the key-value store `instagram-comments-settings` of your Apify account. The same author has the same code in every run of your account; another account gets other codes for the same author; without the key a code cannot be turned back into a user id. Before, the code was the start of a plain SHA-256 of the user id — the same for every user of the Actor, and reversible by trying user ids. **Codes of runs before this build do not match the new ones.** Only the author record's `pk` is used for the code; a node without one gets `authorCode: null`.
- **The start-up check asks this Actor's own query** (the comments query, for a post id no post has) instead of the profile query. A comments query Instagram has withdrawn now ends the run before anything is read; one withdrawn during a run makes the posts still to be read fail with the "has to be updated" message, and the run no longer says "run it again later".
- **A list handed back in circles** (a page Instagram had given before, or three pages without a comment the list had not shown) counts as a list that stopped, not one that ended: a plain run keeps what it brought and says so; an "only new" reading delivers nothing of it, so that the next run starts over. Before, such a reading ended as "Done" and, in an "only new" run, could leave new comments undelivered for good.
- **Comments Instagram listed late** (older than the list's last look, never delivered, standing above a comment the list had delivered) are counted: in the status message and per post in `SOURCE_REPORT`. They are still not delivered; the README says how to get them. Comments below the delivered ones are not counted: they lie below the list's first look and were never wanted.
- **`listName` is looked at only when `onlyNewComments` is on**, and the form refuses a name that does not fit before the run starts. `postUrls` is required in the form (at least one line).
- **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).
- **Messages:** a spending limit that pays for no row says so (it used to say "no post had comments to deliver"); a run whose rows could not be written no longer says "Instagram did not answer"; a row whose write or charge failed "may be in the dataset"; a cut list says what a second run costs; "No new comments" says what was looked at.
- **Texts corrected:** the title and store description (top-level comments, down to the first one — not "every"), what one reading can lack, what a row leads to even without a name, the events (a row without owner and count is charged), the roads, the order of rows, `input` on a status row about the whole run, a figure that had no record.
