Åpne data

Data Bryti deler tilbake, som avledningen av Open Food Facts under ODbL.7 operasjoner

Hoder på hvert svar

Hvert svar på denne siden har disse hodene.
X-Trace-Id
— The W3C trace id of this request — the same id in the log and in the traceId of a problem. Quote it when reporting.
Server-Timing
— Where the time went: total, db;dur=…;desc="N queries", and every step the handler named (ADR-163).
X-Diagnostics
— Only when the request asked with X-Diagnostics: 1 or ?diagnostics=1: the same breakdown as one JSON object, with the trace id (ADR-163).

Operasjoner

GET/api/v1/data/off-derived.jsonl.gzTrenger ingen sesjon

Download the Open Food Facts derivative Bryti publishes under ODbL

Public, no account (ODbL 4.6): every product row and every barcode → food-key mapping Bryti holds, as gzipped JSON lines whose first line names the licence, the source and the attribution. Rate-limited per IP; ETag is the file's SHA-256; 404 until the first sync has run (ADR-227).

Parametre

Ingen parametre

Svar

200OK
404Not Found
application/problem+jsonProblemDetails
426The build named in X-App-Version is below its platform's version floor (ADR-070). Problem type app-version-unsupported; the only way forward is the store. Callers without the header are never turned away.
application/problem+jsonProblemDetails
429Too many calls in the window; Retry-After says how long.
application/problem+jsonProblemDetails
Hoder
Retry-After
— Seconds to wait when a rate limit answered, or an HTTP date when the household's AI is paused. Absent when the household's AI quota for the period is used up — that resets by itself.

Eksempel

curl \
  "https://bryti.app/api/v1/data/off-derived.jsonl.gz"
GET/api/v1/data/library-derived.jsonl.gzTrenger ingen sesjon

Download the CC BY-SA recipes Bryti's library adapted from open sources

Public, no account (CC BY-SA 4.0 share-alike): every recipe in Bryti's sourced library that carries a CC BY-SA licence — the bokmål adaptation of a Wikibooks or Unitools page — as gzipped JSON lines whose first line names the licence, the sources and the attribution. Rate-limited per IP; ETag is the file's SHA-256; always 200, with only the header line while no such recipe is seeded (#2828).

Parametre

Ingen parametre

Svar

200OK
426The build named in X-App-Version is below its platform's version floor (ADR-070). Problem type app-version-unsupported; the only way forward is the store. Callers without the header are never turned away.
application/problem+jsonProblemDetails
429Too many calls in the window; Retry-After says how long.
application/problem+jsonProblemDetails
Hoder
Retry-After
— Seconds to wait when a rate limit answered, or an HTTP date when the household's AI is paused. Absent when the household's AI quota for the period is used up — that resets by itself.

Eksempel

curl \
  "https://bryti.app/api/v1/data/library-derived.jsonl.gz"
GET/api/v1/data/dinner-prices.jsonTrenger ingen sesjon

Read the published dinner price index as JSON

Public, no account (CC BY 4.0): per household type and published month, the median of the month's weekly measurements, each the median of the fully priced weeks among 1 000 drawn from Bryti's library at the shops' list prices, with p10, p90, kroner per portion, coverage and the number of chains behind the figure. No figure per chain and no price per product (#3619).

Parametre

Ingen parametre

Svar

200OK
application/jsonDinnerPricesPublic
426The build named in X-App-Version is below its platform's version floor (ADR-070). Problem type app-version-unsupported; the only way forward is the store. Callers without the header are never turned away.
application/problem+jsonProblemDetails
429Too many calls in the window; Retry-After says how long.
application/problem+jsonProblemDetails
Hoder
Retry-After
— Seconds to wait when a rate limit answered, or an HTTP date when the household's AI is paused. Absent when the household's AI quota for the period is used up — that resets by itself.

Eksempel

curl \
  "https://bryti.app/api/v1/data/dinner-prices.json"

Eksempel på svar

200application/json
{
  "generatedAt": "2026-09-07T16:30:00Z",
  "source": "string",
  "license": "string",
  "recipeSetVersion": "string",
  "sampleSize": 0,
  "chainsRead": [
    "string"
  ],
  "missingChains": [
    "string"
  ],
  "firstMonth": "string",
  "latestMonth": "string",
  "nextMonth": "string",
  "baskets": [
    {
      "slug": "string",
      "persona": "string",
      "portions": 0,
      "recipeSetVersion": "string",
      "latest": {},
      "series": [
        {}
      ],
      "exampleWeek": {},
      "cheapestWeek": {}
    }
  ],
  "topTen": [
    {
      "rank": 0,
      "recipeId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "title": "string",
      "perPortion": 0,
      "ssbGroup": "string",
      "mainItem": {}
    }
  ],
  "breaks": [
    {
      "date": "string",
      "kind": "string",
      "note": "string"
    }
  ],
  "nextPublishDate": "string",
  "items": [
    {
      "foodKey": "string",
      "label": "string",
      "labelEn": "string",
      "form": "string",
      "unit": "string",
      "derivedUnit": false,
      "singleChain": false
    }
  ]
}
GET/api/v1/data/dinner-prices.csvTrenger ingen sesjon

Download the published dinner price index as CSV

Public, no account (CC BY 4.0): one row per household type and published month with the median, p10 and p90 week price, kroner per portion, coverage, chains, source and recipe-set version. Totals only (#3619).

Parametre

Ingen parametre

Svar

200OK
426The build named in X-App-Version is below its platform's version floor (ADR-070). Problem type app-version-unsupported; the only way forward is the store. Callers without the header are never turned away.
application/problem+jsonProblemDetails
429Too many calls in the window; Retry-After says how long.
application/problem+jsonProblemDetails
Hoder
Retry-After
— Seconds to wait when a rate limit answered, or an HTTP date when the household's AI is paused. Absent when the household's AI quota for the period is used up — that resets by itself.

Eksempel

curl \
  "https://bryti.app/api/v1/data/dinner-prices.csv"
POST/api/v1/data/dinner-prices/subscribeTrenger ingen sesjon

Ask for the monthly dinner price by e-mail

Public, no account (#3619). Takes an address and a language (nb or en) and nothing else. Always 202 whatever the list already knew about the address: a new one, one already confirmed and a resend inside the day's cooldown look the same. A confirmation mail with a single-use link goes out for a new address, and again for an unconfirmed one at most once a day; an unconfirmed address is deleted after seven days. 400 (code email_invalid) only when the address is not one. Rate-limited per IP (dinner-price-signup-per-ip, 5 an hour by default): 429 with Retry-After.

Parametre

Ingen parametre

Forespørselskropp

application/jsonPåkrevdDinnerPriceSubscribeRequest

Svar

202Accepted
400Bad Request
application/problem+jsonProblemDetails
426The build named in X-App-Version is below its platform's version floor (ADR-070). Problem type app-version-unsupported; the only way forward is the store. Callers without the header are never turned away.
application/problem+jsonProblemDetails
429Too Many Requests
application/problem+jsonProblemDetails
Hoder
Retry-After
— Seconds to wait when a rate limit answered, or an HTTP date when the household's AI is paused. Absent when the household's AI quota for the period is used up — that resets by itself.

Eksempel

curl \
  -X POST \
  "https://bryti.app/api/v1/data/dinner-prices/subscribe" \
  -H "Content-Type: application/json" \
  -d '{"email":"string","language":"string"}'
GET/api/v1/data/dinner-prices/confirmTrenger ingen sesjon

Confirm a dinner price e-mail address from the link in the mail

Public: the link opens in a browser that may never have seen Bryti (#3619). Safe to retry: a second click is still confirmed. 404 (code dinner_price_token_unknown) when no address carries the token; 410 (code dinner_price_token_expired) when the address outlived its seven days unconfirmed.

Parametre

NavnHvorTypePåkrevdBeskrivelse
tokenquerystring——

Svar

200OK
application/jsonDinnerPriceConfirmResponse
400The request could not be read as the route needs it: a body that is not the documented shape (a required field left out, a null where none is allowed, a value too long for its field), a parameter that does not parse, or a NUL character anywhere (#3540, #3541, #3543). Code validation_failed or value_too_long.
application/problem+jsonProblemDetails
404Not Found
application/problem+jsonProblemDetails
410Gone
application/problem+jsonProblemDetails
426The build named in X-App-Version is below its platform's version floor (ADR-070). Problem type app-version-unsupported; the only way forward is the store. Callers without the header are never turned away.
application/problem+jsonProblemDetails
429Too many calls in the window; Retry-After says how long.
application/problem+jsonProblemDetails
Hoder
Retry-After
— Seconds to wait when a rate limit answered, or an HTTP date when the household's AI is paused. Absent when the household's AI quota for the period is used up — that resets by itself.

Problemkoder

`code` i problemkroppen er den du forgreiner på. `detail` er engelsk, skrevet for loggen.

dinner_price_token_expired
— Lenken er for gammel. Skriv inn adressen igjen, så får du en ny.
dinner_price_token_unknown
— Lenken virker ikke. Skriv inn adressen igjen, så får du en ny.

Eksempel

curl \
  "https://bryti.app/api/v1/data/dinner-prices/confirm"

Eksempel på svar

200application/json
{
  "confirmed": false
}
GET/api/v1/data/dinner-prices/unsubscribeTrenger ingen sesjon

Leave the dinner price e-mail list from the link in a mail

Public, one click, no account (#3619). Deletes the address, it is not marked. Safe to retry: a second click on the same link is still unsubscribed. 404 (code dinner_price_token_unknown) for a link Bryti did not mint.

Parametre

NavnHvorTypePåkrevdBeskrivelse
tokenquerystring——

Svar

200OK
application/jsonDinnerPriceUnsubscribeResponse
400The request could not be read as the route needs it: a body that is not the documented shape (a required field left out, a null where none is allowed, a value too long for its field), a parameter that does not parse, or a NUL character anywhere (#3540, #3541, #3543). Code validation_failed or value_too_long.
application/problem+jsonProblemDetails
404Not Found
application/problem+jsonProblemDetails
426The build named in X-App-Version is below its platform's version floor (ADR-070). Problem type app-version-unsupported; the only way forward is the store. Callers without the header are never turned away.
application/problem+jsonProblemDetails
429Too many calls in the window; Retry-After says how long.
application/problem+jsonProblemDetails
Hoder
Retry-After
— Seconds to wait when a rate limit answered, or an HTTP date when the household's AI is paused. Absent when the household's AI quota for the period is used up — that resets by itself.

Problemkoder

`code` i problemkroppen er den du forgreiner på. `detail` er engelsk, skrevet for loggen.

dinner_price_token_unknown
— Lenken virker ikke. Skriv inn adressen igjen, så får du en ny.

Eksempel

curl \
  "https://bryti.app/api/v1/data/dinner-prices/unsubscribe"

Eksempel på svar

200application/json
{
  "unsubscribed": false
}

Skjema

DinnerPriceBasketPublic

FeltTypePåkrevd
slugstringPåkrevd
personastringPåkrevd
portionsinteger (int32)Påkrevd
recipeSetVersionstringPåkrevd
latestDinnerPriceLatestPublic | nullPåkrevd
seriesDinnerPriceSeriesPoint[]Påkrevd
exampleWeekDinnerPriceWeekPublic | nullPåkrevd
cheapestWeekDinnerPriceWeekPublic | nullPåkrevd

DinnerPriceBreak

FeltTypePåkrevd
datestringPåkrevd
kindstringPåkrevd
notestringPåkrevd

DinnerPriceConfirmResponse

FeltTypePåkrevd
confirmedbooleanPåkrevd

DinnerPriceExcludedRecipePublic

FeltTypePåkrevd
recipeIdstring (uuid)Påkrevd
titlestringPåkrevd
reasonstringPåkrevd
itemstringPåkrevd
itemEnstring | nullPåkrevd

DinnerPriceItemPublic

FeltTypePåkrevd
foodKeystringPåkrevd
labelstringPåkrevd
labelEnstring | nullPåkrevd
formstring | nullPåkrevd
unitstringPåkrevd
derivedUnitbooleanPåkrevd
singleChainbooleanPåkrevd

DinnerPriceLatestPublic

FeltTypePåkrevd
monthstringPåkrevd
measuredAtstring (date-time)Påkrevd
medianinteger (int32)Påkrevd
p10integer (int32)Påkrevd
p90integer (int32)Påkrevd
perPortioninteger (int32)Påkrevd
itemsPricedinteger (int32)Påkrevd
itemsTotalinteger (int32)Påkrevd
coveragenumber (double)Påkrevd
chainCountinteger (int32)Påkrevd
changeFromPreviousinteger (int32) | nullPåkrevd
changeFromYearAgointeger (int32) | nullPåkrevd
weeksPricedinteger (int32)Påkrevd
weeksTotalinteger (int32)Påkrevd
singleChainItemsinteger (int32)Påkrevd
derivedUnitItemsinteger (int32)Påkrevd
measurementsinteger (int32)Påkrevd

DinnerPriceMainItem

FeltTypePåkrevd
labelstringPåkrevd
labelEnstring | nullPåkrevd
formstring | nullPåkrevd

DinnerPriceSeriesPoint

FeltTypePåkrevd
monthstringPåkrevd
medianinteger (int32)Påkrevd

DinnerPricesPublic

FeltTypePåkrevd
generatedAtstring (date-time)Påkrevd
sourcestringPåkrevd
licensestringPåkrevd
recipeSetVersionstring | nullPåkrevd
sampleSizeinteger (int32)Påkrevd
chainsReadstring[]Påkrevd
missingChainsstring[]Påkrevd
firstMonthstring | nullPåkrevd
latestMonthstring | nullPåkrevd
nextMonthstringPåkrevd
basketsDinnerPriceBasketPublic[]Påkrevd
topTenDinnerPriceTopTenPublic[]Påkrevd
breaksDinnerPriceBreak[]Påkrevd
nextPublishDatestringPåkrevd
itemsDinnerPriceItemPublic[]Påkrevd
weightingDinnerPriceWeightingPublic | null—
excludedRecipesDinnerPriceExcludedRecipePublic[] | null—

DinnerPriceSubscribeRequest

FeltTypePåkrevd
emailstringPåkrevd
languagestring | nullPåkrevd

DinnerPriceTopTenPublic

FeltTypePåkrevd
rankinteger (int32)Påkrevd
recipeIdstring (uuid)Påkrevd
titlestringPåkrevd
perPortioninteger (int32)Påkrevd
ssbGroupstringPåkrevd
mainItemDinnerPriceMainItem | nullPåkrevd

DinnerPriceUnsubscribeResponse

FeltTypePåkrevd
unsubscribedbooleanPåkrevd

DinnerPriceWeekPublic

FeltTypePåkrevd
monthstringPåkrevd
weekPriceinteger (int32)Påkrevd
recipesDinnerPriceWeekRecipe[]Påkrevd

DinnerPriceWeekRecipe

FeltTypePåkrevd
dayinteger (int32)Påkrevd
recipeIdstring (uuid)Påkrevd
titlestringPåkrevd
ssbGroupstringPåkrevd
priceinteger (int32)Påkrevd
perPortioninteger (int32)Påkrevd
mainItemDinnerPriceMainItem | nullPåkrevd

DinnerPriceWeightingPublic

FeltTypePåkrevd
kindstringPåkrevd
versionstring | nullPåkrevd
sourcestring | nullPåkrevd
sourceEnstring | nullPåkrevd
capShareOfWeeksnumber (double) | nullPåkrevd

ProblemDetails

FeltTypePåkrevd
typestring | null—
titlestring | null—
statusinteger (int32) | null—
detailstring | null—
instancestring | null—
codestring | null—