# Pinterest Scraper: Pins, Boards, Profiles, Search | $0.50/1K (`alexmorain/pinterest-scraper`) Actor

Scrape Pinterest pins, boards, board sections, profiles and searches without an account: full-size image, outbound link, title, description, date, saves, pinner and board. Duplicates removed before you pay, full boards despite Pinterest's false end of feed, new-pins-only monitoring and webhook.

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

## Pricing

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

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

### What does Pinterest Scraper do?

Pinterest Scraper extracts **pins, boards, board sections, profiles and search results** from [Pinterest](https://www.pinterest.com) without an account, cookies or a browser. Each pin comes with its **full-size image**, **outbound link**, title, description, creation date, saves and reactions, pinner and board. It works as a **Pinterest API alternative**: one JSON input, one clean dataset, callable from your own code, Make, Zapier or n8n.

Two things go wrong silently with Pinterest, and this Actor handles both.

**Pinterest repeats pins between search pages.** Reading every page of five searches on 21 October 2026 gave 5,434 rows for 4,352 distinct pins: one row in five was a duplicate. This Actor removes them before they reach your dataset, so you never pay twice for the same pin in a search, board or profile.

| Search (21 Oct 2026) | Rows Pinterest sent | Distinct pins returned | Duplicates removed |
|---|---|---|---|
| sourdough bread | 1,095 | 840 | 255 (23%) |
| garden ideas | 1,091 | 822 | 269 (25%) |
| nail art | 1,083 | 841 | 242 (22%) |
| boho bedroom | 1,084 | 916 | 168 (15%) |
| wedding cake | 1,081 | 933 | 148 (14%) |

**Pinterest sometimes says a board has ended when it has not.** On the IKEA "Living Rooms" board (1,201 pins), the first page of the board feed claimed to be the last one in 10 requests out of 16. A scraper that trusts it returns 27 pins and reports success. This Actor compares what it read with the board's pin count, asks again until the feed continues, and returns 1,195 pins. The run log and the `SUMMARY` record tell you how many false ends were recovered.

### Why use Pinterest Scraper?

**Trend and keyword research.** See what ranks for a search, in Pinterest's order (`position` 1, 2, 3...), with the date each pin was created and the website it links to. Run the same queries every week to watch rankings move.

**Competitor and brand monitoring.** Follow a brand's profile or boards. Switch Mode to **New pins only** and schedule it: each run returns only pins you have not seen yet, and a quiet day costs the start fee alone.

**Image and product datasets.** Export full-resolution image URLs, alt text, dominant color, product prices and outbound links for mood boards, catalog research or training data you are entitled to use.

**Influencer and creator research.** Profile rows give followers, monthly views, pin and board counts and the creator's website.

What you get on top of the data:

- searches for pins or videos, pin URLs, boards, board sections, profiles, search URLs and `pin.it` short links, from any Pinterest domain;
- full pins from $0.50 per 1,000 with volume discounts, with no separate charge per source type;
- a status per source (found, empty, not found, partial) instead of a silent empty result;
- a webhook at the end of the run, for Slack, Discord, Make, Zapier or your own endpoint;
- Apify scheduling, API access, integrations and proxy rotation.

### What data can Pinterest Scraper extract?

| Field | Description |
|---|---|
| `title`, `description`, `altText` | Pin text and image alt text |
| `imageUrl`, `imageWidth`, `imageHeight` | Full-size original image |
| `link`, `domain`, `siteName` | The website the pin points to |
| `createdAt` | When the pin was created |
| `saves`, `reactionCount`, `repinCount`, `commentCount` | Engagement, when Pinterest shows it for that source |
| `isVideo`, `videoUrl`, `videoDurationMs` | Video pins |
| `price`, `currency` | Product pins |
| `pinner`, `board` | Who saved the pin and where (username, name, URL, followers) |
| `position`, `sourceType`, `sourceInput` | Rank in its search or board, and which input produced it |
| `url`, `id`, `idEncrypted` | Pin page and Pinterest ID |

Profile rows add `followerCount`, `followingCount`, `monthlyViews`, `pinCount`, `boardCount`, `about` and `websiteUrl`. Board rows add `name`, `pinCount`, `followerCount` and `sectionCount`.

#### Why is `url` empty for some pins?

Pinterest no longer gives the real ID of pins in logged-out searches and board feeds. It sends an encrypted ID starting with `e1_`, and the page `pinterest.com/pin/e1_.../` does not open, not even for a logged-in user (it redirects to the home page). Rather than hand you a dead link, this Actor sets `url` to null and `idEncrypted` to true. Everything else is there: image, outbound link, title, description, date, pinner and board. Pins read from a profile or a pin URL have their real ID and a working `url`.

Searches do not carry save counts, so `saves` is null for search results rather than a made-up 0. Boards and profiles have them.

### How to scrape Pinterest

1. Type one or more searches in **Search queries**, or paste Pinterest URLs in **Pinterest URLs** (pins, boards, sections, profiles, searches).
2. Set **Max pins per source**. Keep it low on a first run: 20 is enough to see the output.
3. Press **Start**.
4. Download the results from the Output tab as JSON, CSV, Excel or HTML, or read them through the API.

To monitor a search, a board or a profile, set Mode to **New pins only** and add a schedule (daily or weekly).

### How much does it cost to scrape Pinterest?

You pay per item returned, plus a start fee of $0.0005.

| Event | Free plan | Bronze | Silver | Gold and above |
|---|---|---|---|---|
| Pin, per 1,000 | $1.00 | $0.85 | $0.70 | $0.50 |
| Profile, per 1,000 | $2.00 | $1.70 | $1.40 | $1.00 |
| Board, per 1,000 | $1.00 | $0.85 | $0.70 | $0.50 |
| Actor start | $0.0005 | $0.0005 | $0.0005 | $0.0005 |

A search read to the end (about 800 to 950 pins) costs under $1 on the Free plan. 10,000 pins cost $10 on the Free plan and $5 on Gold. Duplicates, already-seen pins in New pins only mode and URLs that are not found are never charged. The platform usage of the run is included in these prices.

### Input

See the Input tab for every option. The fields that matter:

- **Search queries**: one per line. **Search for** picks pins or videos.
- **Pinterest URLs**: one per line, any Pinterest domain.
- **Max pins per source**: the cap applies to each search, board, section or profile. 0 means no limit.
- **Profiles: include their pins / boards**: what a profile URL returns besides the profile row.
- **Mode**: All pins, or New pins only.
- **Webhook URL**: called once at the end of a run that returned at least one item.

```json
{
    "searchQueries": ["scandinavian living room"],
    "startUrls": [
        "https://www.pinterest.com/IKEAUSA/living-rooms/",
        "https://www.pinterest.com/IKEAUSA/"
    ],
    "maxPinsPerSource": 100,
    "includeProfileBoards": true
}
```

### Output

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel. One row per pin, profile or board, told apart by `type`. A pin from a search:

```json
{
    "type": "pin",
    "id": "e1_AfqPShxExampleEncryptedPinId0000000000000000000000000",
    "idEncrypted": true,
    "url": null,
    "title": "Modern Scandinavian Home Decor",
    "description": "Create a calm home with Nordic interior design...",
    "link": "https://www.example.com/scandinavian-decor",
    "domain": "example.com",
    "imageUrl": "https://i.pinimg.com/originals/ab/cd/ef/abcdef0123456789abcdef0123456789.jpg",
    "imageWidth": 736,
    "imageHeight": 1104,
    "createdAt": "2026-08-01T20:29:05Z",
    "saves": null,
    "reactionCount": 31,
    "isVideo": false,
    "pinner": {"username": "examplehome", "fullName": "Example Home", "url": "https://www.pinterest.com/examplehome/"},
    "board": {"name": "Living room", "url": "https://www.pinterest.com/examplehome/living-room/"},
    "position": 1,
    "sourceType": "search",
    "sourceInput": "search \"scandinavian living room\"",
    "scrapedAt": "2026-10-21T20:25:18Z"
}
```

A profile row:

```json
{
    "type": "profile",
    "username": "examplehome",
    "fullName": "Example Home",
    "followerCount": 15200,
    "monthlyViews": 820000,
    "pinCount": 2480,
    "boardCount": 36,
    "websiteUrl": "https://www.example.com",
    "url": "https://www.pinterest.com/examplehome/"
}
```

The run also writes a `SUMMARY` record to its key-value store: per source, the status, items returned, pins read, duplicates removed and false ends recovered.

### Tips

- **Speed.** A search read to the end, or a 1,200-pin board, takes under a minute. Sources run in parallel.
- **Big profiles.** A brand profile can hold hundreds of thousands of pins. Keep **Max pins per source** set; the profile row itself is always returned.
- **Calling it from code.** Each run starts in a couple of seconds and a single pin URL or search costs the start fee plus its pins, so it works well as an on-demand API call from a pipeline.
- **Proxy.** Leave the default. Pinterest answers Apify's datacenter proxies; residential proxies are not needed.

### FAQ, disclaimers and support

#### Do I need a Pinterest account?

No. The Actor reads what Pinterest shows to a logged-out visitor. Nothing is posted, liked or followed.

#### Can it scrape private boards or secret pins?

No. Only public content is read.

#### Can it download the images?

It returns the full-size image URL of every pin (`imageUrl`, on `i.pinimg.com`). Download them with any HTTP client or another Actor.

#### Is it legal to scrape Pinterest?

Our Actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our Actors, when used for ethical purposes by Apify users, are safe. However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers. Images on Pinterest belong to their authors: check your rights before reusing them.

#### Something is missing or broken?

Open an issue on the Issues tab with the run ID and the input. It gets read and fixed quickly. For programmatic access, see the API tab.

# Actor input Schema

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

One query per line, as you would type it in Pinterest's search bar. Each query is a separate source: its pins come in Pinterest's order, numbered in <code>position</code>. Pinterest itself ends a search after several hundred distinct pins (840 to 933 on five queries measured in October 2026).

## `startUrls` (type: `array`):

One URL per line, from any Pinterest domain (<code>pinterest.com</code>, <code>fr.pinterest.com</code>, <code>pinterest.co.uk</code>...):<br>• a pin: <code>https://www.pinterest.com/pin/252834966578329961/</code><br>• a board: <code>https://www.pinterest.com/IKEAUSA/living-rooms/</code><br>• a board section: <code>https://www.pinterest.com/IKEAUSA/living-rooms/sofas-armchairs/</code><br>• a profile: <code>https://www.pinterest.com/IKEAUSA/</code><br>• a search: <code>https://www.pinterest.com/search/pins/?q=boho%20bedroom</code><br>• a short link: <code>https://pin.it/...</code><br><br>A URL that is not one of these is skipped with a warning in the log and is not charged.

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

Applies to <b>Search queries</b> only. <b>Pins</b> searches everything; <b>Videos</b> returns video pins only, with their video URL and duration.

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

Stops each search, board, section or profile after this many pins. The cap applies per source, so three queries with a cap of 100 can return up to 300 pins. A pin URL always counts as one.<br><br><b>Keep a cap on your first run</b>: a big board or profile holds thousands of pins, and you pay per pin. Set <code>0</code> for no limit.

## `includeProfilePins` (type: `boolean`):

For profile URLs, return the pins the profile created (up to <b>Max pins per source</b>), after the profile row. Turn off to get only the profile row: followers, monthly views, pin and board counts, website.

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

For profile URLs, also return one row per public board: name, URL, pin count, followers, sections. Boards are not capped by <b>Max pins per source</b>.

## `mode` (type: `string`):

<b>All pins</b> returns every pin each source gives, on every run.<br><br><b>New pins only</b> keeps a registry of every pin earlier runs returned and charged, and returns only pins never seen before. Schedule it to watch a search, a board or a profile: a quiet day costs the start fee alone. The first run returns everything, since nothing has been seen yet. Each source is still read up to <b>Max pins per source</b>, because Pinterest does not sort feeds by date. Profile and board rows are always returned, as a fresh snapshot of their counts.<br><br>A pin stopped by your maximum charge before being billed is not recorded, so it comes back on the next run.

## `registryKey` (type: `string`):

Only used by <b>New pins only</b>. Leave empty and the registry is named after your sources (queries and URLs), so the same input always finds its own memory. Set it only to make several schedules share one memory.

## `webhookUrl` (type: `string`):

If set, the Actor POSTs a small JSON summary to this URL at the end of the run, <b>only when at least one item was returned</b>: <code>actor</code>, <code>runId</code>, <code>datasetId</code>, <code>mode</code>, <code>items</code>, <code>byType</code>, <code>sources</code>. With New pins only and a schedule, that is a notification when something new appears.<br><br>Use the final URL: a redirect is not followed, except a 307 or 308. An unreachable webhook is logged as a warning and never fails the run. Stored encrypted, since a webhook URL often carries its own token.

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

Leave as is. Pinterest answers Apify's datacenter proxies without blocks; each retry moves to a new IP. Residential proxies are not needed.

## Actor input object example

```json
{
  "searchQueries": [
    "scandinavian living room"
  ],
  "searchType": "pins",
  "maxPinsPerSource": 20,
  "includeProfilePins": true,
  "includeProfileBoards": false,
  "mode": "all",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All rows in the default dataset.

## `summary` (type: `string`):

Status of each search, board, section, profile or pin URL: items returned, pins read, false ends recovered.

# 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": [
        "scandinavian living room"
    ],
    "maxPinsPerSource": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("alexmorain/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": ["scandinavian living room"],
    "maxPinsPerSource": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("alexmorain/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": [
    "scandinavian living room"
  ],
  "maxPinsPerSource": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call alexmorain/pinterest-scraper --silent --output-dataset

```

## MCP server setup

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