REST API

The core.club REST API.

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.

Base URL
https://api.core.club/v1
Auth
Bearer ccp_…
Format
JSON
On this page

Authentication

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_token

A missing, revoked, or expired token returns 401. Keep the token secret and revoke it from the same screen if it leaks.

Account

Who the token acts as.

GET/v1/me

The member this token acts as.

Request
curl https://api.core.club/v1/me \
  -H "Authorization: Bearer ccp_your_token"
Response
{
  "id": "mem_8fd2a1",
  "name": "Alex Rivera",
  "email": "alex@example.com"
}

Clubs

The clubs you belong to. The slug you get here is what every club-scoped path below expects.

GET/v1/clubs

Clubs you belong to, each with your role.

Request
curl https://api.core.club/v1/clubs \
  -H "Authorization: Bearer ccp_your_token"
Response
{
  "clubs": [
    { "slug": "riverside-pickleball", "name": "Riverside Pickleball", "role": "MEMBER" },
    { "slug": "sunrise-yoga", "name": "Sunrise Yoga Studio", "role": "ADMIN" }
  ]
}

Events

Read the club calendar and set your RSVP.

GET/v1/clubs/{slug}/events

A 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).
Request
curl "https://api.core.club/v1/clubs/riverside-pickleball/events?days=14" \
  -H "Authorization: Bearer ccp_your_token"
Response
{
  "events": [
    {
      "id": "evt_a1b2c3",
      "title": "Tuesday Open Play",
      "startTime": "2026-08-18T18:00:00Z",
      "endTime": "2026-08-18T20:00:00Z",
      "rsvp": "GOING"
    }
  ]
}
POST/v1/clubs/{slug}/events/{eventId}/rsvp

Set 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.
Request
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}'
Response
{
  "eventId": "evt_a1b2c3",
  "status": "GOING",
  "guests": 1
}
GET/v1/clubs/{slug}/events/{eventId}/attendees

Who has RSVP'd to an event, bucketed into going / maybe / not going.

slug *pathThe club slug.
eventId *pathAn event id from the events list.
Request
curl "https://api.core.club/v1/clubs/riverside-pickleball/events/evt_a1b2c3/attendees" \
  -H "Authorization: Bearer ccp_your_token"
Response
{
  "going": [ { "user": { "id": "mem_8fd2", "name": "Alex Rivera" } } ],
  "maybe": [],
  "notGoing": []
}

Resources

Bookable courts, rooms, and facilities, and when they are free.

GET/v1/clubs/{slug}/resources

Bookable resources — courts, rooms, facilities.

slug *pathThe club slug.
Request
curl https://api.core.club/v1/clubs/riverside-pickleball/resources \
  -H "Authorization: Bearer ccp_your_token"
Response
{
  "resources": [
    { "id": "res_court4", "name": "Court 4", "type": "COURT" },
    { "id": "res_court5", "name": "Court 5", "type": "COURT" }
  ]
}
GET/v1/clubs/{slug}/resources/{resourceId}/availability

Open 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.
Request
curl "https://api.core.club/v1/clubs/riverside-pickleball/resources/res_court4/availability?date=2026-08-18" \
  -H "Authorization: Bearer ccp_your_token"
Response
{
  "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 }
  ]
}

Reservations

List, book, and cancel your own reservations. Paid resources go through the app, not the API.

GET/v1/me/reservations

Your 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).
Request
curl "https://api.core.club/v1/me/reservations?upcoming=true" \
  -H "Authorization: Bearer ccp_your_token"
Response
[
  {
    "id": "rsv_77c1",
    "resourceId": "res_court4",
    "startTime": "2026-08-18T18:00:00Z",
    "endTime": "2026-08-18T19:00:00Z",
    "clubSlug": "riverside-pickleball",
    "clubName": "Riverside Pickleball"
  }
]
GET/v1/clubs/{slug}/reservations

Your reservations at a club.

slug *pathThe club slug.
upcomingqueryOnly future reservations (default true).
limitqueryMax results (default 50, max 100).
Request
curl "https://api.core.club/v1/clubs/riverside-pickleball/reservations?upcoming=true" \
  -H "Authorization: Bearer ccp_your_token"
Response
{
  "reservations": [
    {
      "id": "rsv_77c1",
      "resourceId": "res_court4",
      "startTime": "2026-08-18T18:00:00Z",
      "endTime": "2026-08-18T19:00:00Z"
    }
  ]
}
POST/v1/clubs/{slug}/reservations

Book 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.
Request
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"}'
Response
{
  "id": "rsv_77c1",
  "resourceId": "res_court4",
  "startTime": "2026-08-18T18:00:00Z",
  "endTime": "2026-08-18T19:00:00Z",
  "status": "CONFIRMED"
}
DELETE/v1/clubs/{slug}/reservations/{reservationId}

Cancel one of your reservations.

slug *pathThe club slug.
reservationId *pathA reservation id you own.
reasonqueryOptional cancellation reason.
Request
curl -X DELETE https://api.core.club/v1/clubs/riverside-pickleball/reservations/rsv_77c1 \
  -H "Authorization: Bearer ccp_your_token"
Response
{
  "id": "rsv_77c1",
  "status": "CANCELLED"
}

You

Cross-club endpoints: one call spans every club you belong to. Each item is tagged with its clubSlug/clubName.

GET/v1/me/schedule

Everything on your plate across all your clubs: events, classes, and reservations, merged and time-sorted.

daysqueryHow many days ahead to include (default: all upcoming).
Request
curl "https://api.core.club/v1/me/schedule?days=7" \
  -H "Authorization: Bearer ccp_your_token"
Response
{
  "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." }
    }
  ]
}
GET/v1/me/membership

Your membership plan, status, and dues standing at each club.

Request
curl "https://api.core.club/v1/me/membership" \
  -H "Authorization: Bearer ccp_your_token"
Response
[
  {
    "clubSlug": "sunrise-yoga-studio",
    "clubName": "Sunrise Yoga Studio",
    "duesStatus": "ACTIVE",
    "subscription": { "status": "active", "currentPeriodEnd": "2026-09-01T00:00:00Z", "product": { "name": "Monthly" } }
  }
]
GET/v1/me/classes

The classes you are booked into across all your clubs.

upcomingqueryOnly future bookings (default true).
limitqueryMax per club (default 20, max 100).
Request
curl "https://api.core.club/v1/me/classes" \
  -H "Authorization: Bearer ccp_your_token"
Response
[
  {
    "id": "bk_1",
    "sessionId": "cls_9a2",
    "status": "CONFIRMED",
    "clubSlug": "sunrise-yoga-studio",
    "clubName": "Sunrise Yoga Studio"
  }
]
GET/v1/me/teaching

Class sessions you teach (recent + upcoming, with booked counts), across all clubs.

Request
curl "https://api.core.club/v1/me/teaching" \
  -H "Authorization: Bearer ccp_your_token"
Response
[
  { "id": "cls_9a2", "title": "Vinyasa", "startTime": "2026-08-18T18:00:00Z", "capacity": 20, "booked": 12, "clubSlug": "sunrise-yoga-studio" }
]
GET/v1/me/notifications

Your notifications across all clubs (excludes chat).

limitqueryMax results (default 20, max 50).
unreadOnlyqueryOnly unread (true/false).
Request
curl "https://api.core.club/v1/me/notifications" \
  -H "Authorization: Bearer ccp_your_token"
Response
{ "items": [ { "id": "ntf_1", "type": "EVENT_REMINDER", "read": false, "club": { "name": "Sunrise Yoga" } } ], "nextCursor": null }
POST/v1/me/notifications/read

Mark all of your unread notifications, across every club, as read.

Request
curl -X POST https://api.core.club/v1/me/notifications/read \
  -H "Authorization: Bearer ccp_your_token"
Response
{ "success": true }

Classes

A club’s class schedule, and booking yourself in or out. Free and credit classes; paid drop-ins are booked in the app.

GET/v1/clubs/{slug}/classes

A club's class schedule with fill counts.

slug *pathThe club slug.
daysqueryHow many days ahead (default 30, max 365).
Request
curl "https://api.core.club/v1/clubs/sunrise-yoga-studio/classes?days=7" \
  -H "Authorization: Bearer ccp_your_token"
Response
[
  {
    "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." } }
  }
]
POST/v1/clubs/{slug}/classes/{sessionId}/book

Enroll 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.
Request
curl -X POST https://api.core.club/v1/clubs/sunrise-yoga-studio/classes/cls_9a2/book \
  -H "Authorization: Bearer ccp_your_token"
Response
{ "id": "bk_1", "sessionId": "cls_9a2", "status": "CONFIRMED" }
DELETE/v1/clubs/{slug}/classes/{sessionId}/book

Cancel your booking for a class session.

slug *pathThe club slug.
sessionId *pathThe session id you booked.
reasonqueryOptional cancellation reason.
Request
curl -X DELETE https://api.core.club/v1/clubs/sunrise-yoga-studio/classes/cls_9a2/book \
  -H "Authorization: Bearer ccp_your_token"
Response
{ "success": true, "refunded": false }

Members

Look people up in a club. Contact fields are privacy-filtered unless you are staff.

GET/v1/clubs/{slug}/members/search

Search a club’s members by name.

slug *pathThe club slug.
q *queryName to search for.
limitqueryMax results (default 5, max 10).
Request
curl "https://api.core.club/v1/clubs/sunrise-yoga-studio/members/search?q=alex" \
  -H "Authorization: Bearer ccp_your_token"
Response
[
  { "id": "cm_17", "user": { "id": "mem_8fd2", "name": "Alex Rivera", "avatarUrl": null }, "roles": [ { "name": "Member" } ] }
]
GET/v1/clubs/{slug}/members

A page of the member directory.

slug *pathThe club slug.
limitqueryPage size (default 50, max 100).
cursorqueryA nextCursor from a previous page.
Request
curl "https://api.core.club/v1/clubs/sunrise-yoga-studio/members?limit=50" \
  -H "Authorization: Bearer ccp_your_token"
Response
{ "items": [ { "id": "cm_17", "user": { "name": "Alex Rivera" }, "roles": [], "lastActiveAt": "2026-08-14T12:00:00Z" } ], "nextCursor": null }

Instructor

For class instructors. These only work for the sessions you actually teach; anyone else gets a 403.

GET/v1/clubs/{slug}/classes/{sessionId}/roster

Who 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.
Request
curl "https://api.core.club/v1/clubs/sunrise-yoga-studio/classes/cls_9a2/roster" \
  -H "Authorization: Bearer ccp_your_token"
Response
{
  "bookings": [
    { "id": "bk_1", "status": "CONFIRMED", "user": { "id": "mem_8fd2", "name": "Alex Rivera" } }
  ],
  "waitlist": [
    { "position": 1, "user": { "id": "mem_2c1", "name": "Sam Lee" } }
  ]
}
POST/v1/clubs/{slug}/classes/{sessionId}/attendance

Check 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).
Request
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"}'
Response
{ "id": "bk_1", "status": "ATTENDED" }

Errors

Errors use standard HTTP status codes and a JSON body:

{
  "error": {
    "code": "FORBIDDEN",
    "message": "You are not a member of this club"
  }
}
400Bad request — a required parameter is missing or invalid.
401Unauthorized — missing, revoked, or expired token.
403Forbidden — your role does not permit this action.
404Not found — the club, resource, or record does not exist.
409Conflict — for example, the slot was just taken.
500Something went wrong on our side.

Get a token and make your first call.

Generate a personal access token, set the bearer header, and your club is one request away. Prefer to just ask an AI assistant? The same capabilities run over MCP.

Get your token Use an AI agent instead