> ## Documentation Index
> Fetch the complete documentation index at: https://docs.1club.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# List a class's roster

> Returns who is booked into one class occurrence, whether they were checked in, and what they paid - the roster, from the class side. This is the answer to "two groups run at 10:00, who is in which": every attendee holds their own booking row against this class's id.

Attendees only: the occurrence's own area hold and any instructor slot are excluded by the same predicate that decides capacity, so the roster is drawn from exactly the population the class's `bookedCount` counts.

Do not expect `total` to equal `bookedCount`. Capacity counts `confirmed`, `pending` and `checked_in`, and adds standalone walk-in check-ins that have no booking to list; the roster also keeps `no_show`, because whether someone was enrolled and failed to turn up is what an attendance reconciliation is asking. Cancelled seats are the one status left out, unless `status=cancelled` asks for them.

Requires both `classes:read` and `bookings:read`: it is a class sub-resource that returns booking data. `contactEmail` additionally needs `contacts:read` and is null without it - a name identifies who is on the roster, an email address is contact PII and stays behind the scope that guards it elsewhere.




## OpenAPI

````yaml /openapi-platform.json get /v1/platform/classes/{id}/bookings
openapi: 3.0.0
info:
  title: 1club Platform API
  version: 1.0.0
  description: >-
    The 1club Platform API lets you programmatically access and manage your
    organization's data.


    ## Official API Contract


    This documentation is the official source of truth for the 1club Platform
    API.

    If an integration relies on undocumented endpoints, fields, response shapes,
    or internal behavior outside this spec, we can't guarantee backward
    compatibility.

    Build against what's documented here to stay stable as the platform evolves.


    ## Authentication


    All requests require a customer API key passed as a Bearer token:


    ```

    Authorization: Bearer 1club_sk_live_...

    ```


    Generate API keys from the admin portal under **Settings > API Tokens**.

    The key is tied to your organization - all responses are scoped to your
    org's data.


    ## Rate Limiting


    - **100 requests per minute** per API key

    - When exceeded, the API returns `429 Too Many Requests` with a
    `Retry-After` header

    - Rate limit headers are included in every response:
      - `X-RateLimit-Limit` - max requests per window
      - `X-RateLimit-Remaining` - requests remaining
      - `X-RateLimit-Reset` - seconds until the window resets

    ## Errors


    | Status | Meaning |

    |--------|---------|

    | `400` | Invalid request parameters |

    | `401` | Missing or invalid API key |

    | `404` | Resource not found (or doesn't belong to your organization) |

    | `429` | Rate limit exceeded |

    | `500` | Internal server error |
  contact:
    name: 1club API Support
    email: support@1club.ai
servers:
  - url: https://api.1club.ai
    description: Production API
security:
  - customerApiAuth: []
tags: []
paths:
  /v1/platform/classes/{id}/bookings:
    get:
      tags:
        - Classes
      summary: List a class's roster
      description: >
        Returns who is booked into one class occurrence, whether they were
        checked in, and what they paid - the roster, from the class side. This
        is the answer to "two groups run at 10:00, who is in which": every
        attendee holds their own booking row against this class's id.


        Attendees only: the occurrence's own area hold and any instructor slot
        are excluded by the same predicate that decides capacity, so the roster
        is drawn from exactly the population the class's `bookedCount` counts.


        Do not expect `total` to equal `bookedCount`. Capacity counts
        `confirmed`, `pending` and `checked_in`, and adds standalone walk-in
        check-ins that have no booking to list; the roster also keeps `no_show`,
        because whether someone was enrolled and failed to turn up is what an
        attendance reconciliation is asking. Cancelled seats are the one status
        left out, unless `status=cancelled` asks for them.


        Requires both `classes:read` and `bookings:read`: it is a class
        sub-resource that returns booking data. `contactEmail` additionally
        needs `contacts:read` and is null without it - a name identifies who is
        on the roster, an email address is contact PII and stays behind the
        scope that guards it elsewhere.
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: integer
          description: Class id
        - in: query
          name: status
          schema:
            type: string
          description: >-
            Only attendees with this booking status (e.g. confirmed, checked_in,
            cancelled). Defaults to every status but cancelled.
        - in: query
          name: limit
          schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 100
          description: Maximum number of attendees to return
        - in: query
          name: offset
          schema:
            type: integer
            minimum: 0
            default: 0
          description: Number of attendees to skip
      responses:
        '200':
          description: Page of attendees
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PlatformClassBookingPage'
        '400':
          $ref: '#/components/responses/PlatformBadRequest'
        '401':
          $ref: '#/components/responses/PlatformUnauthorized'
        '403':
          description: >-
            API key is missing the required `classes:read` or `bookings:read`
            scope
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PlatformError'
        '404':
          $ref: '#/components/responses/PlatformNotFound'
        '429':
          $ref: '#/components/responses/PlatformRateLimited'
      security:
        - customerApiAuth: []
components:
  schemas:
    PlatformClassBookingPage:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/PlatformClassBooking'
        total:
          type: integer
          description: Total attendees matching the filters, ignoring pagination
        limit:
          type: integer
        offset:
          type: integer
    PlatformError:
      type: object
      properties:
        error:
          type: string
    PlatformClassBooking:
      type: object
      description: >-
        One attendee of a class occurrence. Class seats are one booking per
        person, so this is a booking row resolved with the attendee's name,
        check-in and payment.
      properties:
        bookingId:
          type: integer
        classId:
          type: integer
        contactId:
          type: integer
          nullable: true
          description: >-
            Null for an anonymous seat - a pass sold without naming who would
            use it. `bookerName` is then who paid for it.
        contactName:
          type: string
          nullable: true
        bookerName:
          type: string
          nullable: true
          description: >-
            Who paid, when the seat is anonymous and was sold through an order -
            so a roster reads "Anonymous (Ivan Petrov)" rather than an opaque
            booking number.
        contactEmail:
          type: string
          nullable: true
          description: >-
            Null unless the key also holds `contacts:read` - an email address is
            contact PII, gated as it is on the contacts resource.
        status:
          type: string
          description: Booking status (confirmed, pending, checked_in, cancelled).
        source:
          type: string
          nullable: true
          description: Channel that created it (admin, portal, app, api, kiosk, …).
        startTime:
          type: string
          format: date-time
        endTime:
          type: string
          format: date-time
        checkedIn:
          type: boolean
          description: Whether the attendee was checked in for this class.
        checkedInAt:
          type: string
          format: date-time
          nullable: true
        membershipId:
          type: integer
          nullable: true
          description: The membership the seat was drawn from, when it was covered by one.
        entranceMethod:
          type: string
          nullable: true
          description: >-
            How the seat was paid for (direct_payment, membership,
            external_program).
        payment:
          type: object
          properties:
            status:
              type: string
              enum:
                - paid
                - unpaid
                - no_charge
              description: >-
                Classified exactly as on `PlatformBooking`. A class seat covered
                by a membership or an external program is `no_charge` - it owes
                nothing even though it carries a price - so do not read it as an
                outstanding balance.
            amount:
              type: number
              nullable: true
        notes:
          type: string
          nullable: true
        createdAt:
          type: string
          format: date-time
  responses:
    PlatformBadRequest:
      description: Invalid request (bad parameters, or a body that fails validation)
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/PlatformError'
    PlatformUnauthorized:
      description: Invalid or missing API key
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/PlatformError'
    PlatformNotFound:
      description: The requested resource does not exist in this organization
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/PlatformError'
    PlatformRateLimited:
      description: Rate limit exceeded
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/PlatformError'
  securitySchemes:
    customerApiAuth:
      type: http
      scheme: bearer
      description: >-
        Organization-scoped bearer credential: a customer API key
        (1club_sk_live_...) or an MCP OAuth access token.

````