{"openapi":"3.1.0","info":{"title":"Kassalapp","version":"0.0.1","description":"This API documentation is meant to be used by OpenAI ChatGPT."},"servers":[{"url":"https:\/\/kassal.app\/api\/v1"}],"security":[{"http":[]}],"paths":{"\/health":{"get":{"operationId":"healthCheck","summary":"Checks if the Kassalapp API is working","tags":["HealthCheck"],"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"status":{"type":"string","description":"The string \"Healthy\""}},"required":["status"]}}}}}}},"\/labels":{"get":{"operationId":"listLabels","description":"Returns a list of all labels","summary":"List all labels","tags":["Label"],"parameters":[{"name":"search","in":"query","description":"Filter labels by the 'name' and 'display_name' fields","schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Array of `LabelItemResource`","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#\/components\/schemas\/LabelItemResource"}}},"required":["data"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"}}}},"\/physical-stores":{"get":{"operationId":"searchPhysicalStores","description":"Useful for finding a grocery store by name, location or based on the group (grocery store chain), returns name, address, contact information and opening hours for each store.","summary":"Search for physical stores","tags":["PhysicalStore"],"parameters":[{"name":"group","in":"query","description":"Filter by group name.","schema":{"type":["string","null"],"enum":["MENY_NO","SPAR_NO","JOKER_NO","ODA_NO","ENGROSSNETT_NO","NAERBUTIKKEN","BUNNPRIS","KIWI","REMA_1000","EUROPRIS_NO","HAVARISTEN","HOLDBART","FUDI","COOP_NO","COOP_MARKED","MATKROKEN","COOP_MEGA","COOP_PRIX","COOP_OBS","COOP_EXTRA","COOP_BYGGMIX","COOP_OBS_BYGG","COOP_ELEKTRO","ARK","NORLI","ADLIBRIS"]},"example":"BUNNPRIS"},{"name":"search","in":"query","description":"Perform a search based on a keyword.","schema":{"type":["string","null"]},"example":"land\u00e5s"},{"name":"lat","in":"query","description":"Latitude coordinate for proximity search.","schema":{"type":["number","null"]}},{"name":"lng","in":"query","description":"Longitude coordinate for proximity search.","schema":{"type":["number","null"]}},{"name":"km","in":"query","description":"Search radius in kilometers for proximity search.","schema":{"type":["number","null"]}},{"name":"size","in":"query","description":"The number of results to be displayed per page.\nMust be an integer between 1 and 100.","schema":{"type":["integer","null"],"minimum":1,"maximum":100}}],"responses":{"200":{"description":"Array of `PhysicalStoreResource`","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#\/components\/schemas\/PhysicalStoreResource"}}},"required":["data"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"403":{"$ref":"#\/components\/responses\/AuthorizationException"}}}},"\/physical-stores\/{physicalStore}":{"get":{"operationId":"findPhysicalStoreById","description":"Finds a grocery store by ID. returns name, address, contact information and opening hours for the store store.","summary":"Find physical store by ID","tags":["PhysicalStore"],"parameters":[{"name":"physicalStore","in":"path","required":true,"description":"The physical store ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"`PhysicalStoreResource`","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#\/components\/schemas\/PhysicalStoreResource"}},"required":["data"]}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"}}}},"\/products":{"get":{"operationId":"searchProducts","description":"Useful for searching for groceries and various product to find the price, ingredients and nutritional information","summary":"Search for products","tags":["Product"],"parameters":[{"name":"brand","in":"query","description":"Filter products by brand name.","schema":{"type":["string","null"]},"example":"BAMA"},{"name":"vendor","in":"query","description":"Filter products by vendor (leverand\u00f8r).","schema":{"type":["string","null"]},"example":"orkla foods"},{"name":"price_min","in":"query","description":"Filter products by minimum price.","schema":{"type":["number","null"]}},{"name":"price_max","in":"query","description":"Filter products by maximum price.","schema":{"type":["number","null"]}},{"name":"sort","in":"query","description":"Sort the products by a specific criteria.\nAvailable options: date_asc, date_desc, name_asc, name_desc, price_asc, price_desc.","schema":{"type":["string","null"],"enum":["date_asc","date_desc","name_asc","name_desc","price_asc","price_desc"]}},{"name":"has_labels","in":"query","description":"Only return products with the matching labels, the value is an array of label names (eg: euroleaf, frysevare).\nEach element must be a string.","schema":{"type":["array","null"],"items":{"type":"string"}}},{"name":"category","in":"query","description":"Filter products by category name.","schema":{"type":["string","null"]},"example":"bakeri"},{"name":"category_id","in":"query","description":"Filter products by category ID.","schema":{"type":["integer","null"]},"example":5},{"name":"search","in":"query","description":"Search for products based on a keyword, this only applies to \"name\" of a product\nThe keyword must be a string with a minimum length of 3 characters.","schema":{"type":["string","null"]}},{"name":"size","in":"query","description":"The number of products to be displayed per page.\nMust be an integer between 1 and 100.","schema":{"type":["integer","null"],"minimum":1,"maximum":100}},{"name":"unique","in":"query","description":"If true, the product list will be collapsed based on the EAN number of the product; in practice, set this to true if you don't want duplicate results.","schema":{"type":["boolean","null"]}},{"name":"exclude_without_ean","in":"query","description":"If true, products without an EAN number are excluded from the results.","schema":{"type":["boolean","null"]}},{"name":"store","in":"query","description":"Filter products by store (e.g., SPAR_NO, MENY_NO, KIWI).","schema":{"type":["string","null"]},"example":"SPAR_NO"},{"name":"excl_allergens","in":"query","description":"Exclude specific allergens from the products.\nEach element must be a string.","schema":{"type":["array","null"],"items":{"type":"string"}}},{"name":"incl_allergens","in":"query","description":"Include only specific allergens in the products.\nEach element must be a string.","schema":{"type":["array","null"],"items":{"type":"string"}}}],"responses":{"200":{"description":"Array of `ProductResource`","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#\/components\/schemas\/ProductResource"}}},"required":["data"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"403":{"$ref":"#\/components\/responses\/AuthorizationException"}}}},"\/products\/id\/{product}":{"get":{"operationId":"findProductById","description":"Gets a specific product by id, returns the product price, nutritional information, ingredients, allergens for the product.","summary":"Lookup product by ID","tags":["Product"],"parameters":[{"name":"product","in":"path","required":true,"description":"The product ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"`ProductResource`","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#\/components\/schemas\/ProductResource"}},"required":["data"]}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"}}}},"\/products\/ean\/{ean}":{"get":{"operationId":"findProductByEanBarcode","description":"Gets a specific product by EAN (barcode) number, returns the product price, nutritional information, ingredients, allergens for the product.","summary":"Lookup product by EAN number","tags":["Product"],"parameters":[{"name":"ean","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"`ProductComparisonResource`","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#\/components\/schemas\/ProductComparisonResource"}},"required":["data"]}}}}}}},"\/products\/find-by-url\/single":{"get":{"operationId":"findProductByUrl","description":"Will look up product information based on an URL, returns the product price, nutritional information, ingredients, allergens for the product.","summary":"Find product info by URL","tags":["Product"],"parameters":[{"name":"url","in":"query","required":true,"description":"The url of the Product you want to get information on.","schema":{"type":"string"},"example":"https:\/\/meny.no\/varer\/middag\/pizza\/pizza\/grandiosa-pizza-7039010019811"}],"responses":{"200":{"description":"`ProductResource`","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#\/components\/schemas\/ProductResource"}},"required":["data"]}}}},"404":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","example":"Product not found"},"url":{"type":"string"}},"required":["message","url"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"}}}},"\/products\/find-by-url\/compare":{"get":{"operationId":"findProductsByUrl","description":"Will look up product information based on an URL, and return all matching prices from other stores that stock that item.","summary":"Find product price comparison info by URL","tags":["Product"],"parameters":[{"name":"url","in":"query","required":true,"description":"The url of the Product you want to get comparisons for.","schema":{"type":"string"},"example":"https:\/\/meny.no\/varer\/middag\/pizza\/pizza\/grandiosa-pizza-7039010019811"}],"responses":{"200":{"description":"`ProductComparisonResource`","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#\/components\/schemas\/ProductComparisonResource"}},"required":["data"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"}}}},"\/products\/prices-bulk":{"post":{"operationId":"bulkPriceHistory","description":"Returns aggregated price history across all stores for the requested EAN codes.\nPrice data is aggregated by day, showing one price per day per store.","summary":"Get bulk price history for multiple EANs","tags":["Product"],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"days":{"type":"integer","description":"Number of days of price history to include. Default: 30. Max: 90 (free) or 365 (premium).","example":30,"minimum":1},"aggregation":{"type":"string","description":"Price aggregation method when multiple prices exist on the same day.","enum":["min","max","avg"],"example":"min"},"eans":{"type":"array","description":"Array of EAN (barcode) codes to look up.","example":["7039010019811","7038010055720"],"items":{"type":"string"},"maxItems":100}},"required":["eans"]}}}},"responses":{"200":{"description":"","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#\/components\/schemas\/BulkPriceHistoryItemResource"}},"meta":{"type":"object","properties":{"requested_eans":{"type":"integer","description":"Total number of EAN codes in the request"},"found_products":{"type":"integer","description":"Number of products found with matching EAN codes"},"days_included":{"type":"integer","description":"Number of days of price history included"},"is_premium":{"type":"boolean","description":"Whether the requesting token has premium access"}},"required":["requested_eans","found_products","days_included","is_premium"]}},"required":["data","meta"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"}}}},"\/categories":{"get":{"operationId":"searchProductCategories","summary":"Search for product categories","tags":["ProductCategory"],"parameters":[{"name":"parent_id","in":"query","description":"Only return categories that are direct children of the given parent_id.\nAKA: get the children of a specific category.","schema":{"type":["integer","null"]}},{"name":"search","in":"query","description":"Search for categories based on a keyword, this only applies to \"name\" of a category.\nThe keyword must be a string with a minimum length of 3 characters.","schema":{"type":["string","null"]}},{"name":"size","in":"query","description":"The number of categories to be displayed per page.\nMust be an integer between 1 and 100.","schema":{"type":["integer","null"],"minimum":1,"maximum":100}}],"responses":{"200":{"description":"Array of `ProductCategoryResource`","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#\/components\/schemas\/ProductCategoryResource"}}},"required":["data"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"},"403":{"$ref":"#\/components\/responses\/AuthorizationException"}}}},"\/categories\/{category}":{"get":{"operationId":"findCategoryById","description":"Gets a specific product category by id, returns the category name, parent category, and depth.","summary":"Lookup category by ID","tags":["ProductCategory"],"parameters":[{"name":"category","in":"path","required":true,"description":"The category ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"`ProductCategoryResource`","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#\/components\/schemas\/ProductCategoryResource"}},"required":["data"]}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"}}}},"\/shopping-lists":{"get":{"operationId":"listAllShoppinglists","description":"Retrieves a collection of shopping lists associated with the authenticated user.","summary":"List all Shopping Lists","tags":["ShoppingList"],"parameters":[{"name":"search","in":"query","description":"Filter shopping lists by searching the title","schema":{"type":["string","null"]}},{"name":"include","in":"query","description":"Use include=items to include the shopping list items in the response","schema":{"type":["string","null"],"enum":["items"]}}],"responses":{"200":{"description":"Array of `ShoppingListResource`","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#\/components\/schemas\/ShoppingListResource"}}},"required":["data"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"}}},"post":{"operationId":"createShoppingList","description":"Creates a new shopping list for the authenticated user based on the provided data.","summary":"Create a new Shopping List","tags":["ShoppingList"],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"title":{"type":"string"}},"required":["title"]}}}},"responses":{"200":{"description":"`ShoppingListResource`","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#\/components\/schemas\/ShoppingListResource"}},"required":["data"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"}}}},"\/shopping-lists\/{shoppingList}":{"get":{"operationId":"showShoppingList","description":"Retrieves a specific shopping list.","summary":"Show Shopping List details","tags":["ShoppingList"],"parameters":[{"name":"shoppingList","in":"path","required":true,"description":"The shopping list ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"`ShoppingListResource`","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#\/components\/schemas\/ShoppingListResource"}},"required":["data"]}}}},"403":{"$ref":"#\/components\/responses\/AuthorizationException"},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"}}},"patch":{"operationId":"updateShoppingList","description":"Updates the data of a specific shopping list owned by the authenticated user.","summary":"Update Shopping List","tags":["ShoppingList"],"parameters":[{"name":"shoppingList","in":"path","required":true,"description":"The shopping list ID","schema":{"type":"integer"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"title":{"type":"string"}}}}}},"responses":{"200":{"description":"`ShoppingListResource`","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#\/components\/schemas\/ShoppingListResource"}},"required":["data"]}}}},"403":{"$ref":"#\/components\/responses\/AuthorizationException"},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"422":{"$ref":"#\/components\/responses\/ValidationException"}}},"delete":{"operationId":"deleteShoppingList","description":"Deletes a specific shopping list owned by the authenticated user.","summary":"Delete Shopping List","tags":["ShoppingList"],"parameters":[{"name":"shoppingList","in":"path","required":true,"description":"The shopping list ID","schema":{"type":"integer"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object"}}}},"responses":{"204":{"description":"No content","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","example":"Shopping list deleted"}},"required":["message"]}}}},"403":{"$ref":"#\/components\/responses\/AuthorizationException"},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"}}}},"\/shopping-lists\/{shoppingList}\/items":{"post":{"operationId":"shoppingListItem.store","description":"Add an item to an existing shopping list by id, specify the product id and an optional \"text\" field,\nin the kassalapp website the \"text\" field is simply the product name, but in the API it does not have to be that,\nit can also be left blank if not required.","summary":"Add item to shopping list","tags":["ShoppingListItem"],"parameters":[{"name":"shoppingList","in":"path","required":true,"description":"The shopping list ID","schema":{"type":"integer"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"text":{"type":"string"},"product_id":{"type":"integer"}},"required":["text"]}}}},"responses":{"200":{"description":"`ShoppingListItemResource`","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#\/components\/schemas\/ShoppingListItemResource"}},"required":["data"]}}}},"403":{"$ref":"#\/components\/responses\/AuthorizationException"},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"422":{"$ref":"#\/components\/responses\/ValidationException"}}}},"\/shopping-lists\/{shoppingList}\/items\/{shoppingListItem}":{"patch":{"operationId":"shoppingListItem.update","description":"Update an item in the shopping list, you can change the \"text\", or the \"checked\" field.","summary":"Update an item in the shopping list","tags":["ShoppingListItem"],"parameters":[{"name":"shoppingList","in":"path","required":true,"description":"The shopping list ID","schema":{"type":"integer"}},{"name":"shoppingListItem","in":"path","required":true,"description":"The shopping list item ID","schema":{"type":"integer"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"text":{"type":["string","null"]},"checked":{"type":["boolean","null"]}}}}}},"responses":{"200":{"description":"`ShoppingListItemResource`","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#\/components\/schemas\/ShoppingListItemResource"}},"required":["data"]}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"403":{"$ref":"#\/components\/responses\/AuthorizationException"},"422":{"$ref":"#\/components\/responses\/ValidationException"}}},"delete":{"operationId":"shoppingListItem.destroy","description":"Removes an item from the shopping list by id.","summary":"Remove item from shopping list","tags":["ShoppingListItem"],"parameters":[{"name":"shoppingList","in":"path","required":true,"description":"The shopping list ID","schema":{"type":"integer"}},{"name":"shoppingListItem","in":"path","required":true,"description":"The shopping list item ID","schema":{"type":"integer"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object"}}}},"responses":{"204":{"description":"No content","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","example":"Shopping list item deleted"}},"required":["message"]}}}},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"403":{"$ref":"#\/components\/responses\/AuthorizationException"}}}},"\/webhooks":{"get":{"operationId":"listAllWebhooks","description":"Retrieves a collection of webhooks associated with the authenticated user.","summary":"List all webhooks","tags":["Webhook"],"parameters":[{"name":"search","in":"query","description":"Filter webhooks by searching the name or url","schema":{"type":["string","null"]}}],"responses":{"200":{"description":"Array of `WebhookResource`","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#\/components\/schemas\/WebhookResource"}}},"required":["data"]}}}},"422":{"$ref":"#\/components\/responses\/ValidationException"}}},"post":{"operationId":"webhook.store","description":"Create and store a new webhook associated with the authenticated user.\nUse the provided data from the request to set the webhook's properties.","summary":"Create a new webhook","tags":["Webhook"],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"name":{"type":["string","null"]},"url":{"type":"string"},"ids":{"type":["array","null"],"items":{"type":"string"}},"eans":{"type":["array","null"],"items":{"type":"string"}}},"required":["url"]}}}},"responses":{"200":{"description":"`WebhookResource`","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#\/components\/schemas\/WebhookResource"}},"required":["data"]}}}},"403":{"$ref":"#\/components\/responses\/AuthorizationException"},"422":{"$ref":"#\/components\/responses\/ValidationException"}}}},"\/webhooks\/{webhook}":{"patch":{"operationId":"webhook.update","description":"Update the properties of an existing webhook based on the provided request data.\nEnsure that the webhook to be updated belongs to the authenticated user.","summary":"Update an existing webhook","tags":["Webhook"],"parameters":[{"name":"webhook","in":"path","required":true,"description":"The webhook ID","schema":{"type":"integer"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"ids":{"type":"array","items":{"type":"string"}},"eans":{"type":"array","items":{"type":"string"}}}}}}},"responses":{"200":{"description":"`WebhookResource`","content":{"application\/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#\/components\/schemas\/WebhookResource"}},"required":["data"]}}}},"403":{"$ref":"#\/components\/responses\/AuthorizationException"},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"},"422":{"$ref":"#\/components\/responses\/ValidationException"}}},"delete":{"operationId":"webhook.destroy","description":"Remove an existing webhook from the system.\nEnsure that the webhook to be deleted belongs to the authenticated user.","summary":"Delete an existing webhook","tags":["Webhook"],"parameters":[{"name":"webhook","in":"path","required":true,"description":"The webhook ID","schema":{"type":"integer"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object"}}}},"responses":{"204":{"description":"No content","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","example":"Webhook deleted successfully"}},"required":["message"]}}}},"403":{"$ref":"#\/components\/responses\/AuthorizationException"},"404":{"$ref":"#\/components\/responses\/ModelNotFoundException"}}}}},"components":{"securitySchemes":{"http":{"type":"http","scheme":"bearer","bearerFormat":"token"}},"schemas":{"AllergenItemResource":{"type":"object","properties":{"code":{"type":"string"},"display_name":{"type":"string"},"contains":{"type":"string","description":"contains\n- YES - Contains the allergen\n- NO - Does not contain the allergen\n- UNKNOWN - There is no information available\n- CAN_CONTAIN_TRACES - Can contain traces for the allergen"}},"required":["code","display_name","contains"],"title":"AllergenItemResource"},"BulkPriceHistoryItemResource":{"type":"object","properties":{"ean":{"type":"string","description":"The EAN barcode number"},"name":{"type":"string","description":"Product name"},"weight":{"type":["number","null"],"description":"Product weight in the specified weight_unit"},"weight_unit":{"type":["string","null"],"description":"Unit of the product weight (e.g. \"g\", \"kg\", \"ml\")"},"stores":{"type":"array","items":{"$ref":"#\/components\/schemas\/BulkPriceHistoryStoreResource"}},"price_history":{"type":"array","items":{"$ref":"#\/components\/schemas\/BulkPriceHistoryPriceResource"}}},"required":["ean","name","weight","weight_unit","stores","price_history"],"title":"BulkPriceHistoryItemResource"},"BulkPriceHistoryPriceResource":{"type":"object","properties":{"price":{"type":"number","description":"The aggregated price for this day"},"date":{"type":"string","description":"The date (YYYY-MM-DD)"},"store":{"type":"string","description":"Store code identifier (e.g. \"MENY_NO\", \"KIWI\", \"REMA_1000\")"}},"required":["price","date","store"],"title":"BulkPriceHistoryPriceResource"},"BulkPriceHistoryStoreResource":{"type":"object","properties":{"store":{"type":"string","description":"Store code identifier (e.g. \"MENY_NO\", \"KIWI\", \"REMA_1000\")"},"name":{"type":"string","description":"Display name of the store"},"current_price":{"type":["number","null"],"description":"The current price (Enhetspris)"},"current_unit_price":{"type":["number","null"],"description":"The unit price per kg, liter, or piece (\"kilopris\")"},"current_unit_price_unit":{"type":["string","null"],"description":"The unit the current_unit_price is expressed in (e.g. \"kg\", \"l\", \"piece\")"},"last_checked":{"type":["string","null"],"description":"When the price was last verified"}},"required":["store","name","current_price","current_unit_price","current_unit_price_unit","last_checked"],"title":"BulkPriceHistoryStoreResource"},"LabelItemResource":{"type":"object","properties":{"name":{"type":"string"},"display_name":{"type":"string"},"description":{"type":"string"},"organization":{"type":"string"},"alternative_names":{"type":"string"},"type":{"type":"string"},"year_established":{"type":"string"},"about":{"type":"string"},"note":{"type":"string"},"icon":{"type":"object","properties":{"svg":{"type":"string"},"png":{"type":"string"}},"required":["svg","png"]}},"required":["name","display_name","description","organization","alternative_names","type","year_established","about","note","icon"],"title":"LabelItemResource"},"NutritionItemResource":{"type":"object","properties":{"code":{"type":"string"},"display_name":{"type":"string"},"amount":{"type":"number"},"unit":{"type":"string"}},"required":["code","display_name","amount","unit"],"title":"NutritionItemResource"},"PhysicalStoreResource":{"type":"object","properties":{"id":{"type":"integer"},"group":{"type":["string","null"]},"name":{"type":"string"},"address":{"type":"string"},"phone":{"type":["string","null"]},"email":{"type":["string","null"]},"fax":{"type":["string","null"]},"logo":{"type":"string"},"website":{"type":["string","null"]},"detailUrl":{"type":"string"},"position":{"type":"object","properties":{"lat":{"type":["number","null"]},"lng":{"type":["number","null"]}},"required":["lat","lng"]},"openingHours":{"type":"object","properties":{"monday":{"type":["string","null"]},"tuesday":{"type":["string","null"]},"wednesday":{"type":["string","null"]},"thursday":{"type":["string","null"]},"friday":{"type":["string","null"]},"saturday":{"type":["string","null"]},"sunday":{"type":["string","null"]}},"required":["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]}},"required":["id","group","name","address","phone","email","fax","logo","website","detailUrl","position","openingHours"],"title":"PhysicalStoreResource"},"ProductCategoryResource":{"type":"object","properties":{"id":{"type":"string"},"parent_id":{"type":"string"},"name":{"type":"string"},"updated_at":{"type":"string"},"created_at":{"type":"string"}},"required":["id","parent_id","name","updated_at","created_at"],"title":"ProductCategoryResource"},"ProductComparisonItemResource":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"vendor":{"type":"string"},"brand":{"type":"string"},"description":{"type":"string"},"ingredients":{"type":"string"},"url":{"type":"string"},"image":{"type":"string"},"category":{"type":["array","null"],"items":{"type":"object","properties":{"id":{"type":"integer"},"depth":{"type":"integer"},"name":{"type":"string"}},"required":["id","depth","name"]}},"store":{"type":["array","null"],"items":{"type":"object","properties":{"name":{"type":"string"},"code":{"type":"string"},"url":{"type":"string"},"logo":{"type":"string"}},"required":["name","code","url","logo"]}},"current_price":{"type":["array","null"],"items":{"type":"object","properties":{"price":{"type":"number"},"unit_price":{"type":"number"},"date":{"type":"string"}},"required":["price","unit_price","date"]}},"weight":{"anyOf":[{"type":"integer"},{"type":"number"}]},"weight_unit":{"description":"The unit of the weight","$ref":"#\/components\/schemas\/Units"},"price_history":{"type":"array","items":{"type":"object","properties":{"price":{"type":"number"},"date":{"type":"string"}},"required":["price","date"]}},"kassalapp":{"type":"object","properties":{"url":{"type":"string"},"opengraph":{"type":"string"}},"required":["url","opengraph"]},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","name","vendor","brand","description","ingredients","url","image","category","store","current_price","weight","weight_unit","price_history","kassalapp","created_at","updated_at"],"title":"ProductComparisonItemResource"},"ProductComparisonResource":{"type":"object","properties":{"ean":{"type":"string"},"products":{"type":"array","items":{"$ref":"#\/components\/schemas\/ProductComparisonItemResource"}},"allergens":{"type":"array","items":{"$ref":"#\/components\/schemas\/AllergenItemResource"}},"nutrition":{"type":"array","items":{"$ref":"#\/components\/schemas\/NutritionItemResource"}},"labels":{"type":"array","items":{"$ref":"#\/components\/schemas\/LabelItemResource"}}},"required":["ean","products","allergens","nutrition","labels"],"title":"ProductComparisonResource"},"ProductResource":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"brand":{"type":["string","null"]},"vendor":{"type":["string","null"]},"ean":{"type":["string","null"]},"url":{"type":"string"},"image":{"type":["string","null"]},"category":{"type":["array","null"],"items":{"type":"object","properties":{"id":{"type":"integer"},"depth":{"type":"integer"},"name":{"type":"string"}},"required":["id","depth","name"]}},"description":{"type":["string","null"]},"ingredients":{"type":["string","null"]},"current_price":{"type":["number","null"],"description":"The current price  (Enhetspris)"},"current_unit_price":{"type":["number","null"],"description":"The current unit price (\"kilopris\")"},"weight":{"anyOf":[{"type":"integer"},{"type":"number"}]},"weight_unit":{"description":"The unit of the weight","$ref":"#\/components\/schemas\/Units"},"store":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"code":{"type":"string"},"url":{"type":"string"},"logo":{"type":"string"}},"required":["name","code","url","logo"]}},"price_history":{"type":"array","items":{"type":"object","properties":{"price":{"type":"number"},"date":{"type":"string"}},"required":["price","date"]}},"allergens":{"type":"array","items":{"$ref":"#\/components\/schemas\/AllergenItemResource"}},"nutrition":{"type":"array","items":{"$ref":"#\/components\/schemas\/NutritionItemResource"}},"labels":{"type":"array","items":{"$ref":"#\/components\/schemas\/LabelItemResource"}},"created_at":{"type":["object","null"]},"updated_at":{"type":["object","null"]}},"required":["id","name","brand","vendor","ean","url","image","category","description","ingredients","current_price","current_unit_price","weight","weight_unit","store","price_history","allergens","nutrition","labels","created_at","updated_at"],"title":"ProductResource"},"ShoppingListItemResource":{"type":"object","properties":{"id":{"type":"integer"},"text":{"type":["string","null"]},"product":{"$ref":"#\/components\/schemas\/ProductComparisonResource"},"checked":{"type":"boolean"},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","text","product","checked","created_at","updated_at"],"title":"ShoppingListItemResource"},"ShoppingListResource":{"type":"object","properties":{"id":{"type":"integer"},"title":{"type":"string"},"items":{"type":"array","items":{"$ref":"#\/components\/schemas\/ShoppingListItemResource"}},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","title","created_at","updated_at"],"title":"ShoppingListResource"},"Units":{"type":"string","enum":["cl","cm","dl","dosage","g","hg","kg","l","m","m100","ml","pair","piece","portion","squareMeter"],"title":"Units"},"WebhookResource":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":["string","null"]},"url":{"type":"string"},"secret":{"type":["string","null"]},"eans":{"type":["array","null"],"items":{"type":"string"}},"ids":{"type":["array","null"],"items":{"type":"string"}},"created_at":{"type":["object","null"]},"updated_at":{"type":["object","null"]}},"required":["id","name","url","secret","eans","ids","created_at","updated_at"],"title":"WebhookResource"}},"responses":{"ValidationException":{"description":"Validation error","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Errors overview."},"errors":{"type":"object","description":"A detailed description of each field that failed validation.","additionalProperties":{"type":"array","items":{"type":"string"}}}},"required":["message","errors"]}}}},"AuthorizationException":{"description":"Authorization error","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Error overview."}},"required":["message"]}}}},"ModelNotFoundException":{"description":"Not found","content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Error overview."}},"required":["message"]}}}}}}}