{"openapi":"3.1.0","info":{"title":"matris.app","description":"Dinner ideas from matprat.no, ranked by this week's grocery offers in Stavanger from mattilbud.no, searchable\nin plain bokmål (`q`). No diet rule applies unless `q` names one: `uten løk`, `glutenfri`, `lite laktose`.\nNot an official source; recipes belong to matprat.no and offers to the stores.\n\nKeys are English; advice is bokmål. Prices are kroner. `protein` is the main protein group,\nworked out from the heaviest meat or fish in the recipe. A dinner is `on_sale` when that protein\n(or, without meat or fish, a main vegetable) has a before-price this week.\n","version":"1"},"paths":{"/plan":{"get":{"summary":"This week's dinners","description":"A varied week: one dinner per main protein (fish up to twice, never the same fish twice),\npicked from dinners whose main protein is on sale.","operationId":"plan_plan_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Diet rules: `uten løk`, `glutenfri`, `lite laktose`","title":"Q"},"description":"Diet rules: `uten løk`, `glutenfri`, `lite laktose`"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/middager":{"get":{"summary":"Search the dinners that fit, best first","description":"Dinners whose name has a searched word first, then fewest swaps, the biggest discount, rating and\nprep time. Without a protein or a word to find, the best 3 of each main protein come first.\n`search` says how `q` was understood.","operationId":"dinners_middager_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A search in plain bokmål, such as `rask kylling uten sopp`, `laks eller torsk på tilbud` or `glutenfri pasta`.\nUnderstood: diet rules (`uten løk`, `glutenfri`, `lite laktose`: which dinners fit and what to swap), categories\n(`under 20 min`, `under 40 min`, `under en time`, `på tilbud`, `godt likt`, `barnevennlig`), main proteins (`kylling`,\n`fisk`, `kjøtt`, `sjømat`, `vegetar`, ...), `uten`/`ikke` before a word to leave it out, `eller` between words for either.\nAny other word must be in the dish name or an ingredient; a word that matches nothing is swapped for the closest known\none (see `search.corrected`). æøå may be written as ae/o/a.","title":"Q"},"description":"A search in plain bokmål, such as `rask kylling uten sopp`, `laks eller torsk på tilbud` or `glutenfri pasta`.\nUnderstood: diet rules (`uten løk`, `glutenfri`, `lite laktose`: which dinners fit and what to swap), categories\n(`under 20 min`, `under 40 min`, `under en time`, `på tilbud`, `godt likt`, `barnevennlig`), main proteins (`kylling`,\n`fisk`, `kjøtt`, `sjømat`, `vegetar`, ...), `uten`/`ikke` before a word to leave it out, `eller` between words for either.\nAny other word must be in the dish name or an ingredient; a word that matches nothing is swapped for the closest known\none (see `search.corrected`). æøå may be written as ae/o/a."},{"name":"protein","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"One of: fisk, skalldyr, kylling, kalkun, and, kjøttdeig, svin, pølser, storfe, lam, vilt, kjøtt, vegetar. Same as the word in `q`.","title":"Protein"},"description":"One of: fisk, skalldyr, kylling, kalkun, and, kjøttdeig, svin, pølser, storfe, lam, vilt, kjøtt, vegetar. Same as the word in `q`."},{"name":"tilbud","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"1: only dinners whose main protein is on sale. Same as `på tilbud` in `q`.","title":"Tilbud"},"description":"1: only dinners whose main protein is on sale. Same as `på tilbud` in `q`."},{"name":"antall","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"How many, 1-100 (default 30)","title":"Antall"},"description":"How many, 1-100 (default 30)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DinnersOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/oppskrift":{"get":{"summary":"Whether one recipe fits, and what to swap","operationId":"recipe_oppskrift_get","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","description":"A matprat.no recipe URL from `dinners[].url`","title":"Url"},"description":"A matprat.no recipe URL from `dinners[].url`"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Diet rules to check against: `uten løk`, `glutenfri`, `lite laktose`","title":"Q"},"description":"Diet rules to check against: `uten løk`, `glutenfri`, `lite laktose`"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"CheckOut":{"properties":{"recipe":{"$ref":"#/components/schemas/RecipeOut"},"fits":{"type":"boolean","title":"Fits"},"blocked":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Blocked"},"swaps":{"items":{"$ref":"#/components/schemas/NoteOut"},"type":"array","title":"Swaps"},"lactose_g_per_portion":{"type":"number","title":"Lactose G Per Portion"}},"type":"object","required":["recipe","fits","blocked","swaps","lactose_g_per_portion"],"title":"CheckOut"},"ClauseOut":{"properties":{"kind":{"type":"string","title":"Kind"},"text":{"type":"string","title":"Text"},"label":{"type":"string","title":"Label"}},"type":"object","required":["kind","text","label"],"title":"ClauseOut"},"CorrectionOut":{"properties":{"typed":{"type":"string","title":"Typed"},"used":{"type":"string","title":"Used"}},"type":"object","required":["typed","used"],"title":"CorrectionOut"},"DinnerOut":{"properties":{"name":{"type":"string","title":"Name"},"url":{"type":"string","title":"Url"},"protein":{"type":"string","title":"Protein"},"protein_ingredient":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Protein Ingredient"},"prep_time":{"type":"string","title":"Prep Time"},"rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rating"},"rating_count":{"type":"integer","title":"Rating Count"},"portions":{"type":"integer","title":"Portions"},"rank":{"type":"integer","title":"Rank"},"on_sale":{"type":"boolean","title":"On Sale"},"fits_as_is":{"type":"boolean","title":"Fits As Is"},"swaps":{"items":{"$ref":"#/components/schemas/NoteOut"},"type":"array","title":"Swaps"},"discounts":{"items":{"$ref":"#/components/schemas/DiscountOut"},"type":"array","title":"Discounts"},"matched":{"items":{"type":"string"},"type":"array","title":"Matched","default":[]}},"type":"object","required":["name","url","protein","protein_ingredient","prep_time","rating","rating_count","portions","rank","on_sale","fits_as_is","swaps","discounts"],"title":"DinnerOut"},"DinnersOut":{"properties":{"considered":{"type":"integer","title":"Considered"},"fitting":{"type":"integer","title":"Fitting"},"on_sale":{"type":"integer","title":"On Sale"},"offers":{"type":"integer","title":"Offers"},"built":{"type":"string","format":"date-time","title":"Built"},"offers_until":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Offers Until"},"dinners":{"items":{"$ref":"#/components/schemas/DinnerOut"},"type":"array","title":"Dinners"},"search":{"$ref":"#/components/schemas/SearchOut"}},"type":"object","required":["considered","fitting","on_sale","offers","built","offers_until","dinners","search"],"title":"DinnersOut"},"DiscountOut":{"properties":{"ingredient":{"type":"string","title":"Ingredient"},"store":{"type":"string","title":"Store"},"offer":{"type":"string","title":"Offer"},"price":{"type":"number","title":"Price"},"before":{"type":"number","title":"Before"},"discount_percent":{"type":"integer","title":"Discount Percent"},"valid_until":{"type":"string","format":"date","title":"Valid Until"}},"type":"object","required":["ingredient","store","offer","price","before","discount_percent","valid_until"],"title":"DiscountOut"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"NoteOut":{"properties":{"ingredient":{"type":"string","title":"Ingredient"},"problem":{"type":"string","title":"Problem"},"advice":{"type":"string","title":"Advice"}},"type":"object","required":["ingredient","problem","advice"],"title":"NoteOut"},"PlanOut":{"properties":{"considered":{"type":"integer","title":"Considered"},"fitting":{"type":"integer","title":"Fitting"},"on_sale":{"type":"integer","title":"On Sale"},"offers":{"type":"integer","title":"Offers"},"built":{"type":"string","format":"date-time","title":"Built"},"offers_until":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Offers Until"},"dinners":{"items":{"$ref":"#/components/schemas/DinnerOut"},"type":"array","title":"Dinners"},"stores":{"items":{"type":"string"},"type":"array","title":"Stores"}},"type":"object","required":["considered","fitting","on_sale","offers","built","offers_until","dinners","stores"],"title":"PlanOut"},"RecipeOut":{"properties":{"name":{"type":"string","title":"Name"},"url":{"type":"string","title":"Url"},"protein":{"type":"string","title":"Protein"},"protein_ingredient":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Protein Ingredient"},"prep_time":{"type":"string","title":"Prep Time"},"rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rating"},"rating_count":{"type":"integer","title":"Rating Count"},"portions":{"type":"integer","title":"Portions"}},"type":"object","required":["name","url","protein","protein_ingredient","prep_time","rating","rating_count","portions"],"title":"RecipeOut"},"SearchOut":{"properties":{"query":{"type":"string","title":"Query"},"understood":{"items":{"$ref":"#/components/schemas/ClauseOut"},"type":"array","title":"Understood"},"corrected":{"items":{"$ref":"#/components/schemas/CorrectionOut"},"type":"array","title":"Corrected"},"total":{"type":"integer","title":"Total"},"without":{"items":{"$ref":"#/components/schemas/ClauseOut"},"type":"array","title":"Without","default":[]}},"type":"object","required":["query","understood","corrected","total"],"title":"SearchOut"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}},"servers":[{"url":"https://matris.app/api"}]}