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

Scrape public Pinterest pins, boards, profiles, images and video links by keyword or URL. No login needed. Pay per delivered record, no start fee. Independent tool, not affiliated with Pinterest.

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

## Pricing

Pay per event

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, Boards, Profiles & Videos

Turn public Pinterest pages and keyword searches into clean, structured data. Collect pins, boards, profiles, full-size images, video links, descriptions and outbound links without a Pinterest account.

It's built for marketers, ecommerce teams, content creators, designers and researchers who want to see what's working in a niche. Paste Pinterest URLs or keywords, then export the results to JSON, CSV or Excel, or send them to your own tools through the API.

💰 **Pricing:** $1.50 per 1,000 pins or boards and $3 per 1,000 profiles. No start fee, and platform usage is included.

**Data source:** [Pinterest](https://www.pinterest.com/)

### What can you do with this Actor?

- **Spot visual trends:** see which images, topics and hashtags appear for the keywords in your niche.
- **Research competitors:** review a brand's public boards and pins, and see where its pins link.
- **Plan content:** collect titles, descriptions and hashtags to inform your own Pinterest strategy.
- **Analyze video content:** find video pins with their duration, size and video links.
- **Build reference sets:** gather image links for design, product and creative research.
- **Feed your workflows:** send structured pin data to spreadsheets, dashboards, databases or AI tools.

### How to use this Actor

- 👉 **Register for a free Apify account** — no credit card required.
- 🎉 Just click [**Sign up free on Apify →**](https://console.apify.com/sign-up?fpr=1h3gvi) and complete a quick signup.
- 💰 A free Apify account includes $5 in monthly credits — enough to test this Actor.
- ⏳ Start on Apify's free plan, with no commitment or upfront payment required.
- 📌 Open the Actor, then add Pinterest URLs, search keywords, or both.
- ▶️ Click **Start** and export the results to JSON, CSV, Excel, or use them through the API.

### Features

- **Keyword search** for all pins, or for video pins only
- **Mixed URLs in one run:** pins, boards, board sections, profiles and `pin.it` short links, each detected automatically
- **Full pin details:** title, description, every image size, hashtags, outbound link and creator
- **Video details:** MP4 or HLS links, duration, dimensions and thumbnail, when Pinterest provides them
- **Board and profile records:** bio, website, owner, and follower, pin and board counts
- **One cost ceiling:** **Max records** covers the whole run, across all sources and record types
- **Fair sharing:** keywords and URLs split **Max records** evenly, so the first one can't use it all
- **Duplicate protection:** a repeated pin is skipped and isn't charged again in the same run
- **Clear run reports:** `RUN_SUMMARY` shows what each source returned and why anything stopped early
- **Honest values:** anything Pinterest doesn't show is `null`, never a guess or a zero

### Data fields

Every row has a `recordType` of `pin`, `board` or `profile`, so record types are easy to tell apart. The main fields are below, and the **Output** tab describes them all.

#### Pins

| Field | Description |
|---|---|
| `pinId` | Pin ID: numeric, or an encoded token starting `e1_` |
| `pinIdType` | `numeric` or `encoded` |
| `pinUrl` | Link to the pin, or `null` for encoded IDs |
| `title` | Pin title |
| `description` | Pin description |
| `imageUrl` | Display-size image link |
| `originalImageUrl` | Full-size image link |
| `imageVariants` | Every available image size |
| `isVideo` | `true` for video pins |
| `videoUrl` | Best video link: MP4 where available, otherwise HLS |
| `videoDuration` | Video length in seconds |
| `creatorUsername` | Username of the person who saved the pin |
| `boardName` | Board the pin belongs to |
| `boardUrl` | Link to that board |
| `destinationUrl` | Outbound link |
| `domain` | Domain of the outbound link |
| `saveCount` | Saves, when Pinterest shows them |
| `commentCount` | Comments, when Pinterest shows them |
| `reactionCount` | Reactions, when Pinterest shows them |
| `hashtags` | Hashtags found in the title and description |
| `createdAt` | When the pin was created (UTC) |

#### Boards

| Field | Description |
|---|---|
| `boardName` | Board name |
| `boardUrl` | Board link |
| `description` | Board description |
| `ownerUsername` | Board owner's username |
| `pinCount` | Pins on the board |
| `sectionCount` | Sections on the board |
| `followerCount` | Board followers |
| `coverImageUrl` | Cover image link |

#### Profiles

| Field | Description |
|---|---|
| `username` | Profile username |
| `displayName` | Display name |
| `profileUrl` | Profile link |
| `biography` | Profile bio |
| `avatarUrl` | Profile picture link |
| `websiteUrl` | Website listed on the profile |
| `followerCount` | Followers |
| `followingCount` | Accounts followed |
| `boardCount` | Public boards |
| `pinCount` | Pins on the profile |

Every record also includes `sourceType`, `sourceQuery`, `sourceUrl` and `scrapedAt`, so you can see how it was found.

### Input

Add at least one URL or keyword.

| Input | Type | Description |
|---|---|---|
| `startUrls` | array | Pinterest URLs of any supported type |
| `searchQueries` | array | Keywords to search |
| `searchType` | string | `pins` for all pins or `videos` for video pins only. Default: `pins` |
| `maxItems` | integer | Most records in the run, from 1 to 100,000. Default: 100 |
| `scrapePins` | boolean | Save pins from boards and profiles. Default: `true` |
| `scrapeBoards` | boolean | Save board records. Default: `true` |
| `scrapeProfileDetails` | boolean | Save profile records. Default: `true` |
| `maxBoardsPerProfile` | integer | Boards to save per profile, from 0 to 1,000. Default: 25 |
| `enrichPinDetails` | boolean | Open each profile pin for extra fields such as comment counts. Slower. Default: `false` |
| `includeVideoMetadata` | boolean | Add video links and details. Default: `true` |
| `includeImageVariants` | boolean | List every image size. Default: `true` |
| `maxConcurrency` | integer | Requests at once, from 1 to 10. Default: 3 |
| `requestTimeoutSecs` | integer | Wait per request, from 5 to 120 seconds. Default: 30 |
| `maxRetries` | integer | Retries per failed request, from 0 to 5. Default: 2 |
| `proxyConfiguration` | object | Optional connection route. Default: none |

**Supported URLs:**

| Type | Example |
|---|---|
| Pin | `https://www.pinterest.com/pin/424605071146264261/` |
| Board | `https://www.pinterest.com/pinterest/official-news/` |
| Board section | `https://www.pinterest.com/bhg/better-homes-and-gardens-collection/shop-better-homes-gardens-at-walmart/` |
| Profile | `https://www.pinterest.com/pinterest/` |
| Short link | `https://pin.it/1I8EjfvXA` |
| Search page | `https://www.pinterest.com/search/pins/?q=modern%20bedroom` |

Country sites such as `pinterest.co.uk` also work. Idea and topic pages aren't supported.

Example input:

```json
{
  "searchQueries": ["modern bedroom design"],
  "startUrls": [{ "url": "https://www.pinterest.com/pinterest/official-news/" }],
  "maxItems": 50
}
```

### Output

Results are saved to the run's dataset. You can view them in the **Output** tab, export them to JSON, CSV, Excel, XML or HTML, or fetch them through the API.

The **Pins**, **Boards** and **Profiles** views show the main columns for each type, and each view lists every record in the run. In a mixed run, use the `recordType` column in the first position to tell rows apart. A column a record doesn't have may show as `undefined` in the Console table and is empty in CSV.

Each run also saves `RUN_SUMMARY` to its key-value store, with the result and stop reason for every source.

A real video pin, shortened:

```json
{
  "recordType": "pin",
  "pinId": "554857616617647721",
  "pinIdType": "numeric",
  "pinUrl": "https://www.pinterest.com/pin/554857616617647721/",
  "title": null,
  "description": "Sweet Potato Cornbread by @brandongouveia 🍠 A cozy twist on a classic!",
  "imageUrl": "https://i.pinimg.com/736x/11/10/2e/11102eff37591dcc9c0d2427a573a61c.jpg",
  "originalImageUrl": "https://i.pinimg.com/originals/11/10/2e/11102eff37591dcc9c0d2427a573a61c.jpg",
  "imageWidth": 720,
  "imageHeight": 1280,
  "isVideo": true,
  "videoUrl": "https://v1.pinimg.com/videos/iht/expMp4/09/d8/a4/09d8a4ba21704dcb6cbe98aef1977fc7_720w.mp4",
  "videoHlsUrl": "https://v1.pinimg.com/videos/iht/hls/09/d8/a4/09d8a4ba21704dcb6cbe98aef1977fc7.m3u8",
  "videoDuration": 49.933,
  "creatorName": "Tasty",
  "creatorUsername": "buzzfeedtasty",
  "creatorUrl": "https://www.pinterest.com/buzzfeedtasty/",
  "boardName": "Social",
  "boardUrl": "https://www.pinterest.com/buzzfeedtasty/_tpd_social/",
  "destinationUrl": "https://www.instagram.com/reel/DfSXsmMiAYa/",
  "domain": "instagram.com",
  "saveCount": 0,
  "commentCount": 0,
  "reactionCount": null,
  "hashtags": [],
  "createdAt": "2026-11-04T15:47:22Z",
  "sourceType": "pin",
  "sourceQuery": null,
  "sourceUrl": "https://www.pinterest.com/pin/554857616617647721/",
  "scrapedAt": "2026-11-04T19:58:08Z"
}
```

### Pricing

You pay only for records delivered to your dataset.

| Record | Price per record | Per 1,000 records |
|---|---|---|
| Pin | $0.0015 | $1.50 |
| Board | $0.0015 | $1.50 |
| Profile | $0.003 | $3.00 |

There is no start fee, and platform usage is included in these prices.

For example, a run that delivers 1 profile, 10 boards and 89 pins costs $0.1515.

Failed requests, invalid URLs, empty results and skipped duplicates aren't charged.

### Examples / Ready-to-use Tasks

#### Home Decor Trend Research

Compare what appears for two related keywords.

```json
{
  "searchQueries": ["minimalist kitchen", "bohemian living room"],
  "maxItems": 100
}
```

#### Brand Profile Audit

Collect a brand's profile details, 10 of its boards, and pins for the remaining records.

```json
{
  "startUrls": [{ "url": "https://www.pinterest.com/marthastewart/" }],
  "maxBoardsPerProfile": 10,
  "maxItems": 100
}
```

#### Recipe Video Research

Find recipe videos with their links and durations.

```json
{
  "searchQueries": ["easy dinner recipe"],
  "searchType": "videos",
  "maxItems": 50
}
```

#### Board Content Export

Save one board and its pins.

```json
{
  "startUrls": [{ "url": "https://www.pinterest.com/pinterest/official-news/" }],
  "maxItems": 40
}
```

### API & Integrations

Run the Actor and get its results in one API call:

```bash
curl -X POST "https://api.apify.com/v2/acts/zapticx~pinterest-scraper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchQueries":["modern bedroom design"],"maxItems":20}'
```

Python:

```python
import os

from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("zapticx/pinterest-scraper").call(
    run_input={"searchQueries": ["modern bedroom design"], "maxItems": 20}
)
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item["recordType"], item.get("title"))
```

JavaScript:

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('zapticx/pinterest-scraper').call({
    searchQueries: ['modern bedroom design'],
    maxItems: 20,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length);
```

You can also schedule runs and send results to Google Sheets, Make, Zapier, n8n, webhooks, databases or dashboards.

### Limitations

- **Pin links:** Pinterest shows logged-out visitors an encoded `pinId` in search results and on boards. It doesn't open a pin, so `pinUrl` is `null` there, and it can't be used as input. Profiles, board sections and pin URLs return numeric IDs and working links.
- **Engagement:** `saveCount` and `commentCount` are `null` in search results, and `reactionCount` isn't available on every pin.
- **Result depth:** Pinterest decides how many results it shows logged-out visitors, and one keyword may stop at several hundred pins. For more, use several specific keywords.
- **Board depth:** Pinterest often limits how far logged-out visitors can page through a board. A run may return only the first page, about 25 pins, even on a large board. The source then reports `FEED_CUT_SHORT` in `RUN_SUMMARY`, and you pay only for what was delivered.
- **Availability:** Pinterest can limit logged-out access on a connection, so results may vary between runs. Search reports `SEARCH_UNAVAILABLE` when it can't return results. You can start a new run or choose a route in the **Proxy** setting.
- **Public content only:** private boards and login-only data aren't available. Images and videos are returned as links, not downloaded.
- **Your data use:** you're responsible for how you use the results. Check Pinterest's terms and the laws that apply to you, especially for personal data and copyrighted images.

***

Built by **Zapticx** — AI automation and data solutions.

### Search keywords

pinterest scraper, pinterest api, apify pinterest, pinterest data extraction, pinterest data, pinterest pins scraper, pinterest board scraper, pinterest profile scraper, pinterest video scraper, pinterest search scraper, pinterest image scraper, pinterest trends research, pin data export, social media scraper

**Disclaimer**: This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by **Pinterest, Inc.**

# Actor input Schema

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

Pin, board, profile or pin.it short links. The type of each URL is detected automatically, and you can mix types in one run.

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

Keywords to search on Pinterest. Each keyword runs separately, and keywords share Max records evenly.

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

Search all pins, or only video pins.

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

The most records to save in this run, across all URLs and keywords and all record types. This is also your cost ceiling.

## `scrapePins` (type: `boolean`):

Save the pins found on boards and profiles. Turn off to collect only board or profile details.

## `scrapeBoards` (type: `boolean`):

Save a record for each board URL, and for each board listed on a profile URL.

## `scrapeProfileDetails` (type: `boolean`):

Save a record with the bio, website and counts for each profile URL.

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

How many of a profile's boards to save. Set 0 to skip them.

## `enrichPinDetails` (type: `boolean`):

Fetch each profile pin's own page to add comment counts and other fields missing from the profile feed. Slower. Does not apply to search or board pins.

## `includeVideoMetadata` (type: `boolean`):

Add video links, duration, size and thumbnail to video pins.

## `includeImageVariants` (type: `boolean`):

List every image size Pinterest offers for each pin. Turn off for a smaller dataset.

## `maxConcurrency` (type: `integer`):

How many requests run at once.

## `requestTimeoutSecs` (type: `integer`):

How long to wait for each Pinterest reply.

## `maxRetries` (type: `integer`):

How many times to retry a failed request.

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

Connection route. Leave as it is unless you have a reason to change it.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.pinterest.com/pinterest/official-news/"
    }
  ],
  "searchType": "pins",
  "maxItems": 20,
  "scrapePins": true,
  "scrapeBoards": true,
  "scrapeProfileDetails": true,
  "maxBoardsPerProfile": 25,
  "enrichPinDetails": false,
  "includeVideoMetadata": true,
  "includeImageVariants": true,
  "maxConcurrency": 3,
  "requestTimeoutSecs": 30,
  "maxRetries": 2
}
```

# Actor output Schema

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

Every record, opening on the pin view.

## `boards` (type: `string`):

Board records.

## `profiles` (type: `string`):

Profile records.

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

What each source returned, what failed and why the run stopped.

# 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/pinterest/official-news/"
        }
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("zapticx/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/pinterest/official-news/" }],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("zapticx/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/pinterest/official-news/"
    }
  ],
  "maxItems": 20
}' |
apify call zapticx/pinterest-scraper --silent --output-dataset

```

## MCP server setup

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