# Pinterest Scraper - Pins, Boards, Profiles, Search Results (`scrapefy/pinterest-scraper`) Actor

$2.00 per 1,000 pins, no per-run fee (start fee $0.00005). Scrape public Pinterest pins without login: search keywords, pin, board and profile URLs. Image URLs, titles, descriptions, outbound links, domains, boards, pinners, saves. No cookies, no proxy needed.

- **URL**: https://apify.com/scrapefy/pinterest-scraper.md
- **Developed by:** [Scrapify](https://apify.com/scrapefy) (community)
- **Categories:** Social media, AI
- **Stats:** 2 total users, 0 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: public pins, boards, profiles and search results with image URLs

**$2.00 per 1,000 pins, no per-run fee (start fee $0.00005).** Find it on the Store: https://apify.com/scrapefy/pinterest-scraper

Get **public Pinterest pins** without a login, cookies or proxy. Enter search keywords, pin links, board links or profile links and every pin comes back as one clean row: **pin ID and URL, title, description, largest image URL plus every image size, outbound link and domain, board, pinner (username, full name, followers), saves, comment count, created date, video flag and URL, dominant color and alt text**. Export to JSON, CSV or Excel, or call it from the API.

Use it for **trend and content research, moodboards, product and brand monitoring, competitor and creator discovery, affiliate and SEO research (which domains get pinned), and training datasets**. Works with AI agents through the Apify MCP server. It reads only the pin data Pinterest shows to every visitor; images are returned as URLs and are not downloaded.

### Why this one

- **No login, no cookies, no proxy.** Public data only; nothing to configure. One lightweight HTTP request returns about 25 pins, so runs are fast and cheap.
- **Four input types in one Actor.** Keywords (or Pinterest search URLs), single pins (including pin.it short links), boards and profiles.
- **Clean, normalised fields.** The same fields for every input type, with every image size and the original image URL.
- **Never fails the whole run for one input.** A bad URL, a private board or an empty search gets its own row with an `error` message and is **not charged**; the rest continue. A `RUN_SUMMARY` record lists pins per input.
- **Polite by design.** Pauses between requests, retries with backoff, and the run stops politely if Pinterest keeps answering HTTP 429.

### Input

| Field | Meaning |
|---|---|
| Search keywords | One per line, or a Pinterest search URL |
| Pin URLs | pinterest.com/pin/... or pin.it short links; full detail including saves and comments |
| Board URLs | Public boards; newest pins first |
| Profile URLs | Public profiles; the pins the account created |
| Max pins per input | Default 50, max 1,000 (about 25 pins per request) |
| Add save and comment counts to profile pins | Optional, one extra request per pin |

### Output (one row per pin)

`pinId, url, title, description, altText, imageUrl, imageWidth, imageHeight, images{size: {url, width, height}}, link, domain, board{id, name, url}, pinner{username, fullName, followers, url}, saves, reactionCount, commentCount, createdAt, isVideo, videoUrl, dominantColor, productName, source{type, input}, error, scrapedAt`. See `sample-output.json` for real rows.

Notes on the data:

- **Search and board pins have an encoded pin ID** (starts with `e1_`) and no public pin page, so `url` is `null` for them; use `link` (the pinned page) and `imageUrl`. Pins from profiles and pin URLs have numeric IDs and a working `url`.
- `saves` and `commentCount` are only available for pin URLs and (with the option on) profile pins; search and board rows carry `reactionCount` when Pinterest shows it.
- `videoUrl` is an HLS stream (.m3u8) when the pin is a video.
- The same pin returned by two inputs in one run is returned and charged once.
- Promoted (ad) pins are skipped.

### Pricing

Pay per event: **$0.002 per pin** ($2.00 per 1,000 pins) plus a $0.00005 start event per run. Error rows are not charged. A 50-pin run costs about ten cents. See PRICING.md for the benchmark.

### Public data only

The Actor reads only public pins, boards and profiles that Pinterest shows without an account. It does **not** log in, use cookies or accounts, read private or secret boards, download images or video, or bypass paywalls or CAPTCHAs. Pins can contain personal data (names, usernames, photos). You are responsible for using the data in line with Pinterest's terms of service, copyright law, GDPR and other applicable data-protection law.

### Notes and limits

- Pinterest decides how deep a search or board goes; very large limits may end early (the run summary says how many pins each input returned).
- Pinterest can change its public endpoints without notice.
- Pin and board counts shown are the numbers at scrape time.

### FAQ

**How much does it cost?** $0.002 per pin plus $0.00005 per run. 1,000 pins = $2.00. Error rows are free.

**Do I need a Pinterest account or API key?** No.

**Can I scrape a private board?** No. Public data only.

**Does it download images?** No, it returns image URLs in every size Pinterest offers.

**Why is `url` empty for some pins?** Search and board results use an encoded pin ID without a public page; see the data notes above.

**Which export formats are available?** JSON, CSV, Excel, XML, HTML or RSS from the Console or API, or integrations such as Make, Zapier, n8n and Google Sheets.

**Something broke or a field is missing?** Open an issue on the Actor's Issues tab with the run link.

### Use with AI agents / MCP

Agents can call this Actor through the [Apify MCP server](https://mcp.apify.com). Let the agent find it with the `search-actors` tool ("pinterest scraper") and call it by name:

- Actor: `scrapefy/pinterest-scraper`
- Example prompt: "Find 25 Pinterest pins for 'kitchen ideas' with image URLs and the pinned page link."
- Minimal input:

```json
{
  "searchQueries": ["kitchen ideas"],
  "maxItems": 25
}
```

### Feedback

If this saved you time, a rating on the Store page helps others find it. If it did not work for you, please open an issue on the Issues tab with the run link and I will look at it.

# Actor input Schema

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

Keywords to search on Pinterest, one per line, for example 'kitchen ideas' or 'boho bedroom'. You can also paste a Pinterest search URL (pinterest.com/search/pins/?q=...). Each keyword returns up to 'Max pins per input' public pins.

## `pinUrls` (type: `array`):

Links to single pins, for example https://www.pinterest.com/pin/101049585389043643/ or a pin.it short link. Each link returns the full pin including save and comment counts.

## `boardUrls` (type: `array`):

Links to public boards, for example https://www.pinterest.com/TileBar/tiles-backsplashes/. The newest pins of each board are returned, up to 'Max pins per input'. Secret and private boards are not available.

## `profileUrls` (type: `array`):

Links to public Pinterest profiles, for example https://www.pinterest.com/TileBar/. The pins created by that account are returned, up to 'Max pins per input', with the profile's follower count on each pin's pinner.

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

Maximum number of pins returned for each keyword, board or profile (about 25 pins per request). Keeps the cost of a run predictable: you are charged per pin returned. Single pin URLs always return one pin.

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

For profile inputs, fetch each pin's detail page to add the save count and comment count. This makes the run slower (one extra request per pin) but costs the same. Pin URLs always include these counts; search and board pins do not carry them.

## Actor input object example

```json
{
  "searchQueries": [
    "kitchen ideas"
  ],
  "pinUrls": [
    "https://www.pinterest.com/pin/101049585389043643/"
  ],
  "boardUrls": [
    "https://www.pinterest.com/TileBar/tiles-backsplashes/"
  ],
  "maxItems": 50,
  "includePinDetails": false
}
```

# Actor output Schema

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

All pins as a table with the key columns.

## `results` (type: `string`):

Every pin with all fields including every image size.

## `runSummary` (type: `string`):

Pins per input, errors, requests made and charged events.

# 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": [
        "kitchen ideas"
    ],
    "pinUrls": [
        "https://www.pinterest.com/pin/101049585389043643/"
    ],
    "boardUrls": [
        "https://www.pinterest.com/TileBar/tiles-backsplashes/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapefy/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": ["kitchen ideas"],
    "pinUrls": ["https://www.pinterest.com/pin/101049585389043643/"],
    "boardUrls": ["https://www.pinterest.com/TileBar/tiles-backsplashes/"],
}

# Run the Actor and wait for it to finish
run = client.actor("scrapefy/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": [
    "kitchen ideas"
  ],
  "pinUrls": [
    "https://www.pinterest.com/pin/101049585389043643/"
  ],
  "boardUrls": [
    "https://www.pinterest.com/TileBar/tiles-backsplashes/"
  ]
}' |
apify call scrapefy/pinterest-scraper --silent --output-dataset

```

## MCP server setup

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