{
  "openapi" : "3.1.0",
  "info" : {
    "title" : "SellSite Frontend API",
    "version" : "1.0.0",
    "description" : "Provides versioned APIs for SellSite frontend applications."
  },
  "paths" : {
    "/frontend-api/v1/baskets" : {
      "get" : {
        "operationId" : "get-frontend-api-v1-baskets",
        "summary" : "List Baskets",
        "description" : "Lists the baskets available to the current buyer: the currently selected basket first (marked as\n'active'), followed by the parked baskets, ordered by their last modification. Each entry carries the\nid to be used for the select endpoint, the title, the position count and - if sums may be shown - the\ntotals. Returns at most 'limit' baskets (50 by default, 500 at most); there is no other pagination.\n",
        "tags" : [ "Basket" ],
        "parameters" : [ {
          "name" : "limit",
          "in" : "query",
          "required" : false,
          "description" : "The maximum number of baskets to return. Defaults to 50, capped at 500.",
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "Successful response",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ApiBasketListResponse"
                }
              }
            }
          }
        }
      }
    },
    "/frontend-api/v1/baskets/select" : {
      "post" : {
        "operationId" : "post-frontend-api-v1-baskets-select",
        "summary" : "Select Basket",
        "description" : "Selects the given basket as the active basket of the buyer and returns its state. Use the literal 'new'\nas id to create and select a fresh, empty basket, which effectively parks the current one. The basket\nbecomes the current basket exactly like in the classic web frontend, so all subsequent basket and\ncheckout API calls target it. Responds with 400 if no id is given, with 404 if the basket does not\nexist or is not accessible, and with 403 if the shop configuration does not permit switching baskets.\n",
        "tags" : [ "Basket" ],
        "parameters" : [ {
          "name" : "includeQuantities",
          "in" : "query",
          "required" : false,
          "description" : "Whether to report the order quantity metadata (minimum order quantity and order step) of every position. Defaults to false, as it costs an item lookup per position.",
          "schema" : {
            "type" : "string"
          }
        } ],
        "requestBody" : {
          "required" : true,
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/ApiBasketSelectRequest"
              }
            }
          }
        },
        "responses" : {
          "200" : {
            "description" : "Successful response",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ApiBasketStateResponse"
                }
              }
            }
          }
        }
      }
    },
    "/frontend-api/v1/baskets/delete" : {
      "post" : {
        "operationId" : "post-frontend-api-v1-baskets-delete",
        "summary" : "Delete Basket",
        "description" : "Deletes the given basket and returns the remaining baskets, in the very same shape as the list\nendpoint - a client rendering the basket selection can re-render straight from the response. The\ncurrently selected basket cannot be deleted (400 with 'current_basket'): select another one first, as\nthe web basket selection does. Responds with 400 if no id is given, with 404 if the basket does not\nexist or is not accessible, and with 403 if the shop configuration does not permit switching baskets.\n",
        "tags" : [ "Basket" ],
        "parameters" : [ {
          "name" : "limit",
          "in" : "query",
          "required" : false,
          "description" : "The maximum number of baskets to return afterwards. Defaults to 50, capped at 500.",
          "schema" : {
            "type" : "string"
          }
        } ],
        "requestBody" : {
          "required" : true,
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/ApiBasketDeleteRequest"
              }
            }
          }
        },
        "responses" : {
          "200" : {
            "description" : "Successful response",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ApiBasketListResponse"
                }
              }
            }
          }
        }
      }
    },
    "/frontend-api/v1/baskets/rename" : {
      "post" : {
        "operationId" : "post-frontend-api-v1-baskets-rename",
        "summary" : "Rename Basket",
        "description" : "Renames the given basket (the currently selected one without a 'basketId') and returns its updated state. Unlike the other endpoints, a deviating 'basketId' does not select that basket - renaming a parked basket from the basket selection leaves the selection untouched, but requires the same permissions as selecting it (403 otherwise). An empty title resets the basket to its generated default title. Responds with 400 if no title is given, if it exceeds 512 characters, or if the selected order method enforces the title ('title_not_changeable').",
        "tags" : [ "Basket" ],
        "parameters" : [ {
          "name" : "includeQuantities",
          "in" : "query",
          "required" : false,
          "description" : "Whether to report the order quantity metadata (minimum order quantity and order step) of every position. Defaults to false, as it costs an item lookup per position.",
          "schema" : {
            "type" : "string"
          }
        } ],
        "requestBody" : {
          "required" : true,
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/ApiBasketRenameRequest"
              }
            }
          }
        },
        "responses" : {
          "200" : {
            "description" : "Successful response",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ApiBasketStateResponse"
                }
              }
            }
          }
        }
      }
    },
    "/frontend-api/v1/basket" : {
      "get" : {
        "operationId" : "get-frontend-api-v1-basket",
        "summary" : "Basket State",
        "description" : "Returns the full state of the basket: title, totals, positions (with prices, comments and messages) and\nbasket level messages. Does not await a running recomputation - it reports one via 'recomputing'\ninstead, so poll again once it has finished to receive final prices. Responds with 404 if the buyer has\nno basket yet.\n",
        "tags" : [ "Basket" ],
        "parameters" : [ {
          "name" : "basketId",
          "in" : "query",
          "required" : false,
          "description" : "The id of the basket to read. Defaults to the currently selected basket. A different basket is selected as the active basket first.",
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "includeQuantities",
          "in" : "query",
          "required" : false,
          "description" : "Whether to report the order quantity metadata (minimum order quantity and order step) of every position. Defaults to false, as it costs an item lookup per position.",
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "Successful response",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ApiBasketStateResponse"
                }
              }
            }
          }
        }
      }
    },
    "/frontend-api/v1/basket/summary" : {
      "get" : {
        "operationId" : "get-frontend-api-v1-basket-summary",
        "summary" : "Basket Summary",
        "description" : "Returns the compact summary of the basket for the basket icon in the header: the effective total price,\nthe position count and the shortened title. Deliberately fast - it does not await a running\nrecomputation but reports one via 'recomputing', so poll again once it has finished. Responds with 404\nif the buyer has no basket yet.\n",
        "tags" : [ "Basket" ],
        "parameters" : [ {
          "name" : "basketId",
          "in" : "query",
          "required" : false,
          "description" : "The id of the basket to read. Defaults to the currently selected basket. A different basket is selected as the active basket first.",
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "Successful response",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ApiBasketSummaryResponse"
                }
              }
            }
          }
        }
      }
    },
    "/frontend-api/v1/basket/positions/add" : {
      "post" : {
        "operationId" : "post-frontend-api-v1-basket-positions-add",
        "summary" : "Add Positions",
        "description" : "Adds one or more items to the basket, optionally with a comment, a quantity in an alternative sales\nunit, additions (sub positions like cutting services) and ignored mandatory accessory groups. Items\nwhose number cannot be resolved are skipped and reported via 'missingItemNumbers', items the shop\nrejects (e.g. one which may not be ordered) are skipped with their reason reported in 'messages' - the\nresponse stays 200 in both cases. Creates a basket if the buyer has none yet, exactly like the web shop does. Awaits the\ntriggered recomputation and returns the updated basket state, so no separate refresh call is needed.\n",
        "tags" : [ "Basket" ],
        "parameters" : [ {
          "name" : "includeQuantities",
          "in" : "query",
          "required" : false,
          "description" : "Whether to report the order quantity metadata (minimum order quantity and order step) of every position. Defaults to false, as it costs an item lookup per position.",
          "schema" : {
            "type" : "string"
          }
        } ],
        "requestBody" : {
          "required" : true,
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/ApiBasketAddPositionsRequest"
              }
            }
          }
        },
        "responses" : {
          "200" : {
            "description" : "Successful response",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ApiBasketAddPositionsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/frontend-api/v1/basket/positions/update" : {
      "post" : {
        "operationId" : "post-frontend-api-v1-basket-positions-update",
        "summary" : "Update Positions",
        "description" : "Changes the quantities and/or comments of one or more basket positions. Omitted fields are left\nunchanged, an empty comment removes the comment. Quantities refer to the base unit of the item - the\nsame unit the 'quantity' of the state response reports. All changes are validated first and applied\ntogether within one basket lock - a request with an unknown position id or an invalid change is\nrejected as a whole. Unlike the web basket, a quantity of 0 does not delete the position but is\nrejected with 'invalid_quantity' - use the remove endpoint instead. Awaits the triggered recomputation\nand returns the updated basket state.\n",
        "tags" : [ "Basket" ],
        "parameters" : [ {
          "name" : "includeQuantities",
          "in" : "query",
          "required" : false,
          "description" : "Whether to report the order quantity metadata (minimum order quantity and order step) of every position. Defaults to false, as it costs an item lookup per position.",
          "schema" : {
            "type" : "string"
          }
        } ],
        "requestBody" : {
          "required" : true,
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/ApiBasketUpdatePositionsRequest"
              }
            }
          }
        },
        "responses" : {
          "200" : {
            "description" : "Successful response",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ApiBasketStateResponse"
                }
              }
            }
          }
        }
      }
    },
    "/frontend-api/v1/basket/positions/remove" : {
      "post" : {
        "operationId" : "post-frontend-api-v1-basket-positions-remove",
        "summary" : "Remove Positions",
        "description" : "Removes one or more positions from the basket, including their sub and subordinate positions. Responds\nwith 404 if one of the position ids does not exist in the basket - nothing is removed in that case.\nAwaits the triggered recomputation and returns the updated basket state.\n",
        "tags" : [ "Basket" ],
        "parameters" : [ {
          "name" : "includeQuantities",
          "in" : "query",
          "required" : false,
          "description" : "Whether to report the order quantity metadata (minimum order quantity and order step) of every position. Defaults to false, as it costs an item lookup per position.",
          "schema" : {
            "type" : "string"
          }
        } ],
        "requestBody" : {
          "required" : true,
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/ApiBasketRemovePositionsRequest"
              }
            }
          }
        },
        "responses" : {
          "200" : {
            "description" : "Successful response",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ApiBasketStateResponse"
                }
              }
            }
          }
        }
      }
    },
    "/frontend-api/v1/basket/messages/acknowledge" : {
      "post" : {
        "operationId" : "post-frontend-api-v1-basket-messages-acknowledge",
        "summary" : "Acknowledge Messages",
        "description" : "Marks basket messages as acknowledged by their 'id' (see 'messages' in the state response) and returns\nthe updated basket state. Ids without a matching message are silently ignored. The acknowledgement is\nshared with the checkout: an acknowledgeable warning acknowledged here no longer blocks 'canCommit' of\nthe checkout API.\n",
        "tags" : [ "Basket" ],
        "parameters" : [ {
          "name" : "includeQuantities",
          "in" : "query",
          "required" : false,
          "description" : "Whether to report the order quantity metadata (minimum order quantity and order step) of every position. Defaults to false, as it costs an item lookup per position.",
          "schema" : {
            "type" : "string"
          }
        } ],
        "requestBody" : {
          "required" : true,
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/ApiBasketAcknowledgeMessagesRequest"
              }
            }
          }
        },
        "responses" : {
          "200" : {
            "description" : "Successful response",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ApiBasketStateResponse"
                }
              }
            }
          }
        }
      }
    },
    "/frontend-api/v1/checkout" : {
      "get" : {
        "operationId" : "get-frontend-api-v1-checkout",
        "summary" : "Checkout State",
        "description" : "Returns the current state of the checkout for the logged in buyer: the basket summary, invoice/shipping\naddress and contact, the selected and available order/shipping/payment methods, custom fields, messages\nand whether the basket is in a committable state ('canCommit'). Requires a basket to already exist for\nthe buyer - responds with 404 otherwise. This endpoint does not run the field validation, so 'canCommit'\nalone is no promise that completing will succeed - call the validate endpoint before offering to place\nthe order.\n",
        "tags" : [ "Checkout" ],
        "parameters" : [ {
          "name" : "includeQuantities",
          "in" : "query",
          "required" : false,
          "description" : "Whether to report the order quantity metadata (minimum order quantity and order step) of every position. Defaults to false, as it costs an item lookup per position.",
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "Successful response",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ApiCheckoutStateResponse"
                }
              }
            }
          }
        }
      }
    },
    "/frontend-api/v1/checkout/update" : {
      "post" : {
        "operationId" : "post-frontend-api-v1-checkout-update",
        "summary" : "Update Checkout",
        "description" : "Applies a partial update to the checkout: invoice/shipping address and contact, order/shipping/payment\nmethod, pickup site, desired delivery date, buyer information, project, commission, coupon code,\ncomment and custom fields. Only fields actually present in the request are applied - everything else\nis left untouched. Returns the same state shape as the GET endpoint (\"read your writes\"). This does not\nperform the full checkout validation (see the validate endpoint) - it only enforces the basic\nconsistency of the given fields.\n",
        "tags" : [ "Checkout" ],
        "parameters" : [ {
          "name" : "includeQuantities",
          "in" : "query",
          "required" : false,
          "description" : "Whether to report the order quantity metadata (minimum order quantity and order step) of every position. Defaults to false, as it costs an item lookup per position.",
          "schema" : {
            "type" : "string"
          }
        } ],
        "requestBody" : {
          "required" : true,
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/ApiCheckoutUpdateRequest"
              }
            }
          }
        },
        "responses" : {
          "200" : {
            "description" : "Successful response",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ApiCheckoutStateResponse"
                }
              }
            }
          }
        }
      }
    },
    "/frontend-api/v1/checkout/validate" : {
      "post" : {
        "operationId" : "post-frontend-api-v1-checkout-validate",
        "summary" : "Validate Checkout",
        "description" : "Validates the checkout without committing it: enforces all checkout constraints, awaits a pending\nrecomputation of the basket and then runs the full field validation. Hard problems (e.g. a missing\nrequired field) are reported as a structured HTTP error - soft problems are reported via 'messages' and\n'canCommit' in the returned state, mirroring the GET endpoint. Optionally acknowledges messages (e.g. a\nsevere stock warning) before evaluating whether the checkout can be completed.\n",
        "tags" : [ "Checkout" ],
        "parameters" : [ {
          "name" : "includeQuantities",
          "in" : "query",
          "required" : false,
          "description" : "Whether to report the order quantity metadata (minimum order quantity and order step) of every position. Defaults to false, as it costs an item lookup per position.",
          "schema" : {
            "type" : "string"
          }
        } ],
        "requestBody" : {
          "required" : true,
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/ApiCheckoutValidateRequest"
              }
            }
          }
        },
        "responses" : {
          "200" : {
            "description" : "Successful response",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ApiCheckoutStateResponse"
                }
              }
            }
          }
        }
      }
    },
    "/frontend-api/v1/checkout/complete" : {
      "post" : {
        "operationId" : "post-frontend-api-v1-checkout-complete",
        "summary" : "Complete Checkout",
        "description" : "Completes (commits) the checkout and returns the order confirmation. v1 only supports the 'plain'\npayment method (no external payment provider) - if the selected payment method requires one (e.g.\nPayPal or Payone), this responds with HTTP 501 instead of completing the order; see the KBA\ndocumentation for the tracked follow-up ticket. Optionally acknowledges messages (e.g. a severe stock\nwarning) before completing.\n",
        "tags" : [ "Checkout" ],
        "parameters" : [ {
          "name" : "includeQuantities",
          "in" : "query",
          "required" : false,
          "description" : "Whether to report the order quantity metadata (minimum order quantity and order step) of every position. Defaults to false, as it costs an item lookup per position.",
          "schema" : {
            "type" : "string"
          }
        } ],
        "requestBody" : {
          "required" : true,
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/ApiCheckoutCompleteRequest"
              }
            }
          }
        },
        "responses" : {
          "200" : {
            "description" : "Successful response",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ApiCheckoutCompleteResponse"
                }
              }
            }
          }
        }
      },
      "get" : {
        "operationId" : "get-frontend-api-v1-checkout-complete",
        "summary" : "Checkout Completion",
        "description" : "Returns the confirmation (order number, totals, positions) of the current or last completed checkout of\nthis session. Responds with 404 if no checkout was completed yet.\n",
        "tags" : [ "Checkout" ],
        "parameters" : [ {
          "name" : "includeQuantities",
          "in" : "query",
          "required" : false,
          "description" : "Whether to report the order quantity metadata (minimum order quantity and order step) of every position. Defaults to false, as it costs an item lookup per position.",
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "Successful response",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ApiCheckoutCompleteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/frontend-api/v1/checkout/addresses" : {
      "get" : {
        "operationId" : "get-frontend-api-v1-checkout-addresses",
        "summary" : "Suggest Addresses",
        "description" : "Suggests addresses of the buyer's address book matching the given query, to be offered when the user\nselects a shipping address. Send the 'correlationId' of the picked address along with its fields in the\nupdate request.\n",
        "tags" : [ "Checkout" ],
        "parameters" : [ {
          "name" : "query",
          "in" : "query",
          "required" : false,
          "description" : "An optional query to filter the addresses with. Omit it to list the first addresses.",
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "Successful response",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ApiCheckoutAddressSuggestionsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/frontend-api/v1/checkout/projects" : {
      "get" : {
        "operationId" : "get-frontend-api-v1-checkout-projects",
        "summary" : "Suggest Projects",
        "description" : "Suggests projects available to the buyer matching the given query, to be offered when the user selects\na project. Send the 'id' of the picked project as 'projectId' in the update request.\n",
        "tags" : [ "Checkout" ],
        "parameters" : [ {
          "name" : "query",
          "in" : "query",
          "required" : false,
          "description" : "An optional query to filter the projects with. Omit it to list the first projects.",
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "Successful response",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ApiCheckoutProjectSuggestionsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/frontend-api/v1/favorite-lists" : {
      "get" : {
        "operationId" : "get-frontend-api-v1-favorite-lists",
        "summary" : "List Favorite Lists",
        "description" : "Lists the favorite lists visible to the current buyer: their own private lists as well as the shared\nlists of their customer, sorted by position and name. Each entry carries the category used to group\nlists - entries without a category should be grouped under a label of the client's own choosing -\nalong with the 'editable' flag and the number of favorites the list contains.\n",
        "tags" : [ "Favorites" ],
        "responses" : {
          "200" : {
            "description" : "Successful response",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ApiFavoriteListsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/frontend-api/v1/favorite-lists/create" : {
      "post" : {
        "operationId" : "post-frontend-api-v1-favorite-lists-create",
        "summary" : "Create Favorite List",
        "description" : "Creates a new favorite list for the current buyer. Lists are private by default - a non-private list is\nvisible to all buyers of the customer and may optionally be made editable for them as well. Responds\nwith 400 if the name is missing or already used by another list of the same category.\n",
        "tags" : [ "Favorites" ],
        "requestBody" : {
          "required" : true,
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/ApiFavoriteListCreateRequest"
              }
            }
          }
        },
        "responses" : {
          "200" : {
            "description" : "Successful response",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ApiFavoriteListOverviewResponse"
                }
              }
            }
          }
        }
      }
    },
    "/frontend-api/v1/favorite-lists/update" : {
      "post" : {
        "operationId" : "post-frontend-api-v1-favorite-lists-update",
        "summary" : "Update Favorite List",
        "description" : "Updates the name, category or visibility settings of a favorite list. Omitted fields are left unchanged,\nan empty category clears the category. The visibility settings ('privateList' and\n'editableByColleagues') of a list belonging to another buyer can only be changed by that buyer, as they\ndecide who may see the list at all. Responds with 404 if the list does not exist or is not accessible,\nwith 403 if it is not editable by the current buyer ('not_editable') or if a visibility change was\nattempted on a colleague's list ('not_list_owner'), and with 400 if the new name is empty or already\nused by another list of the same category.\n",
        "tags" : [ "Favorites" ],
        "requestBody" : {
          "required" : true,
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/ApiFavoriteListUpdateRequest"
              }
            }
          }
        },
        "responses" : {
          "200" : {
            "description" : "Successful response",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ApiFavoriteListOverviewResponse"
                }
              }
            }
          }
        }
      }
    },
    "/frontend-api/v1/favorite-lists/remove" : {
      "post" : {
        "operationId" : "post-frontend-api-v1-favorite-lists-remove",
        "summary" : "Remove Favorite Lists",
        "description" : "Removes one or more favorite lists along with the favorites they contain. All lists are validated first\nand removed together - a request with an unknown list id (404) or a list which is not editable (403) is\nrejected as a whole and nothing is removed.\n",
        "tags" : [ "Favorites" ],
        "requestBody" : {
          "required" : true,
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/ApiFavoriteListsRemoveRequest"
              }
            }
          }
        },
        "responses" : {
          "200" : {
            "description" : "Successful response",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ApiFavoriteListsRemoveResponse"
                }
              }
            }
          }
        }
      }
    },
    "/frontend-api/v1/favorite-list" : {
      "get" : {
        "operationId" : "get-frontend-api-v1-favorite-list",
        "summary" : "Favorite List Details",
        "description" : "Returns a single favorite list along with the requested page of its favorites, sorted by position. Each\nfavorite carries its stored quantity and the item data in the same format as delivered by the search\nAPI - favorites whose item is no longer available in the shop keep their item number but come without\nan item block. Responds with 404 if the list does not exist or is not accessible.\n",
        "tags" : [ "Favorites" ],
        "parameters" : [ {
          "name" : "listId",
          "in" : "query",
          "required" : true,
          "description" : "The id of the favorite list to read.",
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "includePrices",
          "in" : "query",
          "required" : false,
          "description" : "Whether to report the price and availability of every item. Defaults to false, as prices may require an ERP round-trip.",
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "page",
          "in" : "query",
          "required" : false,
          "description" : "The one-based page of favorites to return. Defaults to 1.",
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "pageSize",
          "in" : "query",
          "required" : false,
          "description" : "The maximum number of favorites per page. Defaults to 25, capped at 100.",
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "Successful response",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ApiFavoriteListResponse"
                }
              }
            }
          }
        }
      }
    },
    "/frontend-api/v1/favorite-list/favorites/add" : {
      "post" : {
        "operationId" : "post-frontend-api-v1-favorite-list-favorites-add",
        "summary" : "Add Favorite",
        "description" : "Adds an item to a favorite list, addressed by its unique item number or by an unambiguous visible item\nnumber. If no list id is given, the item is added to the private default list of the buyer, which is\ncreated on demand - a shared list is never used for this. The quantity defaults to the recommended\norder quantity of the item. Adding is idempotent per item - if the list already contains the item, the\nexisting favorite is returned unchanged and flagged via 'alreadyExisted'. Responds with 404 if the list\nor the item does not exist, with 403 if the list is not editable, and with 400 if the quantity is not\npositive or exceeds the storable range.\n",
        "tags" : [ "Favorites" ],
        "requestBody" : {
          "required" : true,
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/ApiFavoriteAddItemRequest"
              }
            }
          }
        },
        "responses" : {
          "200" : {
            "description" : "Successful response",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ApiFavoriteAddItemResponse"
                }
              }
            }
          }
        }
      }
    },
    "/frontend-api/v1/favorite-list/favorites/update" : {
      "post" : {
        "operationId" : "post-frontend-api-v1-favorite-list-favorites-update",
        "summary" : "Update Favorites",
        "description" : "Changes the stored quantities of one or more favorites of a favorite list. All changes are validated\nfirst and applied together - a request with an unknown favorite id (404) or a non-positive quantity\n(400) is rejected as a whole. Duplicate favorite ids are collapsed to the last entry. The updated\nquantities are immediately visible to subsequent reads.\n",
        "tags" : [ "Favorites" ],
        "requestBody" : {
          "required" : true,
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/ApiFavoritesUpdateRequest"
              }
            }
          }
        },
        "responses" : {
          "200" : {
            "description" : "Successful response",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ApiFavoritesUpdateResponse"
                }
              }
            }
          }
        }
      }
    },
    "/frontend-api/v1/favorite-list/favorites/remove" : {
      "post" : {
        "operationId" : "post-frontend-api-v1-favorite-list-favorites-remove",
        "summary" : "Remove Favorites",
        "description" : "Removes one or more favorites from a favorite list. All favorites are validated first and removed\ntogether - a request with an unknown favorite id is rejected as a whole with 404 and nothing is\nremoved.\n",
        "tags" : [ "Favorites" ],
        "requestBody" : {
          "required" : true,
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/ApiFavoritesRemoveRequest"
              }
            }
          }
        },
        "responses" : {
          "200" : {
            "description" : "Successful response",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ApiFavoritesRemoveResponse"
                }
              }
            }
          }
        }
      }
    },
    "/frontend-api/v1/item" : {
      "get" : {
        "operationId" : "get-frontend-api-v1-item",
        "summary" : "Item Details",
        "description" : "Returns the index-backed detail data of a single item - everything needed to render an item detail page\nwithout waiting for an ERP round-trip. Prices and availability are provided by the price endpoint, or -\nat the cost of waiting for the price computation - via the 'includePrices' flag.\n",
        "tags" : [ "Items" ],
        "parameters" : [ {
          "name" : "uniqueItemNumber",
          "in" : "query",
          "required" : true,
          "description" : "The globally unique item number of the item to fetch.",
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "includeBadges",
          "in" : "query",
          "required" : false,
          "description" : "Whether to include badges, energy efficiency classes and the energy product datasheet. Defaults to true.",
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "includeFeatures",
          "in" : "query",
          "required" : false,
          "description" : "Whether to include the product features. Defaults to true.",
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "includePrices",
          "in" : "query",
          "required" : false,
          "description" : "Whether to include the price and availability. This makes the otherwise ERP-free call wait for the price computation and is ignored if the shop disables price loading. Defaults to false.",
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "includeQuantities",
          "in" : "query",
          "required" : false,
          "description" : "Whether to include the order quantity metadata and index-backed packaging units. Defaults to true.",
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "includeTexts",
          "in" : "query",
          "required" : false,
          "description" : "Whether to include the long description and additional frontend texts. Defaults to true.",
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "recordVisit",
          "in" : "query",
          "required" : false,
          "description" : "Whether to record the request as item visit for the recently viewed list. Disable this for prefetching. Defaults to true.",
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "Successful response",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ApiItemResponse"
                }
              }
            }
          }
        }
      }
    },
    "/frontend-api/v1/items/price" : {
      "post" : {
        "operationId" : "post-frontend-api-v1-items-price",
        "summary" : "Item Prices and Availabilities",
        "description" : "Returns the ERP-backed prices and the applicable availabilities of one or more items. Each item carries\neither the standard availability (honoring the current basket settings) or - if pickup sites were\nrequested - the pickup availabilities at these sites. May involve an ERP round-trip.\n",
        "tags" : [ "Items" ],
        "requestBody" : {
          "required" : true,
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/ApiItemPriceRequest"
              }
            }
          }
        },
        "responses" : {
          "200" : {
            "description" : "Successful response",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ApiItemPriceResponse"
                }
              }
            }
          }
        }
      }
    },
    "/frontend-api/v1/items/recent" : {
      "get" : {
        "operationId" : "get-frontend-api-v1-items-recent",
        "summary" : "Recently Viewed Items",
        "description" : "Returns the recently viewed items of the current session, most recent first. Requires the session cookie\nto be sent along - see the documentation for details.\n",
        "tags" : [ "Items" ],
        "responses" : {
          "200" : {
            "description" : "Successful response",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ApiItemRecentResponse"
                }
              }
            }
          }
        }
      }
    },
    "/frontend-api/v1/search/query" : {
      "post" : {
        "operationId" : "post-frontend-api-v1-search-query",
        "summary" : "Search products",
        "description" : "Searches products with a typed query, filters, sorting, paging and a grouped or individual variant mode.\nThe response contains the items, typed choice facets, pagination info and the total number of hits.\nAs a sort mode may be unavailable for the current shop, user or result, the response also reports the\neffectively applied and the currently available sort modes.\n",
        "tags" : [ "search" ],
        "requestBody" : {
          "required" : true,
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/ApiSearchRequest"
              }
            }
          }
        },
        "responses" : {
          "200" : {
            "description" : "Successful response",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ApiSearchResponse"
                }
              }
            }
          }
        }
      }
    },
    "/frontend-api/v1/search/suggestions" : {
      "get" : {
        "operationId" : "get-frontend-api-v1-search-suggestions",
        "summary" : "Get search suggestions",
        "description" : "Returns ordered suggestions for products, brands, classes and groups matching the query parameter and\noptional active search filters. Item suggestions expose the unique item number as their value.\n",
        "tags" : [ "search" ],
        "parameters" : [ {
          "name" : "query",
          "in" : "query",
          "required" : true,
          "description" : "The (partial) search phrase to compute suggestions for.",
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "brand",
          "in" : "query",
          "required" : false,
          "description" : "Example of an active search filter constraining the suggestions. Any filter name supported by the\nsearch endpoint can be supplied as an additional query parameter, e.g. 'brand', 'class',\n'group[PRODUCT_GROUP]' or 'feature[code]'.\n",
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "Successful response",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ApiSearchSuggestionsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/frontend-api/v1/search/browse" : {
      "post" : {
        "operationId" : "post-frontend-api-v1-search-browse",
        "summary" : "Browse brands, classes or groups",
        "description" : "Returns cursor-paged brands, classes or groups. For classes and groups, the hierarchy level is derived\nfrom a class or group token selected via filters; without such a token, the requested hierarchy level is\nused and defaults to the root level. Reuse the opaque nextCursor only with an otherwise unchanged request.\n",
        "tags" : [ "search" ],
        "requestBody" : {
          "required" : true,
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/ApiSearchBrowseRequest"
              }
            }
          }
        },
        "responses" : {
          "200" : {
            "description" : "Successful response",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ApiSearchBrowseResponse"
                }
              }
            }
          }
        }
      }
    }
  },
  "components" : {
    "schemas" : {
      "ApiBasketListResponse" : {
        "type" : "object",
        "properties" : {
          "baskets" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiBasketOverviewResponse"
            },
            "description" : "The baskets available to the current buyer, with the currently selected basket first."
          }
        },
        "required" : [ "baskets" ]
      },
      "ApiBasketOverviewResponse" : {
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "string",
            "description" : "The database id of the basket."
          },
          "title" : {
            "type" : "string",
            "description" : "The displayable title of the basket."
          },
          "active" : {
            "type" : "boolean",
            "description" : "Whether this is the currently selected basket of the buyer. Baskets which are not active are considered parked."
          },
          "positionCount" : {
            "type" : "integer",
            "format" : "int64",
            "description" : "The number of regular positions in the basket."
          },
          "lastRefresh" : {
            "type" : "string",
            "description" : "The timestamp of the last modification of the basket, in ISO-8601 format with seconds precision and without an offset - it is stated in the time zone of the shop.",
            "example" : "2026-08-04T15:53:11"
          },
          "projectName" : {
            "type" : "string",
            "description" : "The name of the project assigned to the basket, if any."
          },
          "buyerName" : {
            "type" : "string",
            "description" : "The name of the buyer who created the basket."
          },
          "netPrice" : {
            "$ref" : "#/components/schemas/ApiPriceResponse",
            "description" : "The total net price of the basket, present only if sums may be shown for the current price mode."
          },
          "grossPrice" : {
            "$ref" : "#/components/schemas/ApiPriceResponse",
            "description" : "The total gross price of the basket, present only if sums may be shown for the current price mode."
          },
          "hasSupervisor" : {
            "type" : "boolean",
            "description" : "Whether this basket was forwarded to a supervisor as an order request."
          },
          "supervisorIsCurrentUser" : {
            "type" : "boolean",
            "description" : "Whether the current user is the supervisor of this basket."
          }
        },
        "required" : [ "id", "title", "active", "positionCount", "hasSupervisor", "supervisorIsCurrentUser" ]
      },
      "ApiPriceResponse" : {
        "type" : "object",
        "properties" : {
          "amount" : {
            "type" : "number",
            "description" : "The machine-readable price amount, using a dot as decimal separator.",
            "example" : 19.99
          },
          "currencyCode" : {
            "type" : "string",
            "description" : "The ISO 4217 currency code of the price.",
            "example" : "EUR"
          },
          "formatted" : {
            "type" : "string",
            "description" : "The price, formatted according to the current shop and locale settings.",
            "example" : "19,99 €"
          }
        },
        "required" : [ "amount", "currencyCode", "formatted" ]
      },
      "ApiBasketSelectRequest" : {
        "type" : "object",
        "properties" : {
          "basketId" : {
            "type" : "string",
            "description" : "The id of the basket to select as the active basket. Use the literal 'new' to create and select a fresh, empty basket, which effectively parks the current one.",
            "example" : "new"
          }
        },
        "required" : [ "basketId" ]
      },
      "ApiBasketStateResponse" : {
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "string",
            "description" : "The database id of the basket."
          },
          "title" : {
            "type" : "string",
            "description" : "The displayable title of the basket."
          },
          "active" : {
            "type" : "boolean",
            "description" : "Whether this is the currently selected basket of the buyer."
          },
          "recomputing" : {
            "type" : "boolean",
            "description" : "Whether the basket is currently being recomputed. Prices and totals may change once the recomputation has finished."
          },
          "lastRefresh" : {
            "type" : "string",
            "description" : "The timestamp of the last modification of the basket, in ISO-8601 format with seconds precision and without an offset - it is stated in the time zone of the shop.",
            "example" : "2026-08-04T15:53:11"
          },
          "projectName" : {
            "type" : "string",
            "description" : "The name of the project assigned to the basket, if any."
          },
          "comment" : {
            "type" : "string",
            "description" : "The comment attached to the basket, if there is one."
          },
          "orderType" : {
            "type" : "string",
            "description" : "The id of the order type selected for this basket, if any - the same id the checkout API reports as the selected order method.",
            "example" : "order"
          },
          "orderTypeLabel" : {
            "type" : "string",
            "description" : "The localized name of the order type, for display only.",
            "example" : "Order"
          },
          "price" : {
            "$ref" : "#/components/schemas/ApiPriceResponse",
            "description" : "The effective total price of the basket, present only if sums may be shown for the current price mode."
          },
          "netPrice" : {
            "$ref" : "#/components/schemas/ApiPriceResponse",
            "description" : "The total net price of the basket including its cost positions, present only if sums may be shown for the current price mode."
          },
          "positionsNetPrice" : {
            "$ref" : "#/components/schemas/ApiPriceResponse",
            "description" : "The net price of the regular positions only, i.e. without the cost positions - the subtotal the web basket shows. Present under the same conditions as 'netPrice'."
          },
          "grossPrice" : {
            "$ref" : "#/components/schemas/ApiPriceResponse",
            "description" : "The total gross price of the basket, present only if sums may be shown for the current price mode."
          },
          "positionCount" : {
            "type" : "integer",
            "format" : "int64",
            "description" : "The number of regular positions in the basket."
          },
          "shippingInfo" : {
            "type" : "string",
            "description" : "The displayable info text about the preselected shipping method, if one is configured."
          },
          "positionCommentsAllowed" : {
            "type" : "boolean",
            "description" : "Whether comments may be attached to the positions of the basket."
          },
          "positions" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiBasketPositionResponse"
            },
            "description" : "The regular positions of the basket."
          },
          "costPositions" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiBasketCostPositionResponse"
            },
            "description" : "The cost positions computed by the system (e.g. shipping costs or a minimum quantity surcharge). They are part of 'netPrice' but not of 'positions' - render them to show a summary which adds up. May be empty."
          },
          "messages" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiMessageResponse"
            },
            "description" : "Messages emitted for the basket itself. May be empty."
          }
        },
        "required" : [ "id", "title", "active", "recomputing", "positionCount", "positionCommentsAllowed", "positions", "costPositions", "messages" ]
      },
      "ApiBasketPositionResponse" : {
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "string",
            "description" : "The database id of the position."
          },
          "itemNumber" : {
            "type" : "string",
            "description" : "The item number of the position, as shown to the current user. Meant for display only - use 'uniqueItemNumber' to address the item in other endpoints."
          },
          "uniqueItemNumber" : {
            "type" : "string",
            "description" : "The unique item number of the item behind this position. This is the number the item and search endpoints expect, and the one to send when adding the item again."
          },
          "shortText" : {
            "type" : "string",
            "description" : "The short description of the item, so that the position can be rendered without fetching the item details separately."
          },
          "previewImageUrl" : {
            "type" : "string",
            "description" : "The URL of the preview image of the item, if the item has one."
          },
          "quantity" : {
            "$ref" : "#/components/schemas/ApiQuantityResponse",
            "description" : "The ordered quantity."
          },
          "quantityUnit" : {
            "type" : "string",
            "description" : "The order unit 'quantity' is stated in - the base unit of the item.",
            "example" : "piece"
          },
          "displayQuantity" : {
            "$ref" : "#/components/schemas/ApiQuantityResponse",
            "description" : "The quantity in the alternative sales unit the item was ordered in, present only for positions which use one. Render this together with 'displayQuantityUnit' instead of 'quantity'/'quantityUnit', as the web basket does."
          },
          "displayQuantityUnit" : {
            "type" : "string",
            "description" : "The name of the alternative sales unit the item was ordered in, present only for positions which use one.",
            "example" : "box"
          },
          "quantityChangeable" : {
            "type" : "boolean",
            "description" : "Whether the quantity of this position can be changed."
          },
          "priceQuantity" : {
            "$ref" : "#/components/schemas/ApiQuantityResponse",
            "description" : "The number of units 'netPricePerUnit' refers to. A unit price of 19,99 with a price quantity of 100 means 19,99 per 100 units. Does not apply to 'netPrice', which is always the total of the whole position."
          },
          "minOrderQuantity" : {
            "$ref" : "#/components/schemas/ApiQuantityResponse",
            "description" : "The minimum quantity which can be ordered of this item, in the unit reported via 'quantityUnit' - like every quantity of the position, its 'formatted' value carries no unit. Only reported if 'includeQuantities' was requested."
          },
          "orderStep" : {
            "$ref" : "#/components/schemas/ApiQuantityResponse",
            "description" : "The quantity steps in which this item can be ordered, in the unit reported via 'quantityUnit' - like every quantity of the position, its 'formatted' value carries no unit. Only reported if 'includeQuantities' was requested."
          },
          "netPrice" : {
            "$ref" : "#/components/schemas/ApiPriceResponse",
            "description" : "The total net price of the whole position (quantity times unit price), present only if prices may be shown for the current price mode and position. Render this as the line total - it must not be multiplied by the quantity again."
          },
          "netPricePerUnit" : {
            "$ref" : "#/components/schemas/ApiPriceResponse",
            "description" : "The net price of a single price quantity of the item (see 'priceQuantity'), present under the same conditions as 'netPrice'."
          },
          "comment" : {
            "type" : "string",
            "description" : "The comment attached to this position, if there is one."
          },
          "messages" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiMessageResponse"
            },
            "description" : "Messages emitted for this position, e.g. availability hints. Unlike basket messages these cannot be acknowledged - the position itself has to be corrected (e.g. via the update or remove endpoint) or the message vanishes once its cause is gone. May be empty."
          }
        },
        "required" : [ "id", "itemNumber", "quantityChangeable", "messages" ]
      },
      "ApiQuantityResponse" : {
        "type" : "object",
        "properties" : {
          "value" : {
            "type" : "number",
            "description" : "The machine-readable quantity, using a dot as decimal separator.",
            "example" : 2.5
          },
          "formatted" : {
            "type" : "string",
            "description" : "The quantity, formatted according to the current shop and locale settings.",
            "example" : "2,5"
          }
        },
        "required" : [ "value", "formatted" ]
      },
      "ApiMessageResponse" : {
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "string",
            "description" : "The id of the message. Present for basket-level messages, absent for position-level messages. Use it to acknowledge the message via the acknowledge endpoint of the basket API or 'acknowledgedMessageIds' of the checkout API."
          },
          "type" : {
            "type" : "string",
            "description" : "The severity of the message.",
            "example" : "WARNING"
          },
          "message" : {
            "type" : "string",
            "description" : "The human readable message text. Contains HTML markup if 'raw' is true, plain text otherwise."
          },
          "raw" : {
            "type" : "boolean",
            "description" : "Whether 'message' contains HTML markup (true) or plain text (false)."
          },
          "acknowledgeable" : {
            "type" : "boolean",
            "description" : "Whether this message needs to be acknowledged (via its 'id') before the checkout can be completed."
          },
          "acknowledged" : {
            "type" : "boolean",
            "description" : "Whether this message has already been acknowledged."
          }
        },
        "required" : [ "type", "message", "raw", "acknowledgeable", "acknowledged" ]
      },
      "ApiBasketCostPositionResponse" : {
        "type" : "object",
        "properties" : {
          "itemNumber" : {
            "type" : "string",
            "description" : "The item number of the cost position, as shown to the current user."
          },
          "shortText" : {
            "type" : "string",
            "description" : "The label of the cost position, e.g. 'Shipping costs'."
          },
          "netPrice" : {
            "$ref" : "#/components/schemas/ApiPriceResponse",
            "description" : "The net price of the cost position, present only if prices may be shown for the current price mode."
          },
          "messages" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiMessageResponse"
            },
            "description" : "Messages emitted for this cost position, e.g. an invalid coupon. May be empty. A PROBLEM here blocks the checkout just like a problem on a regular position - and can be its only explanation. Like the messages of a position these cannot be acknowledged."
          }
        },
        "required" : [ "shortText", "messages" ]
      },
      "ApiBasketDeleteRequest" : {
        "type" : "object",
        "properties" : {
          "basketId" : {
            "type" : "string",
            "description" : "The id of the basket to delete. Must not be the currently selected basket - select another one first if the user wants to get rid of the active basket."
          }
        },
        "required" : [ "basketId" ]
      },
      "ApiBasketRenameRequest" : {
        "type" : "object",
        "properties" : {
          "basketId" : {
            "type" : "string",
            "description" : "The id of the basket to rename. Defaults to the currently selected basket. Unlike the other endpoints, a deviating id does not select that basket - renaming a parked basket leaves the selection untouched, but requires the same permissions as selecting it."
          },
          "title" : {
            "type" : "string",
            "description" : "The new title of the basket, at most 512 characters. An empty title resets the basket to its generated default title, which the response then reports."
          }
        },
        "required" : [ "title" ]
      },
      "ApiBasketSummaryResponse" : {
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "string",
            "description" : "The database id of the basket."
          },
          "title" : {
            "type" : "string",
            "description" : "The displayable title of the basket, shortened for the header."
          },
          "price" : {
            "$ref" : "#/components/schemas/ApiPriceResponse",
            "description" : "The effective total price of the basket, present only if sums may be shown for the current price mode."
          },
          "positionCount" : {
            "type" : "integer",
            "format" : "int64",
            "description" : "The number of regular positions in the basket."
          },
          "recomputing" : {
            "type" : "boolean",
            "description" : "Whether the basket is currently being recomputed. Prices and totals may change once the recomputation has finished."
          }
        },
        "required" : [ "id", "title", "positionCount", "recomputing" ]
      },
      "ApiBasketAddPositionsRequest" : {
        "type" : "object",
        "properties" : {
          "basketId" : {
            "type" : "string",
            "description" : "The id of the basket to add the items to. Defaults to the currently selected basket. A different basket is selected as the active basket before adding the items."
          },
          "source" : {
            "type" : "string",
            "description" : "The source to record for the new positions, for statistics purposes. Defaults to 'frontend-api'.",
            "example" : "frontend-api"
          },
          "positions" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiBasketAddPositionRequest"
            },
            "description" : "The items to add to the basket."
          }
        },
        "required" : [ "positions" ]
      },
      "ApiBasketAddPositionRequest" : {
        "type" : "object",
        "properties" : {
          "itemNumber" : {
            "type" : "string",
            "description" : "The item number of the item to add."
          },
          "quantity" : {
            "type" : "number",
            "description" : "The quantity to add, stated in the alternative sales unit if 'alternativeUnitId' is given, in the base unit of the item otherwise. Defaults to the recommended order quantity of the item, in the very same unit.",
            "example" : 10.0
          },
          "alternativeUnitId" : {
            "type" : "integer",
            "format" : "int64",
            "description" : "The id of the alternative sales unit the quantity refers to. If given, the quantity is converted into the base unit of the item."
          },
          "comment" : {
            "type" : "string",
            "description" : "The comment to attach to the new position. Only honored if position comments are allowed in the shop."
          },
          "additions" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiBasketAdditionRequest"
            },
            "description" : "Additions (sub positions like cutting services) to attach to the new position."
          },
          "ignoredMandatoryGroups" : {
            "type" : "array",
            "items" : {
              "type" : "string"
            },
            "description" : "The unique names of the mandatory accessory groups of the item which the user chose to ignore. Groups not listed here are validated and report a position message if their accessories are missing from the basket."
          }
        },
        "required" : [ "itemNumber" ]
      },
      "ApiBasketAdditionRequest" : {
        "type" : "object",
        "properties" : {
          "type" : {
            "type" : "string",
            "description" : "The type of the addition, matching the name of a registered addition handler."
          },
          "json" : {
            "$ref" : "#/components/schemas/ObjectNode",
            "description" : "The type specific configuration of the addition, as understood by its handler."
          },
          "quantity" : {
            "type" : "number",
            "description" : "The quantity of the addition.",
            "example" : 1.0
          }
        },
        "required" : [ "type", "quantity" ]
      },
      "ObjectNode" : {
        "type" : "object"
      },
      "ApiBasketAddPositionsResponse" : {
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "string",
            "description" : "The database id of the basket."
          },
          "title" : {
            "type" : "string",
            "description" : "The displayable title of the basket."
          },
          "active" : {
            "type" : "boolean",
            "description" : "Whether this is the currently selected basket of the buyer."
          },
          "recomputing" : {
            "type" : "boolean",
            "description" : "Whether the basket is currently being recomputed. Prices and totals may change once the recomputation has finished."
          },
          "lastRefresh" : {
            "type" : "string",
            "description" : "The timestamp of the last modification of the basket, in ISO-8601 format with seconds precision and without an offset - it is stated in the time zone of the shop.",
            "example" : "2026-08-04T15:53:11"
          },
          "projectName" : {
            "type" : "string",
            "description" : "The name of the project assigned to the basket, if any."
          },
          "comment" : {
            "type" : "string",
            "description" : "The comment attached to the basket, if there is one."
          },
          "orderType" : {
            "type" : "string",
            "description" : "The id of the order type selected for this basket, if any - the same id the checkout API reports as the selected order method.",
            "example" : "order"
          },
          "orderTypeLabel" : {
            "type" : "string",
            "description" : "The localized name of the order type, for display only.",
            "example" : "Order"
          },
          "price" : {
            "$ref" : "#/components/schemas/ApiPriceResponse",
            "description" : "The effective total price of the basket, present only if sums may be shown for the current price mode."
          },
          "netPrice" : {
            "$ref" : "#/components/schemas/ApiPriceResponse",
            "description" : "The total net price of the basket including its cost positions, present only if sums may be shown for the current price mode."
          },
          "positionsNetPrice" : {
            "$ref" : "#/components/schemas/ApiPriceResponse",
            "description" : "The net price of the regular positions only, i.e. without the cost positions - the subtotal the web basket shows. Present under the same conditions as 'netPrice'."
          },
          "grossPrice" : {
            "$ref" : "#/components/schemas/ApiPriceResponse",
            "description" : "The total gross price of the basket, present only if sums may be shown for the current price mode."
          },
          "positionCount" : {
            "type" : "integer",
            "format" : "int64",
            "description" : "The number of regular positions in the basket."
          },
          "shippingInfo" : {
            "type" : "string",
            "description" : "The displayable info text about the preselected shipping method, if one is configured."
          },
          "positionCommentsAllowed" : {
            "type" : "boolean",
            "description" : "Whether comments may be attached to the positions of the basket."
          },
          "positions" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiBasketPositionResponse"
            },
            "description" : "The regular positions of the basket."
          },
          "costPositions" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiBasketCostPositionResponse"
            },
            "description" : "The cost positions computed by the system (e.g. shipping costs or a minimum quantity surcharge). They are part of 'netPrice' but not of 'positions' - render them to show a summary which adds up. May be empty."
          },
          "messages" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiMessageResponse"
            },
            "description" : "Messages emitted for the basket itself. May be empty."
          },
          "addedPositionIds" : {
            "type" : "array",
            "items" : {
              "type" : "string"
            },
            "description" : "The database ids of the positions created by this request."
          },
          "missingItemNumbers" : {
            "type" : "array",
            "items" : {
              "type" : "string"
            },
            "description" : "The item numbers which could not be resolved and were therefore skipped. Items which were resolved but rejected by the shop are not listed here - their reason is reported in 'messages'."
          }
        },
        "required" : [ "id", "title", "active", "recomputing", "positionCount", "positionCommentsAllowed", "positions", "costPositions", "messages", "addedPositionIds", "missingItemNumbers" ]
      },
      "ApiBasketUpdatePositionsRequest" : {
        "type" : "object",
        "properties" : {
          "basketId" : {
            "type" : "string",
            "description" : "The id of the basket owning the positions. Defaults to the currently selected basket. A different basket is selected as the active basket before applying the changes."
          },
          "positions" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiBasketUpdatePositionRequest"
            },
            "description" : "The changes to apply to the positions of the basket."
          }
        },
        "required" : [ "positions" ]
      },
      "ApiBasketUpdatePositionRequest" : {
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "string",
            "description" : "The database id of the position to change."
          },
          "quantity" : {
            "type" : "number",
            "description" : "The new quantity of the position, in the base unit of the item - the same unit the 'quantity' of the state response reports. Omit to leave the quantity unchanged.",
            "example" : 5.0
          },
          "comment" : {
            "type" : "string",
            "description" : "The new comment of the position. An empty string removes the comment, omitting the field leaves the comment unchanged."
          }
        },
        "required" : [ "id" ]
      },
      "ApiBasketRemovePositionsRequest" : {
        "type" : "object",
        "properties" : {
          "basketId" : {
            "type" : "string",
            "description" : "The id of the basket owning the positions. Defaults to the currently selected basket. A different basket is selected as the active basket before removing the positions."
          },
          "positionIds" : {
            "type" : "array",
            "items" : {
              "type" : "string"
            },
            "description" : "The database ids of the positions to remove."
          }
        },
        "required" : [ "positionIds" ]
      },
      "ApiBasketAcknowledgeMessagesRequest" : {
        "type" : "object",
        "properties" : {
          "basketId" : {
            "type" : "string",
            "description" : "The id of the basket owning the messages. Defaults to the currently selected basket. A different basket is selected as the active basket first."
          },
          "messageIds" : {
            "type" : "array",
            "items" : {
              "type" : "string"
            },
            "description" : "The ids of the messages (see 'messages' in the state response) to mark as acknowledged. Ids which do not belong to the basket are silently ignored."
          }
        }
      },
      "ApiCheckoutStateResponse" : {
        "type" : "object",
        "properties" : {
          "netPrice" : {
            "$ref" : "#/components/schemas/ApiPriceResponse",
            "description" : "The net sum of the basket, present only if prices may be shown for the current price mode."
          },
          "grossPrice" : {
            "$ref" : "#/components/schemas/ApiPriceResponse",
            "description" : "The gross sum of the basket, present only if prices may be shown for the current price mode."
          },
          "invoiceAddress" : {
            "$ref" : "#/components/schemas/ApiCheckoutAddressResponse",
            "description" : "The invoice address."
          },
          "shippingAddress" : {
            "$ref" : "#/components/schemas/ApiCheckoutAddressResponse",
            "description" : "The shipping address. May be empty if shipping to the invoice address."
          },
          "shippingContact" : {
            "$ref" : "#/components/schemas/ApiCheckoutContactResponse",
            "description" : "The shipping contact."
          },
          "buyerInfo" : {
            "$ref" : "#/components/schemas/ApiCheckoutBuyerInfoResponse",
            "description" : "The buyer information."
          },
          "projectId" : {
            "type" : "string",
            "description" : "The id of the selected project, if any."
          },
          "projectName" : {
            "type" : "string",
            "description" : "The name of the selected project, if any."
          },
          "commissionId" : {
            "type" : "string",
            "description" : "The commission / cost reference of the order, if any."
          },
          "couponCode" : {
            "type" : "string",
            "description" : "The applied coupon code, if any."
          },
          "comment" : {
            "type" : "string",
            "description" : "An optional comment concerning the order."
          },
          "title" : {
            "type" : "string",
            "description" : "A title or commercial reference (commission) for the basket, if the shop uses this field."
          },
          "desiredDeliveryDate" : {
            "type" : "string",
            "description" : "The desired delivery date, as an ISO-8601 date ('yyyy-MM-dd'), if set. For shops with the delivery tour feature this is the desired date of the tour - for all others, the delivery date of the basket."
          },
          "pickupSiteCode" : {
            "type" : "string",
            "description" : "The code of the selected pickup site, if the shipping method uses pickup."
          },
          "pickupSiteName" : {
            "type" : "string",
            "description" : "The translated name of the selected pickup site, if the shipping method uses pickup."
          },
          "orderMethod" : {
            "$ref" : "#/components/schemas/ApiCheckoutMethodSelectionResponse",
            "description" : "The selected and available order types."
          },
          "shippingMethod" : {
            "$ref" : "#/components/schemas/ApiCheckoutMethodSelectionResponse",
            "description" : "The selected and available shipping methods. Each option states whether it requires a shipping address or a pickup site."
          },
          "pickupSites" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiCheckoutPickupSiteResponse"
            },
            "description" : "The selectable pickup sites. Only present if at least one available shipping method requires a pickup site."
          },
          "tour" : {
            "$ref" : "#/components/schemas/ApiCheckoutTourResponse",
            "description" : "The delivery tour selection. Only present if the shop has the tour feature enabled and the tour selection applies to the current basket."
          },
          "shippingCountries" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiCheckoutCountryResponse"
            },
            "description" : "The selectable shipping countries - the valid values for 'countryCode' in the address blocks of the update request."
          },
          "fields" : {
            "$ref" : "#/components/schemas/ApiCheckoutFieldsResponse",
            "description" : "Describes which checkout fields the shop shows, which are editable and which are required - drive the checkout form entirely from this block."
          },
          "paymentMethod" : {
            "$ref" : "#/components/schemas/ApiCheckoutMethodSelectionResponse",
            "description" : "The selected and available payment methods."
          },
          "positions" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiBasketPositionResponse"
            },
            "description" : "The regular positions of the basket."
          },
          "costPositions" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiBasketCostPositionResponse"
            },
            "description" : "The computed cost positions of the basket (e.g. shipping costs). Together with the regular positions, these add up to the reported basket sums. May be empty."
          },
          "messages" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiMessageResponse"
            },
            "description" : "Messages concerning the basket as a whole, e.g. validation problems or warnings which need to be acknowledged. May be empty."
          },
          "canCommit" : {
            "type" : "boolean",
            "description" : "Whether the basket is in a committable state - false if the checkout is disabled or not permitted, the basket is erroneous or currently locked, or an unacknowledged warning exists. This is a necessary but not a sufficient condition: it does not run the field validation (e.g. a missing required title), which only the validate and complete endpoints perform. Call validate before offering to place the order."
          },
          "customFields" : {
            "type" : "object",
            "additionalProperties" : {
              "$ref" : "#/components/schemas/ApiCheckoutCustomFieldResponse"
            },
            "description" : "The current custom field values, keyed by field name. Combines shop-configurable 'CustomizableField' values and compiled, customer-specific fields."
          },
          "customFieldDefinitions" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiCheckoutCustomFieldDefinitionResponse"
            },
            "description" : "Describes the shop-configurable custom fields applicable to the basket, so that an app can render fields generically, including ones added later. Does not include the compiled, customer-specific fields contributed by an ApiCheckoutFieldCustomizer, as those are not shop-configurable and are expected to be known to the app in advance."
          }
        },
        "required" : [ "invoiceAddress", "shippingAddress", "shippingContact", "buyerInfo", "orderMethod", "shippingMethod", "shippingCountries", "fields", "paymentMethod", "positions", "costPositions", "messages", "canCommit", "customFields", "customFieldDefinitions" ]
      },
      "ApiCheckoutAddressResponse" : {
        "type" : "object",
        "properties" : {
          "name1" : {
            "type" : "string",
            "description" : "The first name/company line."
          },
          "name2" : {
            "type" : "string",
            "description" : "The second name/company line."
          },
          "name3" : {
            "type" : "string",
            "description" : "The third name/company line."
          },
          "street" : {
            "type" : "string",
            "description" : "The street and house number."
          },
          "zip" : {
            "type" : "string",
            "description" : "The ZIP code."
          },
          "city" : {
            "type" : "string",
            "description" : "The city."
          },
          "countryCode" : {
            "type" : "string",
            "description" : "The ISO country code.",
            "example" : "DE"
          },
          "countryName" : {
            "type" : "string",
            "description" : "The translated country name."
          },
          "correlationId" : {
            "type" : "string",
            "description" : "Links this address to an entry of the buyer's address book, if it currently is a known address. Absent for a manually entered address - which also happens once the fields of a previously linked address are edited. Send it back unchanged (along with the unchanged fields) to keep the link."
          }
        }
      },
      "ApiCheckoutContactResponse" : {
        "type" : "object",
        "properties" : {
          "contactPerson" : {
            "type" : "string",
            "description" : "The name of the contact person at the shipping address."
          },
          "phone" : {
            "type" : "string",
            "description" : "The phone number of the contact person."
          },
          "email" : {
            "type" : "string",
            "description" : "The email address of the contact person."
          }
        }
      },
      "ApiCheckoutBuyerInfoResponse" : {
        "type" : "object",
        "properties" : {
          "salutation" : {
            "type" : "string",
            "description" : "The salutation code, as defined in the 'salutations' code list."
          },
          "title" : {
            "type" : "string",
            "description" : "The title of the buyer."
          },
          "firstname" : {
            "type" : "string",
            "description" : "The first name of the buyer."
          },
          "lastname" : {
            "type" : "string",
            "description" : "The last name of the buyer."
          },
          "email" : {
            "type" : "string",
            "description" : "The email address of the buyer."
          },
          "phone" : {
            "type" : "string",
            "description" : "The phone number of the buyer."
          },
          "fax" : {
            "type" : "string",
            "description" : "The fax number of the buyer."
          }
        }
      },
      "ApiCheckoutMethodSelectionResponse" : {
        "type" : "object",
        "properties" : {
          "selectedId" : {
            "type" : "string",
            "description" : "The id of the currently selected method, if any."
          },
          "selectedName" : {
            "type" : "string",
            "description" : "The translated name of the currently selected method, if any."
          },
          "values" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiCheckoutMethodOptionResponse"
            },
            "description" : "All methods currently available for selection."
          }
        },
        "required" : [ "values" ]
      },
      "ApiCheckoutMethodOptionResponse" : {
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "string",
            "description" : "The id of the method, to be used in the update request."
          },
          "name" : {
            "type" : "string",
            "description" : "The translated name of the method."
          },
          "requiresAddress" : {
            "type" : "boolean",
            "description" : "Whether this method requires a shipping address. Only present for shipping methods - use it to decide whether to show the address form when this method is selected."
          },
          "requiresPickupSite" : {
            "type" : "boolean",
            "description" : "Whether this method requires a pickup site. Only present for shipping methods - use it to decide whether to show the pickup site selection (see 'pickupSites') when this method is selected."
          }
        },
        "required" : [ "id", "name" ]
      },
      "ApiCheckoutPickupSiteResponse" : {
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "integer",
            "format" : "int64",
            "description" : "The database id of the pickup site, to be used as 'pickupSiteId' in the update request."
          },
          "code" : {
            "type" : "string",
            "description" : "The code of the pickup site, as reported in 'pickupSiteCode' of the state response."
          },
          "name" : {
            "type" : "string",
            "description" : "The translated name of the pickup site."
          }
        },
        "required" : [ "id", "code", "name" ]
      },
      "ApiCheckoutTourResponse" : {
        "type" : "object",
        "properties" : {
          "editable" : {
            "type" : "boolean",
            "description" : "Whether the tour data can currently be changed by the user."
          },
          "selectedId" : {
            "type" : "string",
            "description" : "The id of the currently selected tour, if any."
          },
          "selectedLabel" : {
            "type" : "string",
            "description" : "The user readable name of the currently selected tour, if any."
          },
          "hint" : {
            "type" : "string",
            "description" : "A hint concerning the last tour change (e.g. an automatically updated date), to be shown to the user."
          },
          "values" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiCheckoutTourOptionResponse"
            },
            "description" : "The selectable tours - render a tour picker if and only if this is non-empty. Empty if the shop does not offer a tour selection, mirroring the web checkout (e.g. the selection is disabled, or there is exactly one tour and the shop does not offer a single tour for selection). A tour may still be assigned in that case, reported via 'selectedId'/'selectedLabel'."
          }
        },
        "required" : [ "editable", "values" ]
      },
      "ApiCheckoutTourOptionResponse" : {
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "string",
            "description" : "The id of the tour, to be used as 'tourId' in the update request."
          },
          "label" : {
            "type" : "string",
            "description" : "The user readable name of the tour."
          },
          "deliveryDate" : {
            "type" : "string",
            "description" : "The delivery date of the tour, as an ISO-8601 date ('yyyy-MM-dd'), if known."
          },
          "hint" : {
            "type" : "string",
            "description" : "An optional hint concerning the tour, to be shown to the user."
          }
        },
        "required" : [ "id", "label" ]
      },
      "ApiCheckoutCountryResponse" : {
        "type" : "object",
        "properties" : {
          "code" : {
            "type" : "string",
            "description" : "The code of the country, to be used as 'countryCode' in address blocks of the update request.",
            "example" : "DE"
          },
          "name" : {
            "type" : "string",
            "description" : "The translated name of the country."
          }
        },
        "required" : [ "code", "name" ]
      },
      "ApiCheckoutFieldsResponse" : {
        "type" : "object",
        "properties" : {
          "invoiceAddress" : {
            "$ref" : "#/components/schemas/ApiCheckoutFieldConfigResponse",
            "description" : "The invoice address section."
          },
          "shippingAddress" : {
            "$ref" : "#/components/schemas/ApiCheckoutShippingAddressConfigResponse",
            "description" : "The shipping address section."
          },
          "shippingContact" : {
            "$ref" : "#/components/schemas/ApiCheckoutShippingContactConfigResponse",
            "description" : "The shipping contact fields."
          },
          "buyerDetails" : {
            "$ref" : "#/components/schemas/ApiCheckoutBuyerConfigResponse",
            "description" : "The buyer details section."
          },
          "title" : {
            "$ref" : "#/components/schemas/ApiCheckoutFieldConfigResponse",
            "description" : "The checkout title / commercial reference field."
          },
          "desiredDeliveryDate" : {
            "$ref" : "#/components/schemas/ApiCheckoutFieldConfigResponse",
            "description" : "The desired delivery date field."
          },
          "project" : {
            "$ref" : "#/components/schemas/ApiCheckoutFieldConfigResponse",
            "description" : "The project selection."
          },
          "commission" : {
            "$ref" : "#/components/schemas/ApiCheckoutFieldConfigResponse",
            "description" : "The commission selection."
          },
          "coupon" : {
            "$ref" : "#/components/schemas/ApiCheckoutFieldConfigResponse",
            "description" : "The coupon code field."
          },
          "comment" : {
            "$ref" : "#/components/schemas/ApiCheckoutFieldConfigResponse",
            "description" : "The order comment field."
          },
          "pickupSite" : {
            "$ref" : "#/components/schemas/ApiCheckoutFieldConfigResponse",
            "description" : "The pickup site selection (see 'pickupSites' for the selectable sites)."
          }
        },
        "required" : [ "invoiceAddress", "shippingAddress", "shippingContact", "buyerDetails", "title", "desiredDeliveryDate", "project", "commission", "coupon", "comment", "pickupSite" ]
      },
      "ApiCheckoutFieldConfigResponse" : {
        "type" : "object",
        "properties" : {
          "show" : {
            "type" : "boolean",
            "description" : "Whether the field should be shown at all."
          },
          "editable" : {
            "type" : "boolean",
            "description" : "Whether the field can be edited by the user."
          },
          "required" : {
            "type" : "boolean",
            "description" : "Whether the field must be filled before the checkout can be completed."
          }
        },
        "required" : [ "show", "editable", "required" ]
      },
      "ApiCheckoutShippingAddressConfigResponse" : {
        "type" : "object",
        "properties" : {
          "show" : {
            "type" : "boolean",
            "description" : "Whether the field should be shown at all."
          },
          "editable" : {
            "type" : "boolean",
            "description" : "Whether the field can be edited by the user."
          },
          "required" : {
            "type" : "boolean",
            "description" : "Whether the field must be filled before the checkout can be completed."
          },
          "canSuggest" : {
            "type" : "boolean",
            "description" : "Whether the buyer's address book should be offered for selecting the shipping address (see the addresses suggestion endpoint)."
          },
          "canSave" : {
            "type" : "boolean",
            "description" : "Whether an edited shipping address can be saved to the buyer's address book via 'saveShippingAddress' of the update request."
          },
          "showName" : {
            "type" : "boolean",
            "description" : "Whether the name line of the shipping address should be shown."
          },
          "showSecondName" : {
            "type" : "boolean",
            "description" : "Whether the second name line of the shipping address should be shown."
          },
          "showThirdName" : {
            "type" : "boolean",
            "description" : "Whether the third name line of the shipping address should be shown."
          }
        },
        "required" : [ "show", "editable", "required", "canSuggest", "canSave", "showName", "showSecondName", "showThirdName" ]
      },
      "ApiCheckoutShippingContactConfigResponse" : {
        "type" : "object",
        "properties" : {
          "showContactPerson" : {
            "type" : "boolean",
            "description" : "Whether the contact person field should be shown."
          },
          "showPhone" : {
            "type" : "boolean",
            "description" : "Whether the contact phone field should be shown."
          },
          "showEmail" : {
            "type" : "boolean",
            "description" : "Whether the contact email field should be shown."
          }
        },
        "required" : [ "showContactPerson", "showPhone", "showEmail" ]
      },
      "ApiCheckoutBuyerConfigResponse" : {
        "type" : "object",
        "properties" : {
          "show" : {
            "type" : "boolean",
            "description" : "Whether the buyer details should be shown at all."
          },
          "editable" : {
            "type" : "boolean",
            "description" : "Whether the buyer details can be edited by the user."
          },
          "showPhone" : {
            "type" : "boolean",
            "description" : "Whether the buyer phone field should be shown."
          },
          "phoneRequired" : {
            "type" : "boolean",
            "description" : "Whether the buyer phone must be filled."
          },
          "showFax" : {
            "type" : "boolean",
            "description" : "Whether the buyer fax field should be shown."
          },
          "faxRequired" : {
            "type" : "boolean",
            "description" : "Whether the buyer fax must be filled."
          },
          "emailRequired" : {
            "type" : "boolean",
            "description" : "Whether the buyer email must be filled."
          }
        },
        "required" : [ "show", "editable", "showPhone", "phoneRequired", "showFax", "faxRequired", "emailRequired" ]
      },
      "ApiCheckoutCustomFieldResponse" : {
        "type" : "object",
        "properties" : {
          "label" : {
            "type" : "string",
            "description" : "The translated label of the field."
          },
          "type" : {
            "type" : "string",
            "description" : "The type of the field, e.g. 'STRING', 'BOOLEAN', 'SELECT'."
          },
          "value" : {
            "type" : "string",
            "description" : "The current value of the field, if any."
          },
          "messages" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiMessageResponse"
            },
            "description" : "Messages emitted for this field, e.g. validation problems. May be empty."
          }
        },
        "required" : [ "label", "type", "messages" ]
      },
      "ApiCheckoutCustomFieldDefinitionResponse" : {
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "string",
            "description" : "The database id of the field definition."
          },
          "name" : {
            "type" : "string",
            "description" : "The technical name of the field - the key to use in 'customFields'."
          },
          "title" : {
            "type" : "string",
            "description" : "The translated title of the field."
          },
          "type" : {
            "type" : "string",
            "description" : "The type of the field, e.g. 'STRING', 'BOOLEAN', 'SELECT'."
          },
          "required" : {
            "type" : "boolean",
            "description" : "Whether the field must be filled in order to complete the checkout."
          },
          "selectValues" : {
            "type" : "array",
            "items" : {
              "type" : "string"
            },
            "description" : "The selectable values, only present for types like 'SELECT' or 'RADIO'."
          },
          "hide" : {
            "type" : "boolean",
            "description" : "Whether the field should be kept hidden instead of shown as input."
          }
        },
        "required" : [ "id", "name", "title", "type", "required", "hide" ]
      },
      "ApiCheckoutUpdateRequest" : {
        "type" : "object",
        "properties" : {
          "invoiceAddress" : {
            "$ref" : "#/components/schemas/ApiCheckoutAddressRequest",
            "description" : "The invoice address. If present, replaces the whole invoice address."
          },
          "shippingAddress" : {
            "$ref" : "#/components/schemas/ApiCheckoutAddressRequest",
            "description" : "The shipping address. If present, replaces the whole shipping address."
          },
          "shippingContact" : {
            "$ref" : "#/components/schemas/ApiCheckoutContactRequest",
            "description" : "The shipping contact. If present, replaces the whole shipping contact."
          },
          "shippingMethodId" : {
            "type" : "string",
            "description" : "The id of the shipping method to select, as listed in the state response. An unknown or unavailable id is rejected with a 400 error."
          },
          "paymentMethodId" : {
            "type" : "string",
            "description" : "The id of the payment method to select, as listed in the state response. An unknown or unavailable id is rejected with a 400 error."
          },
          "orderMethodId" : {
            "type" : "string",
            "description" : "The id of the order type to select, as listed in the state response. An unknown or unavailable id is rejected with a 400 error."
          },
          "pickupSiteId" : {
            "type" : "integer",
            "format" : "int64",
            "description" : "The id of the pickup site to select, as listed in 'pickupSites' of the state response - an unknown id is rejected with a 400 error. Send 0 or a negative number to clear the pickup site."
          },
          "desiredDeliveryDate" : {
            "type" : "string",
            "description" : "The desired delivery date, as an ISO-8601 date ('yyyy-MM-dd'). Send an empty string to clear it. For shops with the delivery tour feature, this sets the desired date of the tour - for all others, the delivery date of the basket (then only applied if the selected shipping method requires an address). Note that the shop may adjust the date to the next valid tour."
          },
          "tourId" : {
            "type" : "string",
            "description" : "The id of the delivery tour to select, as listed in the 'tour' block of the state response. Only accepted if the shop has the tour feature enabled - an unknown or no longer valid id is rejected with a 400 error. Send an empty string to clear the selected tour."
          },
          "buyerInfo" : {
            "$ref" : "#/components/schemas/ApiCheckoutBuyerInfoRequest",
            "description" : "The buyer information. If present, only the given fields of the buyer information are applied."
          },
          "projectId" : {
            "type" : "string",
            "description" : "The id of the project to select, as returned by the project suggestion endpoint - an unknown id is rejected with a 400 error. Send an empty string to clear the project."
          },
          "commissionId" : {
            "type" : "string",
            "description" : "The commission / cost reference of the order. At most 64 characters. Send an empty string to clear it."
          },
          "couponCode" : {
            "type" : "string",
            "description" : "The coupon code to apply. At most 255 characters. Send an empty string to remove an applied coupon."
          },
          "comment" : {
            "type" : "string",
            "description" : "An optional comment concerning the order. Not limited in length by default, but shops may configure a maximum length, enforced by the validate and complete endpoints."
          },
          "title" : {
            "type" : "string",
            "description" : "A title or commercial reference (commission) for the basket, if the shop uses this field. At most 512 characters."
          },
          "saveShippingAddress" : {
            "type" : "boolean",
            "description" : "If true, the (edited) shipping address is saved to the buyer's address book - only honored if the state response reports 'fields.shippingAddress.canSave' and the selected shipping method requires an address."
          },
          "customFields" : {
            "type" : "object",
            "additionalProperties" : {
              "type" : "string"
            },
            "description" : "Custom field values, keyed by field name. Covers both shop-configurable 'CustomizableField' values (see 'customFieldDefinitions' in the state response) and compiled, customer-specific fields contributed by an ApiCheckoutFieldCustomizer. If present at all, every customizable field not contained in this map is left untouched (it is not cleared)."
          }
        }
      },
      "ApiCheckoutAddressRequest" : {
        "type" : "object",
        "properties" : {
          "name1" : {
            "type" : "string",
            "description" : "The first name/company line. At most 255 characters."
          },
          "name2" : {
            "type" : "string",
            "description" : "The second name/company line. At most 255 characters."
          },
          "name3" : {
            "type" : "string",
            "description" : "The third name/company line. At most 255 characters."
          },
          "street" : {
            "type" : "string",
            "description" : "The street and house number. At most 255 characters."
          },
          "zip" : {
            "type" : "string",
            "description" : "The ZIP code. At most 16 characters."
          },
          "city" : {
            "type" : "string",
            "description" : "The city. At most 255 characters."
          },
          "countryCode" : {
            "type" : "string",
            "description" : "The country code, as listed in 'shippingCountries' of the state response - an unknown code is rejected with a 400 error. For the shipping address, this is only honored if the shop permits changing the shipping country - otherwise the invoice address's country is used.",
            "example" : "DE"
          },
          "correlationId" : {
            "type" : "string",
            "description" : "Links this address to an entry of the buyer's address book. Only ever send a value obtained from the API (the addresses suggestion endpoint or a previous state response), together with that entry's unchanged fields. Omit it (or send an empty string) for a manually entered address - it is then auto-linked if it matches a known entry and otherwise validated against the ERP. A link whose fields no longer match the referenced entry is dropped automatically, so always read the effective value back from the response. At most 255 characters."
          }
        }
      },
      "ApiCheckoutContactRequest" : {
        "type" : "object",
        "properties" : {
          "contactPerson" : {
            "type" : "string",
            "description" : "The name of the contact person at the shipping address. At most 255 characters."
          },
          "phone" : {
            "type" : "string",
            "description" : "The phone number of the contact person. At most 150 characters."
          },
          "email" : {
            "type" : "string",
            "description" : "The email address of the contact person. At most 150 characters."
          }
        }
      },
      "ApiCheckoutBuyerInfoRequest" : {
        "type" : "object",
        "properties" : {
          "salutation" : {
            "type" : "string",
            "description" : "The salutation code, as defined in the 'salutations' code list. At most 20 characters."
          },
          "title" : {
            "type" : "string",
            "description" : "The title of the buyer. At most 50 characters."
          },
          "firstname" : {
            "type" : "string",
            "description" : "The first name of the buyer. At most 150 characters."
          },
          "lastname" : {
            "type" : "string",
            "description" : "The last name of the buyer. At most 150 characters."
          },
          "email" : {
            "type" : "string",
            "description" : "The email address of the buyer. At most 255 characters."
          },
          "phone" : {
            "type" : "string",
            "description" : "The phone number of the buyer. At most 255 characters."
          },
          "fax" : {
            "type" : "string",
            "description" : "The fax number of the buyer. At most 255 characters."
          }
        }
      },
      "ApiCheckoutValidateRequest" : {
        "type" : "object",
        "properties" : {
          "acknowledgedMessageIds" : {
            "type" : "array",
            "items" : {
              "type" : "string"
            },
            "description" : "The ids of the messages (see 'messages' in the state response) to mark as acknowledged before evaluating whether the checkout can be completed."
          }
        }
      },
      "ApiCheckoutCompleteRequest" : {
        "type" : "object",
        "properties" : {
          "acknowledgedMessageIds" : {
            "type" : "array",
            "items" : {
              "type" : "string"
            },
            "description" : "The ids of the messages (see 'messages' in the state response) to mark as acknowledged before completing the checkout."
          }
        }
      },
      "ApiCheckoutCompleteResponse" : {
        "type" : "object",
        "properties" : {
          "orderNumber" : {
            "type" : "string",
            "description" : "The order number assigned by the system."
          },
          "state" : {
            "type" : "string",
            "description" : "The state of the order. 'ORDERED' for a completed order - 'WAITING_FOR_PAYMENT' may occur on the GET endpoint if a payment was started but never completed.",
            "example" : "ORDERED"
          },
          "netPrice" : {
            "$ref" : "#/components/schemas/ApiPriceResponse",
            "description" : "The net sum of the order, present only if prices may be shown for the current price mode."
          },
          "grossPrice" : {
            "$ref" : "#/components/schemas/ApiPriceResponse",
            "description" : "The gross sum of the order, present only if prices may be shown for the current price mode."
          },
          "positions" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiBasketPositionResponse"
            },
            "description" : "The regular positions of the order."
          },
          "costPositions" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiBasketCostPositionResponse"
            },
            "description" : "The computed cost positions of the order (e.g. shipping costs). Together with the regular positions, these add up to the reported order sums. May be empty."
          },
          "messages" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiMessageResponse"
            },
            "description" : "Messages concerning the completed order, e.g. a generated coupon or the hint that the basket was split into several orders. May be empty."
          }
        },
        "required" : [ "orderNumber", "state", "positions", "costPositions", "messages" ]
      },
      "ApiCheckoutAddressSuggestionsResponse" : {
        "type" : "object",
        "properties" : {
          "addresses" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiCheckoutAddressResponse"
            },
            "description" : "The matching addresses, including their 'correlationId' to be sent back when the user picks one. May be empty."
          }
        },
        "required" : [ "addresses" ]
      },
      "ApiCheckoutProjectSuggestionsResponse" : {
        "type" : "object",
        "properties" : {
          "projects" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiCheckoutProjectResponse"
            },
            "description" : "The matching projects. May be empty."
          }
        },
        "required" : [ "projects" ]
      },
      "ApiCheckoutProjectResponse" : {
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "string",
            "description" : "The id of the project, to be used as 'projectId' in the update request."
          },
          "name" : {
            "type" : "string",
            "description" : "The name of the project."
          }
        },
        "required" : [ "id", "name" ]
      },
      "ApiFavoriteListsResponse" : {
        "type" : "object",
        "properties" : {
          "lists" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiFavoriteListOverviewResponse"
            },
            "description" : "The favorite lists available to the current buyer, sorted by position and name. Use the category of each list to group them."
          }
        },
        "required" : [ "lists" ]
      },
      "ApiFavoriteListOverviewResponse" : {
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "string",
            "description" : "The database id of the favorite list."
          },
          "name" : {
            "type" : "string",
            "description" : "The displayable name of the favorite list."
          },
          "category" : {
            "type" : "string",
            "description" : "The category used to group favorite lists. Absent if the list has no category assigned. Clients should group uncategorized lists under a label of their own choosing."
          },
          "position" : {
            "type" : "integer",
            "format" : "int32",
            "description" : "The sort position of the list within its category. Lists are already sorted by position and name."
          },
          "privateList" : {
            "type" : "boolean",
            "description" : "Whether the list is private to the current buyer or shared with all buyers of the customer."
          },
          "editable" : {
            "type" : "boolean",
            "description" : "Whether the current buyer may modify the list and its favorites."
          },
          "editableByColleagues" : {
            "type" : "boolean",
            "description" : "Whether other buyers of the customer may modify this shared list. Always false for private lists. Report this value back when updating a list, otherwise the setting is overwritten."
          },
          "favoriteCount" : {
            "type" : "integer",
            "format" : "int64",
            "description" : "The number of favorites in the list."
          }
        },
        "required" : [ "id", "name", "position", "privateList", "editable", "editableByColleagues", "favoriteCount" ]
      },
      "ApiFavoriteListCreateRequest" : {
        "type" : "object",
        "properties" : {
          "name" : {
            "type" : "string",
            "description" : "The displayable name of the new favorite list. Must be unique per category.",
            "example" : "Construction site A"
          },
          "category" : {
            "type" : "string",
            "description" : "The category used to group favorite lists.",
            "example" : "Projects"
          },
          "privateList" : {
            "type" : "boolean",
            "description" : "Whether the list is private to the current buyer or shared with all buyers of the customer. Defaults to true."
          },
          "editableByColleagues" : {
            "type" : "boolean",
            "description" : "Whether other buyers of the customer may modify the shared list. Defaults to false."
          }
        },
        "required" : [ "name" ]
      },
      "ApiFavoriteListUpdateRequest" : {
        "type" : "object",
        "properties" : {
          "listId" : {
            "type" : "string",
            "description" : "The database id of the favorite list to update."
          },
          "name" : {
            "type" : "string",
            "description" : "The new displayable name of the favorite list. Must be unique per category. Omit to keep the current name.",
            "example" : "Construction site B"
          },
          "category" : {
            "type" : "string",
            "description" : "The new category of the favorite list. Pass an empty string to clear the category. Omit to keep the current category.",
            "example" : "Projects"
          },
          "privateList" : {
            "type" : "boolean",
            "description" : "Whether the list is private to the current buyer or shared with all buyers of the customer. Omit to keep the current setting."
          },
          "editableByColleagues" : {
            "type" : "boolean",
            "description" : "Whether other buyers of the customer may modify the shared list. Omit to keep the current setting."
          }
        },
        "required" : [ "listId" ]
      },
      "ApiFavoriteListsRemoveRequest" : {
        "type" : "object",
        "properties" : {
          "listIds" : {
            "type" : "array",
            "items" : {
              "type" : "string"
            },
            "description" : "The database ids of the favorite lists to remove. All lists are validated before any list is removed."
          }
        },
        "required" : [ "listIds" ]
      },
      "ApiFavoriteListsRemoveResponse" : {
        "type" : "object",
        "properties" : {
          "removedCount" : {
            "type" : "integer",
            "format" : "int32",
            "description" : "The number of favorite lists which have been removed."
          }
        },
        "required" : [ "removedCount" ]
      },
      "ApiFavoriteListResponse" : {
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "string",
            "description" : "The database id of the favorite list."
          },
          "name" : {
            "type" : "string",
            "description" : "The displayable name of the favorite list."
          },
          "category" : {
            "type" : "string",
            "description" : "The category used to group favorite lists. Absent if the list has no category assigned. Clients should group uncategorized lists under a label of their own choosing."
          },
          "position" : {
            "type" : "integer",
            "format" : "int32",
            "description" : "The sort position of the list within its category. Lists are already sorted by position and name."
          },
          "privateList" : {
            "type" : "boolean",
            "description" : "Whether the list is private to the current buyer or shared with all buyers of the customer."
          },
          "editable" : {
            "type" : "boolean",
            "description" : "Whether the current buyer may modify the list and its favorites."
          },
          "editableByColleagues" : {
            "type" : "boolean",
            "description" : "Whether other buyers of the customer may modify this shared list. Always false for private lists. Report this value back when updating a list, otherwise the setting is overwritten."
          },
          "favoriteCount" : {
            "type" : "integer",
            "format" : "int64",
            "description" : "The number of favorites in the list."
          },
          "page" : {
            "type" : "integer",
            "format" : "int32",
            "description" : "The one-based number of the returned page."
          },
          "pageSize" : {
            "type" : "integer",
            "format" : "int32",
            "description" : "The maximum number of favorites per page."
          },
          "favorites" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiFavoriteResponse"
            },
            "description" : "The requested page of favorites, sorted by position. Use favoriteCount to determine the total number of favorites in the list."
          }
        },
        "required" : [ "id", "name", "position", "privateList", "editable", "editableByColleagues", "favoriteCount", "page", "pageSize", "favorites" ]
      },
      "ApiFavoriteResponse" : {
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "string",
            "description" : "The database id of the favorite."
          },
          "position" : {
            "type" : "integer",
            "format" : "int32",
            "description" : "The sort position of the favorite within the list. Favorites are already sorted by position."
          },
          "quantity" : {
            "$ref" : "#/components/schemas/ApiQuantityResponse",
            "description" : "The quantity stored for the favorite. Absent if no quantity has been set."
          },
          "itemNumber" : {
            "type" : "string",
            "description" : "The item number of the favorite as visible to the current buyer. Remains available even if the item itself is no longer part of the shop."
          },
          "item" : {
            "$ref" : "#/components/schemas/ApiSearchItemResponse",
            "description" : "The item data of the favorite, in the same format as delivered by the search API. Absent if the item is no longer available to the buyer - because it was removed, hidden or is no longer part of an accessible catalog. Clients should render such favorites as unavailable using the itemNumber."
          }
        },
        "required" : [ "id", "position", "itemNumber" ]
      },
      "ApiSearchItemResponse" : {
        "type" : "object",
        "properties" : {
          "uniqueItemNumber" : {
            "type" : "string",
            "description" : "The globally unique item number.",
            "example" : "1234567890"
          },
          "visibleItemNumber" : {
            "type" : "string",
            "description" : "The item number as shown to the user.",
            "example" : "1234567"
          },
          "shortDescription" : {
            "type" : "string",
            "description" : "The short, human-readable description of the item.",
            "example" : "Cordless Drill 18V"
          },
          "brandName" : {
            "type" : "string",
            "description" : "The name of the brand, if any.",
            "example" : "Acme"
          },
          "previewImageUrl" : {
            "type" : "string",
            "description" : "The URL of the preview image, if any."
          },
          "badges" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiBadgeResponse"
            },
            "description" : "The badges of the item."
          },
          "energyClasses" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiEnergyClassResponse"
            },
            "description" : "The energy efficiency classes of the item."
          },
          "energyProductDatasheetUrl" : {
            "type" : "string",
            "description" : "The URL of the energy product datasheet, if any."
          },
          "priceAndAvailability" : {
            "$ref" : "#/components/schemas/ApiPriceAndAvailabilityResponse",
            "description" : "The price and availability of the item. Only present if 'includePrices' was requested and the shop permits loading prices within the search."
          },
          "globalVariantGroup" : {
            "type" : "string",
            "description" : "The global variant group of the item, present if and only if the search actually grouped several matching variants into this entry. Pass this as 'variant' filter to the search endpoint (with the INDIVIDUAL variant mode) to fetch and narrow down all variants of the group."
          },
          "variantCount" : {
            "type" : "integer",
            "format" : "int32",
            "description" : "The number of matching variants which were grouped into this entry, present if and only if 'globalVariantGroup' is present (and then always greater than one).",
            "example" : 4
          }
        },
        "required" : [ "uniqueItemNumber", "visibleItemNumber", "shortDescription" ]
      },
      "ApiBadgeResponse" : {
        "type" : "object",
        "properties" : {
          "label" : {
            "type" : "string",
            "description" : "The displayable label of the badge.",
            "example" : "New"
          },
          "color" : {
            "type" : "string",
            "description" : "The text color of the badge as CSS color value, if any.",
            "example" : "#ffffff"
          },
          "backgroundColor" : {
            "type" : "string",
            "description" : "The background color of the badge as CSS color value, if any.",
            "example" : "#0d6efd"
          }
        },
        "required" : [ "label" ]
      },
      "ApiEnergyClassResponse" : {
        "type" : "object",
        "properties" : {
          "energyClass" : {
            "type" : "string",
            "description" : "The energy efficiency class.",
            "example" : "A+"
          },
          "energyClassRange" : {
            "type" : "string",
            "description" : "The energy efficiency scale the class belongs to. Must be displayed along with the class.",
            "example" : "A+++ - D"
          },
          "leftArrowImageUrl" : {
            "type" : "string",
            "description" : "The URL of the left-pointing arrow image for the class."
          },
          "rightArrowImageUrl" : {
            "type" : "string",
            "description" : "The URL of the right-pointing arrow image for the class."
          },
          "labelUrl" : {
            "type" : "string",
            "description" : "The URL of the full energy label document, if any."
          }
        },
        "required" : [ "energyClass", "energyClassRange" ]
      },
      "ApiPriceAndAvailabilityResponse" : {
        "type" : "object",
        "properties" : {
          "hasPrice" : {
            "type" : "boolean",
            "description" : "Whether a price could be determined for the current user."
          },
          "price" : {
            "$ref" : "#/components/schemas/ApiPriceResponse",
            "description" : "The effective price, present if 'hasPrice' is true. The price always refers to 'priceQuantity' units of the item."
          },
          "priceQuantity" : {
            "$ref" : "#/components/schemas/ApiQuantityResponse",
            "description" : "The quantity the price refers to, present if 'hasPrice' is true. A price of 19,99 with a price quantity of 100 means 19,99 per 100 units."
          },
          "availability" : {
            "$ref" : "#/components/schemas/ApiAvailabilityResponse",
            "description" : "The availability as determined by the standard mechanism, honoring the settings of the current basket: the pickup availability at the selected pickup site if the basket uses pickup shipping, the delivery availability otherwise. The type UNKNOWN can also indicate that the computation did not complete within the time window (timeout or overload) - a retry can then yield a result."
          }
        },
        "required" : [ "hasPrice" ]
      },
      "ApiAvailabilityResponse" : {
        "type" : "object",
        "properties" : {
          "type" : {
            "type" : "string",
            "description" : "The stock type, e.g. 'IN_STOCK', 'LOW_STOCK', 'OUT_OF_STOCK' or 'UNKNOWN'.",
            "example" : "IN_STOCK"
          },
          "text" : {
            "type" : "string",
            "description" : "A displayable text providing further details on the availability.",
            "example" : "Available"
          },
          "additionalText" : {
            "type" : "string",
            "description" : "An additional displayable text providing further details on the availability, if present.",
            "example" : "Delivery within 2-3 days"
          }
        },
        "required" : [ "type", "text" ]
      },
      "ApiFavoriteAddItemRequest" : {
        "type" : "object",
        "properties" : {
          "listId" : {
            "type" : "string",
            "description" : "The database id of the favorite list to add the item to. If omitted, the item is added to the private default list of the current buyer which is created on demand."
          },
          "itemNumber" : {
            "type" : "string",
            "description" : "The unique item number of the item to add, as reported by the search and item APIs. The visible item number is accepted as well, as long as it is unambiguous within the shop.",
            "example" : "A-10015"
          },
          "quantity" : {
            "type" : "number",
            "description" : "The quantity to store for the favorite, using a dot as decimal separator. Defaults to the recommended order quantity of the item. Rounded to three decimal places.",
            "example" : 2.5
          }
        },
        "required" : [ "itemNumber" ]
      },
      "ApiFavoriteAddItemResponse" : {
        "type" : "object",
        "properties" : {
          "listId" : {
            "type" : "string",
            "description" : "The database id of the favorite list the item was added to."
          },
          "listName" : {
            "type" : "string",
            "description" : "The displayable name of the favorite list the item was added to."
          },
          "alreadyExisted" : {
            "type" : "boolean",
            "description" : "Whether the item was already contained in the list. Adding is idempotent - the existing favorite is returned unchanged in this case."
          },
          "favorite" : {
            "$ref" : "#/components/schemas/ApiFavoriteResponse",
            "description" : "The created or already existing favorite."
          }
        },
        "required" : [ "listId", "listName", "alreadyExisted", "favorite" ]
      },
      "ApiFavoritesUpdateRequest" : {
        "type" : "object",
        "properties" : {
          "listId" : {
            "type" : "string",
            "description" : "The database id of the favorite list owning the favorites."
          },
          "favorites" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiFavoriteUpdateEntryRequest"
            },
            "description" : "The quantity updates to apply. All updates are validated before any update is applied."
          }
        },
        "required" : [ "listId", "favorites" ]
      },
      "ApiFavoriteUpdateEntryRequest" : {
        "type" : "object",
        "properties" : {
          "favoriteId" : {
            "type" : "string",
            "description" : "The database id of the favorite to update."
          },
          "quantity" : {
            "type" : "number",
            "description" : "The new quantity of the favorite, using a dot as decimal separator. Must be greater than zero and is rounded to three decimal places.",
            "example" : 2.5
          }
        },
        "required" : [ "favoriteId", "quantity" ]
      },
      "ApiFavoritesUpdateResponse" : {
        "type" : "object",
        "properties" : {
          "favorites" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiFavoriteResponse"
            },
            "description" : "The updated favorites, without their item data. Re-fetch the list to obtain updated item data if required."
          }
        },
        "required" : [ "favorites" ]
      },
      "ApiFavoritesRemoveRequest" : {
        "type" : "object",
        "properties" : {
          "listId" : {
            "type" : "string",
            "description" : "The database id of the favorite list owning the favorites."
          },
          "favoriteIds" : {
            "type" : "array",
            "items" : {
              "type" : "string"
            },
            "description" : "The database ids of the favorites to remove. All favorites are validated before any favorite is removed."
          }
        },
        "required" : [ "listId", "favoriteIds" ]
      },
      "ApiFavoritesRemoveResponse" : {
        "type" : "object",
        "properties" : {
          "removedCount" : {
            "type" : "integer",
            "format" : "int32",
            "description" : "The number of favorites which have been removed."
          }
        },
        "required" : [ "removedCount" ]
      },
      "ApiItemResponse" : {
        "type" : "object",
        "properties" : {
          "uniqueItemNumber" : {
            "type" : "string",
            "description" : "The globally unique item number.",
            "example" : "1234567890"
          },
          "visibleItemNumber" : {
            "type" : "string",
            "description" : "The item number as shown to the user.",
            "example" : "1234567"
          },
          "shortDescription" : {
            "type" : "string",
            "description" : "The short, human-readable description of the item.",
            "example" : "Cordless Drill 18V"
          },
          "brandName" : {
            "type" : "string",
            "description" : "The name of the brand, if any.",
            "example" : "Acme"
          },
          "brandImageUrl" : {
            "type" : "string",
            "description" : "The URL of the brand logo, if any."
          },
          "previewImageUrl" : {
            "type" : "string",
            "description" : "The URL of the preview image, if any."
          },
          "globalVariantGroup" : {
            "type" : "string",
            "description" : "The global variant group of the item, present if and only if the item belongs to a group of several variants. Pass this as 'variant' filter to the navigator search API to fetch and narrow down all variants."
          },
          "texts" : {
            "$ref" : "#/components/schemas/ApiItemTextsResponse",
            "description" : "The descriptive texts of the item. Only present if 'includeTexts' is set."
          },
          "features" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiItemFeatureResponse"
            },
            "description" : "The product features of the item. Only present if 'includeFeatures' is set."
          },
          "badges" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiBadgeResponse"
            },
            "description" : "The badges of the item. Only present if 'includeBadges' is set."
          },
          "energyClasses" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiEnergyClassResponse"
            },
            "description" : "The energy efficiency classes of the item. Only present if 'includeBadges' is set."
          },
          "energyProductDatasheetUrl" : {
            "type" : "string",
            "description" : "The URL of the energy product datasheet, if any. Only present if 'includeBadges' is set."
          },
          "quantities" : {
            "$ref" : "#/components/schemas/ApiItemQuantitiesResponse",
            "description" : "The order quantity metadata of the item. Only present if 'includeQuantities' is set."
          },
          "priceAndAvailability" : {
            "$ref" : "#/components/schemas/ApiPriceAndAvailabilityResponse",
            "description" : "The price and availability of the item. Only present if 'includePrices' is set and the shop permits loading prices within the item detail endpoint. Requesting this makes the otherwise ERP-free call wait for the price computation."
          }
        },
        "required" : [ "uniqueItemNumber", "visibleItemNumber", "shortDescription" ]
      },
      "ApiItemTextsResponse" : {
        "type" : "object",
        "properties" : {
          "longDescription" : {
            "type" : "string",
            "description" : "The long description of the item as XHTML, if any."
          },
          "additionalTexts" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiItemAdditionalTextResponse"
            },
            "description" : "Additional texts to display on the item detail page."
          }
        }
      },
      "ApiItemAdditionalTextResponse" : {
        "type" : "object",
        "properties" : {
          "label" : {
            "type" : "string",
            "description" : "The label of the additional text."
          },
          "text" : {
            "type" : "string",
            "description" : "The additional text itself."
          }
        },
        "required" : [ "label", "text" ]
      },
      "ApiItemFeatureResponse" : {
        "type" : "object",
        "properties" : {
          "code" : {
            "type" : "string",
            "description" : "The stable code of the feature."
          },
          "name" : {
            "type" : "string",
            "description" : "The translated name of the feature.",
            "example" : "Voltage"
          },
          "values" : {
            "type" : "array",
            "items" : {
              "type" : "string"
            },
            "description" : "The displayable values of the feature.",
            "example" : "[\"18 V\"]"
          }
        },
        "required" : [ "code", "name", "values" ]
      },
      "ApiItemQuantitiesResponse" : {
        "type" : "object",
        "properties" : {
          "quantityUnit" : {
            "type" : "string",
            "description" : "The displayable order unit of the item.",
            "example" : "piece"
          },
          "minOrderQuantity" : {
            "$ref" : "#/components/schemas/ApiQuantityResponse",
            "description" : "The minimal order quantity."
          },
          "orderStep" : {
            "$ref" : "#/components/schemas/ApiQuantityResponse",
            "description" : "The step in which the order quantity can be increased."
          },
          "priceQuantity" : {
            "$ref" : "#/components/schemas/ApiQuantityResponse",
            "description" : "The quantity the price refers to."
          },
          "recommendedOrderQuantity" : {
            "$ref" : "#/components/schemas/ApiQuantityResponse",
            "description" : "The recommended order quantity, if any."
          },
          "packagingUnits" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiItemPackagingUnitResponse"
            },
            "description" : "The packaging units of the item as known from the index - only the quantity is available synchronously. The price response carries the same units enriched with their name and price per unit (match the entries by their quantity)."
          }
        },
        "required" : [ "quantityUnit", "minOrderQuantity", "orderStep", "priceQuantity" ]
      },
      "ApiItemPackagingUnitResponse" : {
        "type" : "object",
        "properties" : {
          "name" : {
            "type" : "string",
            "description" : "The name of the packaging unit, as provided by the ERP - hence only present in the price response.",
            "example" : "Box"
          },
          "quantity" : {
            "$ref" : "#/components/schemas/ApiQuantityResponse",
            "description" : "The quantity contained in the packaging unit."
          },
          "pricePerUnit" : {
            "$ref" : "#/components/schemas/ApiPriceResponse",
            "description" : "The price per packaging unit, if known."
          }
        },
        "required" : [ "quantity" ]
      },
      "ApiItemPriceRequest" : {
        "type" : "object",
        "properties" : {
          "items" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiItemPriceRequestItem"
            },
            "description" : "The items to fetch the price data for. At least one item is required, and the number of items per request is limited (50 by default, configurable per shop) - chunk larger lists accordingly. Unknown or inaccessible item numbers are skipped - the response then simply carries no entry for them."
          },
          "onlyAvailability" : {
            "type" : "boolean",
            "description" : "Whether to skip all price fields and only compute the availabilities."
          },
          "includePriceScales" : {
            "type" : "boolean",
            "description" : "Whether to include the graduated prices."
          },
          "includePriceAdditions" : {
            "type" : "boolean",
            "description" : "Whether to include the price additions (surcharges)."
          },
          "pickupSiteCodes" : {
            "type" : "array",
            "items" : {
              "type" : "string"
            },
            "description" : "The sites to determine the pickup availability for. If given, each item carries the pickup availability at exactly these sites instead of the standard availability. If empty, the standard availability mechanism is used, which honors the settings of the current basket (pickup availability at the selected pickup site, or the delivery availability).",
            "example" : "[\"MAIN\"]"
          }
        },
        "required" : [ "items" ]
      },
      "ApiItemPriceRequestItem" : {
        "type" : "object",
        "properties" : {
          "uniqueItemNumber" : {
            "type" : "string",
            "description" : "The globally unique item number of the item to fetch the price data for.",
            "example" : "1234567890"
          },
          "quantity" : {
            "type" : "number",
            "description" : "The quantity used for the extended availability of this item. Defaults to the minimal order quantity. Prices are always computed for the default quantity - quantity-dependent prices are covered by the graduated prices.",
            "example" : 10.0
          }
        },
        "required" : [ "uniqueItemNumber" ]
      },
      "ApiItemPriceResponse" : {
        "type" : "object",
        "properties" : {
          "priceMode" : {
            "type" : "string",
            "description" : "The price mode of the current user, e.g. 'NET' or 'GROSS'."
          },
          "effectivePriceLabel" : {
            "type" : "string",
            "description" : "The displayable label to use for the effective prices, e.g. 'Your price'. Absent if 'onlyAvailability' was requested."
          },
          "effectivePriceSuffix" : {
            "type" : "string",
            "description" : "The displayable suffix to show next to the effective prices, e.g. 'plus VAT'. Absent if 'onlyAvailability' was requested."
          },
          "recommendedPriceLabel" : {
            "type" : "string",
            "description" : "The displayable label to use for the recommended prices, e.g. 'list price'. Absent if 'onlyAvailability' was requested."
          },
          "secondaryPriceSuffix" : {
            "type" : "string",
            "description" : "The displayable suffix to show next to the secondary prices, e.g. 'incl. VAT'. Absent if 'onlyAvailability' was requested."
          },
          "items" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiItemPriceItemResponse"
            },
            "description" : "The price and availability data per requested item, in the order of the request."
          }
        },
        "required" : [ "priceMode", "items" ]
      },
      "ApiItemPriceItemResponse" : {
        "type" : "object",
        "properties" : {
          "uniqueItemNumber" : {
            "type" : "string",
            "description" : "The globally unique item number the price data belongs to.",
            "example" : "1234567890"
          },
          "priceAndAvailability" : {
            "$ref" : "#/components/schemas/ApiPriceAndAvailabilityResponse",
            "description" : "The price and availability of the item - the same shared block as returned by the search and item detail endpoints. Its 'availability' is only present in the standard case: if 'pickupSiteCodes' were given, the pickup availabilities in 'pickupStocks' replace it."
          },
          "offer" : {
            "type" : "boolean",
            "description" : "Whether the effective price is a special offer."
          },
          "canAddToBasket" : {
            "type" : "boolean",
            "description" : "Whether the item can currently be added to the basket."
          },
          "messages" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiItemMessageResponse"
            },
            "description" : "Messages emitted while computing the prices, e.g. ERP hints. May be empty."
          },
          "recommendedPrice" : {
            "$ref" : "#/components/schemas/ApiPriceResponse",
            "description" : "The recommended (list) price, if it should be displayed."
          },
          "secondaryPrice" : {
            "$ref" : "#/components/schemas/ApiPriceResponse",
            "description" : "The secondary price (e.g. the gross price for net shops), if it should be displayed."
          },
          "basePrice" : {
            "$ref" : "#/components/schemas/ApiPriceResponse",
            "description" : "The base price (price per base unit), if any."
          },
          "priceScales" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiItemPriceScaleResponse"
            },
            "description" : "The graduated prices of the item. Only present if 'includePriceScales' is set."
          },
          "bestPriceScale" : {
            "$ref" : "#/components/schemas/ApiItemBestPriceScaleResponse",
            "description" : "The best graduated price, if it should be displayed."
          },
          "priceAdditions" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiItemPriceAdditionResponse"
            },
            "description" : "The price additions (surcharges) of the item. Only present if 'includePriceAdditions' is set."
          },
          "packagingUnits" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiItemPackagingUnitResponse"
            },
            "description" : "The packaging units of the item, as provided by the ERP along with the prices. Only present when prices were computed."
          },
          "extendedAvailability" : {
            "$ref" : "#/components/schemas/ApiAvailabilityResponse",
            "description" : "The extended (manufacturer) availability, complementing the standard availability. The server requests it automatically whenever the ERP availability is inconclusive. Never present when 'pickupSiteCodes' were given."
          },
          "pickupStocks" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiItemPickupStockResponse"
            },
            "description" : "The pickup availabilities at the requested sites. Only present if 'pickupSiteCodes' were given, and then carries exactly those sites (replacing the standard availability)."
          }
        },
        "required" : [ "uniqueItemNumber", "priceAndAvailability", "offer", "canAddToBasket", "messages" ]
      },
      "ApiItemMessageResponse" : {
        "type" : "object",
        "properties" : {
          "html" : {
            "type" : "string",
            "description" : "The message as HTML."
          },
          "type" : {
            "type" : "string",
            "description" : "The severity of the message, e.g. 'INFO', 'WARNING' or 'PROBLEM'.",
            "example" : "INFO"
          }
        },
        "required" : [ "html", "type" ]
      },
      "ApiItemPriceScaleResponse" : {
        "type" : "object",
        "properties" : {
          "pricePredicate" : {
            "type" : "string",
            "description" : "The condition type of the scale: 'LOWER_LIMIT' (applies from the given quantity on) or 'MODULO' (applies if the quantity is a multiple of the given value).",
            "example" : "LOWER_LIMIT"
          },
          "conditionValue" : {
            "$ref" : "#/components/schemas/ApiQuantityResponse",
            "description" : "The quantity the condition refers to."
          },
          "price" : {
            "$ref" : "#/components/schemas/ApiPriceResponse",
            "description" : "The list price of the scale."
          },
          "effectivePrice" : {
            "$ref" : "#/components/schemas/ApiPriceResponse",
            "description" : "The effective price of the scale for the current user."
          }
        },
        "required" : [ "pricePredicate", "conditionValue" ]
      },
      "ApiItemBestPriceScaleResponse" : {
        "type" : "object",
        "properties" : {
          "prefix" : {
            "type" : "string",
            "description" : "The displayable prefix, e.g. 'from'.",
            "example" : "from"
          },
          "price" : {
            "$ref" : "#/components/schemas/ApiPriceResponse",
            "description" : "The best effective scale price."
          },
          "suffix" : {
            "type" : "string",
            "description" : "The displayable suffix describing the condition, e.g. '>= 100 piece'."
          }
        },
        "required" : [ "price" ]
      },
      "ApiItemPriceAdditionResponse" : {
        "type" : "object",
        "properties" : {
          "description" : {
            "type" : "string",
            "description" : "The displayable description of the addition.",
            "example" : "Copper surcharge"
          },
          "value" : {
            "$ref" : "#/components/schemas/ApiPriceResponse",
            "description" : "The value of the addition."
          },
          "showPriceQuantity" : {
            "type" : "boolean",
            "description" : "Whether the addition refers to the price quantity of the item."
          }
        },
        "required" : [ "description", "value", "showPriceQuantity" ]
      },
      "ApiItemPickupStockResponse" : {
        "type" : "object",
        "properties" : {
          "siteCode" : {
            "type" : "string",
            "description" : "The code of the pickup site."
          },
          "availability" : {
            "$ref" : "#/components/schemas/ApiAvailabilityResponse",
            "description" : "The availability at the pickup site."
          },
          "external" : {
            "type" : "boolean",
            "description" : "Whether the stock information originates from an external source."
          }
        },
        "required" : [ "siteCode", "availability", "external" ]
      },
      "ApiItemRecentResponse" : {
        "type" : "object",
        "properties" : {
          "items" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiItemSummaryResponse"
            },
            "description" : "The recently viewed items, most recent first. Empty if the feature is disabled or no visits were recorded yet."
          }
        },
        "required" : [ "items" ]
      },
      "ApiItemSummaryResponse" : {
        "type" : "object",
        "properties" : {
          "uniqueItemNumber" : {
            "type" : "string",
            "description" : "The globally unique item number.",
            "example" : "1234567890"
          },
          "visibleItemNumber" : {
            "type" : "string",
            "description" : "The item number as shown to the user.",
            "example" : "1234567"
          },
          "shortDescription" : {
            "type" : "string",
            "description" : "The short, human-readable description of the item.",
            "example" : "Cordless Drill 18V"
          },
          "brandName" : {
            "type" : "string",
            "description" : "The name of the brand, if any.",
            "example" : "Acme"
          },
          "previewImageUrl" : {
            "type" : "string",
            "description" : "The URL of the preview image, if any."
          }
        },
        "required" : [ "uniqueItemNumber", "visibleItemNumber", "shortDescription" ]
      },
      "ApiSearchRequest" : {
        "type" : "object",
        "properties" : {
          "query" : {
            "type" : "string",
            "description" : "The free-text search query.",
            "example" : "cordless drill"
          },
          "filters" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiSearchFilterValue"
            },
            "description" : "The active filters to apply, e.g. brand, price range or feature filters."
          },
          "sort" : {
            "type" : "string",
            "enum" : [ "RELEVANCE", "PRICE_ASC", "PRICE_DESC" ],
            "description" : "The sort mode to apply. Defaults to 'RELEVANCE'. Note that not every mode is available for every request - an unavailable mode silently falls back, so check 'appliedSort' and 'availableSorts' of the response.",
            "example" : "RELEVANCE"
          },
          "page" : {
            "type" : "integer",
            "format" : "int32",
            "description" : "The requested page, starting at 1.",
            "example" : 1
          },
          "pageSize" : {
            "type" : "integer",
            "format" : "int32",
            "description" : "The number of items to return per page.",
            "example" : 20
          },
          "variantMode" : {
            "type" : "string",
            "enum" : [ "GROUPED", "INDIVIDUAL" ],
            "description" : "Determines whether variants of the same item are grouped into a single result entry.",
            "example" : "GROUPED"
          },
          "includePrices" : {
            "type" : "boolean",
            "description" : "Whether to load prices and availabilities for the items of the result page. Loading them may require an ERP round-trip and can increase the response time noticeably. Only honored if the shop permits price loading within the search."
          }
        }
      },
      "ApiSearchFilterValue" : {
        "type" : "object",
        "properties" : {
          "name" : {
            "type" : "string",
            "description" : "The name of the filter, e.g. 'brand', 'price-min' or 'feature[code]'."
          },
          "value" : {
            "type" : "string",
            "description" : "The value to set for the filter."
          }
        },
        "required" : [ "name", "value" ]
      },
      "ApiSearchResponse" : {
        "type" : "object",
        "properties" : {
          "totalHits" : {
            "type" : "integer",
            "format" : "int32",
            "description" : "The total number of items matching the search."
          },
          "items" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiSearchItemResponse"
            },
            "description" : "The items on the requested page."
          },
          "facets" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiSearchFacetResponse"
            },
            "description" : "The available facets to further narrow down the search."
          },
          "pagination" : {
            "$ref" : "#/components/schemas/ApiSearchPaginationResponse",
            "description" : "The paging state of this result."
          },
          "appliedSort" : {
            "type" : "string",
            "enum" : [ "RELEVANCE", "PRICE_ASC", "PRICE_DESC" ],
            "description" : "The sort mode which was effectively applied to this result. This may differ from the requested one, as an unavailable mode falls back instead of failing the request."
          },
          "availableSorts" : {
            "type" : "array",
            "items" : {
              "type" : "string",
              "enum" : [ "RELEVANCE", "PRICE_ASC", "PRICE_DESC" ]
            },
            "description" : "The sort modes which can be requested for this result. Use these to build a sort selection - requesting a mode which is absent here falls back to another mode."
          }
        },
        "required" : [ "totalHits", "pagination", "appliedSort", "availableSorts" ]
      },
      "ApiSearchFacetResponse" : {
        "type" : "object",
        "properties" : {
          "code" : {
            "type" : "string",
            "description" : "The stable code used to activate a value of this facet, e.g. via 'ApiSearchFilterValue.name'."
          },
          "label" : {
            "type" : "string",
            "description" : "The label to display for this facet."
          },
          "type" : {
            "type" : "string",
            "enum" : [ "CHOICE" ],
            "description" : "The kind of this facet."
          },
          "values" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiSearchFacetValueResponse"
            },
            "description" : "The selectable values of this facet."
          }
        },
        "required" : [ "code", "label", "type" ]
      },
      "ApiSearchFacetValueResponse" : {
        "type" : "object",
        "properties" : {
          "key" : {
            "type" : "string",
            "description" : "The stable key used to activate this value via 'ApiSearchFilterValue.value'."
          },
          "label" : {
            "type" : "string",
            "description" : "The label to display for this value."
          },
          "count" : {
            "type" : "integer",
            "format" : "int32",
            "description" : "The number of items matching this value."
          },
          "active" : {
            "type" : "boolean",
            "description" : "Whether this value is currently active/selected."
          }
        },
        "required" : [ "key", "label", "count", "active" ]
      },
      "ApiSearchPaginationResponse" : {
        "type" : "object",
        "properties" : {
          "page" : {
            "type" : "integer",
            "format" : "int32",
            "description" : "The effective page which was returned, starting at 1.",
            "example" : 1
          },
          "pageSize" : {
            "type" : "integer",
            "format" : "int32",
            "description" : "The effective number of items per page.",
            "example" : 20
          },
          "hasMore" : {
            "type" : "boolean",
            "description" : "Whether another page can be requested."
          }
        },
        "required" : [ "page", "pageSize", "hasMore" ]
      },
      "ApiSearchSuggestionsResponse" : {
        "type" : "object",
        "properties" : {
          "suggestions" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiSearchSuggestionResponse"
            },
            "description" : "The suggestions grouped in their natural relevance order."
          }
        },
        "required" : [ "suggestions" ]
      },
      "ApiSearchSuggestionResponse" : {
        "type" : "object",
        "properties" : {
          "type" : {
            "type" : "string",
            "description" : "The suggestion category, for example 'brand', 'class', 'group[productGroup]', 'item' or 'variant'."
          },
          "value" : {
            "type" : "string",
            "description" : "The value to use when applying the suggestion. Item suggestions contain the unique item number instead of a web URL."
          },
          "label" : {
            "type" : "string",
            "description" : "The label to display for this suggestion."
          },
          "imageUrl" : {
            "type" : "string",
            "description" : "An optional image URL for this suggestion."
          },
          "description" : {
            "type" : "string",
            "description" : "An optional secondary description."
          },
          "disabled" : {
            "type" : "boolean",
            "description" : "Whether this entry is informational and cannot be selected."
          }
        },
        "required" : [ "type", "label", "disabled" ]
      },
      "ApiSearchBrowseRequest" : {
        "type" : "object",
        "properties" : {
          "type" : {
            "type" : "string",
            "enum" : [ "BRAND", "CLASS", "GROUP" ],
            "description" : "The hierarchy type to browse."
          },
          "groupType" : {
            "type" : "string",
            "description" : "The group type code used for GROUP navigation, for example PRODUCT_GROUP. Defaults to PRODUCT_GROUP if omitted. Ignored for other types."
          },
          "query" : {
            "type" : "string",
            "description" : "Optional full text query constraining the browsed values."
          },
          "filters" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiSearchFilterValue"
            },
            "description" : "Optional active filter context used to constrain the browsed values."
          },
          "hierarchyLevel" : {
            "type" : "integer",
            "format" : "int32",
            "description" : "The zero-based hierarchy level to aggregate for CLASS and GROUP navigation. If a class or group token is selected via filters, the level is derived from that token and this value is ignored. Otherwise it selects the start level (default 0 for the first/root page) and must be repeated unchanged together with the cursor while paginating. Ignored for BRAND."
          },
          "cursor" : {
            "type" : "string",
            "description" : "The opaque cursor returned as nextCursor by the preceding browse request. Omit on the first page; do not send placeholder values."
          }
        },
        "required" : [ "type" ]
      },
      "ApiSearchBrowseResponse" : {
        "type" : "object",
        "properties" : {
          "entries" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ApiSearchBrowseEntryResponse"
            },
            "description" : "The hierarchy entries for this page."
          },
          "nextCursor" : {
            "type" : "string",
            "description" : "The opaque cursor for the next page, or null when no further page exists."
          },
          "hasMore" : {
            "type" : "boolean",
            "description" : "Whether another cursor page is available."
          },
          "hierarchyLevel" : {
            "type" : "integer",
            "format" : "int32",
            "description" : "The hierarchy level represented by this response."
          }
        },
        "required" : [ "entries", "hasMore", "hierarchyLevel" ]
      },
      "ApiSearchBrowseEntryResponse" : {
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "string",
            "description" : "The stable filter value for this hierarchy entry."
          },
          "name" : {
            "type" : "string",
            "description" : "The display name of this hierarchy entry."
          },
          "imageUrl" : {
            "type" : "string",
            "description" : "An optional logo or icon URL."
          },
          "description" : {
            "type" : "string",
            "description" : "An optional descriptive text, usually containing the item count."
          }
        },
        "required" : [ "id", "name" ]
      }
    }
  }
}