# Pinterest Profile Search Scraper (`scrapingmonkey/pinterest-profile-search-scraper`) Actor

Search public Pinterest profiles by keyword. Export usernames, profile links, names, follower counts, avatar links and available verification information.

- **URL**: https://apify.com/scrapingmonkey/pinterest-profile-search-scraper.md
- **Developed by:** [ScrapingMonkey](https://apify.com/scrapingmonkey) (community)
- **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. 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?

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

Find public Pinterest profiles by keyword and export one matching account per row. **Pinterest Profile Search Scraper** returns usernames, names, profile URLs, follower counts, avatars and available verification or content-preview metadata.

Use a topic or brand phrase to discover accounts for manual qualification, creator research or later profile enrichment.

| At a glance | Details |
|---|---|
| 📥 Input | Enter keyword queries or canonical Pinterest /search/users/?q= URLs. |
| 📤 Output | One profile per success row with the input source retained |
| 📄 Pagination | Result pages per input; page sizes and availability are controlled by Pinterest |
| 🔐 Login required | No |
| ⚡ Processing | Up to 5 HTTP requests concurrently; up to 5 attempts for temporary failures |
| 💾 Delivery | One Apify dataset view with individual records and complete nested JSON |

### What the Pinterest profile search scraper collects 👥

The Actor follows the public profile-search result pages. Each account retains its source query so a discovery dataset can include several topics without losing context.

Data can include:

- Pinterest account IDs, usernames, names and canonical profile links
- Available follower counts and avatars
- Identity and merchant verification indicators when supplied
- Recent image references or profile-search previews when exposed
- Input-query context for grouping discovered accounts

### How to collect profile search results from Pinterest 🚀

1. Enter one or more supported inputs.
2. Set the page budget and any collection option you need.
3. Start the Actor.
4. Open the **Profiles** dataset view and review success or failed rows.
5. Export the dataset or retrieve records from your application.

```json
{
  "inputList": [
    "modern kitchen"
  ],
  "pagesPerSearch": 1
}
```

The page setting applies separately to each query. Result ranking and page sizes come from Pinterest; returned profiles are deduplicated within that query’s pagination.

### Pinterest profile search results output fields 📦

| Field | Type | Meaning |
|---|---|---|
| `input` | string | Original submitted input. |
| `status` | string | Whether this entity was successfully collected. |
| `page` | integer or null | One-based page within this input's collection. |
| `query` | string or null | Resolved keyword query used for this result. |
| `id` | string or null | Id when supplied by Pinterest. |
| `username` | string or null | Username when supplied by Pinterest. |
| `name` | string or null | Name when supplied by Pinterest. |
| `url` | string or null | Url when supplied by Pinterest. |
| `image_url` | string or null | Image url when supplied by Pinterest. |
| `image_large_url` | string or null | Image large url when supplied by Pinterest. |
| `is_verified` | boolean or null | Is verified when supplied by Pinterest. |
| `is_verified_merchant` | boolean or null | Is verified merchant when supplied by Pinterest. |
| `is_private` | boolean or null | Is private when supplied by Pinterest. |
| `follower_count` | integer or null | Follower count when supplied by Pinterest. |
| `first_name` | string or null | First name when supplied by Pinterest. |
| `last_name` | string or null | Last name when supplied by Pinterest. |
| `about` | string or null | About when supplied by Pinterest. |
| `website_url` | string or null | Website url when supplied by Pinterest. |
| `domain` | string or null | Domain when supplied by Pinterest. |
| `domain_verified` | boolean or null | Domain verified when supplied by Pinterest. |
| `is_primary_website_verified` | boolean or null | Is primary website verified when supplied by Pinterest. |
| `created_at` | string or null | Created at when supplied by Pinterest. |
| `last_pin_save_time` | string or null | Last pin save time when supplied by Pinterest. |
| `following_count` | integer or null | Following count when supplied by Pinterest. |
| `board_count` | integer or null | Board count when supplied by Pinterest. |
| `pin_count` | integer or null | Pin count when supplied by Pinterest. |
| `video_pin_count` | integer or null | Video pin count when supplied by Pinterest. |
| `story_pin_count` | integer or null | Story pin count when supplied by Pinterest. |
| `group_board_count` | integer or null | Group board count when supplied by Pinterest. |
| `profile_views` | integer or null | Raw public profile\_views field; no monthly-period interpretation is assumed. |
| `profile_reach` | integer or null | Raw public profile\_reach field; no reporting period is assumed. |
| `has_catalog` | boolean or null | Has catalog when supplied by Pinterest. |
| `has_published_pins` | boolean or null | Has published pins when supplied by Pinterest. |
| `seo_title` | string or null | Seo title when supplied by Pinterest. |
| `seo_description` | string or null | Seo description when supplied by Pinterest. |
| `cover_images` | array or null | Cover images when supplied by Pinterest. |
| `recent_pin_images` | array or null | Recent pin images when supplied by Pinterest. |

Nested field structure:

- `cover_images[]`: `variant`, `url`, `width`, `height`, `dominant_color`.
- `recent_pin_images[]`: `variant`, `url`, `width`, `height`, `dominant_color`.

The examples below use normalized public response data. Values are snapshots and may change; every top-level output field is included. Different media variants and nested objects remain inside the same row.

Complete representative success result:

```json
{
  "input": "modern kitchen",
  "status": "success",
  "page": 1,
  "query": "modern kitchen",
  "id": "110268028284876846",
  "username": "PostsPics",
  "name": "Warm Home Decor | Bathroom Design | Modern Kitchen",
  "url": "https://www.pinterest.com/PostsPics/",
  "image_url": "https://i.pinimg.com/75x75_RS/05/ec/b6/05ecb65226173e22a14f286d60937e5b.jpg",
  "image_large_url": null,
  "is_verified": null,
  "is_verified_merchant": false,
  "is_private": null,
  "follower_count": 21408,
  "first_name": null,
  "last_name": null,
  "about": null,
  "website_url": null,
  "domain": null,
  "domain_verified": null,
  "is_primary_website_verified": null,
  "created_at": null,
  "last_pin_save_time": null,
  "following_count": null,
  "board_count": null,
  "pin_count": null,
  "video_pin_count": null,
  "story_pin_count": null,
  "group_board_count": null,
  "profile_views": null,
  "profile_reach": null,
  "has_catalog": null,
  "has_published_pins": null,
  "seo_title": null,
  "seo_description": null,
  "cover_images": [],
  "recent_pin_images": [
    {
      "variant": "0",
      "url": "https://i.pinimg.com/222x/fd/6f/ec/fd6fece4739ab9f22c8d118c809625b4.jpg",
      "width": 222,
      "height": 333,
      "dominant_color": "#AB947D"
    },
    {
      "variant": "1",
      "url": "https://i.pinimg.com/222x/ae/60/93/ae60938b444945a8ba12f2f8b45e6e13.jpg",
      "width": 222,
      "height": 382,
      "dominant_color": "#837E75"
    },
    {
      "variant": "2",
      "url": "https://i.pinimg.com/222x/a6/ab/f8/a6abf8549743e5343d39d4b4b3c58092.jpg",
      "width": 222,
      "height": 277,
      "dominant_color": "#D3D3D3"
    },
    {
      "variant": "3",
      "url": "https://i.pinimg.com/222x/e5/07/e6/e507e691f904d8ac02bd6c28c69aaadd.jpg",
      "width": 222,
      "height": 148,
      "dominant_color": "#A8A8A8"
    },
    {
      "variant": "4",
      "url": "https://i.pinimg.com/222x/94/ee/d0/94eed047a2a62547a673acdb4f77f927.jpg",
      "width": 222,
      "height": 277,
      "dominant_color": "#BEBEBE"
    },
    {
      "variant": "5",
      "url": "https://i.pinimg.com/222x/92/17/4d/92174dec8014434864f73c1ce7a8a28a.jpg",
      "width": 222,
      "height": 394,
      "dominant_color": "#64696C"
    },
    {
      "variant": "6",
      "url": "https://i.pinimg.com/222x/24/6e/48/246e48d867928e32d716dc4b13a64b17.jpg",
      "width": 222,
      "height": 333,
      "dominant_color": "#7E736B"
    },
    {
      "variant": "7",
      "url": "https://i.pinimg.com/222x/c6/5a/37/c65a3767fc04d8e08ae75aefa8bf0495.jpg",
      "width": 222,
      "height": 394,
      "dominant_color": "#8D7E70"
    }
  ]
}
```

Complete failed dataset item:

```json
{
  "input": "invalid input",
  "status": "failed",
  "page": null,
  "query": null,
  "id": null,
  "username": null,
  "name": null,
  "url": null,
  "image_url": null,
  "image_large_url": null,
  "is_verified": null,
  "is_verified_merchant": null,
  "is_private": null,
  "follower_count": null,
  "first_name": null,
  "last_name": null,
  "about": null,
  "website_url": null,
  "domain": null,
  "domain_verified": null,
  "is_primary_website_verified": null,
  "created_at": null,
  "last_pin_save_time": null,
  "following_count": null,
  "board_count": null,
  "pin_count": null,
  "video_pin_count": null,
  "story_pin_count": null,
  "group_board_count": null,
  "profile_views": null,
  "profile_reach": null,
  "has_catalog": null,
  "has_published_pins": null,
  "seo_title": null,
  "seo_description": null,
  "cover_images": null,
  "recent_pin_images": null
}
```

A failed row preserves `input`, sets `status` to `failed`, and sets every other top-level field to `null`. The reason is written to the run log. Optional successful values remain null or empty when Pinterest omits them. The single dataset view exposes object fields as useful columns; arrays are kept in their parent row rather than expanded into additional rows or views.

### Input and pagination settings ⚙️

| Parameter | Type | Required | Default | Rules |
|---|---|---|---|---|
| `inputList` | array of strings | Yes | None | Enter keyword queries or canonical Pinterest /search/users/?q= URLs. |
| `pagesPerSearch` | integer | No | `1` | Maximum result pages per input. Website page sizes vary; short pages can still have a continuation. Preparation requests do not count as result pages. Minimum `1`. |

Enter nonblank phrases for account discovery. Use Profile Scraper with a known username or profile URL when you want detailed profile enrichment.

Use canonical HTTPS links on `www.pinterest.com` or `pinterest.com`. Country-specific hosts, shortened `pin.it` links and unsupported paths are not accepted. Search inputs must contain a nonblank query of at most 1,000 characters. A matching canonical Pinterest search URL with one `q` parameter is also accepted.

Duplicate normalized inputs are processed once. A returned identifier is deduplicated within the pagination of one source input; the same object found under different source inputs retains each source relationship.

The first result request counts as page 1. Source validation and preparation requests do not consume result pages. A short or filtered page can continue if it supplies a usable cursor. Collection stops at the page budget or the end of pagination; a repeated cursor does not trigger an endless loop.

### Pinterest profile search results use cases 🎯

#### Creator discovery samples

Search a topic and review matching names, profile links and available audience indicators. Qualify the accounts manually before drawing conclusions.

#### Brand account research

Search brand-related terms and inspect candidate profile URLs. Verify ownership using independent source information when needed.

#### Profile enrichment queues

Export usernames from selected search results and send them to Profile Scraper. Keep the original query in your research database.

### Pricing and saved-result behavior 💰

Check the Actor’s **Pricing** tab for the active charging model and current rate. Store settings may change, so this README does not state an unverified fixed price or runtime.

Under dataset-item pricing:

- Each unique success result represents one profile for its source input.
- An invalid or unavailable input, an input with no accessible results, or a request that exhausts retries can produce a `failed` row.
- Retry attempts and supporting metadata requests do not create extra dataset rows by themselves.
- Nested media, author and source fields stay inside their parent result.
- A normal empty continuation after earlier successes creates no additional result row.
- Saved failed rows are not assumed to be free. Check the active pricing configuration for their treatment.

Larger page budgets and more inputs can produce more saved rows. Start with a small run and check actual usage before increasing the workload.

### Pinterest profile search results API 🔌

Replace `$ACTOR_ID` with the identifier shown in this Actor’s **API** tab and `$APIFY_TOKEN` with your Apify token.

```bash
curl -X POST "https://api.apify.com/v2/acts/$ACTOR_ID/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"inputList":["modern kitchen"],"pagesPerSearch":1}'
```

Download JSON, CSV, Excel, XML or other formats available in the Console, or retrieve the dataset through the Apify API. Schedules, webhooks and Apify integrations can connect results to Google Sheets, Make, Zapier, n8n, cloud storage or your own backend. These are connection options rather than integrations already configured by the Actor.

### Reliability, retries, and public-data limits ⚠️

Collection uses pure HTTP with up to five concurrent requests. Invalid syntax and confirmed missing, removed or inaccessible targets stop without unnecessary retries. Temporary network or proxy failures, timeouts, blocking responses, malformed data, throttling and server errors are retried up to five total attempts per request.

Earlier successful pages remain saved when a later request fails. A normal end after previously saved results is not retried. An input that produces no accessible results can receive a failed row; this does not by itself prove the underlying account or collection does not exist. A later exhausted request can append a failed row while keeping earlier output.

Pinterest controls public availability, ranking, fields and pagination. Private, deleted, restricted or otherwise unavailable data can be omitted. Counts can change during collection, and media links can expire. Successful HTTP research confirms the supported request paths and pagination on tested sources, rather than future availability or exhaustive coverage.

Search profiles contain fewer fields than a complete profile lookup. Biography, website, following counts and other detailed account fields may remain null if search does not expose them. A keyword match does not prove a person’s profession, ownership or affiliation.

An invalid string within a valid input list does not stop other inputs. A configuration that fails validation, such as a non-string list item or an invalid page-count type, exits before requests start. Infrastructure errors such as startup failure, unavailable dataset storage or an unrecoverable result-save error can stop the whole run. A failed dataset save is not retried as a new scraping request.

### Frequently asked questions ❓

#### Does it return complete profile biographies and websites?

Only if those fields are present in the search response. Use Profile Scraper on selected usernames for a dedicated profile lookup.

#### Can it identify every creator in a topic?

No. Pinterest controls matching and ranking. A topic search produces a sample of account matches for your own review.

#### Does it collect followers of the found profiles?

No. It returns available follower counts, not follower lists or relationship graphs.

#### Does it require Pinterest login or personal cookies?

No. The Actor uses HTTP requests from the public website. It does not require a Pinterest account, password or personal session cookie, and does not launch a browser.

#### What happens to invalid or unavailable inputs?

Invalid individual inputs are saved as failed rows without a source request. Confirmed unavailable targets stop without unnecessary retries. Temporary failures allow up to five total attempts; other inputs and previously saved results remain available.

#### Can I export results or schedule runs?

Yes. Download the default dataset in supported formats or retrieve it through the Apify API. Apify schedules and completion webhooks can connect repeated runs to your own workflow.

### Support, responsible use, and related actors 🛟

For a reproducible issue, use the Actor’s **Issues** tab and provide the run ID, approximate time, safe public input, expected behavior and actual result. Include the selected mode or page count when applicable. Do not share access tokens, cookies or proxy credentials.

Use public data responsibly and follow applicable privacy, copyright, contractual and platform requirements before storing, analyzing or redistributing collected information.

# Actor input Schema

## `inputList` (type: `array`):

Enter keyword queries or canonical Pinterest /search/users/?q= URLs.

## `pagesPerSearch` (type: `integer`):

Maximum result pages per input. Website page sizes vary; short pages can still have a continuation. Preparation requests do not count as result pages.

## Actor input object example

```json
{
  "inputList": [
    "modern kitchen"
  ],
  "pagesPerSearch": 1
}
```

# Actor output Schema

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

Individual result rows. Failed rows retain the input and status.

# 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 = {
    "inputList": [
        "modern kitchen"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapingmonkey/pinterest-profile-search-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 = { "inputList": ["modern kitchen"] }

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

```

## MCP server setup

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