# Pinterest Scraper Pro: Pins, Boards, Profiles & Comments (`nadeemnk/pinterest-scraper-pro`) Actor

Scrape Pinterest pins, boards, profiles, comments, related pins and keyword suggestions. Engagement and date filters, affiliate-link detection, monitoring mode for new pins, clean CSV-ready output.

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

## Pricing

from $1.40 / 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 Pro: Pins, Boards, Profiles & Comments

Turn Pinterest into clean, analysis-ready data. Give it **keywords, pin URLs, boards, profiles, idea pages or `pin.it` links** and get back pins with images, video, outbound links, engagement, creator and board details. Comments (with replies), keyword suggestions and profile board lists are optional add-ons.

What sets it apart:

- **Filters before you pay.** Keep only pins with enough saves or reactions, from a date range, video-only, with a link, product or affiliate pins, from (or excluding) chosen domains, or containing chosen words. Filtered-out pins are never charged.
- **Monitoring mode.** Schedule it on a board, profile or keyword. Each run returns only pins that are new, or pins whose engagement changed.
- **Affiliate and shopping intelligence.** Detects Amazon Associates, LTK, Rakuten, CJ, Awin, ShareASale, Impact, Skimlinks, ShopStyle and more. Pulls tagged products with prices.
- **Flat, CSV-friendly records.** One row per pin, with obvious field names (`saves`, `imageUrl`, `link`, `domain`). Pinterest's internal flags are left out. The raw object is available if you want it.
- **Pinterest SEO.** Autocomplete keyword suggestions for each search, hashtags and Pinterest's own topic labels for every pin, plus a free run summary with top domains, hashtags, topics and creators.
- **Safe defaults.** It stops at 100 items per source and 1,000 per run unless you raise the limits, so a forgotten setting can't run up a bill.

No Pinterest account, cookies or API key needed. It only reads what Pinterest shows logged-out visitors.

### What you can scrape

| Input | What you get |
|---|---|
| Search keyword (`searchQueries`) | Pins, video pins, boards or profiles matching the keyword |
| Search URL `…/search/pins/?q=…` | Same as above, any tab (`pins`, `videos`, `boards`, `users`) |
| Profile `…/username/`, `/_created/`, `/_saved/` or `usernames` | The profile record + the pins the user created (or saved) + optionally all their boards |
| Board `…/username/board-name/` | The board record + all its pins |
| Pin `…/pin/123…/` | Full pin details and optional comments with replies |
| Idea hub `…/ideas/topic/123…/` | Pins from the topic page |
| Short link `pin.it/…` | Resolved and handled like the URL it points to |

Any Pinterest country domain works (`in.pinterest.com`, `pinterest.co.uk`, `de.pinterest.com`, …).

### Quick start

Find the best-performing video pins for a niche from the last 90 days:

```json
{
  "searchQueries": ["modern kitchen ideas", "small kitchen makeover"],
  "searchType": "videos",
  "createdAfter": "90 days",
  "minReactions": 20,
  "maxItemsPerSource": 100
}
```

Audit a competitor profile: profile stats, every board, their 200 newest pins with full counts, and only pins that link out:

```json
{
  "usernames": ["@brandname"],
  "includeProfileBoards": true,
  "includePinDetails": true,
  "onlyWithLink": true,
  "maxItemsPerSource": 200
}
```

Watch a board every morning and get only new pins (save it as a Task and schedule it):

```json
{
  "startUrls": [{ "url": "https://www.pinterest.com/username/board-name/" }],
  "maxItemsPerSource": 100,
  "monitorMode": "new-only",
  "monitorName": "competitor-board"
}
```

Find affiliate pins in a product niche, with comments to read buyer questions:

```json
{
  "searchQueries": ["standing desk"],
  "onlyAffiliatePins": true,
  "includeComments": true,
  "maxCommentsPerPin": 30,
  "includeKeywordSuggestions": true
}
```

### Input reference

**Sources**: `startUrls`, `searchQueries` with `searchType` (`pins`, `videos`, `boards`, `profiles`), `usernames`.

**Limits**: `maxItemsPerSource` (default 100) and `maxItems` for the whole run (default 1,000). Profile and board records don't use up a source's pin allowance.

**Profiles, details and comments**

- `profilePins`: `created` (default), `saved` or `none`.
- `includeProfileBoards`: one record per public board.
- `includePinDetails`: exact saves, repins, comments, shares and SEO title (paid add-on, see the note below).
- `includeComments`, `maxCommentsPerPin`, `includeCommentReplies`.
- `includeKeywordSuggestions`: autocomplete suggestions for each keyword.

**Filters** (an item is saved and charged only if it passes all of them)

- Engagement: `minSaves`, `minRepins`, `minReactions`, `minComments`, `minFollowers`.
- Dates: `createdAfter`, `createdBefore`. Both accept `2026-01-31` or `30 days`, `6 months`, `1 year`.
- Content: `mediaType` (`any`, `image`, `video`), `onlyWithLink`, `onlyProductPins`, `onlyAffiliatePins`.
- Words and domains: `includeDomains`, `excludeDomains`, `mustContainKeywords`, `excludeKeywords`.

**Output**: `addContentCategory` (on by default, free), `addSentiment` (free), `deduplicate` (on), `includeRawData`.

**Monitoring**: `monitorMode` (`off`, `new-only`, `new-and-changed`) and `monitorName`.

**Advanced**: `proxyConfiguration`, `maxConcurrency`, `maxRequestRetries`.

#### A note on Pinterest's data (please read)

Pinterest gives logged-out visitors different amounts of data depending on where a pin appears:

- **Profile and board pins** include saves, repins, reactions and comment counts.
- **Search results** include reactions but **not** saves, repins or comment counts. Their pins also use opaque ids (`e1_…`) that Pinterest won't open for logged-out visitors. To filter search results by engagement, use `minReactions`. For exact saves, scrape the boards and profiles you discover through search.
- **Pin URLs** with numeric ids (`/pin/1234…/`) return full detail. Links with the new opaque ids can't be opened logged-out. The run explains this in its log instead of failing.

Every pin record has `detailLevel` (`feed` or `detailed`), so you always know which kind you have. Missing values are `null`, never a fake `0`.

### Output

Each dataset item has a `type`: `pin`, `profile`, `board` or `keyword-suggestion`. Every item also carries `source` (the keyword, URL or username that produced it, plus its position) and `scrapedAt`.

Example pin (shortened):

```json
{
  "type": "pin",
  "id": "424605071145700005",
  "url": "https://www.pinterest.com/pin/424605071145700005/",
  "title": "Holiday gift guide",
  "description": "Stocking stuffers under $25 #giftideas",
  "createdAt": "2026-10-07T05:42:46.000Z",
  "mediaType": "image",
  "imageUrl": "https://i.pinimg.com/originals/…jpg",
  "thumbnailUrl": "https://i.pinimg.com/236x/…jpg",
  "videoUrl": null,
  "link": "https://www.amazon.com/dp/B0…?tag=creator-20",
  "domain": "amazon.com",
  "isAffiliate": true,
  "affiliateNetworks": ["amazon-associates"],
  "saves": 60,
  "repins": 50,
  "reactions": 5,
  "commentCount": 2,
  "hashtags": ["giftideas"],
  "topics": ["gifts"],
  "isProductPin": true,
  "products": [{ "title": "…", "price": 19.99, "currency": "USD", "availability": "IN_STOCK", "link": "…" }],
  "pinner": { "username": "pinterest", "fullName": "Pinterest", "followerCount": 6266965, "profileUrl": "…" },
  "board": { "name": "Stocking stuffers under $25", "url": "…", "pinCount": 67, "followerCount": 4232274 },
  "contentCategory": { "label": "Holidays & Events", "confidence": 1, "matchedTerms": ["holiday", "gift guide"] },
  "comments": [{ "text": "Obsessed 😍", "author": { "username": "…" }, "likeCount": 1, "replyCount": 0 }],
  "detailLevel": "feed",
  "source": { "type": "url", "value": "https://www.pinterest.com/pinterest/", "position": 5 }
}
```

The full pin field list:

- **Basics**: `title`, `description`, `altText`, `createdAt`.
- **Media**: `mediaType` (`image`, `video`, `idea`, `carousel`), `imageUrl`, `imageWidth`, `imageHeight`, `thumbnailUrl`, `videoUrl` (MP4 when available, otherwise HLS), `videoDurationSec`, `dominantColor`.
- **Links**: `link`, `domain`, `isAffiliate`, `affiliateNetworks`.
- **Engagement**: `saves`, `repins`, `reactions`, `commentCount`, `shares`.
- **Discovery**: `hashtags`, `topics` (Pinterest's own labels), `visualTags`.
- **Rich pins and shopping**: `richPinType`, `richTitle`, `siteName`, `isProductPin`, `products`.
- **Flags**: `isPromoted`, `isRepin`, `seoTitle`.
- **People and boards**: `pinner`, `originalCreator`, `board`.
- **Optional extras**: `contentCategory`, `sentiment`, `comments` (with `replies`), and `changeType` / `changedFields` in monitoring mode.

**Profile** records have:

- `username`, `fullName`, `about`, `websiteUrl`, `domainVerified`
- `followerCount`, `followingCount`, `pinCount`, `boardCount`, `videoPinCount`, `monthlyViews`
- `isVerifiedMerchant`, `isPartner`, `isPrivate`, `avatarUrl`, `createdAt`

**Board** records have `name`, `url`, `description`, `pinCount`, `followerCount`, `sectionCount`, `collaboratorCount`, `isCollaborative`, `privacy`, `createdAt`, `coverImageUrl` and `owner`.

**Keyword suggestion** records have `seedKeyword`, `suggestion`, `position` and `searchUrl`.

The dataset has three ready-made table views:

- **Overview**
- **Links & products**
- **Profiles & boards**

Export as JSON, CSV, Excel or via the API.

#### Run summary (free)

Every run also writes a `SUMMARY` record to its key-value store. It isn't a dataset item, so it costs nothing. It contains:

- Item counts by type, and the media-type split.
- Median and average saves, repins and reactions.
- The date range of the pins.
- Top domains, hashtags, topics, categories, boards, creators and affiliate networks, plus the 10 strongest pins.
- Why items were skipped, and exactly how many events were charged.

### Monitoring mode

1. Save your input as a **Task** with `monitorMode` set and a `monitorName`, e.g. `pinterest-official-board`.
2. Schedule the Task (daily, weekly, …).
3. The first run saves everything it finds and remembers it. Each later run checks the same window (the newest `maxItemsPerSource` items of each source):
   - `new-only` saves only pins that weren't there before.
   - `new-and-changed` also saves known pins whose saves, repins, reactions or comment count changed. These come with `changeType: "changed"` and `changedFields`.

Use a different `monitorName` for each watch. Only saved items are charged, so a quiet day costs close to nothing.

### Pricing

Pay per result. There are no monthly fees, and proxy costs are included.

| Event | Price |
|---|---|
| Pin saved | $0.0014 ($1.40 / 1,000) |
| Profile saved | $0.0014 |
| Board saved | $0.0014 |
| Keyword suggestion | $0.0005 |
| Pin detail lookup (add-on) | $0.0010 |
| Page of comments (add-on, only when it contains comments) | $0.0005 |

Examples:

- 1,000 search pins cost $1.40.
- A profile with 200 detailed pins and 40 boards costs $0.0014 + 200 × ($0.0014 + $0.0010) + 40 × $0.0014 = $0.54.

Set **Maximum cost per run** in the run options. The Actor stops cleanly when it's reached.

### FAQ

**Do I need a Pinterest account?** No. Nothing is logged in to, and private boards and profiles are never accessed.

**Why are `saves` null for search results?** Pinterest doesn't show those counts to logged-out visitors in search. Use `minReactions`, or scrape the boards and profiles you find (see the note above).

**Why did I get fewer items than my limit?** The source may have fewer public pins, your filters may have removed some, or duplicates across sources were merged. The `SUMMARY` record lists skip reasons with counts.

**How are duplicates handled?** With `deduplicate` on (the default), a pin found by several sources is saved and charged once, under the first source that found it.

**Can I get images or videos as files?** The output has direct `i.pinimg.com` image URLs and video URLs. Download them with any HTTP client, respecting the creators' rights.

**Is the category or sentiment AI?** No. Both are fast keyword-based rules that run inside the Actor at no extra cost. Treat them as helpful labels, not ground truth.

### Responsible use

This Actor reads only public, logged-out Pinterest pages. You're responsible for how you use the data:

- Respect Pinterest's terms and creators' copyrights.
- Follow privacy law (GDPR, CCPA, India's DPDP Act) when handling data about people.
- Don't use it for spam or harassment.

This is an independent tool, not affiliated with or endorsed by Pinterest.

### Support

Open an issue on the Actor's **Issues** tab with your run ID, your input (redact anything private) and what you expected. Feature requests are welcome.

# Actor input Schema

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

Pin, board, profile (incl. /\_created/ and /\_saved/), search, idea-hub (/ideas/topic/123/) or pin.it short links. Mix any of them in one run.

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

One Pinterest search per keyword.

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

Which Pinterest search tab to scrape for the keywords above.

## `usernames` (type: `array`):

Pinterest usernames (with or without @). Same as adding their profile URLs.

## `maxItemsPerSource` (type: `integer`):

Stops each source after this many saved items. Profile and board records do not count toward a source's pin limit.

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

Hard cap for the whole run, across all sources. Protects you from surprise costs.

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

For profile URLs and usernames. A /\_created/ or /\_saved/ URL overrides this.

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

Saves one board record (name, pin count, followers, created date) per public board of each profile.

## `includePinDetails` (type: `boolean`):

One extra lookup per pin for exact saves, repins, comment and share counts plus SEO title. Pinterest only allows this for pins with numeric ids (profiles, boards, pin URLs); search results use opaque ids and are skipped. Turned on automatically per pin when a saves/repins/comments filter needs it.

## `includeComments` (type: `boolean`):

Adds a comments array to each pin that has comments.

## `maxCommentsPerPin` (type: `integer`):

Upper limit of top-level comments saved per pin.

## `includeCommentReplies` (type: `boolean`):

Nests replies under each comment (up to 50 per comment). Requires comments.

## `includeKeywordSuggestions` (type: `boolean`):

Saves Pinterest's autocomplete suggestions for every keyword as separate records. Handy for Pinterest SEO.

## `minSaves` (type: `integer`):

Known for profile and board pins (and pin details). Not available in search results.

## `minRepins` (type: `integer`):

Known for profile and board pins (and pin details). Not available in search results.

## `minReactions` (type: `integer`):

Works everywhere, including search results.

## `minComments` (type: `integer`):

Known for profile and board pins (and pin details). Not available in search results.

## `minFollowers` (type: `integer`):

For pins: the pinner's followers. For profile and board records: their own followers.

## `createdAfter` (type: `string`):

A date (2026-01-31) or a relative period (30 days, 6 months).

## `createdBefore` (type: `string`):

A date (2026-06-30) or a relative period (7 days).

## `mediaType` (type: `string`):

Keep only image pins or only video pins.

## `onlyWithLink` (type: `boolean`):

Keep only pins that link to an external website.

## `onlyProductPins` (type: `boolean`):

Keep only pins with product data (price, tagged products or a product rich pin).

## `onlyAffiliatePins` (type: `boolean`):

Keep only pins whose link or tagged products use an affiliate network (Amazon Associates, LTK, Rakuten, CJ, Awin, ShareASale, Impact, Skimlinks and more).

## `includeDomains` (type: `array`):

e.g. amazon.com, etsy.com. Subdomains match too.

## `excludeDomains` (type: `array`):

Drop pins linking to these domains. Subdomains match too.

## `mustContainKeywords` (type: `array`):

Matched against title, description, alt text, hashtags and topics.

## `excludeKeywords` (type: `array`):

Drop pins whose title, description, alt text, hashtags or topics contain any of these words.

## `addContentCategory` (type: `boolean`):

Rule-based category (Home Decor, Food & Drink, Fashion, …) with confidence and matched terms. Free.

## `addSentiment` (type: `boolean`):

Lexicon-based sentiment of the pin text and of each comment. Free.

## `deduplicate` (type: `boolean`):

When the same pin is found by several sources, save it once.

## `includeRawData` (type: `boolean`):

Adds the untouched Pinterest JSON under `raw`. Large; for debugging and power users.

## `monitorMode` (type: `string`):

For scheduled runs. The first run saves everything and remembers it; later runs save only new pins, or new pins plus pins whose saves/repins/reactions/comments changed.

## `monitorName` (type: `string`):

Give each watch its own name and reuse it on every scheduled run.

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

Apify Proxy is used by default. Switch to Residential only for very large runs that get blocked.

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

How many requests run in parallel. Keep it low to stay polite and avoid blocks.

## `maxRequestRetries` (type: `integer`):

How often a failed request is retried with a fresh session before it is given up.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.pinterest.com/pinterest/"
    }
  ],
  "searchQueries": [
    "modern kitchen ideas"
  ],
  "searchType": "pins",
  "maxItemsPerSource": 20,
  "maxItems": 1000,
  "profilePins": "created",
  "includeProfileBoards": false,
  "includePinDetails": false,
  "includeComments": false,
  "maxCommentsPerPin": 20,
  "includeCommentReplies": false,
  "includeKeywordSuggestions": false,
  "mediaType": "any",
  "onlyWithLink": false,
  "onlyProductPins": false,
  "onlyAffiliatePins": false,
  "addContentCategory": true,
  "addSentiment": false,
  "deduplicate": true,
  "includeRawData": false,
  "monitorMode": "off",
  "monitorName": "default",
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxConcurrency": 5,
  "maxRequestRetries": 4
}
```

# Actor output Schema

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

All scraped items (pins, profiles, boards, keyword suggestions) in the Overview table view.

## `commerce` (type: `string`):

Pins with outbound links, affiliate networks and product data.

## `creators` (type: `string`):

Profile and board records with follower and pin counts.

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

Free JSON rollup: counts, engagement medians, top domains, hashtags, topics and creators, skip reasons and charged events.

## `keywords` (type: `string`):

Pinterest autocomplete suggestions for each search keyword.

# 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/"
        }
    ],
    "searchQueries": [
        "modern kitchen ideas"
    ],
    "maxItemsPerSource": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("nadeemnk/pinterest-scraper-pro").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/" }],
    "searchQueries": ["modern kitchen ideas"],
    "maxItemsPerSource": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("nadeemnk/pinterest-scraper-pro").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/"
    }
  ],
  "searchQueries": [
    "modern kitchen ideas"
  ],
  "maxItemsPerSource": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call nadeemnk/pinterest-scraper-pro --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nadeemnk/pinterest-scraper-pro"
        }
    }
}
```

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/ydJM5mwG4499jBKDW/builds/UnoJg8rIR7X4h6JEj/openapi.json
