# All-in-One Pinterest Scraper (`thenetaji/pinterest-scraper`) Actor

Collects Pinterest Pins, search results, profiles, boards, and board Pins through a single Actor. The mode is selected per run; each mode accepts its own identifier and returns that dataset's fields, with optional enrichment attached to every row.

- **URL**: https://apify.com/thenetaji/pinterest-scraper.md
- **Developed by:** [The Netaji](https://apify.com/thenetaji) (community)
- **Categories:** Social media, Automation, For creators
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

## All-in-One Pinterest Scraper

The Actor collects five Pinterest datasets — Pin detail, keyword search, profiles, a profile's boards, and a board's Pins — through a single run configuration. The dataset is chosen with **View**; each mode reads its own identifier and returns that dataset's fields.

Callers who only ever need one of these are better served by the focused Actor for it, listed at the end. This Actor exists for workflows that need several, or that would rather integrate once.

### Modes

| View | Identifier | Returns |
| --- | --- | --- |
| Pin detail | `pin_id_or_url` | One Pin: title, description, media, save and comment counts, the board it sits on, and its pinner |
| Pin search | `query` | Pins matching a keyword, with `scope` selecting the search surface |
| Profile | `username_or_url` | One public profile: display name, follower and following counts, board and Pin counts |
| Boards | `username_or_url` | The boards a profile owns, each with its Pin count and cover Pin |
| Board Pins | `board_id_or_url` | The Pins saved to one board |

**View** is the only required input. Each mode raises a clear error when the identifier it needs is absent, so an otherwise empty run fails immediately rather than returning an unexpected dataset.

### Enrichment

Five optional add-ons attach related records to rows that would otherwise carry only an identifier. Each costs one extra request per enriched row and is charged per row it successfully enriches.

| Add-on | Attaches |
| --- | --- |
| `addonPinDetails` | Full Pin detail on each search result |
| `addonPinnerProfile` | The pinner's profile on a Pin |
| `addonBoards` | A profile's boards on the profile row |
| `addonBoardPins` | A board's Pins, paginated to `maxPinsPerBoard` |
| `addonCoverPinDetails` | Full detail for each board's cover Pin |

Enrichment failures do not fail the run. A row whose enrichment request fails is returned without the attached record, and nothing is charged for it.

### Limits

`maxItems` caps the rows saved by the paginating modes — search, boards, and board Pins. Pin detail and profile lookups return one row and ignore it. Setting `maxItems` to `0` continues until Pinterest stops returning new records, which for a large board can be several thousand Pins.

`maxBoardsPerProfile` and `maxPinsPerBoard` bound the enrichment fan-out separately, so a profile with hundreds of boards cannot silently multiply into a very large run.

### Behaviour worth knowing

Pinterest returns fewer rows than requested more often than most sources. Search results thin out well before an exhaustive count is reached, and a board with a stated Pin count frequently yields fewer, because Pins deleted or made secret still count toward the total Pinterest displays. A short result set is normal rather than a fault.

Profiles that are private, deactivated, or renamed return an empty result rather than an error. The distinction between "no such profile" and "profile with nothing public" is not exposed by the source and is therefore not inferred here.

### Focused alternatives

| Actor | Use instead when |
| --- | --- |
| [Pinterest Pin Scraper](https://apify.com/thenetaji/pinterest-pin-scraper) | Only Pin detail is needed |
| [Pinterest Search Scraper](https://apify.com/thenetaji/pinterest-search-scraper) | Only keyword search is needed |
| [Pinterest Profile Scraper](https://apify.com/thenetaji/pinterest-profile-scraper) | Only profile data is needed |
| [Pinterest Boards Scraper](https://apify.com/thenetaji/pinterest-boards-scraper) | Only a profile's boards are needed |
| [Pinterest Board Pins Scraper](https://apify.com/thenetaji/pinterest-board-pins-scraper) | Only one board's Pins are needed |

# Actor input Schema

## `scraperType` (type: `string`):

Choose the dataset for this run, then fill in the section for that mode below.

## `pin_id_or_url` (type: `string`):

A Pinterest Pin's numeric ID, full pinterest.com/pin/<id>/ URL, or pin.it short link.

## `addonPinnerProfile` (type: `boolean`):

Fetch the full public Pinterest profile of the account that saved each Pin, attached under `pinner_profile`. This makes one extra request per Pin and adds a charge per enriched row.

## `query` (type: `string`):

Words or phrases used to find Pinterest Pins.

## `scope` (type: `string`):

Choose whether the search returns Pins or video Pins.

## `addonPinDetails` (type: `boolean`):

Fetch full Pin detail (save count, comment count, and media) for each Pin found. This makes one extra request per Pin and adds a charge per enriched row.

## `username_or_url` (type: `string`):

A Pinterest username, or the full pinterest.com/<username>/ profile URL.

## `addonBoards` (type: `boolean`):

Fetch this profile's public boards, attached under `boards`, paginated up to `maxBoardsPerProfile` (0 continues until no further boards are available). This makes one or more extra requests and adds one charge per enriched row once the boards are collected. Combine with `addonBoardPins` to also fetch each returned board's Pins.

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

Maximum number of boards to collect per profile when the boards add-on is enabled. The add-on paginates until this many boards are collected. Set `0` to continue until no further boards are available.

## `board_id_or_url` (type: `string`):

A Pinterest board's numeric ID, or the full pinterest.com/<owner>/<board-slug>/ board URL.

## `addonBoardPins` (type: `boolean`):

Fetch a board's Pins, attached under `board_pins`, paginated up to `maxPinsPerBoard` (0 continues until no further Pins are available). This makes one or more extra requests per board and adds one charge per enriched row once that board's Pins are collected. On the Profile Scraper, enabling this alongside `addonBoards` also fetches each returned board's Pins.

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

Maximum number of Pins to collect per board when the board Pins add-on is enabled. The add-on paginates until this many Pins are collected. Set `0` to continue until no further Pins are available.

## `addonCoverPinDetails` (type: `boolean`):

Fetch full Pin detail (save count, comment count, and media) for each board's cover Pin, attached under `cover_pin_details`. This makes one extra request per board and adds a charge per enriched row.

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

Maximum records to save. Set `0` to continue until no further records are available.

## Actor input object example

```json
{
  "scraperType": "pinDetail",
  "pin_id_or_url": "1136384918502158229",
  "addonPinnerProfile": false,
  "query": "coffee",
  "scope": "pins",
  "addonPinDetails": false,
  "username_or_url": "pinterest",
  "addonBoards": false,
  "maxBoardsPerProfile": 0,
  "board_id_or_url": "https://www.pinterest.com/fashion/whimsical-picnic-day-outfits/",
  "addonBoardPins": false,
  "maxPinsPerBoard": 0,
  "addonCoverPinDetails": false,
  "maxItems": 20
}
```

# Actor output Schema

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

All records scraped by this run

# 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 = {
    "pin_id_or_url": "1136384918502158229",
    "query": "coffee",
    "username_or_url": "pinterest",
    "maxBoardsPerProfile": 0,
    "board_id_or_url": "https://www.pinterest.com/fashion/whimsical-picnic-day-outfits/",
    "maxPinsPerBoard": 0,
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("thenetaji/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 = {
    "pin_id_or_url": "1136384918502158229",
    "query": "coffee",
    "username_or_url": "pinterest",
    "maxBoardsPerProfile": 0,
    "board_id_or_url": "https://www.pinterest.com/fashion/whimsical-picnic-day-outfits/",
    "maxPinsPerBoard": 0,
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("thenetaji/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 '{
  "pin_id_or_url": "1136384918502158229",
  "query": "coffee",
  "username_or_url": "pinterest",
  "maxBoardsPerProfile": 0,
  "board_id_or_url": "https://www.pinterest.com/fashion/whimsical-picnic-day-outfits/",
  "maxPinsPerBoard": 0,
  "maxItems": 20
}' |
apify call thenetaji/pinterest-scraper --silent --output-dataset

```

## MCP server setup

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