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

Scrape Pinterest pins by keyword, board, profile or pin URL. Get saves, repins, comments, shares, images, video links and creator data. Export to CSV, JSON, Excel or XML.

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

## Pricing

from $2.00 / 1,000 pinterest pin scrapeds

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

![ParseForge Banner](https://github.com/ParseForge/apify-assets/blob/ad35ccc13ddd068b9d6cba33f323962e39aed5b2/banner.jpg?raw=true)

## 📌 Pinterest Scraper

> 🚀 **Export Pinterest pins in seconds.** 36 fields per pin at roughly 11 pins per second, including the save, repin, comment, share and reaction counts that feed scrapers leave behind.

Pinterest is a search engine wearing a mood board, and the numbers that tell you whether an idea travelled are the saves and repins. Most Pinterest tools read the search feed, which does not carry those counts at all. This Actor collects the feed and then opens each pin's own record, so every row arrives with the complete engagement set, the original creator behind a repin, the board it lives on, direct image and video URLs, and the visual topic labels Pinterest's own model assigns to the image. No login, no cookie, no API key.

Every run returns **36 fields per pin** with the same columns on every row. A 150 pin run finished in 14 seconds in testing. Four input types share one output shape: keyword searches, board URLs, profile URLs and individual pin URLs all produce identical rows, so a spreadsheet built on one never breaks when you switch to another.

| 🎯 Target Audience | 💡 Primary Use Cases |
|---|---|
| Content and SEO teams | Find which pins in a niche actually earn saves, and mine Pinterest's own topic labels for keywords. |
| Ecommerce and DTC brands | Track which product imagery gets repinned and which outbound domains own a category. |
| Creators and pin designers | Study the formats, colours and lengths that travel in your vertical before making the next batch. |
| Trend and market researchers | Build dated corpora of visual trends with real engagement attached to each image. |

### 📋 What the Pinterest Scraper does

> 💡 **Why it matters:** Pinterest's search feed is deliberately thin. It hands out titles, images and creators, but not a single engagement number. That is why so many Pinterest datasets tell you what exists and nothing about what worked. This Actor pays the extra call per pin so the saves, repins, comments, shares and reactions are actually in your spreadsheet.

- 💾 **Full engagement set.** `saveCount`, `repinCount`, `commentCount`, `shareCount` and `reactionCount` on every pin, not just saves.
- 🧭 **Four input types, one schema.** Search terms, board URLs, profile URLs and pin URLs all return the same 36 columns.
- ✍️ **Repin provenance.** When a pin is a repin, `originalCreatorUsername` names who actually made it, alongside the account that pinned it.
- 🏷 **Pinterest's own visual topics.** The `visualAnnotations` array carries the topic labels Pinterest's image model assigns, which read as ready made long tail keywords.
- 🎥 **Direct media links.** Full resolution image URLs, plus direct MP4 URLs and duration for video and Idea pins.
- 🌐 **Outbound destinations.** The link a pin points at and its domain, for tracking who is driving traffic in a category.
- 🎨 **Design metadata.** Dominant colour, pixel width and height, and the media type of every pin.
- ⚡ **Plain HTTP, no browser.** 512 MB, no proxy needed by default, roughly 11 pins per second.

### 🎬 Full Demo (🚧 Coming soon)

A short walkthrough video is in production and will land here.

### 📊 Output

Each pin becomes one flat row. These are the main fields:

| Field | Type | Description |
|---|---|---|
| 🖼 `imageUrl` | string | Full resolution pin image. |
| 📌 `title` | string | Pin title as shown on Pinterest. |
| 🔗 `pinUrl` | string | Canonical pin link. |
| 🆔 `pinId` | string | Pinterest's numeric pin ID. |
| 📝 `description` | string | Pin description written by the creator. |
| 👁 `altText` | string | Pinterest's own generated image description. |
| 🕒 `createdAt` | string | Exact pin creation time in ISO 8601. |
| 🎞 `mediaType` | string | `Image`, `Video` or `Idea Pin`. |
| ▶️ `videoUrl` | string | Direct MP4 URL for video and Idea pins. |
| ⏱ `videoDurationSeconds` | integer | Video length in seconds. |
| 💾 `saveCount` | integer | Total times the pin has been saved. |
| 📍 `repinCount` | integer | Times the pin was repinned to another board. |
| 💬 `commentCount` | integer | Number of comments on the pin. |
| 📤 `shareCount` | integer | Times the pin was shared off platform. |
| ❤️ `reactionCount` | integer | Total reactions on the pin. |
| 🌐 `outboundLink` | string | The destination a pin points at. |
| 🏷 `linkDomain` | string | Domain of the destination, or Pinterest's own label for uploads. |
| ♻️ `isRepin` | string | Yes when this pin is a repin of someone else's. |
| ✍️ `originalCreatorUsername` | string | The account that actually created the image. |
| 🔗 `originalCreatorProfileUrl` | string | Original creator's profile link. |
| 👤 `pinnerUsername` | string | The account that pinned it. |
| 🙋 `pinnerFullName` | string | Pinner display name. |
| 🔗 `pinnerProfileUrl` | string | Pinner profile link. |
| 👥 `pinnerFollowerCount` | integer | Pinner's follower count. |
| ✅ `pinnerIsVerifiedMerchant` | string | Yes for Pinterest verified merchants. |
| 📋 `boardName` | string | Board the pin sits on. |
| 🔗 `boardUrl` | string | Board link. |
| ↔️ `imageWidth` / ↕️ `imageHeight` | integer | Image dimensions in pixels. |
| 🎨 `dominantColor` | string | Pinterest's computed dominant colour as a hex code. |
| 🧭 `sourceType` | string | `Search`, `Board`, `Profile` or `Pin URL`. |
| 🔎 `sourceInput` | string | The exact input that produced this row. |
| 🏷 `visualAnnotations` | array | Topic labels Pinterest's image model assigns. |
| #️⃣ `hashtags` | array | Hashtags found in the description. |
| 🕒 `scrapedAt` | string | Collection timestamp. |
| ❌ `error` | string | Populated only on a failed pin. |

Three real records from live runs:

```json
{
  "imageUrl": "https://i.pinimg.com/originals/00/28/4f/00284fe2cbedd1ed029707e71ad46ed6.png",
  "title": "Pinterest-Worthy Cozy Home Decor Inspiration",
  "pinUrl": "https://www.pinterest.com/pin/7740630607091285/",
  "pinId": "7740630607091285",
  "description": "Warm lighting, cute decor, and cozy vibes to inspire your dream living room.",
  "altText": "a living room filled with furniture and lots of pictures on the wall above it's coffee table",
  "createdAt": "2026-08-14T18:37:17.000Z",
  "mediaType": "Image",
  "saveCount": 870,
  "repinCount": 108,
  "commentCount": 0,
  "shareCount": 3,
  "reactionCount": 34,
  "isRepin": "Yes",
  "originalCreatorUsername": "sumayyaabraz",
  "pinnerUsername": "campbellsyd2832",
  "pinnerFullName": "Nurtured Wellness with Sydney",
  "pinnerFollowerCount": 19,
  "boardName": "DREAM LIFE 2026",
  "boardUrl": "https://www.pinterest.com/campbellsyd2832/dream-life-2026/",
  "imageWidth": 1024,
  "imageHeight": 1536,
  "dominantColor": "#5f391a",
  "sourceType": "Search",
  "visualAnnotations": ["Room Decor Renter Friendly", "Apartment Decor Inspiration Cozy Chic", "Cute Apartment Ideas", "Cozy Lighting", "Room Decor Aesthetic"]
}
```

```json
{
  "imageUrl": "https://i.pinimg.com/originals/b1/a1/bf/b1a1bf47c1ec7e644031379e63a92cf3.jpg",
  "title": "Unleash the Flavor Explosion: Must-Try Chicken Pesto Pasta",
  "pinUrl": "https://www.pinterest.com/pin/924504629771869448/",
  "pinId": "924504629771869448",
  "createdAt": "2025-12-31T20:30:21.000Z",
  "mediaType": "Video",
  "videoUrl": "https://v1.pinimg.com/videos/iht/expMp4/75/df/ee/75dfee7711d17fdbb251581b8104ee83_720w.mp4",
  "videoDurationSeconds": 62,
  "saveCount": 2495,
  "repinCount": 1089,
  "commentCount": 6,
  "shareCount": 147,
  "reactionCount": 339,
  "isRepin": "No",
  "originalCreatorUsername": "TasteBox1",
  "pinnerUsername": "TasteBox1",
  "boardName": "cooking",
  "imageWidth": 576,
  "imageHeight": 1024,
  "sourceType": "Search",
  "visualAnnotations": ["Pasta Meal Recipes", "Pasta With Chicken Recipe", "Cooking Recipes For Dinner", "Healthy Food Menu", "Yummy Pasta Recipes"]
}
```

```json
{
  "imageUrl": "https://i.pinimg.com/originals/52/0c/50/520c505746125d375dbb7b8f649d5e3e.png",
  "title": "home decor ideas",
  "pinUrl": "https://www.pinterest.com/pin/27232772742568396/",
  "pinId": "27232772742568396",
  "description": "Not Disclosed",
  "altText": "a living room filled with furniture and a flat screen tv sitting on top of a wooden table",
  "createdAt": "2026-08-18T02:45:48.000Z",
  "mediaType": "Idea Pin",
  "saveCount": 857,
  "repinCount": 74,
  "commentCount": 1,
  "shareCount": 3,
  "reactionCount": 58,
  "isRepin": "Yes",
  "originalCreatorUsername": "mrrabbit245",
  "pinnerUsername": "whitneymbauer",
  "boardName": "Home",
  "dominantColor": "#86603d",
  "sourceType": "Search",
  "visualAnnotations": ["Home Decor"]
}
```

### ✨ Why choose this Actor

- **The counts other scrapers skip.** Pinterest's search feed carries no engagement data at all. This Actor opens each pin's own record so saves, repins, comments, shares and reactions are on every row.
- **Provenance, not just attribution.** Most pins in a search feed are repins. `originalCreatorUsername` tells you who actually made the image, which is the account worth contacting.
- **Free keyword research.** `visualAnnotations` returns the topic labels Pinterest's own image model assigns. They read like the long tail queries Pinterest expects the image to rank for.
- **Fast and light.** Plain HTTP, 512 MB, no browser, no proxy by default. Roughly 11 pins per second.
- **Clean, stable schema.** 36 columns, identical on every row, with sentinels instead of nulls so CSV and Excel imports stay predictable.
- **Honest about its limits.** The ceiling below tells you what this Actor cannot reach, before you spend anything.

### 📈 How it compares to alternatives

| | This Actor | Typical Pinterest scrapers |
|---|---|---|
| Fields per pin | 36 | Commonly 12 to 18 |
| Saves | Yes | Usually yes |
| Repins | Yes | Sometimes |
| Comments count | Yes | Sometimes |
| Shares | Yes | Rare |
| Reactions | Yes | Rare |
| Original creator behind a repin | Yes | No |
| Pinterest visual topic labels | Yes | No |
| Direct video MP4 and duration | Yes | Downloader Actors only |
| Input types | Search, board, profile, pin URL | Usually search plus one other |
| Login required | No | No |
| Memory | 512 MB | Commonly 1 to 4 GB |

**The ceiling, stated plainly.** Comment **bodies** are not part of Pinterest's public pin record, only the count, so this Actor reports how many comments a pin has but cannot return the text. Promoted pins are not served to logged out visitors, so ad detection is out of reach and no `isPromoted` column is shipped rather than one that is always the same value. Board follower counts are not in the pin payload either. Everything else the public surface exposes is in the output, and search results page well past a thousand pins per query.

### 🚀 How to use

1. **Create a free Apify account.** New accounts get $5 in free credit. [Sign up here](https://console.apify.com/sign-up?fpr=vmoqkp).
2. **Open the Actor** and go to the Input tab.
3. **Enter your search terms**, one per line, or paste Pinterest URLs into the Pinterest URLs field. Pin, board, profile and search URLs all work.
4. **Pick a search scope.** Pins covers every format; Videos restricts results to video and Idea pins.
5. **Set Max Items** to the number of pins you want back.
6. **Click Start** and watch the log.
7. **Download your data** from the Storage tab as CSV, JSON, Excel or XML, or pull it from the API.

### 💼 Business use cases

**🔍 Pinterest SEO and keyword research.**

A content team searches their category, then flattens `visualAnnotations` across a few hundred pins and counts the labels. Pinterest's own model tells them which phrases it associates with the imagery that already ranks, which becomes the title and description vocabulary for the next batch of pins.

**🛒 Product and imagery benchmarking.**

An ecommerce brand pulls the top pins for their category and sorts by `saveCount`. Because `outboundLink` and `linkDomain` come back too, they can see which competitor domains are collecting the traffic and which product photography styles earn the saves.

**🤝 Creator discovery for partnerships.**

A brand collects pins in their niche, filters to rows where `isRepin` is Yes, and takes `originalCreatorUsername` rather than the account that repinned. That surfaces the people actually producing the imagery that travels, which is who a partnership should target.

**📈 Trend tracking over time.**

A market research team runs the same searches weekly and stores the results with `createdAt` and `saveCount`. Comparing week over week shows which aesthetics are accelerating in a category before they show up in retail.

### 🔌 Automating Pinterest Scraper

- **Make:** trigger a run when a new keyword lands in a spreadsheet, then route the pins into your reporting sheet.
- **Zapier:** connect the Actor to thousands of apps and start a run from any trigger.
- **Slack:** post the top saved pins for a keyword into a team channel each morning.
- **Airbyte:** sync the dataset into your warehouse for long term trend analysis.
- **GitHub:** schedule runs from an Actions workflow and commit the results alongside your reporting code.
- **Google Drive:** drop each run's CSV into a shared folder for the wider team.

### 🌟 Beyond business use cases

- **Research:** visual culture and design researchers building dated corpora of imagery with measured reach attached.
- **Personal:** anyone auditing their own boards to see which pins actually earned saves.
- **Non-profit:** advocacy groups measuring how far a public awareness graphic travelled across boards.
- **Experimentation:** developers training or evaluating image models against real engagement signals and human written alt text.

### 🤖 Ask an AI assistant about this scraper

Paste this into ChatGPT, Claude or any assistant to plan your run:

> I am using the ParseForge Pinterest Scraper on Apify. It accepts search terms, board URLs, profile URLs and individual pin URLs, and returns 36 fields per pin including saves, repins, comments, shares and reactions, the original creator behind a repin, direct image and video URLs, the outbound link and domain, and Pinterest's own visual topic labels. It cannot return comment text or promoted pin data. Help me design an input for \[describe your goal].

### ❓ Frequently Asked Questions

**🔑 Do I need a Pinterest login or API key?**
No. The Actor reads Pinterest's public data as a logged out visitor. There is no login, no cookie you have to supply and no developer app.

**💾 Where do the save and repin counts come from?**
From each pin's own public record. Pinterest's search feed does not include them, which is why feed only scrapers cannot report them. This Actor opens the pin record for every result, which is the extra work that produces the numbers.

**🧭 What input formats are accepted?**
Search terms as plain text, plus four URL shapes: `pinterest.com/pin/ID/`, `pinterest.com/username/board-slug/`, `pinterest.com/username/`, and `pinterest.com/search/pins/?q=term`. Country domains such as `uk.pinterest.com` work too.

**💬 Does it return the comments themselves?**
No. Pinterest does not publish comment text in the public pin record, only the count. The `commentCount` column tells you how many there are.

**📢 Can it find promoted pins or ads?**
No. Pinterest does not serve promoted pins to logged out visitors, so there is nothing to read. The Actor ships no `isPromoted` column rather than one that always says the same thing.

**🏷 What exactly is `visualAnnotations`?**
Topic labels Pinterest's own image model attaches to the pin, such as "Cozy Apartment Aesthetic" or "Pasta With Chicken Recipe". They are Pinterest's read of the image, which makes them useful as keyword candidates. They are absent on some pins.

**🎥 Are the image and video URLs permanent?**
Image URLs on `i.pinimg.com` are stable and generally long lived. Video URLs are served from Pinterest's video CDN and are best downloaded during or shortly after the run.

**🌍 Do I need a proxy?**
No. Pinterest serves this data to ordinary datacenter traffic and the Actor runs without a proxy by default. Turn on Apify Proxy in the Network section if you are running very large jobs.

**⚡ How fast is it?**
About 11 pins per second. A 150 pin run finished in 14 seconds in testing, including the startup handshake.

**📄 How many pins can one search return?**
Search keeps paging well past a thousand pins per keyword. Max Items is the practical limit, not Pinterest.

**🔢 What happens if a pin is deleted or private?**
The Actor writes a row containing only an `error` message. Error rows are never billed.

**📦 What export formats are available?**
CSV, JSON, Excel and XML from the Storage tab, or straight from the Apify API.

### 🔌 Integrate with any app

Every run's dataset is available through the Apify API, so you can pull results into any language or platform that speaks HTTP. Apify also ships official clients for JavaScript and Python, plus native integrations for Make, Zapier, Airbyte, Slack, GitHub and Google Drive.

### 🔗 Recommended Actors

- [Instagram Profile Scraper](https://apify.com/parseforge/instagram-profile-scraper?fpr=vmoqkp) - the other half of a visual social strategy, with profile level metrics.
- [TikTok Hashtag Analytics Scraper](https://apify.com/parseforge/tiktok-hashtag-analytics-scraper?fpr=vmoqkp) - hashtag reach and engagement for short form video.
- [Etsy Shop Products Scraper](https://apify.com/parseforge/etsy-scraper?fpr=vmoqkp) - pair Pinterest demand signals with what is actually selling.
- [Facebook Posts Scraper](https://apify.com/parseforge/facebook-posts-scraper?fpr=vmoqkp) - posts from public pages and profiles with reactions and shares.
- [X.com Profiles Scraper](https://apify.com/parseforge/x-com-profiles-scraper?fpr=vmoqkp) - round out a cross platform social dataset.

> 💡 **Pro Tip:** browse the complete [ParseForge collection](https://apify.com/parseforge?fpr=vmoqkp).

**🆘 Need Help?** [Open our contact form](https://tally.so/r/BzdKgA)

> **⚠️ Disclaimer:** This is an independent tool, not affiliated with or endorsed by Pinterest. It collects only publicly available data.

# Actor input Schema

## `searchTerms` (type: `array`):

Keywords to search on Pinterest. Each term is paginated independently until Max Items is reached.

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

Pin, board, profile or search URLs. Examples: https://www.pinterest.com/pin/351912467586043/ , https://www.pinterest.com/atenezzzz/home/ , https://www.pinterest.com/atenezzzz/ , https://www.pinterest.com/search/pins/?q=home%20decor

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

Which Pinterest search tab to read for the Search Terms above. Pins covers every format; Videos restricts results to video and Idea pins. Ignored for board, profile and pin URLs.

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

Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000

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

Pinterest answers directly from Apify's network, so the proxy is off by default. Switch it on for very high volume or if you start seeing skipped pins.

## Actor input object example

```json
{
  "searchTerms": [
    "home decor"
  ],
  "searchScope": "pins",
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Key pin fields

## `fullData` (type: `string`):

Complete dataset with all 36 fields

# 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 = {
    "searchTerms": [
        "home decor"
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/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 = {
    "searchTerms": ["home decor"],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/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 '{
  "searchTerms": [
    "home decor"
  ],
  "maxItems": 10
}' |
apify call parseforge/pinterest-scraper --silent --output-dataset

```

## MCP server setup

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