All notable changes to this actor are documented here.
- Free plan: when a run is reduced because many new free accounts are running this Actor at once, the run's status line now says so first, so tools and AI agents calling it see the reason.
- Exclude Profiles With Keywords now also reads a list sent from code as a JSON string (
'["SEO","marketing agency"]'); before, such a string was split into broken words that matched nothing.
- Exclude Profiles With Keywords (
excludeKeywords, empty by default) in Filters: skip accounts whose bio or name contains any of these words or phrases — e.g. keep constructor in Filter by Keywords and drop accounts that also say SEO or marketing agency. It searches the same place as Search Keywords In, matches whole words without regard to case (seo drops SEO expert and #seo, not Seoul), and works with or without Filter by Keywords and with either AND/OR combination. Like every filter here, it runs after an account is read, so a skipped account is still charged — except on your first run, as for any filter.
Nothing changed for runs that leave it empty.
- Free plan: clearer wording of the temporary reduced-run notice.
- Free plan: the 15 runs a month are now counted exactly, even when several runs start at once. If the count cannot be read, the free run stops before any work, charges nothing and says so — run it again in a minute. Paid plans are not affected.
- Free plan: a reduced run for new accounts during a surge. While an unusually large number of newly created accounts run this Actor at once, free runs from new accounts are reduced for a short while to the first account of the list, without the account country & age columns. The run says so, the accounts it did not read come back as rows that cost nothing, and it counts as one of the 15. Paid plans are never affected.
- Maintenance: the end-of-run bookkeeping is more reliable. Results, columns and price are unchanged.
- Account country & creation date — a new option,
includeAboutSection (off by default), in the «What to extract» section. For each delivered profile it reads Instagram's «About this account» panel and adds three columns after all existing ones: Account Country, Account Created (YYYY-MM) and Username Changes (a count, not the former names).
- It is charged as a separate event, Account country & age lookup, $0.005 for each delivered profile whose panel answered, starting 12 November 2026. Until then the option is ignored, no columns are added and nothing extra is charged; the run log says so. Profiles your filters reject are not looked up, and an empty or unanswered panel is not charged.
- 22 output columns when the option is on (19 without it).
RUN_SUMMARY.aboutSection reports how many panels were read, empty, unanswered and charged when the option is on.
Nothing changed for runs that leave the option off: same columns, same charges.
- The live and finished-run screens have a new look. What the run did — the result, its numbers, time and cost — sits on the left; the one thing to do next sits on the right: where to find your results, the upgrade, or what to fix when a run returns nothing. When a run finds nothing because of your filters, the screen now shows how many profiles each filter rejected as bars. The screen also fits the smaller Output panel in Console. The wording, links, results, columns and price are unchanged.
- The free-plan per-run limit screen now has an Upgrade button.
- Security update. The Actor now runs on Node.js 22 with the latest Node.js and certificate security fixes. Inputs, results, columns and price are unchanged; saved tasks keep working.
- The rating request now appears from your first successful run. After a successful run you may see a short note asking for a star rating — stars only, no text needed — with a button that opens the rating dialog. Later successful runs started in Console show a small "Rate this Actor" button on the finished-run screen until you leave a written review; API and scheduled runs show the note at most twice. It is never shown on demo, failed or empty runs, and never to runs started by an AI agent. Results, columns and price are unchanged.
- New rating card on the finished-run screen. The run's numbers move to the left; the right side shows five stars — hover one to see what it means — and the two steps that follow a click.
- A one-time request to rate the Actor. After your second successful run you may see a short note asking for a star rating, with a button that opens the rating dialog. It appears once, and at most once more a month later if you keep using the Actor; it is never shown on demo, failed or empty runs, and never to runs started by an AI agent. Results, columns and price are unchanged. The always-on "Leave a review" link on the finished-run screen is removed.
- The Upgrade and "Leave a review" buttons on the finished-run screen work again. The screen you see in the Output tab after a run linked through the run itself, which had already ended, so these buttons opened an error page. They now open the Apify pricing page and the review page directly. Results, columns and price are unchanged.
- The Store title is now «Instagram Email Scraper & Instagram Phone Number Scraper», and the README heading matches it. Input, output and price are unchanged.
- The sample output row in the README now shows a placeholder link (
https://example.com/links) instead of a real account's link page. The scraper, its columns and its price are unchanged.
- Internal maintenance. Results, columns and price are unchanged.
- Internal maintenance. Results, columns and price are unchanged.
- Contacts behind the bio link: when an account shows no email or phone on Instagram, the page its bio link opens is now checked too — a link-in-bio page like Linktree or Beacons, a WhatsApp link, or the account's own website (its home page and contact page). A contact found there fills the Email or Phone column and counts for the contact filter, so an account that keeps its contact behind the link is no longer turned down for having none. Same price per account.
- A phone number written in the bio text (for example "call (305) 555-0142") now counts like an email in the bio: it fills the Phone column and passes the phone contact filters.
- 19 output columns: the new Phone Source column (with Phone) says where the phone came from —
profile, bio, whatsapp, link_page or website. Email Source gains link_page and website.
- The upgrade hint now shows Apify's current starting price for paid plans: $19/month with $19 in platform credits (it said $29).
- Maintenance: groundwork for faster, better-targeted searches. No change to inputs, results, run time or price.
- A link that is not a username is now named in the run's status instead of turning into a meaningless word: when a run stopped because an entry was a link to a post or reel, the status replaced it with an unrelated word. It now says the entry is a link that is not a profile page. USER_MESSAGE in the Storage tab still lists every entry exactly as typed. Nothing is fetched or charged for such a run, as before.
- Low-yield runs now include free diagnostic rows in the results, with an early measurement when detectable inside the first 20 items and a final count. Notices do not count as profiles or contacts after a restart.
- Partial profile retrievals now explain saved and unread counts, distinguish permanent restrictions from read errors, and provide exact PARTIAL_RESULTS plus a manual RETRY_INPUT limited to unread accounts. Existing filters and budget remain in the retry; submitting it may incur normal charges.
- Completed status, output links and run summary expose the same partial-result diagnosis while preserving budget and filter explanations.
- 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.
- Clarified wording in the README and the storage record descriptions. Nothing changes in how the actor runs, what it returns or what it costs.
- 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.
-
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.
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.
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.
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.