# Pinterest Scraper (`donjuan_mime/pinterest-scraper`) Actor

Scrape Pinterest pins from profiles, boards, and search: titles, descriptions, images, videos, saves, links, boards, and pinners. No login needed.

- **URL**: https://apify.com/donjuan_mime/pinterest-scraper.md
- **Developed by:** [Donjuan](https://apify.com/donjuan_mime) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$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.

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, images, videos, and boards from profiles and search

Pinterest Scraper collects public Pinterest pins from profiles, boards, single pins, and search. For every pin you get the title, description, the website it links to, the full-size image, the video file when there is one, the dominant color, the creation date, saves, repins, comments, and reactions, the board it sits on, and the pinner with their follower count.

You don't need a Pinterest account, an API key, or any code. Paste links or type a keyword, press **Start**, and download the results as JSON, CSV, Excel, XML, or HTML.

### What can you do with Pinterest data?

- **Find trends.** Search a topic and see which images, products, and recipes people save, and which sites they link to.
- **Research competitors.** Collect every pin from a brand's profile or board with its saves and outbound links to see what works for them.
- **Find creators.** Each pin names its pinner with their follower count and verified badge, so you can shortlist accounts in your niche.
- **Collect images and videos.** Get full-size image links and MP4 or HLS video links for mood boards, datasets, or content audits.
- **Track your own account.** Run your profile or boards on a schedule and watch saves and reactions grow.
- **Build datasets.** Export thousands of pins with titles, descriptions, alt text, and colors for analysis or machine learning.

### What data does Pinterest Scraper extract?

| Group | Fields |
|---|---|
| Pin | ID, URL, title, description, alt text, creation date, promoted flag |
| Link | the website the pin links to and its domain |
| Image | full-size image URL, width, height, dominant color |
| Video | MP4 URL, HLS URL, duration, size, thumbnail (video pins only) |
| Engagement | saves, repins, comments, reactions |
| Hashtags | hashtags written in the description |
| Board | board ID, name, URL |
| Pinner | user ID, username, name, followers, verified badge, profile URL |
| Source | the kind of input (profile, board, pin, or search) and the URL or keyword that found the pin |

### How to scrape Pinterest

1. Open the actor and go to the **Input** tab.
2. Paste links into **Pinterest URLs**, add keywords to **Search queries**, or both.
3. Set **Max pins per source**.
4. Press **Start**. When the run finishes, open the **Output** tab to preview the table, or press **Export** to download the data.

### Input

| Field | Type | Description |
|---|---|---|
| `startUrls` | array | Pinterest links. See the supported links below. |
| `searchQueries` | array of strings | Keywords to search Pinterest pins for. |
| `maxItems` | integer | The maximum number of pins from each URL and each search query. |
| `proxyCountryCode` | string | A two-letter country code such as `US` or `DE` to use Apify residential proxy in that country. `None` uses Apify datacenter proxy. |

Supported links:

| Link | Example | What you get |
|---|---|---|
| Profile | `https://www.pinterest.com/nasa/` | the pins on the profile, newest first |
| Board | `https://www.pinterest.com/nasa/learn-with-nasa/` | the pins on the board |
| Pin | `https://www.pinterest.com/pin/142567144449027286/` | that one pin |
| Short link | `https://pin.it/...` | whatever the short link points to |
| Pin search | `https://www.pinterest.com/search/pins/?q=cats` | pins matching the query |
| Video search | `https://www.pinterest.com/search/videos/?q=pasta%20recipe` | video pins matching the query |

Any Pinterest domain works, for example `pinterest.co.uk` or `de.pinterest.com`. Board sections and pages such as `/ideas/` aren't supported, and the run skips them with a note in the log.

#### Input example

```json
{
  "startUrls": [
    { "url": "https://www.pinterest.com/nasa/" },
    { "url": "https://www.pinterest.com/nasa/learn-with-nasa/" },
    { "url": "https://www.pinterest.com/search/videos/?q=pasta%20recipe" }
  ],
  "searchQueries": ["cats"],
  "maxItems": 100,
  "proxyCountryCode": "None"
}
```

### Output

Every pin becomes one item in the dataset. Below is a real video pin from the NASA profile. Some long links are shortened.

```json
{
  "id": "142567144448951872",
  "url": "https://www.pinterest.com/pin/142567144448951872/",
  "title": "Adopt a Pixel with NASA's Nancy Grace Roman Telescope",
  "description": "Claim your pixel on one of the first images from NASA's Nancy Grace Roman Space Telescope! When Roman captures its first images, each pixel will represent a piece of the cosmos never seen before at this resolution. Claim your pixel and be part of this historic moment!",
  "altText": "An image of a nebula becomes pixelated and then narrows down to one, small, single pixel...",
  "link": "https://science.nasa.gov/mission/roman-space-telescope/adopt-a-pixel/",
  "domain": "science.nasa.gov",
  "imageUrl": "https://i.pinimg.com/originals/03/2c/95/032c95d3b48830a5620cb8df01fe934c.jpg",
  "imageWidth": 1080,
  "imageHeight": 1920,
  "isVideo": true,
  "video": {
    "url": "https://v1.pinimg.com/videos/iht/hevcMp4V3/a2/a7/b9/a2a7b90756b5ded4089b3e5ca36e7c09_720w.mp4",
    "hlsUrl": "https://v1.pinimg.com/videos/iht/hls/a2/a7/b9/a2a7b90756b5ded4089b3e5ca36e7c09.m3u8",
    "duration": 9.468,
    "width": 1080,
    "height": 1920,
    "thumbnail": "https://i.pinimg.com/videos/thumbnails/originals/a2/a7/b9/a2a7b90756b5ded4089b3e5ca36e7c09.0000000.jpg"
  },
  "dominantColor": "#133b66",
  "createdAt": "2026-09-03T13:52:00.000Z",
  "saves": 4,
  "repinCount": 4,
  "comments": 0,
  "reactions": 7,
  "hashtags": [],
  "isPromoted": false,
  "board": {
    "id": "142567213143159083",
    "name": "Learn With NASA",
    "url": "https://www.pinterest.com/nasa/learn-with-nasa/"
  },
  "pinner": {
    "id": "142567281862381039",
    "username": "nasa",
    "fullName": "NASA",
    "followers": 556488,
    "verified": true,
    "url": "https://www.pinterest.com/nasa/"
  },
  "sourceType": "profile",
  "input": "https://www.pinterest.com/nasa/"
}
```

#### Output fields

| Field | Description |
|---|---|
| `id` | The pin ID. Search results carry a search-only token starting with `e1_` instead; see the limits below. |
| `url` | Link to the pin. Missing for search results. |
| `title`, `description`, `altText` | The pin's title, description, and image description. |
| `link`, `domain` | The website the pin links to. |
| `imageUrl`, `imageWidth`, `imageHeight` | The largest image Pinterest serves, usually the original upload. |
| `isVideo`, `video` | Video pins only: MP4 and HLS links, length in seconds, size, and thumbnail. Some videos come as HLS only. |
| `dominantColor` | The main color of the image as a hex code. |
| `createdAt` | When the pin was created, ISO 8601 in UTC. |
| `saves`, `repinCount`, `comments` | Engagement counts. Missing for search results. |
| `reactions` | All reactions on the pin added up. |
| `hashtags` | Hashtags from the description. |
| `isPromoted` | `true` for ads. |
| `board` | The board the pin sits on. |
| `pinner` | The account that saved the pin, with its follower count. |
| `sourceType`, `input` | What kind of input found the pin, and the URL or keyword itself. |

### Limits

- **Search results carry less data.** For visitors who aren't logged in, Pinterest replaces pin IDs in search results with search-only tokens. Those tokens don't open a pin page, so search results have no `url`, and Pinterest doesn't send their saves, repins, or comments. Every other field, including the image, the outbound link, the board, and the pinner, is there. To get full data for a topic, scrape the boards or profiles that search turns up.
- **Boards sometimes stop early.** For logged-out visitors, a board feed sometimes ends after a page or two. When a board ends before the pin count Pinterest reports for it, the actor asks again from a new IP, up to 3 times in a row without new pins.
- **Private boards and secret pins** aren't visible without logging in, so the actor can't reach them.

### How fast is it?

The actor talks to Pinterest's own data endpoints over plain HTTP and doesn't run a browser, so it runs in 256 MB of memory. In our tests, 300 pins from a profile took about 6 seconds, 300 search results took about 13 seconds, and 600 pins from a board took about 31 seconds, including the retries described above.

### How much does it cost?

You pay **$0.50 per 1,000 pins**. Platform usage is included.

### Export and integrations

The results go into an Apify dataset. From there you can:

- download them as JSON, CSV, Excel, XML, HTML, or RSS from the **Output** tab;
- send them to Google Sheets, Slack, Zapier, Make, and other tools through Apify integrations;
- schedule runs to track profiles and boards over time;
- start runs and read the results from your own code through the Apify API.

```bash
curl -X POST "https://api.apify.com/v2/acts/<username>~pinterest-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"startUrls": [{"url": "https://www.pinterest.com/nasa/"}], "maxItems": 50}'
```

### FAQ

#### Do I need a Pinterest account?

No. The actor reads what Pinterest shows to visitors who aren't logged in.

#### Can I download the images and videos?

The results include direct links to the full-size image and to the video files. Pinterest serves them from its CDN, and the links keep working.

#### Why don't search results have a pin URL?

Pinterest gives logged-out visitors search-only tokens instead of pin IDs, and those don't open a pin page. Scrape the boards or profiles from the search results to get pins with full data and links.

#### Why did a board return fewer pins than it has?

Pinterest sometimes ends board feeds early for logged-out visitors. The actor retries from new IPs, but some boards still stop before the end. Running the board again usually gets further.

#### Is it legal to scrape Pinterest?

The actor collects only public data that anyone can see without logging in. Public pins can still contain personal data, so make sure you have a legitimate reason to collect it and follow the GDPR and other laws that apply to you. If you're not sure, ask a lawyer.

### Disclaimer

This actor is provided as is, without warranty. You're responsible for how you use it and for following Pinterest's terms of service and the laws that apply to you. Pinterest isn't affiliated with this actor.

# Actor input Schema

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

Links to Pinterest profiles (https://www.pinterest.com/nasa/), boards (https://www.pinterest.com/nasa/learn-with-nasa/), single pins (https://www.pinterest.com/pin/142567144449027286/), pin.it short links, or search pages (https://www.pinterest.com/search/pins/?q=cats).

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

Keywords to search Pinterest pins for. Search results carry less data than profile and board pins; see the README.

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

The maximum number of pins to scrape from each URL and each search query.

## `proxyCountryCode` (type: `string`):

Two-letter country code (US, DE, ...) to use Apify residential proxy in that country. "None" uses Apify datacenter proxy.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.pinterest.com/nasa/"
    }
  ],
  "maxItems": 50,
  "proxyCountryCode": "None"
}
```

# Actor output Schema

## `pins` (type: `string`):

One item per Pinterest pin found by the start URLs and search queries.

# 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 = {
    "startUrls": [
        {
            "url": "https://www.pinterest.com/nasa/"
        }
    ],
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("donjuan_mime/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 = {
    "startUrls": [{ "url": "https://www.pinterest.com/nasa/" }],
    "maxItems": 50,
}

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

```

## MCP server setup

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