# Pinterest Search Scraper — Pins, Boards, Creators (`xtracto/pinterest-search`) Actor

Search Pinterest by keyword and get pins, video pins, boards or creator profiles as clean rows — images, links, source domain, reactions, follower counts and Pinterest's own topic labels. No account or API key needed.

- **URL**: https://apify.com/xtracto/pinterest-search.md
- **Developed by:** [Farhan Febrian Nauval](https://apify.com/xtracto) (community)
- **Categories:** Social media, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Pinterest Search Scraper

Search Pinterest by keyword and get the results as clean rows — pins, video pins, boards or creator profiles, each with images, source links, reaction counts and follower numbers.

### Why use this actor

- **No Pinterest account, no login, no API key.** Type a keyword, press Run.
- **Four kinds of results from one actor.** Image pins, video pins, whole boards, or the creators behind them — pick the mode you need.
- **Real engagement numbers**, not guesses: reaction counts per pin, creator follower counts, board pin counts.
- **Pinterest's own topic labels** come along for the ride. Every pin carries the related-topic phrases Pinterest itself assigns to it — a ready-made list of what people actually search for around your keyword.
- **Paid placements are filtered out by default**, so a run of 100 results means 100 organic results. Flip one switch if you want to study the ads instead.
- **Stable JSON output** with the same column names every run — drop it straight into a spreadsheet, database or dashboard. Export as JSON, CSV or Excel.
- Automatic retries and self-healing when Pinterest updates its site, so there is nothing to babysit.

### Use cases

- **Trend research** — track which topics, colours and styles surface for a keyword over time by running on a schedule.
- **Content ideation** — pull the top-performing pins for your niche and see the phrasing, imagery and topics that earn reactions.
- **Competitor monitoring** — find which brands and websites are winning the search results for your keywords (every pin says which site it links to).
- **Creator discovery** — search in Creators mode to build a shortlist of accounts in your niche, ranked by follower count.
- **Ad research** — switch on promoted results to see who is paying for placement against your keywords.

### How it works

1. You give it one or more search terms and pick what you want back: pins, video pins, boards or creators.
2. For each term the actor opens Pinterest's search results the same way a visitor would.
3. It reads through the results page by page, following Pinterest's own "load more" trail until it reaches your result limit or runs out of results.
4. Duplicates are removed, paid placements are dropped (unless you ask for them), and each result is written out as one row.
5. If a search term returns nothing, you still get a row for it explaining why — nothing silently disappears.

You do not need to manage scrapers, browsers, logins or blocks. Everything is handled inside the run.

### Input

```json
{
  "mode": "pins",
  "queries": ["home decor"],
  "maxItems": 100,
  "maxPagesPerQuery": 4,
  "includePromoted": false,
  "maxConcurrency": 2,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

| Field | Type | Description |
| --- | --- | --- |
| `mode` | string | What to search for: `pins` (image results, default), `videos` (results containing video), `boards` (collections), `users` (creator profiles). |
| `queries` | array of strings | Search terms, exactly as you would type them into Pinterest's search box. Each is searched separately. |
| `maxItems` | integer | Results per search term. Default `100`. |
| `maxPagesPerQuery` | integer | Safety limit on how many pages to read per term. Default `4`. |
| `includePromoted` | boolean | Keep paid, promoted results. Default `false` (organic only). |
| `maxConcurrency` | integer | How many search terms to work on at once. Default `2`. |
| `proxyConfiguration` | object | Optional. Residential is recommended for long runs or large keyword lists. |

### Output

Every row carries `_input` (the search term), `_source`, `_scrapedAt`, and a `recordType` telling you which shape it is. Alongside the friendly column names below, each row also keeps Pinterest's original fields untouched, so nothing is lost if you need to dig deeper.

#### Mode `pins` (and `videos`) — real output

```json
{
  "_input": "home decor",
  "_source": "S1-search-pins",
  "_scrapedAt": "2026-08-08T05:39:40Z",
  "recordType": "PIN",
  "searchQuery": "home decor",
  "searchScope": "pins",
  "pinId": "818529301075469330",
  "title": "Minimalist Home Design Ideas | Modern Neutral Living Room Inspiration",
  "description": "Create a calm and timeless home with this modern minimalist interior featuring warm neutral tones, natural wood textures, clean lines, and soft natural light. This elegant living space blends comfort with simplicity, making it perfect for anyone who loves clutter-free, cozy, and sophisticated home d …",
  "pinUrl": "https://www.pinterest.com/pin/818529301075469330/",
  "imageUrl": "https://i.pinimg.com/originals/2a/04/68/2a046887fcb977ab5ebc55032ea66c70.png",
  "imageWidth": 1023,
  "imageHeight": 1537,
  "videoUrl": null,
  "videoDurationMs": null,
  "isVideo": false,
  "boardName": "Rasa House",
  "boardUrl": "https://www.pinterest.com/vannvoleak9999/rasa-house/",
  "boardPinCount": 82,
  "boardOwnerUsername": "vannvoleak9999",
  "boardOwnerFollowerCount": 17,
  "pinnerUsername": "vannvoleak9999",
  "pinnerFullName": "Voleak Vann",
  "pinnerFollowerCount": 17,
  "pinnerProfileUrl": "https://www.pinterest.com/vannvoleak9999/",
  "domain": "Uploaded by user",
  "outboundUrl": null,
  "createdAt": "Sun, 26 Jul 2026 14:12:53 +0000",
  "dominantColor": "#9e866d",
  "altText": "a living room filled with furniture and a flat screen tv on top of a wooden table",
  "reactionCount": 9,
  "reactionCounts": { "1": 9 },
  "didItCount": 0,
  "annotations": ["Minimal Home Design", "House Interior Design", "Cozy Minimalist Home", "… 7 more"],
  "isPromoted": false,
  "promotedBy": null,
  "attributedTo": null
}
```

| Field | Type | Description |
| --- | --- | --- |
| `pinId` | string | Pinterest's id for the pin. |
| `title` | string | Pin title. Many pins have no title — `null` when Pinterest has none. |
| `description` | string | Pin description written by the creator, hashtags included. |
| `pinUrl` | string | Link to the pin on Pinterest. |
| `imageUrl` | string | Largest available image. `imageWidth` / `imageHeight` give its size. |
| `videoUrl` | string | Video stream when the pin has one, otherwise `null`. `videoDurationMs` is its length in milliseconds. |
| `isVideo` | boolean | Whether the pin contains video. |
| `boardName` / `boardUrl` | string | The board this pin was saved to. |
| `boardPinCount` | number | How many pins that board holds. |
| `boardOwnerUsername` / `boardOwnerFollowerCount` | string / number | Who owns the board and their follower count. |
| `pinnerUsername` / `pinnerFullName` / `pinnerProfileUrl` | string | The creator who saved the pin. |
| `pinnerFollowerCount` | number | That creator's follower count. |
| `domain` | string | The website the pin links to. Reads `"Uploaded by user"` for pins uploaded straight to Pinterest. |
| `outboundUrl` | string | The destination link, when the pin has one. |
| `createdAt` | string | When the pin was created. |
| `dominantColor` | string | Main colour of the image as a hex code — handy for palette and style analysis. |
| `altText` | string | Plain-language description of the picture. |
| `reactionCount` | number | Total reactions on the pin — the engagement signal to sort by. |
| `reactionCounts` | object | Reactions broken down by type, where `"1"` is the standard reaction. |
| `didItCount` | number | How many "I tried it" posts the pin has. |
| `annotations` | array | Pinterest's own related-topic phrases for this pin. |
| `isPromoted` | boolean | Whether this is a paid placement. Only appears when `includePromoted` is on. |
| `promotedBy` | string | The advertiser behind a paid placement. |
| `attributedTo` | string | The brand credited on the pin, if any. Appears on organic pins too. |

#### Mode `boards` — real output

```json
{
  "_input": "home decor",
  "_source": "S1-search-boards",
  "_scrapedAt": "2026-08-08T05:40:12Z",
  "recordType": "BOARD",
  "searchQuery": "home decor",
  "searchScope": "boards",
  "boardId": "32088284783970716",
  "boardName": "Home Decor",
  "boardUrl": "https://www.pinterest.com/marthastewart/home-decor/",
  "boardDescription": "Give your home decor an upgrade with these tips and tricks.",
  "pinCount": 3263,
  "sectionCount": 0,
  "collaboratorCount": 0,
  "isCollaborative": false,
  "privacy": "public",
  "coverImageUrl": "https://i.pinimg.com/474x/97/39/7b/97397b600f7d4c48212ad29858e1fb44.jpg",
  "ownerUsername": "marthastewart",
  "ownerFullName": "Martha Stewart",
  "ownerFollowerCount": 1867965,
  "ownerProfileUrl": "https://www.pinterest.com/marthastewart/",
  "lastModifiedAt": "Sat, 08 Aug 2026 02:01:17 +0000"
}
```

| Field | Type | Description |
| --- | --- | --- |
| `boardId` | string | Pinterest's id for the board. |
| `boardName` / `boardUrl` | string | Board name and link. |
| `boardDescription` | string | Description written by the owner. |
| `pinCount` | number | How many pins the board holds — the size signal. |
| `sectionCount` | number | How many sections the board is split into. |
| `collaboratorCount` / `isCollaborative` | number / boolean | Whether several people contribute to the board. |
| `privacy` | string | `public` for boards you can reach without an account. |
| `coverImageUrl` | string | Board cover image. |
| `ownerUsername` / `ownerFullName` / `ownerProfileUrl` | string | Who owns the board. |
| `ownerFollowerCount` | number | The owner's follower count — use it to rank boards by reach. |
| `lastModifiedAt` | string | When the board was last touched. |

#### Mode `users` — real output

```json
{
  "_input": "home decor",
  "_source": "S1-search-users",
  "_scrapedAt": "2026-08-08T05:40:22Z",
  "recordType": "USER",
  "searchQuery": "home decor",
  "searchScope": "users",
  "userId": "887842651448232609",
  "username": "homedecor",
  "fullName": "Home Decor",
  "profileUrl": "https://www.pinterest.com/homedecor/",
  "followerCount": 27584,
  "pinCount": 12892,
  "boardCount": 273,
  "imageUrl": "https://i.pinimg.com/280x280_RS/20/ee/75/20ee75eb55a815f82f1fa6617233d83d.jpg",
  "isVerified": true,
  "isVerifiedMerchant": false,
  "domainVerified": false,
  "lastPinSaveTime": "Wed, 05 Aug 2026 20:33:21 +0000"
}
```

| Field | Type | Description |
| --- | --- | --- |
| `userId` / `username` / `fullName` | string | Who the creator is. |
| `profileUrl` | string | Link to their Pinterest profile. |
| `followerCount` | number | Follower count — the main ranking signal for creator shortlists. |
| `pinCount` / `boardCount` | number | How much they have published. |
| `imageUrl` | string | Profile picture. |
| `isVerified` | boolean | Whether Pinterest has verified the identity. |
| `isVerifiedMerchant` | boolean | Whether they are an approved merchant. |
| `domainVerified` | boolean | Whether they have verified a website they own. |
| `lastPinSaveTime` | string | When they last saved a pin — tells you if the account is still active. |

#### When something goes wrong

A search term that fails still produces a row, so you always know what happened:

```json
{
  "_input": "zzzqqqxxx nonexistent keyword 91731",
  "_source": "none",
  "_scrapedAt": "2026-08-08T05:38:33Z",
  "_error": "no_results",
  "_errorDetail": "Pinterest returned no videos for this search term."
}
```

`_error` is one of `no_results`, `resource_rejected` (Pinterest turned the request away — usually clears on a re-run), `fetch_failed` (network trouble) or `exception`.

### Notes and limits

- **First page is big, later pages are small.** Pinterest returns up to about 100 results on the first page of a keyword, then roughly 25 per page after that. If you want more than ~100 pins per term, raise `maxPagesPerQuery` along with `maxItems`. Boards and Creators always come back 50 at a time.
- **Save counts are not published.** Pinterest does not expose per-pin save or repin numbers in search results, so this actor does not report them. `reactionCount` is the engagement figure Pinterest does publish, and it is real.
- **Many pins have no title.** Roughly four in ten results carry no title text; `description` and `altText` are usually still filled in.
- **Results vary by location.** Pinterest tailors search results to where the request comes from. If you need results for a specific country, pick that country in the proxy settings.
- **Use Residential for volume.** Short runs generally work with the proxy off. For long keyword lists or scheduled daily runs, switch on Residential.
- **Creators mode returns profiles, not contact details.** Only what Pinterest shows publicly on a profile.

### Other Pinterest actors in this collection

| Actor | What it does |
| --- | --- |
| Pinterest Board Scraper | One board's details and all of its pins. |
| Pinterest Pin Detail | Full detail for a specific pin. |
| Pinterest User Profile | Full profile details for a specific creator. |

# Actor input Schema

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

Which kind of Pinterest result you want back. 'Pins' is the standard image feed, 'Video pins' returns only pins that have a video, 'Boards' returns whole collections, and 'Creators' returns profiles. Each mode returns its own record shape.

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

One or more keywords to search Pinterest for, exactly as you would type them into the search box, for example 'home decor' or 'minimalist kitchen'. Each term is searched separately and every result says which term it came from.

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

How many results to return for each search term. Pinterest's feed is effectively endless for popular keywords, so this is the main control on run length and cost.

## `maxPagesPerQuery` (type: `integer`):

A second safety limit: stop after this many pages even if the result cap has not been reached. Raise it if you ask for a lot of results and see runs stopping early.

## `includePromoted` (type: `boolean`):

Pinterest mixes paid, promoted pins into search results. Off by default so you only get organic results; turn it on if you are researching what advertisers are running.

## `maxConcurrency` (type: `integer`):

How many search terms to work on at the same time. Two is a good balance; raise it for speed on long keyword lists, lower it to one if results start coming back empty.

## `proxyConfiguration` (type: `object`):

Optional. Pinterest gets stricter as volume goes up, so Residential is recommended for long runs or large keyword lists. Short runs usually work with the proxy turned off.

## Actor input object example

```json
{
  "mode": "pins",
  "queries": [
    "home decor"
  ],
  "maxItems": 100,
  "maxPagesPerQuery": 4,
  "includePromoted": false,
  "maxConcurrency": 2,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

Which kind of row this is.

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

Search Query as reported by the source.

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

Pin Id as reported by the source.

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

Title of the item.

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

Link to the pin.

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

Link to the image.

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

Board Name as reported by the source.

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

Domain the row belongs to.

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

Reaction Count. Whole number.

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

Pinner Username as reported by the source.

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

Pinner Follower Count. Whole number.

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

Creation timestamp, ISO 8601.

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

UTC timestamp of the scrape, ISO 8601.

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

Search Scope as reported by the source.

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

Short description or summary.

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

Image Width as reported by the source.

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

Image Height as reported by the source.

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

Link to the video.

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

Video Duration Ms.

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

Is Video. Boolean value.

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

Link to the board.

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

Board Pin Count. Whole number.

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

Board Owner Username as reported by the source.

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

Board Owner Follower Count. Whole number.

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

Pinner Full Name as reported by the source.

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

Link to the pinner profile.

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

Link to the outbound.

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

Dominant Color as reported by the source.

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

Alt Text as reported by the source.

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

Reaction Counts.

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

Did It Count. Whole number.

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

Annotations.

# 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"
    ],
    "maxItems": 100,
    "maxPagesPerQuery": 4,
    "maxConcurrency": 2
};

// Run the Actor and wait for it to finish
const run = await client.actor("xtracto/pinterest-search").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"],
    "maxItems": 100,
    "maxPagesPerQuery": 4,
    "maxConcurrency": 2,
}

# Run the Actor and wait for it to finish
run = client.actor("xtracto/pinterest-search").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"
  ],
  "maxItems": 100,
  "maxPagesPerQuery": 4,
  "maxConcurrency": 2
}' |
apify call xtracto/pinterest-search --silent --output-dataset

```

## MCP server setup

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

```

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/tk2BuYD0KVcRPMQ2Z/builds/rS29p3R48KpSUzmk7/openapi.json
