# Patreon API

> Every Patreon endpoint on Cotlet: inputs, JSON Schema, cURL, Python and Node.js examples and an example response for each call.

Source: https://cotlet.dev/docs/api/patreon

Docs sections: [Get started](https://cotlet.dev/docs.md) · [REST API](https://cotlet.dev/docs/api.md) · [MCP](https://cotlet.dev/docs/mcp.md) · [SDKs & CLI](https://cotlet.dev/docs/sdks.md) · [Integrations](https://cotlet.dev/docs/integrations.md)

13 endpoints for Patreon. Each one is a POST with a JSON body, called with your API key.

- Base URL: `https://cotlet.dev/api/v1/patreon`
- Connects with: Your own Patreon creator account
- Integration page: https://cotlet.dev/integrations/patreon-api-mcp-server

## Endpoints

| Endpoint | Access | Description |
|---|---|---|
| `list_tiers` | read | Your membership tiers with name, description and benefits. |
| `list_members` | read | Members from your Relationship manager with tier, status and join date. |
| `export_members` | read | The Relationship manager CSV with your filters applied, as a download link. |
| `list_posts` | read | Your posts, scheduled ones first, with status, audience and publish date. |
| `get_post` | read | Full post: title, body, tiers with access, status and URL. |
| `list_chats` | read | Conversations in your Patreon Chats with the member and the last message. |
| `create_post` | write | Save a new post as a draft. Nothing is published. |
| `update_post` | write | Change the title, body or audience of a draft or scheduled post. |
| `schedule_post` | write | Set the date and time a draft is published. |
| `publish_post` | write | Publish a draft now. |
| `send_message` | write | Direct message to one current or former paid member, as you. |
| `message_tier` | write | The same direct message to the members of one or more tiers. |
| `update_tier` | write | Change a tier's name, description or benefits. |

## List tiers

`POST https://cotlet.dev/api/v1/patreon/list_tiers`

Access: read.

Returns every tier on your Patreon page. Use the tier_id of each item in the other endpoints. Benefits are the ones shown in the tier editor.

### Parameters

No parameters.

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/patreon/list_tiers \
  -H "Authorization: Bearer $COTLET_API_KEY"
```

**Python**

```python
result = client.call("patreon", "list_tiers")
```

**Node.js**

```js
const result = await cotlet.call('patreon', 'list_tiers');
```

**CLI**

```bash
cotlet call patreon list_tiers
```

### Example response

```json
{
  "tiers": [
    {
      "tier_id": "24019876",
      "name": "Gold",
      "description": "Everything in Supporter plus early episodes.",
      "benefits": [
        "Episodes a week before release",
        "Monthly Q&A"
      ]
    }
  ]
}
```

## List members

`POST https://cotlet.dev/api/v1/patreon/list_members`

Access: read.

Lists members the way the Relationship manager does. Filter by paid or free, active or canceled, tier or join date. Pass next_cursor back as cursor for the next page.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `paid` | enum | no | paid, free or all. Default: all. |
| `status` | enum | no | active, canceled or all. Default: active. |
| `tier_id` | string | no | Only members of this tier. |
| `joined_since` | date | no | Only members who joined on or after this date. |
| `limit` | integer | no | 1 to 100. Default: 50. |
| `cursor` | string | no | Next page cursor from the previous call. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/patreon/list_members \
  -H "Authorization: Bearer $COTLET_API_KEY"
```

**Python**

```python
result = client.call("patreon", "list_members")
```

**Node.js**

```js
const result = await cotlet.call('patreon', 'list_members');
```

**CLI**

```bash
cotlet call patreon list_members
```

### Example response

```json
{
  "members": [
    {
      "member_id": "m_4471920",
      "name": "Maya Fischer",
      "tier": "Gold",
      "status": "active",
      "paid": true,
      "joined_at": "2026-10-08T10:12:00Z"
    }
  ],
  "next_cursor": "eyJvZmZzZXQiOjUwfQ"
}
```

## Export members

`POST https://cotlet.dev/api/v1/patreon/export_members`

Access: read.

Runs the same CSV export as the button in the Relationship manager, with the filters you pass. The file has the columns you chose in the table settings, plus Charge frequency if you offer annual memberships. It reaches no one and changes nothing.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `paid` | enum | no | paid, free or all. Default: all. |
| `status` | enum | no | active, canceled or all. Default: active. |
| `tier_id` | string | no | Only members of this tier. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/patreon/export_members \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"paid":"paid","status":"active"}'
```

**Python**

```python
result = client.call("patreon", "export_members", {"paid":"paid","status":"active"})
```

**Node.js**

```js
const result = await cotlet.call('patreon', 'export_members', {"paid":"paid","status":"active"});
```

**CLI**

```bash
cotlet call patreon export_members --data '{"paid":"paid","status":"active"}'
```

### Example response

```json
{
  "file_url": "https://cotlet.dev/api/v1/files/exports/patreon-members-2026-10-11.csv",
  "rows": 214,
  "filters": {
    "status": "active",
    "tier_id": "24019876"
  }
}
```

## List posts

`POST https://cotlet.dev/api/v1/patreon/list_posts`

Access: read.

Lists your posts. Scheduled posts come first, labeled with their date, as in the Patreon post list. Body is a short preview; get_post returns the full text.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `status` | enum | no | published, draft, scheduled or all. Default: all. |
| `limit` | integer | no | 1 to 50. Default: 20. |
| `cursor` | string | no | Next page cursor from the previous call. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/patreon/list_posts \
  -H "Authorization: Bearer $COTLET_API_KEY"
```

**Python**

```python
result = client.call("patreon", "list_posts")
```

**Node.js**

```js
const result = await cotlet.call('patreon', 'list_posts');
```

**CLI**

```bash
cotlet call patreon list_posts
```

### Example response

```json
{
  "posts": [
    {
      "post_id": "118204553",
      "title": "Episode 12: the full cut",
      "status": "scheduled",
      "publish_at": "2026-10-16T18:00:00+01:00",
      "audience": "paid_tiers",
      "preview": "This week we go behind the scenes..."
    }
  ],
  "next_cursor": null
}
```

## Get post

`POST https://cotlet.dev/api/v1/patreon/get_post`

Access: read.

Returns one post with its full body and the tiers that can see it. Use it before update_post to see what is there now.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `post_id` | string | yes | Post ID from list_posts. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/patreon/get_post \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"post_id":"post_8c41d2"}'
```

**Python**

```python
result = client.call("patreon", "get_post", {"post_id":"post_8c41d2"})
```

**Node.js**

```js
const result = await cotlet.call('patreon', 'get_post', {"post_id":"post_8c41d2"});
```

**CLI**

```bash
cotlet call patreon get_post --data '{"post_id":"post_8c41d2"}'
```

### Example response

```json
{
  "post_id": "118204553",
  "title": "Episode 12: the full cut",
  "body": "This week we go behind the scenes...",
  "status": "scheduled",
  "publish_at": "2026-10-16T18:00:00+01:00",
  "tier_ids": [
    "24019876"
  ],
  "url": "https://www.patreon.com/posts/episode-12-118204553"
}
```

## List chats

`POST https://cotlet.dev/api/v1/patreon/list_chats`

Access: read.

Lists your Chats, most recent first, with the member, the last message and whether you sent it. Set unanswered_only to see what needs a reply.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `unanswered_only` | boolean | no | Skip conversations where you sent the last message. |
| `limit` | integer | no | 1 to 50. Default: 20. |
| `cursor` | string | no | Next page cursor from the previous call. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/patreon/list_chats \
  -H "Authorization: Bearer $COTLET_API_KEY"
```

**Python**

```python
result = client.call("patreon", "list_chats")
```

**Node.js**

```js
const result = await cotlet.call('patreon', 'list_chats');
```

**CLI**

```bash
cotlet call patreon list_chats
```

### Example response

```json
{
  "chats": [
    {
      "member_id": "m_4471920",
      "name": "Maya Fischer",
      "last_message": "Where do I find the Q3 files?",
      "last_from": "member",
      "updated_at": "2026-10-10T16:02:00Z"
    }
  ],
  "next_cursor": null
}
```

## Create post

`POST https://cotlet.dev/api/v1/patreon/create_post`

Access: write.

Creates a draft in your Patreon post list. Nobody sees it until publish_post or schedule_post. create_post runs without asking first: it reaches no one and a draft is removed with one call in Patreon.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `title` | string | yes | Post title. |
| `body` | string | yes | Post text. Links and images by URL. |
| `audience` | enum | no | public, all_members or paid_tiers. Default: all_members. |
| `tier_ids` | string[] | no | Tiers with access when audience is paid_tiers. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/patreon/create_post \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title":"title","body":"body"}'
```

**Python**

```python
result = client.call("patreon", "create_post", {"title":"title","body":"body"})
```

**Node.js**

```js
const result = await cotlet.call('patreon', 'create_post', {"title":"title","body":"body"});
```

**CLI**

```bash
cotlet call patreon create_post --data '{"title":"title","body":"body"}'
```

### Example response

```json
{
  "post_id": "118204553",
  "status": "draft",
  "audience": "paid_tiers",
  "tier_ids": [
    "24019876"
  ],
  "title": "Episode 12: the full cut"
}
```

## Update post

`POST https://cotlet.dev/api/v1/patreon/update_post`

Access: write.

Edits a post that is not published yet, as you would in the post editor. It reaches no one until the post goes out, so it runs without asking first. Published posts are not changed.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `post_id` | string | yes | Post ID from list_posts. |
| `fields` | object | yes | Any of title, body, audience, tier_ids. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/patreon/update_post \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"post_id":"post_8c41d2","fields":"fields"}'
```

**Python**

```python
result = client.call("patreon", "update_post", {"post_id":"post_8c41d2","fields":"fields"})
```

**Node.js**

```js
const result = await cotlet.call('patreon', 'update_post', {"post_id":"post_8c41d2","fields":"fields"});
```

**CLI**

```bash
cotlet call patreon update_post --data '{"post_id":"post_8c41d2","fields":"fields"}'
```

### Example response

```json
{
  "post_id": "118204553",
  "status": "draft",
  "title": "Episode 12: the director's cut"
}
```

## Schedule post

`POST https://cotlet.dev/api/v1/patreon/schedule_post`

Access: write. Confirm: waits for the user's OK before it runs.

Schedules a draft, which then shows at the top of your post list labeled Scheduled. Set notify_members to false to switch off the member notification for this post. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `post_id` | string | yes | Post ID from list_posts. |
| `publish_at` | datetime | yes | ISO 8601 with time zone. |
| `notify_members` | boolean | no | Notify members when the post goes out. Default: true. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/patreon/schedule_post \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"post_id":"118204553","publish_at":"2026-10-16T18:00:00+01:00","notify_members":true}'
```

**Python**

```python
result = client.call("patreon", "schedule_post", {"post_id":"118204553","publish_at":"2026-10-16T18:00:00+01:00","notify_members":True})
```

**Node.js**

```js
const result = await cotlet.call('patreon', 'schedule_post', {"post_id":"118204553","publish_at":"2026-10-16T18:00:00+01:00","notify_members":true});
```

**CLI**

```bash
cotlet call patreon schedule_post --data '{"post_id":"118204553","publish_at":"2026-10-16T18:00:00+01:00","notify_members":true}'
```

### Example response

```json
{
  "post_id": "118204553",
  "status": "scheduled",
  "publish_at": "2026-10-16T18:00:00+01:00",
  "audience": "paid_tiers",
  "tier_ids": [
    "24019876"
  ],
  "url": "https://www.patreon.com/posts/episode-12-118204553"
}
```

## Publish post

`POST https://cotlet.dev/api/v1/patreon/publish_post`

Access: write. Confirm: waits for the user's OK before it runs.

Publishes a draft immediately to its audience. Members are notified unless notify_members is false. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `post_id` | string | yes | Post ID from list_posts. |
| `notify_members` | boolean | no | Notify members when the post goes out. Default: true. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/patreon/publish_post \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"post_id":"post_8c41d2"}'
```

**Python**

```python
result = client.call("patreon", "publish_post", {"post_id":"post_8c41d2"})
```

**Node.js**

```js
const result = await cotlet.call('patreon', 'publish_post', {"post_id":"post_8c41d2"});
```

**CLI**

```bash
cotlet call patreon publish_post --data '{"post_id":"post_8c41d2"}'
```

### Example response

```json
{
  "post_id": "118204553",
  "status": "published",
  "url": "https://www.patreon.com/posts/episode-12-118204553"
}
```

## Send message

`POST https://cotlet.dev/api/v1/patreon/send_message`

Access: write. Confirm: waits for the user's OK before it runs.

Sends a direct message to one member in Chats. Patreon allows direct messages only to current or former paid members, so a free member returns an error. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `member_id` | string | yes | Member ID from list_members or list_chats. |
| `body` | string | yes | Message text. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/patreon/send_message \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"member_id":"m_4471920","body":"Hi Maya, the Q3 files are in the Q3 collection, third post from the top."}'
```

**Python**

```python
result = client.call("patreon", "send_message", {"member_id":"m_4471920","body":"Hi Maya, the Q3 files are in the Q3 collection, third post from the top."})
```

**Node.js**

```js
const result = await cotlet.call('patreon', 'send_message', {"member_id":"m_4471920","body":"Hi Maya, the Q3 files are in the Q3 collection, third post from the top."});
```

**CLI**

```bash
cotlet call patreon send_message --data '{"member_id":"m_4471920","body":"Hi Maya, the Q3 files are in the Q3 collection, third post from the top."}'
```

### Example response

```json
{
  "member_id": "m_4471920",
  "status": "sent",
  "sent_at": "2026-10-11T09:05:00+02:00"
}
```

## Message tier

`POST https://cotlet.dev/api/v1/patreon/message_tier`

Access: write. Confirm: waits for the user's OK before it runs.

Sends one message to the members of the tiers you name, as the Relationship manager does when you filter by tier. Only paid members can be messaged. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `tier_ids` | string[] | yes | Tier IDs from list_tiers. |
| `body` | string | yes | Message text. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/patreon/message_tier \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"tier_ids":["24019876","24019877"],"body":"Your October pack is ready: https://example.com/october-pack. Thanks for being here!"}'
```

**Python**

```python
result = client.call("patreon", "message_tier", {"tier_ids":["24019876","24019877"],"body":"Your October pack is ready: https://example.com/october-pack. Thanks for being here!"})
```

**Node.js**

```js
const result = await cotlet.call('patreon', 'message_tier', {"tier_ids":["24019876","24019877"],"body":"Your October pack is ready: https://example.com/october-pack. Thanks for being here!"});
```

**CLI**

```bash
cotlet call patreon message_tier --data '{"tier_ids":["24019876","24019877"],"body":"Your October pack is ready: https://example.com/october-pack. Thanks for being here!"}'
```

### Example response

```json
{
  "tier_ids": [
    "24019876"
  ],
  "status": "sent",
  "recipients": 214
}
```

## Update tier

`POST https://cotlet.dev/api/v1/patreon/update_tier`

Access: write. Confirm: waits for the user's OK before it runs.

Edits the fields at the top of the tier editor: name, description and benefits. Members see the change on your page. Prices are not changed by this tool. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `tier_id` | string | yes | Tier ID from list_tiers. |
| `fields` | object | yes | Any of name, description, benefits (string[]). |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/patreon/update_tier \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"tier_id":"tier_8c41d2","fields":"fields"}'
```

**Python**

```python
result = client.call("patreon", "update_tier", {"tier_id":"tier_8c41d2","fields":"fields"})
```

**Node.js**

```js
const result = await cotlet.call('patreon', 'update_tier', {"tier_id":"tier_8c41d2","fields":"fields"});
```

**CLI**

```bash
cotlet call patreon update_tier --data '{"tier_id":"tier_8c41d2","fields":"fields"}'
```

### Example response

```json
{
  "tier_id": "24019876",
  "name": "Gold",
  "benefits": [
    "Episodes a week before release",
    "Monthly Q&A",
    "Monthly Q&A call"
  ],
  "status": "updated"
}
```
