# Pinterest Scraper (`unfenced-group/pinterest-scraper`) Actor

Scrape Pinterest pins, boards, profiles and search results. Images, engagement metrics, product data and creator profiles.

- **URL**: https://apify.com/unfenced-group/pinterest-scraper.md
- **Developed by:** [Unfenced Group](https://apify.com/unfenced-group) (community)
- **Categories:** Social media, E-commerce
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

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

![Pinterest Scraper](https://api.apify.com/v2/key-value-stores/tfkWqJkGn7gWfWfeV/records/banner.png)

Extract pins, boards, profiles and search results from Pinterest at scale, with the richest field set available: images at every resolution, engagement metrics, creator and board profiles, product data and outbound links. No login, no API key required.

***

### Why this scraper?

#### 🔍 Search every tab

Search Pinterest by keyword across pins, videos, boards or users. Paginates automatically through as many results as you set.

#### 📌 Complete pin data

Title, description, alt text, outbound link, source domain, dominant colour, and images at five resolutions up to the original. Videos return the playable file URL.

#### 📈 Engagement metrics

Save (repin) count, comment count, reactions and done count — the signals you need for trend research and content planning. Available when detail fetching is enabled.

#### 👤 Creator and board profiles

Pinner username, full name, follower count, pin and board counts, verified-merchant flag and avatar. Board name, URL, pin count and owner.

#### 🛍️ Product data

For shoppable pins: price, currency, brand, availability, product name, rating and review count.

#### 🔗 Direct URLs

Feed pin, board, profile or search URLs directly and pull them without writing a query.

***

### Input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `searchQueries` | array | `[]` | Keywords to search. Each entry becomes its own search. Leave empty if you use Start URLs. |
| `searchScope` | string | `"pins"` | Which search tab to use for the queries: `pins`, `videos`, `boards` or `users`. |
| `startUrls` | array | `[]` | Scrape specific Pinterest URLs directly. Supports pin, board, profile and search URLs. Takes priority over queries. |
| `maxResults` | integer | `100` | Maximum number of pins to return across all queries and URLs. Set to `0` for unlimited. |
| `fetchDetails` | boolean | `false` | Fetch each pin's detail page to add engagement metrics, product data and full metadata. Adds one request per pin. |
| `includeComments` | boolean | `false` | Fetch top comments for each pin. Requires `fetchDetails` to be enabled. |
| `maxComments` | integer | `10` | Maximum number of comments to fetch per pin when `includeComments` is enabled. |
| `proxyConfiguration` | object | none | Optional. The scraper runs without a proxy by default. Enable a residential proxy only for very large runs. |

***

### Output schema

Every field below is present on every record. Fields Pinterest does not publish for a given pin are returned as `null` rather than omitted.

#### Always present (list and search mode)

| Field | Type | Description |
|---|---|---|
| `id` | string | Pinterest pin ID. |
| `url` | string | Canonical pin URL. |
| `title` | string | Pin title (falls back to the grid or SEO title). |
| `description` | string | Pin description (null if none). |
| `altText` | string | Auto-generated or author alt text for the image. |
| `link` | string | Outbound destination URL of the pin (null if none). |
| `trackedLink` | string | Pinterest click-tracking redirect for the outbound link. |
| `domain` | string | Source domain of the outbound link. |
| `imageUrl` | string | Original-resolution image URL. |
| `imageWidth` | integer | Width of the original image in pixels. |
| `imageHeight` | integer | Height of the original image in pixels. |
| `imageVariants` | object | Map of every available image size to its URL, width and height. |
| `dominantColor` | string | Dominant colour of the image as a hex code. |
| `isVideo` | boolean | Whether the pin is a video pin. |
| `videoUrl` | string | Playable video file URL (null for image pins). |
| `videoDurationMs` | integer | Video duration in milliseconds (null for image pins). |
| `isPromoted` | boolean | Whether the pin is a promoted (ad) pin. |
| `isRepin` | boolean | Whether the pin is a repin of another pin. |
| `createdAt` | string | Timestamp Pinterest reports for the pin. |
| `hashtags` | array | Hashtags found on the pin (null if none). |
| `seoTitle` | string | SEO title Pinterest assigns the pin. |
| `seoDescription` | string | SEO description Pinterest assigns the pin. |
| `pinner` | object | Creator profile — see profile fields below. |
| `board` | object | Board the pin belongs to — id, name, url, privacy, owner. |
| `product` | object | Product data — see product fields below. |
| `searchQuery` | string | The query that produced this pin (null in URL mode). |
| `source` | string | Always `"pinterest.com"`. |
| `scrapedAt` | string | ISO 8601 timestamp of extraction. |
| `contentHash` | string | Stable hash of the pin's key fields for change detection. |

#### With `fetchDetails: true`

| Field | Type | Description |
|---|---|---|
| `repinCount` | integer | Number of times the pin has been saved. |
| `saveCount` | integer | Save count (alias of repinCount, from aggregated stats). |
| `likeCount` | integer | Number of favourites/likes. |
| `commentCount` | integer | Number of comments. |
| `shareCount` | integer | Number of shares. |
| `reactionCounts` | object | Breakdown of reaction types to their counts. |
| `doneCount` | integer | Number of "tried it" / done marks. |
| `comments` | array | Top comments (only with `includeComments: true`): id, text, commenter, createdAt, likeCount. |

#### Profile object (`pinner`, `board.owner`)

Inside a pin, the creator object carries identity and follower count. Full pin, board and following counts are returned when you scrape a profile directly with `searchScope: "users"` or a profile Start URL.

| Field | Type | Description |
|---|---|---|
| `id` | string | User ID. |
| `username` | string | Pinterest handle. |
| `fullName` | string | Display name. |
| `followerCount` | integer | Number of followers. |
| `isVerifiedMerchant` | boolean | Whether the account is a verified merchant. |
| `avatarUrl` | string | Profile image URL. |

#### Product object (`product`)

| Field | Type | Description |
|---|---|---|
| `isProduct` | boolean | Whether the pin is a shoppable product pin. |
| `price` | string | Displayed price (null if not a product). |
| `currency` | string | Currency code. |
| `brand` | string | Brand name. |
| `availability` | string | Stock status. |
| `productName` | string | Product name. |
| `rating` | number | Average rating. |
| `ratingCount` | integer | Number of ratings. |

#### Example record

```json
{
  "id": "18788523442530970",
  "url": "https://www.pinterest.com/pin/18788523442530970/",
  "title": "Minimalist bedroom in warm neutrals",
  "description": "Soft linen bedding and oak nightstands for a calm, minimal space.",
  "altText": "Beige minimalist bedroom with linen bedding and oak furniture",
  "link": "https://roveconcepts.com/bedroom",
  "trackedLink": "https://www.pinterest.com/link/?url=https%3A%2F%2Froveconcepts.com%2Fbedroom",
  "domain": "roveconcepts.com",
  "imageUrl": "https://i.pinimg.com/originals/2b/3a/ac/2b3aac8b54.jpg",
  "imageWidth": 1000,
  "imageHeight": 1500,
  "imageVariants": {
    "236x": { "url": "https://i.pinimg.com/236x/2b/3a/ac/2b3aac8b54.jpg", "width": 236, "height": 354 },
    "orig": { "url": "https://i.pinimg.com/originals/2b/3a/ac/2b3aac8b54.jpg", "width": 1000, "height": 1500 }
  },
  "dominantColor": "#cac7c0",
  "isVideo": false,
  "videoUrl": null,
  "videoDurationMs": null,
  "isPromoted": false,
  "isRepin": false,
  "createdAt": "Tue, 04 Mar 2025 11:22:00 +0000",
  "hashtags": ["minimalism", "bedroomdecor"],
  "seoTitle": "Minimalist bedroom in warm neutrals",
  "seoDescription": "Soft linen bedding and oak nightstands for a calm, minimal space.",
  "repinCount": 3418,
  "likeCount": 52,
  "commentCount": 7,
  "shareCount": 12,
  "reactionCounts": { "1": 52 },
  "doneCount": 3,
  "pinner": {
    "id": "509823477120983",
    "username": "studioliv",
    "fullName": "Studio Liv",
    "followerCount": 24810,
    "isVerifiedMerchant": false,
    "avatarUrl": "https://i.pinimg.com/140x140/aa/bb/cc/aabbcc.jpg"
  },
  "board": {
    "id": "509823477000112233",
    "name": "Bedroom inspo",
    "url": "https://www.pinterest.com/studioliv/bedroom-inspo/",
    "owner": { "username": "studioliv", "followerCount": 24810 }
  },
  "product": {
    "isProduct": true,
    "price": "$1,290.00",
    "currency": "USD",
    "brand": "Rove Concepts",
    "availability": "in stock",
    "productName": "Linen platform bed",
    "rating": 4.7,
    "ratingCount": 128
  },
  "searchQuery": "minimalist bedroom",
  "source": "pinterest.com",
  "scrapedAt": "2026-07-03T12:00:00.000Z",
  "contentHash": "a1b2c3d4e5f60718"
}
```

***

### Examples

**Search for pins by keyword:**

```json
{
  "searchQueries": ["minimalist bedroom", "nail art"],
  "searchScope": "pins",
  "maxResults": 200
}
```

**Search for creators (users tab):**

```json
{
  "searchQueries": ["interior designer"],
  "searchScope": "users",
  "maxResults": 100
}
```

**Scrape specific pin, board and profile URLs:**

```json
{
  "startUrls": [
    { "url": "https://www.pinterest.com/pin/18788523442530970/" },
    { "url": "https://www.pinterest.com/refinery29/nail-art/" },
    { "url": "https://www.pinterest.com/nike/" }
  ],
  "fetchDetails": true
}
```

**Full enrichment with engagement metrics and comments:**

```json
{
  "searchQueries": ["home office desk"],
  "maxResults": 50,
  "fetchDetails": true,
  "includeComments": true,
  "maxComments": 10
}
```

***

**Scheduled daily run:**

```json
{
  "searchQueries": [
    "minimalist bedroom"
  ],
  "maxResults": 300
}
```

Schedule this input in the Apify Scheduler (for example daily at 07:00) to keep an always-fresh dataset.

### 💰 Pricing

**$1.19 per 1,000 results** — you only pay for successfully retrieved pins. Failed retries are never charged.

| Results | Cost |
|---|---|
| 100 | ~$0.12 |
| 1,000 | ~$1.19 |
| 10,000 | ~$11.9 |
| 100,000 | ~$119 |

> Flat-rate alternatives typically charge $29–$49/month regardless of usage.

Subscription tiers lower the rate further, down to $0.79 per 1,000 at the highest tier. Use the **Max results** cap in the input to control your spend exactly.

***

### Performance

| Run size | Typical time |
|---|---|
| 100 results | under 1 minute |
| 1,000 results | 2–4 minutes |
| 10,000 results | 20–35 minutes |

Enabling `fetchDetails` adds one request per pin, so detail-mode runs take longer than list-mode runs of the same size.

***

### Known limitations

- Engagement metrics (saves, likes, comments) are only available with `fetchDetails: true` — Pinterest does not include them in search results.
- Comment threads are only fetched when both `fetchDetails` and `includeComments` are enabled.
- Product fields are only populated for shoppable pins; regular pins return `isProduct: false`.
- Pinterest search caps how deep any single query can page; very large result targets are best split across several specific queries.

***

### Technical details

- **Source:** pinterest.com — pins, boards, profiles and search
- **Coverage:** global, keyword and URL driven
- **Retry:** automatic retry on network errors with exponential backoff

***

### Need a custom scraper?

**[Unfenced Group](https://www.unfencedgroup.nl)** builds Apify actors for any website — for free.

If the site you need isn't in our portfolio yet, just ask. We scope, build, and publish it at no cost to you. You only pay for results — we absorb the compute and proxy costs ourselves. Same pay-per-result pricing, same quality, same standards as every actor in this portfolio.

**Get in touch:** [www.unfencedgroup.nl](https://www.unfencedgroup.nl)

# Actor input Schema

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

Keywords to search on Pinterest. Each entry becomes its own search. Leave empty if you use Start URLs.

## `searchScope` (type: `string`):

Which Pinterest search tab to use for the queries above: pins, videos, boards or users.

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

Scrape specific Pinterest URLs directly. Supports pin, board, profile and search URLs. When set, this takes priority over search queries.

## `maxResults` (type: `integer`):

Maximum number of pins to return across all queries and URLs. Set to 0 for unlimited.

## `fetchDetails` (type: `boolean`):

Fetch each pin's detail page to add engagement metrics (saves, likes, comments), product data and full metadata. Slower and adds one request per pin.

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

Fetch top comments for each pin. Requires Fetch pin details to be enabled.

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

Maximum number of comments to fetch per pin when Include comments is enabled.

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

Optional. The scraper runs without a proxy by default. Enable a residential proxy only if you hit blocks on very large runs.

## Actor input object example

```json
{
  "searchQueries": [
    "minimalist bedroom"
  ],
  "searchScope": "pins",
  "startUrls": [],
  "maxResults": 100,
  "fetchDetails": false,
  "includeComments": false,
  "maxComments": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

No description

# API

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

## JavaScript example

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

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

// Prepare Actor input
const input = {
    "searchQueries": [
        "minimalist bedroom"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("unfenced-group/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": ["minimalist bedroom"] }

# Run the Actor and wait for it to finish
run = client.actor("unfenced-group/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 '{
  "searchQueries": [
    "minimalist bedroom"
  ]
}' |
apify call unfenced-group/pinterest-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=unfenced-group/pinterest-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

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