# Pinterest Scraper - Pins, Boards, Profiles & Saves, No Login (`scrapewise/pinterest-scraper`) Actor

Scrape Pinterest without login: keyword search for pins, videos, boards or profiles, plus board, profile, pin, pin.it and search links. Saves, outbound link, MP4 video, profile followers. Hard caps per input and per run. US$ 1.20 per 1,000 rows, errors free.

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

## Pricing

from $1.02 / 1,000 pin delivereds

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

## Pinterest Scraper

Pinterest Scraper turns **public Pinterest data** into clean JSON, CSV or Excel, **without login or cookies**. Search by keyword for **pins, video pins, boards or creator profiles**, paste **any Pinterest link** (pin, `pin.it` short link, board, profile, search or idea page), and get every pin's title, description, **outbound link and domain**, full-size image, **saves**, reactions, comments, creation date, pinner and board. Profiles come with **followers, pin and board counts, website and profile image**.

**US$ 1.20 per 1,000 rows. No monthly fee, no start fee. Error rows are free.**

### At a glance

- **Price per 1,000 rows:** US$ 1.20, no run start fee
- **Inputs:** Keywords, board links, profiles, any Pinterest link (pin, `pin.it`, board, profile, search page, idea page)
- **Search for:** All pins, video pins only, boards or creator profiles
- **Profile data:** Followers, following, pins, boards, monthly views, website, verified badge, profile and cover image; or the profile row alone, without pins
- **Video:** HLS stream on every video pin; the **MP4 file** and duration with `includePinDetails`
- **Spend control:** Limit per input (default 100) **and** an optional hard cap for the whole run (`maxTotalItems`); the run also stops at your maximum charge
- **Error rows:** Free, with an `errorCode`

### What it fixes

- **No surprise bills.** The default is 100 rows per input, not tens of thousands. `maxTotalItems` caps the whole run, and the run's own max items and max charge settings are respected, so an integration that forgets the limit cannot burn credit.
- **"Profiles" really means profiles.** With `searchType: "profiles"` a keyword returns creator profiles, and a profile link returns **only the profile row** (no pins billed). `profileDetailsOnly` does the same for any profile.
- **Follower count and profile image** are on the profile row, as well as website, about, pin and board counts.
- **Short links work.** `pin.it/...` links are followed to the pin. Search pages, idea pages, boards and profiles pasted as links are each read the right way.
- **Videos come as MP4** (with `includePinDetails`), not only as a stream playlist; Idea Pin videos are found too.
- **The output tab loads.** Results open straight in the dataset view and as JSON or CSV links.

### Switching from another Pinterest actor? Your existing input works

Paste the input you already use. These field names are understood as they are:

| You may already send | Read as |
|---|---|
| `queries`, `search`, `keywords` | `searchQueries` |
| `type`: `all-pins`, `videos`, `boards`, `profiles` (or `users`) | `searchType` |
| `limit`, `maxPins` | `maxItems` (per keyword, board or profile) |
| `startUrls`, `urls`, `profileUrls` | Links of any kind, profiles |
| `includeDetails` | `includePinDetails` |
| `includeUserInfoOnly` | `profileDetailsOnly` |

```json
{ "queries": ["home decor"], "type": "all-pins", "limit": 50 }
```

```json
{ "startUrls": ["https://www.pinterest.com/marthastewart/"], "includeUserInfoOnly": true }
```

### One real row

Search `wedding cake` with `includePinDetails` on (collected on 2026-09-30):

```json
{
  "type": "pin",
  "id": "774124927321868",
  "url": "https://www.pinterest.com/pin/774124927321868/",
  "title": "Playful Garden-Inspired Italian Summer Wedding",
  "link": "https://junebugweddings.com/wedding-blog/garden-inspired-italian-summer-wedding/",
  "domain": "junebugweddings.com",
  "createdAt": "2022-02-25T04:05:23Z",
  "imageUrl": "https://i.pinimg.com/originals/12/9a/e5/129ae56f09d43ace2fbd62c029b585d9.jpg",
  "dominantColor": "#503520",
  "isVideo": false,
  "saveCount": 44031,
  "reactionCount": 27,
  "commentCount": 0,
  "siteName": "Junebug Weddings",
  "pinnerUsername": "graceylouthegreat",
  "boardName": "one day",
  "source": "search:wedding cake"
}
```

### What you can do with it

- **Trend and product research:** what gets saved the most for a keyword, and which websites those pins lead to.
- **Competitor and traffic analysis:** which domains win Pinterest traffic in your niche, and with which images and titles.
- **Content planning for bloggers and shops:** find the pin formats, titles and descriptions that get saves.
- **Image datasets:** full-size image links, alt text and dominant color on every row.

### Input

| Field | What it does |
|---|---|
| `searchQueries` | Keywords as you would type them on Pinterest |
| `searchType` | `pins` (default), `videos`, `boards` or `profiles` |
| `boardUrls` | Board links like `https://www.pinterest.com/username/board-name/` |
| `profiles` | Usernames or profile links; returns the pins the profile saved |
| `includeProfileDetails` | Also one row per profile with followers, counts, website and images (billed as one row) |
| `profileDetailsOnly` | Only the profile row, no pins |
| `pinUrls` | Any Pinterest link: pin, `pin.it`, board, profile, search page or idea page |
| `maxItems` | Default 100, per keyword, board or profile |
| `maxTotalItems` | Optional cap for the whole run (0 = none) |
| `includePinDetails` | Search results come without saves and comment counts; this opens each pin to add them, plus the MP4 of video pins. Slower, same price |
| `onlyNew` | For schedules: delivers, and charges, only pins not delivered by earlier runs (see below) |

```json
{ "searchQueries": ["kitchen ideas", "fall outfits"], "maxItems": 500, "includePinDetails": true }
```

Find creators and boards for a topic:

```json
{ "searchQueries": ["capsule wardrobe"], "searchType": "boards", "maxItems": 50 }
```

```json
{ "searchQueries": ["wedding photography"], "searchType": "profiles", "maxItems": 50 }
```

A profile's numbers without its pins:

```json
{ "profiles": ["marthastewart"], "profileDetailsOnly": true }
```

```json
{
  "type": "profile",
  "username": "marthastewart",
  "url": "https://www.pinterest.com/marthastewart/",
  "fullName": "Martha Stewart",
  "about": "Daily recipes, crafts, and inspiration from Martha Stewart.",
  "websiteUrl": "http://marthastewart.com",
  "domainVerified": true,
  "isVerified": true,
  "followerCount": 1868084,
  "followingCount": 322,
  "pinCount": 105488,
  "boardCount": 174,
  "monthlyViews": 5797970,
  "profileImageUrl": "https://i.pinimg.com/280x280_RS/c8/11/4c/c8114c783347e27daef00e5d4a6ac4f3.jpg",
  "createdAt": "2011-09-15T07:56:17Z",
  "source": "profile:marthastewart"
}
```

### Schedule it daily: only new pins

Turn on `onlyNew`, save your keywords, boards or profiles as a Task and attach a daily Schedule:

```json
{ "profiles": ["marthastewart"], "searchQueries": ["fall outfits"], "maxItems": 100, "onlyNew": true }
```

- **Profiles** are read newest first and stop at the first pin you already have, so a daily check is usually one request.
- **Searches** come in relevance order: the first run delivers up to `maxItems` and starts the watch; after that, each run delivers the pins created since the watch started that you have not received.
- **Boards** do not show when a pin was added: the first run marks the whole board as seen (up to about 1,000 pins), and later runs deliver the pins that appeared since, stopping at the first page with nothing new.
- Already delivered pins are never delivered or charged again and do not count toward `maxItems`. A day with nothing new ends successfully with the status "No new pins since the last run" and charges nothing.
- The memory lives in a Key-Value Store in your own Apify account (`pinterest-scraper-only-new`), one record per search, board and profile. Delete it to start over. Pin links are always delivered.

### Output fields

Pin rows (`type: "pin"`): `id`, `url`, `title`, `description`, `altText`, `link`, `domain`, `createdAt`, `imageUrl`, `imageWidth`, `imageHeight`, `dominantColor`, `hashtags`, `isVideo`, `videoUrl`, `videoMp4Url`, `videoDurationSec`, `saveCount`, `reactionCount`, `commentCount`, `isPromoted`, `productName`, `productPrice`, `siteName`, `pinnerUsername`, `pinnerName`, `pinnerFollowers`, `boardName`, `boardUrl`, `source`, `scrapedAt`.

Profile rows (`type: "profile"`): `username`, `url`, `fullName`, `about`, `websiteUrl`, `domain`, `domainVerified`, `isVerified`, `isVerifiedMerchant`, `followerCount`, `followingCount`, `pinCount`, `boardCount`, `videoPinCount`, `monthlyViews`, `profileImageUrl`, `coverImageUrl`, `createdAt`.

Board rows (`type: "board"`, from a board search): `id`, `url`, `title`, `description`, `pinCount`, `sectionCount`, `imageUrl`, `isCollaborative`, `pinnerUsername`, `pinnerName`, `pinnerFollowers`.

About the person who saved a pin, only what Pinterest shows publicly: username, display name and follower count. Never ids or photos. Profile images are only on the row of a profile you asked for.

#### Error codes (never charged)

| errorCode | Meaning |
|---|---|
| `BOARD_NOT_FOUND`, `PROFILE_NOT_FOUND`, `PIN_NOT_FOUND` | Nothing public at this link or username |
| `NO_RESULTS` | Pinterest returned no pin for this input |
| `INVALID_URL`, `INVALID_INPUT` | A value the Actor does not understand |
| `BLOCKED` | Pinterest did not answer after retries; run again |
| `NOT_REACHED`, `UNEXPECTED` | The run timeout arrived, or something unforeseen broke; only that input is lost |

### Pricing

| Event | Per 1,000 |
|---|---|
| Row delivered (pin, profile or board) | US$ 1.20 |

1,000 rows cost US$ 1.20. Duplicates and error rows are free, and there is no Apify compute bill on top. A profile row or a board row is billed as one pin.

### Limitations

- Search results do not carry saves or comment counts on Pinterest's side; `includePinDetails` adds them with one extra request per pin.
- Video pins in search results come with the HLS stream link (`.m3u8`); `includePinDetails` adds the MP4 file (`videoMp4Url`). Pin links always include it.
- `onlyNew` applies to pins; board and profile search rows are always delivered.
- Only public boards and profiles. This Actor reads public pages only and respects the site's terms.

### FAQ

**Do I need a Pinterest account or cookies?**
No. The Actor reads public pins, boards and profiles without login or cookies.

**What does a run cost?**
US$ 1.20 per 1,000 rows. A profile row or a board row is billed as one pin. Duplicates and error rows are free, and there is no Apify compute bill on top.

**How do I get saves and comment counts for search results?**
Turn on `includePinDetails`. It opens each pin from a keyword search to add saves, comment counts and the MP4 of video pins. Same price, but slower. Boards and profiles already include them.

**How do I get a profile's follower count without its pins?**
Put the username in `profiles` and turn on `profileDetailsOnly`: one row with followers, following, pin and board counts, website and images. To find creators by keyword, set `searchType` to `profiles`.

**How do I keep the cost under control?**
`maxItems` limits each keyword, board or profile (default 100), and `maxTotalItems` caps the whole run. The run also stops at your maximum charge.

**Can I schedule it and get only new pins?**
Yes. Turn on `onlyNew`, save the input as a Task and attach a daily Schedule. Pins delivered by earlier runs are never delivered or charged again, and a day with nothing new charges nothing.

### Changelog

- **2026-10-17:** FAQ in this page.

- **2026-10-08:** search for boards and creator profiles; profile rows (followers, counts, website, images) with `includeProfileDetails` or `profileDetailsOnly`; any Pinterest link in `pinUrls`/`startUrls` (`pin.it`, search, idea, board, profile); `maxTotalItems` run cap; MP4 and duration for video pins; hashtags and image size; input field names from other Pinterest actors accepted.

- **2026-10-04:** `onlyNew` (alias `onlyNewPins`) for daily schedules: only pins not delivered by earlier runs are delivered and charged; a day with nothing new charges nothing.

- **2026-09-30, 0.1:** first release. Keyword search (pins or videos), boards, profiles and pin links, optional saves and comments on search results, free error rows.

# Actor input Schema

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

Keywords as you would type them in the Pinterest search box, one per line (for example kitchen ideas or fall outfits). Each keyword returns the pins Pinterest shows for it, page after page, up to 'Max pins per keyword, board or profile', and every row keeps its keyword. Leave every list empty to run the example 'kitchen ideas'. Also accepts 'keywords', 'queries' or 'search'.

## `searchType` (type: `string`):

What the keyword search returns: Pins (default, all pins), Videos (only video pins), Boards (board rows with name, owner and pin count) or Profiles (creator profile rows). With Profiles, the profile links below also return only the profile row, no pins. Also accepts 'type' with the same values.

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

Pinterest board links, one per line (for example https://www.pinterest.com/username/board-name/). Returns the board's pins in board order, with saves, comment counts and video links already included. Also accepts 'boards'.

## `profiles` (type: `array`):

Pinterest usernames or profile links, one per line (for example nytcooking or https://www.pinterest.com/nytcooking/). Returns the pins the profile saved, newest first. Turn on the profile row options below to also get followers, website and counts. Also accepts 'usernames' or 'profileUrls'.

## `includeProfileDetails` (type: `boolean`):

For each profile, also delivers one row with the profile itself: display name, about, website and domain, verified badge, followers, following, pin and board counts, profile and cover image. Useful to qualify creators or brands. Billed as one pin per profile. Off by default.

## `profileDetailsOnly` (type: `boolean`):

Delivers only the profile row for each profile, with no pins, for a fast and cheap list of follower counts and websites. Billed as one pin per profile. Off by default. Also accepts 'includeUserInfoOnly'.

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

Any Pinterest link, one per line: pin pages (pinterest.com/pin/1234567890), pin.it short links, board links, profile links, search pages (/search/pins/?q=...) and idea pages. Each link is recognized and read the right way automatically; a pin link returns that single pin with full details. Also accepts 'urls' or 'startUrls'.

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

Upper limit of pins for each keyword, board or profile (default 100 when empty). With 3 keywords and 100 here a run delivers up to 300 pins. You pay per pin delivered, so this is the main cost control. Also accepts 'maxPinsPerSource', 'limit', 'maxPins' or 'maxResults'.

## `maxTotalItems` (type: `integer`):

Hard cap across all keywords, boards, profiles and links together (for example 1000). 0 (default) means no run cap, so only the per-input limit applies. The run's own 'max items' setting in the API is respected too.

## `onlyNew` (type: `boolean`):

For scheduled runs. Remembers which pins of each search, board or profile were already delivered (in a named key-value store in your account, 'pinterest-scraper-only-new') and skips them on later runs: not delivered, not charged and not counted toward the limit. Profiles stop at the first pin you already have; searches deliver pins created after the watch started; boards stop at the first page with nothing new. A run with nothing new ends successfully and charges nothing. Pin links are always delivered. Delete the store to start over. Also accepts 'onlyNewPins'.

## `includePinDetails` (type: `boolean`):

Pinterest search results do not include saves, comment counts or the MP4 video link. This option opens each pin from a keyword search to add them. Same price per pin, but the run is slower (one extra request per pin). Boards and profiles already include them. Off by default. Also accepts 'includeDetails'.

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

Apify Proxy, on by default with the datacenter group, which Pinterest accepts. Keep the default unless you have your own proxy.

## Actor input object example

```json
{
  "searchQueries": [
    "kitchen ideas"
  ],
  "searchType": "pins",
  "includeProfileDetails": false,
  "profileDetailsOnly": false,
  "maxItems": 100,
  "maxTotalItems": 0,
  "onlyNew": false,
  "includePinDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `resultsCsv` (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": [
        "kitchen ideas"
    ],
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapewise/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": ["kitchen ideas"],
    "maxItems": 100,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapewise/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": [
    "kitchen ideas"
  ],
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call scrapewise/pinterest-scraper --silent --output-dataset

```

## MCP server setup

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