# Patreon Post Comments Scraper (`scrapingmonkey/patreon-post-comments-scraper`) Actor

Collect public Patreon post comments and optional replies with authors, dates, likes and parent-comment relationships.

- **URL**: https://apify.com/scrapingmonkey/patreon-post-comments-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?

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

Collect public Patreon post comments and optional replies, with one comment or reply per dataset row. **Patreon Post Comments Scraper** returns text, author references, dates, visible votes and parent-comment links.

Build a discussion dataset for manual feedback review or your own text analysis. Main comments and replies share one view, and parent identifiers preserve their relationships.

| At a glance | Details |
|---|---|
| 📥 Input | Enter numeric post IDs or Patreon post URLs. Unavailable comment bodies are skipped; replies are optional. |
| 📤 Output | One comment or reply per success row with the input source retained |
| 📄 Pagination | Result pages per input; page sizes and availability are controlled by Patreon |
| 🔐 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 Patreon post comments scraper collects 💬

The Actor paginates the public conversation feed of selected posts. Optional reply collection uses available continuation cursors and removes repeated comment IDs within the source post.

Data can include:

- Comment ID, text, creation time and source-post context
- Public commenter names, profile links and avatar references
- Visible votes, reply counts and creator-interaction indicators
- Parent-comment relationships for individual reply rows
- Availability state without inventing text for removed or inaccessible comments

| Setting | Result |
|---|---|
| `sort: "popular"` | Main conversations in the website’s popular order |
| `sort: "newest"` | Main conversations in newest order |
| `includeReplies: true` | Available replies become individual rows with parent links |

`pageSize` applies to main-comment and reply requests. `replyPagesPerThread` limits additional reply pages for each thread; replies already returned with a main-comment page do not consume that continuation budget.

### How to collect post comments from Patreon 🚀

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 **Comments** dataset view and review success or failed rows.
5. Export the dataset or retrieve records from your application.

```json
{
  "inputList": [
    "https://www.patreon.com/posts/163588644"
  ],
  "pagesPerPost": 1,
  "includeReplies": true,
  "replyPagesPerThread": 1,
  "pageSize": 10,
  "sort": "popular"
}
```

Main-comment pages and reply continuation are controlled by the input settings. A post’s total comment counter can include replies and unavailable records, so it need not equal the number of saved main comments.

### Patreon post comments output fields 📦

| Field | Type | Meaning |
|---|---|---|
| `input` | string | Original submitted input. |
| `status` | string | success for a collected entity; failed for an invalid, unavailable or exhausted input. |
| `id` | string or null | Id when supplied by Patreon. |
| `type` | string or null | Type when supplied by Patreon. |
| `post_id` | string or null | Post id when supplied by Patreon. |
| `post_url` | string or null | Post url when supplied by Patreon. |
| `post_title` | string or null | Post title when supplied by Patreon. |
| `body` | string or null | Body when supplied by Patreon. |
| `body_text` | string or null | Body text when supplied by Patreon. |
| `created_at` | string or null | Created at when supplied by Patreon. |
| `deleted_at` | string or null | Deleted at when supplied by Patreon. |
| `like_count` | integer or null | Like count when supplied by Patreon. |
| `reply_count` | integer or null | Reply count when supplied by Patreon. |
| `is_liked_by_creator` | boolean or null | Is liked by creator when supplied by Patreon. |
| `is_replied_to_by_creator` | boolean or null | Is replied to by creator when supplied by Patreon. |
| `visibility_state` | string or null | Visibility state when supplied by Patreon. |
| `parent_comment_id` | string or null | Parent comment ID for a reply; null for a main comment. |
| `is_reply` | boolean or null | Whether this row is a reply to another comment. |
| `thread_id` | string or null | Conversation thread identifier used to associate main comments and replies. |
| `author` | object or null | Author when supplied by Patreon. |
| `media` | array or null | Media when supplied by Patreon. |
| `page` | integer or null | One-based main result page. Null for an individual detail lookup. |
| `reply_page` | integer or null | One-based additional reply page. Null for main comments and replies already included with them. |

Nested field structure:

- `author`: `id`, `name`, `url`, `image_url`.
- `media[]`: `id`, `media_type`, `file_name`, `mime_type`, `size_bytes`, `state`, `url`, `download_url`, `width`, `height`, `duration_seconds`, `thumbnail_url`, `image_versions`.
- `media[].image_versions[]`: `name`, `url`.

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": "https://www.patreon.com/posts/163588644",
  "status": "success",
  "id": "218253776",
  "type": "comment",
  "post_id": "163588644",
  "post_url": "https://www.patreon.com/posts/163588644",
  "post_title": "It's Bridgerton day! ",
  "body": "i used to pray for times like this ",
  "body_text": "i used to pray for times like this",
  "created_at": "2026-07-12T09:31:53.846+00:00",
  "deleted_at": null,
  "like_count": 19,
  "reply_count": 0,
  "is_liked_by_creator": false,
  "is_replied_to_by_creator": false,
  "visibility_state": "visible",
  "parent_comment_id": null,
  "is_reply": false,
  "thread_id": "ci_218253776_th",
  "author": {
    "id": "u214482034-context_cids:12196794-context_owner_user_id:128634315",
    "name": "Loz",
    "url": "https://www.patreon.com/user?u=214482034",
    "image_url": "https://c8.patreon.com/4/120/214482034/L"
  },
  "media": [],
  "page": 1,
  "reply_page": null
}
```

Complete reply result:

```json
{
  "input": "https://www.patreon.com/posts/163588644",
  "status": "success",
  "id": "218270004",
  "type": "comment",
  "post_id": "163588644",
  "post_url": "https://www.patreon.com/posts/163588644",
  "post_title": "It's Bridgerton day! ",
  "body": "do you know if the reactions are watch along format or the episodes edited onto the reaction? ",
  "body_text": "do you know if the reactions are watch along format or the episodes edited onto the reaction?",
  "created_at": "2026-07-12T14:54:29.882+00:00",
  "deleted_at": null,
  "like_count": 0,
  "reply_count": 0,
  "is_liked_by_creator": false,
  "is_replied_to_by_creator": false,
  "visibility_state": "visible",
  "parent_comment_id": "218267725",
  "is_reply": true,
  "thread_id": "ci_218267725_th",
  "author": {
    "id": "u53192112-context_cids:12196794-context_owner_user_id:128634315",
    "name": "Halima",
    "url": "https://www.patreon.com/user?u=53192112",
    "image_url": "https://c10.patreonusercontent.com/4/patreon-media/p/user/53192112/4f13345bace540718ebab0cf91aab422/eyJ3IjoxMjB9/1.jpeg?token-hash=ajfN8zn75WgyHOem2wlHKznkpevcD_Tmf9kzZ8ioUY8%3D&token-time=1790380800"
  },
  "media": [],
  "page": 17,
  "reply_page": null
}
```

Complete failed dataset item:

```json
{
  "input": "https://www.patreon.com/posts/163588644",
  "status": "failed",
  "id": null,
  "type": null,
  "post_id": null,
  "post_url": null,
  "post_title": null,
  "body": null,
  "body_text": null,
  "created_at": null,
  "deleted_at": null,
  "like_count": null,
  "reply_count": null,
  "is_liked_by_creator": null,
  "is_replied_to_by_creator": null,
  "visibility_state": null,
  "parent_comment_id": null,
  "is_reply": null,
  "thread_id": null,
  "author": null,
  "media": null,
  "page": null,
  "reply_page": 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 Patreon 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 numeric post IDs or Patreon post URLs. Unavailable comment bodies are skipped; replies are optional. |
| `pagesPerPost` | integer | No | `1` | Maximum result pages per input. Preparation requests do not count. A short page can still have a continuation. Minimum `1`. |
| `includeReplies` | boolean | No | `true` | Save replies already included with comments and fetch their available continuations. Comments and replies share one table. |
| `replyPagesPerThread` | integer | No | `1` | Maximum additional reply pages per comment thread. Already included replies do not consume this limit. Ignored when Include replies is disabled. Minimum `1`. |
| `pageSize` | integer | No | `10` | Requested number of main comments or continuation replies per page. The site may return fewer. Minimum `1`. Maximum `10`. |
| `sort` | string | No | `"popular"` | Order of main comments. Reply continuations follow chronological order. Allowed: `popular`, `newest`. |

Enter supported post URLs or positive post IDs. Select the available sort and reply options; creator URLs are not comment-feed inputs.

Use supported Patreon paths on `www.patreon.com` or `patreon.com`. HTTPS is required for full URLs; those two hosts can also be entered without the scheme. URLs with credentials, custom ports or unsupported paths are not 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. Main-comment pages count toward `pagesPerPost`. Each thread has its own `replyPagesPerThread` budget for additional reply requests. Already loaded replies can be saved without a separate continuation request; the total number of rows is not fixed by either budget.

### Patreon post comments use cases 🎯

#### Audience feedback review

Export comment text, dates and author references from a chosen post. Review the records manually or apply your own analysis after collection.

#### Conversation structure analysis

Include replies and join records by parent identifiers to inspect public discussions without losing the source post.

#### Creator interaction snapshots

Review visible creator-like and reply indicators together with comment text. These fields are source snapshots rather than a complete moderation history.

### 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 comment or reply 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, tiers, poll choices and source fields stay inside their parent result when relevant.
- 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.

### Patreon post comments 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":["https://www.patreon.com/posts/163588644"],"pagesPerPost":1,"includeReplies":true,"replyPagesPerThread":1,"pageSize":10,"sort":"popular"}'
```

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.

Patreon 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.

Only publicly returned discussion records are available. Deleted or unavailable comment placeholders do not reveal their original text. Reply counts, post comment totals and saved row counts can differ. The Actor neither posts comments nor retrieves a list of post likers.

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 ❓

#### Are replies separate rows?

Yes, when reply collection is enabled and they are publicly returned. Replies share the comments view and retain their parent-comment relationship.

#### Can I collect newest comments first?

Use the supported sorting option for the website’s newest conversation order. Sorting controls main comments; replies preserve their own conversation order.

#### Does it recover deleted comments?

No. An unavailable placeholder cannot supply deleted text. The Actor retains only supported information actually returned by the source.

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

No. The Actor uses HTTP requests from the public website. It does not require a Patreon 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 numeric post IDs or Patreon post URLs. Unavailable comment bodies are skipped; replies are optional.

## `pagesPerPost` (type: `integer`):

Maximum result pages per input. Preparation requests do not count. A short page can still have a continuation.

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

Save replies already included with comments and fetch their available continuations. Comments and replies share one table.

## `replyPagesPerThread` (type: `integer`):

Maximum additional reply pages per comment thread. Already included replies do not consume this limit. Ignored when Include replies is disabled.

## `pageSize` (type: `integer`):

Requested number of main comments or continuation replies per page. The site may return fewer.

## `sort` (type: `string`):

Order of main comments. Reply continuations follow chronological order.

## Actor input object example

```json
{
  "inputList": [
    "https://www.patreon.com/posts/163588644"
  ],
  "pagesPerPost": 1,
  "includeReplies": true,
  "replyPagesPerThread": 1,
  "pageSize": 10,
  "sort": "popular"
}
```

# Actor output Schema

## `comments` (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": [
        "https://www.patreon.com/posts/163588644"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapingmonkey/patreon-post-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 = { "inputList": ["https://www.patreon.com/posts/163588644"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapingmonkey/patreon-post-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 '{
  "inputList": [
    "https://www.patreon.com/posts/163588644"
  ]
}' |
apify call scrapingmonkey/patreon-post-comments-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapingmonkey/patreon-post-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/2fgk6yo0VizW5pbbk/builds/gOw8X5MTo984L0gO4/openapi.json
