# Patreon Extractor 🎯 ⭐5.0 (`jupri/patreon`) Actor

💫 All-in-One Patreon.com Scraper \[v5.0]

- **URL**: https://apify.com/jupri/patreon.md
- **Developed by:** [cat](https://apify.com/jupri) (community)
- **Categories:** Social media, Lead generation, Videos
- **Features:** Full permissions
- **Stats:** 2,759 total users, 13 monthly users, 93.8% runs succeeded, 9 bookmarks
- **User rating**: 4.95 out of 5 stars

## Pricing

$5.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.

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

## 💫 Welcome To Patreon Scraper

<img height="32" src="https://apify.com/actor-badge?actor=jupri~patreon" align="right">

![dont be sad readme is here](https://raw.githubusercontent.com/JupriGH/resources/main/cats/catframe.png)

👉 *For more up-to-date content, please refresh this page*

### 🎯 About Patreon.com

<img src="https://upload.wikimedia.org/wikipedia/commons/8/82/Patreon_logo_with_wordmark.svg" width="50%" align="right">

**Patreon** ([/ˈpeɪtriɒn/](https://en.wikipedia.org/wiki/Help:IPA/English "Help:IPA/English"), [/-ən/](https://en.wikipedia.org/wiki/Help:IPA/English "Help:IPA/English")) is a membership platform that provides business tools for content creators to run a [subscription service](https://en.wikipedia.org/wiki/Subscription_service "Subscription service"). It helps creators and artists earn a monthly income by providing rewards and perks to their subscribers. Patreon charges a commission of 9 to 12 percent of creators' monthly income, in addition to payment processing fees.

### 🎯 About This Actor

**💫 All-In-One **Patreon.com** Scraper**

- ⭐ Scrape creator info
- ⭐ Scrape campaign info, collection, products, chats, etc.
- ⭐ Scrape & search posts
- ⭐ Scrape comments
- ⭐ Accept `URL` inputs
- ⭐ Multiple `query` in single request
- ⭐ Scrape personal data (session cookie required `session_id`)

#### Disclaimer :

- 👉 This scraper is not intended to scrape Patreon.com creators protected content that requires a subscription for free.
- 👉 To access creators protected content, please subscribe to the Creator, then try including `session_id` cookie value from your Patreon.com **Login Session**
- 👉 Free Trial `query` is limited to **5** per request.
- 👉 Free Trial results is limited to first **100** results.

### 🎯 Input Parameters

| Name | Type | Description |
|-|-|-|
| `query` | ***array*** | List of `QUERY`, `URL` or `KEYWORD` |
| `limit` | ***integer*** | Number of results `per-query` |
| `filters` | ***object*** | Various filters

### 🎯 Basic Usage

<img src="https://apify-uploads-prod.s3.us-east-1.amazonaws.com/sTEmmw6b7t7WJuMwe-issue-mOIyhSd63ebhuaGDl-KrCJPkYHkh-image.png">

<img src="https://apify-uploads-prod.s3.us-east-1.amazonaws.com/sTEmmw6b7t7WJuMwe-issue-mOIyhSd63ebhuaGDl-mQvQbgEjob-image.png">

- 👉 *Probably the easiest and most sensible use is just to paste a URL or KEYWORD, easy ... right ?*
- 👉 *This Examples  for [TheBestShow](https://www.patreon.com/TheBestShow) campaign.*
- 👉 *This Examples is in `JSON` format.*
- 👉 *`QUERY` parameter can accept **string** of **arrays** (bulk requests)*
- 👉 *For more control over what to scrape see **Advanced Usage** (especially the **Example** column) below.*

**Search for campaign based on KEYWORD**

```yaml
{ "query": "square pants" }
```

**Get  campaign info**

```yaml
{ "query": "https://www.patreon.com/TheBestShow" }
```

OR

```yaml
{ "query": "https://www.patreon.com/TheBestShow/about" }
```

OR use `@` sign

```yaml
{ "query": "@TheBestShow" }
```

**Scrape campaign posts**

```yaml
{ "query": "https://www.patreon.com/TheBestShow/posts" }
```

OR

```yaml
{ "query": "@TheBestShow/posts" }
```

**Scrape campaign collection list**

```yaml
{ "query": "https://www.patreon.com/TheBestShow/collections" }
```

OR

```yaml
{ "query": "@TheBestShow/collections" }
```

**Scrape campaign product list**

```yaml
{ "query": "https://www.patreon.com/TheBestShow/shop" }
```

OR

```yaml
{ "query": "@TheBestShow/products" }
```

**Scrape a post**

Copy paste the `post-ID`

```yaml
{ "query": "100277166" }
```

scrape post comments

```yaml
{ "query": "100277166/comments" }
```

**Watch the log to see what the Actor is currently scraping.**

<img src="https://apify-uploads-prod.s3.us-east-1.amazonaws.com/sTEmmw6b7t7WJuMwe-issue-mOIyhSd63ebhuaGDl-OgrYdJ0Efo-image.png">

### 🎯 Advanced Usage

#### Patreon Query Language (PQL)

```html
[ <COMMAND>: | # | @ ] [ <NAME> | <ID> | <KEYWORD> | <URL> ] [ /<SECTION> ]  
```

- 👉 *Not all data points can be accessed using a URL.*
- 👉 *Use `QUERY`  for more control over what to scrape.*
- 👉 *Think of this as a `SHORTCUT`*

<img src="https://apify-uploads-prod.s3.us-east-1.amazonaws.com/sTEmmw6b7t7WJuMwe-issue-mOIyhSd63ebhuaGDl-j1bB8vVZAn-image.png">

#### Possible `Query` Values

| Format | Examples | Description|
|-|-|-|
| **<*KEYWORDS*>** | `Search terms` | ***Search Anything*** |
| `posts:<KEYWORDS>` | `posts:Sponge Bob` | Search for posts |
| `creators:<KEYWORDS>` | `creators:Cat Animations` | Search for creators |
| **@<*CAMPAIGN_ID*>**<br>**@<*CAMPAIGN_NAME*>**  | `@666522` <br> `@TheBestShow` | ***Campaign Data*** |
| `/info` | `@TheBestShow/info` | Campaign info |
| `/socials` | `@TheBestShow/socials` | Campaign & creator social links |
| `/posts`| `@TheBestShow/posts` | Campaign posts |
| `/images`| `@TheBestShow/images` | Campaign image posts |
| `/videos`| `@TheBestShow/videos` | Campaign video posts |
| `/audios`| `@TheBestShow/audios` | Campaign audio posts |
| `/episodes`| `@TheBestShow/podcasts` | Campaign podcasts episodes |
| `/links`| `@TheBestShow/images` | Campaign link posts |
| `/polls`| `@TheBestShow/images` | Campaign polls |
| `/collections`|`@TheBestShow/collections` | Campaign collections |
| `/podcasts`|`@TheBestShow/podcasts` | Campaign podcast collections |
| `/products`|`@TheBestShow/products` | Campaign products (shop) |
| `/chats` | `@TheBestShow/chats` | Campaign chats |
| `/tags` | `@TheBestShow/tags` | Campaign posts tags |
| **user:<*USER_ID*>**| `user:4696495` | ***Creator/User Data*** |
| `/info` | `user:4696495/info` | Creator info |
| **<*POST_ID*>** | `100277166` | ***Post Data*** |
| `/info` | `100277166/info` | Post content|
| `/comments` | `100277166/comments` | Post comments |
| `/related` | `100277166/related` | Related posts |
| **collection:<*COLLECTION_ID*>** | `collection:12345678` | **Collection Data** |
| `/info` | `collection:12345678/info` | Collection info
| `/posts` | `collection:12345678/posts` | Collection post
| **product:<*PRODUCT_ID*>** | `product:12345678` | **Product Data** |
| `/info` | `product:12345678/info` | Product info
| **home:<*SECTION*>** | `home:info` | **Personal Data** |
| `:info` | `home:info` | User info |
| `:updates` | `home:updates` | Feed updates |
| `:notifications` | `home:notifications` | Notifications |
| **https:<*URL*>** | `https://www.patreon.com/...` | ***Start URL*** |
| `/<CAMPAIGN>`| |`@<CAMPAIGN>`
| `/<CAMPAIGN>/shop`| | `@<CAMPAIGN>/products`
| `/<CAMPAIGN>/collections` | | `@<CAMPAIGN>/collections`
| `/posts/title-slug-<POST_ID>`|| `<POST_ID>`

#### Why use a `QUERY` parameter instead of `URL`?

Using `QUERY` instead of `URL` gives you more flexibility and clarity when scraping. While a full URL points to a specific page, a query typically represents a **search term, filter, or dynamic input** used to generate results on a site. Many modern websites—especially those with search or filter functions—construct pages dynamically based on queries, not fixed URLs.

By using `QUERY`, you :

- Focus on **what data you want**, not where it lives.
- Allow the Actor to **build the right URL internally**.
- Enable **batch operations** on multiple queries more easily.
- Support **non-URL-based inputs**, like keywords, IDs, or product names.

In short, `QUERY` is often more intuitive and powerful when you're scraping based on intent rather than specific page addresses.

#### FAQ : \[F]requently \[A] very Wrong or Misunderstood \[Q]ueries

| | QUERY | Description |
|-|-|-|
|❌| `https://www.patreon.com/TheBestShow/info` | This URL does not exists! You probably want to use QUERY: `@TheBestShow/info` or just `@TheBestShow`
|❌| `https://www.patreon.com/TheBestShow:info` | This URL also does not exists! use `@TheBestShow`, easy ... right ?\
| | *`... to be continued ...`*

### 🎯 Input Examples

#### Example #1: Scrape a Post

```yaml
{ "query": ["https://www.patreon.com/posts/post-title-slug-3001122"] }
```

OR

```yaml
{ "query": ["3001122"] } # just input the POST_ID 
```

#### Example #2: Scrape a Post Comments

```yaml
{ "query": ["3001122/comments"] }
```

### 🎯 LOGIN SESSION

You may want to include your login session from your browser. If that's the case, you need to include the cookie named `session_id`. To get the cookie value, follow these steps :

#### Google Chrome

1. Login to patreon.com
2. Open Chrome Developer Tools  `(Ctrl + Shift + I)`
3. Open Application Tab
4. On left panel, go to:  `Storage -> Cookies -> https://www.patreon.com`
5. Find cookie named  `session_id`
6. Copy & Paste

<img src="https://apify-uploads-prod.s3.us-east-1.amazonaws.com/issue/mOIyhSd63ebhuaGDl/feHuvaeCEy7aa9Q6H-image.png">

<img src="https://apify-uploads-prod.s3.us-east-1.amazonaws.com/issue/mOIyhSd63ebhuaGDl/xNjERslp8blLzEaid-image.png">

### 🎯 Output Examples

```yaml
{
    "access_rules": [
        {
            "access_rule_type": "tier",
            "amount_cents": null,
            "currency": "USD",
            "id": "7909551",
            "post_count": 603,
            "type": "access-rule"
        },
        {
            "access_rule_type": "tier",
            "amount_cents": null,
            "currency": "USD",
            "id": "9059915",
            "post_count": 337,
            "type": "access-rule"
        }
    ],
    "audio": {
        "file_name": "AdFree-DraftV1-20221007-TCO-Hillsong1.mp3",
        "id": "171203911",
        "image_urls": null,
        "metadata": {},
        "type": "media"
    },
    "change_visibility_at": null,
    "comment_count": 56,
    "commenter_count": 34,
    "current_user_can_comment": false,
    "current_user_can_delete": false,
    "current_user_can_view": false,
    "has_ti_violation": false,
    "id": "72996515",
    "image": {
        "height": 480,
        "large_url": "https://c10.patreonusercontent.com/4/patreon-media/p/campaign/1508621/d2bfcfd4a278419abad6926b2155d514/eyJoIjozNDksInciOjYyMH0%3D/3?token-time=2145916800&token-hash=b3gTD8SkGyerTsc2f5mkx7NeQhl0lhl7qj_bihrza9I%3D",
        "thumb_square_large_url": "https://c10.patreonusercontent.com/4/patreon-media/p/campaign/1508621/d2bfcfd4a278419abad6926b2155d514/eyJoIjozNDksInciOjYyMH0%3D/3?token-time=2145916800&token-hash=b3gTD8SkGyerTsc2f5mkx7NeQhl0lhl7qj_bihrza9I%3D",
        "thumb_square_url": "https://c10.patreonusercontent.com/4/patreon-media/p/campaign/1508621/d2bfcfd4a278419abad6926b2155d514/eyJoIjozNDksInciOjYyMH0%3D/3?token-time=2145916800&token-hash=b3gTD8SkGyerTsc2f5mkx7NeQhl0lhl7qj_bihrza9I%3D",
        "thumb_url": "https://c10.patreonusercontent.com/4/patreon-media/p/campaign/1508621/d2bfcfd4a278419abad6926b2155d514/eyJoIjozNDksInciOjYyMH0%3D/3?token-time=2145916800&token-hash=b3gTD8SkGyerTsc2f5mkx7NeQhl0lhl7qj_bihrza9I%3D",
        "url": "https://c10.patreonusercontent.com/4/patreon-media/p/campaign/1508621/d2bfcfd4a278419abad6926b2155d514/eyJoIjozNDksInciOjYyMH0%3D/3?token-time=2145916800&token-hash=b3gTD8SkGyerTsc2f5mkx7NeQhl0lhl7qj_bihrza9I%3D",
        "width": 640
    },
    "images": [],
    "insights_last_updated_at": "2022-10-11T05:36:00.659+00:00",
    "is_paid": false,
    "like_count": 188,
    "media": [
        {
            "file_name": "AdFree-DraftV1-20221007-TCO-Hillsong1.mp3",
            "id": "171203911",
            "image_urls": null,
            "metadata": {},
            "type": "media"
        }
    ],
    "meta_image_url": "https://c7.patreon.com/https%3A%2F%2Fwww.patreon.com%2F%2Fpost-teaser-image%2F72996515/selector/%23post-teaser",
    "min_cents_pledged_to_view": null,
    "moderation_status": "not_being_reviewed",
    "native_video_insights": null,
    "patreon_url": "https://www.patreon.com/posts/hillsong-exposed-72996515",
    "pledge_url": "/bePatron?patAmt=5.0&c=1508621",
    "pls_one_liners_by_category": [],
    "poll": null,
    "post_level_suspension_removal_date": null,
    "post_metadata": null,
    "post_type": "audio_file",
    "preview_asset_type": "default",
    "published_at": "2022-10-07T10:08:07.000+00:00",
    "teaser_text": "In the early 2000s a new kind of church appeared in New York City. It wasn't \"regular\" church, it was \"cool\" church. It was a church with ce",
    "ti_checks": [],
    "title": "Hillsong: A MegaChurch Exposed. Ep 1: Welcome Home",
    "type": "post",
    "upgrade_url": "/join/TrueCrimeObsessed/checkout?rid=2334613",
    "url": "https://www.patreon.com/posts/hillsong-exposed-72996515",
    "user_defined_tags": [],
    "video_preview": null,
    "view_count": 467,
    "was_posted_by_campaign_owner": true
}
```

### 🎯 Support

⚡️ Feel free to [reach out](https://console.apify.com/actors/dIClaXanvZ0SZ4ObK/issues) to the developer for any [issues](https://console.apify.com/actors/dIClaXanvZ0SZ4ObK/issues) or suggestions for improvement.

<img src="https://apify-uploads-prod.s3.us-east-1.amazonaws.com/5SxZhwYwpknFk8ek9-cat.gif" width="240">

# Actor input Schema

## `query` (type: `array`):

💡 Query, Search Terms or Start URL<br>See README for more info.

## `example` (type: `string`):

💡 <b>Query Examples:</b> Select one or more examples, then hit <code>START!</code> <p>OR, enter your own queries in the <code>QUERY</code> input.</p>

## `search_mode` (type: `string`):

No description

## `limit` (type: `integer`):

💡 Number of results (per query)

## `types` (type: `array`):

No description

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

No description

## `search` (type: `string`):

💡 Search posts

## `access` (type: `array`):

No description

## `year` (type: `integer`):

No description

## `month` (type: `string`):

💡 Require YEAR parameter

## `tier` (type: `integer`):

No description

## `public` (type: `boolean`):

💡 Public posts only

## `attributes:user` (type: `array`):

No description

## `attributes:campaign` (type: `array`):

No description

## `attributes:post` (type: `array`):

No description

## `attributes:media` (type: `array`):

No description

## `dev_proxy_config` (type: `object`):

💡 <b>Supported protocol:</b><br><br><b>HTTP(S), SOCKS5</b><br><code>{http|socks5}://{user:pass}@{hostname|ip-address}:port</code><br><br><b>Example</b>: <code>socks5://example.com:9000</code>

## `dev_custom_headers` (type: `array`):

💡 Additional HTTP Headers

## `dev_custom_cookies` (type: `array`):

💡 Additional HTTP Cookies

## `dev_transform_fields` (type: `array`):

💡 <b>Transform the resulting output. Select only needed fields.</b><br><br>For nested object use <b>DOT</b>. For example: <pre>address.streetAddress</pre><br>For nested array use <b>NUMBER</b> <i>(index of array element starting from index=0)</i>. For example: <pre>images.0.url</pre>

## `dev_dataset_name` (type: `string`):

💡 <b>Save results into custom named Dataset, use mask to customize dataset name</b><br><br><code>{ACTOR} = actor name<br>{DATE} = date (YYYYMMDD)<br>{TIME} = time (HHMMSS)</code><br><br>This masks can be used to autogenerate Dataset Name.<br><br>example: <i><code>data-{DATE}</code></i><br>Depending on today date the dataset name will be: <code>data-20230603</code><i><br><br>default: <code>data-{ACTOR}-{DATE}-{TIME}</code></i>

## `dev_dataset_clear` (type: `boolean`):

Clear Dataset before insert/update.

## `dev_no_strip` (type: `boolean`):

💡 Keep/Save empty values <i><code>(NULL, FALSE, empty ARRAY, empty OBJECT, empty STRING)</code></i>

## Actor input object example

```json
{
  "query": [
    "Sponge Bob"
  ],
  "limit": 5,
  "dev_custom_cookies": [
    {
      "key": "session_id",
      "value": ""
    }
  ]
}
```

# 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 = {
    "query": [
        "Sponge Bob"
    ],
    "limit": 5,
    "dev_custom_cookies": [
        {
            "key": "session_id",
            "value": ""
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("jupri/patreon").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 = {
    "query": ["Sponge Bob"],
    "limit": 5,
    "dev_custom_cookies": [{
            "key": "session_id",
            "value": "",
        }],
}

# Run the Actor and wait for it to finish
run = client.actor("jupri/patreon").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 '{
  "query": [
    "Sponge Bob"
  ],
  "limit": 5,
  "dev_custom_cookies": [
    {
      "key": "session_id",
      "value": ""
    }
  ]
}' |
apify call jupri/patreon --silent --output-dataset

```

## MCP server setup

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

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/dIClaXanvZ0SZ4ObK/builds/VIrM7c3ixZQw5xc9J/openapi.json
