# PushPress API and MCP server

> PushPress has a Platform API and an SDK that doubles as a local MCP server, both using an API key from Settings > Security & Access, but they are mostly read-only beyond creating customers and invitations (checked 11 Oct 2026). Booking, check-ins, plan changes and class cancellations are done by staff in Core.

Gym management software for boutique gyms and studios: members, plans and billing, a class calendar, reservations and check-ins in PushPress Core.

## What is the PushPress API?

Cotlet's PushPress API exposes 14 endpoints for your own PushPress account: list members, get member, list classes, get class roster, list plan templates, list no-shows and late cancels, book class reservation, check in member, remove reservation, switch member plan, pause member plan, cancel member plan, message class registrants and cancel class. The list_members endpoint returns people in your gym with their plans and plan status. Each endpoint takes simple JSON inputs like member_id, class_id or from and works both as an MCP tool for agents and as a REST call for scripts.

- **Category:** [Local services & SaaS](https://cotlet.dev/integrations/category/local-services-saas)
- **Endpoints:** 14 (6 read, 8 write)
- **Updated:** 2026-10-11

PushPress has a Platform API and an SDK that doubles as a local MCP server, both using an API key from Settings > Security & Access, but they are mostly read-only beyond creating customers and invitations (checked 11 Oct 2026). Cotlet is a hosted MCP server and REST API for PushPress with 14 endpoints (6 read, 8 write): your AI agent signs in as you and does the work.

## Does PushPress have an official API?

PushPress has a Platform API and an SDK that doubles as a local MCP server, both using an API key from Settings > Security & Access, but they are mostly read-only beyond creating customers and invitations (checked 11 Oct 2026). Booking, check-ins, plan changes and class cancellations are done by staff in Core.

| Task | PushPress official | Cotlet |
|---|---|---|
| Find members and see their plans | Yes: Read-only lists of customers and plan enrollments | Yes |
| See who is booked or checked in for a class | Partly: Read-only lists; Zapier fires a trigger on New Check-In | Yes |
| Book a member into a class | No | Yes |
| Check a member in or remove a reservation | No | Yes |
| Switch a member to another plan | No | Yes |
| Pause or cancel a member plan | No | Yes |
| Message everyone booked in a class, then cancel it | No | Yes |
| Read the No Show / Late Cancel report | No | Yes |

Sources: [PushPress SDK and MCP server (npm)](https://www.npmjs.com/package/@pushpress/pushpress), [PushPress Help: Integrations Hub and API keys](https://help.pushpress.com/en/articles/12631598-how-to-use-pushpress-integrations-hub), [PushPress Help: Zapier triggers and actions](https://help.pushpress.com/en/articles/3516983-core-zapier-triggers-we-send-and-receive), [PushPress Help: Switch Plan](https://help.pushpress.com/en/articles/7908117-core-upgrade-downgrade-member-plan-using-switch-plan-feature)

## For AI agents

```text
PushPress has a Platform API and an SDK that doubles as a local MCP server, both using an API key from Settings > Security & Access, but they are mostly read-only beyond creating customers and invitations (checked 11 Oct 2026). Booking, check-ins, plan changes and class cancellations are done by staff in Core.
Cotlet provides a hosted MCP server and REST API for PushPress: 14 tools (6 read, 8 write).
Access       Request access at https://cotlet.dev/app/signup?app=pushpress; we email the API key.

MCP server   https://cotlet.dev/mcp/v1
REST base    https://cotlet.dev/api/v1/pushpress
Auth         Authorization: Bearer <COTLET_API_KEY>. Listing endpoints and schemas needs no key; calling an endpoint needs one.
Tools        list_members, get_member, list_classes, get_class_roster, list_plan_templates, list_no_shows_late_cancels, book_class_reservation, check_in_member, remove_reservation, switch_member_plan, pause_member_plan, cancel_member_plan, message_class_registrants, cancel_class
Confirm      remove_reservation, switch_member_plan, pause_member_plan, cancel_member_plan, message_class_registrants, cancel_class (by default the user approves each call; the user can switch this off per tool, e.g. for scheduled automations)
Markdown     https://cotlet.dev/integrations/pushpress-api-mcp-server.md

How access works:
1. The user requests access at https://cotlet.dev/app/signup?app=pushpress (PushPress is pre-selected). Each request is reviewed and the API key is sent by email.
2. The user signs in to PushPress once in a browser. An agent cannot do this step.
3. The API key goes into the MCP client or the REST call as a bearer token.

Fits: people who want a hosted PushPress server that someone else maintains, including non-developers.

Policy: Cotlet never stores passwords, never solves CAPTCHAs, never bypasses MFA.
Company: legal details in the Terms of service at https://cotlet.dev/terms. Contact contact@cotlet.dev.
Session: the user signs in to PushPress in a browser; Cotlet keeps only the session, AES-256 encrypted, revocable in the dashboard at any time.
Terms: the user stays responsible for following PushPress's terms; Cotlet is not affiliated with PushPress.
```

## What can an AI agent do in PushPress?

Cotlet is best for gym and studio owners and managers who want their AI agent to handle class cancellations, plan changes, check-ins and no-show reviews in PushPress without running or fixing a server.

- **[Cancel a class and notify booked members](https://cotlet.dev/integrations/pushpress-api-mcp-server/cancel-class-and-notify-members)**: "Saturday's 9:00 class is cancelled because Dana is sick. Text everyone booked, tell me who is on the waitlist, then cancel the class." → `list_classes`, `get_class_roster`, `message_class_registrants`, `cancel_class`
- **[Upgrade or downgrade a member plan](https://cotlet.dev/integrations/pushpress-api-mcp-server/upgrade-or-downgrade-member-plan)**: "Jordan wants to go from 3x Week to Unlimited starting at his next bill date. Waive the setup fee." → `list_members`, `get_member`, `list_plan_templates`, `switch_member_plan`
- **[Review no-shows and late cancels](https://cotlet.dev/integrations/pushpress-api-mcp-server/review-no-shows-and-late-cancels)** (runs: weekly): "Every Tuesday, go through last week's no-shows and late cancels. Fee from the second no-show, a warning for the first late cancel. Do not charge anyone." → `list_no_shows_late_cancels`, `get_member`
- **[Pause a membership](https://cotlet.dev/integrations/pushpress-api-mcp-server/pause-membership)**: "Pause Alex for a month from Monday while she recovers from knee surgery. We charge the usual hold fee." → `list_members`, `get_member`, `pause_member_plan`
- **Check in a class from the roster**: "Check in everyone who is reserved for the 7:00 class and already here." → `list_classes`, `get_class_roster`, `check_in_member`

## Can PushPress automations run on a schedule in n8n, Make or Zapier?

Yes. Cotlet does not replace your automation platform: it gives it a PushPress connection it does not have, with the same API key as your agent. Write actions ask for your OK by default; switch that off in your dashboard for the tools you choose, for example to review no-shows and late cancels, and the schedule runs on its own. Cotlet runs in the cloud, so it keeps going while your computer is off.

| Where | How to connect | How to schedule |
|---|---|---|
| Your AI agent | Add https://cotlet.dev/mcp/v1 with your API key. | A scheduled agent run, for example a Claude Code routine. |
| n8n | MCP Client node with https://cotlet.dev/mcp/v1, or an HTTP Request node to https://cotlet.dev/api/v1/pushpress/{tool}. | Schedule Trigger node. |
| Make | HTTP module: POST https://cotlet.dev/api/v1/pushpress/{tool} with an Authorization: Bearer header and a JSON body. | Scenario schedule. |
| Zapier | Webhooks by Zapier: POST https://cotlet.dev/api/v1/pushpress/{tool} with the same header and body. | Schedule by Zapier trigger. |
| Your own script | POST https://cotlet.dev/api/v1/pushpress/{tool} with your API key. | cron or GitHub Actions. |

## Tools

**For AI agents:** Every endpoint and its schema is public. The 14 endpoints on this page, with parameters and example responses, can be listed without an account. Calling one returns 403 until the account has an API key with access to PushPress.

### list_members

People in your gym with their plans and plan status. Access: read. REST: `POST /api/v1/pushpress/list_members`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `search` | string | no | Name or email. |
| `plan_status` | enum | no | active, alert, pending_active, pending_cancel, cancelled, paused or completed. |
| `limit` | integer | no | 1 to 100. Default: 50. |
| `cursor` | string | no | Next page cursor from the previous call. |

Lists people in Core with the status of each plan: Active, Alert, Pending Active, Pending Cancel, Cancelled, Paused or Completed. Alert means a billing issue; class reservations are restricted for that plan. Pages hold up to 100 people; pass next_cursor back as cursor for the next page.

Example response:

```json
{
  "members": [
    {
      "member_id": "usr_8f2k41",
      "name": "Jordan Reyes",
      "plans": [
        {
          "plan_id": "pln_30917",
          "name": "3x Week",
          "status": "active",
          "next_bill_date": "2026-11-01"
        }
      ]
    },
    {
      "member_id": "usr_2c77d9",
      "name": "Alex Kim",
      "plans": [
        {
          "plan_id": "pln_30455",
          "name": "Unlimited",
          "status": "alert",
          "next_bill_date": "2026-10-15"
        }
      ]
    }
  ],
  "next_cursor": null
}
```

### get_member

Profile, plans with status and next bill date, and recent class activity. Access: read. REST: `POST /api/v1/pushpress/get_member`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `member_id` | string | yes | Member ID from list_members. |

Returns one profile with contact details, every plan with its status, next bill date and the Plan ID other tools need, and recent reservations and check-ins. Call it before switching, pausing or cancelling a plan.

Example response:

```json
{
  "member_id": "usr_8f2k41",
  "name": "Jordan Reyes",
  "email": "jordan@example.com",
  "plans": [
    {
      "plan_id": "pln_30917",
      "name": "3x Week",
      "status": "active",
      "recurring": true,
      "next_bill_date": "2026-11-01"
    }
  ],
  "recent_activity": [
    {
      "class_id": "cls_5101",
      "class_name": "CrossFit 7:00",
      "status": "checked_in",
      "date": "2026-10-09"
    }
  ]
}
```

### list_classes

Classes on the calendar for a date range, with coach and reservation counts. Access: read. REST: `POST /api/v1/pushpress/list_classes`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `from` | date | yes | First day. |
| `to` | date | no | Last day. Default: same as from. |

Lists classes on the calendar between two dates, in start order. Each item has the Class ID other tools need, the coach and how many members are reserved or waitlisted. Cancelled classes are not returned.

Example response:

```json
{
  "classes": [
    {
      "class_id": "cls_5101",
      "name": "CrossFit 7:00",
      "starts_at": "2026-10-12T07:00:00-04:00",
      "coach": "Dana",
      "reserved": 11,
      "waitlist": 0
    },
    {
      "class_id": "cls_5120",
      "name": "CrossFit 9:00",
      "starts_at": "2026-10-17T09:00:00-04:00",
      "coach": "Dana",
      "reserved": 3,
      "waitlist": 1
    }
  ]
}
```

### get_class_roster

Members of one class grouped by status. Access: read. REST: `POST /api/v1/pushpress/get_class_roster`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `class_id` | string | yes | Class ID from list_classes. |

Returns everyone on one class card with the same statuses Core shows: Checked In, Reserved, Waitlist, Late Cancel and No Show. A Waitlist member moves to Reserved if a spot opens.

Example response:

```json
{
  "class_id": "cls_5120",
  "name": "CrossFit 9:00",
  "members": [
    {
      "member_id": "usr_8f2k41",
      "name": "Jordan Reyes",
      "status": "reserved"
    },
    {
      "member_id": "usr_2c77d9",
      "name": "Alex Kim",
      "status": "reserved"
    },
    {
      "member_id": "usr_91ab03",
      "name": "Sam Ortiz",
      "status": "reserved"
    },
    {
      "member_id": "usr_44de18",
      "name": "Priya Nair",
      "status": "waitlist"
    }
  ]
}
```

### list_plan_templates

Plans you sell, with price and whether they are recurring. Access: read. REST: `POST /api/v1/pushpress/list_plan_templates`.

No parameters.

Lists the plans you can put a member on, with price and whether each is recurring. Use the template ID as new_plan_template_id in switch_member_plan, which works only with recurring plans.

Example response:

```json
{
  "plan_templates": [
    {
      "template_id": "tpl_3x",
      "name": "3x Week",
      "recurring": true,
      "price": "149.00 USD / month"
    },
    {
      "template_id": "tpl_unlimited",
      "name": "Unlimited",
      "recurring": true,
      "price": "189.00 USD / month"
    }
  ]
}
```

### list_no_shows_late_cancels

Rows of the No Show / Late Cancel report for a date range. Access: read. REST: `POST /api/v1/pushpress/list_no_shows_late_cancels`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `from` | date | yes | First day. |
| `to` | date | yes | Last day. |
| `type` | enum | no | no_show, late_cancel or all. Default: all. |

Returns the members who missed a class (No Show) or cancelled inside the late cancel window (Late Cancel). PushPress updates the report within 24 to 48 hours after check-ins or deletions, so recent classes may be incomplete. Fees are not charged automatically.

Example response:

```json
{
  "rows": [
    {
      "member_id": "usr_91ab03",
      "name": "Sam Ortiz",
      "class_name": "CrossFit 7:00",
      "date": "2026-10-07",
      "type": "no_show"
    },
    {
      "member_id": "usr_2c77d9",
      "name": "Alex Kim",
      "class_name": "CrossFit 9:00",
      "date": "2026-10-08",
      "type": "late_cancel"
    }
  ]
}
```

### book_class_reservation

Reserve a spot in a class for a member. Access: write. REST: `POST /api/v1/pushpress/book_class_reservation`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `class_id` | string | yes | Class ID from list_classes. |
| `member_id` | string | yes | Member ID from list_members. |

Adds a member to a class from the class view in Core. Access rules apply: a plan that does not allow the class blocks the booking. It reaches no one else and remove_reservation undoes it, so it runs without asking.

Example response:

```json
{
  "class_id": "cls_5120",
  "member_id": "usr_8f2k41",
  "status": "reserved"
}
```

### check_in_member

Check a member into a class, with or without a reservation. Access: write. REST: `POST /api/v1/pushpress/check_in_member`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `class_id` | string | yes | Class ID from list_classes. |
| `member_id` | string | yes | Member ID from list_members. |
| `override` | boolean | no | Check in even when the member's plan does not allow the class. Default: false. |

Checks a Reserved member in, or adds a walk-in who has no reservation. It enforces the same access rules as a direct check-in. With override set to true it checks the member in anyway, as staff can in the Control Panel; an override does not charge the member. It reaches no one else and remove_reservation can undo the entry, so it runs without asking.

Example response:

```json
{
  "class_id": "cls_5101",
  "member_id": "usr_8f2k41",
  "status": "checked_in"
}
```

### remove_reservation

Remove a member's reservation or check-in from a class. Access: write, asks the user first. REST: `POST /api/v1/pushpress/remove_reservation`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `class_id` | string | yes | Class ID from list_classes. |
| `member_id` | string | yes | Member ID from list_members. |

Removes the entry, the same as Remove Reservation or Remove Check-In in Core. PushPress states that removing a reservation does not affect the member's plan or billing. The member loses the spot. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "class_id": "cls_5120",
  "member_id": "usr_91ab03",
  "status": "removed"
}
```

### switch_member_plan

Move a member from one recurring plan to another, now or at the next bill date. Access: write, asks the user first. REST: `POST /api/v1/pushpress/switch_member_plan`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `member_id` | string | yes | Member ID from list_members. |
| `current_plan_id` | string | yes | Plan ID from get_member. |
| `new_plan_template_id` | string | yes | Template ID from list_plan_templates. |
| `when` | enum | yes | now or next_bill_date. |
| `waive_setup_fee` | boolean | no | Set the setup fee to 0. Default: false. |

Runs Switch Plan from the member profile. With now, the current plan ends at once and prorated fees go on the first bill of the new plan. With next_bill_date, the current plan shows as pending cancel and the new one as pending active. Works only for recurring plans. PushPress emails the admin and the member. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "member_id": "usr_8f2k41",
  "current_plan": {
    "plan_id": "pln_30917",
    "name": "3x Week",
    "status": "pending_cancel",
    "ends_on": "2026-11-01"
  },
  "new_plan": {
    "name": "Unlimited",
    "status": "pending_active",
    "starts_on": "2026-11-01",
    "setup_fee": "0.00 USD"
  },
  "confirmation_email": "sent to member and admin"
}
```

### pause_member_plan

Pause a member's plan and its billing. Access: write, asks the user first. REST: `POST /api/v1/pushpress/pause_member_plan`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `member_id` | string | yes | Member ID from list_members. |
| `plan_id` | string | yes | Plan ID from get_member (the member's current plan). |
| `pause_from` | date | yes | First day of the pause. |
| `resume_on` | date | no | Day the plan resumes. Empty means indefinite. |

Runs Pause Plan from the member profile. Billing stops while the status is Paused. Leave resume_on empty for an indefinite pause. On resume, unused days from the pause date to the Paid Until Date are credited and the next bill date moves out by that many days. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "member_id": "usr_2c77d9",
  "plan_id": "pln_30455",
  "status": "paused",
  "paused_from": "2026-10-12",
  "resumes_on": "2026-11-12"
}
```

### cancel_member_plan

Cancel a member's plan now or on a future date. Access: write, asks the user first. REST: `POST /api/v1/pushpress/cancel_member_plan`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `member_id` | string | yes | Member ID from list_members. |
| `plan_id` | string | yes | Plan ID from get_member (the member's current plan). |
| `cancel_on` | date | no | Cancel date. Default: today. |

Runs Cancel Plan from the member profile. A date of today sets the status to Cancelled and the member loses access at once. A future date sets Pending Cancel, and the member keeps full access until that date has passed. Setting the date one day before the next bill date helps avoid an extra charge. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "member_id": "usr_8f2k41",
  "plan_id": "pln_30917",
  "status": "pending_cancel",
  "cancel_on": "2026-10-31"
}
```

### message_class_registrants

Email or text the members registered in a class. Access: write, asks the user first. REST: `POST /api/v1/pushpress/message_class_registrants`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `class_id` | string | yes | Class ID from list_classes. |
| `channel` | enum | yes | email, sms or both. |
| `subject` | string | no | Email subject. Used for email and both. |
| `body` | string | yes | Message text. |

Runs Mass Email Registrants from the class menu. It reaches the members currently registered in the class, by email, text or both. Core sends these one class at a time. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "class_id": "cls_5120",
  "channel": "sms",
  "recipients": 4,
  "status": "sent"
}
```

### cancel_class

Cancel one class, or this and future classes in its series. Access: write, asks the user first. REST: `POST /api/v1/pushpress/cancel_class`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `class_id` | string | yes | Class ID from list_classes. |
| `scope` | enum | yes | this_class, this_and_future_weekday or this_and_future_series. |

Removes the class from the calendar. PushPress sends no notification, so call message_class_registrants first. Scope is this class only, this class and all future classes on that weekday, or this class and all future classes in the series. Members who were not checked in get their class credits back. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "class_id": "cls_5120",
  "scope": "this_class",
  "status": "cancelled",
  "reservations_released": 3,
  "members_notified": false
}
```

## How do I connect PushPress to Claude Code, Codex or Cursor?

Connecting PushPress takes three steps: request access, sign in to PushPress once, then add one MCP server or call the REST API with the same key.

### Connect PushPress to your agent.

1. **Create an account** Sign up and add PushPress in the console. Your API key is there too.

2. **Sign in to PushPress once** Open the connect page from the console and sign in to PushPress the way you always do. We keep the session, never your password, and you can revoke it anytime.

3. **Add Cotlet to your agent** Paste the snippet for your client. The same server and key serve every app you connect, so you do this once.

   Claude Code:

```
claude mcp add --transport http cotlet \
  https://cotlet.dev/mcp/v1 \
  --header "Authorization: Bearer $COTLET_API_KEY"
```

   Cursor:

```
{
  "mcpServers": {
    "cotlet": {
      "url": "https://cotlet.dev/mcp/v1",
      "headers": {
        "Authorization": "Bearer ${COTLET_API_KEY}"
      }
    }
  }
}
```

   Codex:

```
# ~/.codex/config.toml
[mcp_servers.cotlet]
url = "https://cotlet.dev/mcp/v1"
bearer_token_env_var = "COTLET_API_KEY"
```

4. **Ask your agent** Ask in plain words. Your agent finds the PushPress tools on the server and calls them for you; anything that reaches other people waits for your OK unless you switch that off for a tool.

```
Saturday's 9:00 class is cancelled because Dana is sick. Text everyone booked, tell me who is on the waitlist, then cancel the class.
```

### Call PushPress from your scripts.

1. **Export your API key** Your scripts use the same API key as your agent. Keep it in an environment variable, never in your code.

```
export COTLET_API_KEY="cotlet_..."
```

2. **Call a tool** Every tool is a POST endpoint at /api/v1/pushpress/{tool}. Send its parameters as JSON, exactly as listed in the endpoints above.

```
curl https://cotlet.dev/api/v1/pushpress/switch_member_plan \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"member_id":"usr_8f2k41","current_plan_id":"pln_30917","new_plan_template_id":"tpl_unlimited","when":"next_bill_date","waive_setup_fee":true}'
```

3. **Read the result** You get plain JSON back, ready for your script. A failed call costs nothing.

```
{
  "member_id": "usr_8f2k41",
  "current_plan": {
    "plan_id": "pln_30917",
    "name": "3x Week",
    "status": "pending_cancel",
    "ends_on": "2026-11-01"
  },
  "new_plan": {
    "name": "Unlimited",
    "status": "pending_active",
    "starts_on": "2026-11-01",
    "setup_fee": "0.00 USD"
  },
  "confirmation_email": "sent to member and admin"
}
```

## Why use Cotlet for PushPress?

**Built for agents**

- One MCP server for every app you connect.
- The same tools as a REST API for scripts and cron jobs.
- Works with Claude Code, Codex and Cursor.

**Your login stays yours**

- You sign in to PushPress yourself. We keep only the session, encrypted with AES-256.
- The model never sees a login.
- No stored passwords, no CAPTCHA solving, no MFA bypass.

**You stay in control**

- Pick read only, or read and write.
- Anything that reaches other people waits for your OK, unless you switch it off per tool.
- Revoke access in one click.

**Kept working for you**

- We test every integration daily.
- When PushPress changes, the tool pauses until we fix it.
- Failed calls cost nothing.

## Is there a PushPress MCP server on GitHub?

PushPress ships its TypeScript SDK as a local MCP server, but it wraps the same narrow Platform API, so booking, check-ins and plan changes stay out of reach. Zapier covers two actions (Create a Person, Find Person) and five triggers. Cotlet works in Core itself, where staff do these jobs by hand today.

|  | PushPress SDK MCP | Cotlet |
|---|---|---|
| Setup | Create an API key in Core, run the SDK locally, add it to each MCP client | Request access, sign in to PushPress once, add one MCP server or API key |
| What it can do | Mostly reads, plus creating customers and invitations | Book, check in, remove reservations, switch, pause and cancel plans, message and cancel classes |
| When PushPress changes | Maintained by PushPress for the API surface it covers | Our team tests it daily and fixes it for you; failed calls are free |
| Your PushPress session | An API key in a file on your computer | Session encrypted in an EU vault, limited to the actions you allow, revoked in one click |
| Upkeep | You update and run it yourself | Nothing to host or update |
| Where it runs | Your computer, while it is on | Hosted: Claude Code, Codex, Cursor, n8n and scripts, also on a schedule |
| Price | Free | Free 7-day trial with 5,000 credits, then credits per call |

### Which one fits you

**Pick Cotlet if**

- you are not a developer, or you do not want to maintain a server
- you need it to keep working when PushPress changes, without checking it yourself
- your agent or a script should run it on a schedule, also while your computer is off

**Pick an open-source server if**

- you are comfortable installing, updating and fixing it yourself
- you want the session to stay on your own computer
- you only need it now and then, from one MCP client

## How much does the PushPress API cost?

Free 7-day trial with 5,000 credits, no card needed. After that, the PushPress API comes with the Cotlet plan, from $29 a month for 3,000 credits, with no limit on apps. Each month's credits stay valid for 3 months, so unused credits add up.

| Size | Price | Credits / month | Per credit |
|---|---|---|---|
| Solo | $29/mo | 3,000 | about $0.0097 |
| Pro | $99/mo | 12,000 | about $0.0083 |
| Agency | $299/mo | 40,000 | $0.0075 |

Each successful call uses credits for the work it takes; failed calls and timeouts cost nothing. A hard spend cap is on by default. Authenticate with the `Authorization: Bearer` header. [See full pricing](https://cotlet.dev/pricing)

## How Cotlet holds your access

Cotlet hosts MCP servers and REST APIs for apps with no usable API. Your agent works in your own PushPress account.

- **Company details:** The legal name, address and registration numbers of the company behind Cotlet are in the Terms of service. [Terms](https://cotlet.dev/terms)
- **Your session:** You sign in to PushPress yourself, in your browser. We keep only the session, never your password: encrypted with AES-256 in an EU vault, isolated to your account and used only when your agent calls a PushPress tool you allowed. When it expires, your agent gives you a link to sign in again. [Security](https://cotlet.dev/security)
- **Revoking access:** Disconnect PushPress in your dashboard: the session is deleted and access ends at once. Actions that reach other people wait for your OK unless you switch that off per tool.
- **What we never do:** Store passwords, solve CAPTCHAs or bypass MFA.
- **PushPress's terms:** You use your own PushPress account and stay responsible for following PushPress's terms. Cotlet is independent and not affiliated with PushPress. [Terms](https://cotlet.dev/terms)
- **Contact:** Questions about the company, security or an app: [contact@cotlet.dev](mailto:contact@cotlet.dev)

## Frequently asked questions

**How do I get access?**

Request access and pick PushPress. Cotlet reviews each request and emails you your API key.

**Do I need to be technical?**

No. You sign in to PushPress once in your browser and paste one command into your agent, or one URL into n8n. Your agent can walk you through it. There is no server to install, update or fix.

**Is a hosted server safe? My PushPress session would leave my computer.**

Cotlet keeps your PushPress session encrypted with AES-256 in an EU vault, isolated to your account and used only for the tools you allow: read only, or read and write. The AI model never sees it, and you revoke it in one click. A local server keeps the same session in a file on your computer, readable by any program you run, and needs a fresh sign-in whenever it expires.

**Do I need an API key or a certain PushPress plan?**

No. Cotlet works in your own Core staff account and does not use the Platform API key from Settings > Security & Access. Plan changes and the No Show / Late Cancel report are admin tasks in Core, so use an admin account for them.

**Can it charge a no-show or late cancel fee?**

No. PushPress does not charge no-show or late cancel fees automatically, and these tools do not either. list_no_shows_late_cancels only reads the report, so you or your agent can decide whom to follow up with.

**Can my agent post or send messages in PushPress without asking me?**

No. Every call to remove_reservation, switch_member_plan, pause_member_plan, cancel_member_plan, message_class_registrants or cancel_class waits for your OK by default. For scheduled automations you can switch confirmation off per tool in your dashboard, for example only for approvals. book_class_reservation, check_in_member runs without asking, because it sends nothing to anyone and one call undoes it.

**Can I use the PushPress API in n8n?**

Yes. Add https://cotlet.dev/mcp/v1 with your API key in n8n's MCP Client node, or call https://cotlet.dev/api/v1/pushpress/{tool} from the HTTP Request node.
