# Changelog of Pinterest Scraper — Pinterest Keyword Search, Boards & Creators (`afanasenko/pinterest-scraper`) Actor

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

## Changelog

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

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

#### Fixed

- A search that was accepted but did not finish is now reported as not completed (nothing charged)
  instead of "no results".

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

#### Fixed

- The "Welcome to the paid plan" message now appears only on your first paid run instead of on
  every paid run. 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.23] - 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.22] - 2026-08-25

#### Added

- **Withheld free-plan preview rows.** When the free cap truncates a run, up to 25 results the
  run had already fetched are published at the end of the dataset as preview rows:
  `row_status = 'withheld_free_plan'`, titles/descriptions/board names real, links and
  identifiers locked, and a `why_withheld` sentence naming exactly what was held back. Preview
  rows are never charged and never counted in run totals. What stays visible differs by mode —
  creator results lock the identity (that IS the product) and show only the follower count;
  keyword suggestions get no preview rows at all. Every delivered row now carries
  `row_status = 'delivered'`, so previews are filterable. Two new dataset columns appended last.
- **Monthly free budget: 150 rows per calendar month** across all runs of a free account
  (resets on the 1st, UTC). A run started after the budget is spent succeeds with $0, fetches
  nothing, and explains itself (`USER_MESSAGE free_monthly_limit_v1`, `RUN_SUMMARY.blocked`
  with the reset date, terminal status message). When less than a full run's cap remains, the
  run is clipped to the remainder and every message quotes the effective number.

#### Fixed

- The free-cap message counted the withheld tail structurally as "1 more row" no matter how
  many fully-fetched rows were discarded; it now reports the honest count (deduplicated,
  filter-checked), e.g. "33 more rows had already arrived and were not delivered".

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

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.20. Saved tasks
continue to work identically.

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

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.18. Saved tasks
continue to work identically.

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

Maintenance build — no user-facing changes, and the entry first published here was withdrawn.

It announced a new message for a run in which every result Pinterest returned was one the run had
already delivered. That run cannot happen: a result is only recognised as a repeat after at least
one has been delivered, so a run that delivers nothing has nothing to compare against. The message
could never have appeared, and 0.0.20 removes it. A run of that shape is already covered — if your
filters dropped everything you are told so, and if the search itself failed you are told that
instead.

Input schema, output dataset columns, KVS records, console output, error messages, defaults, and
pricing are all unchanged from 0.0.18.

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

#### Fixed

- **A run that gave you everything you asked for no longer reports that it hit a limit.** When you
  set a "max results" number and Pinterest had exactly that many, 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 results were
  actually held back.
- **The free-plan message no longer claims there was more to find without checking.** It used to
  tell every free run that reached 50 rows "Pinterest had more to give for these keywords", whether
  or not anything had been. It now appears only when something really was held back, and it says
  what: how many rows had already arrived and were not delivered, and how many of your keywords were
  never searched.
- **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 `itemCap`, `capSource` (whose limit stopped the run — your own
  "max results" number, the free-plan ceiling, or the built-in demo), `itemsHeldBack` and
  `keywordsUnsearched`. 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 results" number. Both used to be reported the same way.

### \[0.0.17] - 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.16. Saved tasks continue to work identically.

### \[0.0.16] - 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.15. Saved tasks continue to work identically.

### \[0.0.15] - 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.14. Saved tasks continue to work identically.

### \[0.0.14] - 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.13. Saved tasks continue to work identically.

### \[0.0.13] - 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.12] - 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.11] - 2026-07-30

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

### \[0.0.10] - 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 row does not
  always satisfy — a pin with no video, a board with no cover image — 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 image 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** — pins, video pins, boards, creator
  profiles and keyword suggestions, with the outbound link and destination domain on every pin —
  and the price line shows the per-result price instead of a generic label.

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

#### Fixed

- **The status page is saved at all now.** Its saved copy was being rejected on every single run,
  so there was nothing to fall back on once the run's container went away.
- **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.

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

#### Added

- **Related actors now list Pinterest Profile Scraper**, and Mode 4 points at it: Pinterest's
  creator search does not carry an account's bio or website links, and that actor looks each one up
  to return them.

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

#### Removed

- **The "Sort by" input is gone, because one of its two options could never work.** Pinterest does
  not serve newest-first results to this actor: the request is accepted and comes back with an
  empty list for every keyword, so choosing `recent` produced a run with zero rows — and the run
  then blamed the keyword, suggesting it was too specific or misspelled. Rather than keep an option
  that can only disappoint, the field has been removed and every search now uses Pinterest's
  relevance ranking. Existing runs and saved tasks are unaffected: a leftover `sortBy` value is
  ignored rather than acted on. The trend-watching workflow built on it has been withdrawn from the
  documentation.

#### Added

- **New Example tasks section** linking straight to ready-to-run searches for pins, product pins,
  video pins, boards, creators and keyword suggestions.

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

#### Fixed

- **Asking for more than ~147 pins in one run returned nothing.** Any Mode 1 or Mode 2 run with a
  high `maxItems` asked for a larger page than the search accepts, so it was rejected before a single
  row came back. Page size is now kept within that limit.
- **A search that fails no longer reports "no results".** A request that never completed used to
  produce the same message as a keyword nobody pins about, sending customers off to rewrite a
  keyword that was never the problem. Those runs now say the search could not be completed, still
  cost nothing, and are recorded as `search_failed` rather than `no_results`.

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

#### Fixed

- The "leave a review" link on the live status page pointed at a placeholder actor id and led
  nowhere.

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

#### Fixed

- **A keyword Pinterest cannot search no longer triggers the demo run.** Typing a keyword in a
  script Pinterest's search rejects (Japanese, Cyrillic, Arabic…) left the field looking "empty" to
  the demo fallback, so the run quietly searched the built-in sample keyword instead and charged for
  rows the customer never asked for. Those runs now stop at $0 and explain what happened.
- Keywords that cannot be searched are listed once in `SKIPPED_ITEMS`, not twice.
- A run whose filters dropped everything now reports `all_filtered` rather than `no_results`, so the
  two cases are distinguishable after the fact.

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

#### Fixed

- **An empty first page no longer reads as "no results".** Pinterest occasionally answers a valid
  search with an empty list and no error — the same keyword returns dozens of pins seconds later
  (caught by the first cloud smoke). Every mode now asks a second time before reporting that a
  keyword found nothing. Deeper pages are unaffected: running dry there is how a keyword ends.
- Pins that link nowhere no longer report Pinterest's internal `"Uploaded by user"` placeholder as
  their destination domain — `outbound_domain` is `null` when there is no outbound link.
- `source_type` no longer surfaces Pinterest's internal `"classifier data"` placeholder, which
  described nothing about the destination page.

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

First build. Build 0.0.2 carries identical code — it only re-baked the image so the actor's
environment variables are attached at runtime.

#### Added

- **Mode 1: Search pins by keyword.** Paginates through Pinterest until your `searchPinsMaxItems`
  number is reached or new pins stop arriving. `sortBy` picks between Pinterest's relevance ranking
  and newest-first.
- **Mode 2: Search video pins by keyword.** Mode 1's row shape narrowed to pins carrying video, plus
  a direct video URL, poster frame and duration in seconds.
- **Mode 3: Search boards by keyword.** Board name, description, pin count, sections, cover image,
  last-updated date, and the owner with their follower count.
- **Mode 4: Search creators by keyword.** Follower, pin and board counts plus the date of the
  account's last save, so a dormant account is visible before you contact it.
- **Mode 5: Get keyword suggestions.** Pinterest's own autocompletions for a seed phrase, ranked.
- **Run-wide deduplication.** Pinterest repeats pins across pages; repeats are dropped before the
  paid event fires and counted in `RUN_SUMMARY`. Input keywords that normalise to the same query are
  searched once.
- **Post-fetch filters** that reduce the bill as well as the output: `minReactions`,
  `onlyPinsWithLink`, `excludePromotedPins`, `linkDomainContains`, `minCreatorFollowers`,
  `minBoardPins`.
- **Empty input runs a 10-row demo** instead of failing, on any mode.
- **Free plan delivers up to 50 rows per run**; every mode, filter and field stays available.
- **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** — unsearchable keyword, no results, all rows
  filtered, demo run, free cap reached — each naming the next action. Runs that deliver nothing are
  not charged.

#### Notes

- Keywords accept letters, digits and spaces; accents are folded (`café décor` → `cafe decor`) and
  anything left unsearchable is skipped with a reason in `SKIPPED_ITEMS`.
- Save and repin counts are not exposed by Pinterest to logged-out clients, so `reactions` is the
  only engagement number in the output.
- Missing values are `null`, never the string `"N/A"`.
