# Pinterest Pins Scraper: Search, Boards & Profiles (`luzivanlt/pinterest-pins-scraper`) Actor

Pins from Pinterest searches, boards and profiles, with saves, dates, images and pinners. $1 per 1,000 pins. Each board checked against its own pin count.

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

## Pricing

from $0.70 / 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.
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 Pins Scraper: Search, Boards & Profiles

Get Pinterest pins from any search, board or profile, one row per pin, with
saves, dates, images and pinners. Each board is checked against the pin
count Pinterest shows for it, and the run tells you whether every pin was
read. No Pinterest account, login or cookies needed.

Checked daily on two searches. Latest runs: three boards read whole (1,610 of
1,610 pins, one of 1,470) and 4,509 pins from a search, three boards and a
profile in about 8 minutes.

### What does this Actor do?

You give it searches (the words you would type in Pinterest's search box) or
links to Pinterest searches, boards and profiles. For each one it reads the
pins page after page, as you would by scrolling, and saves one row per pin
until it reaches your limit or the end.

Each row comes with:

- the pin's id, link, title, description and alt texts, when it was created,
  and the outbound link and its domain when the pin has one
- the image in its largest size, with its width, height, colour and every
  smaller size Pinterest offers, and the page images of a multi-page idea pin
- whether it is a video (and its length), promoted, or a repin
- its saves, "tried it" stats and reactions (saves and "tried it" come with
  pins read from a board or a profile; see *Good to know*)
- the topics, objects and interests Pinterest tags it with, and the rich-pin
  details (site, title, description) when the pin has them
- the pinner (id, username, name, picture, followers) and the original
  creator, and the board it is saved to (name, link, pin count, owner)
- where it came from: the search, board or profile, its place in that list,
  and, for a board, the board's own name, description, followers and pin count

### Why use it?

- **Boards checked against their count.** A board is read to its last pin,
  and the run's status says for each board whether the pins saved match the
  count Pinterest shows ("1,470 of 1,470"), or names the board when they do
  not.
- **Searches, boards and profiles in one run.** Mix searches and links; every
  row says which one it came from.
- **More per row.** Saves, "tried it" ratings, AI topics, the objects seen in
  the image, rich-pin details and every image size, at no extra cost.
- **Use the data anywhere.** Download as JSON, CSV or Excel, or send it to
  your own tools through Apify's API and integrations.

### How to use it

1. Type one or more searches into **Searches**, or paste Pinterest search,
   board or profile links into **Links**.
2. Optionally, set **Max pins per search, board or profile**.
3. Click **Start**. When the run ends, open the **Output** tab to view the
   pins or download them.

Run it with no input to see a sample: up to 100 pins each for "minimalist living
room" and "boho kitchen", charged as usual.

### Input

| Field                                                         | What it does                                     | Default |
| ------------------------------------------------------------- | ------------------------------------------------ | ------- |
| **Searches** (`searchQueries`)                                | Words to search for, one search each             | —       |
| **Links** (`startUrls`)                                       | Pinterest pin-search, board or profile links     | —       |
| **Max pins per search, board or profile** (`maxPinsPerInput`) | Stop each one after this many pins (1 to 10,000) | 100     |

Give at least one search or one link. Example input:

```json
{
  "searchQueries": ["minimalist living room"],
  "startUrls": [
    "https://www.pinterest.com/somebody/kitchen-ideas/",
    "https://www.pinterest.com/somebody/"
  ],
  "maxPinsPerInput": 500
}
```

### Output

One row per pin. An example, with made-up values:

```json
{
  "id": "100000000000000001",
  "url": "https://www.pinterest.com/pin/100000000000000001/",
  "title": "A bright living room",
  "description": "Light wood, white walls and one green plant.",
  "grid_description": "Light wood, white walls …",
  "seo_title": "A bright living room",
  "alt_text": null,
  "auto_alt_text": "a living room with a sofa and a plant",
  "seo_alt_text": null,
  "created_at": "2025-01-01T08:00:00.000Z",
  "link": "https://shop.example/sofa",
  "tracked_link": "https://shop.example/sofa?utm_source=pinterest",
  "domain": "shop.example",
  "image_url": "https://i.pinimg.com/originals/aa/bb/cc/example.jpg",
  "image_width": 1000,
  "image_height": 1500,
  "images": {
    "236x": { "url": "https://i.pinimg.com/236x/aa/bb/cc/example.jpg", "width": 236, "height": 354 }
  },
  "dominant_color": "#c3b2a1",
  "image_signature": "aabbcc",
  "is_video": false,
  "video_duration_ms": null,
  "is_story_pin": true,
  "story_page_count": 1,
  "story_images": ["https://i.pinimg.com/originals/aa/bb/cc/page1.jpg"],
  "save_count": 42,
  "done_count": 1,
  "repin_count": 7,
  "favorite_count": 3,
  "reaction_count": 2,
  "reactions": { "1": 2 },
  "tried_it": {
    "user_count": 2,
    "rating": 4,
    "recommended_count": 1,
    "responses_count": 2,
    "details_count": 0,
    "images_count": 1,
    "videos_count": 0,
    "recommend_scores": [{ "score": 5, "count": 1 }]
  },
  "is_promoted": false,
  "is_repin": true,
  "method": "photos",
  "privacy": "public",
  "visual_annotations": ["sofa", "plant"],
  "ai_topics": [{ "id": "900001", "name": "Living room ideas" }],
  "interest_tags": [{ "id": "900002", "name": "Home decor" }],
  "rich_pin": {
    "type": "article",
    "site_name": "A site",
    "title": "Ten bright rooms",
    "description": "How to …",
    "url": "https://site.example/a",
    "favicon_url": "https://site.example/favicon.ico"
  },
  "product_id": null,
  "product_type": null,
  "shopping_flags": [],
  "is_out_of_stock": false,
  "is_stale_product": false,
  "pinner_id": "900000000000000002",
  "pinner_username": "somebody",
  "pinner_name": "Some Body",
  "pinner_url": "https://www.pinterest.com/somebody/",
  "pinner_image_url": "https://i.pinimg.com/140x140/aa/example.jpg",
  "pinner_follower_count": null,
  "pinner_is_verified_merchant": false,
  "pinner_is_verified": false,
  "creator_id": "900000000000000003",
  "creator_username": "someoneelse",
  "creator_name": "Someone Else",
  "board_id": "700000000000000002",
  "board_name": "Kitchen ideas",
  "board_url": "https://www.pinterest.com/somebody/kitchen-ideas/",
  "board_pin_count": null,
  "board_section_count": null,
  "board_collaborator_count": null,
  "board_is_collaborative": false,
  "board_privacy": "public",
  "board_updated_at": null,
  "board_owner_id": "900000000000000002",
  "board_owner_username": "somebody",
  "position": 1,
  "source_type": "board",
  "source_url": "https://www.pinterest.com/somebody/kitchen-ideas/",
  "source_query": null,
  "source_id": "700000000000000002",
  "source_name": "Kitchen ideas",
  "source_description": "Ideas for a small kitchen",
  "source_pin_count": 110,
  "source_follower_count": 55,
  "source_section_count": 0,
  "source_sectionless_pin_count": 110,
  "source_collaborator_count": 0,
  "source_is_collaborative": false,
  "source_updated_at": "2025-10-06T10:00:00.000Z",
  "source_cover_url": "https://i.pinimg.com/custom_covers/222x/example.jpg",
  "source_related_interests": [{ "id": "900003", "name": "Small kitchens" }],
  "source_owner_id": "900000000000000002",
  "source_owner_username": "somebody",
  "source_owner_name": "Some Body"
}
```

Fields Pinterest does not show for a pin are `null` (or an empty list).

### How much does it cost?

No surcharges and no paid options; an item that fails is not charged.

You pay for what you get:

- **$1 per 1,000 pins** ($0.001 a pin). Pins from searches, boards and profiles cost the same. Each is charged once per run.
- No start fee, and nothing per search, board or profile.

So 1,000 pins cost $1. If you set a maximum cost for a run, the Actor stops
when it reaches it and keeps every pin saved so far.

### How long does a run take?

About 15 seconds for the first 100 pins of two searches, and 5 to 8
minutes for 4,500 pins from a search, three boards (one of 1,470 pins) and a
profile.

### Good to know

- **A search ends where Pinterest ends it.** Pinterest stops showing more pins
  after a few hundred for most searches, so a search may end below your
  maximum.
- **Search pins carry fewer counts.** Pinterest's search results do not include
  a pin's saves or "tried it" stats; pins read from a board or a profile do.
  A search row has the pinner's followers and the board's pin count instead.
- **A board can come back with only its first 25 pins.** Pinterest sometimes
  shows a visitor who is not logged in only the start of a board. The Actor
  tries again several times; when it still gets 25, the status names the
  board ("25 of 110"). Run it again later: in our tests about 2 board reads in
  3 came back whole.
- **A board's count includes its sections.** Pins in a board's sections are
  read too. A board with hidden or removed pins can end a few pins below the
  count Pinterest shows, and the status says so.
- **A profile gives the pins that person saved**, across all
  their boards.
- **A pin found twice is saved and charged once**, under the search, board or
  profile that reached it first. The board check counts only the pins saved
  under that board, so a board that shares pins with a search in the same run
  can show "25 of 30" although all 30 are in the dataset. Run a board on its
  own to check it.
- **Check your links first.** A link that is not a Pinterest pin search, board
  or profile (a single pin, a board section, a short pin.it link) stops the
  run before anything is read, and the message names it.
- **One input that cannot be read does not stop the run.** The others carry
  on, and the run's status lists the ones that could not be read.
- **Personal data.** Rows include pinners' and creators' usernames, names and
  pictures. Only collect them when you have a legitimate reason to.

### More Actors from us

- [AliExpress Product Scraper: Search Results & Prices](https://apify.com/luzivanlt/aliexpress-products-scraper): Every product of an AliExpress search to its last page, with exact sold counts and ratings.
- [Amazon Product Scraper: Search Results & Prices](https://apify.com/luzivanlt/amazon-products-scraper): Every product on Amazon's search pages to the last page, sponsored marked, with monthly sales.
- [App Store Reviews Scraper: All Reviews, Not 500](https://apify.com/luzivanlt/app-store-reviews-scraper): Every written App Store review of an app, not just the newest 500.
- [Woolworths Coles ALDI Scraper: AU Grocery Prices](https://apify.com/luzivanlt/au-supermarkets-scraper): Woolworths, Coles and ALDI products for any search in one run, every results page to the end.
- [Bilibili Video Scraper: Search & Channel Videos](https://apify.com/luzivanlt/bilibili-videos-scraper): Bilibili videos from searches or whole channels, each with its full detail page's data.
- [Career Site Jobs Scraper: Workday, Greenhouse, Lever](https://apify.com/luzivanlt/career-site-jobs-scraper): Every job on Greenhouse, Lever, Ashby, SmartRecruiters and Workday boards, checked against each board's count.

### Use it from an AI agent or the API

One call starts a run and returns its items (Apify waits up to 300 seconds; for a
longer run, start it with `POST /v2/acts/…/runs` and read its dataset):

```text
POST https://api.apify.com/v2/acts/luzivanlt~pinterest-pins-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>
```

With the sample input as its JSON body:

```json
{
  "searchQueries": ["minimalist living room", "boho kitchen"],
  "maxPinsPerInput": 100
}
```

Its inputs, in the order of the input form:

| Input                                                     | What it takes                                                                                                                                                                                                                   | Default |
| --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
| `searchQueries` (Searches)                                | Words to search Pinterest for, one search per line, as you would type them in Pinterest's search box (e.g. "minimalist living room").                                                                                           | —       |
| `startUrls` (Links)                                       | Pinterest links: a pin search (https://www.pinterest.com/search/pins/?q=…), a board (https://www.pinterest.com/\<name>/\<board>/) or a profile (https://www.pinterest.com/\<name>/), which gives the pins that person saved. | —       |
| `maxPinsPerInput` (Max pins per search, board or profile) | Stop each search, board or profile after this many pins, in Pinterest's order, from 1 to 10,000.                                                                                                                                | `100`   |

Apify's MCP server, `https://mcp.apify.com`, lists it as `luzivanlt/pinterest-pins-scraper`. To give an
AI agent this Actor as a tool, add the server to the agent's MCP config:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=luzivanlt/pinterest-pins-scraper"
    }
  }
}
```

The client signs in with OAuth, or add `"headers": { "Authorization": "Bearer <APIFY_TOKEN>" }`.

Charged per pin delivered; the sample input above costs at most $0.20.

### FAQ

**Do I need a Pinterest account or cookies?**
No. The Actor reads what anyone can see on Pinterest without logging in.

**Can I get the pins of a board section?**
Not yet. Give the whole board's link; its sections' pins are included.

**Can I run it from my own code, on a schedule, or with other apps?**
Yes. Like any Apify Actor, you can start it through the Apify API, run it on a
schedule, and connect it to other apps with Apify's integrations and webhooks.

### Is it legal to scrape Pinterest?

This Actor reads only what anyone can see on Pinterest without logging in.
Check Pinterest's terms and the laws that apply to you before you use the
data, and only collect personal data when you have a legitimate reason to. If
you are unsure, ask a lawyer.

### Support

Found a problem or missing a feature? Open an issue on the **Issues** tab and
include the run's link.

***

This Actor is not affiliated with, endorsed by or sponsored by Pinterest.

# Changelog

This Actor's version history is a separate document: https://apify.com/luzivanlt/pinterest-pins-scraper/changelog.md

# Actor input Schema

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

Words to search Pinterest for, one search per line, as you would type them in Pinterest's search box (e.g. "minimalist living room"). Up to 200 characters each; paste links under Links. Each search reads up to Max pins below, and usually ends on its own after a few hundred pins.

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

Pinterest links: a pin search (https://www.pinterest.com/search/pins/?q=…), a board (https://www.pinterest.com/<name>/<board>/) or a profile (https://www.pinterest.com/<name>/), which gives the pins that person saved. Country sites such as pinterest.co.uk work too. A single pin, a board section or a short pin.it link is refused. Example: https://www.pinterest.com/search/pins/?q=boho%20kitchen

## `maxPinsPerInput` (type: `integer`):

Stop each search, board or profile after this many pins, in Pinterest's order, from 1 to 10,000. Default 100. A search usually ends on its own after a few hundred pins; a board ends at its last pin. Each pin is charged once ($1 per 1,000 pins), so 100 pins cost at most $0.10 per input. Example: 500.

## Actor input object example

```json
{
  "searchQueries": [
    "minimalist living room",
    "boho kitchen"
  ],
  "maxPinsPerInput": 100
}
```

# Actor output Schema

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

Every pin the run saved, one row each.

## `allFields` (type: `string`):

The same rows with every field.

# 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": [
        "minimalist living room",
        "boho kitchen"
    ],
    "maxPinsPerInput": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("luzivanlt/pinterest-pins-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": [
        "minimalist living room",
        "boho kitchen",
    ],
    "maxPinsPerInput": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("luzivanlt/pinterest-pins-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": [
    "minimalist living room",
    "boho kitchen"
  ],
  "maxPinsPerInput": 100
}' |
apify call luzivanlt/pinterest-pins-scraper --silent --output-dataset

```

## MCP server setup

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