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

Scrape Pinterest search results by keyword — pins, video pins, boards, creator profiles and keyword suggestions as clean rows. Every pin carries its outbound link, destination domain, board, creator, topic tags and image sizes. No login needed. Export to CSV, JSON or Excel.

- **URL**: https://apify.com/afanasenko/pinterest-scraper.md
- **Developed by:** [Andrey Afanasenko](https://apify.com/afanasenko) (community)
- **Categories:** Social media, Lead generation, E-commerce
- **Stats:** 2 total users, 1 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Pinterest Scraper — Search Pins, Boards & Creators

[![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, 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. It searches 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 |

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 five 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": "http://arinteriors.ca/",
  "outbound_domain": "arinteriors.ca",
  "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** keyword field — the other four are ignored.

### ⭐ 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.

#### 🎯 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`.

### 🧭 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 1 fills in the pins.

### 🎯 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 five searches 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. |
| `<mode>MaxItems` | integer | per mode | Row ceiling for that mode. `0` = no ceiling of your own. |
| `minReactions` | integer | Modes 1, 2 | Drop pins below this reaction count. |
| `onlyPinsWithLink` | boolean | Modes 1, 2 | Keep only pins that link somewhere. |
| `excludePromotedPins` | boolean | Modes 1, 2 | Drop pins Pinterest marks as ads. |
| `linkDomainContains` | string | Modes 1, 2 | Comma-separated domain fragments to keep. |
| `minCreatorFollowers` | integer | Modes 1–4 | Minimum followers for the creator or board owner. |
| `minBoardPins` | integer | Mode 3 | Minimum pins on the board. |

**Keywords 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 | 50 | your `maxItems`, unlimited by default |
| All five modes | ✓ | ✓ |
| All filters | ✓ | ✓ |
| Pagination past the first page | ✓ | ✓ |
| Scheduling | ✓ | ✓ |

The free ceiling is a per-run row cap and nothing else — no mode, filter or field is held back. When a run hits it, the actor says so in `USER_MESSAGE` and on the live status page.

### 🧪 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
}
```

**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, upstream 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, duplicate results, failed searches — 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 Pinterest exposes on public search surfaces. Save and repin counts are not available to any logged-out client, so no tool can read them here — treat any product claiming otherwise with suspicion.

`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?**
No, and nothing else does either — Pinterest does not expose those numbers to logged-out clients. You get `reactions`, which is the engagement signal that is available.

**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 five 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`.

**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.

# 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).

## `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).

## `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).

## `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).

## `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).

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

Drop pins with fewer reactions than this. 0 = keep everything. Most pins carry few reactions, so start low.

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

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

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

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

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

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

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

Drop rows whose creator (Modes 1, 2, 4) 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,
  "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("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=afanasenko/pinterest-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/zTMSS4NPKCEauOFiX/builds/OedjI1jdj3dEJ8jj1/openapi.json
