# Changelog of Instagram Email Scraper — Emails, Phone Numbers & Contacts (`afanasenko/instagram-email-scraper`) Actor

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

## Changelog

All notable changes to this actor are documented here.

### \[0.1.21] - 2026-09-15

- **An input that rules out every account now stops before anything is read, and names the fields in conflict.** If every account in "Accounts to scrape" is also in "Exclude Accounts", or "Follower Count Range: Min" is higher than "Follower Count Range: Max", the run ends straight away with a message saying which fields to change — nothing is fetched or charged. Before, the first case ended as "You already have all of these", and the second read and charged every profile only to reject it.
- **The note for a run whose accounts were all excluded now suggests things this actor can do** — paste accounts you have not collected yet, or take accounts out of "Exclude Accounts" — instead of advice to widen a search this actor does not run.

### \[0.1.20] - 2026-09-10

- **Clarified wording in the README and the storage record descriptions.** Nothing changes in how the actor runs, what it returns or what it costs.

### \[0.1.19] - 2026-09-09

- **The empty-run explanation promised in 0.1.18 now actually reaches the results.** In that build the row was written but never emitted — it was placed earlier in the run than the explanation it carries, so the check that guards it was always false. The run's status line worked; the results row did not. Nothing else changed.

### \[0.1.18] - 2026-09-09

- **A brief hiccup no longer makes a real, public account look deleted.** When an account can't be looked up on the first try, it is now double-checked through a second, independent route before being reported as unreachable. Accounts that really are deleted, private, or mistyped are still reported exactly as before.

- **A run that returns nothing now says why in the results themselves.** Until now the explanation went to the run log, the status page and the USER\_MESSAGE record — none of which an API or MCP caller receives. An empty run now also returns one row carrying the same explanation, and the run's status line carries its headline.

- **Clearer wording when nothing could be scraped.** The end-of-run note no longer says "Nothing was charged" on runs where some accounts were read and then rejected by your filters — reading is what the charge is for, so the note now says which part was charged and which wasn't.

### \[0.1.17] - 2026-09-09

When a run cannot finish because something outside this actor refuses the request, it now
says so in one plain sentence instead of passing along whatever text came back. Input
fields, output columns, defaults and pricing are unchanged from 0.1.1.

### \[0.1.1] - 2026-09-04

**`Account Type` now tells business, creator and personal apart.** It read Instagram's
`is_business` flag, which is true for business accounts only — so every **creator** account,
professional and with a working Contact button, came back labelled `personal`. On the 44
accounts behind this actor's published contact rate, 18 are creators and 8 of them publish an
email or a phone.

- **New value `creator`.** The column is now `business` | `creator` | `personal`, read from
  Instagram's own account type rather than inferred from one flag.
- **New filter options.** «Professional (business or creator)» and «Creator only» join the
  account-type filter. If you were using «Business only» to mean "someone I can contact", switch
  to **Professional** — business only was discarding more than half the professional accounts on
  your list.
- **The published rates are restated by kind**, because the old two-way split averaged creators
  into "personal" and described neither: business **43%**, creator **39%**, personal **17%** —
  and every personal hit was an address typed into the bio, never a contact field.

No change to prices, to what is charged, or to any other column.

### \[0.1.0] - 2026-09-04

First release.

Reads a list of Instagram usernames and returns the contact details each account
publishes: email, phone, website, business category, bio, follower count and account
type. One read per account, no posts fetched, no login.

- **18 output columns**, one row per account you submit. Accounts held back by a
  free-plan ceiling come back by name as `not_analyzed` rows rather than as a count.
- **One paid event** — $0.01 per account read, whether or not it passes your filters.
  Not-found, private and failed reads are not charged, and a first run is not charged
  for accounts its own filters rejected (up to 100).
- **Free plan**: 30 accounts per run, 15 runs per calendar month. The monthly slot is
  reserved before the first read and handed back when a run ends without reading
  anything, so an aborted run cannot get around it.
- **A run that finds no contacts says so**, and says whether that was ordinary for the
  length of the list or whether it says something about the list. On accounts drawn
  from real customer lists, 34% publish an email or a phone — so a short list coming
  back empty is expected, and a long one is not.
- **Resume from checkpoint** after a migration, a timeout or an abort, without paying
  again for the accounts already read.
