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

Scrapes pins from Pinterest searches, boards, board sections, profiles and pin links, without logging in: title, description, full-size image, video, destination link, saves, comments, reactions, pinner and board.

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

## Pricing

$1.50 / 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

### What does Pinterest Scraper do?

**Pinterest Scraper** collects **pins from Pinterest searches, boards, board
sections, profiles and single pin links**, without logging in and without
cookies. For every pin you get the **title, description, full-size image with
its size, video link, the website it links to, saves, comments, reactions,
creation date, pinner, original creator and board**.

Paste a [Pinterest](https://www.pinterest.com) link, or just type search words
such as `garden ideas`, and click **Start**: the prefilled search returns 50
pins in a few seconds. Because it runs on the Apify platform, you also get API
access, scheduled runs, integrations (Google Sheets, Make, Zapier, webhooks),
run monitoring and automatic retries through Apify Proxy when Pinterest is
slow to answer.

### Why scrape Pinterest?

- **Trend and content research**: see which ideas, styles and products get the
  most saves for any search, and when they were posted.
- **Competitor and brand monitoring**: collect every pin from a brand's
  profile or boards with its saves, comments and reactions.
- **E-commerce and affiliate research**: find which shops and websites pins
  send people to (`link` and `domain`).
- **Influencer and creator discovery**: find who created the most-saved pins
  in your niche.
- **Image and video datasets**: download full-size images, video links and
  Pinterest's own alt text for design research or AI training.

### How to scrape Pinterest

1. Open Pinterest and search for something, open a board or a profile, or
   open a pin. Copy the address from your browser's address bar.
2. Paste it into **Pinterest links or search words**, one per line. Plain
   search words work too, and so do links from any Pinterest country site
   (pinterest.co.uk, de.pinterest.com, pinterest.com.mx...).
3. Set **Max pins per input**.
4. Click **Start**, then download your pins when the run finishes.

### Input

Everything is set on the Input tab. In JSON, the input looks like this:

```json
{
    "start_urls": [
        "https://www.pinterest.com/search/pins/?q=garden%20ideas",
        "home office ideas",
        "https://www.pinterest.com/marthastewart/bbq-and-grilling-recipes/",
        "https://www.pinterest.com/nytcooking/",
        "https://www.pinterest.com/pin/1196337405682706/"
    ],
    "max_items_per_input": 100
}
```

| Field | What it does |
|---|---|
| `start_urls` | Pinterest links or search words, one per line (see the table below). API callers can also send `{"url": "..."}` objects. |
| `max_items_per_input` | Stops after this many pins for each search, board, section or profile. Default: 100. A pin link always gives its one pin. |
| `proxy_configuration` | Optional; leave it empty. The Actor connects directly and switches to Apify's datacenter proxy, then residential proxy, on its own if Pinterest refuses. |

What you can paste:

| Input | Example | You get |
|---|---|---|
| Search link or search words | `https://www.pinterest.com/search/pins/?q=garden%20ideas` or `garden ideas` | The pins Pinterest finds, in Pinterest's order |
| Board | `https://www.pinterest.com/marthastewart/bbq-and-grilling-recipes/` | The board's pins, in the board's own order |
| Board section | `https://www.pinterest.com/<user>/<board>/<section>/` | The section's pins, in the board's own order |
| Profile | `https://www.pinterest.com/marthastewart/` or `@marthastewart` | The pins the person saved, newest first |
| Pin | `https://www.pinterest.com/pin/1196337405682706/` or a `pin.it` short link | That pin |

Links that cannot be used, such as a board search or a link to another
website, are skipped and listed with the reason in the run's `FAILED_INPUTS`
record.

### Output

Each pin becomes one row. Here is a real one, from a pin link:

```json
{
    "id": "337840409562683045",
    "url": "https://www.pinterest.com/pin/337840409562683045/",
    "title": "Athena Standing Desk | Aesthetic Modern Organic Office | Home Office inspo | Rove Concepts",
    "description": "Video by @yuliayacalister⁠. The modern, fresh, and captivating embodiment of the Athena Standing Desk sweeps you into a whirlwind of delight and sophistication. …",
    "alt_text": "a woman sitting at a table with a laptop and coffee cup in her hand while looking out the window",
    "image_url": "https://i.pinimg.com/originals/6e/34/a8/6e34a8fe13bf6f21fcd0ae5fb09242b7.jpg",
    "image_width": 1080,
    "image_height": 1920,
    "link": "https://www.roveconcepts.com/athena-standing-desk?utm_source=Pinterest&utm_medium=Social&utm_campaign=Organic%25Pins",
    "domain": "roveconcepts.com",
    "created_at": "2024-05-09T14:51:46+00:00",
    "saves": 6052,
    "repins": 5329,
    "comments": 16,
    "reactions": 1092,
    "is_video": true,
    "video_url": "https://v1.pinimg.com/videos/iht/720p/b2/72/cd/b272cd1183919003198d88a79a82f334.mp4",
    "video_duration_sec": 16.9,
    "dominant_color": "#6c6257",
    "pinner_username": "roveconcepts",
    "pinner_name": "Rove Concepts",
    "creator_username": "roveconcepts",
    "creator_name": "Rove Concepts",
    "board_name": "#JourneysInTaste",
    "board_url": "https://www.pinterest.com/roveconcepts/journeysintaste/",
    "input": "https://www.pinterest.com/pin/337840409562683045/",
    "position": 1,
    "scraped_at": "2026-10-10T08:56:02.381137+00:00"
}
```

The Output tab shows the pins as a table with their images. You can download
the dataset in various formats such as JSON, HTML, CSV, or Excel.

### Data fields

| Field | Description |
|---|---|
| `id` | The pin's id. |
| `url` | Link to the pin on Pinterest. |
| `title` | The pin's title, or the title Pinterest shows on the grid. Empty for pins without one. |
| `description` | The pin's description. |
| `alt_text` | Pinterest's text description of the image. |
| `image_url`, `image_width`, `image_height` | The original, full-size image and its size in pixels. |
| `link` | The website the pin links to. Empty for pins uploaded without a link. |
| `domain` | That website's domain. |
| `created_at` | When the pin was created (ISO 8601, UTC). |
| `saves` | How many times this idea was saved across Pinterest, all copies of it together. |
| `repins` | How many times this particular pin was saved. |
| `comments` | Number of comments. Pin links give the count shown on the pin's page. For pins found through searches, boards and profiles it is the count Pinterest's own feeds carry, which is often a few comments off the pin page. |
| `reactions` | Number of reactions (hearts and other reactions together). |
| `is_video` | `true` for video pins and video idea pins. |
| `video_url` | The video: an MP4 file for video pins, and an HLS stream (`.m3u8`) for idea pins (Pinterest's multi-page video pins), which video players and ffmpeg can open. |
| `video_duration_sec` | The video's length in seconds. |
| `dominant_color` | The image's main color, as a hex code. |
| `pinner_username`, `pinner_name` | Who saved this pin. |
| `creator_username`, `creator_name` | Who created the content, when Pinterest names a creator. |
| `board_name`, `board_url` | The board the pin is saved to. |
| `input` | The link or search words this pin was found through. |
| `position` | The pin's place in that search, board or profile, starting at 1, in the order Pinterest shows them. |
| `scraped_at` | When the row was saved. |

### How much does it cost to scrape Pinterest?

Pinterest Scraper uses **pay-per-event** pricing: you pay for the pins you
get. See the **Pricing** tab for the exact price per 1,000 pins and any fee
per run start.

- Each pin is saved and charged once per run, even when several of your inputs
  find it.
- Inputs that give nothing (a deleted board, a link to another website, a
  page Pinterest refuses to show) are never saved as rows, so they cost nothing.
- If you set a maximum cost for a run, the Actor stops as soon as it is
  reached.

The Actor reads Pinterest's own data feed rather than loading web pages in a
browser, so runs are fast: about 2,000 pins in 10 to 20 seconds.

### Tips for scraping Pinterest

- **Pinterest's search stops at about 800 to 1,000 pins** per search, however
  high you set the limit. For more, run several related searches (`garden
  ideas`, `small garden ideas`, `garden design`...); pins found by more than
  one of them are saved once.
- **Boards and profiles go much deeper**: a big board gives thousands of pins.
- **Search results depend on the words, not the country site**: a link from
  de.pinterest.com and the same search words typed in plain text give the same
  pins. Search in the language you want results in (`rezepte` for German
  recipes).
- **Sort by `saves`** after the run to find the most popular ideas.
- **Schedule a daily run** of a profile with a small limit to track the
  person's newest pins. Boards keep the order their owner gave them, so a
  small limit on a board gives its first pins in that order.

### FAQ, disclaimers and support

**Do I need a Pinterest account or cookies?** No. The Actor reads what
Pinterest shows to visitors who are not logged in.

**Why did I get fewer pins than I asked for?** Searches end at about 800 to
1,000 pins, and a board or profile ends when it has no more public pins. If an
input stops early for another reason, for example because Pinterest stopped
answering, the run's status message says so and the `FAILED_INPUTS` record
gives the reason.

**Which boards can be read?** Public boards and their sections. Secret boards
are invisible to logged-out visitors and are listed in `FAILED_INPUTS`.

**What happens to links that return nothing?** They are not saved as rows,
so you are not charged for them. Each one is listed with its reason in the
`FAILED_INPUTS` record of the run's key-value store. A run fails only when
every input failed because Pinterest could not be reached.

**Is it legal to scrape Pinterest?** This Actor only collects pins that are
publicly visible to anyone without logging in. Pins can still contain personal
data, such as the names of the people who saved them, and the images are
protected by copyright. You are responsible for making sure that your use
complies with Pinterest's Terms of Service, copyright law and data protection
laws such as the GDPR. If in doubt, ask a lawyer.

**Found a problem or need a custom solution?** Open an issue on the
**Issues** tab and we will look into it. Custom scrapers and data feeds are
available on request.

# Actor input Schema

## `start_urls` (type: `array`):

One per line. A search link (https://www.pinterest.com/search/pins/?q=garden%20ideas) or just the search words (garden ideas) give the pins Pinterest finds. A board link (https://www.pinterest.com/marthastewart/bbq-and-grilling-recipes/) gives the board's pins, and a board section link gives that section's pins. A profile link (https://www.pinterest.com/marthastewart/ or @marthastewart) gives the pins the person saved, newest first. A pin link (https://www.pinterest.com/pin/1196337405682706/) or a pin.it short link gives that pin. Links from every Pinterest country site work (pinterest.co.uk, de.pinterest.com, ...), with or without https://. Links that cannot be used are listed in the FAILED_INPUTS record.

## `max_items_per_input` (type: `integer`):

Stops after this many pins for each search, board, section or profile. A pin link always gives its one pin. Pinterest's own search goes no deeper than about 800 to 1,000 pins per search.

## `proxy_configuration` (type: `object`):

Leave this empty: Pinterest answers the Actor directly, and if it refuses, the Actor switches to Apify's datacenter proxy on its own, with Apify's residential proxy as a last resort. Choose a proxy here only to send every request through it.

## Actor input object example

```json
{
  "start_urls": [
    "https://www.pinterest.com/search/pins/?q=garden%20ideas"
  ],
  "max_items_per_input": 50,
  "proxy_configuration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "start_urls": [
        "https://www.pinterest.com/search/pins/?q=garden%20ideas"
    ],
    "max_items_per_input": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("mina_safwat/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 = {
    "start_urls": ["https://www.pinterest.com/search/pins/?q=garden%20ideas"],
    "max_items_per_input": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("mina_safwat/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 '{
  "start_urls": [
    "https://www.pinterest.com/search/pins/?q=garden%20ideas"
  ],
  "max_items_per_input": 50
}' |
apify call mina_safwat/pinterest-scraper --silent --output-dataset

```

## MCP server setup

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