REST API reference

Meetup API

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

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

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
curl -X POST https://cotlet.dev/api/v1/meetup/list_groups \
  -H "Authorization: Bearer $COTLET_API_KEY"
Python
result = client.call("meetup", "list_groups")
Node.js
const result = await cotlet.call('meetup', 'list_groups');
CLI
cotlet call meetup list_groups

Example response

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

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

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

Parameters: list_events
NameTypeDescription
group_urlname required string Group URL name, e.g. tech-founders-berlin.
status enum upcoming, past, draft or cancelled. Default: upcoming.
limit integer 1 to 50. Default: 20.
cursor string Next page cursor from the previous call.

Request

cURL
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
result = client.call("meetup", "list_events", {"group_urlname":"https://example.com"})
Node.js
const result = await cotlet.call('meetup', 'list_events', {"group_urlname":"https://example.com"});
CLI
cotlet call meetup list_events --data '{"group_urlname":"https://example.com"}'

Example response

{
  "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

read

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

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

Parameters: get_event
NameTypeDescription
event_id required string Event ID from list_events.

Request

cURL
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
result = client.call("meetup", "get_event", {"event_id":"event_8c41d2"})
Node.js
const result = await cotlet.call('meetup', 'get_event', {"event_id":"event_8c41d2"});
CLI
cotlet call meetup get_event --data '{"event_id":"event_8c41d2"}'

Example response

{
  "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."
  ]
}

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

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

Parameters: list_attendees
NameTypeDescription
event_id required string Event ID from list_events.
status enum going, waitlist, not_going, checked_in, no_show or all. Default: going.
cursor string Next page cursor from the previous call.

Request

cURL
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
result = client.call("meetup", "list_attendees", {"event_id":"event_8c41d2"})
Node.js
const result = await cotlet.call('meetup', 'list_attendees', {"event_id":"event_8c41d2"});
CLI
cotlet call meetup list_attendees --data '{"event_id":"event_8c41d2"}'

Example response

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

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

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

Parameters: list_members
NameTypeDescription
group_urlname required string Group URL name, e.g. tech-founders-berlin.
joined_since date Only members who joined on or after this date.
limit integer 1 to 200. Default: 100.
cursor string Next page cursor from the previous call.

Request

cURL
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
result = client.call("meetup", "list_members", {"group_urlname":"https://example.com"})
Node.js
const result = await cotlet.call('meetup', 'list_members', {"group_urlname":"https://example.com"});
CLI
cotlet call meetup list_members --data '{"group_urlname":"https://example.com"}'

Example response

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

Create event

write Confirm

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

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

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

Request

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

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

Copy event

write Confirm

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

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

Parameters: copy_event
NameTypeDescription
event_id required string Event ID from list_events.
start_time required datetime New start, ISO 8601 with time zone.
title string New title. Default: the old one.
publish boolean Publish now or keep as draft. Default: false.

Request

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

{
  "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

write Confirm

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

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

Parameters: update_event
NameTypeDescription
event_id required string Event ID from list_events.
fields required object Any of title, start_time, duration_minutes, description, venue, attendee_limit.

Request

cURL
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
result = client.call("meetup", "update_event", {"event_id":"event_8c41d2","fields":"fields"})
Node.js
const result = await cotlet.call('meetup', 'update_event', {"event_id":"event_8c41d2","fields":"fields"});
CLI
cotlet call meetup update_event --data '{"event_id":"event_8c41d2","fields":"fields"}'

Example response

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

Announce event

write Confirm

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

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

Parameters: announce_event
NameTypeDescription
event_id required string Event ID from list_events.

Request

cURL
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
result = client.call("meetup", "announce_event", {"event_id":"event_8c41d2"})
Node.js
const result = await cotlet.call('meetup', 'announce_event', {"event_id":"event_8c41d2"});
CLI
cotlet call meetup announce_event --data '{"event_id":"event_8c41d2"}'

Example response

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

Update attendee

write Confirm

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

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

Parameters: update_attendee
NameTypeDescription
event_id required string Event ID from list_events.
member_id required string Member ID from list_attendees or list_members.
action required enum mark_attending, remove or move_from_waitlist.

Request

cURL
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
result = client.call("meetup", "update_attendee", {"event_id":"event_8c41d2","member_id":"member_8c41d2","action":"mark_attending"})
Node.js
const result = await cotlet.call('meetup', 'update_attendee', {"event_id":"event_8c41d2","member_id":"member_8c41d2","action":"mark_attending"});
CLI
cotlet call meetup update_attendee --data '{"event_id":"event_8c41d2","member_id":"member_8c41d2","action":"mark_attending"}'

Example response

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

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

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

Parameters: mark_attendance
NameTypeDescription
event_id required string Event ID from list_events.
member_ids required string[] Member IDs from list_attendees.
status required enum checked_in, no_show or not_coming.

Request

cURL
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
result = client.call("meetup", "mark_attendance", {"event_id":"311204587","member_ids":["402118","402119"],"status":"no_show"})
Node.js
const result = await cotlet.call('meetup', 'mark_attendance', {"event_id":"311204587","member_ids":["402118","402119"],"status":"no_show"});
CLI
cotlet call meetup mark_attendance --data '{"event_id":"311204587","member_ids":["402118","402119"],"status":"no_show"}'

Example response

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

Message attendees

write Confirm

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

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

Parameters: message_attendees
NameTypeDescription
event_id required string Event ID from list_events.
subject required string Message subject.
body required string Message text.

Request

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

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

Message members

write Confirm

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

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

Parameters: message_members
NameTypeDescription
group_urlname required string Group URL name, e.g. tech-founders-berlin.
subject required string Message subject.
body required string Message text.

Request

cURL
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
result = client.call("meetup", "message_members", {"group_urlname":"https://example.com","subject":"subject","body":"body"})
Node.js
const result = await cotlet.call('meetup', 'message_members', {"group_urlname":"https://example.com","subject":"subject","body":"body"});
CLI
cotlet call meetup message_members --data '{"group_urlname":"https://example.com","subject":"subject","body":"body"}'

Example response

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

Cancel event

write Confirm

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

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

Parameters: cancel_event
NameTypeDescription
event_id required string Event ID from list_events.

Request

cURL
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
result = client.call("meetup", "cancel_event", {"event_id":"event_8c41d2"})
Node.js
const result = await cotlet.call('meetup', 'cancel_event', {"event_id":"event_8c41d2"});
CLI
cotlet call meetup cancel_event --data '{"event_id":"event_8c41d2"}'

Example response

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