Skip to content

Save a new translation

POST
/api/v1/recipes/{id}/translations/new
curl --request POST \
--url http://127.0.0.1:8080/api/v1/recipes/example/translations/new \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "allergen_declarations": [ { "condition": "example", "presence": "contains", "substance": "example", "text": "example", "variant_ref": "example" } ], "assets": [ { "alt": "example", "caption": "example", "creator": "example", "credit": "example", "id": "example", "license": { "name": "example", "url": "https://example.com" }, "media_type": "example", "path": "example", "rights": "example", "role": "image", "sha256": "example", "size": 1, "source_url": "https://example.com" } ], "authors": [ { "kind": "person", "kind_label": "example", "name": "example", "url": "https://example.com" } ], "categories": [ "example" ], "cooking_methods": [ "example" ], "courses": [ "example" ], "cuisines": [ "example" ], "description": "example", "dietary_claims": [ { "condition": "example", "diet": "diabetic", "suitability": "suitable", "text": "example", "variant_ref": "example" } ], "equipment": [ { "name": "example", "note": "example", "quantity": { "amount": { "approximate": true, "max": "example", "min": "example", "value": "example" }, "kind": "simple", "options": [ { "amount": { "approximate": true, "max": "example", "min": "example", "value": "example" }, "kind": "simple", "terms": [ { "amount": { "approximate": true, "max": "example", "min": "example", "value": "example" }, "kind": "simple", "unit": "example" } ], "unit": "example" } ], "terms": [ { "amount": { "approximate": true, "max": "example", "min": "example", "value": "example" }, "kind": "simple", "unit": "example" } ], "text": "example", "unit": "example" } } ], "extensions_raw": { "additionalProperty": "example" }, "id": "example", "image_refs": [ "example" ], "ingredient_sections": [ { "id": "example", "ingredients": [ { "alternatives": [], "id": "example", "name": "example", "normalization": { "method": "authored", "review": "confirmed", "warnings": [ "example" ] }, "note": "example", "optional": true, "package_size": { "amount": { "approximate": true, "max": "example", "min": "example", "value": "example" }, "kind": "simple", "unit": "example" }, "quantity": { "amount": { "approximate": true, "max": "example", "min": "example", "value": "example" }, "kind": "simple", "options": [ { "amount": { "approximate": true, "max": "example", "min": "example", "value": "example" }, "kind": "simple", "terms": [ { "amount": { "approximate": true, "max": "example", "min": "example", "value": "example" }, "kind": "simple", "unit": "example" } ], "unit": "example" } ], "terms": [ { "amount": { "approximate": true, "max": "example", "min": "example", "value": "example" }, "kind": "simple", "unit": "example" } ], "text": "example", "unit": "example" }, "recipe": { "recipe_id": "example", "title": "example", "url": "https://example.com" }, "relation": "or", "source_text": "example", "temperature": { "amount": { "approximate": true, "max": "example", "min": "example", "value": "example" }, "note": "example", "purpose": { "kind": "oven", "label": "example" }, "source_text": "example", "text": "example", "unit": "example" } } ], "title": "example" } ], "instruction_sections": [ { "id": "example", "steps": [ { "id": "example", "image_refs": [ "example" ], "ingredient_uses": [ { "ingredient_ref": "example", "quantity": { "amount": { "approximate": true, "max": "example", "min": "example", "value": "example" }, "kind": "simple", "options": [ { "amount": { "approximate": true, "max": "example", "min": "example", "value": "example" }, "kind": "simple", "terms": [ { "amount": { "approximate": true, "max": "example", "min": "example", "value": "example" }, "kind": "simple", "unit": "example" } ], "unit": "example" } ], "terms": [ { "amount": { "approximate": true, "max": "example", "min": "example", "value": "example" }, "kind": "simple", "unit": "example" } ], "text": "example", "unit": "example" } } ], "temperatures": [ { "amount": { "approximate": true, "max": "example", "min": "example", "value": "example" }, "note": "example", "purpose": { "kind": "oven", "label": "example" }, "source_text": "example", "text": "example", "unit": "example" } ], "text": "example", "timing_refs": [ "example" ], "title": "example" } ], "title": "example" } ], "keywords": [ "example" ], "language": "example", "modified": "example", "notes": [ "example" ], "nutrition": [ { "basis": { "kind": "recipe", "quantity": { "amount": { "approximate": true, "max": "example", "min": "example", "value": "example" }, "kind": "simple", "options": [ { "amount": { "approximate": true, "max": "example", "min": "example", "value": "example" }, "kind": "simple", "terms": [ { "amount": { "approximate": true, "max": "example", "min": "example", "value": "example" }, "kind": "simple", "unit": "example" } ], "unit": "example" } ], "terms": [ { "amount": { "approximate": true, "max": "example", "min": "example", "value": "example" }, "kind": "simple", "unit": "example" } ], "text": "example", "unit": "example" }, "text": "example" }, "note": "example", "nutrients": [ { "amount": { "approximate": true, "max": "example", "min": "example", "value": "example" }, "label": "example", "nutrient": "energy", "source_text": "example", "text": "example", "unit": "kcal" } ] } ], "primary_image": "example", "published": "example", "schema_version": 1, "source": { "application": "example", "attribution": "example", "name": "example", "retrieved_at": "2026-04-15T12:00:00Z", "source_id": "example", "url": "https://example.com" }, "source_locale": "example", "times": { "additional": { "approximate": true, "max": "example", "min": "example", "source_text": "example", "text": "example", "value": "example" }, "assertions": [ { "attention": "active", "duration": { "approximate": true, "max": "example", "min": "example", "source_text": "example", "text": "example", "value": "example" }, "id": "example", "kind": "prep", "label": "example", "microwave": { "choices": [ { "duration": { "approximate": true, "max": "example", "min": "example", "source_text": "example", "text": "example", "value": "example" }, "power": { "percent": "example", "text": "example", "watts": 1 }, "rated_output_watts": 1, "source_text": "example" } ], "mode_text": "example", "power": { "percent": "example", "text": "example", "watts": 1 }, "rated_output_watts": 1, "restrictions": [ "example" ], "source_text": "example" }, "note": "example", "provenance": "derived" } ], "cook": { "approximate": true, "max": "example", "min": "example", "source_text": "example", "text": "example", "value": "example" }, "prep": { "approximate": true, "max": "example", "min": "example", "source_text": "example", "text": "example", "value": "example" }, "total": { "approximate": true, "max": "example", "min": "example", "source_text": "example", "text": "example", "value": "example" } }, "title": "example", "translations": [ { "language": "example", "recipe_id": "example", "relation": "original", "title": "example", "url": "https://example.com" } ], "variants": [ { "id": "example", "text": "example", "title": "example" } ], "yields": [ { "label": "example", "quantity": { "amount": { "approximate": true, "max": "example", "min": "example", "value": "example" }, "kind": "simple", "options": [ { "amount": { "approximate": true, "max": "example", "min": "example", "value": "example" }, "kind": "simple", "terms": [ { "amount": { "approximate": true, "max": "example", "min": "example", "value": "example" }, "kind": "simple", "unit": "example" } ], "unit": "example" } ], "terms": [ { "amount": { "approximate": true, "max": "example", "min": "example", "value": "example" }, "kind": "simple", "unit": "example" } ], "text": "example", "unit": "example" }, "text": "example" } ] }'

Creates the new recipe and relates it to the recipe it translates. Creation accepts Idempotency-Key; reuse it only with the same request. Receipts last at least 24 hours.

id
required

Library entry identifier of the recipe being translated

string

Library entry identifier of the recipe being translated

Idempotency-Key
string
<= 200 characters

Optional retry key. Receipts retain the created identity for at least 24 hours. A replay returns the current authorized resource; one-time secrets are omitted.

Media typeapplication/json
object
allergen_declarations

Allergen presence, precaution, and absence the source stated; an unmentioned substance is unknown

Array<object> | null
<= 1000 items
object
condition
string
<= 1000000 characters
presence
required

Contains: present; may_contain: precautionary or cross-contact warning; free_from: explicit absence claim

string
Allowed values: contains may_contain free_from
substance
required

The substance as the source names it

string
>= 1 characters <= 1000 characters
text
required

The complete authored statement

string
>= 1 characters <= 1000000 characters
variant_ref
string
/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/
assets
Array<object> | null
<= 10000 items
object
alt
string
<= 1000 characters
caption
string
<= 1000000 characters
creator

Who the source credits with creating the file

string
<= 1000 characters
credit

Authored credit line

string
<= 1000000 characters
id
required
string
/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/
license

License the source applies to the file; absent means unknown

object
name
string
<= 1000 characters
url
string format: uri
<= 10000 characters
media_type
required
string
<= 255 characters /^[A-Za-z0-9!#$&^_.+-]+/[A-Za-z0-9!#$&^_.+-]+$/
path
required
string
<= 512 characters /^assets/[A-Za-z0-9][A-Za-z0-9._/-]{0,510}$/
rights

Authored copyright or rights statement

string
<= 1000000 characters
role
string
Allowed values: image source other
sha256
required
string
/^[a-f0-9]{64}$/
size
required
integer format: int64
source_url

Page or file the asset came from

string format: uri
<= 10000 characters
authors
Array<object> | null
<= 100 items
object
kind

Absent when the source does not support a defensible classification

string
Allowed values: person organization other
kind_label

Source-authored classification used only with kind other

string
<= 1000 characters
name
required
string
>= 1 characters <= 1000 characters
url
string format: uri
<= 10000 characters /^[A-Za-z][A-Za-z0-9+.-]*:/
categories

Ordered source-authored broad classifications

Array<string> | null
<= 1000 items
cooking_methods

Ordered source-authored cooking-method labels

Array<string> | null
<= 1000 items
courses

Ordered source-authored meal-role classifications

Array<string> | null
<= 1000 items
cuisines
Array<string> | null
<= 1000 items
description
string
<= 1000000 characters
dietary_claims

Dietary suitability the source stated; never derived from ingredients

Array<object> | null
<= 1000 items
object
condition

Authored limit on the claim; a conditional claim is never shown or filtered as unconditional

string
<= 1000000 characters
diet

Normalized subject; absent when the diet has none

string
Allowed values: diabetic gluten_free halal hindu kosher low_calorie low_fat low_lactose low_salt vegan vegetarian
suitability
required
string
Allowed values: suitable unsuitable
text
required

The complete authored statement

string
>= 1 characters <= 1000000 characters
variant_ref

The variant the claim describes, which it does not extend to the recipe as written

string
/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/
equipment

Ordered equipment the recipe identifies as required or expected; recipe content, not kitchen inventory

Array<object> | null
<= 1000 items
object
name
required

Authored equipment description; not a normalized registry identity

string
>= 1 characters <= 1000 characters
note
string
<= 1000000 characters
quantity

Authored equipment count or measure; does not automatically scale with recipe yield

object
amount
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple sum alternatives opaque
options
Array<object> | null
<= 100 items
object
amount
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple sum
terms
Array<object> | null
<= 100 items
object
amount
required
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
terms
Array<object> | null
<= 100 items
object
amount
required
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
text
string
<= 1000 characters
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
extensions_raw
object
key
additional properties
id
required

Portable recipe document identifier

string
/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/
image_refs
Array<string> | null
<= 10000 items
ingredient_sections
required
Array<object> | null
<= 1000 items
object
id
required
string
/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/
ingredients
required
Array<object> | null
>= 1 items <= 10000 items

The line read as an ingredient. Its normalization method is extracted when an amount was read and unresolved when the line named a measure that could not be identified safely. A line with no amount is returned as a name

object
alternatives
Array<object> recursive| null
id
required
string
/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/
name
string
>= 1 characters <= 1000 characters
normalization
object
method
required
string
Allowed values: authored extracted inferred unresolved
review
string
Allowed values: confirmed corrected
warnings
Array<string> | null
<= 100 items
note
string
<= 1000000 characters
optional

The author sanctioned leaving this occurrence out. It belongs to the occurrence, never to the ingredient: the same thing may be optional in a garnish section and required by the method

boolean
package_size
object
amount
required
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
quantity
object
amount
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple sum alternatives opaque
options
Array<object> | null
<= 100 items
object
amount
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple sum
terms
Array<object> | null
<= 100 items
object
amount
required
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
terms
Array<object> | null
<= 100 items
object
amount
required
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
text
string
<= 1000 characters
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
recipe

The recipe that makes this ingredient, as the source identified it. Its content is not included

object
recipe_id

The other recipe’s portable document ID, not a library entry ID

string
/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/
title

The other recipe’s title as authored

string
<= 1000 characters
url

Where the other recipe is published

string format: uri
<= 10000 characters
relation
string
Allowed values: or and_or preferred
source_text
string
<= 1000000 characters
temperature
object
amount
object
approximate
boolean
max
string
<= 128 characters /^-?(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^-?(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^-?(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
note
string
<= 1000 characters
purpose
object
kind
required
string
Allowed values: oven internal oil water surface other
label
string
<= 1000 characters
source_text
string
<= 1000 characters
text
string
<= 1000 characters
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
title
string
<= 1000 characters
instruction_sections
required
Array<object> | null
<= 1000 items
object
id
required
string
/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/
steps
required
Array<object> | null
>= 1 items <= 10000 items
object
id
required
string
/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/
image_refs
Array<string> | null
<= 10000 items
ingredient_uses
Array<object> | null
<= 10000 items
object
ingredient_ref
required
string
/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/
quantity
object
amount
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple sum alternatives opaque
options
Array<object> | null
<= 100 items
object
amount
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple sum
terms
Array<object> | null
<= 100 items
object
amount
required
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
terms
Array<object> | null
<= 100 items
object
amount
required
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
text
string
<= 1000 characters
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
temperatures
Array<object> | null
<= 100 items
object
amount
object
approximate
boolean
max
string
<= 128 characters /^-?(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^-?(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^-?(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
note
string
<= 1000 characters
purpose
object
kind
required
string
Allowed values: oven internal oil water surface other
label
string
<= 1000 characters
source_text
string
<= 1000 characters
text
string
<= 1000 characters
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
text

Instruction prose; a step requires a title or text

string
<= 1000000 characters
timing_refs

Canonical timing assertions this step is associated with

Array<string> | null
<= 50 items
title

Optional authored heading for this instruction

string
<= 1000 characters
title
string
<= 1000 characters
keywords
Array<string> | null
<= 1000 items
language
string
<= 255 characters
modified

Authored recipe or source-work modification date or date-time

string
/^[0-9]{4}-[0-9]{2}-[0-9]{2}(?:[Tt][0-9]{2}:[0-9]{2}:[0-9]{2}(?:\.[0-9]+)?(?:[Zz]|[+-][0-9]{2}:[0-9]{2}))?$/
notes
Array<string> | null
<= 1000 items
nutrition

Authored nutrition statements, each with its own basis. Savorum does not calculate nutrition

Array<object> | null
<= 100 items
object
basis
required
object
kind
required

Recipe: the whole recipe as written; serving: one serving; quantity: a stated amount such as 100 g; unspecified: the source did not say

string
Allowed values: recipe serving quantity unspecified
quantity

Serving size or reference amount; required for a quantity basis and absent for an unspecified one

object
amount
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple sum alternatives opaque
options
Array<object> | null
<= 100 items
object
amount
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple sum
terms
Array<object> | null
<= 100 items
object
amount
required
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
terms
Array<object> | null
<= 100 items
object
amount
required
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
text
string
<= 1000 characters
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
text

Authored basis wording such as 1 slice

string
<= 1000 characters
note

Authored qualification of the whole statement

string
<= 1000000 characters
nutrients
required
Array<object> | null
>= 1 items <= 200 items
object
amount

An authored zero is a value; an unmentioned nutrient is absent

object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
label

The source’s own name; required for other

string
<= 1000 characters
nutrient
required
string
Allowed values: energy fat saturated_fat trans_fat unsaturated_fat cholesterol carbohydrate sugars fiber protein sodium salt other
source_text
string
<= 1000 characters
text

Wording that is not a precise value; excludes amount and unit

string
<= 1000 characters
unit

Absent when the source stated no unit

string
Allowed values: kcal kJ g mg mcg
primary_image
string
/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/
published

Authored recipe or source-work publication date or date-time

string
/^[0-9]{4}-[0-9]{2}-[0-9]{2}(?:[Tt][0-9]{2}:[0-9]{2}:[0-9]{2}(?:\.[0-9]+)?(?:[Zz]|[+-][0-9]{2}:[0-9]{2}))?$/
schema_version
required
integer format: int64
>= 1 <= 1
source
object
application

Portable source application or format identity; namespaces source_id

string
<= 1000 characters
attribution

Portable source credit or attribution

string
<= 1000000 characters
name

Portable source name credited by the recipe

string
<= 1000 characters
retrieved_at

Supplementary retrieval time; does not identify a source

string format: date-time
source_id

Identifier within application; never a Savorum library or publication ID

string
<= 1000 characters
url

Portable canonical source URL

string format: uri
<= 10000 characters
source_locale
string
<= 255 characters
sref_opaque_raw
object
key
additional properties
times
object
additional
object
approximate
boolean
max
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
min
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
source_text
string
<= 1000 characters
text

Opaque wording such as overnight; excludes a value or a range

string
<= 1000 characters
value
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
assertions
Array<object> | null
<= 50 items
object
attention

Authored semantics; absent means the recipe does not say

string
Allowed values: active passive
duration
required
object
approximate
boolean
max
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
min
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
source_text
string
<= 1000 characters
text

Opaque wording such as overnight; excludes a value or a range

string
<= 1000 characters
value
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
id
required
string
<= 255 characters
kind

Absent when the source supports a duration but no defensible classification

string
Allowed values: prep soak brine marinate cure proof ferment chill freeze drain cook rest cool other
label

Required when kind is other; may retitle a named one

string
<= 100 characters
microwave
object
choices
Array<object> | null
<= 100 items
object
duration
required
object
approximate
boolean
max
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
min
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
source_text
string
<= 1000 characters
text

Opaque wording such as overnight; excludes a value or a range

string
<= 1000 characters
value
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
power
object
percent
string
/^(?:100|[1-9][0-9]?)$/
text
string
<= 1000 characters
watts
integer format: int64
>= 1 <= 1000000
rated_output_watts
integer format: int64
>= 1 <= 1000000
source_text
required
string
>= 1 characters <= 1000 characters
mode_text
string
<= 1000 characters
power
object
percent
string
/^(?:100|[1-9][0-9]?)$/
text
string
<= 1000 characters
watts
integer format: int64
>= 1 <= 1000000
rated_output_watts
integer format: int64
>= 1 <= 1000000
restrictions
Array<string> | null
<= 100 items
source_text
required
string
>= 1 characters <= 1000 characters
note
string
<= 1000 characters
provenance

How Savorum came to hold this timing; not part of the portable recipe

string
Allowed values: derived supplemental
cook
object
approximate
boolean
max
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
min
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
source_text
string
<= 1000 characters
text

Opaque wording such as overnight; excludes a value or a range

string
<= 1000 characters
value
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
prep
object
approximate
boolean
max
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
min
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
source_text
string
<= 1000 characters
text

Opaque wording such as overnight; excludes a value or a range

string
<= 1000 characters
value
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
total
object
approximate
boolean
max
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
min
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
source_text
string
<= 1000 characters
text

Opaque wording such as overnight; excludes a value or a range

string
<= 1000 characters
value
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
title
required
string
>= 1 characters <= 1000 characters
translations

Declared relationships to other renditions of this recipe in other languages. Each rendition is its own recipe; a relationship shares no content

Array<object> | null
<= 1000 items
object
language
required

The counterpart’s primary language as a BCP 47 tag

string
>= 2 characters <= 255 characters
recipe_id

The counterpart’s portable recipe document ID, not a library entry ID

string
/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/
relation
required

Original: this recipe was translated from the counterpart; translation: the counterpart was translated from this recipe; alternate: the same recipe in another language with no stated direction

string
Allowed values: original translation alternate
title

The counterpart’s title as authored

string
<= 1000 characters
url

Where the counterpart is published

string format: uri
<= 10000 characters
variants

Authored alternate realizations of this recipe, in source order. Preserved content, not a machine-applicable delta: identify one as a variant and show what it says rather than trying to apply it

Array<object> | null
<= 1000 items
object
id

Recipe-local identifier that claims use to scope themselves to this variant

string
/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/
text
required
string
>= 1 characters <= 1000000 characters
title
string
<= 1000 characters
yields

Independent authored yield assertions in source order. None is primary; which one a reader scales by is their own state

Array<object> | null
<= 100 items
object
label
string
<= 1000 characters
quantity
object
amount
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple sum alternatives opaque
options
Array<object> | null
<= 100 items
object
amount
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple sum
terms
Array<object> | null
<= 100 items
object
amount
required
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
terms
Array<object> | null
<= 100 items
object
amount
required
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
text
string
<= 1000 characters
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
text
string
<= 1000 characters

Created

Media typeapplication/json
object
created_at
required
string format: date-time
deleted_at
string format: date-time
id
required

Identifier of this entry in the local Savorum library

string
recipe
required
object
allergen_declarations

Allergen presence, precaution, and absence the source stated; an unmentioned substance is unknown

Array<object> | null
<= 1000 items
object
condition
string
<= 1000000 characters
presence
required

Contains: present; may_contain: precautionary or cross-contact warning; free_from: explicit absence claim

string
Allowed values: contains may_contain free_from
substance
required

The substance as the source names it

string
>= 1 characters <= 1000 characters
text
required

The complete authored statement

string
>= 1 characters <= 1000000 characters
variant_ref
string
/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/
assets
Array<object> | null
<= 10000 items
object
alt
string
<= 1000 characters
caption
string
<= 1000000 characters
creator

Who the source credits with creating the file

string
<= 1000 characters
credit

Authored credit line

string
<= 1000000 characters
id
required
string
/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/
license

License the source applies to the file; absent means unknown

object
name
string
<= 1000 characters
url
string format: uri
<= 10000 characters
media_type
required
string
<= 255 characters /^[A-Za-z0-9!#$&^_.+-]+/[A-Za-z0-9!#$&^_.+-]+$/
path
required
string
<= 512 characters /^assets/[A-Za-z0-9][A-Za-z0-9._/-]{0,510}$/
rights

Authored copyright or rights statement

string
<= 1000000 characters
role
string
Allowed values: image source other
sha256
required
string
/^[a-f0-9]{64}$/
size
required
integer format: int64
source_url

Page or file the asset came from

string format: uri
<= 10000 characters
authors
Array<object> | null
<= 100 items
object
kind

Absent when the source does not support a defensible classification

string
Allowed values: person organization other
kind_label

Source-authored classification used only with kind other

string
<= 1000 characters
name
required
string
>= 1 characters <= 1000 characters
url
string format: uri
<= 10000 characters /^[A-Za-z][A-Za-z0-9+.-]*:/
categories

Ordered source-authored broad classifications

Array<string> | null
<= 1000 items
cooking_methods

Ordered source-authored cooking-method labels

Array<string> | null
<= 1000 items
courses

Ordered source-authored meal-role classifications

Array<string> | null
<= 1000 items
cuisines
Array<string> | null
<= 1000 items
description
string
<= 1000000 characters
dietary_claims

Dietary suitability the source stated; never derived from ingredients

Array<object> | null
<= 1000 items
object
condition

Authored limit on the claim; a conditional claim is never shown or filtered as unconditional

string
<= 1000000 characters
diet

Normalized subject; absent when the diet has none

string
Allowed values: diabetic gluten_free halal hindu kosher low_calorie low_fat low_lactose low_salt vegan vegetarian
suitability
required
string
Allowed values: suitable unsuitable
text
required

The complete authored statement

string
>= 1 characters <= 1000000 characters
variant_ref

The variant the claim describes, which it does not extend to the recipe as written

string
/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/
equipment

Ordered equipment the recipe identifies as required or expected; recipe content, not kitchen inventory

Array<object> | null
<= 1000 items
object
name
required

Authored equipment description; not a normalized registry identity

string
>= 1 characters <= 1000 characters
note
string
<= 1000000 characters
quantity

Authored equipment count or measure; does not automatically scale with recipe yield

object
amount
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple sum alternatives opaque
options
Array<object> | null
<= 100 items
object
amount
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple sum
terms
Array<object> | null
<= 100 items
object
amount
required
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
terms
Array<object> | null
<= 100 items
object
amount
required
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
text
string
<= 1000 characters
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
extensions_raw
object
key
additional properties
id
required

Portable recipe document identifier

string
/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/
image_refs
Array<string> | null
<= 10000 items
ingredient_sections
required
Array<object> | null
<= 1000 items
object
id
required
string
/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/
ingredients
required
Array<object> | null
>= 1 items <= 10000 items

The line read as an ingredient. Its normalization method is extracted when an amount was read and unresolved when the line named a measure that could not be identified safely. A line with no amount is returned as a name

object
alternatives
Array<object> recursive| null
id
required
string
/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/
name
string
>= 1 characters <= 1000 characters
normalization
object
method
required
string
Allowed values: authored extracted inferred unresolved
review
string
Allowed values: confirmed corrected
warnings
Array<string> | null
<= 100 items
note
string
<= 1000000 characters
optional

The author sanctioned leaving this occurrence out. It belongs to the occurrence, never to the ingredient: the same thing may be optional in a garnish section and required by the method

boolean
package_size
object
amount
required
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
quantity
object
amount
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple sum alternatives opaque
options
Array<object> | null
<= 100 items
object
amount
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple sum
terms
Array<object> | null
<= 100 items
object
amount
required
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
terms
Array<object> | null
<= 100 items
object
amount
required
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
text
string
<= 1000 characters
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
recipe

The recipe that makes this ingredient, as the source identified it. Its content is not included

object
recipe_id

The other recipe’s portable document ID, not a library entry ID

string
/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/
title

The other recipe’s title as authored

string
<= 1000 characters
url

Where the other recipe is published

string format: uri
<= 10000 characters
relation
string
Allowed values: or and_or preferred
source_text
string
<= 1000000 characters
temperature
object
amount
object
approximate
boolean
max
string
<= 128 characters /^-?(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^-?(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^-?(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
note
string
<= 1000 characters
purpose
object
kind
required
string
Allowed values: oven internal oil water surface other
label
string
<= 1000 characters
source_text
string
<= 1000 characters
text
string
<= 1000 characters
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
title
string
<= 1000 characters
instruction_sections
required
Array<object> | null
<= 1000 items
object
id
required
string
/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/
steps
required
Array<object> | null
>= 1 items <= 10000 items
object
id
required
string
/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/
image_refs
Array<string> | null
<= 10000 items
ingredient_uses
Array<object> | null
<= 10000 items
object
ingredient_ref
required
string
/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/
quantity
object
amount
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple sum alternatives opaque
options
Array<object> | null
<= 100 items
object
amount
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple sum
terms
Array<object> | null
<= 100 items
object
amount
required
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
terms
Array<object> | null
<= 100 items
object
amount
required
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
text
string
<= 1000 characters
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
temperatures
Array<object> | null
<= 100 items
object
amount
object
approximate
boolean
max
string
<= 128 characters /^-?(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^-?(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^-?(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
note
string
<= 1000 characters
purpose
object
kind
required
string
Allowed values: oven internal oil water surface other
label
string
<= 1000 characters
source_text
string
<= 1000 characters
text
string
<= 1000 characters
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
text

Instruction prose; a step requires a title or text

string
<= 1000000 characters
timing_refs

Canonical timing assertions this step is associated with

Array<string> | null
<= 50 items
title

Optional authored heading for this instruction

string
<= 1000 characters
title
string
<= 1000 characters
keywords
Array<string> | null
<= 1000 items
language
string
<= 255 characters
modified

Authored recipe or source-work modification date or date-time

string
/^[0-9]{4}-[0-9]{2}-[0-9]{2}(?:[Tt][0-9]{2}:[0-9]{2}:[0-9]{2}(?:\.[0-9]+)?(?:[Zz]|[+-][0-9]{2}:[0-9]{2}))?$/
notes
Array<string> | null
<= 1000 items
nutrition

Authored nutrition statements, each with its own basis. Savorum does not calculate nutrition

Array<object> | null
<= 100 items
object
basis
required
object
kind
required

Recipe: the whole recipe as written; serving: one serving; quantity: a stated amount such as 100 g; unspecified: the source did not say

string
Allowed values: recipe serving quantity unspecified
quantity

Serving size or reference amount; required for a quantity basis and absent for an unspecified one

object
amount
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple sum alternatives opaque
options
Array<object> | null
<= 100 items
object
amount
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple sum
terms
Array<object> | null
<= 100 items
object
amount
required
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
terms
Array<object> | null
<= 100 items
object
amount
required
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
text
string
<= 1000 characters
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
text

Authored basis wording such as 1 slice

string
<= 1000 characters
note

Authored qualification of the whole statement

string
<= 1000000 characters
nutrients
required
Array<object> | null
>= 1 items <= 200 items
object
amount

An authored zero is a value; an unmentioned nutrient is absent

object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
label

The source’s own name; required for other

string
<= 1000 characters
nutrient
required
string
Allowed values: energy fat saturated_fat trans_fat unsaturated_fat cholesterol carbohydrate sugars fiber protein sodium salt other
source_text
string
<= 1000 characters
text

Wording that is not a precise value; excludes amount and unit

string
<= 1000 characters
unit

Absent when the source stated no unit

string
Allowed values: kcal kJ g mg mcg
primary_image
string
/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/
published

Authored recipe or source-work publication date or date-time

string
/^[0-9]{4}-[0-9]{2}-[0-9]{2}(?:[Tt][0-9]{2}:[0-9]{2}:[0-9]{2}(?:\.[0-9]+)?(?:[Zz]|[+-][0-9]{2}:[0-9]{2}))?$/
schema_version
required
integer format: int64
>= 1 <= 1
source
object
application

Portable source application or format identity; namespaces source_id

string
<= 1000 characters
attribution

Portable source credit or attribution

string
<= 1000000 characters
name

Portable source name credited by the recipe

string
<= 1000 characters
retrieved_at

Supplementary retrieval time; does not identify a source

string format: date-time
source_id

Identifier within application; never a Savorum library or publication ID

string
<= 1000 characters
url

Portable canonical source URL

string format: uri
<= 10000 characters
source_locale
string
<= 255 characters
sref_opaque_raw
object
key
additional properties
times
object
additional
object
approximate
boolean
max
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
min
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
source_text
string
<= 1000 characters
text

Opaque wording such as overnight; excludes a value or a range

string
<= 1000 characters
value
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
assertions
Array<object> | null
<= 50 items
object
attention

Authored semantics; absent means the recipe does not say

string
Allowed values: active passive
duration
required
object
approximate
boolean
max
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
min
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
source_text
string
<= 1000 characters
text

Opaque wording such as overnight; excludes a value or a range

string
<= 1000 characters
value
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
id
required
string
<= 255 characters
kind

Absent when the source supports a duration but no defensible classification

string
Allowed values: prep soak brine marinate cure proof ferment chill freeze drain cook rest cool other
label

Required when kind is other; may retitle a named one

string
<= 100 characters
microwave
object
choices
Array<object> | null
<= 100 items
object
duration
required
object
approximate
boolean
max
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
min
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
source_text
string
<= 1000 characters
text

Opaque wording such as overnight; excludes a value or a range

string
<= 1000 characters
value
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
power
object
percent
string
/^(?:100|[1-9][0-9]?)$/
text
string
<= 1000 characters
watts
integer format: int64
>= 1 <= 1000000
rated_output_watts
integer format: int64
>= 1 <= 1000000
source_text
required
string
>= 1 characters <= 1000 characters
mode_text
string
<= 1000 characters
power
object
percent
string
/^(?:100|[1-9][0-9]?)$/
text
string
<= 1000 characters
watts
integer format: int64
>= 1 <= 1000000
rated_output_watts
integer format: int64
>= 1 <= 1000000
restrictions
Array<string> | null
<= 100 items
source_text
required
string
>= 1 characters <= 1000 characters
note
string
<= 1000 characters
provenance

How Savorum came to hold this timing; not part of the portable recipe

string
Allowed values: derived supplemental
cook
object
approximate
boolean
max
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
min
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
source_text
string
<= 1000 characters
text

Opaque wording such as overnight; excludes a value or a range

string
<= 1000 characters
value
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
prep
object
approximate
boolean
max
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
min
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
source_text
string
<= 1000 characters
text

Opaque wording such as overnight; excludes a value or a range

string
<= 1000 characters
value
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
total
object
approximate
boolean
max
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
min
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
source_text
string
<= 1000 characters
text

Opaque wording such as overnight; excludes a value or a range

string
<= 1000 characters
value
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
title
required
string
>= 1 characters <= 1000 characters
translations

Declared relationships to other renditions of this recipe in other languages. Each rendition is its own recipe; a relationship shares no content

Array<object> | null
<= 1000 items
object
language
required

The counterpart’s primary language as a BCP 47 tag

string
>= 2 characters <= 255 characters
recipe_id

The counterpart’s portable recipe document ID, not a library entry ID

string
/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/
relation
required

Original: this recipe was translated from the counterpart; translation: the counterpart was translated from this recipe; alternate: the same recipe in another language with no stated direction

string
Allowed values: original translation alternate
title

The counterpart’s title as authored

string
<= 1000 characters
url

Where the counterpart is published

string format: uri
<= 10000 characters
variants

Authored alternate realizations of this recipe, in source order. Preserved content, not a machine-applicable delta: identify one as a variant and show what it says rather than trying to apply it

Array<object> | null
<= 1000 items
object
id

Recipe-local identifier that claims use to scope themselves to this variant

string
/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/
text
required
string
>= 1 characters <= 1000000 characters
title
string
<= 1000 characters
yields

Independent authored yield assertions in source order. None is primary; which one a reader scales by is their own state

Array<object> | null
<= 100 items
object
label
string
<= 1000 characters
quantity
object
amount
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple sum alternatives opaque
options
Array<object> | null
<= 100 items
object
amount
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple sum
terms
Array<object> | null
<= 100 items
object
amount
required
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
terms
Array<object> | null
<= 100 items
object
amount
required
object
approximate
boolean
max
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
min
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
value
string
<= 128 characters /^(0|[1-9][0-9]*|[1-9][0-9]*/[1-9][0-9]*)$/
kind
required
string
Allowed values: simple
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
text
string
<= 1000 characters
unit
string
<= 255 characters /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/
text
string
<= 1000 characters
revision
required
integer format: int64
>= 1
time_summary
required
object
active

Time the recipe needs the cook

object
approximate
boolean
max
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
min
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
source_text
string
<= 1000 characters
text

Opaque wording such as overnight; excludes a value or a range

string
<= 1000 characters
value
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
cook
object
approximate
boolean
max
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
min
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
source_text
string
<= 1000 characters
text

Opaque wording such as overnight; excludes a value or a range

string
<= 1000 characters
value
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
elapsed

Time from starting to being able to eat

object
approximate
boolean
max
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
min
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
source_text
string
<= 1000 characters
text

Opaque wording such as overnight; excludes a value or a range

string
<= 1000 characters
value
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
prep
object
approximate
boolean
max
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
min
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
source_text
string
<= 1000 characters
text

Opaque wording such as overnight; excludes a value or a range

string
<= 1000 characters
value
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
written_total

An authored total the recipe itself contradicts, preserved but not presented as the elapsed time

object
approximate
boolean
max
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
min
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
source_text
string
<= 1000 characters
text

Opaque wording such as overnight; excludes a value or a range

string
<= 1000 characters
value
string
<= 100 characters /^P(?:[0-9]+Y)?(?:[0-9]+M)?(?:[0-9]+W)?(?:[0-9]+D)?(?:T(?:[0-9]+H)?(?:[0-9]+M)?(?:[0-9]+S)?)?$/
key
additional properties
any
updated_at
required
string format: date-time
key
additional properties
any
Example
{
"recipe": {
"allergen_declarations": [
{
"presence": "contains"
}
],
"assets": [
{
"role": "image"
}
],
"authors": [
{
"kind": "person"
}
],
"dietary_claims": [
{
"diet": "diabetic",
"suitability": "suitable"
}
],
"equipment": [
{
"quantity": {
"kind": "simple",
"options": [
{
"kind": "simple",
"terms": [
{
"kind": "simple"
}
]
}
],
"terms": [
{
"kind": "simple"
}
]
}
}
],
"ingredient_sections": [
{
"ingredients": [
{
"normalization": {
"method": "authored",
"review": "confirmed"
},
"package_size": {
"kind": "simple"
},
"quantity": {
"kind": "simple",
"options": [
{
"kind": "simple",
"terms": [
{
"kind": "simple"
}
]
}
],
"terms": [
{
"kind": "simple"
}
]
},
"relation": "or",
"temperature": {
"purpose": {
"kind": "oven"
}
}
}
]
}
],
"instruction_sections": [
{
"steps": [
{
"ingredient_uses": [
{
"quantity": {
"kind": "simple",
"options": [
{
"kind": "simple",
"terms": [
{
"kind": "simple"
}
]
}
],
"terms": [
{
"kind": "simple"
}
]
}
}
],
"temperatures": [
{
"purpose": {
"kind": "oven"
}
}
]
}
]
}
],
"nutrition": [
{
"basis": {
"kind": "recipe",
"quantity": {
"kind": "simple",
"options": [
{
"kind": "simple",
"terms": [
{
"kind": "simple"
}
]
}
],
"terms": [
{
"kind": "simple"
}
]
}
},
"nutrients": [
{
"nutrient": "energy",
"unit": "kcal"
}
]
}
],
"times": {
"assertions": [
{
"attention": "active",
"kind": "prep",
"provenance": "derived"
}
]
},
"translations": [
{
"relation": "original"
}
],
"yields": [
{
"quantity": {
"kind": "simple",
"options": [
{
"kind": "simple",
"terms": [
{
"kind": "simple"
}
]
}
],
"terms": [
{
"kind": "simple"
}
]
}
}
]
}
}
ETag
string
Location
string

No valid session or API token (authentication-required), or the credential sent is invalid (invalid-credentials).

Media typeapplication/problem+json
object
code
required
string
detail
required
string
status
required
integer format: int64
title
required
string
type
required
string
key
additional properties
any
Examplegenerated
{
"code": "example",
"detail": "example",
"status": 1,
"title": "example",
"type": "example"
}

Not Found

Media typeapplication/problem+json
object
code

Stable application error code; clients may also use the problem type suffix.

string
detail

A human-readable explanation specific to this occurrence of the problem.

string
errors

Optional list of individual error details

Array<object> | null
object
location

Where the error occurred, e.g. ‘body.items[3].tags’ or ‘path.thing-id’

string
message

Error message text

string
value

The value at the given location

key
additional properties
any
instance

A URI reference that identifies the specific occurrence of the problem.

string format: uri
params

Structured context for the stable error code.

object
key
additional properties
any
status

HTTP status code

integer format: int64
title

A short, human-readable summary of the problem type. This value should not change between occurrences of the error.

string
type

A URI reference to human-readable documentation for the error.

string format: uri
default: about:blank
violations
Array<object>
object
code
required
string
location
required
string
params
object
key
additional properties
any
key
additional properties
any
Example
{
"detail": "Property foo is required but is missing.",
"instance": "https://example.com/error-log/abc123",
"status": 400,
"title": "Bad Request",
"type": "about:blank"
}

Conflict

Media typeapplication/problem+json
object
code

Stable application error code; clients may also use the problem type suffix.

string
detail

A human-readable explanation specific to this occurrence of the problem.

string
errors

Optional list of individual error details

Array<object> | null
object
location

Where the error occurred, e.g. ‘body.items[3].tags’ or ‘path.thing-id’

string
message

Error message text

string
value

The value at the given location

key
additional properties
any
instance

A URI reference that identifies the specific occurrence of the problem.

string format: uri
params

Structured context for the stable error code.

object
key
additional properties
any
status

HTTP status code

integer format: int64
title

A short, human-readable summary of the problem type. This value should not change between occurrences of the error.

string
type

A URI reference to human-readable documentation for the error.

string format: uri
default: about:blank
violations
Array<object>
object
code
required
string
location
required
string
params
object
key
additional properties
any
key
additional properties
any
Example
{
"detail": "Property foo is required but is missing.",
"instance": "https://example.com/error-log/abc123",
"status": 400,
"title": "Bad Request",
"type": "about:blank"
}

Unprocessable Entity

Media typeapplication/problem+json
object
code

Stable application error code; clients may also use the problem type suffix.

string
detail

A human-readable explanation specific to this occurrence of the problem.

string
errors

Optional list of individual error details

Array<object> | null
object
location

Where the error occurred, e.g. ‘body.items[3].tags’ or ‘path.thing-id’

string
message

Error message text

string
value

The value at the given location

key
additional properties
any
instance

A URI reference that identifies the specific occurrence of the problem.

string format: uri
params

Structured context for the stable error code.

object
key
additional properties
any
status

HTTP status code

integer format: int64
title

A short, human-readable summary of the problem type. This value should not change between occurrences of the error.

string
type

A URI reference to human-readable documentation for the error.

string format: uri
default: about:blank
violations
Array<object>
object
code
required
string
location
required
string
params
object
key
additional properties
any
key
additional properties
any
Example
{
"detail": "Property foo is required but is missing.",
"instance": "https://example.com/error-log/abc123",
"status": 400,
"title": "Bad Request",
"type": "about:blank"
}

Creation retry refused

Media typeapplication/problem+json
object
code

Stable application error code; clients may also use the problem type suffix.

string
detail

A human-readable explanation specific to this occurrence of the problem.

string
errors

Optional list of individual error details

Array<object> | null
object
location

Where the error occurred, e.g. ‘body.items[3].tags’ or ‘path.thing-id’

string
message

Error message text

string
value

The value at the given location

key
additional properties
any
instance

A URI reference that identifies the specific occurrence of the problem.

string format: uri
params

Structured context for the stable error code.

object
key
additional properties
any
status

HTTP status code

integer format: int64
title

A short, human-readable summary of the problem type. This value should not change between occurrences of the error.

string
type

A URI reference to human-readable documentation for the error.

string format: uri
default: about:blank
violations
Array<object>
object
code
required
string
location
required
string
params
object
key
additional properties
any
key
additional properties
any
Example
{
"detail": "Property foo is required but is missing.",
"instance": "https://example.com/error-log/abc123",
"status": 400,
"title": "Bad Request",
"type": "about:blank"
}

Internal Server Error

Media typeapplication/problem+json
object
code

Stable application error code; clients may also use the problem type suffix.

string
detail

A human-readable explanation specific to this occurrence of the problem.

string
errors

Optional list of individual error details

Array<object> | null
object
location

Where the error occurred, e.g. ‘body.items[3].tags’ or ‘path.thing-id’

string
message

Error message text

string
value

The value at the given location

key
additional properties
any
instance

A URI reference that identifies the specific occurrence of the problem.

string format: uri
params

Structured context for the stable error code.

object
key
additional properties
any
status

HTTP status code

integer format: int64
title

A short, human-readable summary of the problem type. This value should not change between occurrences of the error.

string
type

A URI reference to human-readable documentation for the error.

string format: uri
default: about:blank
violations
Array<object>
object
code
required
string
location
required
string
params
object
key
additional properties
any
key
additional properties
any
Example
{
"detail": "Property foo is required but is missing.",
"instance": "https://example.com/error-log/abc123",
"status": 400,
"title": "Bad Request",
"type": "about:blank"
}

Creation retry refused

Media typeapplication/problem+json
object
code

Stable application error code; clients may also use the problem type suffix.

string
detail

A human-readable explanation specific to this occurrence of the problem.

string
errors

Optional list of individual error details

Array<object> | null
object
location

Where the error occurred, e.g. ‘body.items[3].tags’ or ‘path.thing-id’

string
message

Error message text

string
value

The value at the given location

key
additional properties
any
instance

A URI reference that identifies the specific occurrence of the problem.

string format: uri
params

Structured context for the stable error code.

object
key
additional properties
any
status

HTTP status code

integer format: int64
title

A short, human-readable summary of the problem type. This value should not change between occurrences of the error.

string
type

A URI reference to human-readable documentation for the error.

string format: uri
default: about:blank
violations
Array<object>
object
code
required
string
location
required
string
params
object
key
additional properties
any
key
additional properties
any
Example
{
"detail": "Property foo is required but is missing.",
"instance": "https://example.com/error-log/abc123",
"status": 400,
"title": "Bad Request",
"type": "about:blank"
}