> ## Documentation Index
> Fetch the complete documentation index at: https://docs.spaportal.cz/llms.txt
> Use this file to discover all available pages before exploring further.

# List the amenity dictionary

> Returns the full hotel amenity dictionary grouped by category. Each
item in `data` contains a stable category code, its localized label,
and the amenities in that category. Each nested amenity has a stable
`code`, localized `label`, and supported `detailKinds`.

This endpoint returns every amenity available in the system, independent
of which amenities are assigned to a particular hotel. Fetch it to build
amenity filters and resolve the codes returned in
`hotel.amenityCategories[].amenities[]`. This small reference list is
not paginated.

Amenities whose `detailKinds` include `options` also carry an `options`
array listing every supported choice with its localized label.

The response is cacheable. Revalidate it with `If-None-Match` to get
`304` while your copy is current, and compare the
`X-SpaPortal-Amenities-Version` header returned by hotel endpoints with
your cached version to detect dictionary updates. See
[Amenities](/api/amenities) for the recommended caching flow.

See the [Amenity](/api/objects/amenity) object for the full field reference.




## OpenAPI

````yaml /api/v2/openapi.yaml get /amenity-categories
openapi: 3.0.3
info:
  title: SpaPortal API v2
  version: '2.0'
  description: The current SpaPortal public API.
servers:
  - url: https://spaportal.cz/api/v2
    description: Production
security:
  - spaPortalPublicKey: []
tags:
  - name: Hotels
  - name: Room types
  - name: Amenity categories
paths:
  /amenity-categories:
    get:
      tags:
        - Amenity categories
      summary: List the amenity dictionary
      description: >
        Returns the full hotel amenity dictionary grouped by category. Each

        item in `data` contains a stable category code, its localized label,

        and the amenities in that category. Each nested amenity has a stable

        `code`, localized `label`, and supported `detailKinds`.


        This endpoint returns every amenity available in the system, independent

        of which amenities are assigned to a particular hotel. Fetch it to build

        amenity filters and resolve the codes returned in

        `hotel.amenityCategories[].amenities[]`. This small reference list is

        not paginated.


        Amenities whose `detailKinds` include `options` also carry an `options`

        array listing every supported choice with its localized label.


        The response is cacheable. Revalidate it with `If-None-Match` to get

        `304` while your copy is current, and compare the

        `X-SpaPortal-Amenities-Version` header returned by hotel endpoints with

        your cached version to detect dictionary updates. See

        [Amenities](/api/amenities) for the recommended caching flow.


        See the [Amenity](/api/objects/amenity) object for the full field
        reference.
      operationId: getAmenityCategories
      parameters:
        - name: If-None-Match
          in: header
          required: false
          schema:
            type: string
          description: >-
            ETag from a previous response. When the dictionary variant is
            unchanged, the API returns `304` with no body. See
            [Amenities](/api/amenities) for the caching flow.
        - $ref: '#/components/parameters/AcceptLanguage'
        - $ref: '#/components/parameters/RequestId'
      responses:
        '200':
          description: The amenity dictionary.
          headers:
            Content-Language:
              $ref: '#/components/headers/ContentLanguage'
            ETag:
              $ref: '#/components/headers/ETag'
            X-SpaPortal-Amenities-Version:
              $ref: '#/components/headers/AmenitiesVersion'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AmenityCategoriesList'
              example:
                data:
                  - category:
                      code: wellness
                      label:
                        cs-CZ: Bazény a wellness
                        de: Pools & Wellness
                        en: Pools & wellness
                    amenities:
                      - code: sauna
                        label:
                          cs-CZ: Sauna
                          de: Sauna
                          en: Sauna
                        detailKinds:
                          - proximity
                          - access
                          - options
                          - opening_hours
                        options:
                          - code: finnish
                            label:
                              cs-CZ: Finská sauna
                              de: Finnische Sauna
                              en: Finnish sauna
                          - code: infrared
                            label:
                              cs-CZ: Infra sauna
                              de: Infrarotsauna
                              en: Infrared sauna
                          - code: steam
                            label:
                              cs-CZ: Parní lázeň
                              de: Dampfbad
                              en: Steam bath
        '304':
          description: >-
            The cached dictionary variant matched by `If-None-Match` is still
            current. The response has no body.
          headers:
            ETag:
              $ref: '#/components/headers/ETag'
            X-SpaPortal-Amenities-Version:
              $ref: '#/components/headers/AmenitiesVersion'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '500':
          $ref: '#/components/responses/InternalServerError'
components:
  parameters:
    AcceptLanguage:
      name: Accept-Language
      in: header
      required: false
      schema:
        type: string
        example: cs-CZ,de
      description: >-
        Comma-separated BCP 47 language tags selecting which locale keys
        localized fields return. When omitted, all locale keys are returned. See
        [Localization](/api/localization) for details.
    RequestId:
      name: X-Request-Id
      in: header
      required: false
      schema:
        type: string
      description: Optional client-provided request identifier echoed in error responses.
  headers:
    ContentLanguage:
      description: Comma-separated locale keys included in localized fields.
      schema:
        type: string
        example: cs-CZ,de
    ETag:
      description: >-
        Entity tag of this amenity-dictionary variant. Send it back in
        `If-None-Match` to revalidate a cached copy.
      schema:
        type: string
        example: '"9f3c2a7d81b04e55-cs-CZ_de"'
    AmenitiesVersion:
      description: >-
        Current amenity dictionary version. The value changes only when the
        dictionary content changes. Refetch `GET /amenity-categories` when it
        differs from the version you cached.
      schema:
        type: string
        example: 9f3c2a7d81b04e55
    RequestId:
      description: Request identifier for support and debugging.
      schema:
        type: string
  schemas:
    AmenityCategoriesList:
      type: object
      required:
        - data
      description: >-
        The complete hotel amenity dictionary grouped by category and returned
        in one response (small, not paginated). It includes every system
        amenity, independent of assignments to individual hotels. Amenities that
        support choices carry their full `options` list.
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/AmenityCategoryGroup'
      example:
        data:
          - category:
              code: wellness
              label:
                cs-CZ: Bazény a wellness
                de: Pools & Wellness
                en: Pools & wellness
            amenities:
              - code: aquapark
                label:
                  cs-CZ: Akvapark
                  de: Aquapark
                  en: Aquapark
                detailKinds:
                  - proximity
                  - access
                  - opening_hours
              - code: sauna
                label:
                  cs-CZ: Sauna
                  de: Sauna
                  en: Sauna
                detailKinds:
                  - proximity
                  - access
                  - options
                  - opening_hours
                options:
                  - code: finnish
                    label:
                      cs-CZ: Finská sauna
                      de: Finnische Sauna
                      en: Finnish sauna
                  - code: infrared
                    label:
                      cs-CZ: Infra sauna
                      de: Infrarotsauna
                      en: Infrared sauna
                  - code: steam
                    label:
                      cs-CZ: Parní lázeň
                      de: Dampfbad
                      en: Steam bath
    AmenityCategoryGroup:
      type: object
      required:
        - category
        - amenities
      description: One amenity category and the amenity dictionary entries assigned to it.
      properties:
        category:
          $ref: '#/components/schemas/AmenityCategory'
        amenities:
          type: array
          items:
            $ref: '#/components/schemas/Amenity'
    ErrorResponse:
      type: object
      required:
        - error
      properties:
        error:
          type: object
          required:
            - code
            - message
            - requestId
          properties:
            code:
              type: string
              enum:
                - invalid_request
                - missing_authentication
                - invalid_authentication
                - insufficient_scope
                - not_found
                - conflict
                - rate_limited
                - internal_error
            message:
              type: string
            details:
              type: array
              items:
                type: object
                additionalProperties: true
            requestId:
              type: string
    AmenityCategory:
      type: object
      required:
        - code
        - label
      properties:
        code:
          type: string
          enum:
            - health
            - wellness
            - dining
            - services
            - accessibility
            - parking
            - sport
            - children
        label:
          $ref: '#/components/schemas/LocalizedString'
    Amenity:
      type: object
      required:
        - code
        - label
        - detailKinds
      description: >-
        One amenity dictionary entry nested under its category in the response
        from `GET /amenity-categories`.
      properties:
        code:
          type: string
          description: Stable code stored on hotels and used for filtering.
          example: sauna
        label:
          allOf:
            - $ref: '#/components/schemas/LocalizedString'
          description: Localized display name.
          example:
            cs-CZ: Sauna
            de: Sauna
            en: Sauna
        detailKinds:
          type: array
          description: >-
            Structured detail field groups supported by this amenity. Resolve
            these snake-case values to AmenityValue properties as documented in
            the Amenity value object reference. An empty array means the amenity
            is presence-only.
          items:
            type: string
            enum:
              - proximity
              - access
              - options
              - opening_hours
              - note
        options:
          type: array
          description: >-
            All choices supported by this amenity. Present when `detailKinds`
            includes `options`.
          items:
            $ref: '#/components/schemas/AmenityOption'
        notePlaceholder:
          allOf:
            - $ref: '#/components/schemas/LocalizedString'
          description: >-
            Optional localized helper text for the amenity note. Omitted when
            the amenity does not define one.
      example:
        code: sauna
        label:
          cs-CZ: Sauna
          de: Sauna
          en: Sauna
          ru: Сауна
        detailKinds:
          - proximity
          - access
          - options
          - opening_hours
        options:
          - code: finnish
            label:
              cs-CZ: Finská sauna
              de: Finnische Sauna
              en: Finnish sauna
              ru: Финская сауна
          - code: steam
            label:
              cs-CZ: Parní lázeň
              de: Dampfbad
              en: Steam bath
              ru: Паровая баня
    LocalizedString:
      type: object
      additionalProperties: false
      properties:
        cs-CZ:
          type: string
          nullable: true
        de:
          type: string
          nullable: true
        en:
          type: string
          nullable: true
        ru:
          type: string
          nullable: true
      description: >-
        Localized field keyed by supported response locale (`cs-CZ`, `de`, `en`,
        `ru`). When `Accept-Language` is set, only the matched keys are
        returned.
      example:
        cs-CZ: Český text
        de: Deutscher Text
    AmenityOption:
      type: object
      required:
        - code
        - label
      description: >-
        One localized amenity-specific option. Its meaning is scoped by the
        parent amenity code.
      properties:
        code:
          type: string
          description: Stable option code.
          example: finnish
        label:
          allOf:
            - $ref: '#/components/schemas/LocalizedString'
          description: Localized option label.
  responses:
    BadRequest:
      description: Invalid request.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/RequestId'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    Unauthorized:
      description: Invalid API key.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/RequestId'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    InternalServerError:
      description: Unexpected server error.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/RequestId'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
  securitySchemes:
    spaPortalPublicKey:
      type: apiKey
      in: header
      name: X-SpaPortal-Public-Key
      description: >-
        See [Authentication](/api/authentication) for how to obtain and send
        your public key.

````