# Pinterest Profiles Scraper (`automation-lab/pinterest-profile-metadata-scraper`) Actor

Extract public Pinterest profile metadata, audience counts, verification, websites, and recent pin and board signals from usernames or profile URLs.

- **URL**: https://apify.com/automation-lab/pinterest-profile-metadata-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/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 Profiles Scraper

Extract public **Pinterest profiles** into analysis-ready records.
Provide usernames or profile URLs and get identity, bio, website, audience counts,
verification flags, profile images, and configurable recent pin and board signals.

Use the Actor for one-time profile research or schedule it to monitor a stable list
of public influencer, creator, brand, and competitor accounts over time.
No Pinterest login or cookies are required for the supported public data.

### What does Pinterest Profiles Scraper do?

For every supplied public profile, the Actor:

1. normalizes usernames, `@usernames`, and Pinterest profile URLs;
2. removes duplicate profiles within the run;
3. requests the current public profile metadata from Pinterest;
4. optionally collects recent public pin previews;
5. optionally collects recently active public boards;
6. writes one typed dataset item per successfully extracted profile.

The Actor does not search for unknown accounts, download media, scrape followers,
or access private Pinterest data.

### Who is it for?

- **Influencer marketers** comparing audience size and account verification.
- **Competitive intelligence teams** monitoring brand profile activity.
- **Creator agencies** enriching known Pinterest account lists.
- **Data analysts** building periodic snapshots of follower, pin, and board counts.
- **Developers** feeding normalized Pinterest profile data into a CRM or warehouse.

Choose this Actor when you already know the usernames or profile URLs.
For pin search, individual pins, and board-feed extraction, use
[ Pinterest Scraper](https://apify.com/automation-lab/pinterest-scraper) instead.

### Why use this Actor?

- Accepts usernames, `@usernames`, and full profile URLs in one list.
- Returns one consistent record per profile rather than mixed profile and pin rows.
- Includes audience, website, verification, and recent activity signals together.
- Supports up to 100 profiles per run with bounded concurrency.
- Lets you skip recent-content requests when you only need profile counters.
- Works with Apify schedules, webhooks, API clients, Make, Zapier, and MCP.

### What Pinterest profile data can you extract?

| Field group | Included data |
| --- | --- |
| Identity | Pinterest ID, username, display name, canonical profile URL |
| Description | Public bio, website URL, claimed or verified domain |
| Audience | Follower count and following count when exposed |
| Publishing | Total pin count, board count, latest pin-save timestamp |
| Trust | Verified identity, verified merchant, partner, and private flags |
| Images | Best available profile image and profile cover image URLs |
| Recent pins | ID, title, description, URL, image, creation time, saves, board name |
| Recent boards | ID, name, URL, description, pin/follower counts, cover image |
| Provenance | Profile creation time when exposed and extraction timestamp |

Pinterest does not expose every field for every account.
Unavailable scalar values are returned as `null`; unavailable recent collections
are returned as empty arrays.

### Getting started

1. Open the Actor in Apify Console.
2. Add one or more entries to **Pinterest profiles**.
3. Choose how many recent pins and boards to include.
4. Keep the default concurrency for normal runs.
5. Click **Start**.
6. Open the **Pinterest profiles** dataset view.
7. Export the results as JSON, CSV, Excel, XML, or another supported format.

A small first input:

```json
{
  "profiles": [
    "nasa",
    "https://www.pinterest.com/pinterest/"
  ],
  "maxRecentPins": 3,
  "maxRecentBoards": 3,
  "maxConcurrency": 2
}
```

### Input parameters

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `profiles` | `string[]` | `nasa` | Required list of 1–100 usernames, `@usernames`, or full Pinterest profile URLs. |
| `maxRecentPins` | integer | `3` | Recent pin previews per profile, from 0 to 10. Set to 0 to skip this request. |
| `maxRecentBoards` | integer | `3` | Recently active boards per profile, from 0 to 10. Set to 0 to skip this request. |
| `maxConcurrency` | integer | `5` | Profiles requested in parallel, from 1 to 20. |

Duplicate entries are compared after normalization and scraped once.
Only `pinterest.com` profile URLs with a single username path are accepted.
Pin URLs, board URLs, search URLs, and non-Pinterest URLs fail input validation.

### Output example

The default dataset contains one record per successful profile.
This shortened example reflects the current output shape:

```json
{
  "profileId": "123456789012345678",
  "username": "samplecreator",
  "fullName": "Sample Creator",
  "profileUrl": "https://www.pinterest.com/samplecreator/",
  "bio": "Ideas and practical inspiration for creative projects.",
  "websiteUrl": "https://sample.example.org/",
  "domain": "sample.example.org",
  "followerCount": 125000,
  "followingCount": 240,
  "pinCount": 1840,
  "boardCount": 52,
  "isVerified": true,
  "isVerifiedMerchant": false,
  "isPartner": false,
  "isPrivate": false,
  "profileImageUrl": "https://i.pinimg.com/280x280_RS/aa/bb/cc/sample.jpg",
  "coverImageUrl": "https://i.pinimg.com/originals/aa/bb/cc/sample-cover.jpg",
  "createdAt": "Mon, 15 Jan 2024 12:00:00 +0000",
  "lastPinSavedAt": "Tue, 14 Jan 2025 10:30:00 +0000",
  "recentPins": [
    {
      "id": "987654321098765432",
      "title": "Sample project idea",
      "url": "https://www.pinterest.com/pin/987654321098765432/",
      "saveCount": 42,
      "boardName": "Project ideas"
    }
  ],
  "recentBoards": [
    {
      "id": "123456789098765432",
      "name": "Project ideas",
      "url": "https://www.pinterest.com/samplecreator/project-ideas/",
      "pinCount": 85,
      "followerCount": 1200
    }
  ],
  "scrapedAt": "2025-01-15T12:00:00.000Z"
}
```

### How much does it cost to extract Pinterest profiles?

This is a pay-per-event Actor.
A run has a **$0.005 start charge** and a plan-dependent charge for each
successfully saved profile record.
Recent pin and board previews are included in the profile event and do not have
separate event charges.
Failed or rejected profiles are not charged as profile records.

At the current BRONZE rate of **$0.00224 per profile**:

| Successful profiles | Cost calculation |
| ---: | --- |
| 1 | $0.005 start + 1 × $0.00224 profile |
| 10 | $0.005 start + 10 × $0.00224 profile |
| 100 | $0.005 start + 100 × $0.00224 profile |

Other Apify plan tiers have different profile-event rates.
Apify Console shows the applicable event prices before a run.

### Monitoring Pinterest profile metrics

A dataset item is a snapshot, which makes the Actor useful with Apify schedules.
For example:

1. save a Task containing a stable list of competitor profiles;
2. schedule it daily or weekly;
3. send the dataset to a webhook or data warehouse;
4. compare `followerCount`, `pinCount`, `boardCount`, and `lastPinSavedAt`;
5. alert only when a metric crosses your own threshold.

The Actor reports current source values; it does not calculate historical deltas
or send alerts by itself.

### Export and integration workflows

- Export a one-time comparison to CSV or Excel.
- Append scheduled snapshots to BigQuery, Snowflake, or a database.
- Enrich CRM creator records by Pinterest username.
- Trigger a webhook when a scheduled run completes.
- Use Make or Zapier to route dataset items into Sheets or Airtable.
- Query the dataset from an internal dashboard.

For lightweight audience monitoring, set both recent limits to `0`.
For content-context monitoring, retain recent pins and boards.

### Run with the Apify API using cURL

Replace `YOUR_TOKEN` with an Apify API token:

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~pinterest-profile-metadata-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "profiles": ["nasa", "pinterest"],
    "maxRecentPins": 3,
    "maxRecentBoards": 3
  }'
```

### Run with JavaScript

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/pinterest-profile-metadata-scraper').call({
  profiles: ['nasa', 'pinterest'],
  maxRecentPins: 3,
  maxRecentBoards: 3,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Run with Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/pinterest-profile-metadata-scraper').call(
    run_input={
        'profiles': ['nasa', 'pinterest'],
        'maxRecentPins': 3,
        'maxRecentBoards': 3,
    }
)
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### Use with MCP and AI agents

Add the Actor to Claude Code through Apify MCP:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/pinterest-profile-metadata-scraper"
```

#### Claude Desktop

Add this server to the Claude Desktop MCP configuration:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/pinterest-profile-metadata-scraper"
    }
  }
}
```

#### Cursor

Add the same JSON server entry in **Cursor Settings → MCP**.

#### VS Code

Add the same HTTP MCP URL to your workspace or user MCP server configuration.

Example prompts:

- “Extract the public profile metrics for these five Pinterest usernames.”
- “Compare follower, pin, and board counts for these brand profiles.”
- “Collect five recent pin and board signals for this competitor list.”

### Limits and reliability

- A run accepts at most 100 unique profiles.
- Recent pins and boards are limited to 10 of each per profile.
- The Actor reads only public, unauthenticated data exposed by Pinterest.
- Private or removed profiles may expose limited data or return no record.
- Pinterest can change undocumented fields or temporarily rate-limit requests.
- Transient network, 429, and server failures are retried with bounded backoff.
- Recent-content enrichment can fail independently; valid profile metadata is
  still saved with the affected recent array empty.
- If every requested profile fails, the run fails instead of returning a silent
  empty success.

### Tips for stable runs

- Start with the default concurrency of 5.
- Reduce concurrency for a large list if logs show temporary rate limiting.
- Use `maxRecentPins: 0` and `maxRecentBoards: 0` when only counters matter.
- Schedule at a cadence appropriate for the decisions you make from the data.
- Keep the source username as your stable join key; display names can change.
- Store `scrapedAt` with every snapshot before calculating changes.

### Troubleshooting

#### The input is rejected before scraping

Check that every value is a username, `@username`, or a profile URL such as
`https://www.pinterest.com/nasa/`.
Board, pin, search, and third-party URLs are intentionally rejected.

#### A profile is reported as not found

Open the profile URL in a logged-out browser and verify the current username.
The profile may have been renamed, removed, or made unavailable publicly.

#### Some recent pin or board arrays are empty

The account may not expose that collection, the selected limit may be `0`, or an
enrichment request may have failed after the required profile request succeeded.
Inspect the run log for the affected username.

#### The run is rate-limited

Lower `maxConcurrency` and retry later.
The Actor does not automatically switch to a paid proxy, so no hidden proxy
traffic is added to the run.

### Responsible use and legality

Pinterest profile pages can contain personal data.
Use this Actor only for lawful purposes and only collect data you are authorized
to process.
Follow Pinterest's terms, applicable privacy and data-protection laws, and your
organization's retention and access-control policies.
Do not use the output for harassment, sensitive-trait inference, spam, or
unlawful automated decision-making.
The user of the Actor is responsible for the purpose and downstream handling of
the extracted data.

### Related Automation Lab Actors

- [Pinterest Scraper](https://apify.com/automation-lab/pinterest-scraper) — pin search, board feeds, and individual pin extraction.
- [Pinterest Trends Scraper](https://apify.com/automation-lab/pinterest-trends-scraper) — Pinterest trend signals for keyword research.
- [Pinterest Keyword Research Scraper](https://apify.com/automation-lab/pinterest-keyword-research-scraper) — keyword and suggestion research.
- [Pinterest Autocomplete Keyword Scraper](https://apify.com/automation-lab/pinterest-autocomplete-keyword-scraper) — autocomplete suggestions for seed terms.

### FAQ

#### Does it require a Pinterest login?

No. The Actor targets public profile data available without account credentials.

#### Can it discover profiles by keyword?

No. Supply known usernames or profile URLs.
This boundary keeps profile monitoring precise and predictable.

#### Does it scrape followers or following lists?

No. It returns public aggregate counts when Pinterest exposes them, not the
underlying social graph.

#### Does it download profile pictures or pin images?

No. It returns public image URLs but does not download media files.

#### Can I monitor changes automatically?

Yes. Save the input as an Apify Task and attach a schedule.
Persist each run's dataset in your destination and compare snapshots there.

#### Are recent pins and boards charged separately?

No. They are enrichments inside each successfully saved profile record and do
not emit separate charge events.

#### What happens when one profile fails in a batch?

Other valid profiles continue.
The failed username and reason appear in logs, and only successful profile
records are charged and written.

#### What happens when all profiles fail?

The Actor exits with a failed status and a concise summary instead of reporting
a misleading successful empty run.

# Actor input Schema

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

Pinterest usernames, @usernames, or full profile URLs. Duplicates are removed.

## `maxRecentPins` (type: `integer`):

Maximum number of recent public pin previews included in each profile record. Set to 0 to skip the extra request.

## `maxRecentBoards` (type: `integer`):

Maximum number of recently active public boards included in each profile record. Set to 0 to skip the extra request.

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

Maximum number of profiles requested in parallel. Lower this if Pinterest temporarily rate-limits a large run.

## Actor input object example

```json
{
  "profiles": [
    "nasa",
    "https://www.pinterest.com/pinterest/"
  ],
  "maxRecentPins": 3,
  "maxRecentBoards": 3,
  "maxConcurrency": 5
}
```

# Actor output Schema

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

Profile metadata, audience counts, verification, and recent content signals.

# 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": [
        "nasa",
        "https://www.pinterest.com/pinterest/"
    ],
    "maxRecentPins": 3,
    "maxRecentBoards": 3,
    "maxConcurrency": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/pinterest-profile-metadata-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": [
        "nasa",
        "https://www.pinterest.com/pinterest/",
    ],
    "maxRecentPins": 3,
    "maxRecentBoards": 3,
    "maxConcurrency": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/pinterest-profile-metadata-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": [
    "nasa",
    "https://www.pinterest.com/pinterest/"
  ],
  "maxRecentPins": 3,
  "maxRecentBoards": 3,
  "maxConcurrency": 5
}' |
apify call automation-lab/pinterest-profile-metadata-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=automation-lab/pinterest-profile-metadata-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/kzWmKh13qExrsgJ5a/builds/eah3dgSr45M1Ce4ee/openapi.json
