# Pinterest Scraper: Pins by Keyword, Board or Profile (`redfoxscout/pinterest-scraper`) Actor

Scrape public Pinterest pins from keyword searches, board URLs, profile URLs or pin URLs into JSON or CSV. Each pin row has title, description, image URL, saves, repin count, pinner, board and outbound link. $2.00 per 1,000 pins. No login needed.

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

## Pricing

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

Find the **most saved pins** for a keyword, with the **outbound link, its domain and any price** the pin shows, one clean row per pin. Set **Sort results by** to **Most saves first** and the Actor reads a pool of pins, ranks them by saves and returns the top ones. It also reads **board, profile and single pin URLs**, with **no login and no API keys**: it reads the pages Pinterest shows to logged-out visitors.

**Price: $2.00 per 1,000 pins.** Failed searches and error rows are free. Apify's free plan ($5 monthly credit) covers about 2,500 pins.

**Keyword search is paused (October 2026):** Pinterest stopped giving signed-out visitors the pins behind search results, so a keyword search returns one free error row. Board, profile and pin URLs work as before, including Most saves first.

![Most-saved Pinterest pins for a niche with shop links: real output preview (Most-saved pins for a niche, ranked by saves, with the shop each pin links to)](https://raw.githubusercontent.com/TikTop-Data/apify-store-assets/main/images/pinterest-scraper-output.png)

### Questions it answers

- Which pins for a keyword get the most saves, and which of them link to a shop?
- Which products are pinned in a niche, where do they link, and what price does the pin show?
- What does a brand's Pinterest profile pin, and on which boards?
- Which pins are videos, how long are they, and where is the video file?
- What do people say in the comments on a pin, and how many likes do those comments get?

### Who uses this

- 🛍️ **Ecommerce and product teams:** see which products get saved most and where the pins link.
- 🎨 **Designers and content planners:** collect image URLs, colours and board names for moodboards.
- 📊 **Trend researchers:** compare keyword searches by saves and repins.
- 🔎 **Researchers:** build datasets of public pins with their creation dates.

### Why this Pinterest Scraper

- 🧩 **Four kinds of input in one Actor:** keyword searches, board URLs, profile URLs and single pin links, in the same run.
- 🏆 **Most-saved ranking:** rank each keyword, board or profile by saves, with the outbound link and any price on each row.
- 📌 **Full detail on every row:** saves, repins, comments, outbound link and domain, board, pinner username and display name, pinner followers, creation date, image size and colour, video length.
- 💬 **Comments on each pin, optional:** turn on Include comments for each pin's text, date, likes and commenter, up to 100 comments a pin, at no extra charge.
- 🔒 **Logged out, public data only:** no account and no login cookies. Comments and names appear only as the pin page shows them to visitors.
- 💰 **One price for every field:** $2.00 per 1,000 pins.

### How to use the Pinterest Scraper

1. Click **Try for free** (a free Apify account is enough).
2. Enter keywords under **Search keywords**. Enter Pinterest URLs under **Board, profile or pin URLs** (any mix), or under **Board URLs**, **Profile URLs (pins of a user)** or **Pin URLs (details)**, one per line.
3. Set **Max pins per keyword or URL** (up to 1,000).
4. To rank by saves, set **Sort results by** to **Most saves first**, and adjust **Pins to read before ranking by saves** if you need a larger pool.
5. Click **Start**, then download as JSON, CSV or Excel, or schedule the run for a regular export.

### Input

| Field | Default | What it does |
|---|---|---|
| `searchTerms` | – | Keywords to search pins for, one per line (paused, see above). |
| `urls` | https://www.pinterest.com/marthastewart/ (prefilled) | Public board, profile or pin URLs, one per line, in any mix. |
| `startUrls` | – | The same as `urls`, for tools that send `startUrls`. |
| `boardUrls` | – | Public board URLs only, e.g. `https://www.pinterest.com/pinterest/official-news/`. |
| `profileUrls` | – | Public profile URLs only: the pins that user created. |
| `pinUrls` | – | Single pin URLs only: one row with that pin's details. |
| `maxItems` | 50 (prefilled 15) | Pins per keyword or URL, from 1 to 1,000. |
| `sortBy` | `relevance` | `relevance` keeps Pinterest's order. `saves` ranks the pool by saves and returns the top `maxItems`. |
| `scanPins` | 100 | Only with `sortBy` `saves`: pins to read before ranking, from 1 to 500. Never less than `maxItems`. |
| `includeComments` | off | Adds each pin's public comments to its row: text, date, likes, commenter name and username. Adds a few requests for pins with comments; no extra charge. |
| `maxCommentsPerPin` | 20 | Only with `includeComments`: comments kept for each pin, from 1 to 100. |
| `proxyConfiguration` | off | Your Apify Proxy settings. Off by default; turn it on only if Pinterest blocks runs. |
| `maxConcurrency` | 3 | How many searches run at once. |

A board or profile that is not public, or a URL of the wrong kind (for example a profile in **Board URLs**), gives one error row, which is free.

Example (the input behind the output below):

```json
{ "searchTerms": ["minimalist desk accessories"], "sortBy": "saves", "scanPins": 60, "maxItems": 3 }
```

### Output

One row per pin. A real row from that run (description shortened):

```json
{
  "pinId": "351912467408263",
  "url": "https://www.pinterest.com/pin/351912467408263/",
  "title": "Milo Ceramic Desk Clock – Olive | Modern Minimal Desk Clock",
  "description": "Add style to any workspace with the Milo Ceramic Desk Clock in olive. A modern, minimalist timepiece...",
  "imageUrl": "https://i.pinimg.com/originals/e6/d5/4f/e6d54fa0fec4e90fd821fe8a8e63d196.jpg",
  "imageWidth": 1000,
  "imageHeight": 1500,
  "dominantColor": "#cabaae",
  "link": "https://www.pinterest.com/pin/673991900520790202/",
  "domain": "www.pinterest.com",
  "isProduct": true,
  "price": null,
  "priceCurrency": null,
  "availability": null,
  "saves": 10498,
  "repinCount": 395,
  "commentCount": 6,
  "createdAt": "2026-06-02T21:36:36.000Z",
  "boardName": "home",
  "boardUrl": "https://www.pinterest.com/emilyxo/home/",
  "pinnerUsername": "emilyxo",
  "pinnerName": "Emily C",
  "pinnerFollowers": 432,
  "isVideo": false,
  "videoUrl": null,
  "videoDuration": null,
  "isStoryPin": true,
  "altText": "Olive green ceramic desk clock with minimalist design",
  "hashtags": [],
  "sourceType": "search",
  "searchQuery": "minimalist desk accessories"
}
```

The field list:

- `pinId`, `url`, `title`, `description`, `createdAt`: the pin's id, page URL, text and creation time.
- `imageUrl`, `imageWidth`, `imageHeight`, `dominantColor`, `altText`: the image and its alt text.
- `link`, `domain`: the outbound link and its host.
- `isProduct`, `price`, `priceCurrency`, `availability`: product flag, price shown on the pin, and the sold-out flag.
- `saves`, `repinCount`, `commentCount`: engagement counts. `commentCount` is the number of comments the pin page shows.
- `comments`: only with `includeComments` on. The pin's comments, each with `text`, `createdAt`, `likeCount`, `authorName` and `authorUsername`. See Comments on each pin.
- `boardName`, `boardUrl`: the board the pin is on.
- `pinnerUsername`, `pinnerName`, `pinnerFollowers`: the pinner's username, display name and follower count.
- `isVideo`, `videoUrl`, `videoDuration`: video flag, file URL and length in seconds.
- `isStoryPin`, `hashtags`: idea-pin flag and hashtags without the #.
- `sourceType`, `searchQuery`: where the pin came from (search, board, profile or pin) and the keyword or URL.

### Example tasks

Ready-made inputs you can open, change and run:

- [Collect wedding decor ideas from Pinterest](https://apify.com/redfoxscout/pinterest-scraper/examples/pinterest-wedding-decor-ideas)
- [Export home office ideas from Pinterest](https://apify.com/redfoxscout/pinterest-scraper/examples/pinterest-home-office-ideas)
- [Export pins from a public Pinterest board](https://apify.com/redfoxscout/pinterest-scraper/examples/pinterest-board-pins-export)
- [Collect recent pins from a brand's Pinterest profile](https://apify.com/redfoxscout/pinterest-scraper/examples/pinterest-brand-profile-pins)

### Shoppable trend finder

Pinterest's search results do not show save counts, so **Most saves first** reads a pool of pins for each keyword or URL (**Pins to read before ranking by saves**, default 100, maximum 500), ranks the pool by saves and returns the top **Max pins per keyword or URL**. The ranking covers the pins Pinterest returns for that keyword or URL, not every pin on Pinterest. Pins that are read but not returned are not charged.

Each row carries what product research needs:

- **Demand:** `saves`, `repinCount`, `commentCount`.
- **Where it sends people:** `link` (the outbound link) and `domain` (its host).
- **Product data:** `isProduct`, `price`, `priceCurrency` and `availability`. Pinterest shows a price on only some product pins, so `price` is often empty.
- **Look and wording:** `dominantColor`, `altText` and `hashtags`.

### Comments on each pin

Turn on **Include comments** to add each pin's public comments to its row, in the order the pin page lists them. The Actor reads them as a logged-out visitor sees them, so no account is needed. Each comment has its `text`, when it was posted (`createdAt`), its `likeCount`, and the commenter's `authorName` and `authorUsername`. **Max comments per pin** sets how many to keep for each pin: 20 by default, up to 100.

A commenter whose profile is private keeps the comment text, but gets no name or username. `commentCount` is the number Pinterest counts, and the comment feed can end before that number: on one pin counted at 80, the feed ended after 54 comments.

Input for the example below, and one pin from that run (comments shortened):

```json
{ "searchTerms": ["sourdough bread"], "includeComments": true, "maxCommentsPerPin": 3, "maxItems": 2 }
```

```json
{
  "pinId": "140806234810234",
  "commentCount": 67,
  "comments": [
    {
      "text": "After multiple attempts with several different recipes failed, I tried this recipe. It turned out wonderfully!! ...",
      "createdAt": "2025-12-18T03:51:28.000Z",
      "likeCount": 22,
      "authorName": "Cindy Regier",
      "authorUsername": "cindyrregier"
    },
    {
      "text": "This is the best recipe! Easy to follow. I appreciated the time line suggestions. Turned out great! Making my second batch tonight!",
      "createdAt": "2026-09-17T01:02:54.000Z",
      "likeCount": 2,
      "authorName": "Dianne Leighton",
      "authorUsername": "chat2tigger"
    },
    {
      "text": "This was my first attempt at making sourdough bread and it turned out fantastic! The recipe was so easy to follow too!",
      "createdAt": "2026-01-19T20:47:57.000Z",
      "likeCount": 3,
      "authorName": "Shawn Price-Henley",
      "authorUsername": "shawnthenley"
    }
  ]
}
```

### What this Actor does not do

It does not log in, use account cookies or solve CAPTCHAs, and it does not read private boards. It shows comments and names only as the public pin page does, and it gives no name or username for a private profile. It returns no avatars, and it does not look people up or guess their contact details. Emails and phone numbers in titles, descriptions and comments are replaced with placeholders. Board pin counts are not included, because Pinterest's pin data does not include them.

### How much does it cost?

$2.00 per 1,000 pins.

- 100 pins: about $0.20
- 10,000 pins: about $20
- Failed searches and error rows: free. A pin found more than once in a run (for example by a search and a board) is charged once.
- Comments: no extra charge. Only pins are charged.
- Pins read for ranking by saves but not returned: free. Only the pins in your output are charged.

Apify's free plan gives $5 of credit every month, enough for about 2,500 pins.

### FAQ

**Is this legal?** It reads only public pins and comments, the pages Pinterest shows to anyone without an account. It returns the display name and follower count shown on a public pinner profile, and the name and username a commenter shows on a public pin, but no avatars. Commenters with private profiles get no name or username. Emails and phone numbers in titles, descriptions and comments are replaced with placeholders. Privacy rules differ by country, so check how you store and use the data.

**Why does Most saves first not return the most saved pins on Pinterest?** It ranks only the pool of pins Pinterest returns for your keyword or URL, the first **Pins to read before ranking by saves** (default 100). Pins outside that pool are never read. Raise the pool size to look further, up to 500.

**Why is the price empty on some product pins?** Pinterest shows a price on only some product pins. When the pin shows none, `price` and `priceCurrency` are null.

**What does availability mean?** `"out of stock"` means Pinterest flags the product as sold out. Pinterest sends that flag only for some products; otherwise the field is null. It does not mean the product is in stock.

**Why is the title empty on some pins?** Some pins are saved without a title. The Actor then uses the grid title, and if that is also missing, the SEO title. The `title` field is null only when Pinterest gives none of the three.

**How many pins can a search return?** You set the limit with maxItems, up to 1,000 per keyword or URL. A run stops early when Pinterest's results run out, and a board can run out before maxItems is reached.

**Why are there fewer comments than commentCount?** commentCount is the number Pinterest shows for the pin, and its comment feed can end before that number. On one pin counted at 80, the feed ended after 54 comments.

### Related Actors

- [Company Social Links Finder](https://apify.com/redfoxscout/company-social-links): a company's Pinterest, Instagram and other profile links, found from its website.
- [Shopify Store Detector](https://apify.com/redfoxscout/shopify-store-detector): check which websites run on Shopify, with their theme, apps and tech stack.

# Actor input Schema

## `searchTerms` (type: `array`):

Keywords to search Pinterest pins for, one per line, e.g. wedding decor ideas. Paused: since October 2026 Pinterest hides the pins behind search results from signed-out visitors, so a search returns a free error row. Use the URL boxes.

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

Public Pinterest board, profile or pin URLs, one per line, in any mix, e.g. https://www.pinterest.com/pinterest/official-news/. The boxes below take one kind each.

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

The same as the URL box above, for tools that send startUrls. Board, profile and pin URLs can be mixed.

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

Public board URLs, one per line, e.g. https://www.pinterest.com/pinterest/official-news/. Returns the pins on each board.

## `profileUrls` (type: `array`):

Public profile URLs, one per line, e.g. https://www.pinterest.com/nike/. Returns the pins that user created.

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

Single pin URLs, one per line, e.g. https://www.pinterest.com/pin/1094726622065399703/. Returns one row with that pin's details.

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

How many pins to return for each keyword or URL, from 1 to 1,000. Default 50.

## `sortBy` (type: `string`):

Pinterest order keeps the order Pinterest returns. Most saves first reads a pool of pins, ranks them by saves and returns the top Max pins per keyword or URL.

## `scanPins` (type: `integer`):

Only used with Most saves first. How many pins to read (one Pinterest request each) before picking the most saved. Default 100, maximum 500.

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

Off by default. When on, each pin row gets its public comments (text, date, likes, commenter name and username) as the pin page shows them to logged-out visitors. A few more requests per pin that has comments; no extra charge.

## `maxCommentsPerPin` (type: `integer`):

Only used with Include comments. How many comments to keep for each pin, from 1 to 100. Default 20.

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

Off by default. Turn it on only if Pinterest blocks runs without a proxy. Proxy traffic is billed by Apify on top of this Actor's price.

## `maxConcurrency` (type: `integer`):

How many searches run at once.

## `datasetId` (type: `string`):

Not used by this Actor. Kept so that older inputs still load.

## `datasetUrlField` (type: `string`):

Not used by this Actor. Kept so that older inputs still load.

## `maxDatasetItems` (type: `integer`):

Not used by this Actor. Kept so that older inputs still load.

## `monitorName` (type: `string`):

Not used by this Actor. Kept so that older inputs still load.

## `onlyChanges` (type: `boolean`):

Not used by this Actor. Kept so that older inputs still load.

## Actor input object example

```json
{
  "urls": [
    "https://www.pinterest.com/marthastewart/"
  ],
  "maxItems": 15,
  "sortBy": "relevance",
  "scanPins": 100,
  "includeComments": false,
  "maxCommentsPerPin": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "maxConcurrency": 3,
  "datasetUrlField": "website",
  "maxDatasetItems": 10000,
  "onlyChanges": 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 = {
    "urls": [
        "https://www.pinterest.com/marthastewart/"
    ],
    "maxItems": 15
};

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

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

```

## MCP server setup

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