# Pinterest Scraper & Trends — Pins, Boards, Profiles, Demand (`foxlabs/pinterest-scraper`) Actor

Pinterest pins from keywords, boards, profiles and pin links: outbound link and shop domain, product price and discount, reactions, saves, pinner and board. Plus the Pinterest Trends weekly search-interest series for each keyword (31 regions) and Pinterest's related searches.

- **URL**: https://apify.com/foxlabs/pinterest-scraper.md
- **Developed by:** [Berkan Kaplan](https://apify.com/foxlabs) (community)
- **Categories:** Social media
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 pins

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Pinterest Scraper & Trends — Pins, Boards, Profiles, Demand

Get Pinterest pins for any **keyword, board, profile or pin link**: title, image, **the shop or site each pin links to** (outbound link and domain), **product price, list price, discount and stock** for product pins, reactions and board. Keyword pins and pin links also come with the created date, the pinner's follower count and Pinterest's own topic labels; board and profile pins come with **saves and repins** (profile pins with the created date too). Turn on details for **comments and shares** on every pin and for the fields a source lacks (table below).

For every keyword the Actor can also add the **Pinterest Trends weekly search-interest series** (one or two years of weekly values, 53 or 105 weeks, in 31 Pinterest Trends regions) with the latest week, the peak week and the week-, month- and year-over-year change. A free keyword summary lists **which domains the keyword's pins link to** and **Pinterest's related searches**.

- No Pinterest account, no API key, no browser.
- Each pin is delivered once per run, whatever finds it first.
- Pinterest stops a keyword at about 800–960 pins; related searches take you further (2,500 unique pins for one keyword in run `fGRgB5gwOQrr0vc0q`).
- A bad link, a missing board, profile or pin, an empty result or a keyword without Trends data gets a free status row with the reason. Pins already delivered by another source are counted as duplicates in the `SOURCE_REPORT` record; if the run stops at your maximum cost, the log and `SOURCE_REPORT.stoppedAtMaxCharge` say so.

### Quick start (API)

```bash
curl -X POST "https://api.apify.com/v2/acts/foxlabs~pinterest-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchQueries": ["boho living room"], "maxPinsPerSource": 50}'
```

This returns 50 pins, one Pinterest Trends row for the United States and one free keyword summary (run `7568xJ3G4Ch0Pxgd2`, 10 seconds).

### What you get

The dataset has one row per item; `rowType` says which kind.

| Row type | Charged | Fields |
|---|---|---|
| `pin` | yes (`pin`, + `pin-details` with details) | `pinId`, `pinUrl`, `title`, `description`, `altText`, `annotations` (Pinterest's topic labels), `imageUrl`, `imageWidth`, `imageHeight`, `thumbnailUrl`, `isVideo`, `videoUrl`, `videoDurationSec`, `outboundLink`, `outboundDomain`, `richType`, `siteName`, `productName`, `productPrice`, `productCurrency`, `productPriceText`, `productListPrice`, `productListPriceText`, `productDiscountPercent`, `productInStock`, `reactions`, `saves`, `repins`, `comments`, `shares`, `createdAt`, `pinnerUsername`, `pinnerName`, `pinnerFollowers`, `pinnerVerifiedMerchant`, `pinnerUrl`, `boardName`, `boardUrl`, `boardPinCount`, `dominantColor`, and where it came from: `sourceType`, `source`, `query`, `pinterestQuery`, `relatedQuery`, `searchRank`, `detailsStatus` |
| `trend` | yes (`keyword-trend`) | `keyword`, `query`, `region`, `regionName`, `weeks`, `firstWeek`, `latestWeek`, `latestIndex`, `peakWeek`, `lowestIndex`, `averageIndex`, `weekOverWeekPct`, `monthOverMonthPct`, `yearOverYearPct`, `series` (`[{week, index}]`), `relatedSearches` |
| `profile` | yes (`profile`) | `username`, `fullName`, `profileUrl`, `about`, `websiteUrl`, `websiteDomain`, `domainVerified`, `verifiedMerchant`, `isBusiness`, `followers`, `following`, `pinCount`, `boardCount`, `videoPinCount`, `monthlyViews`, `monthlyViewsText`, `createdAt`, `lastPinSavedAt`, `imageUrl`, `boards` (first 25: name, link, pins, followers) |
| `keyword-summary` | free | `query`, `pinterestQuery`, `autoCorrected`, `pinsAnalyzed`, `pinsWithOutboundLink`, `outboundLinkSharePct`, `productPins`, `topDomains` (domain, pins, share, reactions), `relatedSearches` |
| `board` | free | `boardId`, `boardName`, `boardUrl`, `description`, `category`, `pinCount`, `sectionCount`, `followers`, `ownerUsername`, `isCollaborative`, `lastPinAddedAt`, `coverImageUrl` |
| `status` | free | `sourceType`, `source`, `status` (`invalid`, `not-found`, `empty`, `skipped`, `no-trend-data`, `failed`), `error` (the reason in plain words) |

Which pin fields are filled depends on where the pin came from, because Pinterest's answers differ:

| Field | Keyword search | Board | Profile (created pins) | Pin link |
|---|---|---|---|---|
| `saves`, `repins` | – | yes | yes | yes |
| `comments`, `shares` | – | – | – | yes |
| `createdAt` | yes | – | yes | yes |
| `pinnerFollowers`, `annotations` | yes | – | – | yes |
| `searchRank`, `query` | yes | – | – | – |

With `includeDetails` on, every pin also gets the fields of its detail answer where Pinterest has them: saves, repins, comments, shares, created date, follower count and labels. In run `TfsK9uUtE5IxZX0mq`, board pins with details had a created date and follower count 50 of 50 and saves 49 of 50; the brand's created pins had saves 31 of 50 and labels 38 of 50. Details only add fields; they never remove `searchRank` or `query`. Some pins carry product data only in their detail answer.

`saves` and `repins` are two different Pinterest counters: `saves` comes from Pinterest's aggregated pin data, `repins` from the pin itself. They can be far apart in both directions: 9,950 saves and 3 repins on one pin, 591 saves and 1,780 repins on the sample row below (run `A0eiHi44gf9WXCj2J`); `saves` was lower than `repins` on 83 of 1,302 pins with both counts in our platform runs. A count Pinterest does not give, or gives as -1 (hidden), is `null`, never 0.

#### Sample output

A real pin row (trimmed) from run `A0eiHi44gf9WXCj2J` on 2026-10-01, keyword `linen dress`, details on:

```json
{
  "rowType": "pin",
  "pinId": "1132022056360864882",
  "pinUrl": "https://www.pinterest.com/pin/1132022056360864882/",
  "title": "Wrap Linen Dress Sewing Pattern | Timeless Linen Wrap Dress PDF Pattern",
  "outboundLink": "https://www.etsy.com/listing/4545810235/linen-wrap-dress-sewing-pattern-v-neck?ref=shop_home_active_1&dd=1&logging_key=093eb7d444259fade1c096b9ea595ee050ab12f7:4545810235",
  "outboundDomain": "etsy.com",
  "siteName": "Etsy",
  "productPrice": 2.1,
  "productCurrency": "USD",
  "productPriceText": "$2.10",
  "productListPrice": 7,
  "productDiscountPercent": 70,
  "productInStock": true,
  "reactions": 23,
  "saves": 591,
  "repins": 1780,
  "comments": 0,
  "shares": 51,
  "createdAt": "2026-06-12T11:59:22.000Z",
  "pinnerUsername": "farazmalik1224",
  "pinnerFollowers": 3,
  "boardName": "Wrap Linen Dress",
  "annotations": ["Sleeveless Robe Pattern", "Wrap Outfits For Women", "Women Clothing Patterns", "Wrap Up Dress"],
  "sourceType": "search",
  "query": "linen dress",
  "searchRank": 14,
  "detailsStatus": "ok"
}
```

A real Pinterest Trends row (series trimmed to the last 3 of 53 weekly values, related searches to 4 of 10) from run `BS5fCAHm3vquSF9Ol`, keyword `wall decor`, United States:

```json
{
  "rowType": "trend",
  "keyword": "wall decor",
  "region": "US",
  "regionName": "United States",
  "weeks": 53,
  "latestWeek": "2026-09-27",
  "latestIndex": 62,
  "peakWeek": "2026-08-23",
  "averageIndex": 63.1,
  "weekOverWeekPct": -6,
  "monthOverMonthPct": -30,
  "yearOverYearPct": null,
  "series": [{ "week": "2026-09-13", "index": 73 }, { "week": "2026-09-20", "index": 66 }, { "week": "2026-09-27", "index": 62 }],
  "relatedSearches": ["wall decor ideas", "diy wall decor", "tv wall decor", "aesthetic wall decor"]
}
```

The free keyword summary for the same keyword in the same run (`topDomains` trimmed): 313 pins analysed, 132 with an outbound link (42.2%), top linked domains `amazon.com (27), thetanee.com (4), bambrise.com (3)…`, related searches `wall decor ideas, diy wall decor, tv wall decor…`. `pinsAnalyzed` counts every pin on the result pages the Actor read for the keyword, so it can be higher than the pins delivered (300 here): Pinterest returns whole pages, and pins already delivered by another source are counted too. Pinterest's own image and page hosts are not counted as linked domains.

### Input & filters

| Input | What it does | Default |
|---|---|---|
| `searchQueries` | Keywords as typed into Pinterest search | — |
| `boardUrls` | Board links (`https://www.pinterest.com/<user>/<board>/`, any Pinterest country domain). Pins in the board's sections are included | — |
| `profileUrls` | Profile links or usernames (`etsy`, `@etsy`) | — |
| `pinUrls` | Pin links or pin numbers | — |
| `maxPinsPerSource` | Pins per keyword, board or profile, up to 10,000. 0 = no pins at all, pin links included: you still get Trends series, profile rows and free board rows, and each pin link gets a free `skipped` status row. The Console form starts at 50 | 100 |
| `includeDetails` | One more request per pin: `saves`, `repins`, `comments`, `shares`, and the MP4 file of video pins | off |
| `includeTrends` | Pinterest Trends series for every keyword and region | on |
| `trendRegions` | 31 Pinterest Trends regions: US, CA, GB+IE, DE, FR, IT, ES, TR, BR, MX, AR, CO, IN, ID, MY, PH, TH, KR, SA, EG, AU+NZ, DE+AT+CH, SE+DK+FI+NO, NL+BE+LU, IT+ES+PT+GR+MT, PL+RO+HU+SK+CZ, CY+CZ+GR+HU+MT+PL+RO+SK, MX+AR+CO+CL, CR+DO+EC+GT+PE, AE+SA+KW+QA+OM+BH+EG+IQ+DZ, IL+NG+PK+ZA+TR+MA+IN | US |
| `trendHistory` | `1y` (one year, 53 weekly values) or `2y` (two years, 105 weekly values, adds `yearOverYearPct`) | 1y |
| `expandWithRelatedSearches`, `maxRelatedSearches` | When Pinterest runs out of results for a keyword before your limit, continue with up to 10 of the related searches Pinterest suggests for it | off, 5 |
| `profilePins` | `created` (the profile's Created tab), `saved` (pins it saved to its boards) or `none` | created |
| `proxyConfiguration`, `autoProxyFallback` | Apify datacenter proxy; the Actor switches to Apify residential proxy by itself when Pinterest blocks requests | on |

Input the form does not allow (an unknown Trends region, more than 10,000 pins) is rejected by Apify before the run starts. A run with nothing valid to read stops at once with the reason in its status message (runs `e8NtYUzsZ168WcAu1`, `D5obTDHqyBkTnNVef`), and so does a run with nothing to deliver, such as only pin links with `maxPinsPerSource: 0`. A single bad link (a pin.it short link, a board section link, a profile given as a board) does not stop the run: it becomes a free status row with the reason (run `U27crAbTfvKAu6JL4`). A board, profile or pin that does not exist gives a free `not-found` row (run `bB5i8JHRpBcarBjLY`: three status rows and nothing else).

**Misspelled keywords.** Pinterest corrects misspelled keywords and searches the correction: `boho livng room` is searched as `boho living room`. The pin rows and the keyword summary show what Pinterest searched in `pinterestQuery` (`autoCorrected: true` in the summary), and the Trends series is read for the corrected keyword.

**Keywords that mean nothing still return pins.** Pinterest answers any text with its closest matches. In run `MoIrsdypXJ9CAXc9G`, `zxqv qqwlk 88871 pnnt` was searched as `zxv qqwlk 88871 pant`: the 5 pins asked for all came back and were unrelated (a logo, a sound chip, number and letter graphics), and Pinterest Trends had no series for it. Such pins are delivered and charged as `pin` like any other pin row. `pinterestQuery` shows what Pinterest searched; try a new keyword with a small `maxPinsPerSource` first.

**No search country.** In our one test (2026-10-01), a Turkish keyword searched from a Turkish IP on tr.pinterest.com returned the same 49 first-page pins as from a US IP, so the Actor does not offer a search country. Countries matter for Pinterest Trends, where each region has its own series.

### Example inputs (copy & paste)

Each of these ran on the Apify platform on 2026-10-01 (run ID after each).

Product research for a keyword, with demand in the US and in Great Britain & Ireland (`HSjs8Zumjdn1YAsBX`: 200 pins, 2 Trends rows):

```json
{ "searchQueries": ["wall decor"], "maxPinsPerSource": 200, "trendRegions": ["US", "GB+IE"] }
```

As many pins as possible for one keyword, with Pinterest's related searches after its own results end (`fGRgB5gwOQrr0vc0q`: 2,500 pins in 189 s):

```json
{ "searchQueries": ["linen dress"], "maxPinsPerSource": 2500, "expandWithRelatedSearches": true, "maxRelatedSearches": 5, "includeTrends": false }
```

Keyword demand only, two years, three markets, no pins (`aTffX3hYeCFuBTsDn`: 12 Trends rows):

```json
{ "searchQueries": ["wall decor", "linen dress", "halloween nails", "wedding cake"], "maxPinsPerSource": 0, "trendRegions": ["US", "TR", "DE"], "trendHistory": "2y" }
```

A brand's profile, its newest created pins with engagement, and one of its boards (`TfsK9uUtE5IxZX0mq`: 1 profile, 1 board, 100 pins):

```json
{ "profileUrls": ["wayfair"], "boardUrls": ["https://www.pinterest.com/wayfair/home-decor/"], "maxPinsPerSource": 50, "includeDetails": true, "includeTrends": false }
```

Saves, repins, comments and shares for known pins (`ZSgFGfgkG9TPeGlNC`: 2 pins):

```json
{ "pinUrls": ["https://www.pinterest.com/pin/454230312436270717/", "243053711135791703"], "includeTrends": false }
```

### Use cases

- **E-commerce and print-on-demand research:** which shops and sites the pins of a keyword link to, product prices and discounts, and whether searches for it are rising.
- **Pinterest SEO and content planning:** top pins for a keyword with Pinterest's topic labels, related searches, and the weeks when interest peaks.
- **Seasonal planning:** two years of weekly interest per keyword in 31 regions, with month-over-month and year-over-year change.
- **Brand and competitor tracking:** a brand's profile (followers, monthly views, boards) and its created pins with saves and repins.
- **Creator and influencer discovery:** pinners behind a keyword's pins with their follower counts.

### Performance & throughput

Measured on the Apify platform on 2026-10-01 with build 0.1.1 (default memory 512 MB, default Apify datacenter proxy unless noted):

| Run | Input | Rows | Requests | Time |
|---|---|---|---|---|
| `7568xJ3G4Ch0Pxgd2` | The quick-start input (1 keyword, 50 pins, Trends US) | 50 pins, 1 trend, 1 summary | 4 | 10 s |
| `BS5fCAHm3vquSF9Ol` | 4 keywords × 300 pins, Trends US | 1,200 pins, 4 trends, 4 summaries | 21 | 51 s |
| `A0eiHi44gf9WXCj2J` | 2 keywords × 100 pins, details on | 200 pins, 2 trends, 2 summaries | 206 | 80 s |
| `rgWXOlOrbQbY6yWaI` | 4 boards + 4 profiles, up to 200 pins each | 1,070 pins, 4 profiles, 4 boards, 1 status | 39 | 31 s |
| `fGRgB5gwOQrr0vc0q` | 1 keyword, 2,500 pins with related searches | 2,500 pins, 1 summary | 129 | 189 s |
| `pqadSYxYeqDo3J8LE` | 1 keyword, limit 10,000, no related searches | 957 pins (Pinterest's end), 1 trend, 1 summary | 38 | 87 s |
| `aTffX3hYeCFuBTsDn` | 4 keywords × 3 regions, Trends only, two years (105 weekly values) | 12 trends | 8 | 21 s |
| `gEQ80T7GR3PYUvme7` | 2 keywords × 300 pins, proxy off (the platform's own IP) | 600 pins, 2 trends, 2 summaries | 12 | 21 s |
| `c4bB1TbWPbh0i3mqs` | 2 keywords × 150 pins, Apify residential proxy | 300 pins, 2 trends, 2 summaries | 7 | 26 s |

A keyword search page holds 25 pins (the first up to 250); the detail request is one more request per pin. None of these runs was blocked or needed a retry. The largest run peaked at 199 MB of memory.

### Integrations

Use the dataset from the API, schedule the Actor in Apify Console (Pinterest Trends updates weekly), or connect it to Make, Zapier, n8n, Google Sheets or a webhook. The dataset has table views for pins, shops & products, keyword demand, keyword summaries and profiles.

### Data quality

Measured on the platform runs above:

- **Uniqueness:** every run delivered each pin once (1,200 of 1,200, 2,500 of 2,500, 1,070 of 1,070 unique `pinId`).
- **Keyword search pins** (`BS5fCAHm3vquSF9Ol`, 4 keywords × 300): image, created date, pinner with follower count and board 100%; Pinterest topic labels 97.1%; outbound link 68.1% (67.6% to sites other than Pinterest's own). The share linking to other sites depends on the keyword: 90.3% for `keto dinner recipes`, 70.0% for `linen dress`, 67.0% for `halloween nails`, 43.0% for `wall decor`. Pins without a link are uploads Pinterest marks "Uploaded by user"; a few of them (4 of 51 in our saved search answers) are collection pins whose product links sit inside the collection, which the Actor does not read yet.
- **Details on** (`A0eiHi44gf9WXCj2J`, 200 pins): saves 96.5%, repins 100%, comments 97.5%, shares 100%.
- **Board pins** (`rgWXOlOrbQbY6yWaI`, 470): saves 99.4%, repins 99.8%, created date 0 (Pinterest's board feed has none; turn on details). **Profile created pins** (600): created date 100%, saves 93.5%.
- **Profiles** (`rgWXOlOrbQbY6yWaI`, 4): followers 4 of 4; website and monthly views 3 of 4 (Pinterest hides monthly views for some profiles and shows large ones as 10M+).
- **Pinterest Trends:** every series asked for in the runs above came back (12 of 12 in `aTffX3hYeCFuBTsDn`). Keywords with too few searches in a region get a free `no-trend-data` row instead (run `MoIrsdypXJ9CAXc9G`).
- **Against the source:** 20 random rows from three runs, compared field by field with the pin's live Pinterest answer: 143 values of fixed fields (link, created date, pinner, title, image…) matched, 0 differed; counters had moved by 1 to 3 on 3 pins.
- **Links:** 12 random pin links opened on a page with that pin's ID and title words, 6 of 6 image links returned an image, and 9 of 12 outbound links opened on the expected site with the product or title words on the page (of the other 3, two sites answered 403, one after a redirect, and one did not connect).
- **Checks on every pin row** (6,272 rows from 12 platform runs: those above except `pqadSYxYeqDo3J8LE`, plus `7tin8z3yNMTWJQY2X`): created dates between 2010 and today, `outboundDomain` equal to the link's host, prices above 0 with an ISO currency, list price not below price, no HTML entities left in text, Trends weeks seven days apart.

### Pricing

Pay per event:

- **`pin`:** each delivered pin row.
- **`pin-details`:** with `includeDetails` on, one more per pin whose detail answer arrived. Pin-link rows include details and are only a `pin`.
- **`keyword-trend`:** each Pinterest Trends series (one keyword in one region).
- **`profile`:** each profile row.

Status rows, board rows and keyword summaries are free. A run with `maxPinsPerSource: 0` has no `pin` or `pin-details` event. Current prices are on the Pricing tab.

### FAQ

**Why are `saves` empty for keyword results?** Pinterest's search answer has reactions but no save counts. Turn on `includeDetails`; it reads each pin's detail answer (one more request and one `pin-details` event per pin).

**Why does a keyword stop at 800–960 pins?** Pinterest ends its results for a keyword there: 957 unique pins for `boho living room` (run `pqadSYxYeqDo3J8LE`) and 800 for `linen dress` (run `fGRgB5gwOQrr0vc0q`). With `expandWithRelatedSearches` the Actor continues with Pinterest's related searches; every row from them carries the related search in `relatedQuery`.

**What does the Trends index mean?** Pinterest Trends reports search interest per week as 0–100, where 100 is the keyword's own highest week in the period. It shows the shape of demand for one keyword; two keywords' indexes are not on the same scale.

**Why is there no Trends row for my keyword?** Pinterest Trends has no series for keywords with too few searches in a region. You get a free `no-trend-data` status row instead.

**Does it read video pins?** `isVideo` is set for video pins and `videoUrl` for videos Pinterest hosts; YouTube pins have no `videoUrl` (8 of 468 video pin rows in our platform runs, all on one board). Search results mostly carry an HLS playlist (`.m3u8`); with details the Actor takes the MP4 file Pinterest gives in the pin's detail answer (65 of 65 video pins with details were MP4 in runs `TfsK9uUtE5IxZX0mq`, `A0eiHi44gf9WXCj2J` and `ZSgFGfgkG9TPeGlNC`).

**Do I need a Pinterest account or cookies?** No. The Actor reads what Pinterest shows logged-out visitors.

**Are short pin.it links supported?** Not yet. Open the link and copy the pinterest.com address.

**What if two inputs find the same pin?** It is delivered and charged once, for the first source; later sources count it as a duplicate in the `SOURCE_REPORT` record.

### Troubleshooting

- **Fewer pins than `maxPinsPerSource`:** Pinterest ended the results (see `end` per source in the `SOURCE_REPORT` record), or earlier sources already delivered some (`duplicates`). For keywords, turn on related searches.
- **A board gives fewer pins than its `pinCount`:** `pinCount` is Pinterest's own count and can be higher than the pins Pinterest's board feed returns (23 and 20 for joestewart/bedroom, 51 and 50 for pinterest/official-news in run `rgWXOlOrbQbY6yWaI`, both read to the end of the board). A shop's product catalog board (`/_products/`) shows a very large count (482,417,976 for SHEIN); the Actor reads up to `maxPinsPerSource` pins from it.
- **A status row says `not-found`:** the board, profile or pin is deleted, renamed or private.
- **A profile gives no pins:** its Created tab is empty; set `profilePins` to `saved` or add its boards (listed in the profile row).
- **The run stopped early:** it reached your maximum cost per run; the log says so.

### Notes, limits & legal

- The Actor reads public Pinterest pages and Pinterest Trends data without logging in. Counts and rankings change all the time; keep `scrapedAt` with the data.
- Up to 10,000 pins per source; Pinterest Trends gives one or two years (53 or 105 weekly values).
- Pinterest is a trademark of Pinterest, Inc. This Actor is not affiliated with or endorsed by Pinterest.

### Support

Open an issue on the Issues tab with the run ID and the input.

### Changelog

#### 0.1.3 — 2026-10-01

`maxPinsPerSource: 0` now means no pins at all: pin links are not read either, and each gets a free `skipped` status row, so a run with 0 has no `pin` event. An input with only pin links and 0 stops at once with the reason. Before, pin links were read even with 0.

#### 0.1 — 2026-10-01

First version. See CHANGELOG.md.

# Changelog

This Actor's version history is a separate document: https://apify.com/foxlabs/pinterest-scraper/changelog.md

# Actor input Schema

## `searchQueries` (type: `array`):

Keywords as typed into Pinterest search (boho living room, linen dress, halloween nails). Each keyword gives pin rows, a free keyword summary (which shops and sites the pins link to, Pinterest's related searches) and, with Pinterest Trends on, its weekly search-interest series. Pinterest corrects misspelled keywords and searches the correction; the rows show what was searched in pinterestQuery.

## `boardUrls` (type: `array`):

Board links (https://www.pinterest.com/<user>/<board>/), any Pinterest country domain. Gives a free board row (pin count, followers, category) and the board's pins, including pins in its sections.

## `profileUrls` (type: `array`):

Profile links (https://www.pinterest.com/<user>/) or usernames. Gives one profile row (followers, monthly views, website, verified merchant, boards) and the profile's pins (see "Profile pins").

## `pinUrls` (type: `array`):

Pin links (https://www.pinterest.com/pin/<number>/) or pin numbers. Each pin comes with saves, repins, comments and shares. pin.it short links are not supported: open them and copy the pinterest.com address.

## `maxPinsPerSource` (type: `integer`):

Stop after this many pins for each keyword, board or profile. Pinterest ends a keyword's results after about 800–960 pins; turn on related searches below to go further. 0 = no pins at all, pin links included: you still get Trends series, profile rows and free board rows, and each pin link gets a free status row saying it was not read. The form starts at 50; an API call without this field gets 100.

## `includeDetails` (type: `boolean`):

Pinterest's search results carry reactions but not saves. This reads each pin's detail page as well (one more request per pin): saves, repins, comments, shares, and the MP4 file of video pins. Charged as an extra "pin-details" event per pin that got its details.

## `includeTrends` (type: `boolean`):

For each keyword, the Pinterest Trends series for every region below: weekly search interest (0–100, 100 = the keyword's own peak in the period), the latest and peak week, and the week-, month- and year-over-year change Pinterest reports. A keyword with too few searches in a region has no series; you get a free status row instead.

## `trendRegions` (type: `array`):

Pinterest Trends markets. Some countries are only available as a group (Australasia, Nordics, Benelux…). Each keyword × region is one trend row.

## `trendHistory` (type: `string`):

One year of weekly values (53 weeks), or two years (105 weeks, adds the year-over-year change).

## `expandWithRelatedSearches` (type: `boolean`):

When Pinterest runs out of results for a keyword before your limit, continue with the related searches Pinterest suggests for it (e.g. "earthy boho living room"). Rows from them carry the related search in relatedQuery. Duplicates are removed.

## `maxRelatedSearches` (type: `integer`):

How many of Pinterest's related searches to follow, in Pinterest's order.

## `profilePins` (type: `string`):

Which pins to read for each profile: the pins it created (its Created tab), the pins it saved to its boards, or none (profile row only).

## `proxyConfiguration` (type: `object`):

Apify datacenter proxy by default. The Actor moves to Apify residential proxy by itself if Pinterest blocks the requests (see the next option).

## `autoProxyFallback` (type: `boolean`):

On by default: datacenter proxy first, then residential proxy.

## Actor input object example

```json
{
  "searchQueries": [
    "boho living room"
  ],
  "maxPinsPerSource": 50,
  "includeDetails": false,
  "includeTrends": true,
  "trendRegions": [
    "US"
  ],
  "trendHistory": "1y",
  "expandWithRelatedSearches": false,
  "maxRelatedSearches": 5,
  "profilePins": "created",
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "autoProxyFallback": true
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQueries": [
        "boho living room"
    ],
    "maxPinsPerSource": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("foxlabs/pinterest-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQueries": ["boho living room"],
    "maxPinsPerSource": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("foxlabs/pinterest-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "boho living room"
  ],
  "maxPinsPerSource": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call foxlabs/pinterest-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,foxlabs/pinterest-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/aedvSFdP6fb0P6cdp/builds/Jk1j67CyZfi5Ma5MU/openapi.json
