# Return a single booking with member details in the same format as a booking sheet

`GET /api/booking-sheets/booking/{bookingId}`

- **Success:** `200 OK`
- **Products:** Operator (`FOH`)
- **Features:** Front of House Generic Access (`FOHGENERIC`)

HTML version: [Return a single booking with member details in the same format as a booking sheet](https://support.gladstonesoftware.cloud/reference/bookings/return-a-single-booking-with-member-details-in-the-same-format-as-a-booking-shee)

## Overview

Returns one booking in exactly the shape it takes inside a booking sheet, so you can
refresh a single cell of a sheet without re-fetching the whole grid. The response is a
bare booking object, not wrapped in `resourceGroups`.

Reach for it after
[Return booking sheets for the given resource group with member details](return-booking-sheets-for-the-given-resource-group-with-member-details.md)
has given you a `bookingId`, or follow the `id` field on any booking in that response —
it is an absolute URL to this endpoint for that booking.

Unlike the booking-sheet endpoints, this one always emits `bookedMembers` and
`bookeeName`. Passing `includeMembers=false` empties them rather than removing them.

## Endpoint

`GET {base_url}/api/booking-sheets/booking/{bookingId}`

`{base_url}` is the environment URL issued to your integration. See [Authenticating with Gladstone APIs](../../guides/authenticating-with-gladstone-apis.md).

## Path parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `bookingId` | integer (int32) | Yes | The booking to return. Take it from `resourceGroups[].bookings[].bookingId` on either booking-sheet endpoint. An id that does not exist gives `404`, and so does one that exists but is not attached to a resource group configured as a booking sheet. |

## Query parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `includeMembers` | boolean | No | Whether to load the people on the booking. Defaults to `true`, so omitting it gives you member details. Set it to `false` for a lighter call that returns `bookedMembers` as `[]`, `bookeeName` as `""`, and `numberOfBookees` and `waitingListSize` as `0`; every other field is unaffected. |

## Sample request

```bash title="cURL"
curl -X GET '{base_url}/api/booking-sheets/booking/{bookingId}' \
  -H 'Authorization: Bearer {accessToken}' \
  -H 'X-Use-SSO: true'
```

## Response fields

| Field | Type | Description |
|-------|------|-------------|
| `bookingId` | integer (int32) | The numeric identifier of this booking. The same value you passed in the path. |
| `recurringScheduleId` | string (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. |
| `isBlockBooking` | boolean | Whether this booking forms part of a block booking. Both `0` and no value in the underlying record are reported as `false`. |
| `id` | string | An absolute URL to this booking on `GET /api/booking-sheets/booking/{bookingId}`, built from the gateway host that served your request. A convenience link — `bookingId` carries the same information. |
| `startTime` | string (date-time) | When the booked period starts. Use it with `endTime` to place the booking on the sheet. |
| `endTime` | string (date-time) | When the booked period ends. |
| `activityId` | string | The activity being booked. Bookings sharing an `activityId` also share `description`, the two colour fields, `activityComments` and `pricedProducts`. |
| `activityForeColorHex` | string | The activity's configured foreground (text) colour as a hex string, so a sheet can render every booking in its activity's colours. |
| `activityBackColorHex` | string | The activity's configured background colour as a hex string. |
| `description` | string | The activity's description — the name of the activity, not a note about this booking. Per-booking free text is in `bookingComments`. |
| `maximumBookees` | integer (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". |
| `numberOfBookees` | integer (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. `0` when you call with `includeMembers=false`, because the members it is derived from are not loaded. |
| `waitingListSize` | integer (int32) | The sum of `bookedMembers[].partySize` over entries that are on the waiting list and are not the host. Also `0` when `includeMembers=false`. |
| `pricedProducts` | array of object | The 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. |
| `pricedProducts[].id` | string | The product's identifier. |
| `pricedProducts[].description` | string | The product's description. |
| `resourceProducts` | array of object | The bookable resources this booking occupies, such as the courts or lanes. Each is one of the resources belonging to the booking sheet the booking was made on. |
| `resourceProducts[].id` | string | The resource product's identifier. |
| `resourceProducts[].description` | string | The resource product's description. |
| `bookedMembers` | array of object | Everyone on the booking, including anyone waiting. Returned as an empty array — not omitted — when you call with `includeMembers=false`. |
| `bookedMembers[].id` | integer (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. |
| `bookedMembers[].firstNames` | string | The member's forename(s) when `id` is greater than `0`, otherwise the non-member forename captured on the booking. |
| `bookedMembers[].lastName` | string | The member's surname when `id` is greater than `0`, otherwise the non-member surname captured on the booking. |
| `bookedMembers[].isOnWaitingList` | boolean | Whether this entry is a waiting-list place rather than a confirmed one. Waiting-list entries count towards `waitingListSize` instead of `numberOfBookees`. |
| `bookedMembers[].salesStatusInd` | integer (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 the record holds no status, so `0` means "unpaid or never set". |
| `bookedMembers[].salesInvoiceId` | integer (int32) | The sales invoice raised for this place. `0` when no invoice exists, in which case `totalAmount` is also `0`. |
| `bookedMembers[].bookingId` | integer (int32) | The booking this entry belongs to. Repeats the top-level `bookingId`. |
| `bookedMembers[].bookingRef` | integer (int32) | Distinguishes the several entries on one booking: `bookingId` plus `bookingRef` identifies a single place. `0` when the underlying record has no reference. |
| `bookedMembers[].attendedInd` | boolean | Whether attendance has been recorded for this place. `false` covers both "did not attend" and "not yet marked" — the two are not distinguishable here. |
| `bookedMembers[].waitingListDateTime` | string (date-time) | When the waiting-list entry was created, in UTC. `null` unless `isOnWaitingList` is `true`. |
| `bookedMembers[].totalAmount` | number (double) | The total of the sales invoice identified by `salesInvoiceId`. `0` when there is no invoice. |
| `bookedMembers[].partySize` | integer (int32) | How many places this single entry covers — one entry can stand for a group. Defaults to `1` when the record does not state a size. `numberOfBookees` and `waitingListSize` are sums of this field. |
| `bookedMembers[].bookingParties` | array of object | The 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 be shorter than the number of places booked individually — and empty even when `partySize` is greater than `0`. |
| `bookedMembers[].bookingParties[].keyBookeeInd` | integer (int32) | `1` when any of the merged entries at this price level is the key bookee — the lead person on the booking — otherwise `0`. |
| `bookedMembers[].bookingParties[].priceLevelId` | string | The 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. |
| `bookedMembers[].bookingParties[].quantity` | integer (int32) | The number of places at this price level, summed across the merged entries. |
| `bookedMembers[].phoneNo` | string | The member's mobile telephone number, falling back to their home number when no mobile is held. `null` when neither is recorded. |
| `bookeeName` | string | The display name held against the booking: who the booking is under. An empty string when you call with `includeMembers=false`. |
| `bookingType` | string | Either `Activity` or `Reservation`, taken from the activity's type. |
| `activityComments` | string | Free-text comments configured on the activity, so the same text appears on every booking for that activity. `null` when none is set. |
| `bookingComments` | string | Free-text comments recorded against this individual booking. `null` when none is set. |

## Sample response

```json title="200 OK"
{
  "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"
}
```

## Errors

| Status | Meaning | When |
|--------|---------|------|
| `404` | Not found | `Invalid Booking ID` — no booking matched, either because the id does not exist or because the booking is not on a resource group configured as a booking sheet. |
| `500` | Internal server error | Any unexpected server-side failure; the response body is empty. Retry, then raise a support ticket with the time of the call. |
