# Pinterest Boards Scraper (`maximedupre/pinterest-boards`) Actor

Find public Pinterest boards by keyword or collect available pins from board URLs. Get board details, pin media links, creators, engagement, and optional public comments in one dataset. No Pinterest login details are needed.

- **URL**: https://apify.com/maximedupre/pinterest-boards.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Social media, Marketing, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.25 / 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?

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

### 📌 Find Pinterest boards and collect pins

Content teams, designers, marketers, and developers can use Pinterest Boards Scraper to find public Pinterest boards by keyword or collect pins from board URLs. It saves board and pin rows with public URLs, media links, creator details, and engagement data in the default dataset. You can also include available public comments for collected pins.

- Use **[Pinterest Board Ideas](https://apify.com/maximedupre/pinterest-boards/examples/pinterest-board-ideas)** to start a public-board content search.
- Review **[Mood Board Examples](https://apify.com/maximedupre/pinterest-boards/examples/mood-board-examples)** to gather references for visual research.
- Use **[Mood Board Template](https://apify.com/maximedupre/pinterest-boards/examples/mood-board-template)** to find public boards with a shared theme.
- Try **[Mood Board Maker](https://apify.com/maximedupre/pinterest-boards/examples/mood-board-maker)** when you need boards from a keyword.
- Explore **[Mood Board Design](https://apify.com/maximedupre/pinterest-boards/examples/mood-board-design)** to compare public board collections.
- Use **[Pinterest Board Name Ideas](https://apify.com/maximedupre/pinterest-boards/examples/pinterest-board-name-ideas)** for naming research on public boards.

#### 🧭 Board and pin data from Pinterest

Each run writes one row for each first eligible board or pin it finds. The `recordType` field is `board` for keyword discovery and `pin` for board URL collection. Board rows include board identity, counts, cover images, preview thumbnails, and owner details. Pin rows include pin text, source media links, creator details, engagement counts, board details, destinations, and optional comments or product details. If the same board or pin appears again from another submitted value, the first eligible occurrence is saved and later matches are ignored.

#### ▶️ Run a board search or pin collection

1. Set **Result type** to `Find boards by keyword` or `Collect pins from board URLs`.
2. For board discovery, add one or more `keywords`. For pin collection, add one or more `boardUrls`.
3. Turn on `includeComments` when you want available public comments and nested replies for collected pins. Add `maxCommentsPerPin` when you want a comment limit.
4. Start the run and open the default dataset from the output panel.

Use one result type per run. Fields for the other choice are ignored. A smaller limit keeps the run focused and reduces the rows you review. Publicly reachable Pinterest board data does not need buyer-supplied source login details.

#### ⚙️ Input

Choose `searchBoards` to find public boards from keywords, or choose `collectPins` to collect pins from public board URLs.

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `resultType` | string | Chooses `searchBoards` for board discovery or `collectPins` for pin collection. |
| `keywords` | list of strings | Keywords used to find public Pinterest boards. Used with `searchBoards`. |
| `maxBoards` | integer | Maximum board results for each keyword. Leave it empty to return all available results until the source is exhausted. |
| `boardUrls` | list of objects | Public Pinterest board sources for pin collection. Used with `collectPins`. |
| `boardUrls[].url` | string | One public Pinterest board URL. |
| `maxPinsPerBoard` | integer | Maximum pins to collect from each board. Leave it empty to return all available results until the source is exhausted. |
| `includeComments` | boolean | Includes available public comments and nested replies for each collected pin. |
| `maxCommentsPerPin` | integer | Maximum comments to collect for each pin when comments are included. Leave it empty to return all available results until the source is exhausted. |

**Input example**

This JSON is copied from the successful current-beta default-input board-discovery run.

```json
{
  "resultType": "searchBoards",
  "keywords": [
    "home decor"
  ],
  "maxBoards": 10,
  "includeComments": false
}
```

#### 🧾 Output

The output panel links to the default dataset. A run writes board rows or pin rows, based on `resultType`. Fields marked optional appear when Pinterest returns them.

**Output link**

| Field | Type | What it does |
| --- | --- | --- |
| `dataset` | URL string | Opens the default dataset that contains the board or pin results. |

**Board result**

Board rows come from keyword discovery. The table lists the complete board shape, including nested owner and image-link fields.

| Field | Type | What it does |
| --- | --- | --- |
| `recordType` | string | Always `board` for this result shape. |
| `keyword` | string | Submitted keyword that found the board. |
| `id` | string | Board ID reported by Pinterest. |
| `name` | string | Board name reported by Pinterest. |
| `url` | URL string | Public Pinterest URL for the board. |
| `description` | string, optional | Board description reported by Pinterest. |
| `privacy` | string, optional | Privacy value reported for the board. |
| `pinCount` | integer, optional | Pin count reported for the board. |
| `followerCount` | integer, optional | Follower count reported for the board. |
| `coverImages` | list of objects, optional | Available direct board cover image links. |
| `coverImages[].url` | URL string | Direct URL for one board cover image. |
| `previewThumbnails` | list of objects, optional | Available direct board preview thumbnail links. |
| `previewThumbnails[].url` | URL string | Direct URL for one preview thumbnail. |
| `owner` | object, optional | Available public profile details for the board owner. |
| `owner.id` | string, optional | Owner ID reported by Pinterest. |
| `owner.username` | string, optional | Owner username reported by Pinterest. |
| `owner.name` | string, optional | Owner name reported by Pinterest. |
| `owner.avatarUrl` | URL string, optional | Direct URL for the owner's avatar. |
| `owner.followerCount` | integer, optional | Follower count reported for the owner. |
| `owner.isVerified` | boolean, optional | Whether Pinterest reports the owner as verified. |

**Board row example**

This full row comes from the successful current-beta board-discovery run.

```json
{
  "recordType": "board",
  "keyword": "home decor",
  "id": "360358476373112197",
  "name": "Home Decor",
  "url": "https://www.pinterest.com/luxxu/home-decor/",
  "privacy": "public",
  "description": "Bright ideas for how to design your living room, bedroom, bathroom and every other room in your house.\n#homedecor #homedesign #design #interiordesign #interiordecor",
  "pinCount": 18331,
  "followerCount": 397273,
  "coverImages": [
    {
      "url": "https://i.pinimg.com/custom_covers/216x146/360358476373112197_1728062712.jpg"
    },
    {
      "url": "https://i.pinimg.com/custom_covers/400x300/360358476373112197_1728062712.jpg"
    }
  ],
  "previewThumbnails": [
    {
      "url": "https://i.pinimg.com/150x150/5f/0c/12/5f0c12a85404e8863827c19b34155bce.jpg"
    },
    {
      "url": "https://i.pinimg.com/150x150/e8/60/58/e86058afbf2fda220201eb82d301f15a.jpg"
    },
    {
      "url": "https://i.pinimg.com/150x150/b8/e8/f0/b8e8f0eaf7572b7c7a0a2812786173c0.jpg"
    },
    {
      "url": "https://i.pinimg.com/150x150/27/1d/ed/271ded8fad7d006a7374ec15615f8e23.jpg"
    },
    {
      "url": "https://i.pinimg.com/150x150/fb/9d/bf/fb9dbffd662c968261eee6562693988d.jpg"
    }
  ],
  "owner": {
    "id": "360358545092302198",
    "username": "luxxu",
    "name": "LUXXU | Modern Design & Living",
    "avatarUrl": "https://i.pinimg.com/140x140_RS/fe/d3/e2/fed3e2b9e1e4f2321eb55ffb7b7de581.jpg",
    "followerCount": 407298
  }
}
```

**Pin result**

Pin rows come from public board URLs. The `board` object identifies the source board. Comments are included when selected and available, and product details appear when Pinterest returns them.

| Field | Type | What it does |
| --- | --- | --- |
| `recordType` | string | Always `pin` for this result shape. |
| `id` | string | Pin ID reported by Pinterest. |
| `url` | URL string | Public Pinterest URL for the pin. |
| `title` | string, optional | Pin title when available. |
| `description` | string, optional | Pin description when available. |
| `position` | integer, optional | Pin position in its board when collected. |
| `images` | list of objects, optional | Available direct pin image links and details. |
| `images[].url` | URL string | Direct URL for one pin image. |
| `images[].width` | integer, optional | Image width in pixels. |
| `images[].height` | integer, optional | Image height in pixels. |
| `images[].format` | string, optional | Image format reported by Pinterest. |
| `videos` | list of objects, optional | Available direct pin video links and details. |
| `videos[].url` | URL string | Direct URL for one pin video. |
| `videos[].width` | integer, optional | Video width in pixels. |
| `videos[].height` | integer, optional | Video height in pixels. |
| `videos[].durationSeconds` | number, optional | Video duration in seconds. |
| `videos[].thumbnailUrl` | URL string, optional | Direct URL for the video thumbnail. |
| `engagement` | object, optional | Engagement measures reported for the pin. |
| `engagement.saves` | integer, optional | Number of saves reported for the pin. |
| `engagement.likes` | integer, optional | Number of likes reported for the pin. |
| `engagement.comments` | integer, optional | Number of comments reported for the pin. |
| `engagement.shares` | integer, optional | Number of shares reported for the pin. |
| `engagement.repins` | integer, optional | Number of repins reported for the pin. |
| `engagement.favorites` | integer, optional | Number of favorites reported for the pin. |
| `creator` | object, optional | Available public profile details for the pin creator. |
| `creator.id` | string, optional | Creator ID reported by Pinterest. |
| `creator.username` | string, optional | Creator username reported by Pinterest. |
| `creator.name` | string, optional | Creator name reported by Pinterest. |
| `creator.avatarUrl` | URL string, optional | Direct URL for the creator's avatar. |
| `creator.followerCount` | integer, optional | Follower count reported for the creator. |
| `creator.isVerified` | boolean, optional | Whether Pinterest reports the creator as verified. |
| `board` | object | Public board that contains the pin. |
| `board.id` | string | Board ID reported by Pinterest. |
| `board.url` | URL string | Public Pinterest URL for the board. |
| `board.name` | string | Board name reported by Pinterest. |
| `board.privacy` | string, optional | Privacy value reported for the board. |
| `destination` | object, optional | Available outbound destination details for the pin. |
| `destination.url` | URL string, optional | Outbound URL reported for the pin. |
| `destination.domain` | string, optional | Source domain reported for the destination. |
| `comments` | list of objects, optional | Available comments and replies for the pin. |
| `comments[].id` | string, optional | Comment ID reported by Pinterest. |
| `comments[].text` | string | Comment text reported by Pinterest. |
| `comments[].createdAt` | date-time string, optional | Comment creation time reported by Pinterest. |
| `comments[].author` | object, optional | Available profile details for the comment author. |
| `comments[].author.username` | string, optional | Comment author username. |
| `comments[].author.name` | string, optional | Comment author name. |
| `comments[].author.avatarUrl` | URL string, optional | Direct URL for the comment author's avatar. |
| `comments[].replies` | list of objects, optional | Replies nested under the comment. |
| `comments[].replies[].id` | string, optional | Reply ID reported by Pinterest. |
| `comments[].replies[].text` | string | Reply text reported by Pinterest. |
| `comments[].replies[].createdAt` | date-time string, optional | Reply creation time reported by Pinterest. |
| `comments[].replies[].author` | object, optional | Available profile details for the reply author. |
| `comments[].replies[].author.username` | string, optional | Reply author username. |
| `comments[].replies[].author.name` | string, optional | Reply author name. |
| `product` | object, optional | Available product details for a product pin. |
| `product.name` | string, optional | Product name reported by Pinterest. |
| `product.price` | string, optional | Product price reported by Pinterest. |
| `product.stockStatus` | string, optional | Product stock status reported by Pinterest. |

**Pin row example**

This full row comes from the successful current-beta pin-collection run.

```json
{
  "recordType": "pin",
  "id": "920423242666329414",
  "url": "https://www.pinterest.com/pin/920423242666329414/",
  "position": 1,
  "board": {
    "id": "920423311283952283",
    "name": "The Most Popular Recipes on Pinterest",
    "url": "https://www.pinterest.com/RecipeRevealed/the-most-popular-recipes-on-pinterest/",
    "privacy": "public"
  },
  "title": "Pimento Cheese Recipe",
  "description": "Pimento cheese is a beloved classic that embodies simplicity and bold flavor. This versatile spread or dip, made with freshly grated cheddar, tangy pimentos, and creamy mayonnaise, is a staple for casual gatherings and sophisticated appetizers alike. With minimal effort and a handful of ingredients, it transforms into a crowd-pleaser perfect for any occasion.",
  "images": [
    {
      "url": "https://i.pinimg.com/236x/c4/cb/a1/c4cba1869a416c9aa2cb8813fbe8f03f.jpg",
      "width": 236,
      "height": 354,
      "format": "jpg"
    },
    {
      "url": "https://i.pinimg.com/136x136/c4/cb/a1/c4cba1869a416c9aa2cb8813fbe8f03f.jpg",
      "width": 136,
      "height": 136,
      "format": "jpg"
    },
    {
      "url": "https://i.pinimg.com/236x/c4/cb/a1/c4cba1869a416c9aa2cb8813fbe8f03f.jpg",
      "width": 236,
      "height": 354,
      "format": "jpg"
    },
    {
      "url": "https://i.pinimg.com/474x/c4/cb/a1/c4cba1869a416c9aa2cb8813fbe8f03f.jpg",
      "width": 474,
      "height": 711,
      "format": "jpg"
    },
    {
      "url": "https://i.pinimg.com/736x/c4/cb/a1/c4cba1869a416c9aa2cb8813fbe8f03f.jpg",
      "width": 736,
      "height": 1104,
      "format": "jpg"
    },
    {
      "url": "https://i.pinimg.com/originals/c4/cb/a1/c4cba1869a416c9aa2cb8813fbe8f03f.jpg",
      "width": 816,
      "height": 1224,
      "format": "jpg"
    }
  ],
  "creator": {
    "id": "920423380002503298",
    "username": "RecipeRevealed",
    "name": "Ava Jones",
    "avatarUrl": "https://i.pinimg.com/140x140_RS/24/ec/4b/24ec4b0c3cf0cccddf85c79381fc602d.jpg",
    "followerCount": 803
  },
  "destination": {
    "url": "https://omerfood.com/pimento-cheese-recipe",
    "domain": "omerfood.com"
  },
  "engagement": {
    "saves": 2,
    "likes": 1,
    "comments": 0,
    "shares": 0,
    "repins": 0,
    "favorites": 0
  }
}
```

#### 💳 Pricing

This Actor uses pay-per-event pricing. Charges are tied to the saved outcomes described below. Apify shows current prices for your account tier in the pricing panel.

**Board**

One event is charged for each public board saved from a submitted keyword.

**Pin**

The primary event is charged for each pin saved from a submitted public board URL.

#### 🔌 Integrations

Open the default dataset link in the run output to read or export the board and pin data. You can also use the Apify dataset API for downstream work.

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### What does an empty limit do?

Leaving `maxBoards`, `maxPinsPerBoard`, or `maxCommentsPerPin` empty returns all available results until the source is exhausted.

##### What happens if the same board or pin appears more than once?

The first eligible occurrence is saved. Later matches for the same source board or pin are ignored.

##### Can one run find boards and collect pins?

No. Choose one `resultType` for a run. Fields for the other choice are ignored, so use a separate run for the other task.

##### Can I collect comments from pins?

Yes. Set `includeComments` to true when collecting pins. The Actor returns available public comments and nested replies, and `maxCommentsPerPin` can limit them.

##### Can I use a private board or a profile URL?

No. The Actor uses publicly reachable Pinterest board URLs and does not cover private, restricted, or login-gated boards. Profile URLs are outside the input scope.

##### Does the Actor download images and videos?

No. It returns source media links and details. It does not download or store the image and video files.

##### Can I search public Pinterest boards without a login?

Yes. Public board discovery and collection do not need buyer-supplied Pinterest login details.

##### What if a board or pin is unavailable?

Pinterest content can be deleted, unavailable, or non-public. The Actor returns available data, but it does not promise a complete result set or fixed count.

### 📝 Changelog

**v0.0** (01-09-2026)

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~pinterest-boards/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [Pinterest Video Downloader](https://apify.com/maximedupre/pinterest-video-downloader): Get direct media links from known public Pinterest pins.
- [Pinterest Image Downloader](https://apify.com/maximedupre/pinterest-image-downloader): Collect source image links and public pin details from pins, boards, or one keyword search.
- [Pinterest Keyword Autocomplete Scraper](https://apify.com/maximedupre/pinterest-keyword-scraper): Find autocomplete phrases before you plan a board search.
- [Pinterest Followers Scraper](https://apify.com/maximedupre/pinterest-followers-scraper): Collect public follower profiles for audience research around Pinterest accounts.
- [Pinterest Board Downloader](https://apify.com/headlessagent/pinterest-board-downloader): Collect structured pin data from a public Pinterest board URL.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `resultType` (type: `string`):

Choose the kind of result to save.

## `keywords` (type: `array`):

Enter one or more words or phrases to find public Pinterest boards.

## `maxBoards` (type: `integer`):

Set the maximum number of board results for each keyword. Leave it empty to return all available results until the source is exhausted.

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

Enter one or more public Pinterest board URLs. The Actor collects pins from each board.

## `maxPinsPerBoard` (type: `integer`):

Set the maximum number of pins to collect from each board. Leave it empty to return all available results until the source is exhausted.

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

Include available public comments and nested replies for each collected pin.

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

Set the maximum number of comments to collect for each pin when comments are included. Leave it empty to return all available results until the source is exhausted.

## Actor input object example

```json
{
  "resultType": "searchBoards",
  "keywords": [
    "home decor"
  ],
  "maxBoards": 10,
  "includeComments": false
}
```

# Actor output Schema

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

Open the board or pin results in the default dataset.

# 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 = {
    "resultType": "searchBoards",
    "keywords": [
        "home decor"
    ],
    "maxBoards": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/pinterest-boards").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 = {
    "resultType": "searchBoards",
    "keywords": ["home decor"],
    "maxBoards": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/pinterest-boards").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 '{
  "resultType": "searchBoards",
  "keywords": [
    "home decor"
  ],
  "maxBoards": 10
}' |
apify call maximedupre/pinterest-boards --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maximedupre/pinterest-boards"
        }
    }
}

```

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/I9P8c0Om36GoQzKt1/builds/DeqzcW1ZAYHSiOjha/openapi.json
