# Changelog of Instagram Post Scraper (`fertech/instagram-post-scraper`) Actor

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

## Changelog

### 0.2 — 2026-09-26

#### Changed — the Actor now reads Instagram's public embed page

The post page cost roughly 128 KB per result, and videos cost a second
request on top of it for the view count. The embed page carries the same
counts — verified identical to the digit, fetched from both surfaces at the
same moment — in 54-65 KB, with the view count already included. One
request per post instead of two, at under half the bytes.

#### Breaking — nine fields are now always empty

Present in every record, empty, so existing integrations keep parsing:

| Field | Now |
|---|---|
| `timestamp` | `null` |
| `videoUrl` | `""` |
| `originalWidth`, `originalHeight` | `null` |
| `firstComment`, `latestComments` | `""`, `[]` |
| `ownerFullName` | `""` |
| `alt` | `""` |
| `isCommentsDisabled` | `false` (a default, not a reading) |

Everything else is unchanged, including `likesCount`, `commentsCount`,
`videoViewCount`, `caption`, `hashtags`, `mentions`, `displayUrl`,
`dimensionsWidth`/`Height`, `videoDuration`, `productType`, `musicInfo`,
`ownerUsername` and `ownerId`.

#### Fixed

- A deleted post is still reported as `not-found`. The embed answers HTTP
  200 for one rather than 404, so this is now decided by the payload rather
  than the status code — keying on status would have called every deleted
  post a success.
- A throttled response is still retried rather than billed. On this surface
  it arrives as a larger page with no payload at all, which is a different
  shape from a deleted post, so the two stay distinguishable.

### 0.1 — 2026-09-23

First release.

- Scrapes Instagram post, reel and IGTV URLs over plain HTTP — no login,
  no browser.
- Accepts the username-prefixed URL forms (`/<username>/p/<code>/` and
  `/<username>/reel/<code>/`) and share links carrying `?igsh=`, `?igsi=`
  or `?stkn=` tracking parameters. Duplicates are charged once.
- Exact like and comment counts, read from the page's embedded payload
  rather than the rounded counts in the page's meta tags.
- Absent counts are reported as `null` rather than `0`.
- Reports `videoViewCount` for videos, read from the post's public embed
  page. Views are not plays, so `videoPlayCount` stays `null` rather than
  being filled with a different metric.
- Returns the comments Instagram embeds in the post page, with author,
  like count and timestamp, at no extra cost per post.
- `musicInfo` reports `uses_original_audio: null` when Instagram publishes
  no track metadata, instead of inferring a value that could be wrong.
- Retries automatically when Instagram withholds post data, which it does
  intermittently, rotating the session once it has failed enough times.
- Every submitted URL is charged once, whatever the outcome — delivered,
  `not-found`, `invalid-url`, `unsupported-page`, `blocked` or `network`.
  An error record is billed the same as a delivered one, because the request
  was made and the bandwidth spent. Retries and duplicates are not charged
  on top, and a charge never happens without its record.
