{"components":{"schemas":{"LocaleField":{"properties":{"def":{"type":"string","title":"Default value"},"en":{"type":"string","title":"English translation"},"fi":{"type":"string","title":"Finnish translation"},"de":{"type":"string","title":"German translation"},"ru":{"type":"string","title":"Russian translation"},"sk":{"type":"string","title":"Slovak translation"},"sv":{"type":"string","title":"Swedish translation"},"nl":{"type":"string","title":"Dutch translation"},"hu":{"type":"string","title":"Hungarian translation"},"no":{"type":"string","title":"Norwegian translation"},"fr":{"type":"string","title":"French translation"},"es":{"type":"string","title":"Spanish translation"},"it":{"type":"string","title":"Italian translation"},"cs":{"type":"string","title":"Czech translation"}},"type":"object","required":["def"],"title":"Localized string","description":"An object of translations for a string","example":{"def":"Hello","en":"Hello","fi":"Moi","de":"Hallo","ru":"Привет","sk":"Ahoj","sv":"Hallå","nl":"Hallo","hu":"Szia","no":"Hallo","fr":"Bonjour","es":"Hola","it":"Ciao","cs":"Ahoj"}},"ProductVariantProperty":{"properties":{"property":{"not":{"type":"null"},"title":"Property","description":"A localized string representing the property in question","allOf":[{"$ref":"#/components/schemas/LocaleField"}]},"value":{"not":{"type":"null"},"title":"Value","description":"For this variation, the value of the property in question","allOf":[{"$ref":"#/components/schemas/LocaleField"}]}},"type":"object","required":["property","value"],"title":"A product variant property object","description":"A single product variant property and its value for a given product variant. Represents a single \"variation\" of a product, e.g. \"size\" is \"large\". A product variant may have multiple such variations, i.e. it can at the same time be both \"large\" (size) and \"red\" (color)","example":{"property":{"def":"Size"},"value":{"def":"Extra-large"}}},"ProductVariant":{"properties":{"id":{"type":"string","title":"ID","description":"The ID of the product variant"},"properties":{"items":{"allOf":[{"$ref":"#/components/schemas/ProductVariantProperty"}]},"type":"array","title":"Properties","description":"An array of the variations that this product variant consists of, which describe how it is different from the base product."},"priceDifference":{"type":"integer","title":"Price difference","description":"The difference in price to the product `basePrice`. Can also be negative."}},"type":"object","required":["id","properties","priceDifference"],"title":"Product variant","description":"A single variant of a given product. A single variant can contain several \"variations\" (for example, color=blue AND size=XL), which are described by the `properties` array.","example":{"id":"v7G1M0po0mLwBDVzb9Ou","properties":[{"property":{"def":"Size"},"value":{"def":"Extra-large"}}],"priceDifference":1000}},"PricingItem":{"properties":{"label":{"title":"Label","description":"The label for the duration of this pricing option","allOf":[{"$ref":"#/components/schemas/LocaleField"}]},"timePeriod":{"type":"string","enum":["minutes","hours","days_within_opening_hours","24h_days","weeks","months","years"],"title":"Time period","description":"The type of time period to use"},"timeValue":{"type":"integer","title":"Time value","description":"The amount of the given time period"},"multiplier":{"type":"number","title":"Multiplier","description":"The factor to multiply the product's base price by when calculating the price of this option"},"price":{"type":"integer","title":"Price","description":"The calculated price of this option (product base price x multiplier)"},"channels":{"items":{"type":"string","enum":["ALL","ONLINE","STORE","ADMIN","HIDDEN"]},"type":"array","title":"Channels","description":"The channels this pricing option is visible in"},"segments":{"items":{"type":"string"},"type":"array","title":"Segments","description":"The customer segments this pricing option is visible for"}},"type":"object","required":["timePeriod","timeValue","multiplier","price","channels"],"title":"Pricing item","description":"A single pricing option","example":{"label":{"def":"1 hour","en":"English translation","fi":"Finnish translation","de":"German translation","ru":"Russian translation","sk":"Slovak translation","nl":"Dutch translation","hu":"Hungarian translation","no":"Norwegian translation","fr":"French translation","es":"Spanish translation","it":"English translation","cs":"Czech translation"},"timePeriod":"hours","timeValue":1,"multiplier":1,"price":1,"channels":["ALL"],"segments":["ALL"]}},"ProductPricingOptions":{"properties":{"basePrice":{"type":"integer","title":"Product base price","description":"The base price of the product in minor units. For most currencies this means cents, so e.g. $20 would be 2000."},"currency":{"type":"string","title":"Currency","description":"The currency to use for this product"},"useFixedPrice":{"type":"boolean","title":"Use fixed price?","description":"Whether this product uses fixed pricing or not \n - If `true`, the product price is always equal to `basePrice` regardless of rental duration \n - If `false`, the product uses time-based pricing according to `options`, and the `basePrice` field can be ignored"},"deposit":{"type":"integer","title":"Deposit","description":"The amount of deposit to charge for the product"},"vatPercentage":{"type":"number","title":"VAT percentage","description":"The VAT percentage of the product. This is included in all prices by default."},"options":{"not":{"type":"null"},"items":{"allOf":[{"$ref":"#/components/schemas/PricingItem"}]},"type":"array","title":"Pricing options","description":"An array of time-based pricing options for this product"}},"type":"object","required":["basePrice","currency","useFixedPrice","deposit","vatPercentage","options"],"title":"Product pricing","description":"An object of pricing-related options","example":{"basePrice":1000,"currency":"USD","useFixedPrice":false,"deposit":0,"vatPercentage":0,"options":[{"label":{"def":"1 hour","en":"English translation","fi":"Finnish translation","de":"German translation","ru":"Russian translation","sk":"Slovak translation","nl":"Dutch translation","hu":"Hungarian translation","no":"Norwegian translation","fr":"French translation","es":"Spanish translation","it":"English translation","cs":"Czech translation"},"timePeriod":"hours","timeValue":1,"multiplier":1,"price":1,"channels":["ALL"],"segments":["ALL"]}]}},"ProductVisibilityOptions":{"properties":{"locations":{"items":{"type":"string"},"type":"array","title":"Locations","description":"An array of shop location ids this product is visible in. \n - If `null`, the product is visible in all locations \n - If `[]`, the product is hidden from all locations"},"segments":{"items":{"type":"string","enum":["kid","teen","adult","senior"]},"type":"array","title":"Segments","description":"An array of segment ids this product is visible for \n - If `null`, the product is visible for all segments \n - If `[]`, the product is hidden from all segments"},"channels":{"items":{"type":"string","enum":["ADMIN","STORE","ONLINE"]},"type":"array","title":"Sales channels","description":"An array of sales channels this product is visible in \n - If `null`, the product is visible in all sales channels \n - If `[]`, the product is hidden from all sales channels"},"visibleInListing":{"type":"boolean","title":"Visible in product listing","description":"If `false`, the product is hidden from the default product listing, and can only be rented as part of a product package or as an additional product"}},"type":"object","required":["visibleInListing"],"title":"Product visibility","description":"An object of visibility-related options for a product","example":{"locations":["dYqu22C6mVtth6kkkIG6"],"segments":[],"channels":["ADMIN"],"visibleInListing":false}},"Product":{"properties":{"id":{"type":"string","title":"Product ID","description":"The unique identifier of this product","example":"DP5Ro6d0w1"},"createdAt":{"oneOf":[{"format":"date","type":"string"},{"format":"date-time","type":"string"}],"title":"Created at","description":"Timestamp of when this product was created, as [ISO 8601](https://wikipedia.org/wiki/ISO_8601) and converted to UTC. For some old products this may not exist, in which case it is `null`","example":"2020-06-23T11:24:05.051Z"},"shopId":{"type":"string","title":"Shop ID","description":"The unique identifier of the shop this product belongs to","example":"YFaSGl0x7e"},"name":{"not":{"type":"null"},"title":"Name","description":"The name of this product","allOf":[{"$ref":"#/components/schemas/LocaleField"}]},"description":{"title":"Description","description":"An optional short description of this product","allOf":[{"$ref":"#/components/schemas/LocaleField"}]},"type":{"type":"string","enum":["rental","service"],"title":"Type","description":"The type of this product","example":"rental"},"image":{"format":"url","type":"string","title":"Image","description":"A URL to the primary image of this product, or `null` if one is not set","example":"https://placehold.it/400x400"},"images":{"items":{"type":"string"},"type":"array","title":"Images","description":"A list of URLs of all of the images for this product","example":["https://placehold.it/400x400","https://placehold.it/500x500"]},"categoryIds":{"items":{"type":"string"},"type":"array","title":"Category IDs","description":"The categories this product belongs to, as a list of IDs","example":["LvDwLIvwmq","S3UrpxL1Ct"]},"variants":{"items":{"allOf":[{"$ref":"#/components/schemas/ProductVariant"}]},"type":"array","title":"Variants","description":"An array of variants of this product. See [ProductVariant](/docs#tag/ProductVariant) for details."},"packageProductIds":{"items":{"type":"string"},"type":"array","title":"Package product IDs","description":"\n - If this is a package product, an array of the IDs of the products included \n - If not, `null`","example":["kGysfnRjZm","dJICIenyHc"]},"additionalProductIds":{"items":{"type":"string"},"type":"array","title":"Additional product IDs","description":"The additional products to offer with this product, as an array of product IDs","example":["keLECuBqzf","4lCvipkJLJ"]},"visibility":{"not":{"type":"null"},"title":"Visibility","description":"The visibility settings for this product","allOf":[{"$ref":"#/components/schemas/ProductVisibilityOptions"}]},"pricing":{"not":{"type":"null"},"title":"Pricing","description":"The pricing settings for this product","allOf":[{"$ref":"#/components/schemas/ProductPricingOptions"}]}},"type":"object","required":["id","shopId","name","type","images","categoryIds","visibility","pricing"],"title":"Product","description":"A product object","example":{"id":"W8b6ItJtjlVrKj3T3vOQ","createdAt":"2026-08-29T22:58:14.569Z","shopId":"7MnnkCuC8C0ferasv8HW","name":{"def":"Road bicycle","en":"English translation","fi":"Finnish translation","de":"German translation","ru":"Russian translation","sk":"Slovak translation","nl":"Dutch translation","hu":"Hungarian translation","no":"Norwegian translation","fr":"French translation","es":"Spanish translation","it":"English translation","cs":"Czech translation"},"description":{"def":"Perfect bike for exploring your local roads","en":"English translation","fi":"Finnish translation","de":"German translation","ru":"Russian translation","sk":"Slovak translation","nl":"Dutch translation","hu":"Hungarian translation","no":"Norwegian translation","fr":"French translation","es":"Spanish translation","it":"English translation","cs":"Czech translation"},"type":"rental","image":"https://placeimg.com/640/480/any","images":["https://placeimg.com/640/480/any","https://placeimg.com/640/480/any"],"categoryIds":["AY2iogg8KU2YAs6lwfNn"],"variants":[{"id":"iQQbURb08xRGNe5OSjyd","properties":[{"property":{"def":"Size"},"value":{"def":"Extra-large"}}],"priceDifference":1000}],"packageProductIds":["4AQR2mfbVgsJqj4jvnIm"],"additionalProductIds":["hdGC7s6euZ2sSHZ3tPy5","dRJuZnrXhfUFeTqjsQLA"],"visibility":{"locations":["6DRuGban7p3TX4U2zFlJ"],"segments":[],"channels":["ADMIN"],"visibleInListing":false},"pricing":{"basePrice":1000,"currency":"USD","useFixedPrice":false,"deposit":0,"vatPercentage":0,"options":[{"label":{"def":"1 hour","en":"English translation","fi":"Finnish translation","de":"German translation","ru":"Russian translation","sk":"Slovak translation","nl":"Dutch translation","hu":"Hungarian translation","no":"Norwegian translation","fr":"French translation","es":"Spanish translation","it":"English translation","cs":"Czech translation"},"timePeriod":"hours","timeValue":1,"multiplier":1,"price":1,"channels":["ALL"],"segments":["ALL"]}]}}},"ShopLocation":{"properties":{"id":{"type":"string","title":"Shop location ID","description":"The unique ID of the shop location"},"name":{"type":"string","title":"Shop location name","description":"The name of the shop location"},"description":{"title":"Description","description":"A description of the shop location","allOf":[{"$ref":"#/components/schemas/LocaleField"}]},"address":{"type":"string","title":"Address","description":"The address line of the shop location"},"city":{"type":"string","title":"City","description":"The city where this location is located"},"zipCode":{"type":"string","title":"Zip code","description":"The postal code of the shop location"},"state":{"type":"string","title":"State","description":"The state where this location is located"},"country":{"type":"string","title":"Country","description":"The country where this location is located"}},"type":"object","required":["id","name","address"],"title":"Shop location","description":"A shop location","example":{"id":"aByB0b4QZ6vv86ujaagu","name":"A rental shop location","description":{"def":"Our 24h kiosk in Brooklyn","en":"English translation","fi":"Finnish translation","de":"German translation","ru":"Russian translation","sk":"Slovak translation","nl":"Dutch translation","hu":"Hungarian translation","no":"Norwegian translation","fr":"French translation","es":"Spanish translation","it":"English translation","cs":"Czech translation"},"address":"101 Brooklyn St.","city":"New York","zipCode":"10011","state":"New York","country":"United States"}},"Shop":{"properties":{"id":{"type":"string","title":"Shop ID","description":"The unique ID of the shop"},"name":{"type":"string","title":"Shop name","description":"The name of the shop"},"email":{"type":"string","title":"Shop email","description":"The contact email of the shop"},"phone":{"type":"string","title":"Shop phone number","description":"The contact phone number of the shop"},"state":{"type":"string","title":"State","description":"The state the shop is located in"},"country":{"type":"string","title":"Country","description":"The country the shop is located in"},"businessId":{"type":"string","title":"Business ID","description":"The business ID of the shop"},"logo":{"type":"string","title":"Shop logo","description":"The logo of the shop"},"mainLocation":{"not":{"type":"null"},"title":"Main location","description":"The primary location of the shop","allOf":[{"$ref":"#/components/schemas/ShopLocation"}]},"locations":{"not":{"type":"null"},"items":{"allOf":[{"$ref":"#/components/schemas/ShopLocation"}]},"type":"array","title":"Other locations","description":"Other locations the shop operates at"}},"type":"object","required":["id","name","email","mainLocation","locations"],"title":"Shop","description":"Information about a shop","example":{"id":"3W5BybbQTmeUaVN55v0w","name":"A rental company","email":"sam@example.com","phone":"123-456-7777","state":"Nevada","country":"United States","businessId":"1234-5678","logo":"https://placeimg.com/640/480/any","mainLocation":{"id":"bBrGOenCLHSw5NsbNjXK","name":"A rental shop location","description":{"def":"Our 24h kiosk in Brooklyn","en":"English translation","fi":"Finnish translation","de":"German translation","ru":"Russian translation","sk":"Slovak translation","nl":"Dutch translation","hu":"Hungarian translation","no":"Norwegian translation","fr":"French translation","es":"Spanish translation","it":"English translation","cs":"Czech translation"},"address":"101 Brooklyn St.","city":"New York","zipCode":"10011","state":"New York","country":"United States"},"locations":[{"id":"081pVyHquJwsT8qngWGt","name":"A rental shop location","description":{"def":"Our 24h kiosk in Brooklyn","en":"English translation","fi":"Finnish translation","de":"German translation","ru":"Russian translation","sk":"Slovak translation","nl":"Dutch translation","hu":"Hungarian translation","no":"Norwegian translation","fr":"French translation","es":"Spanish translation","it":"English translation","cs":"Czech translation"},"address":"101 Brooklyn St.","city":"New York","zipCode":"10011","state":"New York","country":"United States"}]}},"Category":{"properties":{"id":{"type":"string","title":"Category ID","description":"The unique ID of the category"},"shopId":{"type":"string","title":"Shop ID","description":"The unique ID of the shop this category belongs to"},"name":{"not":{"type":"null"},"title":"Name","description":"The localized name of the category","allOf":[{"$ref":"#/components/schemas/LocaleField"}]},"description":{"title":"Description","description":"A localized description of the category","allOf":[{"$ref":"#/components/schemas/LocaleField"}]},"image":{"type":"string","title":"Image","description":"A cover image for the category"}},"type":"object","required":["id","shopId","name"],"title":"Product category","description":"A category to which a Product can belong to","example":{"id":"2oI0jnPq3yt3DiZDCRt6","shopId":"BdB0EKLtMopJYxiawQPo","name":{"def":"Bicycles & Accessories","en":"English translation","fi":"Finnish translation","de":"German translation","ru":"Russian translation","sk":"Slovak translation","nl":"Dutch translation","hu":"Hungarian translation","no":"Norwegian translation","fr":"French translation","es":"Spanish translation","it":"English translation","cs":"Czech translation"},"description":{"def":"Everything you need to go out on a cycling trip","en":"English translation","fi":"Finnish translation","de":"German translation","ru":"Russian translation","sk":"Slovak translation","nl":"Dutch translation","hu":"Hungarian translation","no":"Norwegian translation","fr":"French translation","es":"Spanish translation","it":"English translation","cs":"Czech translation"},"image":"https://placeimg.com/640/480/any"}},"ApiError":{"properties":{"name":{"type":"string","title":"Name","description":"The unique name of this type of error"},"title":{"type":"string","title":"Title","description":"The title of this error"},"status":{"type":"integer","title":"HTTP status","description":"The HTTP status code corresponding to this error. Note that HTTP status codes are set on a best-effort basis and may be changed without separate notice and should not be used in business or UI logic to identify errors - use the `name` property for that."},"message":{"type":"string","title":"Message","description":"A human-readable message related to this specific occurence of the error, which in some cases may be useful to show directly to a client"},"instance":{"type":"string","title":"Instance","description":"The HTTP method and path of the request where the error originated from"},"type":{"format":"url","type":"string","title":"Type","description":"A url to further documentation for this type of error"},"details":{"type":"object","title":"Details","description":"An optional object of additional details related to the error (for debugging purposes). The structure of this object can vary and should not be used for any busines or UI logic (e.g. showing an error message to a user - use the `message` property for that)."}},"type":"object","required":["name","title","status","message","instance","type"],"title":"Error details","description":"Generic class for details sent with an error response - see specific errors for more details."},"SyntaxError":{"properties":{"name":{"type":"string","title":"Name","description":"The unique name of this type of error"},"title":{"type":"string","title":"Title","description":"The title of this error"},"status":{"type":"integer","title":"HTTP status","description":"The HTTP status code corresponding to this error. Note that HTTP status codes are set on a best-effort basis and may be changed without separate notice and should not be used in business or UI logic to identify errors - use the `name` property for that."},"message":{"type":"string","title":"Message","description":"A human-readable message related to this specific occurence of the error, which in some cases may be useful to show directly to a client"},"instance":{"type":"string","title":"Instance","description":"The HTTP method and path of the request where the error originated from"},"type":{"format":"url","type":"string","title":"Type","description":"A url to further documentation for this type of error"},"details":{"type":"object","title":"Details","description":"An optional object of additional details related to the error (for debugging purposes). The structure of this object can vary and should not be used for any busines or UI logic (e.g. showing an error message to a user - use the `message` property for that)."}},"type":"object","required":["name","title","status","message","instance","type"],"title":"Syntax error","description":"The request syntax was invalid and the server was unable to handle the request","example":{"name":"SyntaxError","title":"Syntax error","status":400,"message":"Invalid JSON in request body","instance":"GET /some/path","type":"https://url-to-docs.com/details-about-this-error"}},"ValidationError":{"properties":{"name":{"type":"string","title":"Name","description":"The unique name of this type of error"},"title":{"type":"string","title":"Title","description":"The title of this error"},"status":{"type":"integer","title":"HTTP status","description":"The HTTP status code corresponding to this error. Note that HTTP status codes are set on a best-effort basis and may be changed without separate notice and should not be used in business or UI logic to identify errors - use the `name` property for that."},"message":{"type":"string","title":"Message","description":"A human-readable message related to this specific occurence of the error, which in some cases may be useful to show directly to a client"},"instance":{"type":"string","title":"Instance","description":"The HTTP method and path of the request where the error originated from"},"type":{"format":"url","type":"string","title":"Type","description":"A url to further documentation for this type of error"},"details":{"type":"object","title":"Details","description":"An optional object of additional details related to the error (for debugging purposes). The structure of this object can vary and should not be used for any busines or UI logic (e.g. showing an error message to a user - use the `message` property for that)."}},"type":"object","required":["name","title","status","message","instance","type"],"title":"Validation error","description":"Invalid data was submitted and request validation failed","example":{"name":"ValidationError","title":"Validation error","status":400,"message":"Request validation failed","instance":"GET /some/path","type":"https://url-to-docs.com/details-about-this-error","details":{"validationErrors":["Product name must be at least 5 characters long"]}}},"UnauthorizedError":{"properties":{"name":{"type":"string","title":"Name","description":"The unique name of this type of error"},"title":{"type":"string","title":"Title","description":"The title of this error"},"status":{"type":"integer","title":"HTTP status","description":"The HTTP status code corresponding to this error. Note that HTTP status codes are set on a best-effort basis and may be changed without separate notice and should not be used in business or UI logic to identify errors - use the `name` property for that."},"message":{"type":"string","title":"Message","description":"A human-readable message related to this specific occurence of the error, which in some cases may be useful to show directly to a client"},"instance":{"type":"string","title":"Instance","description":"The HTTP method and path of the request where the error originated from"},"type":{"format":"url","type":"string","title":"Type","description":"A url to further documentation for this type of error"},"details":{"type":"object","title":"Details","description":"An optional object of additional details related to the error (for debugging purposes). The structure of this object can vary and should not be used for any busines or UI logic (e.g. showing an error message to a user - use the `message` property for that)."}},"type":"object","required":["name","title","status","message","instance","type"],"title":"Unauthorized error","description":"You were not authorized to request a given resource","example":{"name":"UnauthorizedError","title":"Unauthorized error","status":401,"message":"You are not authorized to request this resource","instance":"GET /some/path","type":"https://url-to-docs.com/details-about-this-error"}},"AuthorizationMissingError":{"properties":{"name":{"type":"string","title":"Name","description":"The unique name of this type of error"},"title":{"type":"string","title":"Title","description":"The title of this error"},"status":{"type":"integer","title":"HTTP status","description":"The HTTP status code corresponding to this error. Note that HTTP status codes are set on a best-effort basis and may be changed without separate notice and should not be used in business or UI logic to identify errors - use the `name` property for that."},"message":{"type":"string","title":"Message","description":"A human-readable message related to this specific occurence of the error, which in some cases may be useful to show directly to a client"},"instance":{"type":"string","title":"Instance","description":"The HTTP method and path of the request where the error originated from"},"type":{"format":"url","type":"string","title":"Type","description":"A url to further documentation for this type of error"},"details":{"type":"object","title":"Details","description":"An optional object of additional details related to the error (for debugging purposes). The structure of this object can vary and should not be used for any busines or UI logic (e.g. showing an error message to a user - use the `message` property for that)."}},"type":"object","required":["name","title","status","message","instance","type"],"title":"Authorization missing error","description":"The request did not include an Authorization header","example":{"name":"AuthorizationMissingError","title":"Authorization missing error","status":401,"message":"The request did not include an Authorization header, or it was of the wrong type","instance":"GET /some/path","type":"https://url-to-docs.com/details-about-this-error"}},"ApiKeyNotFoundError":{"properties":{"name":{"type":"string","title":"Name","description":"The unique name of this type of error"},"title":{"type":"string","title":"Title","description":"The title of this error"},"status":{"type":"integer","title":"HTTP status","description":"The HTTP status code corresponding to this error. Note that HTTP status codes are set on a best-effort basis and may be changed without separate notice and should not be used in business or UI logic to identify errors - use the `name` property for that."},"message":{"type":"string","title":"Message","description":"A human-readable message related to this specific occurence of the error, which in some cases may be useful to show directly to a client"},"instance":{"type":"string","title":"Instance","description":"The HTTP method and path of the request where the error originated from"},"type":{"format":"url","type":"string","title":"Type","description":"A url to further documentation for this type of error"},"details":{"type":"object","title":"Details","description":"An optional object of additional details related to the error (for debugging purposes). The structure of this object can vary and should not be used for any busines or UI logic (e.g. showing an error message to a user - use the `message` property for that)."}},"type":"object","required":["name","title","status","message","instance","type"],"title":"API key not found error","description":"An API key corresponding to the provided details does not exist","example":{"name":"ApiKeyNotFoundError","title":"API key not found error","status":401,"message":"The API key details provided with the request do not correspond to an active API key","instance":"GET /some/path","type":"https://url-to-docs.com/details-about-this-error"}},"AccessDeniedError":{"properties":{"name":{"type":"string","title":"Name","description":"The unique name of this type of error"},"title":{"type":"string","title":"Title","description":"The title of this error"},"status":{"type":"integer","title":"HTTP status","description":"The HTTP status code corresponding to this error. Note that HTTP status codes are set on a best-effort basis and may be changed without separate notice and should not be used in business or UI logic to identify errors - use the `name` property for that."},"message":{"type":"string","title":"Message","description":"A human-readable message related to this specific occurence of the error, which in some cases may be useful to show directly to a client"},"instance":{"type":"string","title":"Instance","description":"The HTTP method and path of the request where the error originated from"},"type":{"format":"url","type":"string","title":"Type","description":"A url to further documentation for this type of error"},"details":{"type":"object","title":"Details","description":"An optional object of additional details related to the error (for debugging purposes). The structure of this object can vary and should not be used for any busines or UI logic (e.g. showing an error message to a user - use the `message` property for that)."}},"type":"object","required":["name","title","status","message","instance","type"],"title":"Access denied error","description":"The provided API key does not have access to a requested resource","example":{"name":"AccessDeniedError","title":"Access denied error","status":401,"message":"The API key provided does not have the required scope read:products","instance":"GET /some/path","type":"https://url-to-docs.com/details-about-this-error"}},"NotFoundError":{"properties":{"name":{"type":"string","title":"Name","description":"The unique name of this type of error"},"title":{"type":"string","title":"Title","description":"The title of this error"},"status":{"type":"integer","title":"HTTP status","description":"The HTTP status code corresponding to this error. Note that HTTP status codes are set on a best-effort basis and may be changed without separate notice and should not be used in business or UI logic to identify errors - use the `name` property for that."},"message":{"type":"string","title":"Message","description":"A human-readable message related to this specific occurence of the error, which in some cases may be useful to show directly to a client"},"instance":{"type":"string","title":"Instance","description":"The HTTP method and path of the request where the error originated from"},"type":{"format":"url","type":"string","title":"Type","description":"A url to further documentation for this type of error"},"details":{"type":"object","title":"Details","description":"An optional object of additional details related to the error (for debugging purposes). The structure of this object can vary and should not be used for any busines or UI logic (e.g. showing an error message to a user - use the `message` property for that)."}},"type":"object","required":["name","title","status","message","instance","type"],"title":"Not found error","description":"A requested resource was not found","example":{"name":"NotFoundError","title":"Not found error","status":404,"message":"A something with the id xxx was not found","instance":"GET /some/path","type":"https://url-to-docs.com/details-about-this-error"}},"RouteNotFoundError":{"properties":{"name":{"type":"string","title":"Name","description":"The unique name of this type of error"},"title":{"type":"string","title":"Title","description":"The title of this error"},"status":{"type":"integer","title":"HTTP status","description":"The HTTP status code corresponding to this error. Note that HTTP status codes are set on a best-effort basis and may be changed without separate notice and should not be used in business or UI logic to identify errors - use the `name` property for that."},"message":{"type":"string","title":"Message","description":"A human-readable message related to this specific occurence of the error, which in some cases may be useful to show directly to a client"},"instance":{"type":"string","title":"Instance","description":"The HTTP method and path of the request where the error originated from"},"type":{"format":"url","type":"string","title":"Type","description":"A url to further documentation for this type of error"},"details":{"type":"object","title":"Details","description":"An optional object of additional details related to the error (for debugging purposes). The structure of this object can vary and should not be used for any busines or UI logic (e.g. showing an error message to a user - use the `message` property for that)."}},"type":"object","required":["name","title","status","message","instance","type"],"title":"Route not found error","description":"A route at the requested path does not exist","example":{"name":"RouteNotFoundError","title":"Route not found error","status":404,"message":"Route at GET /foo/bar does not exist","instance":"GET /some/path","type":"https://url-to-docs.com/details-about-this-error"}},"ProductNotFoundError":{"properties":{"name":{"type":"string","title":"Name","description":"The unique name of this type of error"},"title":{"type":"string","title":"Title","description":"The title of this error"},"status":{"type":"integer","title":"HTTP status","description":"The HTTP status code corresponding to this error. Note that HTTP status codes are set on a best-effort basis and may be changed without separate notice and should not be used in business or UI logic to identify errors - use the `name` property for that."},"message":{"type":"string","title":"Message","description":"A human-readable message related to this specific occurence of the error, which in some cases may be useful to show directly to a client"},"instance":{"type":"string","title":"Instance","description":"The HTTP method and path of the request where the error originated from"},"type":{"format":"url","type":"string","title":"Type","description":"A url to further documentation for this type of error"},"details":{"type":"object","title":"Details","description":"An optional object of additional details related to the error (for debugging purposes). The structure of this object can vary and should not be used for any busines or UI logic (e.g. showing an error message to a user - use the `message` property for that)."}},"type":"object","required":["name","title","status","message","instance","type"],"title":"Product not found error","description":"A requested product id does not exist","example":{"name":"ProductNotFoundError","title":"Product not found error","status":404,"message":"A product with the id 123 does not exist","instance":"GET /some/path","type":"https://url-to-docs.com/details-about-this-error"}},"ShopNotFoundError":{"properties":{"name":{"type":"string","title":"Name","description":"The unique name of this type of error"},"title":{"type":"string","title":"Title","description":"The title of this error"},"status":{"type":"integer","title":"HTTP status","description":"The HTTP status code corresponding to this error. Note that HTTP status codes are set on a best-effort basis and may be changed without separate notice and should not be used in business or UI logic to identify errors - use the `name` property for that."},"message":{"type":"string","title":"Message","description":"A human-readable message related to this specific occurence of the error, which in some cases may be useful to show directly to a client"},"instance":{"type":"string","title":"Instance","description":"The HTTP method and path of the request where the error originated from"},"type":{"format":"url","type":"string","title":"Type","description":"A url to further documentation for this type of error"},"details":{"type":"object","title":"Details","description":"An optional object of additional details related to the error (for debugging purposes). The structure of this object can vary and should not be used for any busines or UI logic (e.g. showing an error message to a user - use the `message` property for that)."}},"type":"object","required":["name","title","status","message","instance","type"],"title":"Shop not found error","description":"A requested shop id does not exist","example":{"name":"ShopNotFoundError","title":"Shop not found error","status":404,"message":"A shop with the id 123 does not exist","instance":"GET /some/path","type":"https://url-to-docs.com/details-about-this-error"}},"OrderNotFoundError":{"properties":{"name":{"type":"string","title":"Name","description":"The unique name of this type of error"},"title":{"type":"string","title":"Title","description":"The title of this error"},"status":{"type":"integer","title":"HTTP status","description":"The HTTP status code corresponding to this error. Note that HTTP status codes are set on a best-effort basis and may be changed without separate notice and should not be used in business or UI logic to identify errors - use the `name` property for that."},"message":{"type":"string","title":"Message","description":"A human-readable message related to this specific occurence of the error, which in some cases may be useful to show directly to a client"},"instance":{"type":"string","title":"Instance","description":"The HTTP method and path of the request where the error originated from"},"type":{"format":"url","type":"string","title":"Type","description":"A url to further documentation for this type of error"},"details":{"type":"object","title":"Details","description":"An optional object of additional details related to the error (for debugging purposes). The structure of this object can vary and should not be used for any busines or UI logic (e.g. showing an error message to a user - use the `message` property for that)."}},"type":"object","required":["name","title","status","message","instance","type"],"title":"Order not found error","description":"A requested order id does not exist","example":{"name":"OrderNotFoundError","title":"Order not found error","status":404,"message":"An order with the id 123 does not exist","instance":"GET /some/path","type":"https://url-to-docs.com/details-about-this-error"}},"RateLimitExceededError":{"properties":{"name":{"type":"string","title":"Name","description":"The unique name of this type of error"},"title":{"type":"string","title":"Title","description":"The title of this error"},"status":{"type":"integer","title":"HTTP status","description":"The HTTP status code corresponding to this error. Note that HTTP status codes are set on a best-effort basis and may be changed without separate notice and should not be used in business or UI logic to identify errors - use the `name` property for that."},"message":{"type":"string","title":"Message","description":"A human-readable message related to this specific occurence of the error, which in some cases may be useful to show directly to a client"},"instance":{"type":"string","title":"Instance","description":"The HTTP method and path of the request where the error originated from"},"type":{"format":"url","type":"string","title":"Type","description":"A url to further documentation for this type of error"},"details":{"type":"object","title":"Details","description":"An optional object of additional details related to the error (for debugging purposes). The structure of this object can vary and should not be used for any busines or UI logic (e.g. showing an error message to a user - use the `message` property for that)."}},"type":"object","required":["name","title","status","message","instance","type"],"title":"Rate limit exceeded error","description":"Your API key has made an amount of calls that exceeds the rate limit for your current plan","example":{"name":"RateLimitExceededError","title":"Rate limit exceeded error","status":429,"message":"Your API key has exceeded the rate limit. Please wait a moment before making new requests.","instance":"GET /some/path","type":"https://url-to-docs.com/details-about-this-error"}},"InternalServerError":{"properties":{"name":{"type":"string","title":"Name","description":"The unique name of this type of error"},"title":{"type":"string","title":"Title","description":"The title of this error"},"status":{"type":"integer","title":"HTTP status","description":"The HTTP status code corresponding to this error. Note that HTTP status codes are set on a best-effort basis and may be changed without separate notice and should not be used in business or UI logic to identify errors - use the `name` property for that."},"message":{"type":"string","title":"Message","description":"A human-readable message related to this specific occurence of the error, which in some cases may be useful to show directly to a client"},"instance":{"type":"string","title":"Instance","description":"The HTTP method and path of the request where the error originated from"},"type":{"format":"url","type":"string","title":"Type","description":"A url to further documentation for this type of error"},"details":{"type":"object","title":"Details","description":"An optional object of additional details related to the error (for debugging purposes). The structure of this object can vary and should not be used for any busines or UI logic (e.g. showing an error message to a user - use the `message` property for that)."}},"type":"object","required":["name","title","status","message","instance","type"],"title":"Internal server error","description":"An unexpected internal error which occurred while processing a request","example":{"name":"InternalServerError","title":"Internal server error","status":500,"message":"An internal server error occured","instance":"GET /some/path","type":"https://url-to-docs.com/details-about-this-error"}},"SuccessResponse":{"properties":{"status":{"type":"string","enum":["success"],"title":"Status","description":"The status of the response, always equal to \"success\" for successful responses"},"data":{"title":"Data","description":"The payload of the response, if any"}},"type":"object","required":["status"],"title":"Successful response (2xx)","description":"Response format for successful calls to the api","example":{"status":"success","data":{"some":"data","that":"was requested"}}},"FailedResponse":{"properties":{"status":{"type":"string","enum":["failed"],"title":"Status","description":"The status of the response, always equal to \"failed\" for failed responses"},"data":{"not":{"type":"null"},"title":"Data","description":"Details of the error","allOf":[{"$ref":"#/components/schemas/ApiError"}]}},"type":"object","required":["status","data"],"title":"Failed response (4xx)","description":"Response format when a call to the api fails due to some pre-condition not being met"},"ErrorResponse":{"properties":{"status":{"type":"string","enum":["error"],"title":"Status","description":"The status of the response, always equal to \"error\" for erroneous responses"},"data":{"not":{"type":"null"},"title":"Data","description":"Details of the error","allOf":[{"$ref":"#/components/schemas/ApiError"}]}},"type":"object","required":["status","data"],"title":"Error response (5xx)","description":"Response format when a call to the api fails with an unexpected error"},"ProductsQuery":{"properties":{"categories":{"items":{"type":"string"},"type":"array","title":"Categories","description":"An array of category IDs to filter by (returned products are in at least one of the provided categories)"},"channels":{"items":{"type":"string","enum":["ADMIN","STORE","ONLINE","PAYLINK","CONSUMER","API","WIX"]},"type":"array","title":"Sales channels","description":"An array of sales channels to filter by (returned products are visible in at least one of the provided channels)"}},"type":"object","title":"Product query parameters","description":"Query parameters that can be used to filter product results","example":{"categories":["LmA2x9W710xU4RtQwKnk"],"channels":["ADMIN"]}},"Duration":{"properties":{"timePeriod":{"type":"string","enum":["hours","days","weeks","days_within_opening_hours","24h_days"],"title":"Time period","description":"The type of time period to use","example":"hours"},"timeValue":{"type":"integer","title":"Time value","description":"The amount of the given time period","example":3}},"type":"object","required":["timePeriod","timeValue"],"title":"Duration","description":"An object representing a duration of time","example":{"timePeriod":"hours","timeValue":1}},"CreateOrderProductParams":{"properties":{"productId":{"type":"string","title":"Product ID","description":"The ID of the product"},"variantId":{"type":"string","title":"Variant ID","description":"The ID of the selected product variant, if the product has variants"},"childVariantIds":{"items":{"type":"string"},"type":"array","title":"Child variant IDs","description":"If this is a package product, the variants of the child products to select"},"customDuration":{"title":"Duration","description":"If different from the duration of the rental, the duration of the rental for this product","allOf":[{"$ref":"#/components/schemas/Duration"}]},"discount":{"type":"integer","title":"Discount","description":"A discount amount (not percentage) for this product, if desired. Defaults to 0."}},"type":"object","required":["productId"],"title":"Order creation product parameters","description":"Parameters for a single product, included in an order created via the API","example":{"productId":"dQCmhQvcUgXwUROSsXGC","variantId":"65VvWdFnXrHl6uchiBfS","customDuration":{"timePeriod":"hours","timeValue":1},"discount":0}},"UserProperty":{"properties":{"property":{"type":"string","enum":["height","weight","shoeSize","experienceLevel","age"],"title":"Property","description":"The property to set"},"value":{"type":"string","title":"Value","description":"The value of the given property"},"unit":{"type":"string","enum":["kg","cm","EU"],"title":"Unit","description":"The unit of the value, if applicable"}},"type":"object","required":["property","value"],"title":"User property","description":"A property of a given user, such as height or weight","example":{"property":"height","value":"180","unit":"cm"}},"Shopper":{"properties":{"firstName":{"type":"string","title":"First name","description":"The first name of the shopper"},"lastName":{"type":"string","title":"Last name","description":"The last name of the shopper"},"phone":{"type":"string","title":"Phone number","description":"The phone number of the shopper, international format"},"email":{"type":"string","title":"Email address","description":"The email address of the shopper"},"marketing":{"type":"boolean","title":"Marketing consent","description":"Whether this shopper has consented to being added to the marketing list"},"language":{"type":"string","enum":["fi","en","ru","de","sk","sv","nl","hu","no","fr","es","it","cs","da","lt","et","pl","sl","hr","br","pt","lv","tr","uk"],"title":"Language","description":"The preferred language of this shopper"}},"type":"object","required":["firstName","lastName"],"title":"Shopper","description":"An object representing a single shopper","example":{"firstName":"Sam","lastName":"Smith","phone":"123-456-7777","email":"sam@example.com","marketing":true,"language":"en"}},"ResponsibleShopper":{"properties":{"firstName":{"type":"string","title":"First name","description":"The first name of the shopper"},"lastName":{"type":"string","title":"Last name","description":"The last name of the shopper"},"phone":{"type":"string","title":"Phone number","description":"The phone number of the shopper, international format"},"email":{"type":"string","title":"Email address","description":"The email address of the shopper"},"marketing":{"type":"boolean","title":"Marketing consent","description":"Whether this shopper has consented to being added to the marketing list"},"language":{"type":"string","enum":["fi","en","ru","de","sk","sv","nl","hu","no","fr","es","it","cs","da","lt","et","pl","sl","hr","br","pt","lv","tr","uk"],"title":"Language","description":"The preferred language of this shopper"}},"type":"object","required":["firstName","lastName","phone","email"],"title":"Responsible shopper","description":"An object representing a shopper responsible for a given order","example":{"firstName":"Sam","lastName":"Smith","phone":"123-456-7777","email":"sam@example.com","marketing":true,"language":"en"}},"CreateOrderShopperParams":{"properties":{"firstName":{"type":"string","title":"First name","description":"The first name of the shopper"},"lastName":{"type":"string","title":"Last name","description":"The last name of the shopper"},"phone":{"type":"string","title":"Phone number","description":"The phone number of the shopper"},"email":{"type":"string","title":"Email address","description":"The email address of the shopper"},"marketing":{"type":"boolean","title":"Marketing consent","description":"Whether this shopper has consented to being added to the marketing list"},"language":{"type":"string","enum":["fi","en","ru","de","sk","sv","nl","hu","no","fr","es","it","cs","da","lt","et","pl","sl","hr","br","pt","lv","tr","uk"],"title":"Language","description":"The preferred language of this shopper"},"additionalInformation":{"type":"string","title":"Additional info","description":"Additional information to attach to the shopper as a comment"},"userProperties":{"items":{"allOf":[{"$ref":"#/components/schemas/UserProperty"}]},"type":"array","title":"User properties","description":"Details of the shopper, such as height/weight, which are needed for the rental"},"products":{"items":{"allOf":[{"$ref":"#/components/schemas/CreateOrderProductParams"}]},"minItems":1,"type":"array","not":{"type":"null"},"title":"Products","description":"The rental products for this shopper"}},"type":"object","required":["firstName","lastName","products"],"title":"Order creation shopper parameters","description":"Parameters for a single shopper for an order created via the API","example":{"firstName":"Sam","lastName":"Smith","phone":"123-456-7777","email":"sam@example.com","marketing":false,"language":"en","additionalInformation":"","userProperties":[{"property":"height","value":"180","unit":"cm"}],"products":[{"productId":"d7xZBEeNDcNy8rYRGI4L","variantId":"uvAx2Mp3bAvb7UzFirPM","customDuration":{"timePeriod":"hours","timeValue":1},"discount":0}]}},"CreateOrderParams":{"properties":{"startDate":{"oneOf":[{"format":"date","type":"string"},{"format":"date-time","type":"string"}],"title":"Start date","description":"The start date and time of this rental, as a valid ISO8601 date. Defaults to the current date and time."},"rentalDuration":{"not":{"type":"null"},"title":"Duration","description":"The duration of the rental","allOf":[{"$ref":"#/components/schemas/Duration"}]},"startLocation":{"type":"string","title":"Start location","description":"The start location of this rental (location ID). Defaults to the shop main location."},"endLocation":{"type":"string","title":"End location","description":"The end location of this rental (location ID). Defaults to the shop main location."},"additionalInformation":{"type":"string","title":"Additional information","description":"Additional information to attach as a comment to the rental"},"paid":{"type":"boolean","title":"Paid","description":"Whether this order should be marked as already paid"},"responsiblePerson":{"title":"Responsible person","description":"Optional separate responsible person for this rental. If not provided, the first item in `shoppers` will be set as the responsible person for this rental.","allOf":[{"$ref":"#/components/schemas/ResponsibleShopper"}]},"shoppers":{"items":{"allOf":[{"$ref":"#/components/schemas/CreateOrderShopperParams"}]},"minItems":1,"type":"array","not":{"type":"null"},"title":"Shoppers","description":"The shoppers included in this rental (and their products). If no separate `responsiblePerson` is provided, the first valid shopper in this array will be set as the responsible person for this rental."}},"type":"object","required":["rentalDuration","shoppers"],"title":"Order creation parameters","description":"Parameters for a single order created via the API","example":{"startDate":"2026-08-29T22:58:14.593Z","rentalDuration":{"timePeriod":"hours","timeValue":1},"paid":false,"shoppers":[{"firstName":"Sam","lastName":"Smith","phone":"123-456-7777","email":"sam@example.com","marketing":false,"language":"en","additionalInformation":"","userProperties":[{"property":"height","value":"180","unit":"cm"}],"products":[{"productId":"Ibt2iV7r0NrbpzKolB3B","variantId":"LoKKsdLxFpjYh5zIXXhw","customDuration":{"timePeriod":"hours","timeValue":1},"discount":0}]}]}},"ApiKeyInfo":{"properties":{"label":{"type":"string","title":"API key label","description":"The human-readable label of this API key"},"keyId":{"type":"string","title":"API key ID","description":"The unique ID of this API key"},"shopId":{"type":"string","title":"Shop ID","description":"The ID of the shop this key is associated with"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes","description":"The access scopes enabled for this key"},"rateLimitUsed":{"type":"number","title":"Rate limit used","description":"How many calls have been made with this key against the rate limit. Please note that this value is periodically decreased."},"rateLimitMax":{"type":"number","title":"Rate limit max","description":"How many calls can be made, in total, before being rate limited."}},"type":"object","required":["label","keyId","shopId","scopes","rateLimitUsed","rateLimitMax"],"title":"API key info","description":"Information about an API key used to make the request","example":{"label":"My API key","keyId":"wnuBoxEIDao8Pkdex3uU","shopId":"mZCkgI4ZeE4vEbqS55K7","scopes":["read:products","create:orders"],"rateLimitUsed":100,"rateLimitMax":1000,"rateLimitRemaining":900}},"ChargeObject":{"properties":{"amount":{"type":"integer","title":"Amount","description":"The total amount to be paid, after discounts, in minor units (e.g. $1 = 100)"},"paid":{"type":"integer","title":"Paid","description":"The amount that has been paid, in minor units (e.g. $1 = 100)"},"currency":{"type":"string","title":"Currency","description":"The 3-letter currency code of the charge"},"discount":{"type":"integer","title":"Discount","description":"The amount of discount that has been applied to the charge (not percentage)"}},"type":"object","required":["amount","paid","currency","discount"],"title":"Charge object","description":"An object representing a charge and its payment status","example":{"amount":1000,"paid":0,"currency":"USD","discount":0}},"DepositObject":{"properties":{"amount":{"type":"integer","title":"Amount","description":"The amount of the deposit, in minor units"},"paid":{"type":"integer","title":"Paid","description":"The amount that has been paid, in minor units"},"reserved":{"type":"integer","title":"Reserved","description":"The amount that has been reserved as an authorisation hold, in minor units"},"currency":{"type":"string","title":"Currency","description":"The currency of the deposit"},"type":{"type":"string","enum":["payment","other","no-deposit"],"title":"Type","description":"The type of deposit"},"additionalInfo":{"type":"string","title":"Additional info","description":"An optional additional comment related to the deposit"}},"type":"object","required":["amount","paid","reserved","currency"],"title":"Deposit object","description":"An object representing a deposit required for a rental","example":{"amount":1000,"paid":0,"reserved":0,"currency":"USD","type":"payment","additionalInfo":""}},"TaxLine":{"properties":{"label":{"title":"Label","description":"The name of the tax","allOf":[{"$ref":"#/components/schemas/LocaleField"}]},"price":{"type":"integer","title":"Price","description":"The amount of the tax"},"rate":{"type":"integer","title":"Rate","description":"The rate of the tax, in decimals"}},"type":"object","required":["price","rate"],"title":"Tax line","description":"Tax line object shows the taxable amount","example":{"label":{"def":"Tax","en":"English translation","fi":"Finnish translation","de":"German translation","ru":"Russian translation","sk":"Slovak translation","nl":"Dutch translation","hu":"Hungarian translation","no":"Norwegian translation","fr":"French translation","es":"Spanish translation","it":"English translation","cs":"Czech translation"},"price":2000,"rate":0.2}},"Pricing":{"properties":{"currency":{"type":"string","title":"Currency","description":"The 3-letter currency code of the charge"},"total":{"type":"integer","title":"Total","description":"The total price, after discounts and applicable taxes, in minor units (e.g. $1 = 100)"},"subtotal":{"type":"integer","title":"Subtotal","description":"Subtotal is price after discounts and before taxes if taxes are excluded, in minor units (e.g. $1 = 100)"},"totalTaxes":{"type":"integer","title":"Total taxes","description":"Total amount of taxes"},"totalDiscounts":{"type":"integer","title":"Total discount","description":"Total amount of discounts"},"taxExcluded":{"type":"boolean","title":"Tax excluded","description":"If taxes are excluded or included in prices"},"deposit":{"type":"integer","title":"Total deposit","description":"Total deposit amount"},"additionalInfo":{"type":"string","title":"Additional info","description":"An optional additional comment related to the pricing"}},"type":"object","required":["currency","total","subtotal","totalTaxes","totalDiscounts","taxExcluded","deposit"],"title":"Item pricing","description":"An object representing pricing information of single order item","example":{"currency":"USD","total":10000,"subtotal":8000,"totalTaxes":2000,"totalDiscounts":0,"taxExcluded":true,"taxLines":[{"label":{"def":"Tax"},"price":2000,"rate":0.2}]}},"OrderInfo":{"properties":{"id":{"type":"string","title":"Order ID","description":"The unique ID of the order"},"orderNumber":{"type":"integer","title":"Order number","description":"The number of this order"},"shopId":{"type":"string","title":"Shop ID","description":"The ID of the shop this order belongs to"},"status":{"type":"string","enum":["RENT_INIT","PAYLINK_SENT","PAYLINK_OPEN","PAYLINK_PAID","PAYLINK_CONFIRMED","ADMIN_BOOKED","API_BOOKED","STORE_BOOKED","ONLINE_BOOKED","RENT_OUT","RENT_ENDED","RENT_CANCEL"],"title":"Order status","description":"The status of the order"},"created":{"oneOf":[{"format":"date","type":"string"},{"format":"date-time","type":"string"}],"title":"Created","description":"When the order was created"},"startDate":{"oneOf":[{"format":"date","type":"string"},{"format":"date-time","type":"string"}],"title":"Start date","description":"The start date of the rental"},"endDate":{"oneOf":[{"format":"date","type":"string"},{"format":"date-time","type":"string"}],"title":"End date","description":"The end date of the rental"},"initialStartDate":{"oneOf":[{"format":"date","type":"string"},{"format":"date-time","type":"string"}],"title":"Initial start date","description":"The initial start date of the rental, if it has been changed after creation."},"returnTimeNext":{"oneOf":[{"format":"date","type":"string"},{"format":"date-time","type":"string"}],"title":"Next return time","description":"If products within the order have different return times, the next return time."},"endDateReturned":{"oneOf":[{"format":"date","type":"string"},{"format":"date-time","type":"string"}],"title":"Returned end date","description":"The date when the entire order has been returned, or null if it has not"},"charge":{"not":{"type":"null"},"title":"Charge","description":"The total charges of the order","allOf":[{"$ref":"#/components/schemas/ChargeObject"}]},"deposit":{"not":{"type":"null"},"title":"Deposit","description":"The total deposit for the order","allOf":[{"$ref":"#/components/schemas/DepositObject"}]},"channel":{"type":"string","enum":["ADMIN","STORE","ONLINE","PAYLINK","CONSUMER","API","WIX"],"title":"Channel","description":"The sales channel where this order was created"},"rentalState":{"type":"string","enum":["INIT","BOOKED","ACTIVE","COMPLETED"],"title":"Rental state","description":"The state of this rental"},"startLocation":{"not":{"type":"null"},"title":"Start location","description":"The start location of the rental","allOf":[{"$ref":"#/components/schemas/ShopLocation"}]},"endLocation":{"not":{"type":"null"},"title":"End location","description":"The end location of the rental","allOf":[{"$ref":"#/components/schemas/ShopLocation"}]},"responsiblePerson":{"not":{"type":"null"},"title":"Responsible person","description":"The shopper responsible for this rental","allOf":[{"$ref":"#/components/schemas/Shopper"}]},"termsAccepted":{"type":"boolean","title":"Terms accepted","description":"Whether the customer has accepted the terms for this rental"},"additionalInformation":{"type":"string","title":"Additional information","description":"Additional comments related to the rental"},"shopperNames":{"items":{"type":"string"},"type":"array","title":"Shopper names","description":"An array of the full shopper names included in this rental"},"shopperNameKeywords":{"items":{"type":"string"},"type":"array","title":"Shopper name keywords","description":"An array of keywords generated from shopper names, which can be useful for search functions"},"categoryIds":{"items":{"type":"string"},"type":"array","title":"Category IDs","description":"An array of product category IDs included in this rental"},"productIds":{"items":{"type":"string"},"type":"array","title":"Product IDs","description":"An array of product IDs included in this rental"},"pricing":{"not":{"type":"null"},"title":"Pricing","description":"Pricing details of this rental"}},"type":"object","required":["id","shopId","status","created","startDate","charge","deposit","channel","rentalState","startLocation","endLocation","responsiblePerson","termsAccepted","shopperNames","shopperNameKeywords","categoryIds","productIds","pricing"],"title":"Order info","description":"General information about the order","example":{"id":"eVKvpeVDe7qHO3NsBbHb","orderNumber":1,"shopId":"jXvyLMkwhJOyqO4E3SzY","status":"ADMIN_BOOKED","created":"2026-08-29T22:58:14.596Z","startDate":"2026-08-29T22:58:14.596Z","endDate":"2026-08-29T22:58:14.596Z","returnTimeNext":"2026-08-29T22:58:14.596Z","endDateReturned":"2026-08-29T22:58:14.596Z","charge":{"amount":1000,"paid":0,"currency":"USD","discount":0},"deposit":{"amount":1000,"paid":0,"reserved":0,"currency":"USD","type":"payment","additionalInfo":""},"channel":"ADMIN","rentalState":"BOOKED","startLocation":{"id":"UKyTqEBQfgbpAm20N8WL","name":"A rental shop location","description":{"def":"Our 24h kiosk in Brooklyn","en":"English translation","fi":"Finnish translation","de":"German translation","ru":"Russian translation","sk":"Slovak translation","nl":"Dutch translation","hu":"Hungarian translation","no":"Norwegian translation","fr":"French translation","es":"Spanish translation","it":"English translation","cs":"Czech translation"},"address":"101 Brooklyn St.","city":"New York","zipCode":"10011","state":"New York","country":"United States"},"endLocation":{"id":"bd3c5nSJbU5l4w83TBA7","name":"A rental shop location","description":{"def":"Our 24h kiosk in Brooklyn","en":"English translation","fi":"Finnish translation","de":"German translation","ru":"Russian translation","sk":"Slovak translation","nl":"Dutch translation","hu":"Hungarian translation","no":"Norwegian translation","fr":"French translation","es":"Spanish translation","it":"English translation","cs":"Czech translation"},"address":"101 Brooklyn St.","city":"New York","zipCode":"10011","state":"New York","country":"United States"},"responsiblePerson":{"firstName":"Sam","lastName":"Smith","phone":"123-456-7777","email":"sam@example.com","marketing":true,"language":"en"},"termsAccepted":false,"additionalInformation":"A comment related to the order","shopperNames":["John Doe","Jane Doe"],"shopperNameKeywords":["john","jane","doe"],"categoryIds":["V4yDPcyyrYAkQAx1iDt6","kfyW0euxk7Ge3ef0ERWZ","d599sr6YzUWp40SgSq3h"],"productIds":["eq68zJaTX4DgdCbHaxoK","qzohHBpriSytdmFfNjav"],"pricing":{"currency":"USD","total":10000,"subtotal":8000,"totalTaxes":2000,"totalDiscounts":0,"taxExcluded":true,"taxLines":[{"label":{"def":"Tax"},"price":2000,"rate":0.2}]}}},"OrderProduct":{"properties":{"id":{"type":"string","title":"ID","description":"The ID of this specific rental of the product (not the ID of the product itself)"},"productId":{"type":"string","title":"Product ID","description":"The ID of the product that was rented"},"productIds":{"items":{"type":"string"},"type":"array","title":"Product IDs","description":"All of the IDs included when renting this product - if it is a package product, this will include the product itself as well as all of the packaged products"},"shopId":{"type":"string","title":"Shop ID","description":"The ID of the shop this product belongs to"},"variantId":{"type":"string","title":"Variant ID","description":"The ID of the selected variant"},"variantName":{"type":"string","title":"Variant name","description":"The name of the selected variant"},"shopperId":{"type":"string","title":"Shopper ID","description":"The ID of the shopper this product was rented by"},"rentalId":{"type":"string","title":"Rental ID","description":"The ID of the rental this product belongs to"},"stockId":{"type":"string","title":"Stock item ID","description":"The ID of the specific stock item of this product, if defined"},"created":{"oneOf":[{"format":"date","type":"string"},{"format":"date-time","type":"string"}],"title":"Created","description":"The date when this specific rental was created (not the date when the product was created)"},"name":{"not":{"type":"null"},"title":"Name","description":"The name of this product","allOf":[{"$ref":"#/components/schemas/LocaleField"}]},"isPackage":{"type":"boolean","title":"Is package product","description":"Whether this is a package product or not"},"vatPercentage":{"type":"number","title":"VAT percentage","description":"The VAT percentage of this product"},"startDate":{"oneOf":[{"format":"date","type":"string"},{"format":"date-time","type":"string"}],"title":"Start date","description":"The start date of the rental for this product. Most likely the same as the rental start date."},"endDate":{"oneOf":[{"format":"date","type":"string"},{"format":"date-time","type":"string"}],"title":"End date","description":"The end date of the rental for this product. Most likely the same as the rental end date."},"startLocationId":{"type":"string","title":"Start location ID","description":"The ID of the start location for this product. Most likely the same as the rental start location."},"endLocationId":{"type":"string","title":"End location ID","description":"The ID of the end location for this product. Most likely the same as the rental end location."},"charge":{"not":{"type":"null"},"title":"Charge","description":"The charge for this product","allOf":[{"$ref":"#/components/schemas/ChargeObject"}]},"deposit":{"not":{"type":"null"},"title":"Deposit","description":"The deposit for this product","allOf":[{"$ref":"#/components/schemas/DepositObject"}]}},"type":"object","required":["id","productId","productIds","shopId","shopperId","rentalId","created","name","isPackage","vatPercentage","startDate","endDate","startLocationId","endLocationId","charge","deposit"],"title":"Order product","description":"A single product within an order","example":{"id":"vUjA90AxnHIYOvQ2XSxC","productId":"hdmzE87mFvEPOeFXBZNk","productIds":["tlbOdgGcmAphJaxSQ9pj","TAtSpSzSRKVv1vY3LH3U"],"shopId":"jXory8mR3gYBpNHMCF37","variantId":"bW9jJRYcw5OifEk8GgTy","variantName":"Blue, Extra-large","shopperId":"oduRpX8Wr5NK5VzXuAqU","rentalId":"tYn3gJ8w4QYxvTN9UIjA","stockId":"ABC123","created":"2026-08-29T22:58:14.597Z","name":{"def":"Road bicycle","en":"English translation","fi":"Finnish translation","de":"German translation","ru":"Russian translation","sk":"Slovak translation","nl":"Dutch translation","hu":"Hungarian translation","no":"Norwegian translation","fr":"French translation","es":"Spanish translation","it":"English translation","cs":"Czech translation"},"isPackage":false,"vatPercentage":10,"startDate":"2026-08-29T22:58:14.597Z","endDate":"2026-08-29T22:58:14.597Z","startLocationId":"oJ5JYrCGcUtgotUnv201","endLocationId":"iN15adOTqOifltm5Wua3","charge":{"amount":1000,"paid":0,"currency":"USD","discount":0},"deposit":{"amount":1000,"paid":0,"reserved":0,"currency":"USD","type":"payment","additionalInfo":""}}},"OrderShopper":{"properties":{"id":{"type":"string","title":"ID","description":"The unique ID of this shopper"},"shopId":{"type":"string","title":"Shop ID","description":"The shop ID this shopper belongs to"},"created":{"oneOf":[{"format":"date","type":"string"},{"format":"date-time","type":"string"}],"title":"Created","description":"When this shopper was created"},"firstName":{"type":"string","title":"First name","description":"The first name(s) of this shopper"},"lastName":{"type":"string","title":"Last name","description":"The family name of this shopper"},"phone":{"type":"string","title":"Phone number","description":"The phone number of this shopper, in international format"},"email":{"type":"string","title":"Email","description":"The email address of this shopper"},"marketing":{"type":"boolean","title":"Marketing consent","description":"Whether this shopper has consented to marketing"},"additionalInfo":{"type":"string","title":"Additional information","description":"Additional comments related to this shopper"},"categoryIds":{"items":{"type":"string"},"type":"array","title":"Category IDs","description":"An array of product category IDs from the products this shopper has"},"products":{"not":{"type":"null"},"title":"Products","description":"The products for this shopper","allOf":[{"$ref":"#/components/schemas/OrderProduct"}]}},"type":"object","required":["id","shopId","created","firstName","lastName","marketing","categoryIds","products"],"title":"Order shopper","description":"A single shopper within an order","example":{"id":"gnadMORouicyykFYCwDt","shopId":"lM0XLVSkmCtWEGCfxSiX","rentalId":"xZEvgMkbbmt1Gm4riF9a","created":"2026-08-29T22:58:14.598Z","firstName":"Sam","lastName":"Smith","phone":"123-456-7777","email":"sam@example.com","marketing":false,"additionalInfo":"A comment related to the shopper","categoryIds":["azN50EYocefQ3ktXmMYS"],"products":[{"id":"lsIRziX3tcvEXC6phYQK","productId":"XHJDNzFRZeXiQuS88SKM","productIds":["3xy26hSWcssD8k1qcknb","tXYwJwsaL58ftaJz4sg9"],"shopId":"2KiFQ0ctugeufHhMt0Em","variantId":"1e5JZDMlfjIRbUcHR5mt","variantName":"Blue, Extra-large","shopperId":"tHbePRfV8BtSt4UMYRrE","rentalId":"j260ZGmPDaEc1hvjZqGn","stockId":"ABC123","created":"2026-08-29T22:58:14.598Z","name":{"def":"Road bicycle","en":"English translation","fi":"Finnish translation","de":"German translation","ru":"Russian translation","sk":"Slovak translation","nl":"Dutch translation","hu":"Hungarian translation","no":"Norwegian translation","fr":"French translation","es":"Spanish translation","it":"English translation","cs":"Czech translation"},"isPackage":false,"vatPercentage":10,"startDate":"2026-08-29T22:58:14.598Z","endDate":"2026-08-29T22:58:14.598Z","startLocationId":"IBXUOVhnyGzVFcOXYuwe","endLocationId":"ZpvRkGIDdZIN8IKfzu9V","charge":{"amount":1000,"paid":0,"currency":"USD","discount":0},"deposit":{"amount":1000,"paid":0,"reserved":0,"currency":"USD","type":"payment","additionalInfo":""}}]}},"Address":{"properties":{"address":{"type":"string","title":"Address","description":"The address line of the shop location"},"city":{"type":"string","title":"City","description":"The city where this location is located"},"zipCode":{"type":"string","title":"Zip code","description":"The postal code of the shop location"},"state":{"type":"string","title":"State","description":"The state where this location is located"},"country":{"type":"string","title":"Country","description":"The country where this location is located"},"details":{"type":"string","title":"Details","description":"Further details related to the address"}},"type":"object","required":["address"],"title":"Address","description":"Address object","example":{"address":"101 Brooklyn St.","city":"New York","zipCode":"10011","state":"New York","country":"United States","details":"Entrance from building A"}},"DeliveryDetails":{"properties":{"timeslotStart":{"type":"string","title":"Timeslot","description":"The start time of a timeslot"},"timeslotEnd":{"type":"string","title":"Timeslot","description":"The end time of a timeslot"},"timeslotStartUTC":{"type":"string","title":"Timeslot UTC","description":"The start time of a timeslot in UTC"},"timeslotEndUTC":{"type":"string","title":"Timeslot UTC","description":"The end time of a timeslot in UTC"},"handlingTimeMinutes":{"type":"integer","title":"Minutes","description":"Handling time of the delivery/pickup"},"address":{"title":"Address","description":"The delivery/pickup address of the delivery","allOf":[{"$ref":"#/components/schemas/Address"}]}},"type":"object","required":["timeslotStart","timeslotEnd","timeslotStartUTC","timeslotEndUTC","handlingTimeMinutes"],"title":"Delivery details","description":"The details of a order delivery/pickup","example":{"timeslotStart":"10:00","timeslotEnd":"12:00","timeslotStartUTC":"2022-09-13T10:00:00.000Z","timeslotEndUTC":"2022-09-13T12:00:00.000Z","handlingTimeMinutes":300,"address":{"address":"101 Brooklyn St.","city":"New York","zipCode":"10011","state":"New York","country":"United States","details":"Entrance from building A"}}},"OrderDelivery":{"properties":{"id":{"type":"string","title":"ID","description":"The unique ID of this delivery"},"shopId":{"type":"string","title":"Shop ID","description":"The shop ID this delivery belongs to"},"rentalId":{"type":"string","title":"Rental ID","description":"The rental ID this delivery belongs to"},"deliveryOptionId":{"type":"string","title":"Delivery option ID","description":"The ID of the delivery option used for the delivery"},"name":{"type":"string","title":"Delivery option name","description":"The name of the delivery option"},"created":{"oneOf":[{"format":"date","type":"string"},{"format":"date-time","type":"string"}],"title":"Created","description":"When this delivery was created"},"to":{"title":"To","description":"Information about the delivery","allOf":[{"$ref":"#/components/schemas/DeliveryDetails"}]},"from":{"title":"From","description":"Information about the pickup","allOf":[{"$ref":"#/components/schemas/DeliveryDetails"}]}},"type":"object","required":["id","shopId","rentalId","deliveryOptionId","name","created"],"title":"Order delivery","description":"Information about the delivery related to an order","example":{"id":"64BLFFKqXvidPDNwLH6r","shopId":"t9vmvxiXiXxsrxR9RYdC","rentalId":"W5BxUywcpL8fk4PHjQdz","deliveryOptionId":"UwHCkJrW7s1yHSkxyiKJ","name":{"def":"Express delivery","en":"English translation","fi":"Finnish translation","de":"German translation","ru":"Russian translation","sk":"Slovak translation","nl":"Dutch translation","hu":"Hungarian translation","no":"Norwegian translation","fr":"French translation","es":"Spanish translation","it":"English translation","cs":"Czech translation"},"created":"2026-08-29T22:58:14.599Z","to":{"timeslotStart":"10:00","timeslotEnd":"12:00","timeslotStartUTC":"2022-09-13T10:00:00.000Z","timeslotEndUTC":"2022-09-13T12:00:00.000Z","handlingTimeMinutes":300,"address":{"address":"101 Brooklyn St.","city":"New York","zipCode":"10011","state":"New York","country":"United States","details":"Entrance from building A"}},"from":{"timeslotStart":"10:00","timeslotEnd":"12:00","timeslotStartUTC":"2022-09-13T10:00:00.000Z","timeslotEndUTC":"2022-09-13T12:00:00.000Z","handlingTimeMinutes":300,"address":{"address":"101 Brooklyn St.","city":"New York","zipCode":"10011","state":"New York","country":"United States","details":"Entrance from building A"}}}},"Order":{"properties":{"info":{"not":{"type":"null"},"title":"OrderInfo","description":"General information about the order","allOf":[{"$ref":"#/components/schemas/OrderInfo"}]},"shoppers":{"not":{"type":"null"},"items":{"allOf":[{"$ref":"#/components/schemas/OrderShopper"}]},"type":"array","title":"OrderShopper","description":"Shoppers included in the order"},"delivery":{"title":"OrderDelivery","description":"Delivery information related to the order, if existing.","allOf":[{"$ref":"#/components/schemas/OrderDelivery"}]}},"type":"object","required":["info","shoppers"],"title":"Order","description":"An order object","example":{"info":{"id":"op7WyrsLhGUIiXZFr2Rn","orderNumber":1,"shopId":"jZ1ZRmoW4wqAQyeFxM7R","status":"ADMIN_BOOKED","created":"2026-08-29T22:58:14.599Z","startDate":"2026-08-29T22:58:14.599Z","endDate":"2026-08-29T22:58:14.599Z","returnTimeNext":"2026-08-29T22:58:14.599Z","endDateReturned":"2026-08-29T22:58:14.599Z","charge":{"amount":1000,"paid":0,"currency":"USD","discount":0},"deposit":{"amount":1000,"paid":0,"reserved":0,"currency":"USD","type":"payment","additionalInfo":""},"channel":"ADMIN","rentalState":"BOOKED","startLocation":{"id":"wKMRitYPKhFpEZvD0GUN","name":"A rental shop location","description":{"def":"Our 24h kiosk in Brooklyn","en":"English translation","fi":"Finnish translation","de":"German translation","ru":"Russian translation","sk":"Slovak translation","nl":"Dutch translation","hu":"Hungarian translation","no":"Norwegian translation","fr":"French translation","es":"Spanish translation","it":"English translation","cs":"Czech translation"},"address":"101 Brooklyn St.","city":"New York","zipCode":"10011","state":"New York","country":"United States"},"endLocation":{"id":"Co1OceiURXK3ptFOTb8C","name":"A rental shop location","description":{"def":"Our 24h kiosk in Brooklyn","en":"English translation","fi":"Finnish translation","de":"German translation","ru":"Russian translation","sk":"Slovak translation","nl":"Dutch translation","hu":"Hungarian translation","no":"Norwegian translation","fr":"French translation","es":"Spanish translation","it":"English translation","cs":"Czech translation"},"address":"101 Brooklyn St.","city":"New York","zipCode":"10011","state":"New York","country":"United States"},"responsiblePerson":{"firstName":"Sam","lastName":"Smith","phone":"123-456-7777","email":"sam@example.com","marketing":true,"language":"en"},"termsAccepted":false,"additionalInformation":"A comment related to the order","shopperNames":["John Doe","Jane Doe"],"shopperNameKeywords":["john","jane","doe"],"categoryIds":["7dL9HTLpPhXd6yrM8rd9","HXZwomQPjA5GOICuZRhl","47ccex5OKAKyqiKVRlwp"],"productIds":["EoQxBtGPafkloOyP2q0t","fGtdU4c38xrMpVqOqwY4"],"pricing":{"currency":"USD","total":10000,"subtotal":8000,"totalTaxes":2000,"totalDiscounts":0,"taxExcluded":true,"taxLines":[{"label":{"def":"Tax"},"price":2000,"rate":0.2}]}},"shoppers":[{"id":"j7g8PGfYKAUBudrfmYHu","shopId":"r4vEvOfHc7GjkkAKp2vq","rentalId":"5D40mubbrb4nkgsVFbry","created":"2026-08-29T22:58:14.599Z","firstName":"Sam","lastName":"Smith","phone":"123-456-7777","email":"sam@example.com","marketing":false,"additionalInfo":"A comment related to the shopper","categoryIds":["sbuUto1kh1XCljNJmwKo"],"products":[{"id":"9eY0GHSxpccwD4cQeSTl","productId":"uVR91LhBjmfmW1OkV4p4","productIds":["jYZfMsx6Jb5xq12JnbDL","d5Ax1Le6eBovEdGEVruH"],"shopId":"nbxxcc3XuqdOnJJnEp3A","variantId":"Fnd9wuc5CY4tn6aymqxN","variantName":"Blue, Extra-large","shopperId":"ltQR0FqN3FVph7zVlvvc","rentalId":"c9FvCR5Gz4cD3XPXlS1T","stockId":"ABC123","created":"2026-08-29T22:58:14.599Z","name":{"def":"Road bicycle","en":"English translation","fi":"Finnish translation","de":"German translation","ru":"Russian translation","sk":"Slovak translation","nl":"Dutch translation","hu":"Hungarian translation","no":"Norwegian translation","fr":"French translation","es":"Spanish translation","it":"English translation","cs":"Czech translation"},"isPackage":false,"vatPercentage":10,"startDate":"2026-08-29T22:58:14.599Z","endDate":"2026-08-29T22:58:14.599Z","startLocationId":"98Fo0F9NxN9GVYzEd2Cj","endLocationId":"wjg59VxG0rfa1iG11GQk","charge":{"amount":1000,"paid":0,"currency":"USD","discount":0},"deposit":{"amount":1000,"paid":0,"reserved":0,"currency":"USD","type":"payment","additionalInfo":""}}]}],"delivery":{"id":"kJ4SY2SU27g9KFBaK4sa","shopId":"nTCH27DcC6gyMYufZTi2","rentalId":"bfk7DJ5lCjjHFIBwz2IK","deliveryOptionId":"czI8mUPmzUGi6XcQQ6fX","name":{"def":"Express delivery","en":"English translation","fi":"Finnish translation","de":"German translation","ru":"Russian translation","sk":"Slovak translation","nl":"Dutch translation","hu":"Hungarian translation","no":"Norwegian translation","fr":"French translation","es":"Spanish translation","it":"English translation","cs":"Czech translation"},"created":"2026-08-29T22:58:14.599Z","to":{"timeslotStart":"10:00","timeslotEnd":"12:00","timeslotStartUTC":"2022-09-13T10:00:00.000Z","timeslotEndUTC":"2022-09-13T12:00:00.000Z","handlingTimeMinutes":300,"address":{"address":"101 Brooklyn St.","city":"New York","zipCode":"10011","state":"New York","country":"United States","details":"Entrance from building A"}},"from":{"timeslotStart":"10:00","timeslotEnd":"12:00","timeslotStartUTC":"2022-09-13T10:00:00.000Z","timeslotEndUTC":"2022-09-13T12:00:00.000Z","handlingTimeMinutes":300,"address":{"address":"101 Brooklyn St.","city":"New York","zipCode":"10011","state":"New York","country":"United States","details":"Entrance from building A"}}}}}},"securitySchemes":{"apiKey":{"type":"http","scheme":"basic","description":"Provide your api key with HTTP Basic Authentication, where the username is your API key ID and password is your API key secret","name":"Authorization","in":"header"}}},"info":{"title":"Rentle API","version":"1.0.0","description":"","x-logo":{"url":"https://firebasestorage.googleapis.com/v0/b/rentle-prod.appspot.com/o/logos%2Frentle-logo-216.png?alt=media&token=5dce2cdc-29fc-4186-9fe5-816c8d48d15b"}},"openapi":"3.0.0","paths":{"/products/{productId}":{"get":{"operationId":"ProductController.getById","parameters":[{"in":"path","name":"productId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Product"}}},"description":"Product"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductNotFoundError"}}},"description":"Product not found"}},"summary":"Get product by ID","tags":["Products"],"description":"Get a single product by ID","security":[{"apiKey":["read:products"]}]}},"/shops/{shopId}/":{"get":{"operationId":"ShopController.getById","parameters":[{"in":"path","name":"shopId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Shop"}}},"description":"Shop"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShopNotFoundError"}}},"description":"Shop not found"}},"summary":"Get shop information","tags":["Shops"],"description":"Get information about a shop by id","security":[{"apiKey":["read:shops"]}]}},"/shops/{shopId}/products":{"get":{"operationId":"ShopController.getProductsByShop","parameters":[{"in":"path","name":"shopId","required":true,"schema":{"type":"string"}},{"in":"query","name":"categories","schema":{"items":{"type":"string"},"type":"array","title":"Categories","description":"An array of category IDs to filter by (returned products are in at least one of the provided categories)"}},{"in":"query","name":"channels","schema":{"items":{"type":"string","enum":["ADMIN","STORE","ONLINE","PAYLINK","CONSUMER","API","WIX"]},"type":"array","title":"Sales channels","description":"An array of sales channels to filter by (returned products are visible in at least one of the provided channels)"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Product"},"type":"array"}}},"description":"Array of products"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShopNotFoundError"}}},"description":"Shop not found"}},"summary":"Get shop products","tags":["Shops","Products"],"description":"Get all products of a given shop","security":[{"apiKey":["read:products"]}]}},"/shops/{shopId}/categories":{"get":{"operationId":"ShopController.getCategoriesByShop","parameters":[{"in":"path","name":"shopId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Category"},"type":"array"}}},"description":"Array of categories"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShopNotFoundError"}}},"description":"Shop not found"}},"summary":"Get shop categories","tags":["Shops"],"description":"Get all product categories of a given shop","security":[{"apiKey":["read:products"]}]}},"/info":{"get":{"operationId":"InfoController.getApiKeyInfo","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyInfo"}}},"description":"API key info"}},"summary":"Get API key information.","tags":["Info"],"description":"Get information about your API key, such as the enabled scopes and shopId which it is associated with.","security":[{"apiKey":[]}]}},"/orders/{shopId}":{"post":{"operationId":"OrderController.createOrder","parameters":[{"in":"path","name":"shopId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateOrderParams"}}},"description":"CreateOrderParams","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}},"description":"The created order"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}},"description":"Validation error"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShopNotFoundError"}}},"description":"Shop not found"}},"summary":"Create new order","tags":["Orders"],"description":"Create a new order","security":[{"apiKey":["create:orders"]}]}},"/orders/{shopId}/{orderId}":{"get":{"operationId":"OrderController.getOrderById","parameters":[{"in":"path","name":"shopId","required":true,"schema":{"type":"string"}},{"in":"path","name":"orderId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}},"description":"The order with the provided ID"},"404.1":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShopNotFoundError"}}},"description":"Shop not found"},"404.2":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderNotFoundError"}}},"description":"Order not found"}},"summary":"Get single order","tags":["Orders"],"description":"Get a single order by ID","security":[{"apiKey":["read:orders"]}]}}},"servers":[{"url":"https://api.rentle.io/docs","description":"Production API"}],"tags":[{"name":"AccessDeniedError","x-displayName":"AccessDeniedError","description":"### Access denied error \n The provided API key does not have access to a requested resource\n <SchemaDefinition schemaRef=\"#/components/schemas/AccessDeniedError\" />"},{"name":"Address","x-displayName":"Address","description":"### Address \n Address object\n <SchemaDefinition schemaRef=\"#/components/schemas/Address\" />"},{"name":"ApiError","x-displayName":"ApiError","description":"### Error details \n Generic class for details sent with an error response - see specific errors for more details.\n <SchemaDefinition schemaRef=\"#/components/schemas/ApiError\" />"},{"name":"ApiKeyInfo","x-displayName":"ApiKeyInfo","description":"### API key info \n Information about an API key used to make the request\n <SchemaDefinition schemaRef=\"#/components/schemas/ApiKeyInfo\" />"},{"name":"ApiKeyNotFoundError","x-displayName":"ApiKeyNotFoundError","description":"### API key not found error \n An API key corresponding to the provided details does not exist\n <SchemaDefinition schemaRef=\"#/components/schemas/ApiKeyNotFoundError\" />"},{"name":"Authentication","x-displayName":"Authentication","description":"### API keys\n\nUsing the Rentle API requires either a Rentle LITE or Rentle CORE plan, and all requests are authenticated with a standard API key using HTTP Basic Authentication. If you already have a Rentle account, you can generate an API key on the [integrations page](https://admin.rentle.io/integrations/api-keys). Your API key will only be able to access data related to your own shop.\n\nThe API key is provided in the request header with HTTP Basic Authentication:\n\n> Basic authentication is a simple authentication scheme built into the HTTP protocol. The client sends HTTP requests with the Authorization header that contains the word Basic word followed by a space and a base64-encoded string username:password. For example, to authorize as demo / p@55w0rd the client would send `Authorization: Basic ZGVtbzpwQDU1dzByZA==`\n\nwhere the values for username and password are:\n\n- `username`: Your API key ID\n- `password`: Your API key secret\n\n### Scopes\n\nWhen creating your API key, you will be asked to choose which scopes it has access to. It is recommended to only enable the scopes that you need that API key to be able to access, and add more scopes as you start needing them. An API key with all possible scopes enabled can be very destructive for your shop if leaked to the wrong hands.\n\nYou can see the scopes required for each operation in the corresponding section of the documentation.\n","x-traitTag":true},{"name":"AuthorizationMissingError","x-displayName":"AuthorizationMissingError","description":"### Authorization missing error \n The request did not include an Authorization header\n <SchemaDefinition schemaRef=\"#/components/schemas/AuthorizationMissingError\" />"},{"name":"Category","x-displayName":"Category","description":"### Product category \n A category to which a Product can belong to\n <SchemaDefinition schemaRef=\"#/components/schemas/Category\" />"},{"name":"ChargeObject","x-displayName":"ChargeObject","description":"### Charge object \n An object representing a charge and its payment status\n <SchemaDefinition schemaRef=\"#/components/schemas/ChargeObject\" />"},{"name":"CreateOrderParams","x-displayName":"CreateOrderParams","description":"### Order creation parameters \n Parameters for a single order created via the API\n <SchemaDefinition schemaRef=\"#/components/schemas/CreateOrderParams\" />"},{"name":"CreateOrderProductParams","x-displayName":"CreateOrderProductParams","description":"### Order creation product parameters \n Parameters for a single product, included in an order created via the API\n <SchemaDefinition schemaRef=\"#/components/schemas/CreateOrderProductParams\" />"},{"name":"CreateOrderShopperParams","x-displayName":"CreateOrderShopperParams","description":"### Order creation shopper parameters \n Parameters for a single shopper for an order created via the API\n <SchemaDefinition schemaRef=\"#/components/schemas/CreateOrderShopperParams\" />"},{"name":"DeliveryDetails","x-displayName":"DeliveryDetails","description":"### Delivery details \n The details of a order delivery/pickup\n <SchemaDefinition schemaRef=\"#/components/schemas/DeliveryDetails\" />"},{"name":"DepositObject","x-displayName":"DepositObject","description":"### Deposit object \n An object representing a deposit required for a rental\n <SchemaDefinition schemaRef=\"#/components/schemas/DepositObject\" />"},{"name":"Deprecation","x-displayName":"Deprecation notice","description":"<div style=\"background-color:#f7c364a8; padding:16px\">\n<p><b>You are browsing an old version of the Rentle API</b>. The new Rentle API can be found from <a href=\"https://api.rentle.io/admin/\">https://api.rentle.io/admin/</a></p>\n\n<p>This API no longer receives updates, and will reach the end of support 31.8.2023. After that date, no maintenance will be given to the API, and it may stop working.</p>\n</div>","x-traitTag":true},{"name":"Duration","x-displayName":"Duration","description":"### Duration \n An object representing a duration of time\n <SchemaDefinition schemaRef=\"#/components/schemas/Duration\" />"},{"name":"ErrorResponse","x-displayName":"ErrorResponse","description":"### Error response (5xx) \n Response format when a call to the api fails with an unexpected error\n <SchemaDefinition schemaRef=\"#/components/schemas/ErrorResponse\" />"},{"name":"ErrorsOverview","x-displayName":"Errors overview","description":"A reference of the various error types the API may respond with. Error responses will include a link to the below documentation for the corresponding error type.","x-traitTag":true},{"name":"FailedResponse","x-displayName":"FailedResponse","description":"### Failed response (4xx) \n Response format when a call to the api fails due to some pre-condition not being met\n <SchemaDefinition schemaRef=\"#/components/schemas/FailedResponse\" />"},{"name":"Feedback","x-displayName":"Feedback","description":"Your feedback & bug reports are important for us to be able to develop the Rentle API further.\n\nTo give feedback, file bug reports and feature requests, notify us about an error in the documentation, or post a question about the API, head over to the [Rentle API feedback GitHub repository](https://github.com/rentle/rentle-api-feedback) to do so. Please note: this is not an official Rentle support channel, but more a channel for you to give feedback and receive assistance from either the Rentle dev team or other users of the API. If you need to chat with support, you should log in to your own shop at https://admin.rentle.io and use the official in-app support chat.\n","x-traitTag":true},{"name":"Info","description":"General information"},{"name":"InternalServerError","x-displayName":"InternalServerError","description":"### Internal server error \n An unexpected internal error which occurred while processing a request\n <SchemaDefinition schemaRef=\"#/components/schemas/InternalServerError\" />"},{"name":"Introduction","x-displayName":"Introduction","description":"Welcome to the Rentle admin API!\n\nTable of contents:\n\n- [Operations](/docs#tag/OperationsOverview): The operations available in the API\n- [Responses](/docs#tag/ResponsesOverview): The response formats of the API\n- [Models](/docs#tag/ModelsOverview): A glossary of all data models for responses and request parameters\n- [Errors](/docs#tag/ErrorsOverview): A glossary of all possible error responses and their explanations / troubleshooting guides\n\nThe Rentle API is an opt-in feature - to enable it for your shop, please request to start using the API via the in-app support chat in [Rentle admin](https://admin.rentle.io)\n","x-traitTag":true},{"name":"LocaleField","x-displayName":"LocaleField","description":"### Localized string \n An object of translations for a string\n <SchemaDefinition schemaRef=\"#/components/schemas/LocaleField\" />"},{"name":"ModelsOverview","x-displayName":"Models overview","description":"A reference of the various models the API can respond with, or take as parameters to certain routes. ","x-traitTag":true},{"name":"NotFoundError","x-displayName":"NotFoundError","description":"### Not found error \n A requested resource was not found\n <SchemaDefinition schemaRef=\"#/components/schemas/NotFoundError\" />"},{"name":"OperationsOverview","x-displayName":"Operations overview","description":"The various operations available in the API."},{"name":"Order","x-displayName":"Order","description":"### Order \n An order object\n <SchemaDefinition schemaRef=\"#/components/schemas/Order\" />"},{"name":"OrderDelivery","x-displayName":"OrderDelivery","description":"### Order delivery \n Information about the delivery related to an order\n <SchemaDefinition schemaRef=\"#/components/schemas/OrderDelivery\" />"},{"name":"OrderInfo","x-displayName":"OrderInfo","description":"### Order info \n General information about the order\n <SchemaDefinition schemaRef=\"#/components/schemas/OrderInfo\" />"},{"name":"OrderNotFoundError","x-displayName":"OrderNotFoundError","description":"### Order not found error \n A requested order id does not exist\n <SchemaDefinition schemaRef=\"#/components/schemas/OrderNotFoundError\" />"},{"name":"OrderProduct","x-displayName":"OrderProduct","description":"### Order product \n A single product within an order\n <SchemaDefinition schemaRef=\"#/components/schemas/OrderProduct\" />"},{"name":"Orders","description":"Fetch and create orders for your shop"},{"name":"OrderShopper","x-displayName":"OrderShopper","description":"### Order shopper \n A single shopper within an order\n <SchemaDefinition schemaRef=\"#/components/schemas/OrderShopper\" />"},{"name":"Pricing","x-displayName":"Pricing","description":"### Item pricing \n An object representing pricing information of single order item\n <SchemaDefinition schemaRef=\"#/components/schemas/Pricing\" />"},{"name":"PricingItem","x-displayName":"PricingItem","description":"### Pricing item \n A single pricing option\n <SchemaDefinition schemaRef=\"#/components/schemas/PricingItem\" />"},{"name":"Product","x-displayName":"Product","description":"### Product \n A product object\n <SchemaDefinition schemaRef=\"#/components/schemas/Product\" />"},{"name":"ProductNotFoundError","x-displayName":"ProductNotFoundError","description":"### Product not found error \n A requested product id does not exist\n <SchemaDefinition schemaRef=\"#/components/schemas/ProductNotFoundError\" />"},{"name":"ProductPricingOptions","x-displayName":"ProductPricingOptions","description":"### Product pricing \n An object of pricing-related options\n <SchemaDefinition schemaRef=\"#/components/schemas/ProductPricingOptions\" />"},{"name":"Products","description":"Product-related queries"},{"name":"ProductsQuery","x-displayName":"ProductsQuery","description":"### Product query parameters \n Query parameters that can be used to filter product results\n <SchemaDefinition schemaRef=\"#/components/schemas/ProductsQuery\" />"},{"name":"ProductVariant","x-displayName":"ProductVariant","description":"### Product variant \n A single variant of a given product. A single variant can contain several \"variations\" (for example, color=blue AND size=XL), which are described by the `properties` array.\n <SchemaDefinition schemaRef=\"#/components/schemas/ProductVariant\" />"},{"name":"ProductVariantProperty","x-displayName":"ProductVariantProperty","description":"### A product variant property object \n A single product variant property and its value for a given product variant. Represents a single \"variation\" of a product, e.g. \"size\" is \"large\". A product variant may have multiple such variations, i.e. it can at the same time be both \"large\" (size) and \"red\" (color)\n <SchemaDefinition schemaRef=\"#/components/schemas/ProductVariantProperty\" />"},{"name":"ProductVisibilityOptions","x-displayName":"ProductVisibilityOptions","description":"### Product visibility \n An object of visibility-related options for a product\n <SchemaDefinition schemaRef=\"#/components/schemas/ProductVisibilityOptions\" />"},{"name":"RateLimitExceededError","x-displayName":"RateLimitExceededError","description":"### Rate limit exceeded error \n Your API key has made an amount of calls that exceeds the rate limit for your current plan\n <SchemaDefinition schemaRef=\"#/components/schemas/RateLimitExceededError\" />"},{"name":"RateLimiting","x-displayName":"Rate Limiting","description":"The Rentle API is rate-limited with a [Leaky bucket](https://en.wikipedia.org/wiki/Leaky_bucket) system, where each API key has a \"bucket\" of API call quota available for their usage. This allows clients to make sudden bursts of requests without being rate-limited, so long as they are not consistently making more requests than the rate-limit allows.\n\nYou don't need to understand the algorithm very deeply, but to avoid being rate-limited you should simply make sure that a single API key is not, over a span of many hours, making more than 1 request per second.\n\nMore specifically, the relevant parameters for the leaky bucket algorithm are:\n\n- Bucket maximum capacity: 7200 requests\n- Leak rate: 1 request per second (3600 per hour)\n\nIf you do exceed the rate limit, you will receive a `RateLimitExceedError (HTTP 429)` - see the relevant section in the documentation for more information.","x-traitTag":true},{"name":"ResponsesOverview","x-displayName":"Responses overview","description":"The responses from this API follow a slightly modified [JSend specification](https://github.com/omniti-labs/jsend) and error responses follow the [RFC 7807 Problem Details for HTTP APIs specification](https://tools.ietf.org/html/rfc7807).\n\nPossible API responses come in three distinct types:\n\n| Type    | HTTP Status | Description                                                                                         | Response format                             |\n| ------- | ----------- | --------------------------------------------------------------------------------------------------- | ------------------------------------------- |\n| Success | 2xx         | The API call was successful, and (usually) some payload was returned                                | [SuccessResponse](docs#tag/SuccessResponse) |\n| Failed  | 4xx         | There was a problem with the data submitted, or some pre-condition of the API call wasn't satisfied | [FailedResponse](docs#tag/FailedResponse)   |\n| Error   | 5xx         | An error occurred in processing the request, i.e. an exception was thrown                           | [ErrorResponse](docs#tag/ErrorResponse)     |\n\n\nAll error responses will include a reason for the error, as well as a `name` field which identifies the type of error. HTTP status codes are used in a best-effort manner, but may be inconsistent and/or change without separate notice. As such, it is advised **not to use HTTP status codes in any of your application logic** - use the `name` property of the specific error instead. Possible error response types for each operation can be seen in the documentation of that operation, but keep in mind that any route may also return \"generic\" errors such as `RateLimitExceededError`, `AuthorizationMissingError`, etc.","x-traitTag":true},{"name":"ResponsibleShopper","x-displayName":"ResponsibleShopper","description":"### Responsible shopper \n An object representing a shopper responsible for a given order\n <SchemaDefinition schemaRef=\"#/components/schemas/ResponsibleShopper\" />"},{"name":"RouteNotFoundError","x-displayName":"RouteNotFoundError","description":"### Route not found error \n A route at the requested path does not exist\n <SchemaDefinition schemaRef=\"#/components/schemas/RouteNotFoundError\" />"},{"name":"Shop","x-displayName":"Shop","description":"### Shop \n Information about a shop\n <SchemaDefinition schemaRef=\"#/components/schemas/Shop\" />"},{"name":"ShopLocation","x-displayName":"ShopLocation","description":"### Shop location \n A shop location\n <SchemaDefinition schemaRef=\"#/components/schemas/ShopLocation\" />"},{"name":"ShopNotFoundError","x-displayName":"ShopNotFoundError","description":"### Shop not found error \n A requested shop id does not exist\n <SchemaDefinition schemaRef=\"#/components/schemas/ShopNotFoundError\" />"},{"name":"Shopper","x-displayName":"Shopper","description":"### Shopper \n An object representing a single shopper\n <SchemaDefinition schemaRef=\"#/components/schemas/Shopper\" />"},{"name":"Shops","description":"Shop-related queries"},{"name":"SuccessResponse","x-displayName":"SuccessResponse","description":"### Successful response (2xx) \n Response format for successful calls to the api\n <SchemaDefinition schemaRef=\"#/components/schemas/SuccessResponse\" />"},{"name":"SyntaxError","x-displayName":"SyntaxError","description":"### Syntax error \n The request syntax was invalid and the server was unable to handle the request\n <SchemaDefinition schemaRef=\"#/components/schemas/SyntaxError\" />"},{"name":"TaxLine","x-displayName":"TaxLine","description":"### Tax line \n Tax line object shows the taxable amount\n <SchemaDefinition schemaRef=\"#/components/schemas/TaxLine\" />"},{"name":"UnauthorizedError","x-displayName":"UnauthorizedError","description":"### Unauthorized error \n You were not authorized to request a given resource\n <SchemaDefinition schemaRef=\"#/components/schemas/UnauthorizedError\" />"},{"name":"UserProperty","x-displayName":"UserProperty","description":"### User property \n A property of a given user, such as height or weight\n <SchemaDefinition schemaRef=\"#/components/schemas/UserProperty\" />"},{"name":"ValidationError","x-displayName":"ValidationError","description":"### Validation error \n Invalid data was submitted and request validation failed\n <SchemaDefinition schemaRef=\"#/components/schemas/ValidationError\" />"}],"x-tagGroups":[{"name":"Introduction","tags":["Deprecation","Introduction","Feedback","Authentication","RateLimiting"]},{"name":"Operations","tags":["OperationsOverview","Products","Shops","Orders","Info"]},{"name":"Responses","tags":["ResponsesOverview","SuccessResponse","FailedResponse","ErrorResponse"]},{"name":"Models","tags":["ModelsOverview","Address","ApiKeyInfo","Category","ChargeObject","CreateOrderParams","CreateOrderProductParams","CreateOrderShopperParams","DeliveryDetails","DepositObject","Duration","LocaleField","Order","OrderDelivery","OrderInfo","OrderProduct","OrderShopper","Pricing","PricingItem","Product","ProductPricingOptions","ProductVariant","ProductVariantProperty","ProductVisibilityOptions","ResponsibleShopper","Shop","ShopLocation","Shopper","TaxLine","UserProperty"]},{"name":"Queries","tags":["ProductsQuery"]},{"name":"Errors","tags":["ErrorsOverview","AccessDeniedError","ApiError","ApiKeyNotFoundError","AuthorizationMissingError","InternalServerError","NotFoundError","OrderNotFoundError","ProductNotFoundError","RateLimitExceededError","RouteNotFoundError","ShopNotFoundError","SyntaxError","UnauthorizedError","ValidationError"]}]}