# Pinterest Comments Scraper — Full Comment Threads (`apt_marble/pinterest-comments-scraper`) Actor

Get every public comment on any Pinterest pin: the text, who wrote it, the date, helpful marks, reactions and full reply threads — one clean row per comment. Paste pin links, export to CSV, Excel or JSON. No Pinterest account needed. Built for product feedback, brand monitoring and research.

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

## Pricing

from $2.00 / 1,000 comment scrapeds

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

## Pinterest Comments Scraper — Full Comment Threads

Paste a list of Pinterest pins and get back every public comment on them, one row per comment: what was written, who wrote it, when, how many people marked it helpful, how many reacted — and, if you switch it on, the whole reply thread underneath. No Pinterest account or login is needed. Give it pins, get a clean table.

Comments are the one place on Pinterest where people say what they actually think: whether the recipe worked, whether the product arrived, what they wish the maker had explained. This actor turns that into structured data you can sort, filter and analyse.

### What you can do with it

- **Mine honest product and recipe feedback** — pull hundreds of first-hand reactions to a pin and find out what people praise, what confuses them and what goes wrong.
- **Answer the questions under your own pins** — every unanswered question left on your brand's pins, in one list, with the person who asked it.
- **Study a competitor's most-commented pins** — see which of their ideas provoke a reaction and what people ask for that nobody is supplying.
- **Build a sentiment or review dataset** — thousands of short, dated, attributed opinions ready for tagging or model training.
- **Find your most engaged followers** — the handles that keep coming back to comment, ranked by how often people mark their comments helpful.
- **Track a pin over time** — schedule the same pins daily or weekly and watch the conversation grow.

### What you get

One row per comment. Replies are their own rows, with `isReply` set to `true` and `parentCommentId` pointing at the comment they answer, so a whole thread reassembles with a single group-by.

```json
{
  "type": "comment",
  "commentId": "3585202483318988480",
  "pinId": "140806235259461",
  "pinUrl": "https://www.pinterest.com/pin/140806235259461/",
  "pinTitle": "Best Banana Bread Recipe Easy Homemade Comfort Food Treat",
  "isReply": false,
  "parentCommentId": null,
  "text": "Would love to make this recipe but the site is over running with ads",
  "authorUsername": "annamarievictor",
  "authorFullName": "Annamarie Victor",
  "authorProfileUrl": "https://www.pinterest.com/annamarievictor/",
  "authorImage": "https://i.pinimg.com/75x75_RS/64/01/06/64010678e5e4510367609825818521f0.jpg",
  "createdAt": "2026-06-12T15:49:20.000Z",
  "helpfulCount": 0,
  "replyCount": 1,
  "reactionCount": 7,
  "reactionCounts": { "1": 7 },
  "isEdited": false,
  "highlightedByPinOwner": false,
  "taggedUsers": [],
  "hasMedia": false,
  "inputTarget": "https://www.pinterest.com/pin/140806235259461/",
  "position": 1,
  "scrapedAt": "2026-08-04T14:08:05.680Z"
}
```

### Input reference

| Field | Type | Default | What it does |
| --- | --- | --- | --- |
| `pins` | list of text | — | One pin per line. Paste the full address from your browser (`https://www.pinterest.com/pin/211174978421744/`) or just the numeric ID. **Required.** |
| `maxCommentsPerPin` | number | `200` | How many comments to take from each pin, in the order Pinterest itself shows them. Maximum 5,000. |
| `includeReplies` | yes / no | `no` | Also collect the replies under each comment that has any. They arrive as their own rows. |
| `maxRepliesPerComment` | number | `50` | Ceiling on replies collected under a single comment. Maximum 200. |
| `minHelpfulCount` | number | `0` | Keep only comments marked helpful at least this many times. `0` keeps everything. |
| `country` | choice | `United States` | Which country the run browses Pinterest from. |
| `pinsAtOnce` | number | `4` | How many pins to work through in parallel. Maximum 8. |

### Output fields

| Field | Type | Description |
| --- | --- | --- |
| `type` | text | Always `comment`. |
| `commentId` | text | Pinterest's own ID for the comment — stable, so you can de-duplicate across runs. |
| `pinId` | text | The pin the comment sits on. |
| `pinUrl` | link | Full address of that pin. |
| `pinTitle` | text | The pin's caption. Where a pin has none, an automatically generated image description or its search title is provided instead. |
| `isReply` | yes / no | `true` for a reply, `false` for a top-level comment. |
| `parentCommentId` | text | For a reply, the `commentId` it answers. `null` otherwise. |
| `text` | text | The comment itself. Occasionally empty when someone posted only an image. |
| `authorUsername` | text | The commenter's Pinterest handle. |
| `authorFullName` | text | Their display name. |
| `authorProfileUrl` | link | Their public profile. |
| `authorImage` | link | Their profile picture. |
| `createdAt` | date | When the comment was posted, in ISO-8601. |
| `helpfulCount` | number | How many people marked the comment helpful. |
| `replyCount` | number | How many replies the comment has. |
| `reactionCount` | number | Total reactions on the comment. |
| `reactionCounts` | object | Reactions broken down by kind, or `null` when there are none. |
| `isEdited` | yes / no | Whether the comment was edited after posting. |
| `highlightedByPinOwner` | yes / no | Whether the pin's owner pinned this comment to the top. |
| `taggedUsers` | list | Handles tagged inside the comment. |
| `hasMedia` | yes / no | Whether the comment carries an image or video of its own. |
| `inputTarget` | text | The exact line you pasted that produced this row. |
| `position` | number | Where the comment sat in the thread as Pinterest served it. Replies are numbered within their own thread. |
| `scrapedAt` | date | When the row was collected. |

### Pricing

You pay per result, so a run that finds nothing costs nothing.

| What you pay for | Price per 1,000 |
| --- | --- |
| Every comment row (including reply rows) | **$2.00** |
| Every reply thread that was opened and turned out to have replies | **$4.00** |

The second charge only ever happens when you switch **Include reply threads** on *and* the comment really had replies underneath. Comments with no replies are free of it, and if you leave the switch off you are never charged it at all.

**Worked example.** Ten busy pins, 200 comments from each, replies switched on. That is 2,000 comment rows at $2.00 per 1,000 = **$4.00**. Say 300 of those comments had replies, producing 380 reply rows: the 300 opened threads cost $4.00 per 1,000 = **$1.20**, and the 380 reply rows cost **$0.76**. Total for the run: **$5.96**.

Leave replies off and the same job is a flat **$4.00**.

### Limits & what this actor cannot do

- Pinterest publishes a limited slice of any public thread. Very large threads return up to roughly the first 2,000 comments on a single pin, and Pinterest may stop serving a thread sooner than that — you get what Pinterest makes available rather than a guaranteed complete history. You can ask for more, and the run will tell you when it has hit that ceiling.
- Comments arrive in **Pinterest's own order**, which is its own ranking and not strict date order. Sort by `createdAt` yourself if you need chronology.
- Helpful counts, reaction counts and reply counts are a snapshot at the moment of collection and keep changing afterwards.
- A pin with no comments produces no rows. It is reported in the run log as having nothing to return, and you are not charged for it.
- Deleted pins, and pins that are no longer publicly viewable, are reported as unavailable rather than returned empty.
- Shortened `pin.it` links cannot be used. Open one in a browser and paste the full address instead — the actor tells you which lines it skipped rather than guessing.
- Many pins carry no caption of their own, so `pinTitle` may hold an automatically generated image description instead.
- The minimum-helpful-count filter is applied while the thread is being read, so a strict threshold returns far fewer rows and can legitimately return none — most comments are never marked helpful by anybody.
- Results can differ slightly depending on the country the run browses from, so keep that setting fixed across runs you want to compare.
- How long a run takes depends on the size of the job and on Pinterest's own response times. No fixed speed is promised.

### Using the data responsibly

Comments are personal data. Each row carries somebody's handle, display name, profile picture and the words they wrote. You are responsible for handling that lawfully — including any privacy law that applies to you and to the people whose comments you collect — for keeping it only as long as you need it, and for using it in line with Pinterest's terms. If you are unsure whether your intended use is allowed, take advice before you run a large job.

### FAQ

**Do I need a Pinterest account?**
No. It reads only pages that are already public to anyone.

**Does it need my login or password?**
No, and it will never ask for one.

**Can I schedule it?**
Yes. Schedule the same list of pins daily or weekly and each run adds a fresh dated snapshot, so you can watch a conversation grow.

**Is the data complete?**
It is complete as far as Pinterest publishes it. For most pins that means every comment on the thread; for the very busiest it means the large slice Pinterest is willing to serve publicly, which is not always all of it. The run log tells you how many comments Pinterest says a pin has, next to how many were actually collected, so you can always see your coverage.

**Why did a pin return nothing?**
Most likely it genuinely has no comments — that is very common on Pinterest and is reported in the log. It can also mean the pin was deleted or is no longer public, which is reported separately.

**Do replies count towards the comment limit?**
No. `maxCommentsPerPin` counts top-level comments. Replies are collected in addition to it, bounded by `maxRepliesPerComment`.

**Can I get comments for a whole board or profile at once?**
Not directly — this actor takes pins. Collect the pins from a board or profile first, then feed that list of pin links in here.

# Actor input Schema

## `pins` (type: `array`):

One pin per line. Paste the full address from your browser — https://www.pinterest.com/pin/211174978421744/ — or just the numeric ID. Shortened pin.it links are not supported: open one and copy the full address instead.

## `maxCommentsPerPin` (type: `integer`):

How many comments to collect from each pin, in the order Pinterest itself shows them (its own ranking, not strict date order). Busy pins can carry hundreds; set this lower for a quick sample.

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

Also collect the replies underneath each comment that has any. Replies arrive as their own rows, linked to the comment they answer.

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

Upper limit on how many replies to collect under a single comment. Only used when reply threads are switched on.

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

Keep only comments marked helpful at least this many times. Leave at 0 to keep every comment. A high threshold returns far fewer rows, because most comments are never marked helpful.

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

Which country Pinterest is browsed from. Comment threads are largely the same everywhere, but pinning this keeps runs you want to compare consistent.

## `pinsAtOnce` (type: `integer`):

How many pins to work through in parallel. Lower is gentler and steadier; higher finishes a long list sooner.

## Actor input object example

```json
{
  "pins": [
    "https://www.pinterest.com/pin/211174978421744/"
  ],
  "maxCommentsPerPin": 40,
  "includeReplies": false,
  "maxRepliesPerComment": 50,
  "minHelpfulCount": 0,
  "country": "us",
  "pinsAtOnce": 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 = {
    "pins": [
        "https://www.pinterest.com/pin/211174978421744/"
    ],
    "maxCommentsPerPin": 40,
    "includeReplies": false,
    "maxRepliesPerComment": 50,
    "minHelpfulCount": 0,
    "country": "us",
    "pinsAtOnce": 4
};

// Run the Actor and wait for it to finish
const run = await client.actor("apt_marble/pinterest-comments-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 = {
    "pins": ["https://www.pinterest.com/pin/211174978421744/"],
    "maxCommentsPerPin": 40,
    "includeReplies": False,
    "maxRepliesPerComment": 50,
    "minHelpfulCount": 0,
    "country": "us",
    "pinsAtOnce": 4,
}

# Run the Actor and wait for it to finish
run = client.actor("apt_marble/pinterest-comments-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 '{
  "pins": [
    "https://www.pinterest.com/pin/211174978421744/"
  ],
  "maxCommentsPerPin": 40,
  "includeReplies": false,
  "maxRepliesPerComment": 50,
  "minHelpfulCount": 0,
  "country": "us",
  "pinsAtOnce": 4
}' |
apify call apt_marble/pinterest-comments-scraper --silent --output-dataset

```

## MCP server setup

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