# Meetup API and MCP server

> Meetup has a GraphQL API, but only members with an active Meetup Pro subscription can get access, and it stops working when Pro lapses (checked 11 Oct 2026). Even with Pro it cannot message members, copy events or manage attendees.

Platform for local and online groups: organizers schedule events, members RSVP and show up.

## What is the Meetup API?

Cotlet's Meetup API exposes 14 endpoints for your own Meetup account: list groups, list events, get event, list attendees, list members, create event, copy event, update event, announce event, update attendee, mark attendance, message attendees, message members and cancel event. The list_groups endpoint returns groups you organize or co-organize, with member count and your role. Each endpoint takes simple JSON inputs like event_id, group_urlname or status and works both as an MCP tool for agents and as a REST call for scripts.

- **Category:** [Creators & communities](https://cotlet.dev/integrations/category/creators-communities)
- **Endpoints:** 14 (5 read, 9 write)
- **Updated:** 2026-10-11

Meetup has a GraphQL API, but only members with an active Meetup Pro subscription can get access, and it stops working when Pro lapses (checked 11 Oct 2026). Cotlet is a hosted MCP server and REST API for Meetup with 14 endpoints (5 read, 9 write): your AI agent signs in as you and does the work.

## Does Meetup have an official API?

Meetup has a GraphQL API, but only members with an active Meetup Pro subscription can get access, and it stops working when Pro lapses (checked 11 Oct 2026). Even with Pro it cannot message members, copy events or manage attendees.

| Task | Meetup official | Cotlet |
|---|---|---|
| Create and edit events | Partly: Pro only | Yes |
| Copy a past event | No | Yes |
| Announce an event to members | Partly: Pro only | Yes |
| List RSVPs and the waitlist | Partly: Pro only, read-only | Yes |
| Add, remove or move attendees off the waitlist | No | Yes |
| Mark check-ins and no-shows | No | Yes |
| Message event attendees | No | Yes |
| Message group members | No | Yes |

Sources: [Meetup Help: How can I get access to the API?](https://help.meetup.com/hc/en-us/articles/41453576628749), [Meetup Help: API access when Pro expires](https://help.meetup.com/hc/en-us/articles/41467209211917-What-happens-to-my-API-access-when-my-Meetup-Pro-subscription-expires), [Meetup API guide (GraphQL)](https://www.meetup.com/api/guide/), [Meetup Pro pricing](https://help.meetup.com/hc/en-us/articles/39428296529421-Meetup-Pro-pricing-and-trial)

## For AI agents

```text
Meetup has a GraphQL API, but only members with an active Meetup Pro subscription can get access, and it stops working when Pro lapses (checked 11 Oct 2026). Even with Pro it cannot message members, copy events or manage attendees.
Cotlet provides a hosted MCP server and REST API for Meetup: 14 tools (5 read, 9 write).
Access       Request access at https://cotlet.dev/app/signup?app=meetup; we email the API key.

MCP server   https://cotlet.dev/mcp/v1
REST base    https://cotlet.dev/api/v1/meetup
Auth         Authorization: Bearer <COTLET_API_KEY>. Listing endpoints and schemas needs no key; calling an endpoint needs one.
Tools        list_groups, list_events, get_event, list_attendees, list_members, create_event, copy_event, update_event, announce_event, update_attendee, mark_attendance, message_attendees, message_members, cancel_event
Confirm      create_event, copy_event, update_event, announce_event, update_attendee, message_attendees, message_members, cancel_event (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/meetup-api-mcp-server.md

How access works:
1. The user requests access at https://cotlet.dev/app/signup?app=meetup (Meetup is pre-selected). Each request is reviewed and the API key is sent by email.
2. The user signs in to Meetup 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 Meetup 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 Meetup 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 Meetup's terms; Cotlet is not affiliated with Meetup.
```

## What can an AI agent do in Meetup?

Cotlet is best for Meetup organizers who run recurring events and want their AI agent to copy events, handle the waitlist and message attendees without running or fixing a server.

- **[Create a series of events from an agenda](https://cotlet.dev/integrations/meetup-api-mcp-server/create-events-from-agenda)**: "Here are the talks for the next six Tuesdays. Create one Meetup event per talk, same venue and limit as last Python Night, keep them as drafts and show me the list." → `list_events`, `get_event`, `create_event`, `announce_event`
- **Copy a recurring event** (runs: monthly): "Copy last month's Python Night to the second Thursday of November, 19:00, and announce it." → `list_events`, `copy_event`, `announce_event`
- **Move people off the waitlist** (runs: daily): "Who is on the waitlist for Saturday's hike? Move the first three to going." → `list_attendees`, `update_attendee`
- **[Tell attendees about a last-minute change](https://cotlet.dev/integrations/meetup-api-mcp-server/message-event-attendees)**: "Tonight's Python Night moved to room 204 and starts at 19:30. Update the event and message everyone going." → `list_events`, `get_event`, `update_event`, `message_attendees`
- **[Mark no-shows after an event](https://cotlet.dev/integrations/meetup-api-mcp-server/mark-no-shows)**: "The workshop ended an hour ago. Mark everyone who was not checked in as a no-show, except Ana and Tom, who told me they were sick." → `list_events`, `list_attendees`, `mark_attendance`

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

Yes. Cotlet does not replace your automation platform: it gives it a Meetup 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 copy a recurring event, 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/meetup/{tool}. | Schedule Trigger node. |
| Make | HTTP module: POST https://cotlet.dev/api/v1/meetup/{tool} with an Authorization: Bearer header and a JSON body. | Scenario schedule. |
| Zapier | Webhooks by Zapier: POST https://cotlet.dev/api/v1/meetup/{tool} with the same header and body. | Schedule by Zapier trigger. |
| Your own script | POST https://cotlet.dev/api/v1/meetup/{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 Meetup.

### list_groups

Groups you organize or co-organize, with member count and your role. Access: read. REST: `POST /api/v1/meetup/list_groups`.

No parameters.

Returns every group where you are organizer or co-organizer. Use group_urlname from each item as the group parameter of the other tools.

Example response:

```json
{
  "groups": [
    {
      "group_urlname": "tech-founders-berlin",
      "name": "Tech Founders Berlin",
      "role": "organizer",
      "members": 2140
    }
  ]
}
```

### list_events

Events of a group with date, RSVP counts, attendee limit and status. Access: read. REST: `POST /api/v1/meetup/list_events`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `group_urlname` | string | yes | Group URL name, e.g. tech-founders-berlin. |
| `status` | enum | no | upcoming, past, draft or cancelled. Default: upcoming. |
| `limit` | integer | no | 1 to 50. Default: 20. |
| `cursor` | string | no | Next page cursor from the previous call. |

Lists events of one group, soonest first for upcoming and newest first for past. Each item has the going and waitlist counts. get_event returns the full text.

Example response:

```json
{
  "events": [
    {
      "event_id": "311204587",
      "title": "Python Night #23",
      "start_time": "2026-10-08T19:00:00+02:00",
      "status": "past",
      "going": 38,
      "waitlist": 0,
      "attendee_limit": 40
    }
  ],
  "next_cursor": null
}
```

### get_event

Full event: title, description, time, venue or online link, hosts, fee and settings. Access: read. REST: `POST /api/v1/meetup/get_event`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |

Returns one event with its full description, venue or online link, hosts and settings such as the attendee limit. Use it before copy_event or update_event.

Example response:

```json
{
  "event_id": "311204587",
  "title": "Python Night #23",
  "description": "Lightning talks and pizza.",
  "start_time": "2026-10-08T19:00:00+02:00",
  "duration_minutes": 120,
  "venue": {
    "name": "Co-Work Mitte",
    "address": "Torstr. 1",
    "city": "Berlin"
  },
  "attendee_limit": 40,
  "hosts": [
    "Dana K."
  ]
}
```

### list_attendees

RSVPs of an event with guests, answers and check-in status. Access: read. REST: `POST /api/v1/meetup/list_attendees`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |
| `status` | enum | no | going, waitlist, not_going, checked_in, no_show or all. Default: going. |
| `cursor` | string | no | Next page cursor from the previous call. |

Returns the RSVPs of one event with the guests each member brings, answers to your event questions and check-in status. Filter by status to see the waitlist or the no-shows.

Example response:

```json
{
  "attendees": [
    {
      "member_id": "402118",
      "name": "Ana L.",
      "status": "going",
      "guests": 1,
      "checked_in": false
    }
  ],
  "next_cursor": null
}
```

### list_members

Members of your group with join date and role. Access: read. REST: `POST /api/v1/meetup/list_members`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `group_urlname` | string | yes | Group URL name, e.g. tech-founders-berlin. |
| `joined_since` | date | no | Only members who joined on or after this date. |
| `limit` | integer | no | 1 to 200. Default: 100. |
| `cursor` | string | no | Next page cursor from the previous call. |

Lists members of one group, newest first. Filter by join date to find new members. Pages hold up to 200 members; pass next_cursor back as cursor.

Example response:

```json
{
  "members": [
    {
      "member_id": "402118",
      "name": "Ana L.",
      "role": "member",
      "joined_at": "2026-10-01T18:21:00Z"
    }
  ],
  "next_cursor": "eyJvZmZzZXQiOjEwMH0"
}
```

### create_event

New event as a draft, or published without an announcement. Access: write, asks the user first. REST: `POST /api/v1/meetup/create_event`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `group_urlname` | string | yes | Group URL name, e.g. tech-founders-berlin. |
| `title` | string | yes | Under 80 characters. |
| `start_time` | datetime | yes | ISO 8601 with time zone. |
| `duration_minutes` | integer | no | Default: 120. |
| `description` | string | no | Event description, Markdown. |
| `venue` | object | no | name, address and city, or online_url for an online event. |
| `attendee_limit` | integer | no | Turns on the waitlist when reached. |
| `publish` | boolean | no | Publish now or keep as draft. Default: false. |

Creates an event in your group. It is saved as a draft unless publish is true. A published event is visible to everyone, but members are told only when you call announce_event. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "event_id": "311990021",
  "status": "draft",
  "title": "Intro to SQL",
  "start_time": "2026-11-03T19:00:00+01:00"
}
```

### copy_event

Copy a past event to a new date, keeping its description, venue and settings. Access: write, asks the user first. REST: `POST /api/v1/meetup/copy_event`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |
| `start_time` | datetime | yes | New start, ISO 8601 with time zone. |
| `title` | string | no | New title. Default: the old one. |
| `publish` | boolean | no | Publish now or keep as draft. Default: false. |

Creates a new event from an existing one with the same description, venue and settings, at a new start time. It is a draft unless publish is true. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "event_id": "311988140",
  "status": "draft",
  "announced": false,
  "start_time": "2026-11-12T19:00:00+01:00",
  "url": "https://www.meetup.com/yourgroup/events/311988140/"
}
```

### update_event

Change the title, time, description, venue or attendee limit of an upcoming event. Access: write, asks the user first. REST: `POST /api/v1/meetup/update_event`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |
| `fields` | object | yes | Any of title, start_time, duration_minutes, description, venue, attendee_limit. |

Changes fields of an upcoming event. Only the fields you pass change. Edits to a published event are visible to members and attendees. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "event_id": "311988140",
  "status": "updated",
  "changed": [
    "attendee_limit"
  ]
}
```

### announce_event

Send the announcement of a published event to your members. Access: write, asks the user first. REST: `POST /api/v1/meetup/announce_event`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |

Sends the announcement of one published event to the members of your group. Drafts cannot be announced. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "event_id": "311988140",
  "announced": true
}
```

### update_attendee

Mark a member as attending, remove them, or move them off the waitlist. Access: write, asks the user first. REST: `POST /api/v1/meetup/update_attendee`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |
| `member_id` | string | yes | Member ID from list_attendees or list_members. |
| `action` | enum | yes | mark_attending, remove or move_from_waitlist. |

Changes the RSVP of one member for one event. Moving off the waitlist needs a free spot under the attendee limit. The member sees the change. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "event_id": "311204587",
  "member_id": "402118",
  "status": "going"
}
```

### mark_attendance

Set check-in status for attendees of an event, from 1 hour before it starts. Access: write. REST: `POST /api/v1/meetup/mark_attendance`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |
| `member_ids` | string[] | yes | Member IDs from list_attendees. |
| `status` | enum | yes | checked_in, no_show or not_coming. |

Sets the status of many attendees in one call, from 1 hour before the event starts, also after it has ended. It sends nothing to members and one more call changes the status again, so it runs without asking first.

Example response:

```json
{
  "event_id": "311204587",
  "updated": 2,
  "status": "no_show"
}
```

### message_attendees

Send a message to the people who RSVPed going to an upcoming or past event. Access: write, asks the user first. REST: `POST /api/v1/meetup/message_attendees`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |
| `subject` | string | yes | Message subject. |
| `body` | string | yes | Message text. |

Sends one message with a subject to the people who RSVPed going to an upcoming or past event, under your name. Returns how many people it reached. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "event_id": "311204587",
  "status": "sent",
  "recipients": 38
}
```

### message_members

Contact members of your group who opted in to organizer announcements. Access: write, asks the user first. REST: `POST /api/v1/meetup/message_members`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `group_urlname` | string | yes | Group URL name, e.g. tech-founders-berlin. |
| `subject` | string | yes | Message subject. |
| `body` | string | yes | Message text. |

Sends one message to the members of your group who opted in to organizer announcements, under your name. Returns how many people it reached. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "group_urlname": "tech-founders-berlin",
  "status": "sent",
  "recipients": 1760
}
```

### cancel_event

Cancel an upcoming event. Attendees are notified and it cannot be undone. Access: write, asks the user first. REST: `POST /api/v1/meetup/cancel_event`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |

Cancels one upcoming event. Attendees are notified and the cancellation cannot be undone. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "event_id": "311988140",
  "status": "cancelled"
}
```

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

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

### Connect Meetup to your agent.

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

2. **Sign in to Meetup once** Open the connect page from the console and sign in to Meetup 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 Meetup 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.

```
Here are the talks for the next six Tuesdays. Create one Meetup event per talk, same venue and limit as last Python Night, keep them as drafts and show me the list.
```

### Call Meetup 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/meetup/{tool}. Send its parameters as JSON, exactly as listed in the endpoints above.

```
curl https://cotlet.dev/api/v1/meetup/copy_event \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"311204587","start_time":"2026-11-12T19:00:00+01:00","title":"Python Night #24","publish":true}'
```

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

```
{
  "event_id": "311988140",
  "status": "published",
  "announced": false,
  "start_time": "2026-11-12T19:00:00+01:00",
  "url": "https://www.meetup.com/yourgroup/events/311988140/"
}
```

## Why use Cotlet for Meetup?

**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 Meetup 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 Meetup changes, the tool pauses until we fix it.
- Failed calls cost nothing.

## Is there a Meetup MCP server on GitHub?

The official route is Meetup Pro with its GraphQL API, which Make and other automation tools also use. Community MCP servers for Meetup mostly read public events. Cotlet works in your own organizer account, so it also covers messaging and attendees, hosted and maintained by our team.

|  | Meetup Pro API | Cotlet |
|---|---|---|
| Who can use it | Pro subscribers only, after approval | Any organizer of a group, on any plan |
| Setup | Apply for an OAuth client, then write GraphQL | Request access, sign in to Meetup once, add one MCP server or API key |
| Messaging members and attendees | Not available | Contact members and attendees, each send confirmed by you |
| Attendees and check-in | Read RSVPs only | Add, remove, move off the waitlist, mark check-ins |
| When Meetup changes | You update your own code | Our team tests it daily and fixes it for you; failed calls are free |
| When access breaks | Stops the day Pro lapses | If Meetup logs you out, your agent gets a link to sign in again |
| Price | Pro subscription per group | 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 Meetup 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 Meetup API cost?

Free 7-day trial with 5,000 credits, no card needed. After that, the Meetup 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 Meetup 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 Meetup 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 Meetup tool you allowed. When it expires, your agent gives you a link to sign in again. [Security](https://cotlet.dev/security)
- **Revoking access:** Disconnect Meetup 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.
- **Meetup's terms:** You use your own Meetup account and stay responsible for following Meetup's terms. Cotlet is independent and not affiliated with Meetup. [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 Meetup. Cotlet reviews each request and emails you your API key.

**Do I need to be technical?**

No. You sign in to Meetup 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 Meetup session would leave my computer.**

Cotlet keeps your Meetup 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 Meetup Pro to use Cotlet?**

No. Cotlet works in your own Meetup account and does not use the Meetup API, which Meetup limits to Pro subscribers. Organizer tools need an organizer or co-organizer role in the group.

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

No. Every call to create_event, copy_event, update_event, announce_event, update_attendee, message_attendees, message_members or cancel_event waits for your OK by default. For scheduled automations you can switch confirmation off per tool in your dashboard, for example only for approvals. mark_attendance runs without asking, because it sends nothing to anyone and one call undoes it.

**Can I use the Meetup 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/meetup/{tool} from the HTTP Request node.
