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

Pinterest scraper API: pins from search, boards and profiles with images, links, saves, comments count and creator. No login, JSON/CSV/Excel.

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

## Pricing

Pay per event

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

Scrape **Pinterest pins from keyword search, boards, profiles and pin URLs**: title,
description, image URLs in every size, video URL, outbound link and domain, saves, repin
and comment counts, created date, pinner and board, plus board and profile records with
follower counts. No login, no Pinterest account, no API key. Export as JSON, CSV or
Excel, or pull the data through the API.

### What does Pinterest Scraper do?

Pinterest Scraper reads the public Pinterest website the way a logged-out visitor sees it
and returns clean, flat records:

- **Keyword search** — enter keywords such as "minimalist living room" or "easy dinner
  recipes" and get the pins Pinterest shows for them, page after page, in Pinterest's own
  ranking.
- **Boards** — paste a board link and get the board record (name, description, number of
  pins and followers, category, owner) and its pins in board order.
- **Profiles** — paste a profile link and get the profile record (name, bio, website,
  followers, following, pins, boards, monthly views, verified status) and the pins that
  account published. Accounts that only save other people's pins return their recent
  saves.
- **Single pins** — paste pin links and get the full pin record: saves, repins, comments,
  shares, reactions, created date, original creator, video file and more.
- **Pin data** — every pin has its image URLs in all sizes (236 px to original), the
  dominant colour, the video URL and length for video pins, the outbound link and its
  domain, the pinner and the board it is saved to.

The type of each link is detected automatically, so one run can mix search keywords,
boards, profiles and pins. Country domains (pinterest.de, pinterest.co.uk, …) and pin.it
short links are understood too.

### Use cases

- **Content marketers and social media managers** — find the pins and formats that win
  in your niche (video vs image, titles, descriptions, hashtags) and plan your own boards
  around them.
- **E-commerce and brand teams** — see which domains and product pages get pinned for
  your category keywords, and track how often a competitor's pins are saved.
- **SEO and traffic analysts** — collect the outbound links and domains behind top pins
  for a keyword to find the sites Pinterest sends traffic to.
- **Influencer and partnership scouts** — compare profiles by followers, monthly views,
  number of pins and boards, website and verification before reaching out.
- **Designers and trend researchers** — build mood boards and colour studies from image
  URLs and dominant colours of hundreds of pins per theme.
- **Data and AI teams** — gather images with titles, descriptions and alt texts as a
  labelled dataset for image classification or recommendation experiments.

### How much does it cost?

You pay only for the results you get (pay-per-event). Duplicates and items over your
`maxItems` limit are never charged.

| Event | What you pay for | Free plan | Paid plans (from) |
| --- | --- | --- | --- |
| `pin` | One pin in the dataset | $1.50 per 1,000 | $1.00 per 1,000 |
| `board` | One board record (board URLs only) | $2.00 per 1,000 | $1.50 per 1,000 |
| `profile` | One profile record (profile URLs only) | $2.00 per 1,000 | $1.50 per 1,000 |

"Paid plans (from)" is the Gold-and-above price; Bronze and Silver plans sit in between.
Apify also charges a tiny actor-start fee ($0.00005 per run). Board and profile records
can be switched off with **Include board and profile records**.

Worked examples (Free plan prices):

1. **Keyword research** — 4 keywords × 250 pins = 1,000 pins: 1,000 × $1.50 / 1,000 =
   **$1.50**.
2. **Competitor monitoring** — 20 brand profiles with 100 pins each: 2,000 pins × $1.50 /
   1,000 + 20 profile records × $2.00 / 1,000 = $3.00 + $0.04 = **$3.04**.

The Apify Free plan includes $5 monthly credit, enough for about 3,300 pins every month.

### How to use Pinterest Scraper

In Apify Console:

1. Open Pinterest Scraper and click **Try for free**.
2. Enter **Search queries** and/or paste **Pinterest URLs** (pins, boards, profiles or
   search pages). The form is prefilled with one keyword and one board.
3. Set **Max pins per source** (per keyword, board or profile) and **Max items** (for the
   whole run).
4. Optionally switch on **Include full pin details** for comment counts and created dates
   of board and profile pins.
5. Click **Start**. 50 pins take about 6 seconds, 600 pins about 30 seconds.
6. Open the **Output** tab and export the dataset as JSON, CSV, Excel or HTML.

Through the API:

1. Get your API token in Apify Console → Settings → Integrations.
2. Call the actor with your input JSON (see [Integrations and API](#integrations-and-api)).
3. Read the dataset items from the run.

### Input

Fill in at least one of `searchQueries` or `startUrls`.

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `searchQueries` | array | – | Keywords to search on Pinterest, e.g. `minimalist living room`. |
| `startUrls` | array | – | Pin (`pinterest.com/pin/703756183311018/`), board (`pinterest.com/bhg/adorable-pets/`), profile (`pinterest.com/bhg/`) or search (`pinterest.com/search/pins/?q=garden`) URLs, mixed. pin.it short links and country domains work. |
| `maxPinsPerSource` | integer | `100` | Pins per keyword, board or profile. A pin URL always returns its one pin. |
| `includePinDetails` | boolean | `false` | Open each board/profile pin's own record to add comment count, share count, created date and creator. One extra request per pin. |
| `includeBoardAndProfileDetails` | boolean | `true` | Also output one `board` record per board URL and one `profile` record per profile URL. |
| `maxItems` | integer | `1000` | Hard cap on all output items (pins, boards and profiles) in the run. |
| `proxyConfiguration` | object | Apify Proxy | Proxy settings. The default works for Pinterest. |
| `debug` | boolean | `false` | Log every page fetched. |

Example — two keywords, 300 pins each:

```json
{
    "searchQueries": ["minimalist living room", "japandi bedroom"],
    "maxPinsPerSource": 300,
    "maxItems": 600
}
```

Example — a competitor's profile and one of their boards, with full pin details:

```json
{
    "startUrls": [
        "https://www.pinterest.com/bhg/",
        "https://www.pinterest.com/bhg/adorable-pets/"
    ],
    "maxPinsPerSource": 100,
    "includePinDetails": true
}
```

### Output

Every item has `type` (`pin`, `board` or `profile`), `sourceType` (`search`, `board`,
`profile` or `pin`) and `source` (the keyword or URL it came from). Examples from a real
run on 2026-11-03 (long text shortened).

#### Pin (from a pin URL, full details)

```json
{
    "type": "pin",
    "id": "4644405859806257",
    "url": "https://www.pinterest.com/pin/4644405859806257/",
    "title": "LivingRoom Ideas",
    "description": null,
    "altText": null,
    "link": null,
    "domain": null,
    "imageUrl": "https://i.pinimg.com/originals/ad/14/ea/ad14ea6a53b406bb19ceff6e0af3b03f.jpg",
    "imageWidth": 736,
    "imageHeight": 1308,
    "images": {
        "236x": "https://i.pinimg.com/236x/ad/14/ea/ad14ea6a53b406bb19ceff6e0af3b03f.jpg",
        "474x": "https://i.pinimg.com/474x/ad/14/ea/ad14ea6a53b406bb19ceff6e0af3b03f.jpg",
        "736x": "https://i.pinimg.com/736x/ad/14/ea/ad14ea6a53b406bb19ceff6e0af3b03f.jpg",
        "orig": "https://i.pinimg.com/originals/ad/14/ea/ad14ea6a53b406bb19ceff6e0af3b03f.jpg"
    },
    "dominantColor": "#91715f",
    "isVideo": true,
    "videoUrl": "https://v1.pinimg.com/videos/mc/720p/af/8d/74/af8d749b5ea701f0700496cbab491cc2.mp4",
    "videoDurationSec": 17.2,
    "saves": 2074,
    "repinCount": 193,
    "commentCount": 0,
    "shareCount": 24,
    "reactionCount": 244,
    "createdAt": "2024-11-03T18:34:58Z",
    "isPromoted": false,
    "pinner": {
        "id": "4644543274159136",
        "username": "alyssaburtt",
        "fullName": "Alyssa",
        "followerCount": 163,
        "profileUrl": "https://www.pinterest.com/alyssaburtt/",
        "imageUrl": "https://i.pinimg.com/75x75_RS/49/42/47/4942477f8eb48ecc8ed1c428ab1089b2.jpg"
    },
    "creator": null,
    "board": {
        "id": "4644474555124904",
        "name": "LOVE VISIONS ❤️‍🔥",
        "url": "https://www.pinterest.com/alyssaburtt/love-visions/",
        "pinCount": null
    },
    "sourceType": "pin",
    "source": "https://www.pinterest.com/pin/living-room-interior-design-ideas-with-plants-and-cozy-furniture-video--4644405859806257/"
}
```

#### Pin (from keyword search)

```json
{
    "type": "pin",
    "id": "e1_AfqPShz8nLunssS_PSUSLUe6Ear1LZzDNN7U2FFyWCg2Pwn9VZn9",
    "url": "https://www.pinterest.com/pin/e1_AfqPShz8nLunssS_PSUSLUe6Ear1LZzDNN7U2FFyWCg2Pwn9VZn9/",
    "title": "simple calm living room decor",
    "description": "welcoming living room that feels contemporary without losing its warmth. #ModernOrganic #LivingRoomIdeas ...",
    "link": null,
    "imageUrl": "https://i.pinimg.com/originals/a0/50/50/a05050eef158ca30a2dd0a889e59b1c6.jpg",
    "imageWidth": 1536,
    "imageHeight": 2752,
    "isVideo": false,
    "saves": null,
    "repinCount": null,
    "reactionCount": 0,
    "createdAt": "2026-10-25T15:30:13Z",
    "pinner": { "id": "917397524002939163", "username": "HSandKD", "fullName": "Home Shine & Kitchen Dine", "followerCount": 18, "profileUrl": "https://www.pinterest.com/HSandKD/", "imageUrl": "https://i.pinimg.com/140x140_RS/80/9d/98/809d98a96d467f009d74ee62abf8996f.jpg" },
    "board": { "id": "917397455285102033", "name": "Boho Living Room Ideas", "url": "https://www.pinterest.com/HSandKD/boho-living-room-ideas/", "pinCount": 16 },
    "sourceType": "search",
    "source": "minimalist living room"
}
```

(Same fields as above; shortened here.)

#### Board

```json
{
    "type": "board",
    "id": "56787713990443348",
    "name": "Adorable Pets",
    "url": "https://www.pinterest.com/bhg/adorable-pets/",
    "description": "We love our pets, and your pets too. We've got care tips, DIY pet toys, and fun ideas for your furry friends...",
    "pinCount": 431,
    "followerCount": 3394565,
    "sectionCount": 0,
    "collaboratorCount": 0,
    "isCollaborative": false,
    "category": "animals",
    "coverImageUrl": "https://i.pinimg.com/custom_covers/200x150/56787713990443348_1539965723.jpg",
    "createdAt": null,
    "owner": { "id": "56787782709805180", "username": "bhg", "fullName": "Better Homes and Gardens", "followerCount": null, "profileUrl": "https://www.pinterest.com/bhg/", "imageUrl": "https://i.pinimg.com/75x75_RS/dc/db/ab/dcdbabbba3cbf862112575b69ae233e7.jpg" },
    "sourceType": "board",
    "source": "https://www.pinterest.com/bhg/adorable-pets/"
}
```

#### Profile

```json
{
    "type": "profile",
    "id": "56787782709805180",
    "username": "bhg",
    "url": "https://www.pinterest.com/bhg/",
    "fullName": "Better Homes and Gardens",
    "about": "Inspiring ideas for home, gardening, food, holidays, and living well. BHG—100 years of powering your passions at home",
    "websiteUrl": "http://bhg.com",
    "domainUrl": "bhg.com",
    "domainVerified": true,
    "followerCount": 4049929,
    "followingCount": 1279,
    "pinCount": 165357,
    "boardCount": 137,
    "monthlyViews": 10000001,
    "imageUrl": "https://i.pinimg.com/280x280_RS/dc/db/ab/dcdbabbba3cbf862112575b69ae233e7.jpg",
    "isVerified": true,
    "isPartner": true,
    "createdAt": "2011-07-07T07:11:38Z",
    "sourceType": "profile",
    "source": "https://www.pinterest.com/bhg/"
}
```

Field notes:

- `saves` is Pinterest's save count for the pin's image across Pinterest; `repinCount` is
  the saves of this particular pin.
- `pinner` is the account that saved the pin to `board`; `creator` is the account that
  originally published it, when Pinterest names one.
- `videoUrl` is an MP4 file when Pinterest offers one, otherwise an HLS stream (`.m3u8`).
  `videoDurationSec` is in seconds.
- `createdAt` is UTC (ISO 8601). Fields Pinterest does not show for a pin are `null`
  (see [Limits](#limits) for which source has which counters).
- `monthlyViews` is `null` when the account hides it.

### Integrations and API

Run the actor and get the items back in one call:

```bash
curl -X POST "https://api.apify.com/v2/acts/innolabs~pinterest-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchQueries": ["japandi bedroom"], "maxPinsPerSource": 100}'
```

Python with [apify-client](https://docs.apify.com/api/client/python):

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("innolabs/pinterest-scraper").call(
    run_input={
        "startUrls": ["https://www.pinterest.com/bhg/adorable-pets/"],
        "maxPinsPerSource": 200,
    }
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    if item["type"] == "pin":
        print(item["saves"], item["title"], item["link"])
```

- **Make, Zapier, n8n** — use the Apify app/node to start the actor and send pins to
  Google Sheets, Airtable, Notion or Slack.
- **Scheduling** — create a schedule in Apify Console (e.g. every Monday) to track a
  keyword or a competitor's profile over time.
- **Webhooks** — trigger your pipeline when a run finishes.
- **AI agents (MCP)** — connect Claude, Cursor or other MCP clients through the Apify MCP
  server at https://mcp.apify.com and let your agent research Pinterest on demand.

### FAQ

#### Is it legal to scrape Pinterest?

The scraper only collects data Pinterest shows publicly to any visitor without logging
in: pins, boards and public profiles. It does not log in or access private boards.
Profiles and pins contain names of people, which may be personal data under laws such as
GDPR, so make sure you have a legitimate reason to store them and that your use complies
with Pinterest's terms.

#### Do I need a Pinterest account or proxies?

No. The scraper needs no login or cookies, and the default Apify Proxy setting works.
Throttled requests are retried automatically.

#### Why do search results have no save counts?

Pinterest's logged-out search shows pins without their counters and with an encrypted pin
id (it starts with `e1_`). Title, description, images, video, link, created date,
reactions, pinner and board are included; for saves, repins and comments use board,
profile or pin URLs.

#### How many pins can I get?

Search keeps paging as long as Pinterest shows more results (tested with 200 pins per
keyword). Boards are read to the end (a 431-pin board returned 426 pins). Profiles return
the pins the account published, page by page.
`maxPinsPerSource` and `maxItems` keep the cost under your control.

#### What if a link fails?

Each keyword, board, profile and pin is processed on its own. If a link is wrong, a
profile does not exist or a pin was deleted, the run continues with the rest and the
problem is listed in the run log and the run's `SUMMARY` record. You are not charged for
failed links. If every link fails, the run is marked as failed with the reason.

#### Can I download the images and videos?

The dataset contains direct image URLs for every size and the video file URL, which you
can download with any tool or pass to an image pipeline.

### Limits

- Search results: no saves, repin or comment counts, and the pin id is Pinterest's
  encrypted id (`e1_…`) instead of the numeric one; full pin details are not available for
  these pins.
- Board pins: saves and repins are included, comment count and created date only with
  **Include full pin details**. The newest 50 pins of a board carry numeric ids; older
  board pins carry encrypted ids and cannot be expanded with full details.
- Profiles return the pins the account published ("Created"); accounts without own pins
  return their 50 most recently saved pins. A profile's boards are not listed; add board
  URLs to scrape them.
- Board section URLs scrape the whole board.
- Related pins ("More to explore") and comment texts need a Pinterest login and are not
  collected.
- Private boards and profiles are not accessible.

# Changelog

This Actor's version history is a separate document: https://apify.com/innolabs/pinterest-scraper/changelog.md

# Actor input Schema

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

Keywords searched on Pinterest, e.g. 'minimalist living room' or 'easy dinner recipes'. Each query returns pins in Pinterest's own search order, page after page.

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

Pin, board, profile or search URLs, mixed freely; the type is detected from the URL. Examples: https://www.pinterest.com/pin/703756183311018/ (pin), https://www.pinterest.com/bhg/adorable-pets/ (board), https://www.pinterest.com/bhg/ (profile), https://www.pinterest.com/search/pins/?q=garden (search). Country domains (pinterest.de, pinterest.co.uk, ...) and pin.it short links work too.

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

How many pins to collect per search query, board or profile. A pin URL always returns its one pin.

## `includePinDetails` (type: `boolean`):

Open every pin's own page data to add comment count, share count, created date, creator and full description where the list view lacks them. One extra request per pin, so runs are slower. Pins from keyword search carry Pinterest's encrypted ids and cannot be opened this way; they keep their search fields. Pin URLs always include full details.

## `includeBoardAndProfileDetails` (type: `boolean`):

For board and profile URLs, also output one board record (name, description, pin and follower counts, owner) or one profile record (name, bio, website, followers, following, pins, boards, monthly views).

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

Hard cap on dataset items (pins, boards and profiles together). The run stops cleanly when reached.

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

Apify Proxy settings. The default datacenter proxy works for Pinterest.

## `debug` (type: `boolean`):

Log every page fetched.

## Actor input object example

```json
{
  "searchQueries": [
    "minimalist living room"
  ],
  "startUrls": [
    "https://www.pinterest.com/bhg/adorable-pets/"
  ],
  "maxPinsPerSource": 25,
  "includePinDetails": false,
  "includeBoardAndProfileDetails": true,
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "debug": false
}
```

# Actor output Schema

## `dataset` (type: `string`):

All items produced by the run, one JSON object per record.

# 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 living room"
    ],
    "startUrls": [
        "https://www.pinterest.com/bhg/adorable-pets/"
    ],
    "maxPinsPerSource": 25,
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("innolabs/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 living room"],
    "startUrls": ["https://www.pinterest.com/bhg/adorable-pets/"],
    "maxPinsPerSource": 25,
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("innolabs/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": [
    "minimalist living room"
  ],
  "startUrls": [
    "https://www.pinterest.com/bhg/adorable-pets/"
  ],
  "maxPinsPerSource": 25,
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call innolabs/pinterest-scraper --silent --output-dataset

```

## MCP server setup

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