# Pinterest Board Scraper — All Pins from Any Board (`apt_marble/pinterest-board-scraper`) Actor

Turn any public Pinterest board link into a clean dataset: board stats plus every pin, with save and repin totals, full-size images, outbound links, destination sites and both the account that saved each pin and the creator behind it. No Pinterest account needed.

- **URL**: https://apify.com/apt\_marble/pinterest-board-scraper.md
- **Developed by:** [Hamza](https://apify.com/apt_marble) (community)
- **Categories:** Social media, E-commerce, Automation
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 pin scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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

## Pinterest Board Scraper — All Pins from Any Board

Paste a Pinterest board link and get the whole board as a clean, ready-to-use
table: the board itself — title, description, pin total, follower count and
owner — followed by every pin on it, each one with its save and repin totals,
full-size image, outbound link, destination site, the account that saved it and
the account that originally made it. Pins the owner has filed into the board's
own sections are collected too, each one labelled with the section it came from,
so the pins you get add up to the pin total on the board. No Pinterest account,
no login, no manual copying. Point it at one board or at two hundred and let it
run.

### What you can do with it

- **Study what actually performs in your niche.** Every pin arrives with its save
  and repin totals, so you can sort a competitor's best board by real traction
  instead of guessing from thumbnails.
- **Build a mood board or product feed as data.** Pull a curated board into a
  spreadsheet with full-size images, colours, captions and destination links.
- **Track the brands and creators a board sends traffic to.** The destination
  site is broken out as its own column, so it takes one pivot table to see who a
  board is really promoting.
- **Find the original creators behind curated content.** Pins are separated into
  who saved them and who first published them, which turns any well-curated board
  into a list of creators worth working with.
- **Keep a well-organised board's structure.** Boards split into sections come
  back with every pin tagged by section, so a 1,400-pin recipe board arrives
  already grouped the way its owner grouped it.
- **Watch a board over time.** Run it on a schedule and compare exports to see
  what was added and how the save totals moved.
- **Collect video content.** Video pins arrive with a direct, playable file plus
  dimensions and length.

### What you get

Two kinds of row. One board summary per board (optional), then one row per pin.

```json
{
  "type": "board",
  "id": "1136033143444708489",
  "url": "https://www.pinterest.com/chamberlaincoffeepins/coffee/",
  "name": "Coffee",
  "slug": "coffee",
  "pinCount": 102,
  "followerCount": 8269,
  "sectionCount": 0,
  "privacy": "public",
  "lastPinnedAt": "2026-06-23T21:24:28.000Z",
  "ownerUsername": "chamberlaincoffeepins",
  "ownerFullName": "Chamberlain Coffee",
  "ownerUrl": "https://www.pinterest.com/chamberlaincoffeepins/",
  "imageUrl": "https://i.pinimg.com/200x150/72/49/9e/72499ef201f3f64dc884454dae21a06d.jpg"
}
```

```json
{
  "type": "pin",
  "id": "1136033074763364803",
  "url": "https://www.pinterest.com/pin/1136033074763364803/",
  "title": "Chamberlain Coffee",
  "altText": "Coffee Food Photography Styling, Diner Coffee, Special Coffee, Cafe Food Photography Ideas",
  "dominantColor": "#6a0e0d",
  "link": "(the pin's outbound destination)",
  "domain": "chamberlaincoffee.com",
  "imageUrl": "https://i.pinimg.com/originals/d0/73/8f/d0738f3faa609c84f354c7407e1f3f2a.png",
  "imageWidth": 1000,
  "imageHeight": 1500,
  "saveCount": 231,
  "repinCount": 116,
  "reactionCount": 9,
  "isVideo": false,
  "isPromoted": false,
  "isRepin": false,
  "boardName": "Coffee",
  "boardSlug": "coffee",
  "boardSectionTitle": null,
  "boardFollowerCount": 8269,
  "pinnerUsername": "chamberlaincoffeepins",
  "creatorUsername": "chamberlaincoffeepins",
  "position": 1,
  "scrapedAt": "2026-08-04T14:04:30.633Z"
}
```

### Input reference

| Field | Type | Default | What it does |
| --- | --- | --- | --- |
| `boards` | list of text | one example board | The boards to scrape. Paste `https://www.pinterest.com/username/board-name/` or use the short form `username/board-name`. Up to 200 boards per run; duplicates and anything that is not a board are skipped with a note in the log. |
| `maxPinsPerBoard` | number | `200` | How many pins to take from each board, newest first. Maximum 5,000. Boards with fewer pins simply return everything they have. |
| `includeBoardDetails` | true/false | `true` | Adds one summary row per board with its title, description, pin total, follower count and owner. Turn it off if you only want pins. |
| `includePromotedPins` | true/false | `false` | Promoted pins are Pinterest's own advertising placements. They are left out by default; switch this on to keep them (they are always marked `isPromoted`). |
| `boardsAtOnce` | number | `4` | How many boards to work through at the same time. Raise it for long lists, lower it for a gentler run. Maximum 8. |
| `country` | choice | `United States` | The country the run browses Pinterest from. Pinterest tailors part of what it shows to the visitor's country. |

### Output fields

#### Board summary rows (`type: "board"`)

| Field | Description |
| --- | --- |
| `id`, `url`, `slug` | The board's identifier, its web address and its short name |
| `name`, `title` | Board title |
| `description`, `seoDescription` | The owner's description, and the public summary Pinterest shows |
| `pinCount` | How many pins Pinterest reports on the board |
| `followerCount` | People following this board |
| `collaboratorCount`, `isCollaborative` | Whether other people can add to it, and how many do |
| `sectionCount`, `sectionlessPinCount` | How the board is organised |
| `privacy` | Board visibility as published by Pinterest |
| `lastPinnedAt`, `lastPinnedAtRaw` | When something was last added, in standard date format and as published |
| `imageUrl`, `coverImages` | Board cover artwork |
| `ownerUsername`, `ownerFullName`, `ownerImageUrl`, `ownerUrl` | The account that owns the board |
| `inputTarget`, `source`, `scrapedAt` | Which of your inputs produced the row, and when |

#### Pin rows (`type: "pin"`)

| Field | Description |
| --- | --- |
| `id`, `url` | Pin identifier and its page on Pinterest |
| `title`, `description` | The caption as published, where there is one |
| `altText` | The image description — automatically generated when the pin has no caption of its own |
| `dominantColor` | The pin image's main colour, as a hex value |
| `imageUrl`, `imageWidth`, `imageHeight`, `images` | Best available image plus every published size |
| `isVideo`, `videoMp4Url`, `videoUrl`, `videoUrls` | Video pins, with a directly playable file and the streaming alternatives |
| `videoWidth`, `videoHeight`, `videoDurationMs`, `videoThumbnailUrl` | Video dimensions, length and still frame |
| `saveCount` | How many people have saved this pin |
| `repinCount` | How many times it has been saved on from this copy |
| `reactionCount`, `reactions` | Emoji reaction totals, overall and by type |
| `triedCount`, `favoriteCount` | People who marked it tried, and who favourited it |
| `link`, `utmLink`, `domain` | Where the pin sends people, and the destination site |
| `pinnerUsername`, `pinnerFullName`, `pinnerImageUrl`, `pinnerIsVerifiedMerchant` | The account that saved the pin to this board |
| `creatorUsername`, `creatorFullName`, `creatorDomainVerified` | The account that originally published it — often a different person |
| `boardId`, `boardName`, `boardUrl`, `boardSlug`, `boardOwnerUsername`, `boardFollowerCount` | The board the pin was found on |
| `boardSectionId`, `boardSectionTitle` | The section of the board the pin is filed in, where the owner uses sections. Empty for pins that sit loose on the board |
| `isPromoted`, `promotedBy` | True when the pin is one of Pinterest's advertising placements, and the advertiser behind it |
| `isRepin` | True when this copy was saved on from somebody else |
| `isProduct`, `shoppingFlags`, `richPinType`, `publisher` | Shopping and rich-pin markers, where Pinterest publishes them |
| `position`, `inputTarget`, `source`, `scrapedAt` | Where the pin sat on the board, which input produced it, and when |

### Pricing

You pay per row, and there is nothing else to buy.

| What you pay for | Price |
| --- | --- |
| Every row in your dataset | **$1.50 per 1,000 rows** |
| Each board summary row, on top of the row price | **$5.00 per 1,000 boards** |

**Worked example.** Five boards, 300 pins from each, with board summaries on:
that is 1,500 pin rows plus 5 board summary rows = 1,505 rows at $1.50 per 1,000
\= **$2.26**, plus 5 board summaries at $5.00 per 1,000 = **$0.03**. Total for the
run: **about $2.28**.

Turning `includeBoardDetails` off removes the summary rows and their charge
entirely, so a pins-only run of the same size costs about $2.25. You are never
charged for a board that turns out to be unavailable, and never for the
recommendation cards Pinterest mixes into a board — those are removed before
anything is written.

### Limits & what this actor cannot do

- **Private and secret boards are not publicly viewable.** They are reported as
  unavailable in the run log and counted separately from genuine failures, rather
  than returned as an empty board.
- **Pinterest stops serving a very deep board before the end of it.** On the
  largest boards it offers a few thousand pins and then stops offering more, so
  a board advertising five thousand can come back short. The run collects
  everything it is given rather than inventing the difference.
- **A board can hold more pins than one run will take from it.** Each board gets
  a fixed share of the work in a run. A board deeper than its share stops there
  and says so in the run log, rather than trimming quietly — raise the per-board
  ceiling or give that board a run of its own to go further.
- **The loose pins on a board come first, its sections afterwards.** That is the
  order they are collected in, so a run that is cut short by the ceiling you set
  keeps the main board in full and may not reach every section.
- **Save, repin, reaction and follower totals are a snapshot** taken at the moment
  of collection. They keep moving afterwards.
- **Comment totals are not published on a board listing,** so no comment column is
  included. A column that is always empty is worse than no column.
- **A board listing does not publish when each pin was created or saved,** so
  there is no per-pin date. The board's own "last added" date is included.
- **Many pins are published with no caption at all.** Those arrive with an
  automatically generated image description in `altText` instead, which is
  usually a better search term than the caption anyway.
- **Promoted pins appear inside Pinterest's own listings.** They are marked and
  excluded by default, and can be kept with one switch.
- **Results are tailored to the country the run browses from,** so the same board
  can show slightly different extras from a different market.
- **Speed depends on the size of the job and on how quickly Pinterest answers.**
  No fixed throughput is promised.
- **Pinterest's terms govern automated access.** You are responsible for using the
  data lawfully and in line with the source site's terms, including any personal
  data it contains.

### FAQ

**Do I need a Pinterest account?**
No. It reads public boards only, exactly as an ordinary visitor would see them.

**Does it need my login or password?**
No, and it will never ask for one. There is nothing to connect and nothing to
authorise.

**Can I schedule it?**
Yes. Set it to run daily, weekly or monthly on Apify and compare exports to see
what a board added and how its numbers moved.

**Is the data complete?**
It is complete as far as Pinterest publishes it. Every pin a board shows
publicly is collected, up to the ceiling you set — including the ones filed into
the board's sections, which is what lets the pins you get add up to the pin total
on the board summary row. What Pinterest does not publish — comment totals
alongside a board, per-pin dates, anything behind a private board — is not
returned, and is not faked.

**What happens to boards that are split into sections?**
They are collected in full: the pins sitting loose on the board first, then each
section in turn, with every pin labelled by the section it was filed in.

**Can it get pins from a whole profile instead of one board?**
This one is built for boards. Give it several board links and it will work
through them all in a single run.

**What happens if I paste something that is not a board?**
It is skipped with a plain-language note in the log, and the rest of the run
carries on. Profile links, individual pin links and links to other sites are all
rejected before any work starts, so you are not charged for them.

# Actor input Schema

## `boards` (type: `array`):

One or more public Pinterest boards. Paste the board link (https://www.pinterest.com/username/board-name/) or use the short form username/board-name. Up to 200 boards per run.

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

How many pins to collect from each board, newest first. Boards with fewer pins simply return everything they have.

## `includeBoardDetails` (type: `boolean`):

Adds one extra row per board with its title, description, pin total, follower count and owner. Turn this off if you only want the pins.

## `includePromotedPins` (type: `boolean`):

Promoted pins are Pinterest's own advertising placements. They are excluded by default; switch this on to keep them (they are always marked with isPromoted).

## `boardsAtOnce` (type: `integer`):

How many boards to work through simultaneously. Raise it for large lists of boards, lower it if you want a gentler run.

## `country` (type: `string`):

The country the run browses Pinterest from. Pinterest tailors some of what it shows to the visitor's country, so pick the market you care about.

## Actor input object example

```json
{
  "boards": [
    "https://www.pinterest.com/houseofhipsters/jewelry-ideas/"
  ],
  "maxPinsPerBoard": 50,
  "includeBoardDetails": true,
  "includePromotedPins": false,
  "boardsAtOnce": 4,
  "country": "us"
}
```

# Actor output Schema

## `dataset` (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 = {
    "boards": [
        "https://www.pinterest.com/houseofhipsters/jewelry-ideas/"
    ],
    "maxPinsPerBoard": 50,
    "boardsAtOnce": 4
};

// Run the Actor and wait for it to finish
const run = await client.actor("apt_marble/pinterest-board-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 = {
    "boards": ["https://www.pinterest.com/houseofhipsters/jewelry-ideas/"],
    "maxPinsPerBoard": 50,
    "boardsAtOnce": 4,
}

# Run the Actor and wait for it to finish
run = client.actor("apt_marble/pinterest-board-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 '{
  "boards": [
    "https://www.pinterest.com/houseofhipsters/jewelry-ideas/"
  ],
  "maxPinsPerBoard": 50,
  "boardsAtOnce": 4
}' |
apify call apt_marble/pinterest-board-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,apt_marble/pinterest-board-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/pi6Jgh8814tJTXl5c/builds/05K7sNOHH30nfQ3cg/openapi.json
