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

Collect Pinterest pins by keyword search, from boards and from profiles, or by pin link. Each pin has its title, description, link, images, video, saves, repins and comments where shown, board, pinner and date. Add board and profile details. Failed links are reported and not charged.

- **URL**: https://apify.com/barefoot_grade/pinterest-scraper.md
- **Developed by:** [Philip Kirkbride](https://apify.com/barefoot_grade) (community)
- **Categories:** Social media, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 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.

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: Pins, Boards, Profiles & Search

Turn Pinterest into a clean spreadsheet of pins. Type a keyword and get the pins Pinterest shows for it, or paste a board, profile or pin link. Each pin comes with its title, description, the outside page it links to, full-size image, video file for video pins, saves, repins and comments where Pinterest shows them, the board it is saved on, the account that saved it and the date it was created.

Board links add a board row (name, pin count, followers, cover), profile links add a profile row (name, bio, followers, following, pin and board counts, website, monthly views) and can list every board on the profile. Paging is automatic, every run has a per-keyword and a total cap, and links that fail are listed in the run summary with a clear reason and are not charged.

### Use cases

- **Trend and content research**: see which pins Pinterest ranks for a keyword, what they look like and how often they get saved.
- **Competitor and brand tracking**: follow a brand's profile and boards, their follower counts and what they pin, on a schedule.
- **Influencer discovery**: find the accounts behind the pins for a topic, with their follower counts and profile links.
- **Product and traffic research**: collect the outside links and domains pins send visitors to.
- **Image datasets**: gather full-size pin images and their descriptions for a topic or board.

### Quick Start

```json
{
  "searchQueries": ["living room ideas"],
  "urls": ["https://www.pinterest.com/nasa/"],
  "maxPinsPerSource": 50
}
```

This returns up to 50 pins for "living room ideas", plus NASA's profile and up to 50 of its pins. Add `"includeProfileBoards": true` to list the profile's boards as well.

### Input

| Input | Type | Default | Meaning |
| --- | --- | --- | --- |
| `searchQueries` | array | none | Keywords to search pins for, one per line. |
| `urls` | array | none | Pinterest links, one per line: a board (`pinterest.com/user/board/`), a profile (`pinterest.com/user/`), a pin (`pinterest.com/pin/123.../`), a search link or a `pin.it` short link. Country sites such as `pinterest.co.uk` work too. |
| `maxPinsPerSource` | integer | `50` | Cap on pin rows from each keyword, board or profile, up to 10,000. Use `0` to collect only board and profile details. |
| `maxItems` | integer | `500` | Total cap on rows (pins, boards and profiles) for the whole run, up to 100,000. |
| `includeProfileBoards` | boolean | `false` | For profile links, add one row per board. |
| `maxBoardsPerProfile` | integer | `50` | Cap on board rows from each profile. |

Give at least one keyword or link. Repeated keywords and links are read once.

### Example queries

- `{"searchQueries": ["wedding dress", "garden design", "tattoo ideas"], "maxPinsPerSource": 200}`: three keyword searches, 200 pins each.
- `{"urls": ["https://www.pinterest.com/nasa/earth/"], "maxPinsPerSource": 1000}`: one board and up to 1,000 of its pins.
- `{"urls": ["https://www.pinterest.com/marthastewart/"], "includeProfileBoards": true, "maxPinsPerSource": 0}`: a profile and its boards, no pins.
- `{"urls": ["https://www.pinterest.com/pin/99360735500167749/"]}`: one pin, with its comment count.

### What it returns

Every row has a `recordType`: `pin`, `board` or `profile`.

**Pin rows**

| Field | Meaning |
| --- | --- |
| `id`, `url` | Pin id and its Pinterest page. |
| `title`, `description`, `altText` | Pin title, description and image description. |
| `link`, `domain` | The outside page the pin links to, and its domain. |
| `imageUrl`, `imageWidth`, `imageHeight`, `thumbnailUrl` | Full-size image with its size, and a small version. |
| `isVideo`, `videoUrl`, `videoDurationSeconds` | Video pins: the video file and its length. |
| `saves`, `repinCount`, `commentCount`, `reactionCount` | Engagement counts, where Pinterest shows them. |
| `dominantColor` | Main colour of the image. |
| `createdAt` | When the pin was created (UTC). |
| `boardId`, `boardName`, `boardUrl` | The board the pin is saved on. |
| `pinnerId`, `pinnerUsername`, `pinnerName`, `pinnerFollowerCount`, `pinnerUrl` | The account that saved the pin. |
| `searchQuery` | The keyword, for search results. |

**Board rows** carry `id`, `url`, `name`, `description`, `pinCount`, `followerCount`, `sectionCount`, `collaboratorCount`, `isCollaborative`, `category`, `coverImageUrl`, `createdAt` and the owner's `ownerId`, `ownerUsername` and `ownerName`.

**Profile rows** carry `id`, `url`, `username`, `fullName`, `about`, `followerCount`, `followingCount`, `pinCount`, `boardCount`, `monthlyViews`, `websiteUrl`, `domainVerified`, `isVerified`, `imageUrl` and `createdAt`.

Every row also has `source` (`search`, `board`, `profile` or `pin`), `sourceInput` (the keyword or link you entered) and `scrapedAt` (collection time, UTC). The run summary (`OUTPUT`) reports `pins`, `boards`, `profiles`, `sourcesRequested`, `sourcesSucceeded`, `errors` and the list at `sourceErrors`, each with the keyword or link and a reason code such as `PROFILE_NOT_FOUND`, `BOARD_NOT_FOUND`, `PIN_NOT_FOUND` or `NO_RESULTS`.

### Output example

```json
{
  "recordType": "pin",
  "id": "142567144449027286",
  "url": "https://www.pinterest.com/pin/142567144449027286/",
  "title": "Voyager Heliophysics Resources for Educators",
  "description": "Ever since the Voyager 1 mission crossed the heliopause, scientists at NASA have used data sent back from the edge of the solar system to more closely investigate the relationship between the Sun, the heliosphere, and the vast region of interstellar space beyond.\n\nThese four resources from the Heliophysics Resource Database offer learners and educators a closer examination of the continuing legacy of the Voyager missions.",
  "link": "https://science.nasa.gov/learn/heat/resource/voyager-heliophysics-resources/",
  "domain": "science.nasa.gov",
  "imageUrl": "https://i.pinimg.com/originals/5b/cb/1d/5bcb1d194cab7dc148540cbbd54319f5.png",
  "imageWidth": 1080,
  "imageHeight": 1920,
  "thumbnailUrl": "https://i.pinimg.com/236x/5b/cb/1d/5bcb1d194cab7dc148540cbbd54319f5.jpg",
  "isVideo": false,
  "videoUrl": null,
  "videoDurationSeconds": null,
  "saves": 4,
  "repinCount": null,
  "commentCount": null,
  "reactionCount": 4,
  "altText": "An artist's depiction of the Voyager 1 spacecraft. Bold white text reads, \"From the Edge of the Solar System to Your Classroom.\" Below that, thin yellow text reads, \"Bring the legacy of Voyager to your classroom.\"",
  "dominantColor": "#030403",
  "createdAt": "2026-10-06T18:44:32Z",
  "boardId": "142567213143159083",
  "boardName": "Learn With NASA",
  "boardUrl": "https://www.pinterest.com/nasa/learn-with-nasa/",
  "pinnerId": "142567281862381039",
  "pinnerUsername": "nasa",
  "pinnerName": "NASA",
  "pinnerFollowerCount": null,
  "pinnerUrl": "https://www.pinterest.com/nasa/",
  "source": "profile",
  "sourceInput": "https://www.pinterest.com/nasa/",
  "searchQuery": null,
  "scrapedAt": "2026-10-20T01:49:44Z"
}
```

```json
{
  "recordType": "board",
  "id": "142567213143145496",
  "url": "https://www.pinterest.com/nasa/earth/",
  "name": "Earth",
  "description": null,
  "pinCount": 824,
  "followerCount": 526749,
  "sectionCount": 0,
  "collaboratorCount": 0,
  "isCollaborative": false,
  "category": "other",
  "coverImageUrl": "https://i.pinimg.com/200x150/9b/08/88/9b0888f42a2048c9ab826932ba4a137b.jpg",
  "createdAt": null,
  "ownerId": "142567281862381039",
  "ownerUsername": "nasa",
  "ownerName": "NASA",
  "source": "board",
  "sourceInput": "https://www.pinterest.com/nasa/earth/",
  "scrapedAt": "2026-10-20T01:49:44Z"
}
```

```json
{
  "recordType": "profile",
  "id": "142567281862381039",
  "url": "https://www.pinterest.com/nasa/",
  "username": "nasa",
  "fullName": "NASA",
  "about": "Explore the universe and discover our home planet with the official NASA boards on Pinterest. Visit us at www.nasa.gov",
  "followerCount": 556518,
  "followingCount": 5,
  "pinCount": 10553,
  "boardCount": 82,
  "monthlyViews": 4097475,
  "websiteUrl": "http://www.nasa.gov/",
  "domainVerified": true,
  "isVerified": true,
  "imageUrl": "https://i.pinimg.com/280x280_RS/37/a1/75/37a175e6d2431425576f0b8f81389394.jpg",
  "createdAt": "2012-03-05T16:37:07Z",
  "source": "profile",
  "sourceInput": "https://www.pinterest.com/nasa/",
  "scrapedAt": "2026-10-20T01:49:44Z"
}
```

### Price

**$0.0014 per result** delivered (one pin, board or profile row), plus **$0.005 per run start**. The run-start event is charged per GB of memory; the default 512 MB run is one start event. The start is charged even if the run saves no results. Keywords and links that fail are not charged. Platform usage is included in these prices.

### Good to know

- Pinterest gives pins found through keyword search or on a board a long text id instead of a number, and opens those pins as pages only for signed-in visitors. For these pins `url` is empty; the image, outside link, board, pinner and dates are all still there. Pins from profile links and pin links have numeric ids and page links.
- Engagement counts depend on where a pin was found: board and profile pins carry `saves`, board pins also carry `repinCount`, and pin links carry `saves`, `repinCount` and `commentCount`. Search results carry no engagement counts. Fields Pinterest does not show stay empty.
- Only public pins, boards and profiles are collected.
- Board sections are not supported yet; give the board link to collect the whole board.
- Search results are the pins Pinterest shows a signed-out visitor in the United States for that keyword.
- The scraper reads at a gentle pace, 25 pins per page. A 1,000-pin keyword usually takes about a minute.

# Actor input Schema

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

Keywords to search pins for, one per line, exactly as you would type them into Pinterest search.

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

Pinterest links, one per line: a board (pinterest.com/user/board/) gives the board and its pins, a profile (pinterest.com/user/) gives the profile and its pins, a pin (pinterest.com/pin/123.../) gives that pin, and a search link gives the search results. pin.it short links work too.

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

Cap on pin rows from each keyword, board or profile. Use 0 to collect only board and profile details.

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

Total cap on rows (pins, boards and profiles) for the whole run.

## `includeProfileBoards` (type: `boolean`):

For profile links, add one row per board with its name, pin count, follower count and cover image.

## `maxBoardsPerProfile` (type: `integer`):

Cap on board rows from each profile when boards are included.

## Actor input object example

```json
{
  "searchQueries": [
    "living room ideas"
  ],
  "urls": [
    "https://www.pinterest.com/nasa/"
  ],
  "maxPinsPerSource": 50,
  "maxItems": 500,
  "includeProfileBoards": false,
  "maxBoardsPerProfile": 50
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (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 = {
    "searchQueries": [
        "living room ideas"
    ],
    "urls": [
        "https://www.pinterest.com/nasa/"
    ],
    "maxPinsPerSource": 50,
    "maxItems": 500
};

// Run the Actor and wait for it to finish
const run = await client.actor("barefoot_grade/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": ["living room ideas"],
    "urls": ["https://www.pinterest.com/nasa/"],
    "maxPinsPerSource": 50,
    "maxItems": 500,
}

# Run the Actor and wait for it to finish
run = client.actor("barefoot_grade/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": [
    "living room ideas"
  ],
  "urls": [
    "https://www.pinterest.com/nasa/"
  ],
  "maxPinsPerSource": 50,
  "maxItems": 500
}' |
apify call barefoot_grade/pinterest-scraper --silent --output-dataset

```

## MCP server setup

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