# Pinterest Pin Comments & Activity Extractor (`vexaloom-labs/pinterest-pin-comments-and-activity-extractor`) Actor

Pull public comments, replies, reactions, and Tried It activity for one or more Pinterest Pins, along with each Pin's title, creator, board, and engagement summary.

- **URL**: https://apify.com/vexaloom-labs/pinterest-pin-comments-and-activity-extractor.md
- **Developed by:** [vexaloom-labs](https://apify.com/vexaloom-labs) (community)
- **Categories:** Social media, Automation, 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.49 / 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?

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 Pin Comments & Activity Extractor

Read public Pinterest Pin conversations: top-level comments, reply threads, and Tried It
activity, together with a detailed Pin, creator and board summary. Everything is public
and cookieless; there is no login, cookie or proxy step.

### What you can collect

| Mode | Returns |
|---|---|
| Comments, replies and activity (default) | Pin summary + comments + replies + activity |
| Comments and replies | Pin summary + comments + replies |
| Tried It activity | Pin summary + activity rows |
| Pin summary only | One summary row per Pin, no comment requests |

Use the mode that matches the job. Comments are ranked by Pinterest; `commentSort` can
re-order the fetched window by newest or oldest published date.

### Output

Every row carries `recordType`, `pinId`, `pinUrl`, `sourceUrl` and `scrapedAt`.
Records are omitted when Pinterest does not publish the value; published zeroes and
`false` flags are preserved.

#### Pin summary (`recordType: "pinCommentsSummary"`)

Pin identity and context: `aggregatedPinId`, `title`, `description`, `createdAt`,
`domain`, `linkUrl`, `linkDomain`, `seoTitle`, `seoDescription`, `altText`, `hashtags`,
`imageUrl`, `imageWidth`, `imageHeight`, `imageSignature`, `dominantColor`, `videoUrl`,
`videoThumbnailUrl`, `videoDurationMs`, `priceValue`, `priceCurrency`,
`productAvailability`, `isPromoted`, `isShoppable`.

Engagement: `commentCount`, `saveCount`, `repinCount`, `shareCount`, `reactionCount`,
`reactionCounts`, `didItCount`, `didItUserCount`, plus the availability flags
`commentsDisabled`, `commentsEligible`, `didItDisabled` and `isEligibleForTriedIt`.

Nested `creator`: `id`, `username`, `fullName`, `followerCount`, `avatarUrl`,
`isVerifiedMerchant`, `domainUrl`, `profileUrl`.

Nested `board`: `id`, `name`, `url`, `pinCount`, `followerCount`, `ownerUsername`,
`isCollaborative`.

#### Comments and replies (`recordType: "comment"`)

`commentId`, `nodeId`, `parentCommentId` (replies), `isReply`, `replyDepth`, `text`,
`details`, `createdAt`, `likeCount`, `reactionCounts`, `reactionByMe`, `helpfulCount`,
`markedHelpfulByMe`, `replyCount`, `isEdited`, `isHighlightedByPinOwner`,
`isTranslatable`, `commentType`, `isUserFirstComment`, `replyPreviewIds`,
`attachedPin`, `pinData`, `commentResponsePin`, `commentTag`, `textTags`, `tags`,
`taggedUsers`, `media`, and nested `author` (`id`, `nodeId`, `username`, `firstName`,
`fullName`, `avatarUrl`, `isPrivateProfile`, `type`, `profileUrl`).

Replies keep `recordType: "comment"` so existing consumers keep working; `isReply`,
`parentCommentId` and `replyDepth` identify them.

#### Activity (`recordType: "pinActivity"`)

`activityId`, `commentId`, `nodeId`, `text`, `details`, `doneAt`, `likeCount`,
`likedByMe`, `reactionCounts`, `reactionByMe`, `helpfulCount`, `markedHelpfulByMe`,
`commentCount`, `didItType`, `privacy`, `hasTryPin`, `tryPin`, `hasRecommended`,
`recommendScore`, `recommendationReason`, `imageSignatures`, `images`,
`imagesReformatted`, `videos`, `textTags`, `tags`, `taggedUsers`,
`isHighlightedByPinOwner`, and nested `author`.

Activity rows come from Pinterest's Tried It feed and the comments stream. They are
deduplicated by ID and merged so the richer published fields survive.

### Input

| Field | Type | Default | Purpose |
|---|---|---|---|
| `mode` | select | `commentsAndActivity` | What to collect. |
| `urls` | array | — | Numeric Pin URLs or IDs. |
| `domain` | select | `www.pinterest.com` | Regional Pinterest site. |
| `maxComments` | integer | `10` | Top-level comments per Pin. |
| `includeReplies` | boolean | `true` | Fetch reply threads. |
| `maxRepliesPerComment` | integer | `100` | Cap replies per comment; `0` skips them. |
| `maxActivity` | integer | `100` | Activity rows per Pin. |
| `includePinSummary` | boolean | `true` | Emit the summary row. |
| `commentSort` | select | `source` | Pinterest ranking, newest or oldest. |
| `minLikeCount` | integer | `0` | Keep rows at or above this published like count. |
| `minHelpfulCount` | integer | `0` | Keep rows at or above this published helpful count. |
| `sinceDate` | string | — | Inclusive lower date bound (`YYYY-MM-DD`). |
| `untilDate` | string | — | Inclusive upper date bound (`YYYY-MM-DD`). |
| `proxyConfiguration` | object | — | Optional Apify proxy override; not required. |

#### Example: one Pin with replies

```json
{
  "urls": ["https://www.pinterest.com/pin/112027111109155913/"],
  "mode": "commentsAndActivity",
  "maxComments": 50,
  "includeReplies": true,
  "maxRepliesPerComment": 25,
  "maxActivity": 50,
  "commentSort": "newest"
}
```

#### Example: recent activity only

```json
{
  "urls": ["112027111109155913"],
  "mode": "activity",
  "maxActivity": 25,
  "sinceDate": "2024-01-01"
}
```

#### Example: several Pins

```json
{
  "urls": [
    "https://www.pinterest.com/pin/142567144448888376/",
    "https://uk.pinterest.com/pin/155303887824034154/"
  ],
  "domain": "uk.pinterest.com",
  "maxComments": 100,
  "includePinSummary": false
}
```

#### Legacy inputs

Saved tasks that still send `pinUrls`, `startUrls`, `limit`, `cookies` or `cookiesJson`
keep running: the aliases are mapped in code, and cookie keys are ignored with a
warning because the public surface does not need them. These keys are intentionally
not shown in the input form.

### How pagination and filters work

Comments are paged with Pinterest's public bookmark cursor until the source is
exhausted or `maxComments` top-level rows are collected. Replies are fetched only for
comments with a published reply count and are capped by `maxRepliesPerComment`.
Activity follows the same cursor until `maxActivity` rows are collected.

`commentSort`, `minLikeCount`, `minHelpfulCount`, `sinceDate` and `untilDate` are
applied to the rows fetched in that window. They never invent values: a row without a
published count or date is kept rather than assumed to be zero or out of range.

### Use cases

- Conversation and sentiment review for selected Pins.
- Moderation queues with author, text, media and engagement context.
- Recipe or product feedback, including Tried It photos and dates.
- Reply-thread analysis without a login.
- Recurring monitoring with date and engagement filters.

### FAQ

#### Do I need a Pinterest account or cookies?

No. The actor reads Pinterest's public signed-out responses.

#### Which Pins work?

Numeric Pins such as `142567144448888376`. Opaque share IDs that Pinterest sometimes
returns from search are list-only upstream and cannot resolve a Pin detail or comments.

#### Why are there fewer comments than the Pin's count?

The published count can include replies, private or removed comments, or comments
Pinterest withholds from signed-out visitors. The actor returns what the public cursor
actually serves and never fabricates rows.

#### Are replies included?

Yes when `includeReplies` is on. Pinterest exposes one public reply level; replies are
attached to their top-level comment with `parentCommentId`.

#### Why did an activity row appear even though the Tried It feed was empty?

Pinterest sometimes publishes activity in the comments stream only. The actor merges
both sources and deduplicates by activity ID.

#### Does `likeCount` mean all reactions?

It is Pinterest's published like/reaction type for that row. The full published
breakdown, when present, is in `reactionCounts`.

#### Can I download comment media?

The actor returns the media references Pinterest publishes (image or video URLs and
sizes). It does not download the files.

#### What does an omitted field mean?

Pinterest did not publish that value for the object or for the signed-out session. It
does not mean the actor guessed zero.

#### Is this affiliated with Pinterest?

No. This actor reads Pinterest's public responses and is not operated by or affiliated
with Pinterest, Inc.

# Actor input Schema

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

Choose comments with replies, Tried It activity, both, or only the Pin summary.

## `urls` (type: `array`):

One or more numeric Pinterest Pin links or IDs, e.g. https://www.pinterest.com/pin/142567144448888376/. Legacy pinUrls and startUrls inputs are still accepted in code.

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

Regional Pinterest site used for every request. Use the region shown in the Pin link.

## `maxComments` (type: `integer`):

Top-level comments to collect per Pin; replies are counted separately. Legacy limit input is still accepted in code.

## `includeReplies` (type: `boolean`):

Fetch public replies for comments that have them.

## `maxRepliesPerComment` (type: `integer`):

Reply rows to collect for each top-level comment. Set to 0 to skip replies.

## `maxActivity` (type: `integer`):

Tried It and other public activity rows to collect per Pin.

## `includePinSummary` (type: `boolean`):

Emit one pinCommentsSummary row with the Pin, creator, board, media, commerce and engagement context.

## `commentSort` (type: `string`):

Source keeps Pinterest's ranking; newest and oldest sort the fetched comments by their published date.

## `minLikeCount` (type: `integer`):

Drop comment, reply and activity rows whose published like count is lower. Rows without a published count are kept.

## `minHelpfulCount` (type: `integer`):

Drop comment, reply and activity rows whose published helpful count is lower. Rows without a published count are kept.

## `sinceDate` (type: `string`):

Optional inclusive date filter (YYYY-MM-DD) for comments, replies and activity. Leave empty for no lower bound.

## `untilDate` (type: `string`):

Optional inclusive date filter (YYYY-MM-DD) for comments, replies and activity. Leave empty for no upper bound.

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

Optional Apify proxy override. The actor works directly and falls back to the automatic Apify proxy without user setup.

## Actor input object example

```json
{
  "mode": "commentsAndActivity",
  "urls": [
    "https://www.pinterest.com/pin/142567144448888376/"
  ],
  "domain": "www.pinterest.com",
  "maxComments": 3,
  "includeReplies": false,
  "maxRepliesPerComment": 0,
  "maxActivity": 3,
  "includePinSummary": true,
  "commentSort": "source",
  "minLikeCount": 0,
  "minHelpfulCount": 0,
  "sinceDate": "",
  "untilDate": ""
}
```

# Actor output Schema

## `records` (type: `string`):

Dataset containing Pinterest comment, reply, activity and Pin summary records.

# 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 = {
    "mode": "commentsAndActivity",
    "urls": [
        "https://www.pinterest.com/pin/142567144448888376/"
    ],
    "domain": "www.pinterest.com",
    "maxComments": 3,
    "includeReplies": false,
    "maxRepliesPerComment": 0,
    "maxActivity": 3,
    "includePinSummary": true,
    "commentSort": "source",
    "minLikeCount": 0,
    "minHelpfulCount": 0,
    "sinceDate": "",
    "untilDate": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("vexaloom-labs/pinterest-pin-comments-and-activity-extractor").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 = {
    "mode": "commentsAndActivity",
    "urls": ["https://www.pinterest.com/pin/142567144448888376/"],
    "domain": "www.pinterest.com",
    "maxComments": 3,
    "includeReplies": False,
    "maxRepliesPerComment": 0,
    "maxActivity": 3,
    "includePinSummary": True,
    "commentSort": "source",
    "minLikeCount": 0,
    "minHelpfulCount": 0,
    "sinceDate": "",
    "untilDate": "",
}

# Run the Actor and wait for it to finish
run = client.actor("vexaloom-labs/pinterest-pin-comments-and-activity-extractor").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 '{
  "mode": "commentsAndActivity",
  "urls": [
    "https://www.pinterest.com/pin/142567144448888376/"
  ],
  "domain": "www.pinterest.com",
  "maxComments": 3,
  "includeReplies": false,
  "maxRepliesPerComment": 0,
  "maxActivity": 3,
  "includePinSummary": true,
  "commentSort": "source",
  "minLikeCount": 0,
  "minHelpfulCount": 0,
  "sinceDate": "",
  "untilDate": ""
}' |
apify call vexaloom-labs/pinterest-pin-comments-and-activity-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,vexaloom-labs/pinterest-pin-comments-and-activity-extractor"
        }
    }
}
```

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/QFDd89Ia1Lh4fLqIg/builds/jzOeBCtohAb2PkYW6/openapi.json
