# Pinterest Scraper — Search, Profiles, Boards & Videos (`meka.im/pinterest-scraper`) Actor

Search Pinterest by keyword or paste any pin, profile, board or search URL. Get pins, videos, boards and profiles with multi-size images, MP4/HLS video, and full creator and board data. $1 per 1,000 delivered results. No start fee, login, or cookies.

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

## Pricing

$1.00 / 1,000 result delivereds

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

Search Pinterest by keyword, or paste any pin, profile, board or search-results URL, and get back clean
JSON: **pins, videos, boards and profiles**, each with multi-size images, video HLS and MP4 links with
duration and thumbnail, and the **full creator and board objects** — follower count, board pin count,
section count, collaborator count, board owner, merchant and identity verification flags.

**$1.00 per 1,000 delivered results. No start fee.** Comparable Actors on this Store were priced at
$2–$4 per 1,000 when we surveyed them on 2026-09-20. You are billed only for rows that were parsed and
written to the dataset: **no charge for invalid inputs, duplicates, failed lookups or rows a resumed run
had already delivered.**

**No login, no cookies, no browser, no proxy configuration.**

What this Actor does **not** provide: **save counts, repin counts and impression numbers** (Pinterest
does not publish them on the anonymous surfaces this Actor reads), **creator contact details**,
**sentiment or AI topic analysis**, and **full carousel support**. It also cannot promise that
off-topic results are filtered — Pinterest answers a nonsense keyword with unrelated pins rather than an
empty result, so relevance is yours to judge. See [Limits](#limits).

### Quick start

1. Open the Actor, type a keyword into **Search keywords**, and click **Start**.
2. Leave **Search result type** at `All pins` (or pick `Videos`, `Boards`, `Profiles`).
3. Watch rows stream into the dataset, then export JSON, CSV, Excel or XML — or pull them over the API.

A first run that costs ten cents:

```json
{
  "queries": ["minimalist kitchen", "summer outfit ideas"],
  "type": "all-pins",
  "limit": 100,
  "includeDetails": true
}
```

### Input

| Input | What it does |
|---|---|
| `queries` | Keywords to search. Each is paginated until the run hits `limit`. |
| `startUrls` | Pinterest URLs — a pin, a profile, a profile's Created or Saved tab, a board, or a search page. Routed automatically. |
| `type` | `all-pins`, `videos`, `boards` or `profiles`. Controls what keyword searches return. |
| `limit` | Hard cap on delivered rows for the whole run — this is what you pay for. Default 100. |
| `includeDetails` | **On by default.** One extra lookup per pin for video files, merchant attribution and product metadata. |
| `bookmark` | Optional. Paste `lastBookmark` from an earlier run's output to continue where it stopped. |
| `detailConcurrency` | Parallel detail batches. Default 2. |

Targets are de-duplicated and processed in this order: `queries` → `startUrls`, each in the order you
wrote them. The dataset keeps that physical order, and a resumed run continues it rather than restarting.

### Output

One dataset row per result. Pin records look like this:

```json
{
  "type": "pin",
  "entity_type": "pin",
  "schema": { "version": 1, "entity_type": "pin" },
  "id": "633600241367267936",
  "url": "https://www.pinterest.com/pin/633600241367267936/",
  "title": "Modern Black & Walnut Kitchen",
  "source_url": "https://www.pinterest.com/search/pins/?q=minimalist%20kitchen",
  "seed_type": "query",
  "seed_value": "minimalist kitchen",
  "pin": {
    "title": "Modern Black & Walnut Kitchen",
    "description": "Matte black cabinets paired with rich walnut wood textures.",
    "alt_text": null,
    "created_at": "2025-09-14T19:07:35.000Z",
    "link": "https://colorharmonynest.etsy.com/listing/4339033898",
    "domain": "colorharmonynest.etsy.com",
    "dominant_color": "#484134",
    "is_promoted": false,
    "is_video": false,
    "reaction_counts": { "1": 301 },
    "story": null,
    "product_metadata_type": "richproductmetadata",
    "rich_summary_type": "product"
  },
  "creator": {
    "id": "925630667071684941",
    "username": "colorharmonynest",
    "full_name": "Color Harmony Nest",
    "follower_count": 170,
    "image_small_url": "https://i.pinimg.com/30x30_RS/ce/8c/e8/ce8ce8a7a93304ccba268be0de611abe.jpg",
    "image_medium_url": "https://i.pinimg.com/75x75_RS/ce/8c/e8/ce8ce8a7a93304ccba268be0de611abe.jpg",
    "image_large_url": "https://i.pinimg.com/140x140_RS/ce/8c/e8/ce8ce8a7a93304ccba268be0de611abe.jpg",
    "url": "https://www.pinterest.com/colorharmonynest/",
    "is_verified_merchant": false,
    "is_primary_website_verified": true,
    "verified_identity": null
  },
  "board_ref": {
    "id": "633600310016216050",
    "name": "ARCHITECTURE & DESIGN Group Board",
    "url": "https://www.pinterest.com/v_vladislava_a/architecture-design-group-board/",
    "pin_count": 19840,
    "section_count": 49,
    "collaborator_count": 341,
    "is_collaborative": true,
    "image_cover_url": "https://i.pinimg.com/custom_covers/200x150/633600310016216050_1724514811.jpg",
    "image_cover_hd_url": null,
    "owner": { "username": "v_vladislava_a", "follower_count": 12043 }
  },
  "media": {
    "images": {
      "thumb": { "url": "https://i.pinimg.com/170x/1f/33/0a/1f330a23.jpg", "width": 170, "height": 255 },
      "small": { "url": "https://i.pinimg.com/236x/1f/33/0a/1f330a23.jpg", "width": 236, "height": 354 },
      "medium": { "url": "https://i.pinimg.com/474x/1f/33/0a/1f330a23.jpg", "width": 474, "height": 711 },
      "large": { "url": "https://i.pinimg.com/736x/1f/33/0a/1f330a23.jpg", "width": 736, "height": 1104 },
      "original": { "url": "https://i.pinimg.com/originals/1f/33/0a/1f330a23.jpg", "width": 853, "height": 1280 },
      "images_by_size": { "170x": {}, "236x": {}, "474x": {}, "736x": {}, "orig": {} }
    },
    "video": null
  },
  "merchant_attribution": { "username": "etsy", "is_verified_merchant": true },
  "detail_fetched": true
}
```

Video pins carry `type: "video"` and a populated `media.video`:

```json
{
  "hls_url": "https://v1.pinimg.com/videos/iht/hls/42/f1/ab/42f1ab8d.m3u8",
  "mp4_url": "https://v1.pinimg.com/videos/iht/expMp4/42/f1/ab/42f1ab8d_720w.mp4",
  "duration_ms": 12579,
  "width": 1000,
  "height": 1500,
  "thumbnail": "https://i.pinimg.com/videos/thumbnails/originals/42/f1/ab/42f1ab8d.0000000.jpg",
  "variants": [{ "format": "V_720P", "url": "…", "width": 1000, "height": 1500, "duration_ms": 12579 }]
}
```

Board records carry a `board` object (with `description` and `follower_count`), profile records carry a
`profile` object (with `about`, `pin_count`, `board_count`, `following_count`, `website_url`).

Notes on the values:

- Unknown values are `null`; a `0` in the data is a real zero. Missing image sizes are `null` rather than
  empty objects, and `images_by_size` keeps Pinterest's own size keys as they come.
- `detail_fetched` tells apart "Pinterest publishes nothing here" from "this run did not look" — with
  `includeDetails` off, `merchant_attribution` and the product fields are `null` because they were not
  requested.
- `lastBookmark` in the run summary is the pagination cursor where the run stopped. It survives across
  sessions and regions, so pasting it back into `bookmark` resumes the same walk.

### Pagination and resuming

Pinterest paginates with an opaque bookmark. This Actor follows it automatically, de-duplicates by
record ID, and advances the cursor only after a page is fully committed. Abort a run and resurrect it and
it continues from the dataset, without re-delivering or re-billing a single row.

### Pricing

Pay-per-event, **$0.001 per delivered result — $1.00 per 1,000**. Platform usage is included; there is no
monthly rental and no Actor-start fee.

| Event | Price | When it fires |
|---|---|---|
| `result-delivered` | $0.001 | One pin, video, board or profile written to the dataset |

Not billed: invalid inputs, duplicate targets, pins that failed to parse, and rows a resumed run had
already delivered. Set **Max results for the run**, or a maximum total charge on the run, for a hard
ceiling — the run stops before publishing a row it cannot bill.

### Limits

- **Not published on the anonymous surfaces this Actor reads:** save counts, repin counts, impression or
  click numbers. This Actor does not estimate them.
- **Not provided:** creator email or contact details; sentiment scoring; AI topic classification.
- **Carousel pins** are not claimed as supported — the source exposes carousel data on too few pins for
  us to stand behind it.
- **Off-topic results are not filtered out.** Pinterest answers an unmatched keyword with unrelated
  pins instead of an empty result, so a nonsense keyword still returns rows and still costs money. Check
  `seed_value` and the pin text if you need to judge relevance downstream.
- Search results rotate per session, so two runs of the same keyword overlap only partially. That is the
  source's behaviour, not a gap — within one run, results are de-duplicated by ID.
- Board pagination needs the board's internal ID, which this Actor resolves for you from the board URL.

### API and automation

Start runs and pull results over the [Apify API](https://docs.apify.com/api/v2), the
[JavaScript client](https://docs.apify.com/api/client/js/) or the
[Python client](https://docs.apify.com/api/client/python/). Put it on a
[schedule](https://docs.apify.com/platform/schedules) to watch a niche week over week, and use
[webhooks](https://docs.apify.com/platform/integrations/webhooks) to trigger downstream work. The output
is plain JSON, so it also plugs into agents through the
[Apify MCP server](https://docs.apify.com/platform/integrations/mcp).

JavaScript:

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });
const run = await client.actor('pinterest-scraper').call({
  queries: ['minimalist kitchen'],
  type: 'all-pins',
  limit: 250,
  includeDetails: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, 'results');
```

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("MY_APIFY_TOKEN")
run = client.actor("pinterest-scraper").call(run_input={
    "startUrls": ["https://www.pinterest.com/nike/nike-running/"],
    "limit": 200,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["id"], item["type"], item["title"])
```

### FAQ

**Do I need a Pinterest account, cookies or a proxy?** No. The Actor reads Pinterest's public web
endpoints over anonymous HTTP from data-centre IPs.

**Why do two runs of the same keyword return different pins?** Pinterest rotates its search feed per
session. Within a single run nothing is duplicated; across runs, expect partial overlap.

**How do I page through a lot of results?** Raise `limit`. The Actor follows Pinterest's bookmark for
you. To continue later, copy `lastBookmark` from the run summary into the `bookmark` input.

**What happens if I abort a run and start it again on the same dataset?** It resumes. Rows already in the
dataset are skipped, physical order is preserved, and nothing is billed twice.

**Can I get how many times a pin was saved?** Not from this source. `reaction_counts` is what Pinterest
publishes; save and repin counts are not on these surfaces, and this Actor will not guess them.

**Does `includeDetails` cost extra?** No. Pricing is one flat event per delivered row regardless.
Turning it off only makes the run faster and shallower.

### Legal

This Actor is an independent tool. It is not affiliated with, endorsed by, sponsored by or certified by
Pinterest, Inc., and it is not an official Pinterest product. "Pinterest" and related marks belong to
their respective owners and are used here only descriptively, to identify the publicly accessible source
this Actor reads. The Actor collects only information Pinterest publishes publicly. You are responsible
for ensuring your use of that information complies with applicable laws, regulations and the source
website's terms.

# Actor input Schema

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

Keywords to search Pinterest for. Each keyword is paginated until the run hits Max results.

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

Paste Pinterest URLs: a pin, a profile, a profile's Created or Saved tab, a board, or a search results page. Each is routed automatically.

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

What keyword searches return. Pins and videos come back as pin records; boards and profiles come back as board and profile records.

## `limit` (type: `integer`):

Hard cap on delivered rows across every keyword and URL. This is what you pay for.

## `includeDetails` (type: `boolean`):

On by default. Adds one lookup per pin for video files, merchant attribution and product metadata. Turn it off for a faster, list-only run.

## `bookmark` (type: `string`):

Optional. Paste the lastBookmark from a previous run's output to continue paginating the first target where it stopped.

## `detailConcurrency` (type: `integer`):

How many detail batches to fetch in parallel.

## Actor input object example

```json
{
  "queries": [
    "minimalist kitchen",
    "summer outfit ideas"
  ],
  "startUrls": [
    "https://www.pinterest.com/nike/",
    "https://www.pinterest.com/nike/nike-running/",
    "https://www.pinterest.com/pin/633600241367267936/"
  ],
  "type": "all-pins",
  "limit": 100,
  "includeDetails": true,
  "detailConcurrency": 2
}
```

# Actor output Schema

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

No description

## `boards` (type: `string`):

No description

## `profiles` (type: `string`):

No description

## `runSummary` (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": [
        "minimalist kitchen"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("meka.im/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 = { "queries": ["minimalist kitchen"] }

# Run the Actor and wait for it to finish
run = client.actor("meka.im/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 '{
  "queries": [
    "minimalist kitchen"
  ]
}' |
apify call meka.im/pinterest-scraper --silent --output-dataset

```

## MCP server setup

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