CheckCourt

API-Referenz

Alle Endpoints der CheckCourt REST-API v1

Enterprise-Feature

Die REST-API ist ein Enterprise-Feature und muss beim Support angefragt werden. Ohne Freischaltung weist die API jeden Schlüssel mit 401 UNAUTHORIZED ab.

Basis-URL: https://app.checkcourt.de/api/v1 · Authentifizierung per Authorization: Bearer <API-Schlüssel> · Antworten sind immer benannte JSON-Objekte, Fehler immer { "error": { "code", "message" } }. Grundlagen und Fehler-Codes stehen im Developer-Überblick.

Welcher Schlüssel kann was?

Jeder Endpoint trägt unten Badges, die zeigen, mit welcher Schlüsselart er aufrufbar ist. Es gibt zwei Kategorien:

KategorieEndpointsRegel
UniversellAlles Vereinsbezogene (Plätze, Mitglieder, Buchungen, ...)Der Scope entscheidet, nicht die Schlüsselart: Persönliche Schlüssel bringen die Scopes der Mitgliedsrolle mit, Management-Schlüssel ihre explizit vergebenen. Persönliche Schlüssel brauchen dazu immer X-Tenant-Id.
Nur persönliche Schlüssel/me/*Self-Service mit Mitglieds-Identität: eigene Vereine, eigene Buchungen lesen und anlegen.

Jeder Endpoint hat genau eine Bedeutung: /me/* handelt für den Nutzer hinter dem Schlüssel, alles andere verwaltet Vereins-Ressourcen per Scope. POST /me/bookings bucht für dich selbst, POST /bookings bucht im Namen eines Mitglieds (forUserId). Endpoints, die nur Management-Schlüssel aufrufen können, gibt es bewusst nicht: Management-Schlüssel sind durch Scopes begrenzt, nicht durch eigene Endpoints. DELETE /bookings/{id} ist absichtlich vereint, "storniere diese Buchung" ist eine Bedeutung; ob das Eigentum oder der Scope bookings:cancel sie erlaubt, entscheidet sich zur Laufzeit.

Eigene Vereine

Persönliche Schlüssel sind nutzergebunden: Der Verein wird pro Anfrage über den Header X-Tenant-Id angegeben. Dieser Endpoint liefert die Vereins-IDs und deine Rolle im jeweiligen Verein; er selbst benötigt keinen Header.

get/me/tenants
List the caller's clubs
Persönlicher Schlüssel

Lists every club the member behind the personal API key belongs to, with the role held in each. This is the entry point of the multi-club model: personal keys are user-bound, and every club-scoped request names its club via the X-Tenant-Id header using the ids from this endpoint. This endpoint itself needs no header. Management keys have no member identity and receive 401.

Beispiel

curl "https://app.checkcourt.de/api/v1/me/tenants" \
  -H "Authorization: Bearer ck_user_…"

Antworten

  • 200The caller's club memberships.
  • 401Missing/invalid key, management key, or no club of the user has personal keys enabled.
200er-Schema anzeigen
  • tenantsobject[]
    • idstring
    • namestring
    • role"member" | "trainer" | "admin"

      The caller's role in THIS club; a user can be admin in one club and member in another.

Buchungen

Verfügbarkeiten lesen, Plätze buchen und stornieren. Eigene Buchungen funktionieren mit persönlichen Schlüsseln ohne speziellen Scope; bookings:write und bookings:cancel braucht nur, wer auf fremde Buchungen zugreift. Das Tages-Listing mit Namen (für Abgleich und Reporting) erfordert bookings:read_confidential; für die anonyme Belegung unter /availability genügt bookings:read.

get/me/bookings
List the caller's own upcoming bookings
Persönlicher Schlüsselbookings:read

Returns the upcoming bookings owned by the member behind the personal API key in the club addressed via X-Tenant-Id, including cancelled ones (check cancelledAt). Management keys have no member identity and receive 403 FORBIDDEN.

Beispiel

curl "https://app.checkcourt.de/api/v1/me/bookings" \
  -H "Authorization: Bearer ck_user_…"

Antworten

  • 200Own upcoming bookings.
  • 401Missing or invalid API key.
  • 403Key lacks bookings:read or has no member identity.
200er-Schema anzeigen
  • bookingsobject[]
    • idstring
    • courtIdinteger
    • courtNamestring
    • typestring
    • datestring (date)
    • startTimestring
    • endTimestring
    • titlestring | null
    • cancelledAtstring | null (date-time)
    • cancelReasonstring | null
post/me/bookings
Book a court for yourself
Persönlicher Schlüssel

Creates a booking owned by the member behind the personal API key, in the club addressed via X-Tenant-Id. The full policy engine applies (booking hours, advance window, quotas, slot raster, court locks, time conflicts); policy denials come back as 422 BUSINESS_RULE. adminOverride: true additionally requires bookings:write (admins hold it by role).

Request-Body

  • courtIdintegerPflicht
  • datestring (date)Pflicht
  • startTimestringPflicht
  • endTimestringPflicht
  • titlestring
  • notesstring
  • bookingType"regular" | "training" | "mannschaft"
  • categoryIdstring
  • teamIdstring

    Required when bookingType is mannschaft.

  • playersobject[]

    Co-players. Members are referenced by userId, guests carry a guestName (guest fees may apply).

    • userIdstring
    • guestNamestring
    • isGuestbooleanPflicht
  • adminOverrideboolean

    Skips all policy attribute checks (booking hours, advance limit, quotas). Requires bookings:write. Hard integrity checks (court lock, time conflict, past date) still apply.

Beispiel

curl -X POST "https://app.checkcourt.de/api/v1/me/bookings" \
  -H "Authorization: Bearer ck_user_…" \
  -H "Content-Type: application/json" \
  -d '{"courtId":1,"date":"2026-06-15","startTime":"18:00","endTime":"19:00"}'

Antworten

  • 200The created booking.
  • 400Validation error (bad times, unknown forUserId, players not in this club).
  • 401Missing or invalid API key.
  • 403Key lacks bookings:write for forUserId/adminOverride, or no permission for this team.
  • 404Court or team not found.
  • 422Policy denial or time conflict. Policy denials include `canOverride`.
200er-Schema anzeigen
  • bookingobject
    • idstring

      Booking id (UUID).

    • courtIdinteger
    • type"regular" | "training" | "mannschaft"

      Booking kind. mannschaft bookings belong to a team and have no personal owner.

    • datestring (date)
    • startTimestring
    • endTimestring
    • titlestring | null
    • bookedBystring | null

      User id of the booking owner. null for mannschaft bookings.

    • teamIdstring | null
get/availability
Court occupancy for one day
Persönlicher SchlüsselManagement-Schlüsselbookings:read

Returns the busy intervals of every court for the given day: bookings and scheduled lock windows, each reduced to start/end time and a coarse kind. No booker names, titles or categories are included, which makes this endpoint safe for public-facing occupancy widgets (e.g. a club website showing which courts are free). Free slots are everything outside the returned intervals within the club's booking hours.

Parameter

  • datequery · string (date)Pflicht

    Calendar day to evaluate (YYYY-MM-DD)

Beispiel

curl "https://app.checkcourt.de/api/v1/availability?date=2026-06-15" \
  -H "Authorization: Bearer ck_mgmt_…"

Antworten

  • 200Success
  • 400Request is syntactically or semantically invalid
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • datestring (date)Pflicht
  • courtsobject[]Pflicht
    • courtIdintegerPflicht
    • courtNamestringPflicht
    • isLockedbooleanPflicht

      True while the court is locked entirely (independent of slots)

    • occupiedobject[]Pflicht
      • startTimestringPflicht

        Time of day as HH:MM or HH:MM:SS

      • endTimestringPflicht

        Time of day as HH:MM or HH:MM:SS

      • kind"booking" | "lock"Pflicht

        Whether the interval is a booking or a scheduled lock window

get/availability/slots
Bookable start times per court
Persönlicher SchlüsselManagement-Schlüsselbookings:read

Discovery endpoint for assistants and booking widgets: returns the start times that are actually bookable per court on the given day, taking existing bookings, court locks, booking hours, the slot raster, duration bounds, the advance-booking window, and season/month closures into account. POST /bookings remains the authoritative gate; a returned slot can still be lost to a concurrent booking.

Parameter

  • datequery · string (date)Pflicht
  • durationMinutesquery · integer

    Desired booking length. With an active slot raster, only durations that are a multiple of the raster interval yield slots.

Beispiel

curl "https://app.checkcourt.de/api/v1/availability/slots?date=2026-06-15" \
  -H "Authorization: Bearer ck_mgmt_…"

Antworten

  • 200Bookable start times per court (empty array for locked/closed courts).
  • 400Missing/malformed date or durationMinutes.
  • 401Missing or invalid API key.
  • 403Key lacks bookings:read.
200er-Schema anzeigen
  • datestring (date)
  • durationMinutesinteger
  • courtsobject[]
    • courtIdinteger
    • courtNamestring
    • slotsstring[]
get/bookings
All bookings of one day, with booker names
Persönlicher SchlüsselManagement-Schlüsselbookings:read_confidential

The reconciliation view for integrations: every booking of the given day including booker names, titles, check-in and cancellation state — exactly the personal data the anonymous /availability endpoint strips away, hence the confidential tier. Cancelled bookings are included (check cancelledAt).

With respectPrivacy=true the listing applies the same privacy rules as the member-facing booking plan and masks the booker identity where members opted out of showing their name.

Parameter

  • datequery · string (date)Pflicht
  • respectPrivacyquery · boolean

    Applies the member-facing privacy rules (booking-level showName, category default): bookings whose booker chose to hide their name come back with bookedBy and bookerName set to null. Use this for display boards and other surfaces that must not out-privilege the public booking plan, even though the key holds the confidential scope.

Beispiel

curl "https://app.checkcourt.de/api/v1/bookings?date=2026-06-15" \
  -H "Authorization: Bearer ck_mgmt_…"

Antworten

  • 200All bookings of the day.
  • 400Missing or malformed date.
  • 401Missing or invalid API key.
  • 403Key lacks bookings:read_confidential.
200er-Schema anzeigen
  • datestring (date)
  • bookingsobject[]
    • idstring
    • courtIdinteger
    • courtNamestring
    • typestring
    • datestring (date)
    • startTimestring
    • endTimestring
    • titlestring | null
    • bookedBystring | null

      User id of the owner; null for mannschaft bookings.

    • bookerNamestring | null
    • teamIdstring | null
    • checkedInAtstring | null (date-time)
    • cancelledAtstring | null (date-time)
    • cancelReasonstring | null
post/bookings
Book a court on behalf of a member
Persönlicher SchlüsselManagement-Schlüsselbookings:write

Club-administration endpoint: creates a booking on BEHALF of a member (forUserId is mandatory; the booking belongs to that member and consumes their quota). Booking for yourself is POST /me/bookings. The full policy engine applies; policy denials come back as 422 BUSINESS_RULE with canOverride telling bookings:write holders that a retry with adminOverride: true would succeed.

Request-Body

  • courtIdintegerPflicht
  • datestring (date)Pflicht
  • startTimestringPflicht
  • endTimestringPflicht
  • titlestring
  • notesstring
  • bookingType"regular" | "training" | "mannschaft"
  • categoryIdstring
  • teamIdstring

    Required when bookingType is mannschaft.

  • playersobject[]

    Co-players. Members are referenced by userId, guests carry a guestName (guest fees may apply).

    • userIdstring
    • guestNamestring
    • isGuestbooleanPflicht
  • forUserIdstringPflicht

    The member this booking is created FOR: it belongs to them and consumes their quota. Mandatory — booking for yourself is POST /me/bookings.

  • adminOverrideboolean

    Skips all policy attribute checks (booking hours, advance limit, quotas). Requires bookings:write. Hard integrity checks (court lock, time conflict, past date) still apply.

Beispiel

curl -X POST "https://app.checkcourt.de/api/v1/bookings" \
  -H "Authorization: Bearer ck_mgmt_…" \
  -H "Content-Type: application/json" \
  -d '{"courtId":1,"date":"2026-06-15","startTime":"18:00","endTime":"19:00","forUserId":"forUserId"}'

Antworten

  • 200The created booking.
  • 400Validation error (bad times, unknown forUserId, players not in this club).
  • 401Missing or invalid API key.
  • 403Key lacks bookings:write for forUserId/adminOverride, or no permission for this team.
  • 404Court or team not found.
  • 422Policy denial or time conflict. Policy denials include `canOverride`.
200er-Schema anzeigen
  • bookingobject
    • idstring

      Booking id (UUID).

    • courtIdinteger
    • type"regular" | "training" | "mannschaft"

      Booking kind. mannschaft bookings belong to a team and have no personal owner.

    • datestring (date)
    • startTimestring
    • endTimestring
    • titlestring | null
    • bookedBystring | null

      User id of the booking owner. null for mannschaft bookings.

    • teamIdstring | null
delete/bookings/{id}
Cancel a booking
Persönlicher SchlüsselManagement-Schlüsselbookings:cancel (only for foreign bookings / override)

Cancellation runs through the policy engine (cancellation deadline); denials come back as 422 BUSINESS_RULE with canOverride for bookings:cancel holders, who may retry with ?override=true. Past bookings can never be cancelled. The booking owner is notified by email.

Parameter

  • idpath · stringPflicht

    Booking id.

  • overridequery · boolean

    Skips policy checks (deadline). Requires bookings:cancel.

Beispiel

curl -X DELETE "https://app.checkcourt.de/api/v1/bookings/{id}" \
  -H "Authorization: Bearer ck_mgmt_…"

Antworten

  • 200Booking cancelled.
  • 401Missing or invalid API key.
  • 403Not the owner and key lacks bookings:cancel.
  • 404Booking not found.
  • 422Already cancelled, in the past, or policy deadline passed.
200er-Schema anzeigen
  • successbooleanPflicht

Plätze

get/courts
List all courts
Persönlicher SchlüsselManagement-Schlüsselcourts:read

Returns every court of the club, including locked and billing-locked ones, ordered by sortOrder. Use isLocked/isBillingLocked to decide whether a court is currently bookable, and activeMonths/seasonStart/seasonEnd for seasonal availability.

Beispiel

curl "https://app.checkcourt.de/api/v1/courts" \
  -H "Authorization: Bearer ck_mgmt_…"

Antworten

  • 200Success
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • courtsobject[]Pflicht
    • idintegerPflicht

      Numeric court id (stable, tenant-scoped)

    • tenantIdstring
    • namestringPflicht
    • surfacestringPflicht

      Free-text surface label, e.g. "Asche" or "Teppich"

    • isLockedbooleanPflicht

      True while the court is locked for booking

    • lockReasonstring | null

      Reason shown to members while locked

    • isBillingLockedboolean

      Locked by the billing system because the subscription does not cover this court. Cannot be lifted via the API.

    • lockedBystring | null

      User id of whoever locked the court

    • lockedAtstring | null (date-time)

      ISO 8601 timestamp

    • sortOrderintegerPflicht

      Display position, ascending

    • bookingNoticestring | null

      Short notice shown in the booking UI for this court

    • bookingNoticeUpdatedAtstring | null (date-time)

      ISO 8601 timestamp

    • activeMonthsinteger[]

      Months (1-12) in which the court is bookable. Empty means always.

    • seasonStartstring | null

      Season start as MM-DD; always set together with seasonEnd

    • seasonEndstring | null

      Season end as MM-DD

post/courts
Create a court
Persönlicher SchlüsselManagement-Schlüsselcourts:write

Creates a court and appends it to the end of the sort order. The number of courts is limited by the club's subscription plan; exceeding it returns 422. Season and notice fields can be set afterwards via PATCH.

Request-Body

  • namestringPflicht
  • surfacestringPflicht

Beispiel

curl -X POST "https://app.checkcourt.de/api/v1/courts" \
  -H "Authorization: Bearer ck_mgmt_…" \
  -H "Content-Type: application/json" \
  -d '{"name":"name","surface":"surface"}'

Antworten

  • 200Success
  • 400Request is syntactically or semantically invalid
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 422Request is valid but violates a business rule (limit reached, duplicate, protected resource)
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • courtobjectPflicht
    • idintegerPflicht

      Numeric court id (stable, tenant-scoped)

    • tenantIdstring
    • namestringPflicht
    • surfacestringPflicht

      Free-text surface label, e.g. "Asche" or "Teppich"

    • isLockedbooleanPflicht

      True while the court is locked for booking

    • lockReasonstring | null

      Reason shown to members while locked

    • isBillingLockedboolean

      Locked by the billing system because the subscription does not cover this court. Cannot be lifted via the API.

    • lockedBystring | null

      User id of whoever locked the court

    • lockedAtstring | null (date-time)

      ISO 8601 timestamp

    • sortOrderintegerPflicht

      Display position, ascending

    • bookingNoticestring | null

      Short notice shown in the booking UI for this court

    • bookingNoticeUpdatedAtstring | null (date-time)

      ISO 8601 timestamp

    • activeMonthsinteger[]

      Months (1-12) in which the court is bookable. Empty means always.

    • seasonStartstring | null

      Season start as MM-DD; always set together with seasonEnd

    • seasonEndstring | null

      Season end as MM-DD

post/courts/reorder
Reorder courts
Persönlicher SchlüsselManagement-Schlüsselcourts:write

Replaces the display order. Send ALL court ids of the club in the desired order; the array index becomes the new sortOrder.

Request-Body

  • courtIdsinteger[]Pflicht

Beispiel

curl -X POST "https://app.checkcourt.de/api/v1/courts/reorder" \
  -H "Authorization: Bearer ck_mgmt_…" \
  -H "Content-Type: application/json" \
  -d '{"courtIds":[]}'

Antworten

  • 200Success
  • 400Request is syntactically or semantically invalid
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • successbooleanPflicht
get/courts/{id}
Court details with upcoming bookings
Persönlicher SchlüsselManagement-Schlüsselcourts:read_confidential

Returns the court plus its next bookings (capped at 20, starting today) and any scheduled lock windows. Bookings include the booker's display name, which is why this endpoint requires the confidential read scope rather than plain courts:read.

Parameter

  • idpath · integerPflicht

    Numeric court id

Beispiel

curl "https://app.checkcourt.de/api/v1/courts/{id}" \
  -H "Authorization: Bearer ck_mgmt_…"

Antworten

  • 200Success
  • 400Request is syntactically or semantically invalid
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 404Resource does not exist in this club
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • courtobjectPflicht
    • idintegerPflicht

      Numeric court id (stable, tenant-scoped)

    • tenantIdstring
    • namestringPflicht
    • surfacestringPflicht

      Free-text surface label, e.g. "Asche" or "Teppich"

    • isLockedbooleanPflicht

      True while the court is locked for booking

    • lockReasonstring | null

      Reason shown to members while locked

    • isBillingLockedboolean

      Locked by the billing system because the subscription does not cover this court. Cannot be lifted via the API.

    • lockedBystring | null

      User id of whoever locked the court

    • lockedAtstring | null (date-time)

      ISO 8601 timestamp

    • sortOrderintegerPflicht

      Display position, ascending

    • bookingNoticestring | null

      Short notice shown in the booking UI for this court

    • bookingNoticeUpdatedAtstring | null (date-time)

      ISO 8601 timestamp

    • activeMonthsinteger[]

      Months (1-12) in which the court is bookable. Empty means always.

    • seasonStartstring | null

      Season start as MM-DD; always set together with seasonEnd

    • seasonEndstring | null

      Season end as MM-DD

  • upcomingBookingsobject[]Pflicht

    Next bookings from today on, capped at 20

    • idstring

      Booking id (CUID)

    • typestring

      Booking type, e.g. "regular" or "mannschaft"

    • datestring (date)
    • startTimestring

      Time of day as HH:MM or HH:MM:SS

    • endTimestring

      Time of day as HH:MM or HH:MM:SS

    • titlestring | null
    • bookedByNamestring | null

      Display name of the booker, or the team name for team bookings

  • lockRangesobject[]Pflicht
    • fromDatestring (date)
    • toDatestring (date)
    • fromTimestring

      Time of day as HH:MM or HH:MM:SS

    • toTimestring

      Time of day as HH:MM or HH:MM:SS

    • titlestring | null
  • lockedByUserstring | null

    Display name of the user who locked the court

  • isBillingLockedboolean
patch/courts/{id}
Update a court
Persönlicher SchlüsselManagement-Schlüsselcourts:write

Partial update: omitted fields stay unchanged, explicit null clears nullable fields. seasonStart and seasonEnd must be set or cleared together. The current month cannot be removed from activeMonths while it is active, because that would strand existing bookings.

Parameter

  • idpath · integerPflicht

    Numeric court id

Request-Body

  • namestring
  • surfacestring
  • bookingNoticestring | null
  • activeMonthsinteger[]
  • seasonStartstring | null

    MM-DD

  • seasonEndstring | null

    MM-DD

Beispiel

curl -X PATCH "https://app.checkcourt.de/api/v1/courts/{id}" \
  -H "Authorization: Bearer ck_mgmt_…" \
  -H "Content-Type: application/json" \
  -d '{}'

Antworten

  • 200Success
  • 400Request is syntactically or semantically invalid
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 404Resource does not exist in this club
  • 422Request is valid but violates a business rule (limit reached, duplicate, protected resource)
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • courtIdintegerPflicht
delete/courts/{id}
Delete a court
Persönlicher SchlüsselManagement-Schlüsselcourts:write

Destructive: cancels every future booking on the court and emails the affected members a summary. Courts that are part of the current billing period cannot be deleted (422) unless the caller is a platform support user passing forceBillingActive=true.

Parameter

  • idpath · integerPflicht

    Numeric court id

  • forceBillingActivequery · boolean

    Platform support only: delete even though the court is billed this month

Beispiel

curl -X DELETE "https://app.checkcourt.de/api/v1/courts/{id}" \
  -H "Authorization: Bearer ck_mgmt_…"

Antworten

  • 200Success
  • 400Request is syntactically or semantically invalid
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 404Resource does not exist in this club
  • 422Request is valid but violates a business rule (limit reached, duplicate, protected resource)
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • cancelledBookingsintegerPflicht

    Number of future bookings that were cancelled

post/courts/{id}/lock
Lock a court
Persönlicher SchlüsselManagement-Schlüsselcourts:write

Without dates, the court is locked immediately and indefinitely until unlocked. With fromDate/toDate (both required together) a scheduled lock window is created; fromTime/toTime default to 07:00-21:00. Future bookings overlapping the lock are cancelled automatically and the bookers are notified by email. The reason is displayed to members in the booking UI.

Parameter

  • idpath · integerPflicht

    Numeric court id

Request-Body

  • reasonstringPflicht
  • fromDatestring (date)
  • toDatestring (date)
  • fromTimestring

    Time of day as HH:MM or HH:MM:SS

  • toTimestring

    Time of day as HH:MM or HH:MM:SS

Beispiel

curl -X POST "https://app.checkcourt.de/api/v1/courts/{id}/lock" \
  -H "Authorization: Bearer ck_mgmt_…" \
  -H "Content-Type: application/json" \
  -d '{"reason":"reason"}'

Antworten

  • 200Success
  • 400Request is syntactically or semantically invalid
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 404Resource does not exist in this club
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • courtIdintegerPflicht
post/courts/{id}/unlock
Unlock a court
Persönlicher SchlüsselManagement-Schlüsselcourts:write

Lifts a manual lock and removes scheduled lock windows. Billing locks (isBillingLocked) are managed by the subscription system and cannot be lifted here (422).

Parameter

  • idpath · integerPflicht

    Numeric court id

Beispiel

curl -X POST "https://app.checkcourt.de/api/v1/courts/{id}/unlock" \
  -H "Authorization: Bearer ck_mgmt_…"

Antworten

  • 200Success
  • 400Request is syntactically or semantically invalid
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 404Resource does not exist in this club
  • 422Request is valid but violates a business rule (limit reached, duplicate, protected resource)
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • courtIdintegerPflicht

Mitglieder

Namenslisten erfordern members:read; Kontaktdaten und weitere personenbezogene Daten erfordern members:read_confidential.

get/members
Search members (paginated)
Persönlicher SchlüsselManagement-Schlüsselmembers:read_confidential

Returns the full member directory including contact data, 20 per page. search matches name, email, forwarding email, member number and member code (case-insensitive substring). Members awaiting admin approval are sorted first, then alphabetically by name.

Parameter

  • searchquery · string

    Substring search across name, email, forwarding email, member number, member code

  • rolequery · "member" | "trainer" | "admin"

    Only members with this role

  • pagequery · integer

    1-based page number

Beispiel

curl "https://app.checkcourt.de/api/v1/members" \
  -H "Authorization: Bearer ck_mgmt_…"

Antworten

  • 200Success
  • 400Request is syntactically or semantically invalid
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • membersobject[]Pflicht
    • idstringPflicht

      User id (CUID). Use this in /members/{id} paths.

    • namestringPflicht
    • emailstring (email)Pflicht
    • forwardingEmailstring | null (email)

      Set for accounts without their own mailbox: mail is sent here instead, and email is a synthetic address

    • memberNumberstring | null

      Club-assigned member number, unique per tenant

    • role"member" | "trainer" | "admin"Pflicht

      Tenant role of a member

    • guestFeesAccumulatedinteger

      Amount in euro cents

    • emailVerifiedboolean
    • adminApprovalPendingboolean

      True while a self-registered member awaits admin approval

  • totalintegerPflicht

    Total matching members across all pages

  • pageintegerPflicht
  • pageSizeintegerPflicht
  • totalPagesintegerPflicht
post/members
Invite or create a member
Persönlicher SchlüsselManagement-Schlüsselmembers:invite

Adds a member to the club. Three flows, decided by the input: 1. Email already has an account (in no other club): the existing user is added to this club. 2. New email: a new account is created and, unless sendEmail=false, a welcome mail with a claim link is sent. 3. `noOwnEmail=true`: for members without their own mailbox. Creates an account with a synthetic address, stores the given email as forwarding address and requires a password (min 8 chars) the member uses to log in.

Fails with 422 when the club's member limit is reached, the member number is taken, the email already belongs to this club, or the data processing agreement (AVV) has not been signed yet.

Request-Body

  • emailstring (email)Pflicht
  • namestringPflicht
  • role"member" | "trainer" | "admin"Pflicht

    Tenant role of a member

  • sendEmailbooleandefault: true

    Send the welcome email

  • noOwnEmailbooleandefault: false

    Create a forwarding-only account (flow 3)

  • passwordstring

    Required when noOwnEmail=true

  • memberNumberstring

Beispiel

curl -X POST "https://app.checkcourt.de/api/v1/members" \
  -H "Authorization: Bearer ck_mgmt_…" \
  -H "Content-Type: application/json" \
  -d '{"email":"email","name":"name","role":"member"}'

Antworten

  • 200Success
  • 400Request is syntactically or semantically invalid
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 422Request is valid but violates a business rule (limit reached, duplicate, protected resource)
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • successbooleanPflicht
get/members/{id}
Get one member
Persönlicher SchlüsselManagement-Schlüsselmembers:read_confidential

Full member record including phone, member code and creation date.

Parameter

  • idpath · stringPflicht

    User id of the member (the id field from list responses)

Beispiel

curl "https://app.checkcourt.de/api/v1/members/{id}" \
  -H "Authorization: Bearer ck_mgmt_…"

Antworten

  • 200Success
  • 400Request is syntactically or semantically invalid
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 404Resource does not exist in this club
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • memberobjectPflicht
    • idstringPflicht

      User id (CUID)

    • namestringPflicht
    • emailstring (email)Pflicht
    • forwardingEmailstring | null (email)
    • role"member" | "trainer" | "admin"Pflicht

      Tenant role of a member

    • memberNumberstring | null
    • mitgliedscodestring | null

      Short member code used for on-site identification

    • phonestring | null
    • guestFeesAccumulatedinteger

      Amount in euro cents

    • createdAtstring (date-time)

      ISO 8601 timestamp

    • emailVerifiedboolean
    • adminApprovalPendingboolean
patch/members/{id}
Update a member
Persönlicher SchlüsselManagement-Schlüsselmembers:write

name, email and role are required (send the current values to keep them); phone and memberNumber are optional. For forwarding-only accounts the email update changes the forwarding address, not the login address. If the user is also a member of another club, name/email/phone are left untouched (they are account-level) and only role and member number change. Sessions cannot edit their own account; management keys are exempt from that rule. Member numbers are unique per club (422 on collision).

Parameter

  • idpath · stringPflicht

    User id of the member (the id field from list responses)

Request-Body

  • namestringPflicht
  • emailstring (email)Pflicht
  • role"member" | "trainer" | "admin"Pflicht

    Tenant role of a member

  • phonestring
  • memberNumberstring

Beispiel

curl -X PATCH "https://app.checkcourt.de/api/v1/members/{id}" \
  -H "Authorization: Bearer ck_mgmt_…" \
  -H "Content-Type: application/json" \
  -d '{"name":"name","email":"email","role":"member"}'

Antworten

  • 200Success
  • 400Request is syntactically or semantically invalid
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 404Resource does not exist in this club
  • 422Request is valid but violates a business rule (limit reached, duplicate, protected resource)
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • successbooleanPflicht
delete/members/{id}
End a membership
Persönlicher SchlüsselManagement-Schlüsselmembers:delete

Removes the member from the club with a full cascade: future bookings are cancelled (with email notification), open guest fees are resolved according to orphanedFeeAction, and if this was the user's only club the account is anonymized. Members who lead a team cannot be deleted until leadership is handed over (422). The response summarizes what happened.

Parameter

  • idpath · stringPflicht

    User id of the member (the id field from list responses)

  • orphanedFeeActionquery · "cancelled" | "paid"

    Write off open guest fees (cancelled) or mark them as paid (paid)

Beispiel

curl -X DELETE "https://app.checkcourt.de/api/v1/members/{id}" \
  -H "Authorization: Bearer ck_mgmt_…"

Antworten

  • 200Success
  • 400Request is syntactically or semantically invalid
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 404Resource does not exist in this club
  • 422Request is valid but violates a business rule (limit reached, duplicate, protected resource)
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • successbooleanPflicht
  • cancelledBookingCountinteger
  • resolvedFeeCountinteger
  • resolvedFeeTotalCentsinteger

    Amount in euro cents

  • anonymizedboolean

    True if the account was anonymized because no other membership remained

Mannschaften

get/teams
List all teams
Persönlicher SchlüsselManagement-Schlüsselteams:read

Returns every team with aggregated counts (members, upcoming matches, recurring trainings) and the next scheduled match, so an overview UI needs no follow-up requests.

Beispiel

curl "https://app.checkcourt.de/api/v1/teams" \
  -H "Authorization: Bearer ck_mgmt_…"

Antworten

  • 200Success
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • teamsobject[]Pflicht
post/teams
Create a team
Persönlicher SchlüsselManagement-Schlüsselteams:write

Creates an empty team. Add players and leaders afterwards via the team-members endpoint.

Request-Body

  • namestringPflicht
  • ligastring
  • spielklasse"herren" | "damen" | "mixed" | "jugend"
  • farbestring

    Hex color

Beispiel

curl -X POST "https://app.checkcourt.de/api/v1/teams" \
  -H "Authorization: Bearer ck_mgmt_…" \
  -H "Content-Type: application/json" \
  -d '{"name":"name"}'

Antworten

  • 200Success
  • 400Request is syntactically or semantically invalid
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • teamIdstringPflicht
get/teams/{id}
Team details
Persönlicher SchlüsselManagement-Schlüsselteams:read

Returns the team with its roster (players and leaders), upcoming matches, one-off and recurring trainings. canManage tells whether the calling actor could use the management endpoints for this team.

Parameter

  • idpath · stringPflicht

    Team id

Beispiel

curl "https://app.checkcourt.de/api/v1/teams/{id}" \
  -H "Authorization: Bearer ck_mgmt_…"

Antworten

  • 200Success
  • 400Request is syntactically or semantically invalid
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 404Resource does not exist in this club
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • teamobjectPflicht
    • idstringPflicht

      Team id (CUID)

    • tenantIdstring
    • namestringPflicht
    • ligastring | null

      League label, free text

    • spielklasse"herren" | "damen" | "mixed" | "jugend" | "null"

      Competition class of a team

    • farbestring | null

      Hex color used to mark the team's bookings

    • createdAtstring (date-time)

      ISO 8601 timestamp

    • updatedAtstring (date-time)

      ISO 8601 timestamp

  • membersobject[]Pflicht
    • tenantUserIdstringPflicht

      Membership id (tenantUser). This is NOT the user id; use it when adding/removing team members.

    • role"player" | "leader"Pflicht

      A person can appear twice: once as player and once as leader

    • userIdstringPflicht
    • memberNumberstring | null
    • namestringPflicht
  • matchesobject[]Pflicht

    Upcoming matches

    • idstring
    • datestring (date)
    • startTimestring

      Time of day as HH:MM or HH:MM:SS

    • endTimestring

      Time of day as HH:MM or HH:MM:SS

    • titlestring | null
    • isAwayboolean
    • opponentstring | null
    • locationstring | null
    • courtNamesstring[]

      Home matches block one or more courts

  • oneOffTrainingsobject[]

    One-off training bookings (raw booking rows)

  • trainingsobject[]

    Recurring weekly trainings

  • canManagebooleanPflicht

    Whether the calling actor may manage this team (admin role or team leader)

patch/teams/{id}
Update a team
Persönlicher SchlüsselManagement-Schlüsselteams:read

Updates name, league, class or color. spielklasse: null clears the class.

Beyond the scope, this endpoint needs management rights for the specific team: the actor must have the admin role or be a leader of this team. Management keys carry no role and are therefore always rejected here; use a personal key of an admin or team leader.

Parameter

  • idpath · stringPflicht

    Team id

Request-Body

  • namestringPflicht
  • ligastring
  • spielklasse"herren" | "damen" | "mixed" | "jugend" | "null"

    Competition class of a team

  • farbestring

Beispiel

curl -X PATCH "https://app.checkcourt.de/api/v1/teams/{id}" \
  -H "Authorization: Bearer ck_mgmt_…" \
  -H "Content-Type: application/json" \
  -d '{"name":"name"}'

Antworten

  • 200Success
  • 400Request is syntactically or semantically invalid
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 404Resource does not exist in this club
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • teamIdstringPflicht
delete/teams/{id}
Delete a team
Persönlicher SchlüsselManagement-Schlüsselteams:write

Deletes the team and its roster assignments. Team bookings are kept but lose their team link.

Parameter

  • idpath · stringPflicht

    Team id

Beispiel

curl -X DELETE "https://app.checkcourt.de/api/v1/teams/{id}" \
  -H "Authorization: Bearer ck_mgmt_…"

Antworten

  • 200Success
  • 400Request is syntactically or semantically invalid
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 404Resource does not exist in this club
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • teamIdstringPflicht
post/teams/{id}/members
Add a member to a team
Persönlicher SchlüsselManagement-Schlüsselteams:read

Adds a club member to the team as player or leader. The same person can hold both roles (two separate entries). Note that tenantUserId is the membership id from the team detail response, not the user id.

Beyond the scope, this endpoint needs management rights for the specific team: the actor must have the admin role or be a leader of this team. Management keys carry no role and are therefore always rejected here; use a personal key of an admin or team leader.

Parameter

  • idpath · stringPflicht

    Team id

Request-Body

  • tenantUserIdstringPflicht

    Membership id (tenantUser)

  • role"player" | "leader"Pflicht

Beispiel

curl -X POST "https://app.checkcourt.de/api/v1/teams/{id}/members" \
  -H "Authorization: Bearer ck_mgmt_…" \
  -H "Content-Type: application/json" \
  -d '{"tenantUserId":"tenantUserId","role":"player"}'

Antworten

  • 200Success
  • 400Request is syntactically or semantically invalid
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 404Resource does not exist in this club
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • teamIdstringPflicht
delete/teams/{id}/members/{userId}
Remove a member from a team
Persönlicher SchlüsselManagement-Schlüsselteams:read

Removes one role assignment. Because a person can be player and leader at once, the role query parameter picks which assignment to remove.

Beyond the scope, this endpoint needs management rights for the specific team: the actor must have the admin role or be a leader of this team. Management keys carry no role and are therefore always rejected here; use a personal key of an admin or team leader.

Parameter

  • idpath · stringPflicht

    Team id

  • userIdpath · stringPflicht

    Membership id (tenantUser) of the assignment

  • rolequery · "player" | "leader"Pflicht

    Which role assignment to remove

Beispiel

curl -X DELETE "https://app.checkcourt.de/api/v1/teams/{id}/members/{userId}?role=player" \
  -H "Authorization: Bearer ck_mgmt_…"

Antworten

  • 200Success
  • 400Request is syntactically or semantically invalid
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 404Resource does not exist in this club
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • successbooleanPflicht

Buchungsrichtlinien

get/policies
List booking policies
Persönlicher SchlüsselManagement-Schlüsselpolicies:read_confidential

Policies form the booking rule engine: each policy has conditions (which booking attempts it applies to) and attributes (the rule values it contributes). On every booking attempt, enabled policies are evaluated in ascending priority; for each attribute the first policy that sets it wins, and the default policy provides the fallback values. This endpoint returns all non-default policies ordered by priority. Fetch the default policy via its id if needed.

Beispiel

curl "https://app.checkcourt.de/api/v1/policies" \
  -H "Authorization: Bearer ck_mgmt_…"

Antworten

  • 200Success
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • policiesobject[]Pflicht
    • idstringPflicht
    • tenantIdstring
    • namestringPflicht
    • descriptionstring | null
    • priorityintegerPflicht

      Lower number = evaluated earlier

    • isEnabledbooleanPflicht
    • isDefaultbooleanPflicht

      Exactly one default policy exists per tenant. It matches everything, cannot be renamed or deleted.

    • conditionsobject

      Selects which booking attempts a policy applies to. Omitted fields match everything; all present fields must match (AND).

      • daysOfWeek"mon" | "tue" | "wed" | "thu" | "fri" | "sat" | "sun"[]
      • timeOfDayobject
        • fromstring

          Time of day as HH:MM or HH:MM:SS

        • tostring

          Time of day as HH:MM or HH:MM:SS

      • dateRangeobject
        • fromstring (date)
        • tostring (date)
      • courtIdsinteger[]
      • categoryIdsstring[]
      • bookerRoles"member" | "trainer" | "admin"[]
      • bookerTeamIdsstring[]
      • bookerGroupIdsstring[]
      • actions"create" | "cancel" | "edit"[]
    • attributesobject

      Rule values a policy contributes for matching attempts. Policies are evaluated by ascending priority; the first policy that sets an attribute wins, the default policy fills the rest.

      • allowboolean

        Hard allow/deny for matching attempts

      • denyReasonstring

        Message shown when allow=false

      • maxBookingMinutesinteger
      • minBookingMinutesinteger
      • maxAdvanceBookingDaysinteger

        How far into the future bookings may start

      • maxActiveBookingsinteger

        Cap on simultaneously active (future) bookings per user

      • maxBookingsPerDayPerUserinteger
      • maxParallelBookingsinteger

        Cap on overlapping bookings per user across courts

      • cancellationDeadlineHoursinteger
      • slotStartIntervalMinutesinteger

        Allowed booking start raster, e.g. 30 for :00/:30

      • slotStartOffsetMinutesinteger
      • bookingStartTimestring

        Time of day as HH:MM or HH:MM:SS

      • bookingEndTimestring

        Time of day as HH:MM or HH:MM:SS

      • requireTeammateboolean

        Booking requires naming at least one teammate

      • isNameableboolean

        Whether bookings may carry a free-text title

    • createdAtstring (date-time)

      ISO 8601 timestamp

    • updatedAtstring (date-time)

      ISO 8601 timestamp

post/policies
Create a policy
Persönlicher SchlüsselManagement-Schlüsselpolicies:write

Policies form the booking rule engine: each policy has conditions (which booking attempts it applies to) and attributes (the rule values it contributes). On every booking attempt, enabled policies are evaluated in ascending priority; for each attribute the first policy that sets it wins, and the default policy provides the fallback values. New policies are appended with the lowest priority (evaluated last before the default). Cross-field validation applies: time and date ranges must be ordered, min/max durations consistent.

Request-Body

  • namestring
  • descriptionstring
  • isEnabledbooleandefault: true
  • conditionsobject

    Selects which booking attempts a policy applies to. Omitted fields match everything; all present fields must match (AND).

    • daysOfWeek"mon" | "tue" | "wed" | "thu" | "fri" | "sat" | "sun"[]
    • timeOfDayobject
      • fromstring

        Time of day as HH:MM or HH:MM:SS

      • tostring

        Time of day as HH:MM or HH:MM:SS

    • dateRangeobject
      • fromstring (date)
      • tostring (date)
    • courtIdsinteger[]
    • categoryIdsstring[]
    • bookerRoles"member" | "trainer" | "admin"[]
    • bookerTeamIdsstring[]
    • bookerGroupIdsstring[]
    • actions"create" | "cancel" | "edit"[]
  • attributesobject

    Rule values a policy contributes for matching attempts. Policies are evaluated by ascending priority; the first policy that sets an attribute wins, the default policy fills the rest.

    • allowboolean

      Hard allow/deny for matching attempts

    • denyReasonstring

      Message shown when allow=false

    • maxBookingMinutesinteger
    • minBookingMinutesinteger
    • maxAdvanceBookingDaysinteger

      How far into the future bookings may start

    • maxActiveBookingsinteger

      Cap on simultaneously active (future) bookings per user

    • maxBookingsPerDayPerUserinteger
    • maxParallelBookingsinteger

      Cap on overlapping bookings per user across courts

    • cancellationDeadlineHoursinteger
    • slotStartIntervalMinutesinteger

      Allowed booking start raster, e.g. 30 for :00/:30

    • slotStartOffsetMinutesinteger
    • bookingStartTimestring

      Time of day as HH:MM or HH:MM:SS

    • bookingEndTimestring

      Time of day as HH:MM or HH:MM:SS

    • requireTeammateboolean

      Booking requires naming at least one teammate

    • isNameableboolean

      Whether bookings may carry a free-text title

Beispiel

curl -X POST "https://app.checkcourt.de/api/v1/policies" \
  -H "Authorization: Bearer ck_mgmt_…" \
  -H "Content-Type: application/json" \
  -d '{}'

Antworten

  • 200Success
  • 400Request is syntactically or semantically invalid
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • policyobjectPflicht
    • idstringPflicht
    • tenantIdstring
    • namestringPflicht
    • descriptionstring | null
    • priorityintegerPflicht

      Lower number = evaluated earlier

    • isEnabledbooleanPflicht
    • isDefaultbooleanPflicht

      Exactly one default policy exists per tenant. It matches everything, cannot be renamed or deleted.

    • conditionsobject

      Selects which booking attempts a policy applies to. Omitted fields match everything; all present fields must match (AND).

      • daysOfWeek"mon" | "tue" | "wed" | "thu" | "fri" | "sat" | "sun"[]
      • timeOfDayobject
        • fromstring

          Time of day as HH:MM or HH:MM:SS

        • tostring

          Time of day as HH:MM or HH:MM:SS

      • dateRangeobject
        • fromstring (date)
        • tostring (date)
      • courtIdsinteger[]
      • categoryIdsstring[]
      • bookerRoles"member" | "trainer" | "admin"[]
      • bookerTeamIdsstring[]
      • bookerGroupIdsstring[]
      • actions"create" | "cancel" | "edit"[]
    • attributesobject

      Rule values a policy contributes for matching attempts. Policies are evaluated by ascending priority; the first policy that sets an attribute wins, the default policy fills the rest.

      • allowboolean

        Hard allow/deny for matching attempts

      • denyReasonstring

        Message shown when allow=false

      • maxBookingMinutesinteger
      • minBookingMinutesinteger
      • maxAdvanceBookingDaysinteger

        How far into the future bookings may start

      • maxActiveBookingsinteger

        Cap on simultaneously active (future) bookings per user

      • maxBookingsPerDayPerUserinteger
      • maxParallelBookingsinteger

        Cap on overlapping bookings per user across courts

      • cancellationDeadlineHoursinteger
      • slotStartIntervalMinutesinteger

        Allowed booking start raster, e.g. 30 for :00/:30

      • slotStartOffsetMinutesinteger
      • bookingStartTimestring

        Time of day as HH:MM or HH:MM:SS

      • bookingEndTimestring

        Time of day as HH:MM or HH:MM:SS

      • requireTeammateboolean

        Booking requires naming at least one teammate

      • isNameableboolean

        Whether bookings may carry a free-text title

    • createdAtstring (date-time)

      ISO 8601 timestamp

    • updatedAtstring (date-time)

      ISO 8601 timestamp

get/policies/{id}
Get one policy
Persönlicher SchlüsselManagement-Schlüsselpolicies:read_confidential

Parameter

  • idpath · stringPflicht

    Policy id

Beispiel

curl "https://app.checkcourt.de/api/v1/policies/{id}" \
  -H "Authorization: Bearer ck_mgmt_…"

Antworten

  • 200Success
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 404Resource does not exist in this club
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • idstringPflicht
  • tenantIdstring
  • namestringPflicht
  • descriptionstring | null
  • priorityintegerPflicht

    Lower number = evaluated earlier

  • isEnabledbooleanPflicht
  • isDefaultbooleanPflicht

    Exactly one default policy exists per tenant. It matches everything, cannot be renamed or deleted.

  • conditionsobject

    Selects which booking attempts a policy applies to. Omitted fields match everything; all present fields must match (AND).

    • daysOfWeek"mon" | "tue" | "wed" | "thu" | "fri" | "sat" | "sun"[]
    • timeOfDayobject
      • fromstring

        Time of day as HH:MM or HH:MM:SS

      • tostring

        Time of day as HH:MM or HH:MM:SS

    • dateRangeobject
      • fromstring (date)
      • tostring (date)
    • courtIdsinteger[]
    • categoryIdsstring[]
    • bookerRoles"member" | "trainer" | "admin"[]
    • bookerTeamIdsstring[]
    • bookerGroupIdsstring[]
    • actions"create" | "cancel" | "edit"[]
  • attributesobject

    Rule values a policy contributes for matching attempts. Policies are evaluated by ascending priority; the first policy that sets an attribute wins, the default policy fills the rest.

    • allowboolean

      Hard allow/deny for matching attempts

    • denyReasonstring

      Message shown when allow=false

    • maxBookingMinutesinteger
    • minBookingMinutesinteger
    • maxAdvanceBookingDaysinteger

      How far into the future bookings may start

    • maxActiveBookingsinteger

      Cap on simultaneously active (future) bookings per user

    • maxBookingsPerDayPerUserinteger
    • maxParallelBookingsinteger

      Cap on overlapping bookings per user across courts

    • cancellationDeadlineHoursinteger
    • slotStartIntervalMinutesinteger

      Allowed booking start raster, e.g. 30 for :00/:30

    • slotStartOffsetMinutesinteger
    • bookingStartTimestring

      Time of day as HH:MM or HH:MM:SS

    • bookingEndTimestring

      Time of day as HH:MM or HH:MM:SS

    • requireTeammateboolean

      Booking requires naming at least one teammate

    • isNameableboolean

      Whether bookings may carry a free-text title

  • createdAtstring (date-time)

    ISO 8601 timestamp

  • updatedAtstring (date-time)

    ISO 8601 timestamp

patch/policies/{id}
Update a policy
Persönlicher SchlüsselManagement-Schlüsselpolicies:write

Replaces the given fields. The default policy is special: it cannot be renamed, its conditions are immutable (it always matches everything), and its attributes can only be extended so that every attribute keeps a fallback value.

Parameter

  • idpath · stringPflicht

    Policy id

Request-Body

  • namestring
  • descriptionstring
  • isEnabledbooleandefault: true
  • conditionsobject

    Selects which booking attempts a policy applies to. Omitted fields match everything; all present fields must match (AND).

    • daysOfWeek"mon" | "tue" | "wed" | "thu" | "fri" | "sat" | "sun"[]
    • timeOfDayobject
      • fromstring

        Time of day as HH:MM or HH:MM:SS

      • tostring

        Time of day as HH:MM or HH:MM:SS

    • dateRangeobject
      • fromstring (date)
      • tostring (date)
    • courtIdsinteger[]
    • categoryIdsstring[]
    • bookerRoles"member" | "trainer" | "admin"[]
    • bookerTeamIdsstring[]
    • bookerGroupIdsstring[]
    • actions"create" | "cancel" | "edit"[]
  • attributesobject

    Rule values a policy contributes for matching attempts. Policies are evaluated by ascending priority; the first policy that sets an attribute wins, the default policy fills the rest.

    • allowboolean

      Hard allow/deny for matching attempts

    • denyReasonstring

      Message shown when allow=false

    • maxBookingMinutesinteger
    • minBookingMinutesinteger
    • maxAdvanceBookingDaysinteger

      How far into the future bookings may start

    • maxActiveBookingsinteger

      Cap on simultaneously active (future) bookings per user

    • maxBookingsPerDayPerUserinteger
    • maxParallelBookingsinteger

      Cap on overlapping bookings per user across courts

    • cancellationDeadlineHoursinteger
    • slotStartIntervalMinutesinteger

      Allowed booking start raster, e.g. 30 for :00/:30

    • slotStartOffsetMinutesinteger
    • bookingStartTimestring

      Time of day as HH:MM or HH:MM:SS

    • bookingEndTimestring

      Time of day as HH:MM or HH:MM:SS

    • requireTeammateboolean

      Booking requires naming at least one teammate

    • isNameableboolean

      Whether bookings may carry a free-text title

Beispiel

curl -X PATCH "https://app.checkcourt.de/api/v1/policies/{id}" \
  -H "Authorization: Bearer ck_mgmt_…" \
  -H "Content-Type: application/json" \
  -d '{}'

Antworten

  • 200Success
  • 400Request is syntactically or semantically invalid
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 404Resource does not exist in this club
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • policyobjectPflicht
    • idstringPflicht
    • tenantIdstring
    • namestringPflicht
    • descriptionstring | null
    • priorityintegerPflicht

      Lower number = evaluated earlier

    • isEnabledbooleanPflicht
    • isDefaultbooleanPflicht

      Exactly one default policy exists per tenant. It matches everything, cannot be renamed or deleted.

    • conditionsobject

      Selects which booking attempts a policy applies to. Omitted fields match everything; all present fields must match (AND).

      • daysOfWeek"mon" | "tue" | "wed" | "thu" | "fri" | "sat" | "sun"[]
      • timeOfDayobject
        • fromstring

          Time of day as HH:MM or HH:MM:SS

        • tostring

          Time of day as HH:MM or HH:MM:SS

      • dateRangeobject
        • fromstring (date)
        • tostring (date)
      • courtIdsinteger[]
      • categoryIdsstring[]
      • bookerRoles"member" | "trainer" | "admin"[]
      • bookerTeamIdsstring[]
      • bookerGroupIdsstring[]
      • actions"create" | "cancel" | "edit"[]
    • attributesobject

      Rule values a policy contributes for matching attempts. Policies are evaluated by ascending priority; the first policy that sets an attribute wins, the default policy fills the rest.

      • allowboolean

        Hard allow/deny for matching attempts

      • denyReasonstring

        Message shown when allow=false

      • maxBookingMinutesinteger
      • minBookingMinutesinteger
      • maxAdvanceBookingDaysinteger

        How far into the future bookings may start

      • maxActiveBookingsinteger

        Cap on simultaneously active (future) bookings per user

      • maxBookingsPerDayPerUserinteger
      • maxParallelBookingsinteger

        Cap on overlapping bookings per user across courts

      • cancellationDeadlineHoursinteger
      • slotStartIntervalMinutesinteger

        Allowed booking start raster, e.g. 30 for :00/:30

      • slotStartOffsetMinutesinteger
      • bookingStartTimestring

        Time of day as HH:MM or HH:MM:SS

      • bookingEndTimestring

        Time of day as HH:MM or HH:MM:SS

      • requireTeammateboolean

        Booking requires naming at least one teammate

      • isNameableboolean

        Whether bookings may carry a free-text title

    • createdAtstring (date-time)

      ISO 8601 timestamp

    • updatedAtstring (date-time)

      ISO 8601 timestamp

delete/policies/{id}
Delete a policy
Persönlicher SchlüsselManagement-Schlüsselpolicies:write

The default policy cannot be deleted (422).

Parameter

  • idpath · stringPflicht

    Policy id

Beispiel

curl -X DELETE "https://app.checkcourt.de/api/v1/policies/{id}" \
  -H "Authorization: Bearer ck_mgmt_…"

Antworten

  • 200Success
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 404Resource does not exist in this club
  • 422Request is valid but violates a business rule (limit reached, duplicate, protected resource)
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • successbooleanPflicht
  • idstringPflicht
post/policies/{id}/toggle
Enable or disable a policy
Persönlicher SchlüsselManagement-Schlüsselpolicies:write

Disabled policies are skipped during evaluation but keep their priority slot.

Parameter

  • idpath · stringPflicht

    Policy id

Request-Body

  • enabledbooleanPflicht

Beispiel

curl -X POST "https://app.checkcourt.de/api/v1/policies/{id}/toggle" \
  -H "Authorization: Bearer ck_mgmt_…" \
  -H "Content-Type: application/json" \
  -d '{"enabled":true}'

Antworten

  • 200Success
  • 400Request is syntactically or semantically invalid
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 404Resource does not exist in this club
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • policyobjectPflicht
    • idstringPflicht
    • tenantIdstring
    • namestringPflicht
    • descriptionstring | null
    • priorityintegerPflicht

      Lower number = evaluated earlier

    • isEnabledbooleanPflicht
    • isDefaultbooleanPflicht

      Exactly one default policy exists per tenant. It matches everything, cannot be renamed or deleted.

    • conditionsobject

      Selects which booking attempts a policy applies to. Omitted fields match everything; all present fields must match (AND).

      • daysOfWeek"mon" | "tue" | "wed" | "thu" | "fri" | "sat" | "sun"[]
      • timeOfDayobject
        • fromstring

          Time of day as HH:MM or HH:MM:SS

        • tostring

          Time of day as HH:MM or HH:MM:SS

      • dateRangeobject
        • fromstring (date)
        • tostring (date)
      • courtIdsinteger[]
      • categoryIdsstring[]
      • bookerRoles"member" | "trainer" | "admin"[]
      • bookerTeamIdsstring[]
      • bookerGroupIdsstring[]
      • actions"create" | "cancel" | "edit"[]
    • attributesobject

      Rule values a policy contributes for matching attempts. Policies are evaluated by ascending priority; the first policy that sets an attribute wins, the default policy fills the rest.

      • allowboolean

        Hard allow/deny for matching attempts

      • denyReasonstring

        Message shown when allow=false

      • maxBookingMinutesinteger
      • minBookingMinutesinteger
      • maxAdvanceBookingDaysinteger

        How far into the future bookings may start

      • maxActiveBookingsinteger

        Cap on simultaneously active (future) bookings per user

      • maxBookingsPerDayPerUserinteger
      • maxParallelBookingsinteger

        Cap on overlapping bookings per user across courts

      • cancellationDeadlineHoursinteger
      • slotStartIntervalMinutesinteger

        Allowed booking start raster, e.g. 30 for :00/:30

      • slotStartOffsetMinutesinteger
      • bookingStartTimestring

        Time of day as HH:MM or HH:MM:SS

      • bookingEndTimestring

        Time of day as HH:MM or HH:MM:SS

      • requireTeammateboolean

        Booking requires naming at least one teammate

      • isNameableboolean

        Whether bookings may carry a free-text title

    • createdAtstring (date-time)

      ISO 8601 timestamp

    • updatedAtstring (date-time)

      ISO 8601 timestamp

post/policies/reorder
Reorder policy priorities
Persönlicher SchlüsselManagement-Schlüsselpolicies:write

Send all non-default policy ids in the desired evaluation order (first = highest precedence). Priorities are reassigned accordingly.

Request-Body

  • orderedIdsstring[]Pflicht

Beispiel

curl -X POST "https://app.checkcourt.de/api/v1/policies/reorder" \
  -H "Authorization: Bearer ck_mgmt_…" \
  -H "Content-Type: application/json" \
  -d '{"orderedIds":[]}'

Antworten

  • 200Success
  • 400Request is syntactically or semantically invalid
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • successbooleanPflicht
get/booking-policies
Resolve effective booking rules for the calling actor
Persönlicher SchlüsselManagement-Schlüsselpolicies:read

Evaluates the whole policy engine for the calling actor's role and returns the resolved rule values per court and per booking category, plus the categories the actor may book in. This is what the booking UI uses to know slot lengths, advance limits and quotas.

Only meaningful with personal keys: management keys have no role to evaluate against and receive 400.

Beispiel

curl "https://app.checkcourt.de/api/v1/booking-policies" \
  -H "Authorization: Bearer ck_mgmt_…"

Antworten

  • 200Success
  • 400Request is syntactically or semantically invalid
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • role"member" | "trainer" | "admin"

    Tenant role of a member

  • evaluatedAtstring (date-time)

    ISO 8601 timestamp

  • courtsobject[]
    • courtIdinteger
    • courtNamestring
    • attributesobject

      Rule values a policy contributes for matching attempts. Policies are evaluated by ascending priority; the first policy that sets an attribute wins, the default policy fills the rest.

      • allowboolean

        Hard allow/deny for matching attempts

      • denyReasonstring

        Message shown when allow=false

      • maxBookingMinutesinteger
      • minBookingMinutesinteger
      • maxAdvanceBookingDaysinteger

        How far into the future bookings may start

      • maxActiveBookingsinteger

        Cap on simultaneously active (future) bookings per user

      • maxBookingsPerDayPerUserinteger
      • maxParallelBookingsinteger

        Cap on overlapping bookings per user across courts

      • cancellationDeadlineHoursinteger
      • slotStartIntervalMinutesinteger

        Allowed booking start raster, e.g. 30 for :00/:30

      • slotStartOffsetMinutesinteger
      • bookingStartTimestring

        Time of day as HH:MM or HH:MM:SS

      • bookingEndTimestring

        Time of day as HH:MM or HH:MM:SS

      • requireTeammateboolean

        Booking requires naming at least one teammate

      • isNameableboolean

        Whether bookings may carry a free-text title

    • perCategoryobject[]
      • categoryIdstring
      • categorySlugstring
      • categoryNamestring
      • attributesobject

        Rule values a policy contributes for matching attempts. Policies are evaluated by ascending priority; the first policy that sets an attribute wins, the default policy fills the rest.

        • allowboolean

          Hard allow/deny for matching attempts

        • denyReasonstring

          Message shown when allow=false

        • maxBookingMinutesinteger
        • minBookingMinutesinteger
        • maxAdvanceBookingDaysinteger

          How far into the future bookings may start

        • maxActiveBookingsinteger

          Cap on simultaneously active (future) bookings per user

        • maxBookingsPerDayPerUserinteger
        • maxParallelBookingsinteger

          Cap on overlapping bookings per user across courts

        • cancellationDeadlineHoursinteger
        • slotStartIntervalMinutesinteger

          Allowed booking start raster, e.g. 30 for :00/:30

        • slotStartOffsetMinutesinteger
        • bookingStartTimestring

          Time of day as HH:MM or HH:MM:SS

        • bookingEndTimestring

          Time of day as HH:MM or HH:MM:SS

        • requireTeammateboolean

          Booking requires naming at least one teammate

        • isNameableboolean

          Whether bookings may carry a free-text title

  • grantedCategoryIdsstring[]

    Categories the actor may book in

Buchungskategorien

get/booking-categories
List booking categories
Persönlicher SchlüsselManagement-Schlüsselcategories:read

Categories classify bookings (e.g. regular play, training, match) and control visibility: isPublic decides whether other members see details, anonymizeGuests hides guest names. System categories (isSystem) are created automatically and have stable slugs.

Beispiel

curl "https://app.checkcourt.de/api/v1/booking-categories" \
  -H "Authorization: Bearer ck_mgmt_…"

Antworten

  • 200Success
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • categoriesobject[]Pflicht
    • idstringPflicht
    • tenantIdstring
    • namestringPflicht
    • slugstringPflicht

      Stable identifier; system categories use fixed slugs like "regular"

    • colorstringPflicht

      Hex color from the predefined palette

    • isSystembooleanPflicht

      System categories cannot be renamed or deleted

    • isPublicboolean

      Whether bookings in this category show details to other members

    • anonymizeGuestsboolean
    • allowUserToggleboolean

      Members may toggle visibility per booking

    • allowUserToggleGuestsboolean
    • sortOrderinteger
    • createdAtstring (date-time)

      ISO 8601 timestamp

    • updatedAtstring (date-time)

      ISO 8601 timestamp

post/booking-categories
Create a category
Persönlicher SchlüsselManagement-Schlüsselcategories:write

Creates a custom category. color must come from the predefined palette; the number of categories per club is capped (422 when reached). Visibility flags can be adjusted afterwards via PATCH.

Request-Body

  • namestringPflicht
  • colorstringPflicht

    Hex color from the predefined palette

Beispiel

curl -X POST "https://app.checkcourt.de/api/v1/booking-categories" \
  -H "Authorization: Bearer ck_mgmt_…" \
  -H "Content-Type: application/json" \
  -d '{"name":"name","color":"color"}'

Antworten

  • 200Success
  • 400Request is syntactically or semantically invalid
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 422Request is valid but violates a business rule (limit reached, duplicate, protected resource)
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • categoryobjectPflicht
    • idstringPflicht
    • tenantIdstring
    • namestringPflicht
    • slugstringPflicht

      Stable identifier; system categories use fixed slugs like "regular"

    • colorstringPflicht

      Hex color from the predefined palette

    • isSystembooleanPflicht

      System categories cannot be renamed or deleted

    • isPublicboolean

      Whether bookings in this category show details to other members

    • anonymizeGuestsboolean
    • allowUserToggleboolean

      Members may toggle visibility per booking

    • allowUserToggleGuestsboolean
    • sortOrderinteger
    • createdAtstring (date-time)

      ISO 8601 timestamp

    • updatedAtstring (date-time)

      ISO 8601 timestamp

patch/booking-categories/{id}
Update a category
Persönlicher SchlüsselManagement-Schlüsselcategories:write

Partial update. System categories cannot be renamed (422), but their visibility flags and color may be changed.

Parameter

  • idpath · stringPflicht

    Category id

Request-Body

  • namestring
  • colorstring
  • isPublicboolean
  • anonymizeGuestsboolean
  • allowUserToggleboolean
  • allowUserToggleGuestsboolean
  • sortOrderinteger

Beispiel

curl -X PATCH "https://app.checkcourt.de/api/v1/booking-categories/{id}" \
  -H "Authorization: Bearer ck_mgmt_…" \
  -H "Content-Type: application/json" \
  -d '{}'

Antworten

  • 200Success
  • 400Request is syntactically or semantically invalid
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 404Resource does not exist in this club
  • 422Request is valid but violates a business rule (limit reached, duplicate, protected resource)
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • categoryobjectPflicht
    • idstringPflicht
    • tenantIdstring
    • namestringPflicht
    • slugstringPflicht

      Stable identifier; system categories use fixed slugs like "regular"

    • colorstringPflicht

      Hex color from the predefined palette

    • isSystembooleanPflicht

      System categories cannot be renamed or deleted

    • isPublicboolean

      Whether bookings in this category show details to other members

    • anonymizeGuestsboolean
    • allowUserToggleboolean

      Members may toggle visibility per booking

    • allowUserToggleGuestsboolean
    • sortOrderinteger
    • createdAtstring (date-time)

      ISO 8601 timestamp

    • updatedAtstring (date-time)

      ISO 8601 timestamp

delete/booking-categories/{id}
Delete a category
Persönlicher SchlüsselManagement-Schlüsselcategories:write

System categories cannot be deleted (422). Existing bookings of a deleted category are reassigned to the default ("regular") category.

Parameter

  • idpath · stringPflicht

    Category id

Beispiel

curl -X DELETE "https://app.checkcourt.de/api/v1/booking-categories/{id}" \
  -H "Authorization: Bearer ck_mgmt_…"

Antworten

  • 200Success
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 404Resource does not exist in this club
  • 422Request is valid but violates a business rule (limit reached, duplicate, protected resource)
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • successbooleanPflicht

Gastgebühren

get/guest-fees
List settled guest fees (paginated)
Persönlicher SchlüsselManagement-Schlüsselguest_fees:read

History of guest fees that have been marked as paid, newest settlement first. search matches the guest's name and the owing member's name or email. Use userId to see one member's history.

Parameter

  • searchquery · string

    Substring search in guest name, member name, member email

  • userIdquery · string

    Only fees owed by this member (user id)

  • pagequery · integer

    1-based page number

  • pageSizequery · integer

    Entries per page

Beispiel

curl "https://app.checkcourt.de/api/v1/guest-fees" \
  -H "Authorization: Bearer ck_mgmt_…"

Antworten

  • 200Success
  • 400Request is syntactically or semantically invalid
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • entriesobject[]Pflicht
    • idstring
    • guestNamestring
    • feeAmountinteger

      Amount in euro cents

    • settledAtstring (date-time)

      ISO 8601 timestamp

    • createdAtstring (date-time)

      ISO 8601 timestamp

    • memberIdstring

      User id of the member who owes/paid the fee

    • memberNamestring
    • memberEmailstring (email)
    • bookingDatestring (date)
  • totalintegerPflicht
  • pageintegerPflicht
  • pageSizeintegerPflicht
  • totalPagesintegerPflicht
get/guest-fees/open
List a member's open guest fees
Persönlicher SchlüsselManagement-Schlüsselguest_fees:read

All unsettled guest fees one member currently owes, including the booking context (date, time, court) each fee originated from.

Parameter

  • userIdquery · stringPflicht

    User id of the member

Beispiel

curl "https://app.checkcourt.de/api/v1/guest-fees/open?userId=userId" \
  -H "Authorization: Bearer ck_mgmt_…"

Antworten

  • 200Success
  • 400Request is syntactically or semantically invalid
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • entriesobject[]Pflicht
    • idstring
    • guestNamestring
    • feeAmountinteger

      Amount in euro cents

    • createdAtstring (date-time)

      ISO 8601 timestamp

    • bookingDatestring (date)
    • bookingStartTimestring

      Time of day as HH:MM or HH:MM:SS

    • bookingEndTimestring

      Time of day as HH:MM or HH:MM:SS

    • courtNamestring
get/guest-fees/members
Members appearing in the paid-fees history
Persönlicher SchlüsselManagement-Schlüsselguest_fees:read

Distinct members that have at least one settled guest fee. Intended to populate filter dropdowns for the history view.

Beispiel

curl "https://app.checkcourt.de/api/v1/guest-fees/members" \
  -H "Authorization: Bearer ck_mgmt_…"

Antworten

  • 200Success
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • membersobject[]Pflicht
    • idstringPflicht
    • namestringPflicht
delete/guest-fees/{entryId}
Revert a paid mark
Persönlicher SchlüsselManagement-Schlüsselguest_fees:write

Moves a fee entry back from "paid" to "open", e.g. after marking the wrong entry. Only entries currently marked as paid can be reverted (400 otherwise).

Parameter

  • entryIdpath · stringPflicht

    Guest fee entry id

Beispiel

curl -X DELETE "https://app.checkcourt.de/api/v1/guest-fees/{entryId}" \
  -H "Authorization: Bearer ck_mgmt_…"

Antworten

  • 200Success
  • 400Request is syntactically or semantically invalid
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 404Resource does not exist in this club
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • successbooleanPflicht
post/guest-fees/reset
Settle open guest fees in bulk
Persönlicher SchlüsselManagement-Schlüsselguest_fees:write

Marks open fees as paid. Provide exactly ONE of the two parameters: targetUserId settles all open fees of one member (typical after they paid in person); untilDate settles all open fees of the whole club created on or before that date (typical after a billing cut-off).

Request-Body

  • targetUserIdstring

    User id; settles this member's open fees

  • untilDatestring (date)

    Settles all open fees created on or before this date

Beispiel

curl -X POST "https://app.checkcourt.de/api/v1/guest-fees/reset" \
  -H "Authorization: Bearer ck_mgmt_…" \
  -H "Content-Type: application/json" \
  -d '{}'

Antworten

  • 200Success
  • 400Request is syntactically or semantically invalid
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • successbooleanPflicht

Einstellungen

get/settings
Get club settings
Persönlicher SchlüsselManagement-Schlüsselsettings:read

Returns the whitelisted club settings (dashboard announcement, check-in, guest fees, club name, timezone). Keys without a stored value are omitted from the response. All values are strings; see the Settings schema for the semantic type of each key.

Beispiel

curl "https://app.checkcourt.de/api/v1/settings" \
  -H "Authorization: Bearer ck_mgmt_…"

Antworten

  • 200Success
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • settingsobjectPflicht

    Whitelisted club settings. The backing store is a string key-value table, so every value is a string: checkin_enabled and guest_fees_enabled are "true"/"false", checkin_deadline_minutes and guest_fee_cents are integers encoded as strings, timezone is an IANA zone like "Europe/Berlin".

    • announcement_textstring

      Banner text shown on the dashboard; empty string hides the banner

    • announcement_linkstring

      Optional URL the announcement banner links to

    • checkin_deadline_minutesstring

      Integer as string; minutes after booking start until check-in expires

    • checkin_enabled"true" | "false"
    • club_namestring
    • guest_fee_centsstring

      Integer as string; fee per guest in cents

    • guest_fees_enabled"true" | "false"
    • timezonestring
patch/settings
Update club settings
Persönlicher SchlüsselManagement-Schlüsselsettings:write

Merge semantics: only the keys you send are written, others stay unchanged. Keys outside the whitelist are silently ignored, values are capped at 2000 characters. The response reports how many settings actually changed.

Request-Body

  • announcement_textstring

    Banner text shown on the dashboard; empty string hides the banner

  • announcement_linkstring

    Optional URL the announcement banner links to

  • checkin_deadline_minutesstring

    Integer as string; minutes after booking start until check-in expires

  • checkin_enabled"true" | "false"
  • club_namestring
  • guest_fee_centsstring

    Integer as string; fee per guest in cents

  • guest_fees_enabled"true" | "false"
  • timezonestring

Beispiel

curl -X PATCH "https://app.checkcourt.de/api/v1/settings" \
  -H "Authorization: Bearer ck_mgmt_…" \
  -H "Content-Type: application/json" \
  -d '{}'

Antworten

  • 200Success
  • 400Request is syntactically or semantically invalid
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • updatedintegerPflicht

    Number of settings whose value changed

Verein

get/tenant
Get club master data
Persönlicher SchlüsselManagement-Schlüsselsettings:read_confidential

Id, display name and short code of the club the API key belongs to. Useful as a connectivity check and to label data in integrations.

Beispiel

curl "https://app.checkcourt.de/api/v1/tenant" \
  -H "Authorization: Bearer ck_mgmt_…"

Antworten

  • 200Success
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 404Resource does not exist in this club
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • tenantobjectPflicht
    • idstringPflicht
    • namestringPflicht

      Club name

    • slugstringPflicht

      Short club code (uppercase letters and digits), used e.g. in member codes

patch/tenant
Change the club short code
Persönlicher SchlüsselManagement-Schlüsselsettings:write

The slug appears in member codes and on-site displays. Input is normalized to uppercase A-Z and 0-9, then length-checked (3-8 chars) and checked for uniqueness across all clubs (422 if taken).

Request-Body

  • slugstringPflicht

Beispiel

curl -X PATCH "https://app.checkcourt.de/api/v1/tenant" \
  -H "Authorization: Bearer ck_mgmt_…" \
  -H "Content-Type: application/json" \
  -d '{"slug":"slug"}'

Antworten

  • 200Success
  • 400Request is syntactically or semantically invalid
  • 401Not authenticated: header missing, key unknown/revoked/expired, or the API key feature is disabled for this club
  • 403The key lacks the required scope, or team management rights are missing
  • 422Request is valid but violates a business rule (limit reached, duplicate, protected resource)
  • 429More than 60 requests per minute from one IP
200er-Schema anzeigen
  • slugstringPflicht

    The normalized slug that was stored