# Pinterest Profile Scraper (No Login) (`locaihost/pinterest-profiles`) Actor

Scrape public Pinterest profiles: followers, following, monthly views, bio, website, pin and board counts and join date, plus each profile's boards and pins if you want them. Find accounts in a niche by keyword, and track follower changes on schedules. No login. $1 per 1,000 rows.

- **URL**: https://apify.com/locaihost/pinterest-profiles.md
- **Developed by:** [locaihost data](https://apify.com/locaihost) (community)
- **Categories:** Social media, Marketing, Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.55 / 1,000 profiles

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 Profile Scraper (No Login)

Get any public Pinterest profile as a JSON or CSV row: display name, bio, website, followers, following, monthly views, pin and board counts, joined date and business account flag. You can add the profile's boards and pins, or find accounts in a niche by keyword. No login, no cookies, no account.

What people use it for:

- Vetting creators and brands before working with them: followers, monthly views and the website each account links to, side by side.
- Tracking accounts over time: schedule the same usernames to get fresh follower, pin and monthly view counts every run.
- Listing the accounts in a niche: search "interior designer" or "wedding photographer" to get each account's profile with its follower count and website.
- Studying a competitor's Pinterest: its boards with pin and follower counts, and the pins it created, with saves and outbound links.

### Quick start

Paste this into the **JSON** tab of the input and click **Start**:

```json
{"usernames": ["bhg", "marthastewart", "etsy", "ikea", "sephora", "target", "nasa", "nike"]}
```

You get one profile row per username: 8 rows in about 10 seconds. Usernames are the part after pinterest.com/ in the profile link; `@bhg` and full profile links on any country site (`https://www.pinterest.co.uk/marthastewart/`) work too.

More examples:

```json
{"searchQueries": ["interior designer", "wedding photographer"]}
```

```json
{"usernames": ["bhg"], "profileBoards": true, "profilePins": "created"}
```

```json
{"startUrls": ["https://www.pinterest.co.uk/marthastewart/"], "profileBoards": true, "onlyNew": true}
```

### What you get

Every row has `type`: `profile`, `board`, `pin`, or `not-found` (free, says what happened).

| Group | Fields |
|---|---|
| Profile | `username`, `url`, `displayName`, `bio`, `website`, `websiteVerified`, `avatarUrl` |
| Profile counts | `followers`, `following`, `pins`, `boards`, `monthlyViews` (Pinterest shows big numbers as 10m+, which comes back as 10000001; `null` when the profile hides it) |
| Profile flags and dates | `isBusinessAccount`, `isVerifiedMerchant`, `joinedAt`, `lastSavedAt` |
| Board (with **Boards of each profile**) | `boardId`, `url`, `name`, `description`, `pins`, `followers`, `sections`, `isCollaborative`, `collaborators`, `coverImageUrl`, `category`, `createdAt`, `ownerUsername`, `ownerName` |
| Pin (with **Pins from profiles**) | `pinId`, `url`, `title`, `description`, `altText`, `link`, `linkDomain`, `imageUrl`, `imageWidth`, `imageHeight`, `saves`, `repins`, `comments`, `reactions`, `createdAt`, `hashtags`, `dominantColor`, `isPromoted` |
| Pin video and board | `isVideo`, `videoUrl`, `videoStreamUrl`, `videoDurationSec`, `boardId`, `boardName`, `boardUrl`, `pinnerUsername`, `pinnerName`, `pinnerFollowers`, `creatorUsername` |
| Pin products (with `includeProductFields`) | `price`, `priceCurrency`, `isBuyable`, `inStock`, `richPinType`, `isRepin`, `isCarousel`, `carouselImages`: shopping and rich-pin data for a brand's pins, null where Pinterest sends none. Same price |
| Context | `details` (`full`, or `listing` when only the list was read), `source`, `input`, `query`, `rank`, `scrapedAt` |

One real profile row (run on 2026-10-18):

```json
{
  "type": "profile",
  "username": "marthastewart",
  "url": "https://www.pinterest.com/marthastewart/",
  "displayName": "Martha Stewart",
  "bio": "Daily recipes, crafts, and inspiration from Martha Stewart.",
  "website": "http://marthastewart.com",
  "websiteVerified": true,
  "followers": 1867922,
  "following": 321,
  "pins": 105570,
  "boards": 174,
  "monthlyViews": 10000001,
  "isVerifiedMerchant": false,
  "isBusinessAccount": true,
  "avatarUrl": "https://i.pinimg.com/280x280_RS/c8/11/4c/c8114c783347e27daef00e5d4a6ac4f3.jpg",
  "joinedAt": "2011-09-15T07:56:17.000Z",
  "lastSavedAt": "2026-10-18T02:00:28.000Z",
  "details": "full",
  "source": "profile",
  "input": "marthastewart",
  "scrapedAt": "2026-10-18T06:40:25.106Z"
}
```

The dataset has four views (**Profiles**, **Boards**, **Pins**, **Not found (free)**) and exports to JSON, CSV, Excel or HTML. The run's `SUMMARY` record has rows by kind, free rows by reason and timing.

### Pricing

You pay per profile, board or pin returned. There is no charge for Apify platform usage on top.

| Row | Free and Starter | Scale | Business |
|---|---|---|---|
| Profile | $1 per 1,000 | $0.75 per 1,000 | $0.55 per 1,000 |
| Board | $1 per 1,000 | $0.75 per 1,000 | $0.55 per 1,000 |
| Pin | $1 per 1,000 | $0.75 per 1,000 | $0.55 per 1,000 |

That is $1 per 1,000 rows of any kind on the Free and Starter plans. Plus $0.00005 per run start. **Apify's free $5 monthly credit covers about 5,000 profiles.** Free-plan runs stop at 1,000 rows each; any paid Apify plan removes the cap.

**What's free:** profiles, boards and pins that don't exist or aren't public, searches with no results and unusable inputs (each comes back as a free `not-found` row saying what happened), the same lookup typed twice, and boards and pins skipped by `onlyNew`. To cap a run's spend, set **Maximum cost per run** in the run options, or **Max rows in total** in the input.

### Limits

- Only what a signed-out visitor sees. Pinterest shows a signed-out visitor one page of each list (about 25 accounts per search, 25 boards or 25 pins per profile) and then asks them to log in. This Actor never logs in, so that is the most it returns per list. The counts on a profile row (followers, pins, boards) are always complete.
- For more accounts in a niche, use several keywords: each keyword is its own list of about 25.
- Only public boards and pins. Secret boards are never reachable.
- Boards are off unless you turn on **Boards of each profile** (`profileBoards: true`), including for API calls that leave the field out (fixed 18 Oct 2026; before that, an input without the field could return boards too).
- About each profile it keeps what the public profile shows. E-mail addresses and phone numbers written into bios and descriptions are replaced with `[contact removed]`, and Pinterest's contact e-mail, phone and first and last name fields are never read.
- **Full details for every pin** (on by default) opens each profile found by keyword, and each pin, on its own page. Turn it off for a lighter run: rows then carry what the list showed (`details: "listing"`), without bio, website, following or monthly views for searched profiles.
- **Profile links** also take pin, board and search links, and pin.it short links: they return that pin, board or search.
- No browser: it reads the same data Pinterest's own pages load, so most runs take seconds. If time runs short, the run ends successfully with the rows so far and says what to narrow.

### Only new since last run, and schedules

Schedule the Actor with the same usernames to track followers, pins and monthly views over time: profile rows come back fresh every run. With **Only new since the last run** on, boards and pins that an earlier run with the same lookups already returned are skipped and not charged, so a schedule with **Boards of each profile** or **Pins from profiles** returns only new boards and pins. Set up a schedule under **Schedules** in Apify Console.

### Integrations: API, n8n, Make and AI agents

**API.** Run it and get the rows back in one call:

```bash
curl -X POST "https://api.apify.com/v2/acts/locaihost~pinterest-profiles/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"usernames": ["bhg", "marthastewart"], "profileBoards": true}'
```

Apify's API clients for Python and JavaScript work the same way.

**n8n, Make, Zapier, Google Sheets, Slack, webhooks.** Apify's built-in integrations send each run's dataset wherever you need it, for example a weekly follower count per account into a Google Sheet.

**AI agents (MCP).** Add this Actor to Claude, Cursor or any MCP client with `https://mcp.apify.com/?tools=locaihost/pinterest-profiles`, then ask something like *"Find 25 wedding photographers on Pinterest and list them by followers, with the website each one links to."*

### FAQ

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

$1 per 1,000 profiles, boards or pins on the Free and Starter plans, less on Scale and Business. Apify's free $5 monthly credit covers about 5,000 profiles.

#### Can I use it through the API or from Python?

Yes. Use the `run-sync-get-dataset-items` call above, or Apify's Python and JavaScript clients. Every run's data is also available as JSON, CSV or Excel from its dataset.

#### Can I use it from an AI agent?

Yes. Through the Apify MCP server (`https://mcp.apify.com/?tools=locaihost/pinterest-profiles`) any MCP client can call it with usernames or keywords and read the profiles back.

#### Is it legal to scrape Pinterest?

The Actor reads only what a signed-out visitor can see; it never logs in or uses cookies from an account, and it stops where Pinterest asks a visitor to log in. Pinterest's own terms restrict automated collection, so check them against your use. It keeps only what a public profile shows and removes contact details written into bios and descriptions. Follow privacy law (such as GDPR) if you store data about people, never use the data to contact, profile or harass anyone, and remember that images belong to the people who made them. You are responsible for how you use the results.

#### Why do I get only about 25 boards or pins per profile?

That is what Pinterest shows a signed-out visitor before it asks them to log in, and this Actor never logs in. The profile row's `pins` and `boards` counts are still the full totals.

#### Why are some fields empty?

`monthlyViews` is `null` when the profile hides it, and `website` when it lists none. Profiles found by keyword with **Full details for every pin** off have only what the search list showed (`details: "listing"`).

### More from locaihost data

- [TikTok creator vetting](https://apify.com/locaihost/tiktok-creators): TikTok profiles with engagement rate, median views and posting cadence, for the same creators.
- [TikTok trends](https://apify.com/locaihost/tiktok-trends): TikTok's trending hashtags, videos and top ads by country.
- [Google Trends](https://apify.com/locaihost/google-trends): search interest for the topics your Pinterest niche covers.
- [Company enrichment by domain](https://apify.com/locaihost/company-profile): company name, description, logo, socials and role contact addresses from the websites the profiles link to.

### Did it help?

If this saved you time, a quick rating on the Store helps other people find it.

### Support

Something not working, or a field you need? Open an issue on the **Issues** tab: we answer issues within 24 hours.

# Changelog

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

# Actor input Schema

## `usernames` (type: `array`):

Pinterest usernames as they appear in the profile link, like bhg for https://www.pinterest.com/bhg/. Each returns a profile row: display name, bio, website, followers, following, monthly views, pin and board counts, joined date.

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

Or paste profile links. Any country site works (pinterest.co.uk, de.pinterest.com...). Pin and board links work too: they return that pin or board.

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

Search Pinterest for accounts the way its search box does, for example interior designer or vegan recipes. Each match is a full profile row, so this is a quick way to list the accounts in a niche with their follower counts and websites.

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

What keyword searches return. Profiles by default; pins, video pins and boards also work.

## `maxItemsPerSource` (type: `integer`):

Pinterest shows a signed-out visitor about 25 results per search or profile, then asks them to log in. This Actor reads what a signed-out visitor sees, so 25 is the practical most. For more profiles, add more keywords.

## `profileBoards` (type: `boolean`):

For each username or profile link, also return its public boards (name, description, pin and follower counts, cover image). Each board is a row.

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

Up to about 25, the boards a signed-out visitor is shown.

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

For each username or profile link, also return pins: the ones it created (its Created tab) or its latest saves. Off by default.

## `fullDetails` (type: `boolean`):

Open each profile found by keyword on its own page for bio, website, following and monthly views, and each pin for saves, comments and outbound link. Turn off for a faster, lighter run: rows then carry what the list showed (details: listing).

## `includeProductFields` (type: `boolean`):

Adds `price` and `priceCurrency` (product pins), `isBuyable`, `inStock`, `richPinType` (product, article, recipe...), `isRepin`, `isCarousel` and `carouselImages` to pin rows, when Pinterest sends them. Same price.

## `onlyNew` (type: `boolean`):

Profile rows are always returned fresh, so a schedule tracks follower and monthly view changes. Pins and boards that an earlier run with the same lookups already returned are skipped and not charged.

## `maxResults` (type: `integer`):

Stop after this many charged rows. 0 means no limit.

## Actor input object example

```json
{
  "usernames": [
    "bhg",
    "marthastewart",
    "etsy"
  ],
  "startUrls": [
    "https://www.pinterest.com/bhg/",
    "https://www.pinterest.co.uk/marthastewart/"
  ],
  "searchQueries": [
    "interior designer",
    "wedding photographer",
    "vegan recipes"
  ],
  "searchType": "profiles",
  "maxItemsPerSource": 25,
  "profileBoards": false,
  "maxBoardsPerProfile": 25,
  "profilePins": "none",
  "fullDetails": true,
  "includeProductFields": false,
  "onlyNew": false,
  "maxResults": 0
}
```

# Actor output Schema

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

One row per profile: display name, followers, following, monthly views, pins, boards, website, bio.

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

One row per board: name, owner, pin and follower counts, sections, cover image.

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

One row per pin: title, image, saves, comments, outbound link, pinner, board, created date, video file.

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

Every field of every row, including free not-found rows.

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

Counts, free rows by reason, anything that failed, access stats and cost.

# 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 = {
    "usernames": [
        "bhg",
        "marthastewart",
        "etsy",
        "ikea",
        "sephora",
        "target",
        "nasa",
        "nike"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("locaihost/pinterest-profiles").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 = { "usernames": [
        "bhg",
        "marthastewart",
        "etsy",
        "ikea",
        "sephora",
        "target",
        "nasa",
        "nike",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("locaihost/pinterest-profiles").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 '{
  "usernames": [
    "bhg",
    "marthastewart",
    "etsy",
    "ikea",
    "sephora",
    "target",
    "nasa",
    "nike"
  ]
}' |
apify call locaihost/pinterest-profiles --silent --output-dataset

```

## MCP server setup

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

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/9REA7gDIkSFFiPB9C/builds/75ioFKCfmulOj0Glx/openapi.json
