# Meetup API

> Every Meetup 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/meetup

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)

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

- Base URL: `https://cotlet.dev/api/v1/meetup`
- Connects with: Your own Meetup account, as organizer or co-organizer of the group
- Integration page: https://cotlet.dev/integrations/meetup-api-mcp-server

## Endpoints

| Endpoint | Access | Description |
|---|---|---|
| `list_groups` | read | Groups you organize or co-organize, with member count and your role. |
| `list_events` | read | Events of a group with date, RSVP counts, attendee limit and status. |
| `get_event` | read | Full event: title, description, time, venue or online link, hosts, fee and settings. |
| `list_attendees` | read | RSVPs of an event with guests, answers and check-in status. |
| `list_members` | read | Members of your group with join date and role. |
| `create_event` | write | New event as a draft, or published without an announcement. |
| `copy_event` | write | Copy a past event to a new date, keeping its description, venue and settings. |
| `update_event` | write | Change the title, time, description, venue or attendee limit of an upcoming event. |
| `announce_event` | write | Send the announcement of a published event to your members. |
| `update_attendee` | write | Mark a member as attending, remove them, or move them off the waitlist. |
| `mark_attendance` | write | Set check-in status for attendees of an event, from 1 hour before it starts. |
| `message_attendees` | write | Send a message to the people who RSVPed going to an upcoming or past event. |
| `message_members` | write | Contact members of your group who opted in to organizer announcements. |
| `cancel_event` | write | Cancel an upcoming event. Attendees are notified and it cannot be undone. |

## List groups

`POST https://cotlet.dev/api/v1/meetup/list_groups`

Access: read.

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

### Parameters

No parameters.

### Request

**cURL**

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

**Python**

```python
result = client.call("meetup", "list_groups")
```

**Node.js**

```js
const result = await cotlet.call('meetup', 'list_groups');
```

**CLI**

```bash
cotlet call meetup list_groups
```

### Example response

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

## List events

`POST https://cotlet.dev/api/v1/meetup/list_events`

Access: read.

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.

### Parameters

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

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/meetup/list_events \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"group_urlname":"https://example.com"}'
```

**Python**

```python
result = client.call("meetup", "list_events", {"group_urlname":"https://example.com"})
```

**Node.js**

```js
const result = await cotlet.call('meetup', 'list_events', {"group_urlname":"https://example.com"});
```

**CLI**

```bash
cotlet call meetup list_events --data '{"group_urlname":"https://example.com"}'
```

### 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

`POST https://cotlet.dev/api/v1/meetup/get_event`

Access: read.

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.

### Parameters

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

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/meetup/get_event \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"event_8c41d2"}'
```

**Python**

```python
result = client.call("meetup", "get_event", {"event_id":"event_8c41d2"})
```

**Node.js**

```js
const result = await cotlet.call('meetup', 'get_event', {"event_id":"event_8c41d2"});
```

**CLI**

```bash
cotlet call meetup get_event --data '{"event_id":"event_8c41d2"}'
```

### 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

`POST https://cotlet.dev/api/v1/meetup/list_attendees`

Access: read.

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.

### Parameters

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

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/meetup/list_attendees \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"event_8c41d2"}'
```

**Python**

```python
result = client.call("meetup", "list_attendees", {"event_id":"event_8c41d2"})
```

**Node.js**

```js
const result = await cotlet.call('meetup', 'list_attendees', {"event_id":"event_8c41d2"});
```

**CLI**

```bash
cotlet call meetup list_attendees --data '{"event_id":"event_8c41d2"}'
```

### Example response

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

## List members

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

Access: read.

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.

### Parameters

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

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/meetup/list_members \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"group_urlname":"https://example.com"}'
```

**Python**

```python
result = client.call("meetup", "list_members", {"group_urlname":"https://example.com"})
```

**Node.js**

```js
const result = await cotlet.call('meetup', 'list_members', {"group_urlname":"https://example.com"});
```

**CLI**

```bash
cotlet call meetup list_members --data '{"group_urlname":"https://example.com"}'
```

### Example response

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

## Create event

`POST https://cotlet.dev/api/v1/meetup/create_event`

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

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.

### Parameters

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

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/meetup/create_event \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"group_urlname":"tech-founders-berlin","title":"Intro to SQL","start_time":"2026-11-03T19:00:00+01:00","duration_minutes":120,"venue":{"name":"Co-Work Mitte","address":"Torstr. 1","city":"Berlin"},"attendee_limit":40,"publish":false}'
```

**Python**

```python
result = client.call("meetup", "create_event", {"group_urlname":"tech-founders-berlin","title":"Intro to SQL","start_time":"2026-11-03T19:00:00+01:00","duration_minutes":120,"venue":{"name":"Co-Work Mitte","address":"Torstr. 1","city":"Berlin"},"attendee_limit":40,"publish":False})
```

**Node.js**

```js
const result = await cotlet.call('meetup', 'create_event', {"group_urlname":"tech-founders-berlin","title":"Intro to SQL","start_time":"2026-11-03T19:00:00+01:00","duration_minutes":120,"venue":{"name":"Co-Work Mitte","address":"Torstr. 1","city":"Berlin"},"attendee_limit":40,"publish":false});
```

**CLI**

```bash
cotlet call meetup create_event --data '{"group_urlname":"tech-founders-berlin","title":"Intro to SQL","start_time":"2026-11-03T19:00:00+01:00","duration_minutes":120,"venue":{"name":"Co-Work Mitte","address":"Torstr. 1","city":"Berlin"},"attendee_limit":40,"publish":false}'
```

### Example response

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

## Copy event

`POST https://cotlet.dev/api/v1/meetup/copy_event`

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

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.

### Parameters

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

### Request

**cURL**

```bash
curl -X POST 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}'
```

**Python**

```python
result = client.call("meetup", "copy_event", {"event_id":"311204587","start_time":"2026-11-12T19:00:00+01:00","title":"Python Night #24","publish":True})
```

**Node.js**

```js
const result = await cotlet.call('meetup', 'copy_event', {"event_id":"311204587","start_time":"2026-11-12T19:00:00+01:00","title":"Python Night #24","publish":true});
```

**CLI**

```bash
cotlet call meetup copy_event --data '{"event_id":"311204587","start_time":"2026-11-12T19:00:00+01:00","title":"Python Night #24","publish":true}'
```

### 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

`POST https://cotlet.dev/api/v1/meetup/update_event`

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

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.

### Parameters

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

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/meetup/update_event \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"event_8c41d2","fields":"fields"}'
```

**Python**

```python
result = client.call("meetup", "update_event", {"event_id":"event_8c41d2","fields":"fields"})
```

**Node.js**

```js
const result = await cotlet.call('meetup', 'update_event', {"event_id":"event_8c41d2","fields":"fields"});
```

**CLI**

```bash
cotlet call meetup update_event --data '{"event_id":"event_8c41d2","fields":"fields"}'
```

### Example response

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

## Announce event

`POST https://cotlet.dev/api/v1/meetup/announce_event`

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

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.

### Parameters

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

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/meetup/announce_event \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"event_8c41d2"}'
```

**Python**

```python
result = client.call("meetup", "announce_event", {"event_id":"event_8c41d2"})
```

**Node.js**

```js
const result = await cotlet.call('meetup', 'announce_event', {"event_id":"event_8c41d2"});
```

**CLI**

```bash
cotlet call meetup announce_event --data '{"event_id":"event_8c41d2"}'
```

### Example response

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

## Update attendee

`POST https://cotlet.dev/api/v1/meetup/update_attendee`

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

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.

### Parameters

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

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/meetup/update_attendee \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"event_8c41d2","member_id":"member_8c41d2","action":"mark_attending"}'
```

**Python**

```python
result = client.call("meetup", "update_attendee", {"event_id":"event_8c41d2","member_id":"member_8c41d2","action":"mark_attending"})
```

**Node.js**

```js
const result = await cotlet.call('meetup', 'update_attendee', {"event_id":"event_8c41d2","member_id":"member_8c41d2","action":"mark_attending"});
```

**CLI**

```bash
cotlet call meetup update_attendee --data '{"event_id":"event_8c41d2","member_id":"member_8c41d2","action":"mark_attending"}'
```

### Example response

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

## Mark attendance

`POST https://cotlet.dev/api/v1/meetup/mark_attendance`

Access: write.

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.

### Parameters

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

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/meetup/mark_attendance \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"311204587","member_ids":["402118","402119"],"status":"no_show"}'
```

**Python**

```python
result = client.call("meetup", "mark_attendance", {"event_id":"311204587","member_ids":["402118","402119"],"status":"no_show"})
```

**Node.js**

```js
const result = await cotlet.call('meetup', 'mark_attendance', {"event_id":"311204587","member_ids":["402118","402119"],"status":"no_show"});
```

**CLI**

```bash
cotlet call meetup mark_attendance --data '{"event_id":"311204587","member_ids":["402118","402119"],"status":"no_show"}'
```

### Example response

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

## Message attendees

`POST https://cotlet.dev/api/v1/meetup/message_attendees`

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

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.

### Parameters

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

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/meetup/message_attendees \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"311988140","subject":"Room 204 and 19:30 start tonight","body":"Python Night moved to room 204 at Co-Work Mitte and starts at 19:30. Same building, same talks."}'
```

**Python**

```python
result = client.call("meetup", "message_attendees", {"event_id":"311988140","subject":"Room 204 and 19:30 start tonight","body":"Python Night moved to room 204 at Co-Work Mitte and starts at 19:30. Same building, same talks."})
```

**Node.js**

```js
const result = await cotlet.call('meetup', 'message_attendees', {"event_id":"311988140","subject":"Room 204 and 19:30 start tonight","body":"Python Night moved to room 204 at Co-Work Mitte and starts at 19:30. Same building, same talks."});
```

**CLI**

```bash
cotlet call meetup message_attendees --data '{"event_id":"311988140","subject":"Room 204 and 19:30 start tonight","body":"Python Night moved to room 204 at Co-Work Mitte and starts at 19:30. Same building, same talks."}'
```

### Example response

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

## Message members

`POST https://cotlet.dev/api/v1/meetup/message_members`

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

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.

### Parameters

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

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/meetup/message_members \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"group_urlname":"https://example.com","subject":"subject","body":"body"}'
```

**Python**

```python
result = client.call("meetup", "message_members", {"group_urlname":"https://example.com","subject":"subject","body":"body"})
```

**Node.js**

```js
const result = await cotlet.call('meetup', 'message_members', {"group_urlname":"https://example.com","subject":"subject","body":"body"});
```

**CLI**

```bash
cotlet call meetup message_members --data '{"group_urlname":"https://example.com","subject":"subject","body":"body"}'
```

### Example response

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

## Cancel event

`POST https://cotlet.dev/api/v1/meetup/cancel_event`

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

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.

### Parameters

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

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/meetup/cancel_event \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"event_8c41d2"}'
```

**Python**

```python
result = client.call("meetup", "cancel_event", {"event_id":"event_8c41d2"})
```

**Node.js**

```js
const result = await cotlet.call('meetup', 'cancel_event', {"event_id":"event_8c41d2"});
```

**CLI**

```bash
cotlet call meetup cancel_event --data '{"event_id":"event_8c41d2"}'
```

### Example response

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