> ## Documentation Index
> Fetch the complete documentation index at: https://api-doc.xmenu.it/llms.txt
> Use this file to discover all available pages before exploring further.

# List categories

> Returns a paginated list of menu categories for the specified restaurant.



## OpenAPI

````yaml openapi-en.json GET /menu/categories
openapi: 3.1.0
info:
  title: xMenu API
  description: xMenu Public API - REST endpoints and webhook notifications
  version: 1.0.0
servers:
  - url: https://app.xmenu.it/api
    description: xMenu API Production
security: []
paths:
  /menu/categories:
    get:
      tags:
        - Menu Consultation
      summary: List categories
      description: >-
        Returns a paginated list of menu categories for the specified
        restaurant.
      operationId: getCategories
      parameters:
        - name: restuid
          in: query
          required: false
          schema:
            type: string
          description: >-
            Unique restaurant identifier (not required with `X-Client-Id`
            authentication)
        - name: page
          in: query
          required: true
          schema:
            type: integer
            minimum: 1
          description: Page number to retrieve
        - name: pagesize
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 100
          description: 'Number of results per page (max: 100)'
        - name: visible
          in: query
          required: false
          schema:
            type: integer
            enum:
              - 0
              - 1
            default: 1
          description: >-
            Filter for visible categories only (0 = all, 1 = only non-hidden
            categories)
        - name: q
          in: query
          required: false
          schema:
            type: string
          description: Search query to filter categories by name
      responses:
        '200':
          description: Categories list response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CategoriesListResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
      security:
        - apiKey: []
        - clientId: []
          clientSecret: []
        - oauth2: []
components:
  schemas:
    CategoriesListResponse:
      allOf:
        - $ref: '#/components/schemas/PaginatedResponse'
        - type: object
          properties:
            categories:
              type: array
              description: List of categories
              items:
                $ref: '#/components/schemas/MenuCategory'
    PaginatedResponse:
      type: object
      required:
        - success
        - page
        - pagesize
        - total_count
        - more
      properties:
        success:
          type: boolean
          description: 'Operation result: `true` if successful, `false` if failed'
        page:
          type: integer
          description: Current page number
        pagesize:
          type: integer
          description: Maximum number of items per page
        total_count:
          type: integer
          description: Total number of results available
        more:
          type: boolean
          description: Indicates if there are more pages available
        error:
          type: string
          description: >-
            Error code if the operation failed.


            See [Error codes](/docs/en/overview/error-codes) for general error
            codes that may occur.
        message:
          type: string
          description: Human-readable error description if the operation failed
    MenuCategory:
      type: object
      description: Menu category
      properties:
        uid:
          type: string
          description: Unique category identifier
        name:
          type: string
          description: Category name
        description:
          type: string
          description: Category description
        image:
          type: string
          description: Image URL
        products_count:
          type: integer
          description: Number of products in the category
        url:
          type: string
          description: Category page URL
        hidden:
          type: boolean
          description: Visibility status
        position:
          type: integer
          description: Display position
        subrestaurant_uids:
          type: array
          items:
            type: string
          nullable: true
          description: >-
            List of subrestaurant UIDs where this category is available (null =
            available in all locations)
        ext_id:
          $ref: '#/components/schemas/ExtId'
        options:
          type: array
          description: Category options inherited by products
          items:
            $ref: '#/components/schemas/MenuOption'
    ExtId:
      type: string
      description: >-
        Available when authenticating via API Client: External ID passed during
        menu import
    MenuOption:
      type: object
      description: Menu product or category option
      properties:
        uid:
          type: string
          description: Unique option identifier
        name:
          type: string
          description: Option title
        short_name:
          type: string
          description: Abbreviated option title
        type:
          type: string
          enum:
            - single
            - multiple
          description: |-
            Selection type:
            - `single` = Single choice
            - `multiple` = Multiple choices allowed
        min_selectable:
          type: integer
          description: Minimum number of selectable values (only for type `multiple`)
        max_selectable:
          type: integer
          description: Maximum number of selectable values (only for type `multiple`)
        max_quantity:
          type: integer
          description: Maximum quantity per value selection (if >1)
        note:
          type: string
          description: Option-related notes
        hidden:
          type: boolean
          description: |-
            Visibility status:
            - `false` = Visible
            - `true` = Archived
        position:
          type: integer
          description: Display position (starts at 1)
        primary:
          type: boolean
          description: |-
            Primary option flag (only for type `single`):
            - `false` = Non-primary
            - `true` = Primary option
        first_default:
          type: boolean
          description: |-
            Default selection behavior (only for type `single`):
            - `false` = User must select
            - `true` = First value used as default
        show_caption:
          type: boolean
          description: |-
            Cart display setting (only for type `single`):
            - `false` = Hide in cart
            - `true` = Display in cart
        print_caption:
          type: boolean
          description: |-
            Print behavior:
            - `false` = Omit from order printing
            - `true` = Include in printing
        subrestaurant_uids:
          type: array
          items:
            type: string
          nullable: true
          description: >-
            List of subrestaurant UIDs where this option is available (null =
            available in all locations)
        ext_id:
          $ref: '#/components/schemas/ExtId'
        option_values:
          type: array
          description: Available option values
          items:
            $ref: '#/components/schemas/MenuOptionValue'
    MenuOptionValue:
      type: object
      description: Menu option value with price modifier
      properties:
        uid:
          type: string
          description: Unique option value identifier
        name:
          type: string
          description: Option value name
        short_name:
          type: string
          description: Abbreviated option value name
        price_operator:
          type: string
          enum:
            - +
            - '-'
            - '*'
            - /
          description: |-
            Price modifier operator:
            - `+` = Addition
            - `-` = Subtraction
            - `*` = Multiplication
            - `/` = Division
        price_operand:
          type: number
          description: Price modification amount
        hidden:
          type: boolean
          description: |-
            Visibility status:
            - `false` = Visible
            - `true` = Archived
        position:
          type: integer
          description: Display position (starts at 1)
        checked_default:
          type: boolean
          description: |-
            Default selection state:
            - `false` = Not preselected
            - `true` = Preselected by default
        subrestaurant_uids:
          type: array
          items:
            type: string
          nullable: true
          description: >-
            List of subrestaurant UIDs where this value is available (null =
            available in all locations)
        restrict_to_primary_value_uids:
          type: array
          items:
            type: string
          nullable: true
          description: >-
            UIDs of primary option values for which this value is available:

            - `null` = No restriction (always available)

            - `[]` = Restriction active, but no primary values allowed (never
            available)

            - `["uid1", ...]` = Available only when one of these primary option
            values is selected
        ext_id:
          $ref: '#/components/schemas/ExtId'
  responses:
    Unauthorized:
      description: Authentication failed.
      content:
        application/json:
          schema:
            oneOf:
              - type: object
                description: >-
                  Standard error format (when using API Key or Client ID/Secret
                  authentication)
                required:
                  - success
                  - error
                properties:
                  success:
                    type: boolean
                    enum:
                      - false
                    description: Always false for errors
                  error:
                    type: string
                    enum:
                      - RESTAURANT_NOT_FOUND
                      - INVALID_KEY
                      - INVALID_AUTH
                    description: Error code
                  message:
                    type: string
                    description: Human-readable error description
              - type: object
                description: OAuth error format (when using Bearer token authentication)
                required:
                  - error
                properties:
                  error:
                    type: string
                    enum:
                      - invalid_token
                      - invalid_request
                    description: OAuth error code (RFC 6749)
                  error_description:
                    type: string
                    description: Human-readable error description
          examples:
            standard:
              summary: Standard error format (API Key / Client ID+Secret)
              value:
                success: false
                error: INVALID_KEY
                message: The provided API key is not valid
            oauth:
              summary: OAuth error format (Bearer token)
              value:
                error: invalid_token
                error_description: Access token is invalid or expired
    Forbidden:
      description: Authorization failed - insufficient permissions or access denied.
      content:
        application/json:
          schema:
            oneOf:
              - type: object
                description: >-
                  Standard error format (when using API Key or Client ID/Secret
                  authentication)
                required:
                  - success
                  - error
                properties:
                  success:
                    type: boolean
                    enum:
                      - false
                    description: Always false for errors
                  error:
                    type: string
                    enum:
                      - API_DISABLED
                      - INSUFFICIENT_SCOPE
                      - UNAUTHORIZED
                    description: Error code
                  message:
                    type: string
                    description: Human-readable error description
              - type: object
                description: OAuth error format (when using Bearer token authentication)
                required:
                  - error
                properties:
                  error:
                    type: string
                    enum:
                      - insufficient_scope
                      - invalid_request
                    description: OAuth error code (RFC 6749)
                  error_description:
                    type: string
                    description: Human-readable error description
          examples:
            standard:
              summary: Standard error format (API Key / Client ID+Secret)
              value:
                success: false
                error: API_DISABLED
                message: API access is not enabled for the restaurant
            oauth:
              summary: OAuth error format (Bearer token)
              value:
                error: insufficient_scope
                error_description: 'Missing required permissions: write:orders'
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: X-Api-Key
      description: >-
        Restaurant API Key. Can be obtained from Tools > API Access in the xMenu
        dashboard.
    clientId:
      type: apiKey
      in: header
      name: X-Client-Id
      description: >-
        Client ID for API Client authentication (must be used together with
        Client Secret)
    clientSecret:
      type: apiKey
      in: header
      name: X-Client-Secret
      description: >-
        Client Secret for API Client authentication (must be used together with
        Client ID)
    oauth2:
      type: oauth2
      flows:
        clientCredentials:
          tokenUrl: https://app.xmenu.it/oauth/token
          scopes: {}
      description: >-
        OAuth 2.0 authentication using client credentials flow. The access token
        must be included in the Authorization header as a Bearer token.

````