# Pinterest Scraper — Pins & Boards by Pinterest Keyword Search (`afanasenko/pinterest-scraper`) Actor

Pinterest scraper for Pinterest search results and image search by keyword — Pinterest pins, video pins, boards, creator profiles, keyword suggestions, search autocomplete and Pinterest Trends: keywords for SEO and keyword research. Each pin: outbound link, board, creator, image sizes. CSV or JSON.

- **URL**: https://apify.com/afanasenko/pinterest-scraper.md
- **Developed by:** [Andrey Afanasenko](https://apify.com/afanasenko) (community)
- **Categories:** Social media, Lead generation, E-commerce
- **Features:** Limited permissions
- **Stats:** 194 total users, 119 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 — Pins & Boards by Pinterest Keyword Search

[![Apify Actor](https://apify.com/actor-badge?actor=afanasenko/pinterest-scraper)](https://apify.com/afanasenko/pinterest-scraper)

> **Type a keyword, get Pinterest as a spreadsheet.** Pins, video pins, boards, creators and Pinterest's own keyword suggestions — five searches in one actor — plus every pin of a board, board section or profile you link to, and Pinterest Trends by country. No login and no browser.
> Built for SEO, content and e-commerce teams who need the outbound link and destination domain behind every pin, not just a pretty image.

> **🆓 Free to start:** no signup or card beyond your Apify account · press **Save & Start** with empty fields and it runs a 10-row sample on a built-in keyword · Apify's Free plan includes $5 of monthly platform credit, roughly 1,400 rows here.

### 🎯 What it does

You give it keywords, links to boards, profiles and pins, or a country for Pinterest Trends. It reads Pinterest the way a logged-out visitor would, and returns clean, deduplicated rows.

| Mode | Input | What each row is |
|---|---|---|
| **Mode 1: Search pins by keyword** | keywords | a pin: title, description, image, outbound link + destination domain, creator, board, topic tags |
| **Mode 2: Search video pins by keyword** | keywords | the same, plus a direct video URL, poster frame and duration |
| **Mode 3: Search boards by keyword** | keywords | a board: name, description, pin count, cover image, owner and owner's follower count |
| **Mode 4: Search creators by keyword** | keywords | an account: followers, pin and board counts, date of its last save |
| **Mode 5: Get keyword suggestions** | seed keywords | one phrase Pinterest itself suggests for your seed, in rank order |
| **Mode 6: Get pins from board, profile or pin links** | links | a pin, in Mode 1's shape, plus the board it was read from and its save count; board sections and a pin's related pins too |
| **Mode 7: Get Pinterest Trends** | a country, a trend list, optional keywords | a trending search term: rank, growth week / month / year, seasonality, weekly interest for the past year |

Fields group into four themes: **content** (title, description, alt text, image sizes, dominant colour), **destination** (outbound link, domain, what the linked page is), **people** (creator handle, name, followers, board), and **discovery** (Pinterest's own topic tags and AI interest labels).

> ⚠️ **Pick your mode first.** Each mode reads only its own input fields. **Example:** you select Mode 1 but type your keyword into the Mode 3 field. The actor runs Mode 1 — which never looks at Mode 3's field — finds no keyword, and falls back to a 10-row demo instead of your search. **All seven mode sections stay visible** whatever you pick; the Apify Console does not hide them, so fill in only the section whose label matches your mode.

### 📦 Output sample

One complete row from Mode 1, exactly as it lands in the dataset:

```json
{
  "result_type": "pin",
  "keyword": "home office ideas",
  "pin_id": "68749748250",
  "pin_url": "https://www.pinterest.com/pin/68749748250/",
  "title": "Office with Green and oak cabinetry",
  "description": "Green office cabinetry with pull out printer shelf, wall to wall oak desktop and open display shelving.",
  "alt_text": "a home office with green cabinets and white chairs",
  "created_at": "2026-01-28T16:28:51.000Z",
  "image_url": "https://i.pinimg.com/originals/0f/93/20/0f9320dbe478ae36ec533b899ed2b6e1.jpg",
  "image_width": 1333,
  "image_height": 2000,
  "thumbnail_url": "https://i.pinimg.com/236x/0f/93/20/0f9320dbe478ae36ec533b899ed2b6e1.jpg",
  "dominant_color": "#8c8379",
  "outbound_link": "https://example.com/",
  "outbound_domain": "example.com",
  "reactions": 171,
  "is_promoted": false,
  "is_video": false,
  "video_url": null,
  "video_thumbnail_url": null,
  "video_duration_seconds": null,
  "topic_tags": [
    "Small Office Space Storage",
    "Office Room Storage Ideas",
    "Study Cabinets Built Ins",
    "Small In Home Office Ideas",
    "Home Office And Storage Room"
  ],
  "ai_topics": [],
  "source_type": null,
  "source_site": "AR Interiors Inc",
  "source_title": null,
  "creator_username": "stx2102",
  "creator_full_name": "Meg Sultzbach Guido",
  "creator_profile_url": "https://www.pinterest.com/stx2102/",
  "creator_avatar_url": "https://i.pinimg.com/140x140_RS/21/24/da/2124dae9ad41685abb249261a4a33f1a.jpg",
  "creator_followers": 605,
  "creator_is_verified_merchant": false,
  "board_name": "Office Space",
  "board_url": "https://www.pinterest.com/stx2102/office-space/",
  "board_pin_count": 120
}
```

Anything Pinterest did not provide comes back as `null` — never the string `"N/A"` — so numeric columns stay numeric in Sheets, Airtable and CSV. Every row carries a `result_type`, and a row holds only the fields belonging to its own type. The full per-field schema lives in [`.actor/dataset_schema.json`](.actor/dataset_schema.json), which is also what AI agents read through Apify's MCP layer.

### ⚡ Quick start

1. Leave **operation mode** on *Mode 1: Search pins by keyword*.
2. Type one keyword per line into **Keywords** — letters, digits and spaces only.
3. Set **Max pins** to something small for the first run, e.g. `50`.
4. Press **Save & Start**.

```json
{
  "operationMode": "searchPins",
  "searchPinsKeywords": ["home office ideas"],
  "searchPinsMaxItems": 50
}
```

Pressing **Save & Start** with everything empty is safe: the actor runs a built-in 10-row sample instead of failing, and says so in the log. Whichever mode you select, fill in **that mode's** field — the other six are ignored. (Mode 7 is the exception to the sample: with no keyword it reads the country's whole trend list, which is a real result.)

### ⭐ Choose your mode

#### 🎯 Mode 1: Search pins by keyword

The main one. Pinterest's relevance ranking, paginated until your **Max pins** number is reached or Pinterest stops offering new pins.

- **Input:** `searchPinsKeywords` — one keyword per line.
- **Cost control:** `searchPinsMaxItems` — the run stops there. `0` means "no limit of your own"; the free plan still stops at 50 rows per run, 150 per month.

#### 🎯 Mode 2: Search video pins by keyword

Mode 1's row shape narrowed to pins that carry video, plus `video_url`, `video_thumbnail_url` and `video_duration_seconds`.

- **Input:** `searchVideoPinsKeywords`.
- **Cost control:** `searchVideoPinsMaxItems`.

#### 🎯 Mode 3: Search boards by keyword

Finds where a topic is actually curated. A board with 1,500 pins whose owner has 200k followers is a distribution channel; a board with 11 pins is not.

- **Input:** `searchBoardsKeywords`.
- **Cost control:** `searchBoardsMaxItems`.

#### 🎯 Mode 4: Search creators by keyword

Accounts that publish about your topic, with follower count, pin and board counts, and the date of their last save — enough to separate an active account from a dormant one before you reach out.

- **Input:** `searchCreatorsKeywords`.
- **Cost control:** `searchCreatorsMaxItems`.
- **Need their bio and website too?** Pinterest's search does not carry either. [Pinterest Profile Scraper](https://apify.com/afanasenko/pinterest-profile-scraper) looks each account up and returns them.

#### 🎯 Mode 5: Get keyword suggestions

Pinterest's own autocompletions for a seed phrase, in the order Pinterest ranks them. About a dozen per seed, and they are what Pinterest users actually type.

- **Input:** `keywordSuggestionsKeywords` — seeds, one per line.
- **Cost control:** `keywordSuggestionsMaxItems`.

#### 🎯 Mode 6: Get pins from board, profile or pin links

Paste a link instead of a keyword. Every row is a pin in Mode 1's shape, with three additions: `input_type` (what kind of link it came from), the board it was read from (`board_name`, `board_url`, `board_pin_count`), and `saves` — how many times the pin was saved, which board and pin pages show and search results do not. The link itself sits in `keyword`, so rows from several links stay apart.

- **Input:** `pinsFromLinksUrls` — one link per line:
  - a **board** — `pinterest.com/marthastewart/appetizers-and-hors-doeuvres-recipes/` → its pins, page after page;
  - a **board section** — `pinterest.com/foodnetwork/food-gifts-and-treats/homemade-gift-ideas/` → the pins of that section only, with the section's title in `section_name`;
  - a **profile** — `pinterest.com/marthastewart/` → the pins on its public boards, board by board, most recently pinned board first;
  - a **pin** — `pinterest.com/pin/1234567890/` → that one pin.
    Any Pinterest country domain (`pinterest.co.uk`, `de.pinterest.com` …) and `pin.it` short links work.
- **Cost control:** `pinsFromLinksMaxItems` — one ceiling across all links.
- **Related pins (optional):** turn on **Also get related pins** (`includeRelatedPins`) and each **pin** link also returns the pins Pinterest shows under it as "More ideas" — up to `relatedPinsPerPin` per pin (default 50, at most 500; Pinterest shows about 500). Each is a normal pin row, charged like any other, with `input_type = "related_pin"` and the pin it belongs to in `related_to_pin_id`. Related pins carry no save count, and board, section and profile links are read without them. If Pinterest shows no related pins for a pin, the run says so in its log and in its message (Storage → USER_MESSAGE); nothing is charged for them.
- **Not read:** search and idea pages, secret boards and private accounts, and pin links of the long encoded form some Pinterest pages show (`/pin/e1_…/`) — use the numeric link or the board instead. Each such link gets **one free row** (`result_type = "link_unavailable"`) with the reason, and is never charged. The same goes for a deleted board, an unknown account and an empty board.
- The 🔬 pin filters (reactions, outbound link, promoted, destination domain, creator followers) work here as in Mode 1, related pins included.

#### 🎯 Mode 7: Get Pinterest Trends

What people search for on Pinterest in a country, read from Pinterest's own public Trends site: one row per trending term with its rank (`trend_rank`), how much it grew week on week, month on month and year on year (`weekly_change_pct`, `monthly_change_pct`, `yearly_change_pct`), how seasonal it is (`seasonality_score`, 0–1) and Pinterest's relative search volume (`search_volume_index`, top term of the list = 100). With **Add weekly search interest** on (the default), each row also carries `weekly_interest` — a point per week for the past year, on the term's own scale (its best week = 100).

- **Region:** `trendsRegion` — 29 countries and regions, as Pinterest groups them (United States, Canada, UK and Ireland, Germany, Austria and Switzerland, France, Brazil, India, Australia and New Zealand…).
- **Trend list:** `trendsType` — `growing` (fastest risers, the default), `monthly` and `yearly` (most searched), `seasonal` (terms that come back at this time every year).
- **Keywords (optional):** `trendsKeywords` — each keyword returns the trending terms that contain it as a word, as its own list; leave empty for the whole list. `trendsExcludeKeywords` leaves out terms that contain any of its words (whole words: `deko` leaves out `weihnachten deko`, not `aussendeko`).
- **Cost control:** `trendsMaxItems`. Each list holds up to 100 terms.
- `data_as_of` says which day the figures are for — Pinterest Trends runs a few days behind.

### 🧭 When to use it

- **Content planning.** Run Mode 5 on a seed, then Mode 1 on the strongest suggestions to see what already ranks for each.
- **E-commerce research.** Mode 1 with **Destination domain contains** set to a competitor's domain shows every pin driving traffic to them.
- **Creator discovery.** Mode 4, then sort your sheet by followers and last-save date.
- **Ad and creative research.** Mode 1 keeps Pinterest's promoted pins and flags them in `is_promoted`, so you can see what is being paid for in your category — or drop them with **Exclude promoted pins**.
- **Design and moodboard sourcing.** Mode 3 finds the boards worth mining; Mode 6 exports every pin of the ones you pick.
- **Competitor and creator audits.** Mode 6 on a brand's profile lists what it pins, where each pin links and how often each was saved.
- **Seasonal and trend planning.** Mode 7 shows what is rising in a country this month and which terms come back every year, with a year of weekly interest to time your pins; Mode 1 then shows what already ranks for each term.
- **Visual research from one pin.** Mode 6 with related pins on takes a pin you like and returns the pins Pinterest itself shows as similar — up to about 500 per pin.

### 🎯 Example tasks

Ready-to-run examples — each opens a pre-configured task you can run in one click (no setup):

- **[Scrape Pinterest pins by keyword](https://apify.com/afanasenko/pinterest-scraper/examples/scrape-pinterest-pins-by-keyword)** — Search Pinterest for any keyword and export every matching pin — title, description, image, outbound link, destination domain, creator and board.
- **[Find product pins on Pinterest by store](https://apify.com/afanasenko/pinterest-scraper/examples/find-product-pins-on-pinterest)** — Keep only the Pinterest pins that link to a store you name — product image, title, destination URL and the creator behind each pin.
- **[Export Pinterest video pins by keyword](https://apify.com/afanasenko/pinterest-scraper/examples/export-pinterest-video-pins)** — Search Pinterest for pins that carry video and export the direct video URL, poster frame and duration alongside the pin's title, link and creator.
- **[Find Pinterest boards by keyword](https://apify.com/afanasenko/pinterest-scraper/examples/find-pinterest-boards-by-keyword)** — Find the boards curating any topic — board name, description, pin count, cover image and the owner's follower count, so you can see where a topic lives.
- **[Find Pinterest creators by niche](https://apify.com/afanasenko/pinterest-scraper/examples/find-pinterest-creators-by-niche)** — Find the accounts publishing about your niche — follower, pin and board counts plus the date each one last saved, so dormant accounts are obvious.
- **[Get Pinterest keyword suggestions](https://apify.com/afanasenko/pinterest-scraper/examples/get-pinterest-keyword-suggestions)** — Export the phrases Pinterest itself suggests for a seed keyword, in its own ranking — the fastest way to plan pin titles, board names and descriptions.

### 🛠 Input

| Field | Type | Applies to | What it does |
|---|---|---|---|
| `operationMode` | select | all | Which of the seven modes to run. |
| `searchPinsKeywords` | string list | Mode 1 | Keywords to search for pins. |
| `searchVideoPinsKeywords` | string list | Mode 2 | Keywords to search for video pins. |
| `searchBoardsKeywords` | string list | Mode 3 | Keywords to search for boards. |
| `searchCreatorsKeywords` | string list | Mode 4 | Keywords to search for creators. |
| `keywordSuggestionsKeywords` | string list | Mode 5 | Seed phrases to expand. |
| `pinsFromLinksUrls` | string list | Mode 6 | Board, board section, profile or pin links. |
| `includeRelatedPins` | boolean | Mode 6 | Also return each pin link's related pins. Off by default. |
| `relatedPinsPerPin` | integer | Mode 6 | Related pins per pin link, at most 500. Default 50. |
| `trendsRegion` | select | Mode 7 | Country or region of the trend list. Default `US`. |
| `trendsType` | select | Mode 7 | `growing`, `monthly`, `yearly` or `seasonal`. Default `growing`. |
| `trendsKeywords` | string list | Mode 7 | Only trends that contain these words; each is its own list. Optional. |
| `trendsExcludeKeywords` | string list | Mode 7 | Leave out trends that contain these words. Optional. |
| `trendsIncludeWeeklyInterest` | boolean | Mode 7 | Add a year of weekly interest to each row. On by default. |
| `<mode>MaxItems` | integer | per mode | Row ceiling for that mode. `0` = no ceiling of your own. |
| `minReactions` | integer | Modes 1, 2, 6 | Drop pins below this reaction count. |
| `onlyPinsWithLink` | boolean | Modes 1, 2, 6 | Keep only pins that link somewhere. |
| `excludePromotedPins` | boolean | Modes 1, 2, 6 | Drop pins Pinterest marks as ads. |
| `linkDomainContains` | string | Modes 1, 2, 6 | Comma-separated domain fragments to keep. |
| `minCreatorFollowers` | integer | Modes 1–4, 6 | Minimum followers for the creator or board owner. |
| `minBoardPins` | integer | Mode 3 | Minimum pins on the board. |

**Keywords (Modes 1–5) accept letters, digits and spaces only** — that is Pinterest's own constraint on this search surface. Accented letters are folded automatically (`café décor` searches as `cafe decor`), punctuation, hashtags and emoji are stripped, and a keyword left with nothing searchable is skipped and reported in `SKIPPED_ITEMS` rather than silently ignored.

### 💰 How much will scraping Pinterest cost?

One paid event: **Result** — one row delivered to the dataset.

| Your Apify plan | Price per row | 1,000 rows |
|---|---|---|
| Free | $0.0035 | $3.50 |
| Bronze | $0.0030 | $3.00 |
| Silver | $0.0025 | $2.50 |
| Gold, Platinum, Diamond | $0.0020 | $2.00 |

**Filtered and duplicate rows cost nothing.** You are charged when a row lands in the dataset, not when Pinterest hands it over. A run whose filters reject everything costs $0.00, and Pinterest's habit of repeating the same pin across pages costs you nothing either — the actor drops repeats before charging.

Worked examples on the Free plan:

- 50 pins for one keyword — **$0.175**
- 500 pins across 10 keywords — **$1.75**
- 5,000 pins for a full content audit — **$17.50**
- a dozen keyword suggestions from Mode 5 — **about $0.04**

### 🆓 Free vs paid plan

| | Free plan | Paid plan |
|---|---|---|
| Rows per run | up to 50, in full | your `maxItems`, unlimited by default |
| Rows per calendar month | 150 (resets on the 1st, UTC) | unlimited |
| All seven modes | ✓ | ✓ |
| All filters | ✓ | ✓ |
| Pagination past the first page | ✓ | ✓ |
| Scheduling | ✓ | ✓ (free runs draw on the monthly budget) |
| Results beyond the cap | 🔒 preview rows: titles & descriptions visible, links & identifiers locked | ✓ delivered in full |

Every row the free plan delivers is complete — no mode, filter or field inside it is held back. The free ceiling is about **how many**: up to 50 rows per run and 150 per calendar month. When a run hits the cap, the next results it had already fetched are **previewed at the end of your dataset** (`row_status = 'withheld_free_plan'`, never charged), and the run says exactly what was held back in `USER_MESSAGE` and on the live status page. A month that spends its budget gets $0 runs with an explanation until the 1st — any paid plan removes both limits.

### 🧪 Filter recipes

**Find who is driving Pinterest traffic to a competitor**

```json
{
  "operationMode": "searchPins",
  "searchPinsKeywords": ["standing desk"],
  "linkDomainContains": "fully.com,uplift",
  "onlyPinsWithLink": true,
  "searchPinsMaxItems": 200
}
```

**Only pins that got engagement, no ads**

```json
{
  "operationMode": "searchPins",
  "searchPinsKeywords": ["fall wedding centerpieces"],
  "minReactions": 25,
  "excludePromotedPins": true,
  "searchPinsMaxItems": 300
}
```

**Boards big enough to be worth pitching**

```json
{
  "operationMode": "searchBoards",
  "searchBoardsKeywords": ["scandinavian interior"],
  "minBoardPins": 200,
  "minCreatorFollowers": 10000
}
```

**Every pin of two boards, with save counts**

```json
{
  "operationMode": "pinsFromLinks",
  "pinsFromLinksUrls": [
    "https://www.pinterest.com/marthastewart/appetizers-and-hors-doeuvres-recipes/",
    "https://www.pinterest.com/foodnetwork/alton-brown/"
  ],
  "onlyPinsWithLink": true,
  "pinsFromLinksMaxItems": 500
}
```

**One pin and the pins Pinterest calls similar**

```json
{
  "operationMode": "pinsFromLinks",
  "pinsFromLinksUrls": ["https://www.pinterest.com/pin/255016397645824430/"],
  "includeRelatedPins": true,
  "relatedPinsPerPin": 200
}
```

**What is rising for Christmas in Germany, Austria and Switzerland**

```json
{
  "operationMode": "pinterestTrends",
  "trendsRegion": "DE+AT+CH",
  "trendsType": "growing",
  "trendsKeywords": ["weihnachten", "christmas"]
}
```

**A keyword map for next quarter's content**

```json
{
  "operationMode": "keywordSuggestions",
  "keywordSuggestionsKeywords": ["home office", "small apartment", "desk setup"]
}
```

### 📡 Live status & storage records

While a run is going, open the **Live Status** link on the run page for a self-refreshing view: rows saved, rows dropped by filters, elapsed time and running cost.

| Record | When it appears | What is in it |
|---|---|---|
| `RUN_SUMMARY` | every run | mode, keywords, rows saved, rows filtered, duplicates dropped, request count, cost, wall-clock seconds |
| `USER_MESSAGE` | when there is something to say | why a run returned nothing, which filter is binding, what to change next |
| `FREE_LIMITS_APPLIED` | free plan, cap reached | which cap applied and what it changed |
| `SKIPPED_ITEMS` | when something was skipped | unsearchable keywords, duplicate keywords or links, duplicate results, failed searches, links that gave no pins — each with a reason |

### 🤖 Programmatic / API use

Start a run and get the dataset back in one call:

```bash
curl -X POST "https://api.apify.com/v2/acts/afanasenko~pinterest-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
        "operationMode": "searchPins",
        "searchPinsKeywords": ["home office ideas"],
        "searchPinsMaxItems": 100,
        "onlyPinsWithLink": true
      }'
```

Read the run summary afterwards:

```bash
curl "https://api.apify.com/v2/actor-runs/$RUN_ID/key-value-store/records/RUN_SUMMARY?token=$APIFY_TOKEN"
```

Every output field is declared in the dataset schema, so agent frameworks can read the column list without a sample run.

### 💡 Tips & Best Practices

#### Getting maximum results

Broad keywords beat precise ones on Pinterest. `home office ideas` returns hundreds of pins; `minimalist sage green home office desk setup` often returns a handful. Start broad, then narrow with filters — filters cost nothing.

Run Mode 5 first when you are exploring a topic. A dozen suggestions for one seed costs about four cents and tells you which phrasings Pinterest actually serves.

#### Cost optimization

Set `maxItems` on the first run of any new keyword. Pinterest will happily keep paginating, and an unbounded run on a broad keyword is the only way to spend more than you meant to.

Filters are free to apply and reduce the bill, so push the narrowing into the actor rather than deleting rows afterwards in a spreadsheet.

#### Performance

A 50-row run takes a few seconds; several hundred rows take a minute or two, because deeper pages come back more slowly. 1 GB of memory is plenty — this actor does no browser work.

#### Data quality

`reactions` is the only engagement number on Pinterest's search results (Modes 1–2). Pins read from a board, section, profile or pin link (Mode 6) also carry `saves`, the save count Pinterest shows on those pages; related pins do not, because Pinterest's related feed does not carry it.

`created_at` is the pin's publication date, which is often much older than the date it started circulating again.

### ❓ FAQ

**How do I scrape Pinterest search results without an API key?**
You do not need one. Pick Mode 1, type your keyword, press Save & Start. Authentication, pagination and rate limits are handled inside the actor.

**Is there a free way to try it?**
Yes. Press Save & Start with the form empty and the actor runs a capped 10-row sample on a built-in keyword. Apify's Free plan also includes $5 of monthly platform credit, roughly 1,400 rows here.

**Can I use the official Pinterest API instead?**
For your own account, yes — Pinterest's official API is built for advertisers and for managing pins you own. It will not return other people's search results, which is what this actor is for.

**Why did my run return zero rows?**
Three usual causes, and `USER_MESSAGE` in the run's Storage tab names which one applied: the keyword was too specific, the keyword contained characters Pinterest's search rejects, or your filters dropped everything. Zero-row runs cost nothing.

**Does it return save or repin counts?**
Search results (Modes 1–2) carry no save count — neither does Pinterest's own search page — so those rows give `reactions` only. Pins read from a board, section, profile or pin link (Mode 6) also carry `saves`, the save count Pinterest shows on those pages. To get save counts for a topic, run Mode 3 on the keyword, then Mode 6 on the boards it finds.

**I selected one mode but filled another mode's field. What happens?**
The actor runs the mode you selected, finds its field empty, and falls back to the 10-row demo. All seven sections stay visible in the Console, so check that the section you typed into carries the same mode number you picked.

**Can I search in languages other than English?**
Pinterest's search surface here accepts letters, digits and spaces. Accents are folded automatically, so French, German, Spanish and Portuguese keywords work. Scripts outside the Latin alphabet are not supported, and any keyword that uses them is reported in `SKIPPED_ITEMS`.

**Can I export every pin of a board or a profile?**
Yes — Mode 6. Paste the board or profile link, one per line, and set **Max pins (Mode 6)** to cap the bill. A profile is read board by board. A link Pinterest shows no pins for (deleted, secret, empty) gets a free row saying why.

**Can I get Pinterest Trends data — what is growing and when it peaks?**
Yes — Mode 7. Pick a country or region and one of Pinterest's lists (growing, monthly, yearly, seasonal), optionally narrow it to terms containing your keywords, and each trending term comes back with its rank, week / month / year growth, seasonality score and, by default, a year of weekly interest. One row per term, priced like every other row.

**Can I get the pins of one board section, or pins similar to a pin?**
Yes — both in Mode 6. Paste the section's link (`pinterest.com/name/board/section/`) to read that section only. For similar pins, paste a pin link and turn on **Also get related pins**.

**Are duplicate pins charged twice?**
No. Pinterest repeats pins across pages; the actor drops repeats run-wide before charging and counts them in `RUN_SUMMARY`.

**Can I schedule it?**
Yes — the three dots **⋯** on the actor page → **Schedule** → pick a cadence → **Activate**. A weekly Mode 3 or Mode 4 run is the usual setup: it shows which boards and accounts are growing in your topic between runs.

**How do I get only pins that link to a specific site?**
Set `linkDomainContains` to a fragment of that domain and switch on `onlyPinsWithLink`. See the first filter recipe above.

### 🔗 Other related actors (same author)

| Actor | Domain |
|---|---|
| [Pinterest Profile Scraper](https://apify.com/afanasenko/pinterest-profile-scraper) | Pinterest |
| [Instagram Profile Scraper](https://apify.com/afanasenko/instagram-profile-scraper) | Instagram |
| [Instagram Related Profiles Scraper](https://apify.com/afanasenko/instagram-related-profiles-scraper) | Instagram |
| [TikTok Profile Scraper](https://apify.com/afanasenko/tiktok-profile-scraper) | TikTok |
| [YouTube Channel Scraper](https://apify.com/afanasenko/youtube-channel-scraper) | YouTube |
| [LinkedIn Jobs Scraper](https://apify.com/afanasenko/linkedin-jobs-scraper) | LinkedIn |
| [Zillow Scraper](https://apify.com/afanasenko/zillow-scraper) | US real estate |

### 🛟 Support & feedback

Open the **Issues** tab on this actor's Apify Store page. Bug reports that include the run ID get fixed fastest, and feature requests do get built.

### ⚖️ Is it legal to scrape Pinterest?

This actor reads only what Pinterest shows a logged-out visitor: public pins, public boards and public profiles. It does not log in, does not touch private boards or private accounts, and collects no personal contact details.

Public data collection is broadly lawful in the EU and the US, but you remain responsible for what you do with the output — respect copyright in the images you find, follow Pinterest's terms for any republication, and handle any personal data in line with GDPR and local law.

# Changelog

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

# Actor input Schema

## `operationMode` (type: `string`):

What the run should search for. The section you fill in below depends on this choice.

## `searchPinsKeywords` (type: `array`):

One keyword per line. Letters, digits and spaces only — Pinterest search rejects punctuation, hashtags and emoji.

## `searchPinsMaxItems` (type: `integer`):

Stop after this many rows. 0 = no limit of your own (free plan still stops at 50 per run, 150 per month).

## `searchVideoPinsKeywords` (type: `array`):

One keyword per line. Only pins that carry a video are returned.

## `searchVideoPinsMaxItems` (type: `integer`):

Stop after this many rows. 0 = no limit of your own (free plan still stops at 50 per run, 150 per month).

## `searchBoardsKeywords` (type: `array`):

One keyword per line. Returns boards whose title or description matches.

## `searchBoardsMaxItems` (type: `integer`):

Stop after this many rows. 0 = no limit of your own (free plan still stops at 50 per run, 150 per month).

## `searchCreatorsKeywords` (type: `array`):

One keyword per line. Returns accounts that publish about the topic.

## `searchCreatorsMaxItems` (type: `integer`):

Stop after this many rows. 0 = no limit of your own (free plan still stops at 50 per run, 150 per month).

## `keywordSuggestionsKeywords` (type: `array`):

One seed per line. Each seed returns the phrases Pinterest itself suggests for it.

## `keywordSuggestionsMaxItems` (type: `integer`):

Stop after this many rows. 0 = no limit of your own (free plan still stops at 50 per run, 150 per month).

## `pinsFromLinksUrls` (type: `array`):

One link per line. A board (pinterest.com/name/board/) returns its pins; a board section (pinterest.com/name/board/section/) returns the pins of that section only; a profile (pinterest.com/name/) returns the pins on its public boards, board by board; a pin (pinterest.com/pin/1234567890/) returns that pin. Any Pinterest country domain and pin.it short links work. Search pages and secret boards are not read — each such link gets a free row saying why.

## `pinsFromLinksMaxItems` (type: `integer`):

Stop after this many pins across all links. 0 = no limit of your own (free plan still stops at 50 per run, 150 per month).

## `includeRelatedPins` (type: `boolean`):

For each pin link, also return the pins Pinterest shows under it as "More ideas" — one row each, charged like any other pin, marked input_type = related_pin with the pin they belong to in related_to_pin_id. Pin links only: board, section and profile links are read as usual without related pins. Related pins carry no save count.

## `relatedPinsPerPin` (type: `integer`):

How many related pins to return for each pin link, at most 500 (Pinterest shows about 500). Also bounded by Max pins above.

## `trendsRegion` (type: `string`):

Which country or region's Pinterest searches to read. The grouped regions are Pinterest's own.

## `trendsType` (type: `string`):

Which of Pinterest's lists to read: growing = the fastest risers; monthly = the most searched this month; yearly = the most searched over the year; seasonal = terms that come back at this time every year.

## `trendsKeywords` (type: `array`):

One keyword per line. Each keyword returns the trending terms that contain it as a word, as its own list of up to 100. Leave empty for the region's whole list.

## `trendsExcludeKeywords` (type: `array`):

One keyword per line. Terms that contain any of these as a word are left out of every list ("deko" leaves out "weihnachten deko", not "aussendeko").

## `trendsIncludeWeeklyInterest` (type: `boolean`):

Each row gets weekly_interest: one point per week for the past year, on Pinterest's own relative scale (the highest week of the term = 100). Turn off for a lighter row.

## `trendsMaxItems` (type: `integer`):

Stop after this many rows across all keywords. 0 = no limit of your own (free plan still stops at 50 per run, 150 per month).

## `minReactions` (type: `integer`):

Drop pins with fewer reactions than this. Modes 1, 2 and 6. 0 = keep everything. Most pins carry few reactions, so start low.

## `onlyPinsWithLink` (type: `boolean`):

Keep only pins with an outbound destination URL. Modes 1, 2 and 6.

## `excludePromotedPins` (type: `boolean`):

Drop pins Pinterest marks as promoted (ads). Modes 1, 2 and 6.

## `linkDomainContains` (type: `string`):

Comma-separated fragments, e.g. "etsy,amzn". Keeps only pins whose destination domain matches one of them. Modes 1, 2 and 6.

## `minCreatorFollowers` (type: `integer`):

Drop rows whose creator (Modes 1, 2, 4, 6) or board owner (Mode 3) has fewer followers than this. 0 = no minimum.

## `minBoardPins` (type: `integer`):

Drop boards holding fewer pins than this. Mode 3 only. 0 = no minimum.

## Actor input object example

```json
{
  "operationMode": "searchPins",
  "searchPinsKeywords": [],
  "searchPinsMaxItems": 0,
  "searchVideoPinsKeywords": [],
  "searchVideoPinsMaxItems": 0,
  "searchBoardsKeywords": [],
  "searchBoardsMaxItems": 0,
  "searchCreatorsKeywords": [],
  "searchCreatorsMaxItems": 0,
  "keywordSuggestionsKeywords": [],
  "keywordSuggestionsMaxItems": 0,
  "pinsFromLinksUrls": [],
  "pinsFromLinksMaxItems": 0,
  "includeRelatedPins": false,
  "relatedPinsPerPin": 50,
  "trendsRegion": "US",
  "trendsType": "growing",
  "trendsKeywords": [],
  "trendsExcludeKeywords": [],
  "trendsIncludeWeeklyInterest": true,
  "trendsMaxItems": 0,
  "minReactions": 0,
  "onlyPinsWithLink": false,
  "excludePromotedPins": false,
  "linkDomainContains": "",
  "minCreatorFollowers": 0,
  "minBoardPins": 0
}
```

# Actor output Schema

## `liveStatus` (type: `string`):

No description

## `results` (type: `string`):

No description

## `runSummary` (type: `string`):

Aggregate run statistics — counts, mode, paid events fired, wall-clock time.

## `userMessage` (type: `string`):

Onboarding tip, paid-plan welcome, or diagnostic message — only present when the run has something to surface.

## `freeLimitsApplied` (type: `string`):

Free-tier caps that affected this run. Empty if no caps applied or user is on a paid plan.

## `skippedItems` (type: `string`):

Keywords the run could not search and results it dropped as duplicates, with the reason for each. Only present when something was skipped.

# 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 = {
    "operationMode": "searchPins"
};

// Run the Actor and wait for it to finish
const run = await client.actor("afanasenko/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 = { "operationMode": "searchPins" }

# Run the Actor and wait for it to finish
run = client.actor("afanasenko/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 '{
  "operationMode": "searchPins"
}' |
apify call afanasenko/pinterest-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,afanasenko/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/zTMSS4NPKCEauOFiX/builds/F2uSewqbul2uhQwC5/openapi.json
