# Pinterest Scraper (`silentflow/pinterest-scraper`) Actor

Scrape Pinterest pins, boards, users and search results at scale. Extract images, videos, engagement metrics, pinner data, SEO metadata, prices and comments. 30+ data fields per pin with multi-resolution images.

- **URL**: https://apify.com/silentflow/pinterest-scraper.md
- **Developed by:** [SilentFlow](https://apify.com/silentflow) (community)
- **Categories:** Social media, Videos, E-commerce
- **Features:** Limited permissions
- **Stats:** 47 total users, 5 monthly users, 100.0% runs succeeded, 4 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.70 / 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

**Turn Pinterest into structured data you can actually use.** Extract pins, boards, user profiles, and search results with 30+ fields per pin, including pin links that open, 9 image resolutions, saves and comments, creator info, and shopping data.

### How it works

![How it works](https://api.apify.com/v2/key-value-stores/jkLbmgsrsgmcAAGJe/records/how-it-works-v1.png)

### ✨ Why use this scraper?

Copying Pinterest data manually? Dealing with scrapers that return 10 fields when you need 30? Getting blocked every other run?

- 📸 **9 image resolutions per pin.** From 170px thumbnails to full originals. No more guessing which URL gives you the size you need.
- 📊 **30+ structured fields per pin.** Engagement, creator, board, SEO, shopping, video, dominant color. Other scrapers skip half of these.
- 🔍 **Pins, video pins, boards or profiles from one keyword list.** Search several keywords in one run and pick what comes back. Paste pins, boards, board sections, profiles, idea pages or search links too. One scraper, every Pinterest content type.
- 🛒 **Shopping and price data included.** Enable `includeDetails` to get product prices, sale prices, and rich pin metadata.
- 🔗 **Pin links that open.** Search and board results come back with the real pin ID whenever the pin has a public page, so `url` opens the pin, never an error page.
- 💬 **Comments and replies, no login.** Turn on `includeComments` to get each pin's public comments with author, date, likes and replies.
- 🎨 **Dominant color and visual data.** Get hex color codes, dimensions, alt text, and visual annotations for every pin.

### 🎯 Use cases

| Team | What they build |
|------|----------------|
| **E-commerce** | Product trend reports from Pinterest shopping pins across categories |
| **Design agencies** | Visual mood boards with high-res images, color palettes, and engagement data |
| **Content marketing** | Top-performing pin analysis to guide content strategy on Pinterest |
| **Academic research** | Visual culture datasets with metadata, engagement, and creator demographics |
| **SEO teams** | Pinterest keyword research using search volume and pin engagement signals |
| **Brand monitoring** | Track how products and brand visuals spread across boards and repins |

### 📥 Input parameters

#### Search

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `searchQueries` | array | \* | - | Keywords to search on Pinterest, one per line. Each row says which keyword found it in `searchQuery` |
| `searchType` | string | No | `pins` | What the keyword search collects: `pins`, `videos` (video pins only), `boards` or `profiles` |
| `startUrls` | array | \* | - | Pinterest URLs: pins, boards, board sections, profiles, idea pages (`/ideas/...`) or search pages |

\* Either `searchQueries` or `startUrls` is required (or both). The older single `search` field still works.

#### Limits

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `maxItems` | integer | No | 100 | Maximum number of results for the whole run, shared evenly between your keywords and URLs |

#### Options

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `includeDetails` | boolean | No | false | Fetch SEO metadata, original pin source, and product prices |
| `includeComments` | boolean | No | false | Add each pin's public comments, with author, date, likes and replies |
| `maxComments` | integer | No | 20 | Maximum comments per pin, replies included |

#### Advanced

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `includeUserInfoOnly` | boolean | No | false | When scraping user profiles, only return user info without their pins |
| `proxy` | object | No | Residential | Proxy configuration |

### 📊 Output data

Each pin returns a structured JSON object with 30+ fields:

```json
{
    "type": "pin",
    "id": "1234567890",
    "url": "https://www.pinterest.com/pin/1234567890/",
    "title": "Modern Minimalist Living Room",
    "description": "Clean lines and neutral tones for a calm, modern space",
    "richSummary": "Interior design inspiration",
    "imageUrl": "https://i.pinimg.com/originals/ab/cd/ef/abcdef123456.jpg",
    "imageUrls": {
        "original": "https://i.pinimg.com/originals/ab/cd/ef/abcdef123456.jpg",
        "736x": "https://i.pinimg.com/736x/ab/cd/ef/abcdef123456.jpg",
        "474x": "https://i.pinimg.com/474x/ab/cd/ef/abcdef123456.jpg",
        "236x": "https://i.pinimg.com/236x/ab/cd/ef/abcdef123456.jpg",
        "170x": "https://i.pinimg.com/170x/ab/cd/ef/abcdef123456.jpg",
        "60x60": "https://i.pinimg.com/60x60/ab/cd/ef/abcdef123456.jpg",
        "136x136": "https://i.pinimg.com/136x136/ab/cd/ef/abcdef123456.jpg",
        "200x150": "https://i.pinimg.com/200x150/ab/cd/ef/abcdef123456.jpg",
        "400x300": "https://i.pinimg.com/400x300/ab/cd/ef/abcdef123456.jpg"
    },
    "videoUrl": "",
    "isVideo": false,
    "saves": 3420,
    "comments": 87,
    "reactions": 215,
    "repinCount": 1890,
    "viewCount": 45200,
    "createdAt": "Mon, 10 Mar 2025 14:22:00 +0000",
    "pinner": {
        "username": "modernhomedesign",
        "fullName": "Modern Home Design",
        "followerCount": 28500,
        "profileUrl": "https://www.pinterest.com/modernhomedesign/",
        "imageUrl": "https://i.pinimg.com/avatars/modernhomedesign.jpg",
        "isVerified": true
    },
    "board": {
        "name": "Living Room Ideas",
        "url": "https://www.pinterest.com/modernhomedesign/living-room-ideas/",
        "pinCount": 412,
        "owner": "modernhomedesign"
    },
    "dominantColor": "#D4C5B2",
    "width": 1920,
    "height": 2560,
    "altText": "Modern minimalist living room with neutral tones",
    "autoAltText": "Living room with white sofa and wooden coffee table",
    "link": "https://www.homedesignmag.com/minimalist-living-room",
    "domain": "homedesignmag.com",
    "richPinType": "article",
    "category": "home_decor",
    "hashtags": ["minimalist", "livingroom", "homedecor"],
    "isStoryPin": false,
    "isCarousel": false,
    "isPromoted": false,
    "isRepin": true,
    "seoTitle": "20 Minimalist Living Room Ideas for 2025",
    "seoDescription": "Discover clean, modern living room designs with neutral palettes",
    "priceValue": 0,
    "priceCurrency": "",
    "originalPin": {
        "id": "9876543210",
        "pinner": {
            "username": "originalcreator",
            "fullName": "Original Creator"
        }
    },
    "commentsList": [
        {
            "id": "5551234",
            "text": "Love this design! Where is the sofa from?",
            "createdAt": "Wed, 12 Mar 2025 09:15:00 +0000",
            "author": {
                "username": "homelover99",
                "fullName": "Sarah Home",
                "profileUrl": "https://www.pinterest.com/homelover99/"
            },
            "likeCount": 12,
            "replyCount": 1,
            "replies": [
                {
                    "id": "5551240",
                    "text": "Same question!",
                    "createdAt": "Wed, 12 Mar 2025 11:02:41 +0000",
                    "author": { "username": "lucasdesigns", "profileUrl": "https://www.pinterest.com/lucasdesigns/" },
                    "likeCount": 2,
                    "replyCount": 0
                }
            ]
        }
    ]
}
```

### 🗂️ Data fields

#### Core

| Field | Type | Description |
|-------|------|-------------|
| `type` | string | Content type: pin, board, or user |
| `id` | string | Pinterest pin ID |
| `searchQuery` | string | The keyword (or idea page name) that found the row |
| `source` | string | Where the row came from: search, board, user, ideas or pin_detail |
| `url` | string | Full Pinterest URL |
| `title` | string | Pin title |
| `description` | string | Pin description |
| `richSummary` | string | Rich pin summary text |
| `createdAt` | string | Creation date, such as `Mon, 10 Mar 2025 14:22:00 +0000` |

#### Images

| Field | Type | Description |
|-------|------|-------------|
| `imageUrl` | string | Highest resolution image URL |
| `imageUrls` | object | All available resolutions: original, 736x, 474x, 236x, 170x, 60x60, 136x136, 200x150, 400x300 |
| `dominantColor` | string | Hex color code of the dominant color |
| `width` | integer | Image width in pixels |
| `height` | integer | Image height in pixels |
| `altText` | string | Image alt text |
| `autoAltText` | string | Pinterest auto-generated alt text |

#### Video

| Field | Type | Description |
|-------|------|-------------|
| `videoUrl` | string | Video URL if available |
| `isVideo` | boolean | Whether the pin contains a video |
| `isPlayable` | boolean | Whether the video is playable |
| `videoDuration` | float | Video duration in seconds |

#### Engagement

| Field | Type | Description |
|-------|------|-------------|
| `saves` | integer | Number of saves |
| `comments` | integer | Number of comments |
| `reactions` | integer | Number of reactions |
| `repinCount` | integer | Number of repins |
| `viewCount` | integer | Number of views |
| `likeCount` | integer | Number of likes |
| `shareCount` | integer | Number of shares |

#### Creator

| Field | Type | Description |
|-------|------|-------------|
| `pinner` | object | Creator info: username, fullName, followerCount, profileUrl, imageUrl, isVerified |
| `nativeCreator` | object | Original content creator (for repins) |
| `board` | object | Board info: name, url, pinCount, owner |

#### Links and source

| Field | Type | Description |
|-------|------|-------------|
| `link` | string | External source URL |
| `domain` | string | Source website domain |
| `trackingLink` | string | Click tracking URL |
| `canonicalUrl` | string | Canonical URL |

#### Rich pins and shopping

| Field | Type | Description |
|-------|------|-------------|
| `richPinType` | string | Type: article, recipe, product, app, movie |
| `priceValue` | float | Product price (with includeDetails) |
| `priceCurrency` | string | Price currency code |
| `salePrice` | float | Sale price if available |
| `isBuyable` | boolean | Whether the product can be purchased |
| `shoppingInfo` | object | Full shopping metadata |
| `productTags` | array | Product tags on the pin |

#### SEO (with includeDetails)

| Field | Type | Description |
|-------|------|-------------|
| `seoTitle` | string | SEO-optimized title |
| `seoDescription` | string | SEO meta description |
| `originalPin` | object | Source pin info for repins |

#### Comments (with includeComments)

| Field | Type | Description |
|-------|------|-------------|
| `commentsList` | array | Public comments: id, text, createdAt, author (username, fullName, profileUrl, imageUrl), likeCount, replyCount, replies |

#### Content type

| Field | Type | Description |
|-------|------|-------------|
| `isStoryPin` | boolean | Whether it is an idea pin |
| `storyPinData` | object | Idea pin pages and metadata |
| `isCarousel` | boolean | Whether it is a carousel pin |
| `carouselCount` | integer | Number of carousel slides |
| `category` | string | Pinterest category |
| `hashtags` | array | Hashtags on the pin |
| `visualAnnotations` | array | Topics Pinterest attaches to the pin, such as "Sage Green Living Room" (most video pins carry them) |
| `isPromoted` | boolean | Whether the pin is a promoted ad |
| `isRepin` | boolean | Whether the pin is a repin |

#### Boards (with searchType: boards)

| Field | Type | Description |
|-------|------|-------------|
| `type` | string | `board` |
| `id`, `name`, `url` | string | Board ID, name and link |
| `description` | string | Board description |
| `pinCount`, `sectionCount`, `collaboratorCount` | integer | Size of the board |
| `isCollaborative` | boolean | Whether several people pin to it |
| `imageUrl`, `pinImageUrls` | string, array | Cover image and pin thumbnails |
| `owner` | object | Owner: username, fullName, followerCount, profileUrl |
| `searchQuery` | string | The keyword that found the board |

#### Profiles (with searchType: profiles)

| Field | Type | Description |
|-------|------|-------------|
| `type` | string | `user` |
| `id`, `username`, `fullName`, `profileUrl` | string | The account and its link |
| `followerCount`, `pinCount`, `boardCount` | integer | Audience and activity |
| `imageUrl`, `imageUrlLarge` | string | Profile picture |
| `isVerified`, `domainVerified` | boolean | Verification badges |
| `searchQuery` | string | The keyword that found the profile |

### 🚀 Examples

#### Search several keywords at once

```json
{
    "searchQueries": ["interior design 2026", "small kitchen ideas", "boho bedroom"],
    "maxItems": 150
}
```

#### Find boards or creators on a topic

```json
{
    "searchQueries": ["meal prep"],
    "searchType": "boards",
    "maxItems": 50
}
```

Set `searchType` to `profiles` to get the accounts that post about a topic, or to `videos` for video pins only (add `includeDetails` for their MP4 files).

#### Scrape an idea page or a board section

```json
{
    "startUrls": [
        "https://www.pinterest.com/ideas/beauty/935541271955/",
        "https://www.pinterest.com/maryloueobrecht/recipes/cocktails/"
    ],
    "maxItems": 100
}
```

#### Extract all pins from a board

```json
{
    "startUrls": ["https://www.pinterest.com/pinterest/official-news/"],
    "maxItems": 200
}
```

#### Pull shopping data from fashion pins

```json
{
    "searchQueries": ["summer dresses"],
    "maxItems": 100,
    "includeDetails": true
}
```

#### Get pins with full comment threads

```json
{
    "searchQueries": ["recipe ideas"],
    "maxItems": 50,
    "includeComments": true
}
```

### 💻 Integrations

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run = client.actor("silentflow/pinterest-scraper").call(run_input={
    "searchQueries": ["home decor"],
    "maxItems": 100,
    "includeDetails": True
})

for pin in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{pin['title']}: {pin['imageUrl']}")
    print(f"  Saves: {pin['saves']}, Color: {pin['dominantColor']}")
```

#### JavaScript

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

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });

const run = await client.actor('silentflow/pinterest-scraper').call({
    searchQueries: ['fashion trends'],
    maxItems: 100,
    includeDetails: true
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach(pin => {
    console.log(`${pin.title}: ${pin.imageUrl}`);
    console.log(`  Saves: ${pin.saves}, Color: ${pin.dominantColor}`);
});
```

### 📈 Performance

| Metric | Value |
|--------|-------|
| Speed | ~50-100 pins per minute |
| Fields per pin | 30+ |
| Image resolutions | 9 per pin |
| Detail fetching | 5 parallel workers |

### 💡 Tips for best results

1. **Start with 10 items to test.** Verify the output format matches your needs before running large jobs.
2. **Use board URLs for targeted data.** Boards return focused, curated pins. Search results are broader but noisier.
3. **Enable includeDetails only when needed.** It adds SEO metadata and prices but requires an extra request per pin, which increases run time.
4. **Combine keywords and URLs.** Give `searchQueries` and `startUrls` in the same run: `maxItems` is shared evenly between them, so no source crowds out the others.
5. **Enable includeComments selectively.** Comment fetching adds one request per pin. Use it only when you need the actual comment text and authors.

### ❓ FAQ

**Can I scrape private boards?**
No. Only publicly visible Pinterest content is accessible.

**Are videos included?**
Yes. Video pins include `videoUrl`, `videoDuration`, and `isPlayable` fields. Set `searchType` to `videos` to keep video pins only, and turn on `includeDetails` to get the MP4 file in `videoUrl` instead of the stream.

**What are idea pins?**
Idea pins (formerly story pins) are multi-page pins. The scraper returns them with `isStoryPin: true` and the full `storyPinData` object.

**What does includeDetails add?**
SEO title and description, the original pin source for repins, and product price and shopping data. These fields require an extra request per pin.

**Can I get the comments of a pin?**
Yes. Turn on `includeComments` and each pin row carries its public comments in `commentsList`, with author, date, likes and replies. No Pinterest account needed. Use `maxComments` to cap how many you get per pin.

**Why is `url` empty on some search results?**
Pinterest shows some pins in search without their public pin ID: Pinterest Preview pins it builds from a website article, and some older pins. When the real pin cannot be found, `url` stays empty instead of pointing to a Pinterest error page. Every other field is filled, and the article link is in `link`.

**How many image resolutions do I get?**
Nine: original, 736x, 474x, 236x, 170x, 60x60, 136x136, 200x150, and 400x300.

**What URL formats are supported?**
Pins (`/pin/123/` and `/pin/title--123/`), boards (`/user/board-name/`), board sections (`/user/board-name/section/`), user profiles (`/username/`), idea pages (`/ideas/beauty/935541271955/`) and search pages on any tab (`/search/pins/?q=keyword`, `/search/videos/`, `/search/boards/`, `/search/users/`).

**What does an idea page return?**
The pins Pinterest lists for the idea's topic, with every field. Each row has `source: "ideas"` and the idea's name in `searchQuery`.

### 📬 Support

Need something this scraper doesn't do yet? We ship features fast.

- Feature requests go straight to our backlog
- Enterprise needs? We do custom integrations

Response time: usually under 24 hours.

Check out our other scrapers: [SilentFlow on Apify](https://apify.com/silentflow)

# Actor input Schema

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

Keywords to search on Pinterest, one per line (e.g. 'home decor ideas', 'fall outfits'). Each row says which keyword found it.

## `searchType` (type: `string`):

What the keyword search collects: pins, video pins only, boards or profiles.

## `startUrls` (type: `array`):

Pinterest URLs to scrape: pins, boards, board sections, profiles, idea pages (/ideas/...) or search pages. Use instead of or alongside keywords.

## `maxItems` (type: `integer`):

Maximum number of results for the whole run, shared evenly between your keywords and URLs.

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

Fetch SEO metadata, original pin source, and product prices. Adds ~1 request per pin.

## `includeComments` (type: `boolean`):

Add each pin's public comments to its row: text, author, date, likes and replies.

## `maxComments` (type: `integer`):

Maximum number of comments, replies included, returned for each pin.

## `includeUserInfoOnly` (type: `boolean`):

When scraping user profiles, only get user info without their pins.

## `proxy` (type: `object`):

Residential proxies are recommended.

## `search` (type: `string`):

Single keyword, kept for inputs written before Search Keywords. Use Search Keywords instead.

## Actor input object example

```json
{
  "searchQueries": [
    "home decor ideas"
  ],
  "searchType": "pins",
  "maxItems": 100,
  "includeDetails": false,
  "includeComments": false,
  "maxComments": 20,
  "includeUserInfoOnly": false,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `pins` (type: `string`):

Complete Pinterest data including: type (pin/board/user), id, title, description, imageUrl (high-res), videoUrl, saves (save count), comments (comment count), reactions, url, createdAt, boardName, boardUrl, userName, userUrl, userFollowers, tags, link (external URL), isVideo.

## `boards` (type: `string`):

Boards found with searchType boards: cover, name, pins, sections, owner and keyword.

## `profiles` (type: `string`):

Accounts found with searchType profiles: username, name, followers, pins, boards and keyword.

# 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": [
        "home decor ideas"
    ],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("silentflow/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": ["home decor ideas"],
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("silentflow/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": [
    "home decor ideas"
  ],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call silentflow/pinterest-scraper --silent --output-dataset

```

## MCP server setup

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