# Changelog of Pinterest Profile Scraper — Bio, Links & Recent Pins (`afanasenko/pinterest-profile-scraper`) Actor

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

## Changelog

All notable changes to the Pinterest Profile Scraper — Bio, Links & Recent Pins are documented here.
The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).

### \[0.0.19] - 2026-09-23

#### Fixed

- **A run now stops at its "Maximum cost per run".** Profiles are only looked up while the limit
  can pay for them. Everything charged is kept, and the run's message says how to get the rest.

### \[0.0.18] - 2026-09-23

#### Fixed

- The "Welcome to the paid plan" note now appears on your first paid run only. The count starts
  with this version, so if you already ran this actor on a paid plan you see the welcome once more.

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

#### Changed

- Clarified wording in the documentation, the changelog and the live status page description.
  Nothing changes in how the actor runs, what it returns or what it costs.
- When a run fails for a reason on our side, the error message now stays short and plain.

### \[0.0.16] - 2026-08-18

#### Fixed

- **A public account with no recent pins now says so, instead of leaving you to guess.** In Mode 2,
  an account that exists and is public but has nothing Pinterest lists publicly — everything saved
  to secret boards, or simply dormant — returned no rows and no explanation. On a free plan the run
  said nothing at all; on a paid one it could show the first-run welcome note in place of an
  answer. It now names the account, says the lookup itself worked and was charged, that the pins
  are what is missing rather than the account, and points at Mode 1 for the bio and links, which
  that same one charge already covers.

### \[0.0.15] - 2026-08-18

#### Fixed

- **A run that looked up everything you asked for no longer reports that it hit a limit.** When you
  set a "max profiles" number and had exactly that many targets, the run's `RUN_SUMMARY` record
  still said the cap had been reached — which reads as "your results were cut short" when nothing
  was cut short at all. The run now says it completed, and only reports a cap when profiles were
  actually held back.
- **The free-plan message no longer claims there was more to fetch without checking.** It used to
  tell every free run that reached the 10-profile ceiling "There was more to fetch for this input",
  whether or not there had been. It now appears only when something really was held back, and it
  says what: how many profiles were found and not looked up, and how many of your inputs were never
  processed.
- **The run's "Skipped (free limit)" figure on the live status page now appears.** It was calculated
  from a number that had already been reduced to the free-plan ceiling, so the condition behind it
  could never be true and the row never showed.

#### Changed

- `RUN_SUMMARY` now also records `profileCap`, `capSource` (whose limit stopped the run — your own
  "max profiles" number, the free-plan ceiling, or the built-in demo), `profilesHeldBack` and
  `targetsUnreached`. Existing fields, the dataset columns, the input schema and pricing are
  unchanged, and saved tasks continue to work identically.
- A run stopped by the free-plan ceiling now records that separately from a run stopped by your own
  "max profiles" number. Both used to be reported the same way.

### \[0.0.14] - 2026-08-17

Maintenance build — no user-facing changes. Input schema, output dataset
columns, KVS records, console output, error messages, defaults, and pricing
are all unchanged from 0.0.13. Saved tasks continue to work identically.

### \[0.0.13] - 2026-08-17

Maintenance build — no user-facing changes. Input schema, output dataset
columns, KVS records, console output, error messages, defaults, and pricing
are all unchanged from 0.0.12. Saved tasks continue to work identically.

### \[0.0.12] - 2026-08-12

Maintenance build — no user-facing changes. Input schema, output dataset
columns, KVS records, console output, error messages, defaults, and pricing
are all unchanged from 0.0.11. Saved tasks continue to work identically.

### \[0.0.11] - 2026-08-12

Maintenance build — no user-facing changes. Input schema, output dataset
columns, KVS records, console output, error messages, defaults, and pricing
are all unchanged from 0.0.10. Saved tasks continue to work identically.

### \[0.0.10] - 2026-08-10

#### Fixed

- **A failed run no longer prints raw technical failure text.** That text went into the run log and
  into the run's storage records, and on a connection problem it carried a server address. None of it
  was ever useful to you. Failures now read as a short plain message; the reasons you can act on are
  unchanged.

### \[0.0.9] - 2026-08-10

#### Changed

- The free-plan limit ids listed in the run's `FREE_LIMITS_APPLIED` storage record now use one
  shared vocabulary across all our actors, so the same limit reads the same wherever you meet it.
  The human-readable message on each entry is unchanged.

### \[0.0.8] - 2026-07-30

Maintenance build — no change to input, output or pricing.

### \[0.0.7] - 2026-07-29

#### Fixed

- **A row is no longer at risk of being held back because an optional field is missing.** The
  description of the output carried strict validation rules that a real Pinterest profile does not
  always satisfy — no website link, no recent pins — and a row that failed them could be rejected
  instead of saved. The rules are gone. Column names, order and contents are unchanged, and the
  avatar and pin previews in the Overview tab still work.

#### Changed

- **The Storage tab now names the records the run writes** instead of showing bare keys.
- **The Store listing now says what this actor returns** — bio, website links, follower count,
  join date, boards and recent pins — and the price line shows the per-profile price instead of a
  generic label.

### \[0.0.6] - 2026-07-28

#### Fixed

- **The status page now keeps up while a run is going.** Its saved copy was only written twice —
  once at the start and once at the end — so anyone opening it mid-run saw the run as it looked at
  second zero. It now refreshes every ten seconds.
- **The "Live status" link now works after a run has finished.** It pointed at the run's own
  container, which the platform shuts down as soon as the run ends, so opening it later showed
  nothing. It now opens the saved copy of the page, which stays available for as long as the run's
  storage does.
- Build 0.0.5 said the status page survived the end of a run. Its saved copy did, but the
  **link** still pointed at the container, so there was still nothing to open. Both halves are in
  place from this build.

### \[0.0.5] - 2026-07-28

Builds 0.0.2–0.0.4 are the same feature set; they only attached the actor's environment variables
and corrected how the live status page is stored.

#### Fixed

- **The live status page now survives the end of a run.** Its saved copy was being rejected on
  every run, so opening **Live Status** after a run finished led nowhere. The page is stored
  correctly from this build on.

### \[0.0.1] - 2026-07-28

First build.

#### Added

- **Mode 1: Get profiles by username.** One row per account — bio, every outbound link, primary
  website domain, follower count, join date, avatar, board count, last-save date and Pinterest's
  verification flags. Accepts a bare handle, an `@handle` or a full profile link.
- **Mode 2: Get a profile's recent pins.** Up to ten most recent pins per account, one row each,
  with pin link, image, title and publish date. Pinterest publishes ten and no more for a public
  profile, so this is a recency snapshot rather than an archive.
- **Mode 3: Find profiles by keyword.** Finds the accounts publishing about a topic and then looks
  each one up, so every row carries the bio and website links a plain search never returns.
- **Charged once per profile, never per row.** In Mode 2 that single charge covers all ten of that
  profile's pins. Usernames that resolve to nothing, lookups that fail, and Mode 3 candidates
  dropped before lookup are not charged at all.
- **Filters:** `minFollowers`, `onlyProfilesWithWebsite`, `websiteDomainContains`,
  `excludeAdsOnlyProfiles`. In Mode 3 the follower and ads-only filters run before each account is
  looked up, so those two reduce the bill as well as the output.
- **Primary website domain is picked past the social links.** Accounts routinely list Instagram
  before their own site; `website_domain` skips the social platforms so a lead list groups by the
  domain that matters.
- **Free plan looks up 10 profiles per run**; every mode, filter and field stays available.
- **Empty input runs a small sample** instead of failing, on any mode.
- **Storage records:** `RUN_SUMMARY`, `USER_MESSAGE`, `FREE_LIMITS_APPLIED`, `SKIPPED_ITEMS`, plus a
  self-refreshing live status page.
- **`USER_MESSAGE` covers every empty-run cause** — entry that is not a profile link, username with
  no public profile, lookup that could not complete, all rows filtered, demo run, free cap reached —
  each naming the next action.

#### Notes

- A username that does not exist is asked for twice before the run reports it as missing, so a
  momentary hiccup in the lookup is never presented to a customer as "this account does not exist".
- Follower and following *lists* are not available to logged-out visitors on Pinterest and are not
  offered here. The follower count is.
- Bios arrive HTML-encoded from Pinterest and are decoded before they reach the dataset, so an emoji
  in a bio is an emoji rather than `&#127807;`.
- Missing values are `null`, never the string `"N/A"`.
