# Retrieves all site amenities with their configuration details

`GET /api/configuration/site-amenities`

- **Success:** `200 OK`
- **Products:** Operator (`FOH`), Consumer (`CONSUMER`) (any one of these products, not all)
- **Features:** Online Joining (`ONLINEJOIN`), Front of House Generic Access (`FOHGENERIC`) (any one of these features, not all)

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

## Overview

Lists every amenity defined in the environment — the vocabulary of conveniences a site can advertise, such as parking, Wi-Fi or a cafe. This is the master list, not a per-site list: it tells you which amenities exist and what each is called, but not which sites offer them.

To find the amenities at a particular site, read the site instead — [Get site by id](get-site-by-id.md) and [Get all sites with optional filtering](get-all-sites-with-optional-filtering.md) return each site's mapped amenities inline, with the same fields and translations you see here. Use this endpoint when you need the full vocabulary up front, for example to render a filter list on a site-finder page.

**Amenities are read-only through the API.** There is no create, update or delete endpoint for an amenity; the list is maintained by Gladstone. What a tenant controls is which sites each amenity is mapped to, through the site endpoints.

Every amenity is returned. There is no active or visible flag on an amenity and the endpoint applies no filter, so nothing is hidden from you and nothing needs paging.

## Endpoint

`GET {base_url}/api/configuration/site-amenities`

`{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/site-amenities' \
  -H 'Authorization: Bearer {accessToken}' \
  -H 'X-Use-SSO: true'
```

## Response fields

| Field | Type | Description |
|-------|------|-------------|
| `[].id` | integer (int32) | The amenity's numeric identifier. It is what the site write endpoints expect when you map an amenity to a site, but it is not the key the platform joins translations on — see `amenityKey`. Do not treat it as portable between environments. |
| `[].amenityKey` | string | The amenity's stable code, maximum 50 characters, required and **unique across the whole list** — the only field here with a uniqueness guarantee. It is also the value translations are stored against, so `amenityKey`, not `id`, is what you match on if you need to recognise a specific amenity in your own code. |
| `[].name` | string | The amenity's display label in the environment's base language, maximum 100 characters and never null. Not unique — two amenities can share a name, so key on `amenityKey`. For a localised interface, look for a `translations` entry with `type` `Name` and the culture you want, and fall back to this value when none exists. |
| `[].description` | string | Longer explanatory text about the amenity, up to 255 characters. Optional, so `null` where none was recorded. Localised the same way as `name`, through a `translations` entry with `type` `Description`. |
| `[].translations` | array of object | Localised variants of this amenity's text fields, looked up by `amenityKey`. **Always present, and an empty array `[]` when nothing has been translated** — never null. Each entry translates one property into one culture, so an amenity with a translated name and description in two languages yields four entries. Nothing here is guaranteed complete: a culture may be present for `Name` and absent for `Description`, so always fall back to the base `name` and `description`. Translations are maintained through the translation endpoints, not by any amenity endpoint. |
| `[].translations[].type` | string | Which property of the amenity this entry translates, matching the field name — `Name` or `Description`. Maximum 50 characters. It is stored verbatim from whatever the translation import supplied, so treat an unrecognised value as data you should ignore rather than a field you have missed. |
| `[].translations[].culture` | string | The culture the `text` is written in, maximum 20 characters, in the form the environment's translation data uses. Compare it against the cultures returned by [Get all available cultures](get-all-available-cultures.md) rather than assuming a fixed set, and do not assume every culture is present for every amenity. |
| `[].translations[].text` | string | The translated value itself, to be used in place of the base `name` or `description` for the matching `culture`. Unbounded length. |

## Sample response

```json title="200 OK"
[
  {
    "id": 12345,
    "amenityKey": "string",
    "name": "string",
    "description": "string",
    "translations": [
      {
        "type": "string",
        "culture": "string",
        "text": "string"
      }
    ]
  }
]
```

## Errors

| Status | Meaning | When |
|--------|---------|------|
| `200` | OK | Success. An environment with no amenities defined returns `200` with an empty JSON array `[]` — the endpoint deliberately returns `200` rather than `204` for an empty result. |
| `500` | Internal server error | An unexpected server-side failure reading the list, such as a platform outage or a failure looking up translations. The response has no body. There is no request input to correct, so retry rather than adjust the call. |
