Return booking sheets for the given resource group with member details

GET /api/booking-sheets/{id}/with-member-details

Success: 200 OK

Overview

Returns everything needed to draw a booking sheet — a day-by-day grid of one resource group's bookable resources, the bookings on them, and the periods when they are closed — with the people on each booking included.

A booking sheet is a group of bookable resources at a site, such as the courts in a sports hall, configured together so they can be scheduled on one grid. You identify it by the id returned when it was created with Creates a booking sheet.

The response is organised by day, not by resource: resourceGroups holds one entry per day in the range on which at least one resource is open, and days on which nothing is open are left out. bookingSheet carries the sheet's own details once, outside that list.

Two things catch integrators out:

Use the variant without member details where personal data is not needed — for example a public-facing availability display. To re-read one booking on its own, use Return a single booking.

Endpoint

GET {base_url}/api/booking-sheets/{id}/with-member-details

{base_url} is the environment URL issued to your integration. See Authenticating with Gladstone APIs.

Path parameters

NameTypeRequiredDescription
idstringYesThe booking sheet you want, as returned when it was created with Creates a booking sheet — ids are generated with a PRCP prefix. The booking sheet must have at least one resource product attached, or the call fails with 400 Invalid booking sheet ID.

Query parameters

NameTypeRequiredDescription
fromDatestring (date-time)YesThe first day to return, as a date-time. Required despite being a query parameter — omit it and the call fails with 400 fromDate must be specified. Send it at midnight; a time component narrows which bookings qualify, because a booking must start at or after this instant to be returned.
toDatestring (date-time)YesThe last day to return. Required — omit it and the call fails with 400 toDate must be specified, and it must not be earlier than fromDate. A value at exactly midnight is widened to 23:59:59 on that date, so 2026-03-01–2026-03-07 covers all seven days; send any other time and it is used as given, which will exclude bookings ending later that day.
siteIdstringNoThe site whose day notes you want. It does not filter the bookings or resources returned — its only effect is to populate bookingSheet.notes. Omit it and that array is always empty.

Sample request

cURL
curl -X GET '{base_url}/api/booking-sheets/{id}/with-member-details' \
  -H 'Authorization: Bearer {accessToken}' \
  -H 'X-Use-SSO: true'

Response fields

FieldTypeDescription
resourceGroupsarray of objectOne entry per day in the requested range on which at least one of the booking sheet's resources is open. Days with no opening times are dropped entirely, so this array is usually shorter than the number of days you asked for and you cannot index it by day offset — read the date part of resourceGroups[].startTime to see which day an entry covers.
resourceGroups[].bookingsarray of objectThe bookings falling on this day. A booking is placed on the first day matching the date of either its startTime or its endTime, so one running past midnight appears once only, under the earlier day. Only bookings lying wholly inside fromDate–toDate are returned: one that starts before fromDate, or ends after toDate, is omitted rather than truncated.
resourceGroups[].bookings[].bookingIdinteger (int32)The numeric identifier of this booking. Pass it to Return a single booking to re-read the booking on its own.
resourceGroups[].bookings[].recurringScheduleIdstring (uuid)The block-booking schedule this booking was generated from. Every booking produced by the same schedule carries the same value, so you can group them. null for a one-off booking.
resourceGroups[].bookings[].isBlockBookingbooleanWhether this booking forms part of a block booking. Also false when no value has been set.
resourceGroups[].bookings[].idstringAn absolute URL to this booking on GET /api/booking-sheets/booking/{bookingId}, built from the host that served your request. A convenience link — bookingId carries the same information.
resourceGroups[].bookings[].startTimestring (date-time)When the booked period starts. Use it with endTime to place the booking on the sheet.
resourceGroups[].bookings[].endTimestring (date-time)When the booked period ends.
resourceGroups[].bookings[].activityIdstringThe activity being booked. Bookings sharing an activityId also share description, the two colour fields, activityComments and pricedProducts.
resourceGroups[].bookings[].activityForeColorHexstringThe activity's configured foreground (text) colour as a hex string, so a sheet can render every booking in its activity's colours.
resourceGroups[].bookings[].activityBackColorHexstringThe activity's configured background colour as a hex string.
resourceGroups[].bookings[].descriptionstringThe activity's description — the name of the activity, not a note about this booking. Per-booking free text is in bookingComments.
resourceGroups[].bookings[].maximumBookeesinteger (int32)The maximum number of bookees the booking allows. Reported as 0 when the booking has no maximum recorded, which is not the same as "no places available".
resourceGroups[].bookings[].numberOfBookeesinteger (int32)How many places are taken: the sum of bookedMembers[].partySize over entries that are not on the waiting list and are not the host. Calculated only when member details are returned — it is 0 on the variant without member details.
resourceGroups[].bookings[].waitingListSizeinteger (int32)The sum of bookedMembers[].partySize over entries that are on the waiting list and are not the host. Like numberOfBookees, it is 0 when member details are not returned.
resourceGroups[].bookings[].pricedProductsarray of objectThe chargeable, non-resource products configured against the booking's activity — what a bookee can be sold for it. Derived from the activity, so every booking with the same activityId returns the same list.
resourceGroups[].bookings[].pricedProducts[].idstringThe product's identifier.
resourceGroups[].bookings[].pricedProducts[].descriptionstringThe product's description.
resourceGroups[].bookings[].resourceProductsarray of objectThe bookable resources this booking occupies, such as the courts or lanes. Each one also appears in the parent resourceGroups[].resourceProducts, which is how you position the booking against a column of the sheet.
resourceGroups[].bookings[].resourceProducts[].idstringThe resource product's identifier, matching one of resourceGroups[].resourceProducts[].id.
resourceGroups[].bookings[].resourceProducts[].descriptionstringThe resource product's description.
resourceGroups[].bookings[].bookedMembersarray of objectEveryone on the booking, including anyone waiting. Always returned by this endpoint; the variant without member details omits the field from the JSON entirely.
resourceGroups[].bookings[].bookedMembers[].idinteger (int32)The member's numeric id, or 0 when the place was booked for a non-member guest. When it is 0, firstNames and lastName hold the guest name captured on the booking rather than a member record.
resourceGroups[].bookings[].bookedMembers[].firstNamesstringThe member's forename(s) when id is greater than 0, otherwise the non-member forename captured on the booking.
resourceGroups[].bookings[].bookedMembers[].lastNamestringThe member's surname when id is greater than 0, otherwise the non-member surname captured on the booking.
resourceGroups[].bookings[].bookedMembers[].isOnWaitingListbooleanWhether this entry is a waiting-list place rather than a confirmed one. Waiting-list entries count towards waitingListSize instead of numberOfBookees.
resourceGroups[].bookings[].bookedMembers[].salesStatusIndinteger (enum)Payment status of the sales invoice raised for this place: 0 unpaid, 1 part paid, 2 paid, 3 void, 4 part credited, 5 part credited and paid, 6 credited, 7 credit note, 8 pending. Reported as 0 when no status is set, so 0 means "unpaid or never set".
resourceGroups[].bookings[].bookedMembers[].salesInvoiceIdinteger (int32)The sales invoice raised for this place. 0 when no invoice exists, in which case totalAmount is also 0.
resourceGroups[].bookings[].bookedMembers[].bookingIdinteger (int32)The booking this entry belongs to. Repeats the parent bookings[].bookingId.
resourceGroups[].bookings[].bookedMembers[].bookingRefinteger (int32)Distinguishes the several entries on one booking: bookingId plus bookingRef identifies a single place. 0 when the place has no reference.
resourceGroups[].bookings[].bookedMembers[].attendedIndbooleanWhether attendance has been recorded for this place. false covers both "did not attend" and "not yet marked" — the two are not distinguishable here.
resourceGroups[].bookings[].bookedMembers[].waitingListDateTimestring (date-time)When the waiting-list entry was created, in UTC. null unless isOnWaitingList is true.
resourceGroups[].bookings[].bookedMembers[].totalAmountnumber (double)The total of the sales invoice identified by salesInvoiceId. 0 when there is no invoice.
resourceGroups[].bookings[].bookedMembers[].partySizeinteger (int32)How many places this single entry covers — one entry can stand for a group. Defaults to 1 when no size is set. numberOfBookees and waitingListSize are sums of this field.
resourceGroups[].bookings[].bookedMembers[].bookingPartiesarray of objectThe breakdown of partySize by price level. Entries with no price level are dropped and entries sharing a price level are merged, so this array can have fewer entries than the party breakdown recorded on the booking — and empty even when partySize is greater than 0.
resourceGroups[].bookings[].bookedMembers[].bookingParties[].keyBookeeIndinteger (int32)1 when any of the merged entries at this price level is the key bookee — the lead person on the booking — otherwise 0.
resourceGroups[].bookings[].bookedMembers[].bookingParties[].priceLevelIdstringThe price level charged for these places: the tariff, such as adult or junior, that sets the rate. Never empty, because entries without a price level are excluded.
resourceGroups[].bookings[].bookedMembers[].bookingParties[].quantityinteger (int32)The number of places at this price level, summed across the merged entries.
resourceGroups[].bookings[].bookedMembers[].phoneNostringThe member's mobile telephone number, falling back to their home number when no mobile is held. null when neither is recorded.
resourceGroups[].bookings[].bookeeNamestringThe display name held against the booking — who the booking is under.
resourceGroups[].bookings[].bookingTypestringEither Activity or Reservation, taken from the activity's type.
resourceGroups[].bookings[].activityCommentsstringFree-text comments configured on the activity, so the same text appears on every booking for that activity. null when none is set.
resourceGroups[].bookings[].bookingCommentsstringFree-text comments recorded against this individual booking. null when none is set.
resourceGroups[].bookingExceptionsarray of objectPeriods on this day when one of the resources is closed to entry — derived from time bands attached to the resource that are flagged as restricting entry. Only exceptions lying wholly inside fromDate–toDate are returned. Render these as blocked-out areas of the sheet.
resourceGroups[].bookingExceptions[].idstringThe identifier of the time band that produces the restriction. It is not unique per occurrence — every occurrence of a recurring restriction repeats it — so do not use it as a row key.
resourceGroups[].bookingExceptions[].descriptionstringThe time band's description, suitable for labelling the blocked-out area.
resourceGroups[].bookingExceptions[].recurringExceptionsobjectPresent only when scheduleID is set. A single summary of the whole recurring run, not a list of the individual occurrences.
resourceGroups[].bookingExceptions[].recurringExceptions.daysarray of stringThe days of the week the schedule was created for, as full English day names (monday to sunday). An empty list means every day.
resourceGroups[].bookingExceptions[].recurringExceptions.startTimestring (date-time)The earliest start across every occurrence of the schedule — the outer bound of the run, not of this occurrence. The occurrence's own start is bookingExceptions[].startTime.
resourceGroups[].bookingExceptions[].recurringExceptions.endTimestring (date-time)The latest end across every occurrence of the schedule.
resourceGroups[].bookingExceptions[].scheduleIDstring (uuid)The recurring schedule this exception belongs to. null for a one-off exception. Occurrences sharing a scheduleID are the same restriction repeated, and are the ones Update one or more booking sheet exceptions works on together.
resourceGroups[].bookingExceptions[].notesstringFree text recorded when the exception was created. null when none was given.
resourceGroups[].bookingExceptions[].resourceProductobjectThe single resource product this exception closes. An exception applies to one product, not the whole group, so the other products on the sheet stay bookable for that period.
resourceGroups[].bookingExceptions[].resourceProduct.idstringThe resource product's identifier, matching one of resourceGroups[].resourceProducts[].id.
resourceGroups[].bookingExceptions[].resourceProduct.descriptionstringThe resource product's description.
resourceGroups[].bookingExceptions[].startTimestring (date-time)When this occurrence's restricted period starts.
resourceGroups[].bookingExceptions[].endTimestring (date-time)When this occurrence's restricted period ends. Falls back to the same value as startTime when the exception has no end time set.
resourceGroups[].idstringThe booking sheet's identifier — the same value you passed as id. Repeated on every day entry.
resourceGroups[].descriptionstringThe booking sheet's configured name. Repeated on every day entry.
resourceGroups[].startTimestring (date-time)The earliest opening time across the resources open on this day. Together with endTime this gives the sheet's vertical extent for the day, and its date part identifies the day.
resourceGroups[].endTimestring (date-time)The latest closing time across the resources open on this day.
resourceGroups[].slotFrequencyinteger (int32)The slot interval configured on the booking sheet, used to divide the grid into rows. 0 when the booking sheet has no interval set.
resourceGroups[].siteIdstringThe site the booking sheet belongs to.
resourceGroups[].siteDescriptionstringAlways null on this endpoint. Do not rely on it for the site name.
resourceGroups[].resourceProductsarray of objectThe booking sheet's bookable resources that are open on this day — the columns of the sheet. Only products flagged as a standard or density resource are included, and a product with no opening times on the day is left out. If none are open, the day is dropped from resourceGroups altogether.
resourceGroups[].resourceProducts[].calendarIdstringThe opening-times calendar the resource follows. Both openingTimes and capacities are derived from it.
resourceGroups[].resourceProducts[].densitySlotSizeinteger (int32)The slot size configured against a density resource (resourceType 2). 0 when none is configured.
resourceGroups[].resourceProducts[].usageinteger (int32)Taken from the resource product's configured usage value; reported as 1 when the product has none.
resourceGroups[].resourceProducts[].resourceTypeinteger (int32)How the resource is capacity-managed: 1 a standard resource, 2 a density resource, which carries a capacity limit per period in capacities. Reported as 1 when the product has no value. Products that are not resources at all never appear here.
resourceGroups[].resourceProducts[].openingTimesarray of objectWhen this resource is open on this day, one entry per time band on its calendar. Already filtered to the day, so you do not need to filter again.
resourceGroups[].resourceProducts[].openingTimes[].timeBandIdstringThe time band that produces this opening period. The same id can appear in bookingExceptions[].id when that band restricts entry.
resourceGroups[].resourceProducts[].openingTimes[].startTimestring (date-time)This day's date combined with the time band's start time.
resourceGroups[].resourceProducts[].openingTimes[].endTimestring (date-time)This day's date combined with the time band's end time.
resourceGroups[].resourceProducts[].capacitiesarray of objectCapacity limits by period, for density resources (resourceType 2) only — always empty for a standard resource. They are calculated once, for the weekday of fromDate, and then repeated unchanged on every day entry, so treat them as that weekday's pattern rather than a per-day figure. Request a single day at a time if you need day-accurate capacities.
resourceGroups[].resourceProducts[].capacities[].startTimestring (date-time)When the period the limit applies to starts.
resourceGroups[].resourceProducts[].capacities[].endTimestring (date-time)When the period ends. End times are normalised to hh:mm:59, so periods abut rather than overlap.
resourceGroups[].resourceProducts[].capacities[].capacityinteger (int32)The density limit configured for that period, or 0 when none is set.
resourceGroups[].resourceProducts[].idstringThe resource product's identifier. Match it against bookings[].resourceProducts[].id to place a booking in the right column.
resourceGroups[].resourceProducts[].descriptionstringThe resource product's description, suitable as the column heading.
resourceGroups[].hasResourceProductsbooleanAlways false on this endpoint. A day entry only exists when at least one resource is open, so it would carry no information anyway.
bookingSheetobjectThe booking sheet itself, independent of any one day. Always present when the call succeeds, even if resourceGroups is empty.
bookingSheet.idstringThe booking sheet's identifier, the same value you passed as id.
bookingSheet.descriptionstringThe booking sheet's configured name.
bookingSheet.openingTimesobjectThe opening window configured on the booking sheet itself. This is not the same as resourceGroups[].startTime/endTime, which are computed from the resources actually open on a given day.
bookingSheet.openingTimes.startTimestring (date-time)The configured opening time.
bookingSheet.openingTimes.endTimestring (date-time)The configured closing time.
bookingSheet.notesarray of objectDay notes recorded against the site for dates in the requested range. Only populated when you pass the siteId query parameter — without it this array is always empty, even where notes exist.
bookingSheet.notes[].datestring (date-time)The date the note applies to. The time component is midnight.
bookingSheet.notes[].notestringThe note text.

Sample response

200 OK
{
  "resourceGroups": [
    {
      "bookings": [
        {
          "bookingId": 12345,
          "recurringScheduleId": "b7f3c1e2-9a44-4f2b-8c17-0d5e9a1b6c33",
          "isBlockBooking": true,
          "id": "string",
          "startTime": "2026-08-14T19:00:00Z",
          "endTime": "2026-08-14T19:00:00Z",
          "activityId": "string",
          "activityForeColorHex": "string",
          "activityBackColorHex": "string",
          "description": "string",
          "maximumBookees": 1,
          "numberOfBookees": 1,
          "waitingListSize": 1,
          "pricedProducts": [
            {
              "id": "string",
              "description": "string"
            }
          ],
          "resourceProducts": [
            {
              "id": "string",
              "description": "string"
            }
          ],
          "bookedMembers": [
            {
              "id": 12345,
              "firstNames": "string",
              "lastName": "string",
              "isOnWaitingList": true,
              "salesStatusInd": 0,
              "salesInvoiceId": 12345,
              "bookingId": 12345,
              "bookingRef": 1,
              "attendedInd": true,
              "waitingListDateTime": "2026-08-14T19:00:00Z",
              "totalAmount": 10.5,
              "partySize": 1,
              "bookingParties": [
                {
                  "keyBookeeInd": 1,
                  "priceLevelId": "string",
                  "quantity": 1
                }
              ],
              "phoneNo": "string"
            }
          ],
          "bookeeName": "string",
          "bookingType": "string",
          "activityComments": "string",
          "bookingComments": "string"
        }
      ],
      "bookingExceptions": [
        {
          "id": "string",
          "description": "string",
          "recurringExceptions": {
            "days": [
              "string"
            ],
            "startTime": "2026-08-14T19:00:00Z",
            "endTime": "2026-08-14T19:00:00Z"
          },
          "scheduleID": "b7f3c1e2-9a44-4f2b-8c17-0d5e9a1b6c33",
          "notes": "string",
          "resourceProduct": {
            "id": "string",
            "description": "string"
          },
          "startTime": "2026-08-14T19:00:00Z",
          "endTime": "2026-08-14T19:00:00Z"
        }
      ],
      "id": "string",
      "description": "string",
      "startTime": "2026-08-14T19:00:00Z",
      "endTime": "2026-08-14T19:00:00Z",
      "slotFrequency": 1,
      "siteId": "string",
      "siteDescription": "string",
      "resourceProducts": [
        {
          "calendarId": "string",
          "densitySlotSize": 1,
          "usage": 1,
          "resourceType": 1,
          "openingTimes": [
            {
              "timeBandId": "string",
              "startTime": "2026-08-14T19:00:00Z",
              "endTime": "2026-08-14T19:00:00Z"
            }
          ],
          "capacities": [
            {
              "startTime": "2026-08-14T19:00:00Z",
              "endTime": "2026-08-14T19:00:00Z",
              "capacity": 1
            }
          ],
          "id": "string",
          "description": "string"
        }
      ],
      "hasResourceProducts": true
    }
  ],
  "bookingSheet": {
    "id": "string",
    "description": "string",
    "openingTimes": {
      "startTime": "2026-08-14T19:00:00Z",
      "endTime": "2026-08-14T19:00:00Z"
    },
    "notes": [
      {
        "date": "2026-08-14T19:00:00Z",
        "note": "string"
      }
    ]
  }
}

Errors

StatusMeaningWhen
400Bad requestid must be specified — the path id was empty.
400Bad requestfromDate must be specified or toDate must be specified — either query parameter was omitted.
400Bad requestfromDate must be earlier or equal than toDate — the range runs backwards.
400Bad requestInvalid booking sheet ID — no booking sheet with that id exists, or it exists but has no resource products attached. Note that this "not found" case is returned as 400, not 404.
500Internal server errorAn unexpected server-side failure; the response body is empty. Retry, then raise a support ticket with the time of the call.

This page as markdown · All pages · llms.txt