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

Scrape Pinterest without login: up to 250 search results per request, plus boards, profiles and single pins. Every pin has original image URL, video URL, title, description, link and domain, save count, pinner and board; boards and profiles add follower and pin counts. JSON/CSV, API, schedules.

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

## Pricing

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

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

## Pinterest Scraper: Pins, Boards, Search & Videos

Collect public Pinterest data without a browser, login, or cookies. Give the Actor
search keywords or Pinterest URLs and it returns clean JSON for every pin, board,
and profile: pin ID, title, description, original-resolution image URL, video URL,
outbound link and domain, save count, pinner, board, hashtags and creation date.
This is an **unofficial** tool and is not affiliated with or endorsed by Pinterest.

### What does Pinterest Scraper do?

- **Keyword search** – scrape pins for any search query, or switch the scope to
  video pins, boards, or profiles.
- **Pin pages** – paste `https://www.pinterest.com/pin/<id>/` (or a `pin.it`
  short link) and get the full pin record with engagement counts.
- **Boards** – paste a board URL and receive the board metadata (name,
  description, pin count, followers) plus its pins.
- **Profiles** – paste a profile URL and receive the profile metadata (bio,
  followers, pin and board counts) plus the pins the user created or saved.

Results land in the run's dataset and can be exported as JSON, CSV, Excel, or
fetched through the Apify API. No browser is started, so runs are fast and cheap:
a single request fetches up to 250 search results.

### Why use it?

- **No login or cookies** – only public, logged-out data is read, so your
  Pinterest account is never at risk.
- **Original image URLs** – `imageUrl` points at `i.pinimg.com/originals/...`,
  the highest resolution Pinterest serves; 736px and 236px variants are included
  as well.
- **Video support** – video pins include the MP4 URL, HLS playlist, dimensions,
  duration, and thumbnail.
- **Engagement metrics** – save count, repin count, comment count, share count
  and reactions, which most lightweight scrapers omit.
- **Pay only for results** – you are charged per pin, board, or profile that is
  actually stored. Failed sources cost nothing.

### How to use it

1. Open the Actor in Apify Console and enter one or more **Search queries**
   (for example `modern kitchen design`) and/or **Pin, board, profile or search
   URLs**.
2. Set **Maximum pins per source**. Each query, board, or profile stops after
   this many pins.
3. Optionally change the **Search scope** to video pins, boards, or profiles, and
   choose whether profile URLs should return created pins, saved pins, or only
   the profile record.
4. Click **Start**. Results appear in the **Dataset** tab; download them in the
   format you need or connect the run to your workflow with the API,
   integrations, or scheduler.

### Input

| Field | Type | Default | Notes |
|---|---|---|---|
| `searchQueries` | array of strings | – | Keywords to search. |
| `searchScope` | `pins` / `videos` / `boards` / `users` | `pins` | Kind of search result to collect. |
| `startUrls` | array of strings | – | Pin, board, profile, search page, or `pin.it` URLs. Any Pinterest country domain works. |
| `maxPinsPerSource` | integer | 50 | Cap per query, board, or profile (1–5000). |
| `profilePins` | `created` / `saved` / `none` | `created` | Which pins to collect for profile URLs. |
| `fetchPinDetails` | boolean | `true` | Search results lack engagement counts; enabling this fetches the full pin record for each search pin (one extra request per pin). |
| `proxyConfiguration` | object | Apify Proxy on | Proxy settings; the session rotates every 25 requests. |

Example input:

```json
{
  "searchQueries": ["modern kitchen design"],
  "startUrls": ["https://www.pinterest.com/homedecor/curate-your-kitchen-shelves/"],
  "maxPinsPerSource": 50,
  "fetchPinDetails": true
}
```

### Output

Each dataset item has a `type` of `pin`, `board`, or `profile`, plus `source`
(which query or URL produced it) and `scrapedAt`.

```json
{
  "type": "pin",
  "id": "435441857742802519",
  "url": "https://www.pinterest.com/pin/435441857742802519/",
  "title": "Mid-century Modern Home Paint Palette",
  "description": "Youthful Home Colors, Saturated Paint Tones, ...",
  "altText": "a kitchen with white cabinets and wood flooring",
  "link": "https://www.etsy.com/listing/1744469622/mid-century-modern-home-paint-palette",
  "domain": "etsy.com",
  "imageUrl": "https://i.pinimg.com/originals/ee/a9/36/eea936a0aacafb70bda6a41f6b50fb22.jpg",
  "imageWidth": 470,
  "imageHeight": 836,
  "isVideo": false,
  "video": null,
  "saveCount": 13098,
  "repinCount": 1173,
  "commentCount": 0,
  "shareCount": 87,
  "hashtags": [],
  "createdAt": "2025-11-30T17:03:38+00:00",
  "pinner": {"id": "435441995129835993", "username": "nmbtooth", "fullName": "Nichole Donaldson", "followerCount": 38, "profileUrl": "https://www.pinterest.com/nmbtooth/"},
  "board": {"id": "435441926410593228", "name": "Ideas for the House", "url": "https://www.pinterest.com/nmbtooth/ideas-for-the-house/"},
  "source": "pin:https://www.pinterest.com/pin/435441857742802519/",
  "scrapedAt": "2026-09-14T05:10:00+00:00"
}
```

### Data fields

**Pin** (`type: "pin"`): `id`, `url`, `title`, `description`, `altText`, `link`,
`domain`, `isUploaded`, `imageUrl` (original resolution), `imageWidth`,
`imageHeight`, `imageUrl736`, `imageUrl236`, `dominantColor`, `isVideo`,
`video` (`url`, `hlsUrl`, `width`, `height`, `durationMs`, `thumbnailUrl`),
`isIdeaPin`, `ideaPinPageCount`, `isPromoted`, `isRepin`, `saveCount`,
`repinCount`, `commentCount`, `shareCount`, `reactionCounts`, `hashtags`,
`createdAt`, `pinner` (`id`, `username`, `fullName`, `followerCount`,
`profileUrl`, `imageUrl`), `pinnerUsername`, `board` (`id`, `name`, `url`,
`pinCount`), `boardName`, `boardUrl`, `productPrice`, `productCurrency`.

**Board** (`type: "board"`): `id`, `url`, `name`, `description`, `pinCount`,
`sectionCount`, `followerCount`, `collaboratorCount`, `privacy`, `category`,
`coverImageUrl`, `lastPinnedAt`, `owner`, `ownerUsername`.

**Profile** (`type: "profile"`): `id`, `url`, `username`, `fullName`, `about`,
`websiteUrl`, `imageUrl`, `pinCount`, `boardCount`, `followerCount`,
`followingCount`, `videoPinCount`, `isVerifiedMerchant`, `isPartner`,
`createdAt`, `lastPinSaveAt`.

### Pricing

Pay per event: one `pin` event for every pin stored, one `board` event for every
board record, and one `profile` event for every profile record. Enabling
`fetchPinDetails` does not add events – the enriched pin is still one `pin`.
Failed URLs, unknown pins, and empty searches are never charged. See the
**Pricing** tab for the current rates and set a maximum charge per run to stay
within budget.

### Tips

- Search results are ranked by Pinterest for logged-out visitors, which is
  close to what an incognito browser sees for the same keyword.
- Set `fetchPinDetails` to `false` when you only need titles, links, and images;
  runs are then roughly ten times faster.
- Board and profile pins already include save counts, so no extra requests are
  made for them.
- Country domains such as `kr.pinterest.com` or `pinterest.co.uk` are accepted.
- Keep Apify Proxy enabled for larger runs; Pinterest tolerates modest volumes
  from a single IP, but rotating sessions avoids throttling.

### FAQ

**Is it legal to scrape Pinterest?** The Actor reads only data Pinterest shows to
anyone without an account. You are responsible for using the results in line with
Pinterest's terms and applicable laws, including personal-data regulations when
storing pinner profiles.

**Can it scrape private boards, secret pins, or my home feed?** No. Anything that
needs a login is out of scope by design.

**Why is `saveCount` null for some pins?** Search results do not carry engagement
data. Enable `fetchPinDetails` (default) to look up each search pin, or paste the
pin URL directly.

**Why does `link` come back empty?** Many pins are direct uploads with no outbound
website; `isUploaded` is `true` in that case.

**Does it download images or videos?** No, it returns URLs. Feed them to your own
downloader or another Actor if you need the files.

**Something stopped working.** Pinterest changes its internal API from time to
time. Open an issue on the Actor page and it will be investigated promptly.

# Actor input Schema

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

Keywords to search on Pinterest, one per line. Each query returns up to 'Maximum pins per source' public pins (or boards/profiles when the search scope is changed).

## `searchScope` (type: `string`):

What kind of Pinterest search results to collect for the search queries. 'Pins' and 'Video pins' produce pin records; 'Boards' produces board records; 'Profiles' produces profile records.

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

Public Pinterest URLs, one per line. Supported: pin pages (https://www.pinterest.com/pin/123456/), boards (https://www.pinterest.com/username/board-slug/), profiles (https://www.pinterest.com/username/), search pages (https://www.pinterest.com/search/pins/?q=keyword) and pin.it short links. Boards and profiles return their metadata plus up to 'Maximum pins per source' pins.

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

Maximum number of pins (or boards/profiles for those search scopes) collected from each search query, board or profile. A single pin URL always yields one record.

## `profilePins` (type: `string`):

For profile URLs: collect the pins the user created, the pins they saved to public boards, or only the profile record.

## `fetchPinDetails` (type: `boolean`):

Search results do not include the save count. When enabled, the Actor makes one extra request per search pin to add saveCount, repinCount, commentCount, shareCount, hashtags and video URLs. Disable for faster, cheaper runs that only need titles, links and images.

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

Apify Proxy settings. Enabled by default so that Pinterest sees rotating IP addresses; the Actor changes the proxy session every 25 requests.

## Actor input object example

```json
{
  "searchQueries": [
    "modern kitchen design"
  ],
  "searchScope": "pins",
  "startUrls": [],
  "maxPinsPerSource": 30,
  "profilePins": "created",
  "fetchPinDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (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": [
        "modern kitchen design"
    ],
    "searchScope": "pins",
    "startUrls": [],
    "maxPinsPerSource": 30,
    "profilePins": "created",
    "fetchPinDetails": true,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("kyungminlee/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": ["modern kitchen design"],
    "searchScope": "pins",
    "startUrls": [],
    "maxPinsPerSource": 30,
    "profilePins": "created",
    "fetchPinDetails": True,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("kyungminlee/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": [
    "modern kitchen design"
  ],
  "searchScope": "pins",
  "startUrls": [],
  "maxPinsPerSource": 30,
  "profilePins": "created",
  "fetchPinDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call kyungminlee/pinterest-scraper --silent --output-dataset

```

## MCP server setup

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