openapi: 3.0.3
info:
title: 'PSI Backend API (2.0.0)'
description: 'This is the PSI Backend API Documentation.'
version: 1.0.0
servers:
-
url: 'https://api.psiproductfinder.de'
paths:
/v2/auth:
post:
summary: Authenticate
operationId: authenticate
description: "This endpoint allows you to authenticate and retrieve an access_token and a refresh_token.\nThe access_token must be included in the header of every API request to access protected resources.\nYou can log in using your standard PSI account credentials. However, to avoid potential issues caused by password changes of regular user accounts,\nwe strongly recommend creating a dedicated Sub-Account for API access. You can set up a Sub-Account in your PSI account settings (https://www.psi-network.de/)."
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
access_token: eyJ0eXAidemoV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwcLmRlIiwiYXVkIjoicHNpcHJvZHVjdansmRlci5kZSIsImp0adIeoQzNjMwIiwiaWF0IjoxNzM3MDE5NTQ2LjE2OTkyMiwibmJmIjoxNzM3MDE5NTQ2LjE2OTkyMiwiZXhwIjoxNzM3MDE5NTQ2LjE2OTkyMiwicGF5bG9hZCI6eyJwc2lubyI6NDM2MzAsInVzZXJfaWQiOjEyNDcyOSwiZ3JvdXBzIjoiMTQiLCJlbWFpbCI6ImZyYW5rQHJoZWluc2NoYWZlLmRlIn19
refresh_token: 07070512341eacdemo3a64267c377cdcf06501
expires_in: 1737019546
properties:
access_token:
type: string
example: eyJ0eXAidemoV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwcLmRlIiwiYXVkIjoicHNpcHJvZHVjdansmRlci5kZSIsImp0adIeoQzNjMwIiwiaWF0IjoxNzM3MDE5NTQ2LjE2OTkyMiwibmJmIjoxNzM3MDE5NTQ2LjE2OTkyMiwiZXhwIjoxNzM3MDE5NTQ2LjE2OTkyMiwicGF5bG9hZCI6eyJwc2lubyI6NDM2MzAsInVzZXJfaWQiOjEyNDcyOSwiZ3JvdXBzIjoiMTQiLCJlbWFpbCI6ImZyYW5rQHJoZWluc2NoYWZlLmRlIn19
refresh_token:
type: string
example: 07070512341eacdemo3a64267c377cdcf06501
expires_in:
type: integer
example: 1737019546
400:
description: ''
content:
application/json:
schema:
type: object
example:
errors: 'Username or Password is wrong.'
properties:
errors:
type: string
example: 'Username or Password is wrong.'
tags:
- Authentication
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
username:
type: string
description: 'Your Username - is the same as you login to other PSI Services (Productfinder, Network..), can be an E-Mail Adress or the PSI-Number.'
example: demo@psi-network.de
nullable: false
password:
type: string
description: 'Your Password.'
example: password
nullable: false
required:
- username
- password
security: []
/v2/refresh:
post:
summary: 'Refresh Token'
operationId: refreshToken
description: 'Your access_token is valid for the duration specified in the expires_in field of the authentication response (e.g., typically 1 hour). Once the token expires, you must generate a new one to continue accessing protected resources.'
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
access_token: eyJ0eXAidemoV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwcLmRlIiwiYXVkIjoicHNpcHJvZHVjdansmRlci5kZSIsImp0adIeoQzNjMwIiwiaWF0IjoxNzM3MDE5NTQ2LjE2OTkyMiwibmJmIjoxNzM3MDE5NTQ2LjE2OTkyMiwiZXhwIjoxNzM3MDE5NTQ2LjE2OTkyMiwicGF5bG9hZCI6eyJwc2lubyI6NDM2MzAsInVzZXJfaWQiOjEyNDcyOSwiZ3JvdXBzIjoiMTQiLCJlbWFpbCI6ImZyYW5rQHJoZWluc2NoYWZlLmRlIn19
expires_in: 1737020073
properties:
access_token:
type: string
example: eyJ0eXAidemoV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwcLmRlIiwiYXVkIjoicHNpcHJvZHVjdansmRlci5kZSIsImp0adIeoQzNjMwIiwiaWF0IjoxNzM3MDE5NTQ2LjE2OTkyMiwibmJmIjoxNzM3MDE5NTQ2LjE2OTkyMiwiZXhwIjoxNzM3MDE5NTQ2LjE2OTkyMiwicGF5bG9hZCI6eyJwc2lubyI6NDM2MzAsInVzZXJfaWQiOjEyNDcyOSwiZ3JvdXBzIjoiMTQiLCJlbWFpbCI6ImZyYW5rQHJoZWluc2NoYWZlLmRlIn19
expires_in:
type: integer
example: 1737020073
tags:
- Authentication
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
username:
type: string
description: 'Your E-Mail Adress or the PSI-Number, at the moment you can not use a sub account here.'
example: demo@psi-network.de
nullable: false
refresh_token:
type: string
description: 'Your refresh token.'
example: 07070512341eacdemo3a64267c377cdcf06501
nullable: false
required:
- username
- refresh_token
security: []
/v2/products:
get:
summary: 'Get Entities'
operationId: getEntities
description: 'The Get Entities endpoint allows you to retrieve all products associated with your PSI number. It returns all products that belong to your account, but you can customize the results using optional query parameters.'
parameters:
-
in: query
name: language
description: ''
example: en
required: false
schema:
type: string
description: ''
example: en
nullable: false
enum:
- de
- en
-
in: query
name: locale
description: ''
example: en
required: false
schema:
type: string
description: ''
example: en
nullable: false
enum:
- de
- en
-
in: query
name: filter
description: ''
example: outdated
required: false
schema:
type: string
description: ''
example: outdated
nullable: true
-
in: query
name: search
description: ''
example: Suchen
required: false
schema:
type: string
description: ''
example: Suchen
nullable: true
-
in: query
name: page
description: 'Must be at least 1.'
example: 1.0
required: false
schema:
type: number
description: 'Must be at least 1.'
example: 1.0
nullable: false
-
in: query
name: size
description: 'Must be at least 1. Must not be greater than 100.'
example: 24
required: false
schema:
type: number
description: 'Must be at least 1. Must not be greater than 100.'
example: 24
nullable: false
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
code: 200
status: OK
data: []
meta: { }
properties:
code:
type: integer
example: 200
status:
type: string
example: OK
data:
type: array
example: []
meta:
type: object
properties: { }
400:
description: ''
content:
application/json:
schema:
type: object
example:
code: '404'
status: 'Not found'
message: 'No products found.'
properties:
code:
type: string
example: '404'
status:
type: string
example: 'Not found'
message:
type: string
example: 'No products found.'
tags:
- 'Product Controller'
/v2/products/store:
post:
summary: 'Create Entity'
operationId: createEntity
description: "To create a variant or translation, simply post a payload containing the required parameters. If you specify a language other than the default (en), a new translation for the specified language will be added.
\n"
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
code: 200
status: OK
message: "Product with identifier 'v-1b93b0c9' has been successfully created."
data:
product_id: 9df97825-f13f-44b0-a20f-126b463d25eb
product_identifier: p-9a33ae89
selected_identifier: v-1b93b0c9
variant_id: 9df97825-f2c2-43ea-9f3d-e2b3c8a1ebf5
variant_identifier: v-1b93b0c9
master_article_number: 43630S31463938362D64424946456578573178
master_product_number: 1F986-dBIFEexW1x
available_translations:
- en
brand: null
certificates: []
color_description: null
colors: []
country_origin: null
delivery_information: null
delivery_time_max: null
delivery_time_min: null
description: null
ean_code: null
finishings_information: null
finishings: []
images: []
legal_information: null
made_in: null
material_description: null
materials: []
measurement_height: null
measurement_information: null
measurement_length: null
measurement_volume: null
measurement_width: null
minimum_order_amount: null
name: 'Demo Product'
packaging: null
price_ranges_information: null
price_ranges: []
product_groups: []
product_information: null
product_number: demo-001
stock_available: false
tags: null
target_group: null
video: null
weight_brutto: null
weight_netto: null
properties:
code:
type: integer
example: 200
status:
type: string
example: OK
message:
type: string
example: "Product with identifier 'v-1b93b0c9' has been successfully created."
data:
type: object
properties:
product_id:
type: string
example: 9df97825-f13f-44b0-a20f-126b463d25eb
product_identifier:
type: string
example: p-9a33ae89
selected_identifier:
type: string
example: v-1b93b0c9
variant_id:
type: string
example: 9df97825-f2c2-43ea-9f3d-e2b3c8a1ebf5
variant_identifier:
type: string
example: v-1b93b0c9
master_article_number:
type: string
example: 43630S31463938362D64424946456578573178
master_product_number:
type: string
example: 1F986-dBIFEexW1x
available_translations:
type: array
example:
- en
items:
type: string
brand:
type: string
example: null
certificates:
type: array
example: []
color_description:
type: string
example: null
colors:
type: array
example: []
country_origin:
type: string
example: null
delivery_information:
type: string
example: null
delivery_time_max:
type: string
example: null
delivery_time_min:
type: string
example: null
description:
type: string
example: null
ean_code:
type: string
example: null
finishings_information:
type: string
example: null
finishings:
type: array
example: []
images:
type: array
example: []
legal_information:
type: string
example: null
made_in:
type: string
example: null
material_description:
type: string
example: null
materials:
type: array
example: []
measurement_height:
type: string
example: null
measurement_information:
type: string
example: null
measurement_length:
type: string
example: null
measurement_volume:
type: string
example: null
measurement_width:
type: string
example: null
minimum_order_amount:
type: string
example: null
name:
type: string
example: 'Demo Product'
packaging:
type: string
example: null
price_ranges_information:
type: string
example: null
price_ranges:
type: array
example: []
product_groups:
type: array
example: []
product_information:
type: string
example: null
product_number:
type: string
example: demo-001
stock_available:
type: boolean
example: false
tags:
type: string
example: null
target_group:
type: string
example: null
video:
type: string
example: null
weight_brutto:
type: string
example: null
weight_netto:
type: string
example: null
400:
description: ''
content:
application/json:
schema:
type: object
example:
code: 400
status: 'Bad Request'
errors: []
properties:
code:
type: integer
example: 400
status:
type: string
example: 'Bad Request'
errors:
type: array
example: []
tags:
- 'Product Controller'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'The name of the entity.'
example: 'Demo Product'
nullable: false
product_number:
type: string
description: 'The product_number.'
example: demo-001
nullable: false
language:
type: enum
description: ''
example: en
nullable: false
enum:
- de
- en
locale:
type: enum
description: ''
example: en
nullable: false
enum:
- de
- en
master_product_number:
type: string
description: 'The master product number for creating a variant'
example: demo-001
nullable: false
brand:
type: string
description: ''
example: PSI-Demo
nullable: false
description:
type: string
description: ''
example: 'This is just a demo product'
nullable: false
tags:
type: string
description: ''
example: 'demo1, demo2'
nullable: false
ean_code:
type: string
description: ''
example: '1234567890'
nullable: false
product_groups:
type: array
description: 'Items Enum number of the PSI productgroup value'
example:
- '05138008'
- '08094001'
items:
type: string
certificates:
type: array
description: 'Items Enum of the PSI certificate code value'
example:
- CERT-04200000
items:
type: string
colors:
type: array
description: 'Items Enum of the PSI color groups value'
example:
- CG-BLAK5
items:
type: string
color_description:
type: string
description: ''
example: red
nullable: false
country_origin:
type: string
description: 'Item Enum of the PSI countries value'
example: CC-DE
nullable: false
made_in:
type: string
description: 'Item Enum of the PSI countries value'
example: CC-DE
nullable: false
images:
type: array
description: ''
example:
-
src: 'https://psiproductfinder.de/images/logo/logo.svg'
name: 'Demo logo image'
description: 'Custom description'
items:
type: string
delivery_time_max:
type: integer
description: ''
example: 3
nullable: false
delivery_time_min:
type: integer
description: ''
example: 1
nullable: false
finishings:
type: array
description: "Items Enum of the PSI finishing groups.
included is for this finishing method is included in the product's price."
example:
-
group: FG-APPN11
included: true
description: 'Demo application'
items:
type: string
finishings_information:
type: string
description: ''
example: 'Finishing information'
nullable: false
legal_information:
type: string
description: ''
example: 'Legal information'
nullable: false
material_description:
type: string
description: ''
example: 'Material description'
nullable: false
materials:
type: array
description: 'Items Enum of the PSI materials groups'
example:
- MG-ACRC7
items:
type: string
measurement_length:
type: integer
description: ''
example: 100
nullable: false
measurement_volume:
type: integer
description: ''
example: 10
nullable: false
measurement_height:
type: integer
description: ''
example: 150
nullable: false
measurement_width:
type: integer
description: ''
example: 135
nullable: false
measurement_information:
type: string
description: ''
example: 'Measurement information'
nullable: false
weight_netto:
type: integer
description: ''
example: 10
nullable: false
weight_brutto:
type: integer
description: ''
example: 13
nullable: false
minimum_order_amount:
type: integer
description: ''
example: 1
nullable: false
packaging:
type: integer
description: ''
example: 2
nullable: false
price_ranges:
type: array
description: ''
example:
-
amount: 1
price_ek: 1.5
price_uvp: 2
-
amount: 5
price_ek: 1
price_uvp: 1.5
items:
type: string
price_ranges_information:
type: string
description: ''
example: 'Price ranges information'
nullable: false
product_information:
type: string
description: ''
example: 'Product information'
nullable: false
stock_available:
type: boolean
description: 'Is this product is always in stock?'
example: true
nullable: false
delivery_information:
type: string
description: ''
example: 'Delivery information'
nullable: false
target_group:
type: string
description: ''
example: 'Target group'
nullable: false
video:
type: string
description: ''
example: 'https://www.youtube.com/watch?v=pCHJAj5oPu0'
nullable: false
required:
- name
- product_number
'/v2/products/{identifier}':
get:
summary: 'Get Entity'
operationId: getEntity
description: 'This endpoint is used to retrieve a specific product or variant. You can identify the entity using one of the following methods: Internal Identifier: A unique identifier generated from your master_product_number, PSI number, and product_number. Identifiers starting with p- refer to a master product, and identifiers starting with v- refer to a variant. Product Number: You can also use your custom product_number as an identifier. Note: If you request a master product (p-), the response will include all associated variants.'
parameters:
-
in: query
name: language
description: ''
example: en
required: false
schema:
type: string
description: ''
example: en
nullable: false
enum:
- de
- en
-
in: query
name: locale
description: ''
example: en
required: false
schema:
type: string
description: ''
example: en
nullable: false
enum:
- de
- en
responses:
400:
description: ''
content:
application/json:
schema:
type: object
example:
code: 400
status: 'Bad request'
properties:
code:
type: integer
example: 400
status:
type: string
example: 'Bad request'
404:
description: ''
content:
application/json:
schema:
type: object
example:
code: 404
status: 'Not found'
message: "No product found with identifier 'v-demo'."
properties:
code:
type: integer
example: 404
status:
type: string
example: 'Not found'
message:
type: string
example: "No product found with identifier 'v-demo'."
500:
description: ''
content:
application/json:
schema:
type: object
example:
message: 'Server Error'
properties:
message:
type: string
example: 'Server Error'
tags:
- 'Product Controller'
parameters:
-
in: path
name: identifier
description: 'Optional parameter. required.'
required: true
schema:
type: string
examples:
omitted:
summary: 'When the value is omitted'
value: ''
present:
summary: 'When the value is present'
value: p-c2a1cf5x
'/v2/products/update/{identifier}':
patch:
summary: 'Update Entity'
operationId: updateEntity
description: "To update variants and translations, you need to specify the variant_identifier (e.g., v-88c62663). For updating a translation, you must also include the language parameter.\n
All parameters available in the \"Create Entity\" endpoint can also be used when updating an entity, allowing for flexible modifications."
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
code: 200
status: OK
message: "Product with identifier 'v-88c62663' has been successfully updated."
data:
product_id: 9dfb33f7-03b7-4598-9178-9799e3710560
product_identifier: p-76ca02e6
selected_identifier: v-88c62663
variant_id: 9dfb33f7-061d-4737-93fb-71e62bc9b25d
variant_identifier: v-88c62663
master_article_number: 43630S64656D6F2D303031
master_product_number: 1F43C-UQlQJ9yMwQ
available_translations:
- en
brand: PSI-Demo
certificates:
-
group: CERT-04200000
label: 'Fair for life'
color_description: red
colors:
-
group: CG-BLAK5
label: Black
country_origin: null
delivery_information: 'Delivery information'
delivery_time_max: 3
delivery_time_min: 1
description: 'This is just a demo product - updated'
ean_code: '1234567890'
finishings_information: 'Finishing information'
finishings:
-
group: FG-APPN11
label: Application
description: 'Demo application'
included: true
images:
-
src: 'https://psiproductfinder.de/images/logo/logo.svg'
name: 'Demo logo image'
description: 'Custom description'
-
src: null
name: null
description: null
legal_information: 'Legal information'
made_in: null
material_description: 'Material description'
materials:
-
group: MG-ACRC7
label: Acrylic
measurement_height: 150
measurement_information: 'Measurement information'
measurement_length: 100
measurement_volume: '10.00'
measurement_width: 135
minimum_order_amount: 1
name: 'Demo Product updated'
packaging: 2
price_ranges_information: 'Price ranges information'
price_ranges:
-
amount: 1
price_ek: 1.5
price_uvp: 2
-
amount: 5
price_ek: 1
price_uvp: 1.5
product_groups:
-
label: 'Kitchen Items > Slicer'
group: '05138008'
-
label: 'Beverages > Beer'
group: '08094001'
product_information: 'Product information'
product_number: demo-001
stock_available: true
tags: 'demo1, demo2'
target_group: 'Target group'
video: 'https://www.youtube.com/watch?v=pCHJAj5oPu0'
weight_brutto: 13
weight_netto: 10
properties:
code:
type: integer
example: 200
status:
type: string
example: OK
message:
type: string
example: "Product with identifier 'v-88c62663' has been successfully updated."
data:
type: object
properties:
product_id:
type: string
example: 9dfb33f7-03b7-4598-9178-9799e3710560
product_identifier:
type: string
example: p-76ca02e6
selected_identifier:
type: string
example: v-88c62663
variant_id:
type: string
example: 9dfb33f7-061d-4737-93fb-71e62bc9b25d
variant_identifier:
type: string
example: v-88c62663
master_article_number:
type: string
example: 43630S64656D6F2D303031
master_product_number:
type: string
example: 1F43C-UQlQJ9yMwQ
available_translations:
type: array
example:
- en
items:
type: string
brand:
type: string
example: PSI-Demo
certificates:
type: array
example:
-
group: CERT-04200000
label: 'Fair for life'
items:
type: object
properties:
group:
type: string
example: CERT-04200000
label:
type: string
example: 'Fair for life'
color_description:
type: string
example: red
colors:
type: array
example:
-
group: CG-BLAK5
label: Black
items:
type: object
properties:
group:
type: string
example: CG-BLAK5
label:
type: string
example: Black
country_origin:
type: string
example: null
delivery_information:
type: string
example: 'Delivery information'
delivery_time_max:
type: integer
example: 3
delivery_time_min:
type: integer
example: 1
description:
type: string
example: 'This is just a demo product - updated'
ean_code:
type: string
example: '1234567890'
finishings_information:
type: string
example: 'Finishing information'
finishings:
type: array
example:
-
group: FG-APPN11
label: Application
description: 'Demo application'
included: true
items:
type: object
properties:
group:
type: string
example: FG-APPN11
label:
type: string
example: Application
description:
type: string
example: 'Demo application'
included:
type: boolean
example: true
images:
type: array
example:
-
src: 'https://psiproductfinder.de/images/logo/logo.svg'
name: 'Demo logo image'
description: 'Custom description'
-
src: null
name: null
description: null
items:
type: object
properties:
src:
type: string
example: 'https://psiproductfinder.de/images/logo/logo.svg'
name:
type: string
example: 'Demo logo image'
description:
type: string
example: 'Custom description'
legal_information:
type: string
example: 'Legal information'
made_in:
type: string
example: null
material_description:
type: string
example: 'Material description'
materials:
type: array
example:
-
group: MG-ACRC7
label: Acrylic
items:
type: object
properties:
group:
type: string
example: MG-ACRC7
label:
type: string
example: Acrylic
measurement_height:
type: integer
example: 150
measurement_information:
type: string
example: 'Measurement information'
measurement_length:
type: integer
example: 100
measurement_volume:
type: string
example: '10.00'
measurement_width:
type: integer
example: 135
minimum_order_amount:
type: integer
example: 1
name:
type: string
example: 'Demo Product updated'
packaging:
type: integer
example: 2
price_ranges_information:
type: string
example: 'Price ranges information'
price_ranges:
type: array
example:
-
amount: 1
price_ek: 1.5
price_uvp: 2
-
amount: 5
price_ek: 1
price_uvp: 1.5
items:
type: object
properties:
amount:
type: integer
example: 1
price_ek:
type: number
example: 1.5
price_uvp:
type: integer
example: 2
product_groups:
type: array
example:
-
label: 'Kitchen Items > Slicer'
group: '05138008'
-
label: 'Beverages > Beer'
group: '08094001'
items:
type: object
properties:
label:
type: string
example: 'Kitchen Items > Slicer'
group:
type: string
example: '05138008'
product_information:
type: string
example: 'Product information'
product_number:
type: string
example: demo-001
stock_available:
type: boolean
example: true
tags:
type: string
example: 'demo1, demo2'
target_group:
type: string
example: 'Target group'
video:
type: string
example: 'https://www.youtube.com/watch?v=pCHJAj5oPu0'
weight_brutto:
type: integer
example: 13
weight_netto:
type: integer
example: 10
400:
description: ''
content:
application/json:
schema:
type: object
example:
code: 400
status: 'Bad Request'
message: []
properties:
code:
type: integer
example: 400
status:
type: string
example: 'Bad Request'
message:
type: array
example: []
404:
description: ''
content:
application/json:
schema:
type: object
example:
code: 404
status: 'Not found'
message: "No product found with identifier 'sapiente'."
properties:
code:
type: integer
example: 404
status:
type: string
example: 'Not found'
message:
type: string
example: "No product found with identifier 'sapiente'."
tags:
- 'Product Controller'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'The name of the entity.'
example: 'Demo Product updated'
nullable: false
language:
type: enum
description: ''
example: en
nullable: false
enum:
- de
- en
locale:
type: enum
description: ''
example: en
nullable: false
enum:
- de
- en
description:
type: string
description: ''
example: 'This is just a demo product - updated'
nullable: false
parameters:
-
in: path
name: identifier
description: 'Optional parameter.'
required: true
schema:
type: string
examples:
omitted:
summary: 'When the value is omitted'
value: ''
present:
summary: 'When the value is present'
value: v-88c62663
'/v2/products/delete/{identifier}':
delete:
summary: 'Delete Entity'
operationId: deleteEntity
description: 'To delete a variant, translation, or product, you need to provide the identifier (e.g., p-88c62663 for a product or v-88c62663 for a variant). If you want to delete a translation in a language other than the default (English), you must also specify the language parameter.'
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
code: 200
status: success
message: "Product with identifier ':identifier' has been successfully deleted."
properties:
code:
type: integer
example: 200
status:
type: string
example: success
message:
type: string
example: "Product with identifier ':identifier' has been successfully deleted."
404:
description: ''
content:
application/json:
schema:
type: object
example:
code: '404'
status: 'Not found'
message: "No translation found for the product with identifier 'v-88c62663' in locale 'en'."
properties:
code:
type: string
example: '404'
status:
type: string
example: 'Not found'
message:
type: string
example: "No translation found for the product with identifier 'v-88c62663' in locale 'en'."
tags:
- 'Product Controller'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
language:
type: enum
description: 'Must be one of: