# Pinterest Profile Scraper — Pins, Boards & Stats (`apt_marble/pinterest-profile-scraper`) Actor

Scrape any public Pinterest profile: follower and pin stats, its boards with pin and follower counts, and its pins with save and repin numbers attached. Choose whether you want only the pins the profile created, or everything it has saved. No Pinterest account needed.

- **URL**: https://apify.com/apt\_marble/pinterest-profile-scraper.md
- **Developed by:** [Hamza](https://apify.com/apt_marble) (community)
- **Categories:** Social media, Lead generation, Automation
- **Stats:** 3 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 result rows

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/platform/actors/running/actors-in-store#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 Profile Scraper — Pins, Boards & Stats

Point this actor at any public Pinterest profile and get the whole picture back as clean, structured data: the profile's own stats (followers, total pins, total boards, monthly views and reach where the profile publishes them), its pins with save and repin counts already attached, and its boards with pin counts and board follower counts. It is built for marketers, agencies, brand teams and researchers who need to study a creator, a competitor or their own account at scale — no Pinterest account, no login, nothing to install.

***

### What you can do with it

- **Audit a competitor's Pinterest presence** — what they publish, how often, which boards they grow, and which pins actually get saved.
- **Separate original content from re-saves.** One switch decides whether you get *only the pins this profile made* or *everything they have saved*, including other people's pins they re-saved. Most accounts look completely different in the two modes.
- **Benchmark creators before you work with them** — follower counts, board follower counts, publishing recency and real save/repin numbers on their own work, side by side.
- **Track your own account over time** by scheduling a daily or weekly run and comparing the snapshots.
- **Build a board map of a niche** — every public board a profile keeps, with its size and its own follower count, ready to sort and filter.
- **Feed a content pipeline** with image links, destination links, board names and generated image descriptions.

***

### What you get

Three kinds of rows land in one dataset, told apart by the `type` field: one `profile` row, then its `pin` rows, then its `board` rows.

A pin row, abridged:

```json
{
  "type": "pin",
  "id": "165859198772944570",
  "url": "https://www.pinterest.com/pin/165859198772944570/",
  "title": "Record Player Setup In My Eclectic Living Room",
  "altText": "a room with a wooden dresser and a painting on the wall next to an open door",
  "createdAt": "2025-03-13T22:50:48.000Z",
  "saveCount": 14,
  "repinCount": 5,
  "reactionCount": 5,
  "imageUrl": "https://i.pinimg.com/originals/21/c9/80/21c980844d8e93e9e94e194d9e1ccc74.jpg",
  "imageWidth": 1224,
  "imageHeight": 1632,
  "domain": "shopltk.com",
  "boardName": "House Of Hipsters - Home Decor",
  "boardUrl": "https://www.pinterest.com/houseofhipsters/house-of-hipsters-home-decor/",
  "pinnerUsername": "houseofhipsters",
  "creatorUsername": "houseofhipsters",
  "isRepin": false,
  "isCreatedByProfile": true,
  "isPromoted": false,
  "promotedBy": null,
  "profileUsername": "houseofhipsters",
  "pinType": "created",
  "position": 1,
  "scrapedAt": "2026-08-04T12:00:00.000Z"
}
```

A profile row, abridged:

```json
{
  "type": "profile",
  "username": "settingforfour",
  "url": "https://www.pinterest.com/settingforfour/",
  "fullName": "Setting For Four Interiors | Virtual Interior Design",
  "followerCount": 451487,
  "followingCount": 1969,
  "pinCount": 171735,
  "boardCount": 292,
  "profileViews": 752055,
  "profileReach": 526311,
  "domainUrl": "www.settingforfour.com",
  "domainVerified": true,
  "createdAt": "2012-01-12T00:18:20.000Z",
  "lastPinSavedAt": "2026-08-04T01:51:57.000Z"
}
```

A board row, abridged:

```json
{
  "type": "board",
  "id": "165859267466191114",
  "name": "Jewelry Ideas",
  "url": "https://www.pinterest.com/houseofhipsters/jewelry-ideas/",
  "pinCount": 473,
  "followerCount": 50134,
  "collaboratorCount": 0,
  "privacy": "public",
  "profileUsername": "houseofhipsters"
}
```

***

### Input reference

| Field | Type | Default | What it does |
| --- | --- | --- | --- |
| `profiles` | list of strings | — (required) | Profile links or usernames, one per line. Accepts `https://www.pinterest.com/username/`, `/username/`, `@username` or plain `username`. Up to 200 per run. |
| `pinType` | select: `created` / `all` | `created` | `created` returns **only the pins this profile made**. `all` returns **everything this profile has saved**, in save order — which on most accounts is mostly other people's pins they re-saved. |
| `maxPinsPerProfile` | integer | `100` | How many pins to collect per profile (0–2,000). Set to `0` for stats and boards only. |
| `includeBoards` | boolean | `true` | Also return each profile's public boards. |
| `maxBoardsPerProfile` | integer | `50` | How many boards to collect per profile (0–1,000). |
| `includePromotedPins` | boolean | `true` | Promoted pins are always flagged. Switch this off to drop them and keep organic content only. |
| `country` | select | `us` | Which country to browse Pinterest from. Keep it fixed when comparing runs over time. |
| `profilesInParallel` | integer | `4` | How many profiles to work on in parallel (1–6). |

#### Which `pinType` do I want?

| You want to know… | Use |
| --- | --- |
| What does this brand actually publish? | `created` |
| How often do they post original content, and does it perform? | `created` |
| What is this person interested in / what do they curate? | `all` |
| What is on their boards right now, whoever made it? | `all` |

The two modes return genuinely different content. `created` on a big blogger account can be a few hundred original pins; `all` on the same account can be tens of thousands of re-saves.

***

### Output fields

#### Every row

| Field | Type | Notes |
| --- | --- | --- |
| `type` | string | `profile`, `pin` or `board` |
| `id` | string | Pinterest's own identifier |
| `url` | string | Public link |
| `title` | string | Best available title |
| `profileUsername` | string | The profile this row belongs to |
| `position` | number | Order within that profile's list |
| `scrapedAt` | string | ISO timestamp of collection |

#### Profile rows

| Field | Type | Notes |
| --- | --- | --- |
| `username`, `fullName`, `about` | string | Public profile identity |
| `followerCount`, `followingCount` | number | Audience size |
| `pinCount`, `boardCount` | number | Totals as Pinterest reports them |
| `profileViews`, `profileReach` | number | Monthly figures, when the profile publishes them; `null` otherwise |
| `videoPinCount` | number | Video pins on the profile |
| `websiteUrl`, `domainUrl`, `domainVerified` | string / boolean | Linked site and whether Pinterest confirmed ownership |
| `isVerifiedMerchant`, `isPartner`, `isPrivateProfile` | boolean | Account flags |
| `createdAt`, `lastPinSavedAt` | string | Joined date and most recent save |
| `imageUrl` | string | Profile picture |

#### Pin rows

| Field | Type | Notes |
| --- | --- | --- |
| `title`, `description` | string | As published; often empty on Pinterest |
| `altText` | string | Automatically generated image description, used when there is no caption |
| `createdAt` | string | ISO publish date |
| `saveCount`, `repinCount`, `reactionCount`, `reactions` | number / object | Engagement at the moment of collection |
| `imageUrl`, `imageWidth`, `imageHeight`, `images` | string / number / object | Best image plus every published size |
| `isVideo`, `videoUrl`, `videoDurationMs` | boolean / string / number | Present on video pins |
| `link`, `domain` | string | Destination the pin points to |
| `boardId`, `boardName`, `boardUrl` | string | The board the pin sits on |
| `pinnerUsername` | string | Who put the pin on the board |
| `creatorUsername`, `creatorFullName` | string | Who originally made it — different from the pinner on a re-save |
| `isRepin`, `isCreatedByProfile` | boolean | Whether this profile made the pin or re-saved someone else's |
| `isPromoted` | boolean | Whether the pin is a paid placement |
| `promotedBy` | string | The advertiser behind a paid placement, when there is one — usually a different account from whoever pinned it |
| `pinType` | string | Which mode produced the row |

#### Board rows

| Field | Type | Notes |
| --- | --- | --- |
| `name`, `description` | string | Board identity |
| `pinCount` | number | How many pins the board holds |
| `followerCount` | number | The board's own followers |
| `collaboratorCount`, `isCollaborative` | number / boolean | Group boards |
| `sectionCount` | number | Sections inside the board |
| `privacy` | string | Public boards only |
| `createdAt`, `lastPinnedAt` | string | Board age and last activity |
| `imageUrl`, `coverImages` | string / object | Board cover |

***

### Pricing

You pay for results, not for run time.

| What you pay for | Price |
| --- | --- |
| Every row added to your dataset — each pin, each board and each profile | **$1.50 per 1,000 rows** |
| A profile summary row with its full stats | **$5.00 per 1,000 profiles** |

**Worked example.** You scrape 10 profiles, 100 pins each, plus 20 boards each:

- 1,000 pin rows + 200 board rows + 10 profile rows = 1,210 rows → 1,210 × $0.0015 = **$1.82**
- 10 profiles summarised → 10 × $0.005 = **$0.05**
- **Total ≈ $1.87** for 10 fully profiled accounts.

Save and repin counts come attached to every pin at no extra charge — there is no upgrade to buy for engagement data.

***

### Limits & what this actor cannot do

- Pinterest publishes a limited slice of any profile's history publicly, so very large accounts return what Pinterest makes available rather than an unlimited archive. The practical ceiling is 2,000 pins per profile per run.
- Private profiles and secret boards are not publicly viewable. A private profile returns its stats row and is reported as having no public pins or boards, rather than quietly returning zero.
- Deleted, renamed or unavailable profiles are reported separately from genuine failures in the run summary, so you always know which is which.
- Save, repin and follower counts are a snapshot at the moment of collection and keep changing afterwards.
- Comment counts are deliberately left empty on these rows: Pinterest does not publish a trustworthy figure for them here, and a confident zero would be worse than nothing.
- Many pins are published with no caption of their own; those arrive with an automatically generated image description in `altText` instead.
- Results are personalised to the country the run browses from, so the same profile browsed from a different country can return a slightly different set.
- Promoted pins can appear inside Pinterest's own listings; they are flagged so you can keep or exclude them.
- Follower and following **lists** are not publicly viewable on Pinterest and are not returned. Only the counts are.
- Speed depends on the size of the job and on Pinterest's own response times; no fixed throughput is promised.
- Pinterest's terms govern automated access. You are responsible for using the data lawfully, in line with the source site's terms, and for handling any personal data in line with applicable privacy law.

***

### FAQ

**Do I need a Pinterest account?**
No. Nothing to connect, nothing to authorise — paste profile links and run it.

**Does it need my login or password?**
No. It only reads what any visitor can see on a public profile.

**What is the difference between "created" and "all"?**
`created` gives you the pins the profile made itself — its original content. `all` gives you their whole save stream in save order, which usually contains far more re-saves of other people's pins than originals. Every row also carries `isCreatedByProfile` so you can tell them apart afterwards.

**Is the data complete?**
It is complete for what Pinterest publishes publicly, up to the ceilings above. Very large accounts will not hand over their entire history, private content is never included, and comment counts are not available on these rows. Everything the actor does return is what Pinterest itself was showing at the moment of collection.

**Do I pay extra for save and repin counts?**
No. Engagement is attached to every pin as standard.

**Can I schedule it?**
Yes. Schedule it daily or weekly and compare the dated snapshots to track growth, posting cadence and which pins are gaining saves.

**Can I scrape several profiles at once?**
Yes — up to 200 per run, worked through in parallel.

# Actor input Schema

## `profiles` (type: `array`):

Profile links or usernames, one per line. Accepts https://www.pinterest.com/username/, /username/, @username or just username.

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

"Pins this profile created" returns only the profile's own original pins. "Everything this profile saved" returns their whole save stream in save order, which on most accounts is mostly other people's pins that they re-saved.

## `maxPinsPerProfile` (type: `integer`):

How many pins to collect for each profile. Set 0 to skip pins and collect stats (and boards) only.

## `includeBoards` (type: `boolean`):

Also return each profile's public boards, with pin counts and board follower counts.

## `maxBoardsPerProfile` (type: `integer`):

How many boards to collect for each profile. Ignored when boards are switched off.

## `includePromotedPins` (type: `boolean`):

Promoted pins are always flagged with isPromoted. Turn this off to drop them entirely and keep organic content only.

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

Country to browse Pinterest from. Pinterest personalises results by country, so keep this fixed if you compare runs over time.

## `profilesInParallel` (type: `integer`):

How many profiles to work on at the same time. Higher is faster but harder on Pinterest; 4 is a good balance.

## Actor input object example

```json
{
  "profiles": [
    "https://www.pinterest.com/houseofhipsters/"
  ],
  "pinType": "created",
  "maxPinsPerProfile": 50,
  "includeBoards": true,
  "maxBoardsPerProfile": 20,
  "includePromotedPins": true,
  "country": "us",
  "profilesInParallel": 4
}
```

# 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 = {
    "profiles": [
        "https://www.pinterest.com/houseofhipsters/"
    ],
    "pinType": "created",
    "maxPinsPerProfile": 50,
    "includeBoards": true,
    "maxBoardsPerProfile": 20,
    "includePromotedPins": true,
    "country": "us",
    "profilesInParallel": 4
};

// Run the Actor and wait for it to finish
const run = await client.actor("apt_marble/pinterest-profile-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 = {
    "profiles": ["https://www.pinterest.com/houseofhipsters/"],
    "pinType": "created",
    "maxPinsPerProfile": 50,
    "includeBoards": True,
    "maxBoardsPerProfile": 20,
    "includePromotedPins": True,
    "country": "us",
    "profilesInParallel": 4,
}

# Run the Actor and wait for it to finish
run = client.actor("apt_marble/pinterest-profile-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 '{
  "profiles": [
    "https://www.pinterest.com/houseofhipsters/"
  ],
  "pinType": "created",
  "maxPinsPerProfile": 50,
  "includeBoards": true,
  "maxBoardsPerProfile": 20,
  "includePromotedPins": true,
  "country": "us",
  "profilesInParallel": 4
}' |
apify call apt_marble/pinterest-profile-scraper --silent --output-dataset

```

## MCP server setup

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