# Pinterest Pins, Boards & Profiles Scraper (`confidential_gnat/pinterest-pins-scraper`) Actor

Scrape Pinterest (pinterest.com) pins, videos, boards and profiles from searches, profile, board and pin URLs. Titles, images, outbound links, saves, reactions, creators and boards. Filters and a cache for new pins only. Export JSON, CSV or Excel.

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

## Pricing

from $0.30 / 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 Pins, Boards & Profiles Scraper

![Pinterest Pins, Boards & Profiles Scraper: scrape pins, skip duplicates, cache built in so each run returns only new pins](https://i.postimg.cc/HL2yvGn0/Gemini-Generated-Image-ficxmoficxmoficx.jpg)

**Scrape Pinterest (pinterest.com) pins, video pins, boards and profiles** from searches, profile pages, board pages and single pin URLs. Each pin comes out with its title, description, image, outbound link, saves and reactions, creator and board, ready to export as **JSON, CSV or Excel** or to call as an **API**. Paste a Pinterest URL or type a keyword and press Start.

**Target website:** [pinterest.com](https://www.pinterest.com)

### ✨ Features of this Pinterest pins scraper

- **Pins, videos, boards and profiles** — search by keyword or paste search, profile, board or pin URLs, in one run.
- **Pagination support** — keeps paging until your item limit is reached. When a Pinterest search ends after about 1,000 pins, the scraper continues with Pinterest's own related searches and removes duplicates.
- **Filtering** — minimum reactions, only pins with an outbound link, exclude promoted pins, and filter by link domain (for example `etsy,amazon`).
- **Cache for new pins only** — rescan the same searches on a schedule and get only new or changed pins.
- **Proxy support** — Apify datacenter proxy by default, residential if you need it.
- **No browser required** — fast runs that cost significantly less than browser-based scrapers.

### 🚀 How to scrape Pinterest pins in 5 steps

1. [Sign up](https://apify.com/sign-up) for a free Apify account — includes **$5 monthly credit**.
2. Open the actor page and click **Try for free**.
3. Fill in the **Input** fields (a Pinterest URL or search keywords are required).
4. Click **Start** and wait for the run to complete.
5. Download results from the **Output** tab in JSON, CSV, or Excel format.

You can also run this actor via the [Apify API](https://docs.apify.com/api/v2) or integrate it directly into your workflows using [Zapier](https://zapier.com/apps/apify), [Make](https://www.make.com/), or [n8n](https://n8n.io/).

### 💰 Pricing for the Pinterest scraper

This actor uses **pay-per-result** billing based on the compute units a run consumes.

- New Apify accounts include **$5 of free monthly credit**.
- It uses plain HTTP requests instead of a browser, so it costs significantly less to run than browser-based scrapers.
- Records skipped by the cache are not charged.

### 🔧 Pinterest scraper input configuration

The input form starts with the Pinterest URLs and search keywords, then the search type, the item limit and the optional filters. The proxy settings are last.

![Input form of the Pinterest Pins, Boards & Profiles Scraper in the Apify Console with fields 1 to 8: Pinterest URLs, search keywords, search for, max items, scrape pin details, exclude promoted pins, link domain contains and cache project name](https://i.postimg.cc/q7L3Dfq6/Gemini-Generated-Image-cxp4whcxp4whcxp4.jpg)

1. **Pinterest URLs** - search, profile, board or pin links to scrape (here a "living room ideas" search)
2. **Search keywords** - one search per keyword (here `kitchen decor`)
3. **Search for** - pins, videos, boards or users (here Pins)
4. **Max items per URL or keyword** - the limit for each URL or keyword (here 5)
5. **Scrape pin details** - open each pin for the extra fields (here on)
6. **Exclude promoted pins** - skip ads (here on)
7. **Link domain contains** - keep only pins linking to these domains (here `etsy.com`)
8. **Cache project name** - reuse on each scheduled run to get only new or changed pins (here `pinterest-decor`)

| Field | Type | Required | Default | Description |
| ----- | ---- | -------- | ------- | ----------- |
| Pinterest URLs (`startUrls`) | array | — | search for "living room ideas" | Search, profile, board or pin URLs. |
| Search keywords (`queries`) | array | — | — | One search per keyword. |
| Search for (`searchType`) | string | — | `pins` | `pins`, `videos`, `boards` or `users` (profiles) for keyword searches. |
| Max items per URL or keyword (`maxItems`) | integer | — | 5 | Limit for each start URL or keyword. |
| Scrape pin details (`scrapeDetails`) | boolean | — | false | Fill comment, share, category, hashtag and price fields for pins of profile, board and pin URLs. |
| Minimum reactions (`minReactions`) | integer | — | 0 | Keep pins with at least this many reactions. |
| Only pins with an outbound link (`onlyPinsWithLink`) | boolean | — | false | Skip pins without a link. |
| Exclude promoted pins (`excludePromotedPins`) | boolean | — | false | Skip ads. |
| Link domain contains (`linkDomainContains`) | string | — | — | Comma separated words, for example `etsy,amazon`. |
| Cache project name (`cacheProjectName`) | string | — | — | Same name on each run returns only new or changed pins. |
| Proxy configuration (`proxyConfiguration`) | object | — | Apify datacenter proxy | Proxy settings. |

**Supported URL types:**

- Search: `https://www.pinterest.com/search/pins/?q=living+room` (also `/search/videos/`, `/search/boards/`, `/search/users/`)
- Profile: `https://www.pinterest.com/username/`
- Board: `https://www.pinterest.com/username/board-name/`
- Pin: `https://www.pinterest.com/pin/1234567890/`

### 📦 Pinterest scraper output data

Records are saved as flat JSON with `null` for missing values. Pin records have the fields `type`, `id`, `url`, `title`, `description`, `altText`, `createdAt`, `category`, `hashtags`, `imageUrl`, `imageWidth`, `imageHeight`, `thumbnailUrl`, `dominantColor`, `isVideo`, `videoUrl`, `videoDuration`, `link`, `domain`, `isPromoted`, `reactions`, `saves`, `comments`, `shares`, `priceValue`, `priceCurrency`, `pinnerUsername`, `pinnerName`, `pinnerFollowers`, `pinnerVerified`, `boardId`, `boardName`, `boardUrl`, `source`, `changeType` and `scrapedAt`. Board and profile records carry names, counts, owner and website fields. A profile URL gives one profile record first (not counted towards Max items), then its pins.

The dataset has 3 views: **Pins** (title, image, creator, board, saves, reactions and link), **Boards** (name, owner, pin and follower counts) and **Profiles** (username, followers, pins, boards and website).

**Output at a glance:**

| Pin | Creator | Board | Reactions | Domain |
| --- | ------- | ----- | --------- | ------ |
| [Danish modern coffee table](https://www.pinterest.com/pin/3809531055470014080/) | HuliRecipes | All Home Decors Ideas | 366 | etsy.com |
| [Cozy Modern Farmhouse Living Room](https://www.pinterest.com/search/pins/?q=living%20room%20ideas) | amirshahshah799 | Home Decoration & Lifestyle Finds | 0 | — |
| [Black Accent Wall living room](https://www.pinterest.com/search/pins/?q=living%20room%20ideas) | preview_scdecorum_com | Inspo | 0 | scdecorum.com |

**Sample output (raw JSON):**

```json
{
  "type": "pin",
  "id": "3809531055470014080",
  "url": "https://www.pinterest.com/pin/3809531055470014080/",
  "title": null,
  "description": "Discover the perfect blend of style and functionality with our step-by-step guide to creating a stunning Danish modern coffee table from mango wood!",
  "altText": "a living room filled with furniture and a flat screen tv mounted on a wall next to a kitchen",
  "createdAt": "2026-08-29T00:54:32.000Z",
  "category": null,
  "hashtags": null,
  "imageUrl": "https://i.pinimg.com/originals/79/ce/2b/79ce2bd61c95841d00e02c3de67f4998.jpg",
  "imageWidth": 1024,
  "imageHeight": 1536,
  "thumbnailUrl": "https://i.pinimg.com/236x/79/ce/2b/79ce2bd61c95841d00e02c3de67f4998.jpg",
  "dominantColor": "#7f6652",
  "isVideo": false,
  "videoUrl": null,
  "videoDuration": null,
  "link": "https://www.etsy.com/listing/4549735042/danish-modern-coffee-table-mango-wood",
  "domain": "etsy.com",
  "isPromoted": false,
  "reactions": 366,
  "saves": null,
  "comments": null,
  "shares": null,
  "priceValue": null,
  "priceCurrency": null,
  "pinnerUsername": "HuliRecipes",
  "pinnerName": "Yulia Recipes",
  "pinnerFollowers": 10,
  "pinnerVerified": false,
  "boardId": "1110137445588421147",
  "boardName": "All Home Decors Ideas",
  "boardUrl": "https://www.pinterest.com/HuliRecipes/all-home-decors-ideas/",
  "source": "https://www.pinterest.com/search/pins/?q=living%20room%20ideas",
  "changeType": null,
  "scrapedAt": "2026-10-28T18:03:27.502Z"
}
```

### 🔁 Scrape only new Pinterest pins with the cache

Set **Cache project name** to the same value on every scheduled run. Pins already saved by that project are skipped, not charged and not counted towards Max items, and each saved pin gets `changeType: "new"` (or `"updated"` when its title, description or link changed). Different names keep separate caches. Combine it with an Apify Schedule to monitor a keyword or a profile daily.

### 🐍 How to scrape Pinterest with Python, JavaScript or the API

Run the actor programmatically with the official Apify clients. Replace `<YOUR_API_TOKEN>` with the token from your [Apify Console](https://console.apify.com/account/integrations).

**Python** (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run = client.actor("confidential_gnat/pinterest-pins-scraper").call(run_input={
    "queries": ["living room ideas"],
    "searchType": "pins",
    "maxItems": 50,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

**JavaScript** (`npm install apify-client`):

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

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

const run = await client.actor('confidential_gnat/pinterest-pins-scraper').call({
    queries: ['living room ideas'],
    searchType: 'pins',
    maxItems: 50,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

**cURL** — start a run and wait for the dataset:

```bash
curl -X POST "https://api.apify.com/v2/acts/confidential_gnat~pinterest-pins-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"queries": ["living room ideas"], "searchType": "pins", "maxItems": 50}'
```

### 💡 What you can use Pinterest pin data for

- Trend research: see which ideas, colors and products are saved most in your niche.
- Competitor and brand monitoring: follow the pins and boards of a profile over time.
- Product and affiliate discovery: filter pins by outbound link domain such as Etsy or Amazon.
- Content and image sourcing for moodboards, design research and ad inspiration.
- Influencer and creator discovery: find profiles and boards by keyword with follower counts.

Marketers, e-commerce sellers, designers, agencies and researchers use Pinterest data to decide what to make, sell and promote.

### ⚠️ Limitations of the Pinterest scraper

- **Public content only** — private boards, private profiles and anything behind a login are not available.
- **Search depth** — one Pinterest search ends after about 1,000 pins; larger limits are reached through related searches, so the extra pins are close in topic but not an exact match.
- **Search pins have fewer fields** — pins found by search carry no `saves`, `comments`, `shares`, `category`, `hashtags` or price; those fields are `null`. Pins from profile, board and pin URLs can be filled with Scrape pin details, but some board pins have no detail page either.

### ❓ Pinterest scraper FAQ

#### Can I scrape Pinterest legally?

The actor only collects data that is already publicly visible on Pinterest — no login, paywall or private content is accessed. Scraping publicly available data is generally considered lawful (see *hiQ Labs v. LinkedIn*), but you are responsible for complying with Pinterest's Terms of Service and applicable laws such as GDPR and CCPA if you process personal data.

#### What data does the Pinterest scraper return?

Pins with title, description, alt text, image and video URLs, outbound link and domain, reactions, creator and board details. Boards return name, owner and counts; profiles return followers, pin and board counts and website. With Scrape pin details you also get comments, shares, category, hashtags and price where Pinterest provides them.

#### How many pins can I scrape from one Pinterest search?

**Max items** applies to each start URL or keyword. A single Pinterest search ends after about 1,000 pins, after which the scraper continues with related searches until your limit is reached or they run out.

#### Do I need a proxy to scrape pinterest.com?

The input defaults to Apify datacenter proxy, which worked in testing. Switch to residential only if your runs are blocked.

#### How do I scrape Pinterest with Python?

Use the Python example above and iterate over the dataset items returned by the run.

#### Can I run this Pinterest scraper on a schedule?

Yes. Use Apify Schedules and set the same **Cache project name** on every run to receive only new or changed pins.

#### What output formats are supported?

JSON, CSV, Excel, XML and RSS, either from the **Output** tab or through the Apify API.

#### Why are saves and comments empty for some pins?

Pinterest search results do not include save and comment counts, and search pins have no detail page. Use a profile, board or pin URL with Scrape pin details to fill them where available.

### 🔗 Relevant actors for Pinterest data

| Scraper | Description |
| ------- | ----------- |
| [Snapchat Profile Scraper](https://apify.com/confidential_gnat/snapchat-profile-scraper) | Scrape Snapchat profiles, Spotlights and Stories. |
| [YouTube Video List Scraper](https://apify.com/confidential_gnat/youtube-video-list-scraper) | List videos from YouTube channels and searches. |
| [Google Shopping Scraper](https://apify.com/confidential_gnat/google-shopping-scraper) | Prices, deals and product data from Google Shopping. |
| [Facebook Events Scraper](https://apify.com/confidential_gnat/facebook-events-scraper) | Search Facebook events, pages and URLs. |

### 🔗 Other actors you may find useful

| Scraper | Description |
| ------- | ----------- |
| [AllTrails Scraper](https://apify.com/confidential_gnat/alltrails-scraper) | Hiking, biking and running trails. |
| [Dice Jobs Scraper](https://apify.com/confidential_gnat/dice-jobs-scraper) | Search tech jobs by keyword or URL. |
| [Carousell Products Scraper](https://apify.com/confidential_gnat/carousell-products-scraper) | Marketplace listings from Carousell. |
| [Vivino Wine Scraper](https://apify.com/confidential_gnat/vivino-wine-scraper) | Wines, ratings and prices from Vivino. |
| [Kalshi Markets Scraper](https://apify.com/confidential_gnat/kalshi-markets-scraper) | Prediction market prices and odds. |

### 💬 Support & contact

If you encounter any issues or have questions, please [open an issue](https://apify.com/confidential_gnat/pinterest-pins-scraper/issues/open).

You can also find more of our actors on the [Actor Flow](https://apify.com/confidential_gnat) page.

# Actor input Schema

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

Search pages (https://www.pinterest.com/search/pins/?q=living+room, also /search/videos/, /search/boards/ and /search/users/), profiles (https://www.pinterest.com/username/), boards (https://www.pinterest.com/username/board-name/) and single pins (https://www.pinterest.com/pin/1234567890/).

## `queries` (type: `array`):

Search Pinterest for these keywords instead of (or as well as) using URLs. One search per keyword.

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

What the keyword searches return: pins, video pins, boards or profiles.

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

Maximum records saved for each start URL or keyword. A Pinterest search ends after about 1,000 pins: when you ask for more, the scraper continues with Pinterest's own related searches and removes duplicates.

## `cacheProjectName` (type: `string`):

Use the same name on each scheduled run to get only new pins (and pins whose title, description or link changed). Unchanged pins are skipped, not charged and not counted towards Max items. Each record gets changeType: new or updated. Leave empty to turn the cache off.

## `scrapeDetails` (type: `boolean`):

Open each pin of a profile, board or pin URL to also fill comment, share and category fields, hashtags and price. Pins found by search carry no detail page, so their detail fields stay empty.

## `minReactions` (type: `integer`):

Only keep pins with at least this many reactions. Leave 0 for no limit.

## `onlyPinsWithLink` (type: `boolean`):

Skip pins that do not link to another website.

## `excludePromotedPins` (type: `boolean`):

Skip ads (promoted pins).

## `linkDomainContains` (type: `string`):

Only keep pins whose outbound link contains one of these words, comma separated, for example etsy,amazon.

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

Apify datacenter proxy is enough for Pinterest. Switch to residential only if runs are blocked.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.pinterest.com/search/pins/?q=living%20room%20ideas"
    }
  ],
  "searchType": "pins",
  "maxItems": 5,
  "scrapeDetails": true,
  "minReactions": 0,
  "onlyPinsWithLink": false,
  "excludePromotedPins": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "startUrls": [
        {
            "url": "https://www.pinterest.com/search/pins/?q=living%20room%20ideas"
        }
    ],
    "maxItems": 5,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("confidential_gnat/pinterest-pins-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 = {
    "startUrls": [{ "url": "https://www.pinterest.com/search/pins/?q=living%20room%20ideas" }],
    "maxItems": 5,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("confidential_gnat/pinterest-pins-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 '{
  "startUrls": [
    {
      "url": "https://www.pinterest.com/search/pins/?q=living%20room%20ideas"
    }
  ],
  "maxItems": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call confidential_gnat/pinterest-pins-scraper --silent --output-dataset

```

## MCP server setup

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