# Retrieves all resource products with their configuration details

`GET /api/configuration/resource-products`

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

HTML version: [Retrieves all resource products with their configuration details](https://support.gladstonesoftware.cloud/reference/configuration/retrieves-all-resource-products-with-their-configuration-details)

## Overview

Lists every resource product in the environment. A **resource product** is a bookable thing with a schedule attached — a court, a lane, a studio, a piece of equipment — as distinct from an ordinary retail product, which is only sold. This endpoint returns only resource products.

Despite what "configuration details" suggests, the record is deliberately narrow: an id, a description, the site group it belongs to, the calendar that defines when it is open, an active flag and that calendar's weekly opening times. **There is no pricing here, and no availability.** Prices come from the price level and time band endpoints; whether a given slot is free comes from the availability and booking endpoints. Do not try to build a booking flow from this response alone.

Three things to know before you rely on the response:

- **Inactive resource products are included**, reported as `active` false. There is no query parameter to exclude them, so filter client-side.
- **`openingTimes` is the calendar's schedule, not the resource's availability.** It says when the resource is open in a normal week; it says nothing about bookings, closures or exceptions on a particular date.
- **Times with a minute between 1 and 9 are formatted wrongly.** See `openingTimes[].startTime` — this is a real defect, not a rounding convention, and it will silently corrupt your schedule if you parse the values as given.

Also note that an environment with no resource products returns `200` with an **empty body**, not `[]` — see the Errors table, because a JSON parser expecting an array will fail on it.

## Endpoint

`GET {base_url}/api/configuration/resource-products`

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

## Sample request

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

## Response fields

| Field | Type | Description |
|-------|------|-------------|
| `[].id` | string | The resource product's code, and the value the other resource product endpoints take in the path. Operator-chosen rather than generated, a string of at most 15 characters, and **stored upper-cased whatever casing was supplied** — so compare case-insensitively and upper-case any id you send back. Unique across all products, resource and retail alike. |
| `[].description` | string | The operator's label for the resource, up to 255 characters — for example the court or studio name. Not unique, so two resources can share a description and only `id` distinguishes them. May be null where none was recorded. |
| `[].siteGroupId` | string | The site group the resource belongs to, matching an `id` from [Retrieves all site groups](retrieves-all-site-groups-with-their-configuration-details.md). Because it points at a group rather than a single site, a resource can be shared across every site in that group; resolve the group to its member sites if you need to know which venues offer it. Up to 15 characters. |
| `[].calendarId` | string | The calendar whose weekly schedule produced `openingTimes`. Always populated, and several resources commonly share one calendar — meaning an identical `calendarId` across two resources implies identical `openingTimes`. Up to 15 characters. It is echoed here mainly so you can spot that sharing; there is no endpoint in this group that takes it. |
| `[].active` | boolean | Whether the resource is in service. **`true` unless the resource has been marked inactive** — so `true` means "not marked inactive" rather than "positively confirmed active". Inactive resources are returned by this endpoint regardless, so check this field rather than assuming the list is pre-filtered. |
| `[].openingTimes` | array of object | The resource's calendar expressed as weekly open periods. **Always present, and an empty array `[]` when the calendar has no periods defined** — never null. A day can appear more than once, which is how a split day (morning and evening, closed over lunch) is represented, so do not key a map on `day`. Order is not defined, and no entry exists for a day the resource is closed. These are recurring weekly periods with no date component: date-specific closures and exceptions are not represented here at all. |
| `[].openingTimes[].day` | string | The day of the week the period applies to, as an English `DayOfWeek` name — `Sunday` through `Saturday`, capitalised. |
| `[].openingTimes[].startTime` | string | The time the period opens, as `HH:mm` in the site's local time with no date and no zone. **The minute is padded on the wrong side, so any minute from 1 to 9 is rendered with a trailing zero instead of a leading one** — 09:05 comes back as `09:50` and 07:01 as `07:10`. Values on the hour or at 10-minute boundaries are unaffected, which is why the defect is easy to miss. Treat a minute value you cannot corroborate as unreliable rather than parsing it directly. |
| `[].openingTimes[].endTime` | string | The time the period closes, as `HH:mm` in the site's local time with no date and no zone, and **subject to the same minute-padding defect as `startTime`**. Read it as the end of the open period, not as the last bookable slot. |

## Sample response

```json title="200 OK"
[
  {
    "id": "string",
    "description": "string",
    "siteGroupId": "string",
    "calendarId": "string",
    "active": true,
    "openingTimes": [
      {
        "day": "string",
        "startTime": "string",
        "endTime": "string"
      }
    ]
  }
]
```

## Errors

| Status | Meaning | When |
|--------|---------|------|
| `200` | OK | Success. **When there are no resource products the response is `200` with a completely empty body**, not `200` with `[]`. A client that parses the body as JSON unconditionally will throw on it, so check for an empty body before parsing. |
| `500` | Internal server error | An unexpected server-side failure reading the products or their calendars. The response has no body. There is no request input to correct, so retry rather than adjust the call. |
