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

Scrape Pinterest pins by keyword, profile, board or pin URL: title, description, original image and video URLs, outbound link, date, saves, reactions, board and pinner info, profile followers. No login, no API keys.

- **URL**: https://apify.com/datadesk-io/pinterest-scraper.md
- **Developed by:** [DataDesk](https://apify.com/datadesk-io) (community)
- **Categories:** Social media, E-commerce
- **Security:** Limited permissions
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 pins

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, Search, Boards & Profiles

Get **Pinterest pins** as clean JSON/CSV/Excel from **keyword search, profiles, boards or single pin URLs**: title, description, alt text, **original-size image URL**, **video URL**, **outbound link and domain**, creation date, **saves**, reactions, board and pinner info, plus profile stats (followers, pins, boards, monthly views). **No login, no cookies, no API keys, no paid proxy.**

🇪🇸 **Español:** extrae pines de Pinterest por palabra clave, perfil, tablero o URL de pin: título, descripción, imagen en tamaño original, video, enlace de destino, fecha, guardados, reacciones, tablero y datos del perfil (seguidores, pines, vistas mensuales). Sin cuenta, sin cookies ni API keys.
🇧🇷 **Português:** extrai pins do Pinterest por palavra-chave, perfil, pasta ou URL de pin: título, descrição, imagem em tamanho original, vídeo, link de destino, data, salvamentos, reações, pasta e dados do perfil (seguidores, pins, visualizações mensais). Sem login, sem cookies nem API keys.

### What you get

- 🔎 **Keyword search**: the same results as the pinterest.com search box, paged up to your cap (a single keyword returned 955 pins in our tests).
- 👤 **Profiles**: pins a user created or saved, with numeric pin ids, outbound links and save counts, plus the profile's followers, pin/board counts, monthly views, website and bio on every row.
- 📋 **Boards**: all pins of a public board, with the board's pin and follower counts.
- 📌 **Single pins**: `pinterest.com/pin/<id>/` URLs.
- 🖼️ **Media**: original-size image URL with width/height, dominant color, video URL (MP4 720p when available, else HLS) and duration, Idea Pin flag.
- 💸 **$1.50 per 1,000 pins**, plus $0.005 per run. Runs with no results cost nothing.

### Sources and coverage

| Source | Coverage | Data |
|---|---|---|
| **Pinterest search** | Any keyword | pin title, description, image, link, saves, board, pinner |
| **Boards** | Any public board URL | same fields |
| **Profiles** | Any public profile URL | same fields |

### How to use it

1. Click **Try for free** (or **Start**): the prefilled input runs a quick test.
2. Fill in the input fields (see the examples below). Every field is optional.
3. Click **Start** and wait a few seconds to minutes, depending on how many pins you ask for.
4. Open the **Output** tab and export as **JSON, CSV, Excel, XML or HTML**, or read the results via API.

### Input examples

**Search + profile (default):**

```json
{"searchQueries": ["home decor"], "urls": ["https://www.pinterest.com/pinterest/"], "maxPinsPerSource": 20}
```

**Several keywords:**

```json
{"searchQueries": ["wedding cake", "boho bedroom"], "maxPinsPerSource": 100}
```

**One board:**

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

#### Input fields

| Field | Type | Description |
|---|---|---|
| `searchQueries` | array | Pinterest search terms (the same as the search box on pinterest.com). Each keyword returns up to 'Max pins per source'. If you leave both this and URLs empty, the Acto… |
| `urls` | array | Pinterest profile URLs or usernames (pinterest.com/pinterest/ or pinterest), board URLs (pinterest.com/pinterest/official-news/) or single pin URLs (pinterest.com/pin/… |
| `maxPinsPerSource` | integer | Cap per keyword, profile or board. Pinterest returns about 25 pins per page; the Actor pages until this cap or the end of the feed. |
| `maxResults` | integer | Hard cap on pins for the whole run (all sources). Never exceeded. |

### Output example

One row per item. Values below are **example values** from a real test run (long text shortened):

```json
{
  "pinId": "e1_AfqPShzPBrN_G1_w4wn02-DRp-0dMZRPud1-cjMg7GdMQvDQCN_koA",
  "pinUrl": "https://www.pinterest.com/pin/e1_AfqPShzPBrN_G1_w4wn02-DRp-0dMZRPud1-cjMg7GdMQvDQCN_koA/",
  "pinIdType": "obfuscated",
  "title": "Renter Friendly Light Covers",
  "description": "The apartment lighting idea you didn't know you needed. Watch this ceiling lamp shade go up in seconds — no electrician, no tools, just a qu…",
  "altText": "a woman is standing in the middle of a room holding a light fixture above her head",
  "imageUrl": "https://i.pinimg.com/originals/6c/03/3a/6c033a2ba694315157e990a04e1b821b.jpg",
  "imageWidth": 1080,
  "imageHeight": 1920,
  "dominantColor": "#918883",
  "isVideo": true,
  "videoUrl": "https://v1.pinimg.com/videos/iht/hls/82/38/25/8238250cfbcd4669607edb304f58e69c.m3u8",
  "videoDurationSec": 8.3,
  "isIdeaPin": false,
  "link": "https://tulipshades.com/products/the-tulip-shade-the-gem?variant=45063847805229",
  "domain": "tulipshades.com",
  "createdAt": "2026-03-04T15:11:41Z",
  "reactionCount": 622
  "…": "more fields below"
}
```

Fields a source does not publish are `null`.

#### Output fields

| Field | Description |
|---|---|
| `pinId` | Pinterest pin id. Search results from logged-out Pinterest carry an obfuscated id (e1\_...); profile, board and pin results carry the numeric id |
| `pinUrl` | Link to the pin |
| `pinIdType` | numeric or obfuscated (see pinId) |
| `title` | Pin title (empty for many user uploads) |
| `description` | Pin description |
| `altText` | Alt text (from the creator or Pinterest's automatic description) |
| `imageUrl` | Largest image URL (original size when available) |
| `imageWidth` | Image width in px |
| `imageHeight` | Image height in px |
| `dominantColor` | Dominant image color (hex) |
| `isVideo` | True if the pin has a video |
| `videoUrl` | Video URL (MP4 720p when available, else HLS .m3u8) |
| `videoDurationSec` | Video length in seconds |
| `isIdeaPin` | True for Idea/Story pins |
| `link` | Outbound link (the website the pin points to), when the pin has one |
| `domain` | Domain of the outbound link |
| `createdAt` | Pin creation date (ISO 8601, UTC) |
| `reactionCount` | Total reactions shown by Pinterest |
| `saves` | Save count, when Pinterest exposes it (usually on profile/board/pin results) |
| `commentCount` | Comment count, when exposed |
| `repinCount` | Repin count, when exposed |
| `isPromoted` | True for promoted (ad) pins |
| `boardName` | Board the pin is saved to |
| `boardUrl` | Board URL |
| `boardId` | Board id |
| `pinnerUsername` | Username of the account that saved the pin |
| `pinnerName` | Display name of that account |
| `pinnerFollowers` | Follower count of that account, when exposed |
| `pinnerUrl` | Profile URL of that account |
| `sourceType` | search, profile, board or pin |
| `source` | The keyword or URL that produced the row |
| `scrapedAt` | When the row was collected (UTC) |

The Output tab has a **Pins** view.

### Pricing

Pay-per-event: you pay only for results delivered, no monthly fee.

- **Pin** (`pin`): **$1.50 per 1,000** ($0.0015 each)
- **Actor start:** $0.005 per run

| Run | Pins | Cost |
|---|---|---|
| Quick test | 20 | $0.035 |
| Small run | 100 | $0.155 |
| Regular run | 1,000 | $1.505 |
| Large run | 10,000 | $15.005 |

Rows that are not delivered are never charged. Apify's free plan includes monthly credit, and you can set a maximum cost per run in the run options.

### Use cases

Trend and keyword research for e-commerce and content · competitor and brand monitoring (which products and domains get saved) · influencer and creator discovery (followers, monthly views) · image datasets and mood boards · feeding AI agents and dashboards with visual trends.

### Integrations and API

- Export results as JSON, CSV, Excel, XML or HTML from the Output tab.
- **Schedule** runs (daily, hourly) and send results to Google Sheets, Slack, Zapier, Make, n8n, Airbyte or webhooks.
- Call it from code with the [Apify API](https://docs.apify.com/api/v2):

```bash
curl -X POST "https://api.apify.com/v2/acts/datadesk-io~pinterest-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchQueries": ["home decor"], "urls": ["https://www.pinterest.com/pinterest/"], "maxPinsPerSource": 20}'
```

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("datadesk-io/pinterest-scraper").call(run_input={'searchQueries': ['home decor'], 'urls': ['https://www.pinterest.com/pinterest/'], 'maxPinsPerSource': 20})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item.get('title'), item.get('domain'))
```

### FAQ

**Do I need a Pinterest account or API access?** No.
**Why are some ids `e1_...`?** Pinterest hides numeric ids from logged-out search; profile and pin sources return numeric ids.
**Issues?** Report them on the Issues tab. We usually reply within 48 h.

**How fresh is the data?** Live: every run reads the source at that moment. Schedule it to keep a dataset up to date.

**Why did I get fewer pins than the maximum?** The source had fewer matching pins, or duplicates were removed. You only pay for pins delivered.

**Is it legal?** It collects only publicly available data. You are responsible for using it in line with applicable laws (e.g. GDPR) and the source's terms.

### Limitations

- **Logged-out data only.** The Actor reads the same JSON the public pinterest.com website loads for visitors who are not signed in. Private boards, secret pins, a profile's followers list and comments text are not returned.
- **Search results carry an obfuscated pin id** (`e1_...`, `pinIdType: "obfuscated"`): Pinterest hides numeric ids from logged-out search. Use it as a unique key. **Save counts are not shown in search results**; profile and pin sources return numeric ids and `saves`. Board sources return saves but obfuscated ids.
- **Not every pin has a title, description or outbound link**: many are plain user uploads. In our final 1,600-pin test run 70% had a title, 63% a description and 53% an outbound link; 100% had an image and a date.
- **Board paging can be uneven.** Pinterest sometimes answers a later board page empty or without a next-page token for logged-out visitors. The Actor then retries that page in a fresh session and once through the Apify datacenter proxy included in your plan. In our final tests (Oct 27, 2026) boards paged to the end (100 of 100 requested; 50 of a 51-pin board), but earlier builds without those retries sometimes stopped after 24-25 pins. The log says "end of feed" when Pinterest stops serving pages.
- **Search depth is set by Pinterest**: a search feed ends on its own (955 pins for "minimalist kitchen" in our test). Counts are Pinterest's own numbers.
- **No paid proxy.** In our tests (Oct 27, 2026) on Apify, a run with 6 keywords and 2 profiles returned 1,600 pins in 24 s with no blocks. If Pinterest answers 403/429/5xx, the Actor retries with backoff and then uses the Apify datacenter proxy included in your plan (capped at 40 requests per run); pins already collected are kept.
- Pins are public, but images and text belong to their creators and can contain personal data. Check Pinterest's terms and the laws that apply to your use (copyright, GDPR/privacy) before you store or republish them.

### Support

Found a bug, or need a new field, source or filter? Open an issue in the **Issues** tab; we usually answer within 24 hours. Custom data work: datadesk.io@proton.me.

### Use with AI agents (MCP)

This Actor works as a tool for AI agents through the [Apify MCP server](https://mcp.apify.com). Add it to Claude, ChatGPT, Cursor, VS Code or any MCP client:

`https://mcp.apify.com/?tools=datadesk-io/pinterest-scraper`

Sign in with OAuth or `Authorization: Bearer <APIFY_TOKEN>`. Local stdio config:

```json
{"mcpServers": {"pinterest": {"command": "npx", "args": ["-y", "@apify/actors-mcp-server", "--tools", "datadesk-io/pinterest-scraper"], "env": {"APIFY_TOKEN": "<token>"}}}}
```

**What goes in → what comes out:** Input: keywords and/or profile, board or pin URLs, plus caps. Output: one JSON row per pin with title, description, image/video URLs, outbound link, date, saves, reactions, board and pinner info. Every input is optional and every output field is documented.

**Example prompt:** "Search Pinterest for 'boho bedroom' and 'japandi living room', 100 pins each, and list the 10 outbound domains that appear most." Use `maxPinsPerSource` or `maxResults` to cap the cost of one call.

# Actor input Schema

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

Pinterest search terms (the same as the search box on pinterest.com). Each keyword returns up to 'Max pins per source'. If you leave both this and URLs empty, the Actor searches 'home decor'.

## `urls` (type: `array`):

Pinterest profile URLs or usernames (pinterest.com/pinterest/ or pinterest), board URLs (pinterest.com/pinterest/official-news/) or single pin URLs (pinterest.com/pin/1196337394616327/). Country domains (de.pinterest.com, pinterest.co.uk) work. Profiles return the pins the user created or saved.

## `maxPinsPerSource` (type: `integer`):

Cap per keyword, profile or board. Pinterest returns about 25 pins per page; the Actor pages until this cap or the end of the feed.

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

Hard cap on pins for the whole run (all sources). Never exceeded.

## Actor input object example

```json
{
  "searchQueries": [
    "home decor"
  ],
  "urls": [
    "https://www.pinterest.com/pinterest/"
  ],
  "maxPinsPerSource": 50
}
```

# Actor output Schema

## `overview` (type: `string`):

One row per pin (see dataset schema for field descriptions).

# 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"
    ],
    "urls": [
        "https://www.pinterest.com/pinterest/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("datadesk-io/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"],
    "urls": ["https://www.pinterest.com/pinterest/"],
}

# Run the Actor and wait for it to finish
run = client.actor("datadesk-io/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"
  ],
  "urls": [
    "https://www.pinterest.com/pinterest/"
  ]
}' |
apify call datadesk-io/pinterest-scraper --silent --output-dataset

```

## MCP server setup

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