Plain JSON over HTTP for any language or tool. Read the schedule, check availability, book and cancel reservations, and RSVP. Every call acts as you and respects your exact permissions in the app.
Authenticate with a personal access token. Create one under Settings → Integrations. It is shown once, starts with ccp_, and acts as your member account. Send it as a bearer token on every request:
Authorization: Bearer ccp_your_tokenA missing, revoked, or expired token returns 401. Keep the token secret and revoke it from the same screen if it leaks.
Who the token acts as.
/v1/meThe member this token acts as.
curl https://api.core.club/v1/me \
-H "Authorization: Bearer ccp_your_token"{
"id": "mem_8fd2a1",
"name": "Alex Rivera",
"email": "alex@example.com"
}The clubs you belong to. The slug you get here is what every club-scoped path below expects.
/v1/clubsClubs you belong to, each with your role.
curl https://api.core.club/v1/clubs \
-H "Authorization: Bearer ccp_your_token"{
"clubs": [
{ "slug": "riverside-pickleball", "name": "Riverside Pickleball", "role": "MEMBER" },
{ "slug": "sunrise-yoga", "name": "Sunrise Yoga Studio", "role": "ADMIN" }
]
}Read the club calendar and set your RSVP.
/v1/clubs/{slug}/eventsA club’s upcoming events.
slug *pathThe club slug from /clubs.daysqueryHow many days ahead to look (default 30, max 365).startqueryISO datetime lower bound (overrides days).endqueryISO datetime upper bound (overrides days).curl "https://api.core.club/v1/clubs/riverside-pickleball/events?days=14" \
-H "Authorization: Bearer ccp_your_token"{
"events": [
{
"id": "evt_a1b2c3",
"title": "Tuesday Open Play",
"startTime": "2026-08-18T18:00:00Z",
"endTime": "2026-08-18T20:00:00Z",
"rsvp": "GOING"
}
]
}/v1/clubs/{slug}/events/{eventId}/rsvpSet your RSVP for an event.
slug *pathThe club slug.eventId *pathAn event id from the events list.status *bodyGOING, MAYBE, or NOT_GOING.guestsbodyAdditional guests you are bringing.notebodyOptional note.curl -X POST https://api.core.club/v1/clubs/riverside-pickleball/events/evt_a1b2c3/rsvp \
-H "Authorization: Bearer ccp_your_token" \
-H "Content-Type: application/json" \
-d '{"status":"GOING","guests":1}'{
"eventId": "evt_a1b2c3",
"status": "GOING",
"guests": 1
}/v1/clubs/{slug}/events/{eventId}/attendeesWho has RSVP'd to an event, bucketed into going / maybe / not going.
slug *pathThe club slug.eventId *pathAn event id from the events list.curl "https://api.core.club/v1/clubs/riverside-pickleball/events/evt_a1b2c3/attendees" \
-H "Authorization: Bearer ccp_your_token"{
"going": [ { "user": { "id": "mem_8fd2", "name": "Alex Rivera" } } ],
"maybe": [],
"notGoing": []
}Bookable courts, rooms, and facilities, and when they are free.
/v1/clubs/{slug}/resourcesBookable resources — courts, rooms, facilities.
slug *pathThe club slug.curl https://api.core.club/v1/clubs/riverside-pickleball/resources \
-H "Authorization: Bearer ccp_your_token"{
"resources": [
{ "id": "res_court4", "name": "Court 4", "type": "COURT" },
{ "id": "res_court5", "name": "Court 5", "type": "COURT" }
]
}/v1/clubs/{slug}/resources/{resourceId}/availabilityOpen time slots for a resource on a given day.
slug *pathThe club slug.resourceId *pathA resource id from /resources.date *queryThe day to check, as YYYY-MM-DD.curl "https://api.core.club/v1/clubs/riverside-pickleball/resources/res_court4/availability?date=2026-08-18" \
-H "Authorization: Bearer ccp_your_token"{
"date": "2026-08-18",
"slots": [
{ "start": "2026-08-18T17:00:00Z", "end": "2026-08-18T18:00:00Z", "available": true },
{ "start": "2026-08-18T18:00:00Z", "end": "2026-08-18T19:00:00Z", "available": false }
]
}List, book, and cancel your own reservations. Paid resources go through the app, not the API.
/v1/me/reservationsYour reservations across ALL your clubs, in one call. Each is tagged with its clubSlug/clubName.
upcomingqueryOnly future reservations (default true).limitqueryMax results (default 50, max 100).curl "https://api.core.club/v1/me/reservations?upcoming=true" \
-H "Authorization: Bearer ccp_your_token"[
{
"id": "rsv_77c1",
"resourceId": "res_court4",
"startTime": "2026-08-18T18:00:00Z",
"endTime": "2026-08-18T19:00:00Z",
"clubSlug": "riverside-pickleball",
"clubName": "Riverside Pickleball"
}
]/v1/clubs/{slug}/reservationsYour reservations at a club.
slug *pathThe club slug.upcomingqueryOnly future reservations (default true).limitqueryMax results (default 50, max 100).curl "https://api.core.club/v1/clubs/riverside-pickleball/reservations?upcoming=true" \
-H "Authorization: Bearer ccp_your_token"{
"reservations": [
{
"id": "rsv_77c1",
"resourceId": "res_court4",
"startTime": "2026-08-18T18:00:00Z",
"endTime": "2026-08-18T19:00:00Z"
}
]
}/v1/clubs/{slug}/reservationsBook a free resource for a time slot.
slug *pathThe club slug.resourceId *bodyA resource id from /resources.startTime *bodyISO datetime for the slot start.endTime *bodyISO datetime for the slot end.guestCountbodyNumber of people including you (default 1).notesbodyOptional note.curl -X POST https://api.core.club/v1/clubs/riverside-pickleball/reservations \
-H "Authorization: Bearer ccp_your_token" \
-H "Content-Type: application/json" \
-d '{"resourceId":"res_court4","startTime":"2026-08-18T18:00:00Z","endTime":"2026-08-18T19:00:00Z"}'{
"id": "rsv_77c1",
"resourceId": "res_court4",
"startTime": "2026-08-18T18:00:00Z",
"endTime": "2026-08-18T19:00:00Z",
"status": "CONFIRMED"
}/v1/clubs/{slug}/reservations/{reservationId}Cancel one of your reservations.
slug *pathThe club slug.reservationId *pathA reservation id you own.reasonqueryOptional cancellation reason.curl -X DELETE https://api.core.club/v1/clubs/riverside-pickleball/reservations/rsv_77c1 \
-H "Authorization: Bearer ccp_your_token"{
"id": "rsv_77c1",
"status": "CANCELLED"
}Cross-club endpoints: one call spans every club you belong to. Each item is tagged with its clubSlug/clubName.
/v1/me/scheduleEverything on your plate across all your clubs: events, classes, and reservations, merged and time-sorted.
daysqueryHow many days ahead to include (default: all upcoming).curl "https://api.core.club/v1/me/schedule?days=7" \
-H "Authorization: Bearer ccp_your_token"{
"items": [
{
"type": "class",
"sessionId": "cls_9a2",
"timestamp": "2026-08-18T18:00:00Z",
"club": { "name": "Sunrise Yoga", "slug": "sunrise-yoga-studio" },
"data": { "startTime": "2026-08-18T18:00:00Z", "classType": { "name": "Vinyasa" }, "instructor": "Mia R." }
}
]
}/v1/me/membershipYour membership plan, status, and dues standing at each club.
curl "https://api.core.club/v1/me/membership" \
-H "Authorization: Bearer ccp_your_token"[
{
"clubSlug": "sunrise-yoga-studio",
"clubName": "Sunrise Yoga Studio",
"duesStatus": "ACTIVE",
"subscription": { "status": "active", "currentPeriodEnd": "2026-09-01T00:00:00Z", "product": { "name": "Monthly" } }
}
]/v1/me/classesThe classes you are booked into across all your clubs.
upcomingqueryOnly future bookings (default true).limitqueryMax per club (default 20, max 100).curl "https://api.core.club/v1/me/classes" \
-H "Authorization: Bearer ccp_your_token"[
{
"id": "bk_1",
"sessionId": "cls_9a2",
"status": "CONFIRMED",
"clubSlug": "sunrise-yoga-studio",
"clubName": "Sunrise Yoga Studio"
}
]/v1/me/teachingClass sessions you teach (recent + upcoming, with booked counts), across all clubs.
curl "https://api.core.club/v1/me/teaching" \
-H "Authorization: Bearer ccp_your_token"[
{ "id": "cls_9a2", "title": "Vinyasa", "startTime": "2026-08-18T18:00:00Z", "capacity": 20, "booked": 12, "clubSlug": "sunrise-yoga-studio" }
]/v1/me/notificationsYour notifications across all clubs (excludes chat).
limitqueryMax results (default 20, max 50).unreadOnlyqueryOnly unread (true/false).curl "https://api.core.club/v1/me/notifications" \
-H "Authorization: Bearer ccp_your_token"{ "items": [ { "id": "ntf_1", "type": "EVENT_REMINDER", "read": false, "club": { "name": "Sunrise Yoga" } } ], "nextCursor": null }/v1/me/notifications/readMark all of your unread notifications, across every club, as read.
curl -X POST https://api.core.club/v1/me/notifications/read \
-H "Authorization: Bearer ccp_your_token"{ "success": true }A club’s class schedule, and booking yourself in or out. Free and credit classes; paid drop-ins are booked in the app.
/v1/clubs/{slug}/classesA club's class schedule with fill counts.
slug *pathThe club slug.daysqueryHow many days ahead (default 30, max 365).curl "https://api.core.club/v1/clubs/sunrise-yoga-studio/classes?days=7" \
-H "Authorization: Bearer ccp_your_token"[
{
"id": "cls_9a2",
"startTime": "2026-08-18T18:00:00Z",
"endTime": "2026-08-18T19:00:00Z",
"capacity": 20,
"bookedCount": 12,
"classType": { "name": "Vinyasa", "color": "#7C3AED" },
"instructor": { "user": { "name": "Mia R." } }
}
]/v1/clubs/{slug}/classes/{sessionId}/bookEnroll yourself in a class session.
slug *pathThe club slug.sessionId *pathA session id from the class schedule.packageIdbodyA class-credit package to pay with, if the class uses credits.curl -X POST https://api.core.club/v1/clubs/sunrise-yoga-studio/classes/cls_9a2/book \
-H "Authorization: Bearer ccp_your_token"{ "id": "bk_1", "sessionId": "cls_9a2", "status": "CONFIRMED" }/v1/clubs/{slug}/classes/{sessionId}/bookCancel your booking for a class session.
slug *pathThe club slug.sessionId *pathThe session id you booked.reasonqueryOptional cancellation reason.curl -X DELETE https://api.core.club/v1/clubs/sunrise-yoga-studio/classes/cls_9a2/book \
-H "Authorization: Bearer ccp_your_token"{ "success": true, "refunded": false }Look people up in a club. Contact fields are privacy-filtered unless you are staff.
/v1/clubs/{slug}/members/searchSearch a club’s members by name.
slug *pathThe club slug.q *queryName to search for.limitqueryMax results (default 5, max 10).curl "https://api.core.club/v1/clubs/sunrise-yoga-studio/members/search?q=alex" \
-H "Authorization: Bearer ccp_your_token"[
{ "id": "cm_17", "user": { "id": "mem_8fd2", "name": "Alex Rivera", "avatarUrl": null }, "roles": [ { "name": "Member" } ] }
]/v1/clubs/{slug}/membersA page of the member directory.
slug *pathThe club slug.limitqueryPage size (default 50, max 100).cursorqueryA nextCursor from a previous page.curl "https://api.core.club/v1/clubs/sunrise-yoga-studio/members?limit=50" \
-H "Authorization: Bearer ccp_your_token"{ "items": [ { "id": "cm_17", "user": { "name": "Alex Rivera" }, "roles": [], "lastActiveAt": "2026-08-14T12:00:00Z" } ], "nextCursor": null }For class instructors. These only work for the sessions you actually teach; anyone else gets a 403.
/v1/clubs/{slug}/classes/{sessionId}/rosterWho is booked into a class you teach, with each person’s attendance status, plus the waitlist.
slug *pathThe club slug.sessionId *pathA session id from /me/teaching.curl "https://api.core.club/v1/clubs/sunrise-yoga-studio/classes/cls_9a2/roster" \
-H "Authorization: Bearer ccp_your_token"{
"bookings": [
{ "id": "bk_1", "status": "CONFIRMED", "user": { "id": "mem_8fd2", "name": "Alex Rivera" } }
],
"waitlist": [
{ "position": 1, "user": { "id": "mem_2c1", "name": "Sam Lee" } }
]
}/v1/clubs/{slug}/classes/{sessionId}/attendanceCheck a member into (or out of) a class you teach.
slug *pathThe club slug.sessionId *pathA session id from /me/teaching.userId *bodyA member id from the roster.status *bodyATTENDED, NO_SHOW, or CONFIRMED (un-mark).curl -X POST https://api.core.club/v1/clubs/sunrise-yoga-studio/classes/cls_9a2/attendance \
-H "Authorization: Bearer ccp_your_token" \
-H "Content-Type: application/json" \
-d '{"userId":"mem_8fd2","status":"ATTENDED"}'{ "id": "bk_1", "status": "ATTENDED" }Errors use standard HTTP status codes and a JSON body:
{
"error": {
"code": "FORBIDDEN",
"message": "You are not a member of this club"
}
}