# Pinterest Search Scraper (Pins, Images, Links, Boards) (`juliob.rangel/pinterest-search-scraper-fast`) Actor

Search Pinterest by keyword and get the pins: title, description, image and video URLs, outbound link and domain, reactions, date, pinner and board. No login. Export to Excel, CSV or JSON.

- **URL**: https://apify.com/juliob.rangel/pinterest-search-scraper-fast.md
- **Developed by:** [Julio Barcellos Rangel](https://apify.com/juliob.rangel) (community)
- **Categories:** Social media, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 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?

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 Search Scraper (Pins, Images, Links, Boards)

Pinterest Search Scraper takes a keyword and returns the Pinterest pins that come up for it: title, description, full-size image, video, the website the pin links to, reactions, date, the pinner and the board. It is a Pinterest scraper for marketers, e-commerce sellers, bloggers and trend researchers who want to see what wins on Pinterest for a niche. Use it to export Pinterest search results to Excel, CSV or JSON, or to download Pinterest image links in bulk, with no login.

### What does Pinterest Search Scraper do?

You give it one or more search terms. For each one, the scraper runs the same pin search you would run on pinterest.com, reads the results page after page, and saves each pin as one row until it reaches your limit or the end of the results. Ads (promoted pins) are left out by default.

It accepts these forms, mixed in the same list:

| Input form | Example |
|---|---|
| Keyword | `home decor ideas` |
| Pinterest search URL | `https://www.pinterest.com/search/pins/?q=keto%20recipes` |

From a search URL the scraper takes the `q` value, so `https://www.pinterest.com/search/pins/?q=keto%20recipes` and `keto recipes` run the same search. Identical lines are searched once.

Each row holds the pin itself (ID, link, title, description, alt text, creation date, rank in the results), its media (original image with width, height and dominant color, and the video link and length for video pins), where it sends people (outbound link and domain), how people reacted (total reactions), who saved it (pinner username, name, followers and profile link) and where (board name, link and number of pins), plus flags for promoted and product pins. You do not need a Pinterest account, cookies or an API key.

### What data can you extract?

| Field | What it means | Example |
|---|---|---|
| `query` | The search term the pin came from | `home decor ideas` |
| `position` | Rank of the pin in the results for that search, starting at 1 (skipped ads are not counted) | `1` |
| `pinId` | Pinterest pin ID | `225039312627881892` |
| `url` | Link to the pin | `https://www.pinterest.com/pin/225039312627881892/` |
| `title` | Pin title | `Cozy Reading Nook` |
| `description` | Pin description | `Neva Round Daybed in Recycled Faux Fur color: Pampas Grass…` |
| `altText` | Image description written by Pinterest | `a living room filled with furniture and a large potted plant on top of a table` |
| `link` | Website the pin links to | `https://sixpenny.com/products/neva-round-daybed-slipcover-only?…` |
| `domain` | Domain of that website (`null` for pins uploaded without a link) | `sixpenny.com` |
| `imageUrl` | Original (full-size) image link | `https://i.pinimg.com/originals/2c/24/91/2c24917f5d44c73a48b10de4692f3467.jpg` |
| `imageWidth` | Image width in pixels | `635` |
| `imageHeight` | Image height in pixels | `1200` |
| `dominantColor` | Main color of the image (hex) | `#6c5942` |
| `isVideo` | The pin is a video | `true` |
| `videoUrl` | Video link (MP4 when available, otherwise a stream such as `.m3u8`) | `https://v1.pinimg.com/videos/iht/hls/e7/b2/7e/e7b27e16d78379ae685de9f82f7d42cf.m3u8` |
| `videoDurationSeconds` | Video length in seconds | `6` |
| `reactions` | Total reactions on the pin, all reaction types added up | `2045` |
| `createdAt` | When the pin was created (ISO 8601) | `2022-11-05T14:37:02.000Z` |
| `pinnerUsername` | Username of the account that saved the pin | `SoHaBrands` |
| `pinnerName` | Display name of that account | `SoHa Living` |
| `pinnerFollowers` | Followers of that account | `967` |
| `pinnerUrl` | Profile link of that account | `https://www.pinterest.com/SoHaBrands/` |
| `boardName` | Board the pin was saved to | `Home Decor Ideas` |
| `boardUrl` | Link to the board | `https://www.pinterest.com/SoHaBrands/home-decor-ideas/` |
| `boardPinCount` | Number of pins on the board | `36` |
| `isPromoted` | The pin is an ad (only `true` when you keep ads) | `false` |
| `isProduct` | Pinterest marks the pin as a product | `true` |
| `scrapedAt` | When the row was collected | `2026-10-11T20:31:47.372Z` |
| `error` | Only on error rows: why the search returned no pins | `Pinterest did not answer` |

Examples come from real runs. Counts are real numbers, so you can sort by `reactions` or `pinnerFollowers` in Excel or Google Sheets. Empty values come as `null`.

### How to use Pinterest Search Scraper

1. Open Pinterest Search Scraper in Apify Console (sign in or create a free Apify account).
2. In **Search terms**, add one keyword per line, or paste Pinterest search URLs.
3. Set **Max pins per search** (default 50, up to 5,000).
4. Keep **Skip promoted pins (ads)** on to leave ads out, or turn it off to include them.
5. Click **Start**. The log shows how many pins each search returned.
6. Open the **Output** tab to see the table with image previews, then click **Export** to download the data as JSON, CSV, Excel or HTML.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `queries` | array of strings (required) | `["home decor ideas"]` | Keywords to search on Pinterest, or Pinterest search URLs (`pinterest.com/search/pins/?q=...`). One search per line. |
| `maxPinsPerQuery` | integer, 1 to 5,000 | `50` | How many pins to return for each search term. |
| `skipPromoted` | boolean | `true` | Leave ads out of the results. |
| `proxy` | object | `{"useApifyProxy": true}` | Apify Proxy settings. |

Example input with two keywords and one search URL, 200 pins each:

```json
{
  "queries": [
    "home decor ideas",
    "wedding dress",
    "https://www.pinterest.com/search/pins/?q=keto%20recipes"
  ],
  "maxPinsPerQuery": 200,
  "skipPromoted": true,
  "proxy": {
    "useApifyProxy": true
  }
}
```

### Output example

A real row from the latest run. The pinner is a private person, so the username and name are replaced with `example_user`; the description and link are shortened:

```json
{
  "query": "home decor ideas",
  "position": 1,
  "pinId": "225039312627881892",
  "url": "https://www.pinterest.com/pin/225039312627881892/",
  "title": "Cozy Reading Nook",
  "description": "Neva Round Daybed in Recycled Faux Fur color: Pampas Grass…",
  "altText": "a living room filled with furniture and a large potted plant on top of a table",
  "link": "https://sixpenny.com/products/neva-round-daybed-slipcover-only?currency=USD&variant=40241699946540&…",
  "domain": "sixpenny.com",
  "imageUrl": "https://i.pinimg.com/originals/2c/24/91/2c24917f5d44c73a48b10de4692f3467.jpg",
  "imageWidth": 635,
  "imageHeight": 1200,
  "dominantColor": "#6c5942",
  "isVideo": false,
  "videoUrl": null,
  "videoDurationSeconds": null,
  "reactions": 2045,
  "createdAt": "2022-11-05T14:37:02.000Z",
  "pinnerUsername": "example_user",
  "pinnerName": "example_user",
  "pinnerFollowers": 91,
  "pinnerUrl": "https://www.pinterest.com/example_user/",
  "boardName": "Reading Room Inspo",
  "boardUrl": "https://www.pinterest.com/example_user/reading-room-inspo/",
  "boardPinCount": 4,
  "isPromoted": false,
  "isProduct": true,
  "scrapedAt": "2026-10-11T20:31:47.372Z"
}
```

An error row looks like this and is not charged:

```json
{
  "query": "home decor ideas",
  "error": "Pinterest did not answer"
}
```

### How much does it cost?

Pinterest Search Scraper uses pay per event pricing. You pay **$2.00 per 1,000 pins** returned ($0.002 per pin) on the Free plan. Platform usage (compute and proxy) is included in that price.

| Apify plan | Price per 1,000 pins |
|---|---|
| Free | $2.00 |
| Bronze (10% off) | $1.80 |
| Silver (20% off) | $1.60 |
| Gold and higher (30% off) | $1.40 |

Worked examples on the Free plan:

- 1 keyword with the default 50 pins = **$0.10**
- 10 keywords × 500 pins = 5,000 pins = **$10.00**
- 10 keywords × 100 pins every month for a year = 12,000 pins = **$24.00** ($16.80 on Gold)

What you are **not** charged for:

- Error rows ("Pinterest did not answer").
- Ads, when **Skip promoted pins** is on (the default). If you turn it off, ads are returned and charged like any other pin.
- Duplicate pins inside the same search, and results that are not pins.
- The search result pages themselves. Only the pin rows count.

### Use cases

- **Trend research.** See which ideas, styles and products come up first for a keyword in decor, recipes, fashion, weddings or travel.
- **Traffic sources.** Group pins by `domain` to see which websites and shops get Pinterest traffic for a keyword.
- **Product research.** Filter `isProduct` pins and their outbound links to find the products and stores people save.
- **Content planning.** Collect pin titles and descriptions that rank for your keywords, as ideas for your own pins, blog posts and SEO.
- **Image reference boards.** Get original image links with size and dominant color for mood boards and design references.
- **Creator and board discovery.** Find active pinners and boards in a niche by `pinnerFollowers` and `boardPinCount` for partnerships.
- **Video pin research.** Filter `isVideo` to see which topics use video and how long those videos are.

### Tips and limits

- **How deep you can go.** `maxPinsPerQuery` accepts up to 5,000, but a search ends when Pinterest has no more results, or after 3 result pages in a row that bring no new pins. Broad keywords go deeper than very specific ones.
- **Positions skip ads.** With ads skipped, `position` counts only the pins you get, 1, 2, 3 and so on, in the order Pinterest returned them.
- **Video links.** `videoUrl` is an MP4 file when Pinterest offers one; otherwise it is a streaming link (often `.m3u8`), which needs a player or a tool such as ffmpeg to download.
- **Empty links.** `link` and `domain` are `null` when the pin was uploaded without a website. `title` and `description` are `null` when the pinner left them empty.
- **Pinner is who saved the pin.** The pinner is the account that saved this pin, not always the creator of the image or the website owner.
- **Retries.** Each results page gets up to 6 tries with a 30-second timeout. If Pinterest stops answering after some pins, you keep those pins. If it never answers for a search, you get one error row for it.
- **Search only.** The input is search terms. Board URLs, profile URLs and single pin URLs are not supported; a Pinterest link without a `q` value produces no row.
- **Pins shared by searches.** Duplicates are removed inside each search only. A pin that comes up for two search terms is returned, and charged, once per search; use `pinId` to dedupe across searches.

### Use it from the API, Python or JavaScript

JavaScript (Node.js) with the official `apify-client` package:

```javascript
const { ApifyClient } = require('apify-client');

const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const input = { queries: ['home decor ideas', 'keto recipes'], maxPinsPerQuery: 100 };

(async () => {
    const run = await client.actor('juliob.rangel/pinterest-search-scraper-fast').call(input);
    const { items } = await client.dataset(run.defaultDatasetId).listItems();
    console.log(items);
})();
```

Python with the official `apify-client` package:

```python
from apify_client import ApifyClient

client = ApifyClient('YOUR_TOKEN')
run_input = {'queries': ['wedding dress'], 'maxPinsPerQuery': 300, 'skipPromoted': True}

run = client.actor('juliob.rangel/pinterest-search-scraper-fast').call(run_input=run_input)
items = client.dataset(run['defaultDatasetId']).list_items().items
for item in items:
    print(item.get('position'), item.get('title'), item.get('domain'), item.get('imageUrl'))
```

The scraper also works with Make, Zapier and n8n, can export results to Google Sheets, can call your webhook when a run finishes, and can be used by AI agents through the Apify MCP server.

### FAQ

#### Do I need a Pinterest login, cookies or an API key?

No. The scraper uses Pinterest's public search without logging in. You only need an Apify account to run it.

#### Can I export Pinterest pins to Excel or CSV?

Yes. After the run, open the Output tab and export the dataset as Excel, CSV, JSON or HTML, or read it through the API.

#### How many pins can I get per search?

Up to 5,000 with `maxPinsPerQuery`, as long as Pinterest keeps returning new pins for that keyword.

#### Can I download the images?

The scraper gives you the original image link (`imageUrl`) of each pin. Download them with any bulk downloader or a short script. Respect the image owners' rights when you reuse them.

#### Is it legal to scrape Pinterest?

The scraper only collects publicly available data. You are responsible for complying with Pinterest's terms, copyright of the images, and privacy laws such as GDPR and LGPD. Pinner names and usernames can be personal data, so you need a legitimate reason to collect and use them.

#### Why did I get a row with an `error` field?

Pinterest did not answer the search after 6 tries and no pin was collected for it. Error rows are not charged. Run the search again later.

#### Why are there no ads in my results?

**Skip promoted pins (ads)** is on by default. Turn it off to include promoted pins; they come with `isPromoted` set to `true`.

### Related scrapers

- [Instagram Posts Scraper (Reels, Likes, Views, Captions)](https://apify.com/juliob.rangel/instagram-posts-scraper-fast)
- [TikTok Video Scraper (Views, Likes, Comments, Shares)](https://apify.com/juliob.rangel/tiktok-video-scraper-fast)
- [YouTube Search Scraper (Fast & Cheap)](https://apify.com/juliob.rangel/youtube-search-fast)
- [Threads Scraper (Profiles, Posts, Search)](https://apify.com/juliob.rangel/threads-scraper-fast)
- [Website Contact Details Scraper (Emails, Phones, Socials)](https://apify.com/juliob.rangel/website-contact-details-scraper)

***

## Buscador de Pins do Pinterest (PT-BR)

Digite uma palavra-chave e receba os pins do Pinterest: título, descrição, imagem em alta, vídeo, site de destino, reações, data, autor e pasta. Sem login. Você paga só por pin retornado.

# Actor input Schema

## `queries` (type: `array`):

Keywords to search on Pinterest, or Pinterest search URLs (pinterest.com/search/pins/?q=...). One search per line.

## `maxPinsPerQuery` (type: `integer`):

How many pins to return for each search term.

## `skipPromoted` (type: `boolean`):

Leave ads out of the results.

## `proxy` (type: `object`):

Apify Proxy settings.

## Actor input object example

```json
{
  "queries": [
    "home decor ideas"
  ],
  "maxPinsPerQuery": 50,
  "skipPromoted": true,
  "proxy": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (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 = {
    "queries": [
        "home decor ideas"
    ],
    "maxPinsPerQuery": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("juliob.rangel/pinterest-search-scraper-fast").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 = {
    "queries": ["home decor ideas"],
    "maxPinsPerQuery": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("juliob.rangel/pinterest-search-scraper-fast").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 '{
  "queries": [
    "home decor ideas"
  ],
  "maxPinsPerQuery": 50
}' |
apify call juliob.rangel/pinterest-search-scraper-fast --silent --output-dataset

```

## MCP server setup

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

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/t72gGJ684SZopOzLH/builds/0QhowRlmqFjwaRpmk/openapi.json
