# Pinterest Scraper: Pins, Boards, Profiles & Search (`punkrecordsdata/pinterest-scraper`) Actor

Scrape Pinterest pins, boards, profiles, and search results: images, descriptions, engagement stats, and product pricing data. Export CSV, Excel, JSON.

- **URL**: https://apify.com/punkrecordsdata/pinterest-scraper.md
- **Developed by:** [PunkRecordsData](https://apify.com/punkrecordsdata) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.55 / 1,000 pin/board/profile 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?

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

<p align="center">
  <img src="https://api.apify.com/v2/key-value-stores/AAm3a1h3Z9nYfrvh9/records/banner" alt="PunkRecordsData" width="100%" />
</p>

## 📌 Pinterest Scraper: Pins, Boards, Profiles & Search

> 🚀 **Pinterest Scraper** exports pins, boards, profiles, and search results in seconds: images, descriptions, save counts, board and pinner details, and product pricing when the pin is a shopping pin. Point it at a keyword, a username, a board, or a pin URL, get a structured dataset back.

> 🕒 **Last updated:** 2026-08-30 · **📊 30 fields** per record · 4 input modes · CSV, Excel, JSON export

Pulling Pinterest data by hand means scrolling and screenshotting one pin at a time. This Actor calls Pinterest's own internal API directly and turns any search, profile, board, or individual pin into a clean, exportable dataset in seconds. Runs on the Apify platform, so every run is schedulable, monitorable from the Console, and reachable through the Apify API or any of Apify's integrations (Zapier, Make, n8n).

| 🎯 Target audience | 💡 Primary use cases |
|---|---|
| Marketers, e-commerce researchers, content teams, trend analysts | Competitor pin research, board archiving, influencer/profile analysis, product/shopping-pin price monitoring, keyword trend tracking |

### 📋 What the Pinterest Scraper does

Four input modes, usable together in one run: search by keyword (scoped to pins, videos, boards, or users), scrape a profile's full pin grid plus profile metadata, scrape every pin on a specific board, or scrape individual pins by URL. Every mode returns the same consistent record shape: image, title, description, pinner, board, save count, and (for shopping pins) product fields, ready for a spreadsheet or a downstream pipeline.

### ⚙️ Input

| Field | Type | Description |
|---|---|---|
| `searchQueries` | array | Keywords to search, same as Pinterest's own search bar |
| `searchScope` | string | `pins`, `videos`, `boards`, or `users`: what the search returns |
| `profiles` | array | Usernames to scrape (profile metadata + full pin grid) |
| `boardUrls` | array | Full board URLs, every pin on that board |
| `pinUrls` | array | Full pin URLs, individual pin detail |
| `maxItems` | integer | Cap per source. Leave empty to pull everything available |
| `proxyConfiguration` | object | Optional. Not required for normal volume |

Minimal input, one search:

```json
{
  "searchQueries": ["home decor"],
  "searchScope": "pins",
  "maxItems": 50
}
```

Combined, all four modes in one run:

```json
{
  "searchQueries": ["coffee"],
  "profiles": ["tiktok"],
  "boardUrls": ["https://www.pinterest.com/username/board-name/"],
  "pinUrls": ["https://www.pinterest.com/pin/1234567890123456789/"],
  "maxItems": 100
}
```

> ⚠️ **Good to know:** comment counts are only available when scraping a pin directly by URL. Search, profile, and board results use Pinterest's lighter listing payload, which doesn't include them, fetching full detail on every grid pin would multiply request volume with no other benefit, so that field stays empty outside pin-URL mode. Everything else (save count, board, pinner, images, product data) is populated in every mode.

### 📊 Output

| Field | Description |
|---|---|
| 🖼 `imageUrl` | Full-resolution pin image |
| 📌 `title` / `description` | Pin text, when set (many pins have no title) |
| 🔗 `pinUrl` / `id` | Pin link and Pinterest ID |
| 👤 `pinnerUsername` / `pinnerFullName` / `pinnerFollowerCount` | Who posted it |
| 🗂 `boardName` / `boardUrl` | Which board it's saved to |
| 💾 `saveCount` | Total saves (repins) |
| 💬 `commentCount` | Comment count, pin-URL mode only (see above) |
| 🛒 `isProduct` / `productDomain` | Shopping pin flag and merchant |
| 🎨 `dominantColor` / `imageWidth` / `imageHeight` | Image metadata |
| 🕒 `createdAt` | When the pin was posted |

Real sample record (from a live run):

```json
{
  "imageUrl": "https://i.pinimg.com/originals/25/b4/66/25b4663a0684f694a091eb32e1ee1f3b.jpg",
  "title": "Me & you",
  "pinUrl": "https://www.pinterest.com/pin/1037446464182355440/",
  "id": "1037446464182355440",
  "type": "pin",
  "sourceType": "search:pins",
  "description": "#coffee break #coffee lover #coffeetime #morningcoffee",
  "pinnerUsername": "roseblossom41",
  "pinnerFullName": "Rose",
  "pinnerFollowerCount": 216,
  "boardName": "Coffee Aesthetics",
  "boardUrl": "https://www.pinterest.com/roseblossom41/coffee-aesthetics/",
  "saveCount": 2,
  "isProduct": false,
  "dominantColor": "#71533d",
  "imageWidth": 1168,
  "imageHeight": 1752,
  "createdAt": "2026-08-16T23:37:48.000Z",
  "scrapedAt": "2026-08-30T00:53:29.800Z",
  "error": null
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel from the Storage tab.

### ✨ Why choose this Actor

- ✅ Direct calls to Pinterest's own API, no browser automation, so runs finish in seconds
- 🎯 Four input modes in one Actor: search, profile, board, and single-pin, no separate tools needed
- 🛒 Product/shopping-pin fields included automatically when present, no extra add-on call
- 📖 Honest about limitations: the comment-count gap above is documented, not hidden

### 🚀 How to use

1. Open [console.apify.com](https://console.apify.com) and find Pinterest Scraper in your Actors.
2. Pick one or more input modes: a search keyword, a profile username, a board URL, or a pin URL.
3. Set `maxItems` per source (or leave empty for everything available).
4. Click Start.
5. Download results as JSON, CSV, or Excel from the Storage tab once the run finishes.

### 💼 Business use cases

**Competitor research.** Search a niche keyword and see which boards and pinners dominate it.

**E-commerce.** Scrape shopping pins for a product category to track pricing and merchant presence on Pinterest.

**Content strategy.** Archive a brand's own board or profile before a rebrand, or benchmark against a competitor's.

**Trend tracking.** Run a scheduled search on a keyword weekly to watch save counts and new entrants over time.

### ❓ Frequently Asked Questions

**Does this need a Pinterest account or login?**
No. Everything scraped is public data, reachable without authentication.

**Can I scrape a private board or profile?**
No. Only publicly visible pins, boards, and profiles are accessible.

**Why don't search or board results include comment counts?**
Pinterest's grid listing API (used for search, profile, and board pulls) doesn't include that field. It's only present on the detailed single-pin payload, used in pin-URL mode. See the Input section above.

**Are video pins and Story Pins supported?**
Regular pins and video pins are fully supported. Story Pins (Pinterest's separate story-page format) use a completely different data structure and aren't parsed in this version.

**How much does it cost to run?**
Apify's free tier covers small runs. Check current Apify plan pricing at [apify.com/pricing](https://apify.com/pricing).

**Can I combine multiple search keywords and profiles in one run?**
Yes. `searchQueries`, `profiles`, `boardUrls`, and `pinUrls` all accept multiple entries and run together.

**Does this download the actual image or video files?**
No, it returns the image URLs. Downloading the files themselves is a straightforward next step in your own pipeline using those URLs.

**Can I schedule this to run automatically?**
Yes, Apify Actors support scheduling directly from the Console, so you can track a keyword or board on a recurring basis.

**What happens if a profile, board, or pin doesn't exist?**
The run logs it and pushes an error record naming that source, then continues with the rest of the input.

**Is this affiliated with Pinterest?**
No, see the disclaimer below.

### 🔌 Integrate with any app

Every Apify Actor exposes a REST API, webhooks, and native integrations with Zapier, Make, and n8n. Trigger a run, get notified when it finishes, and pull results straight into your own tools.

> **⚠️ Disclaimer:** independent tool, not affiliated with or endorsed by Pinterest. Only publicly available data is collected. Contact: contact.punkrecordsdata@gmail.com

# Actor input Schema

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

Keywords to search on Pinterest, same as typing into the Pinterest search bar.

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

What kind of results to return for the search keywords above.

## `profiles` (type: `array`):

Pinterest usernames to scrape (the part after pinterest.com/, no @ symbol). Returns the profile's pin grid plus profile metadata.

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

Full board URLs, e.g. https://www.pinterest.com/username/board-name/. Returns every pin on that board.

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

Full pin URLs, e.g. https://www.pinterest.com/pin/1234567890123456789/.

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

Stop each search/profile/board after this many pins. Leave empty to pull everything available.

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

Optional. Pinterest's public API doesn't require a proxy for normal volume, but routing through one adds resilience at high volume.

## Actor input object example

```json
{
  "searchQueries": [
    "coffee"
  ],
  "searchScope": "pins",
  "maxItems": 50,
  "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": [
        "coffee"
    ],
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("punkrecordsdata/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": ["coffee"],
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("punkrecordsdata/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": [
    "coffee"
  ],
  "maxItems": 50
}' |
apify call punkrecordsdata/pinterest-scraper --silent --output-dataset

```

## MCP server setup

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