Авторизация
x-hallify-widget-context: <HALLIFY_STOREFRONT_WIDGET_CONTEXT>Краткосрочный server-authenticated widget presentation proof. Связывает настроенный frame origin с точными проверенными parent binding и connection authority. Новый widget-спрос требует этот proof; существующие native capabilities сохраняют отдельные права и исходные сроки.
Параметры
publicHandleПуть · ОбязательноТекущий публичный handle канала предзаказов Hallify.
stringПолное определение
{ "type": "string", "minLength": 3, "maxLength": 48, "pattern": "^[a-z0-9][a-z0-9-]{2,47}$", "example": "example" }serviceModeПараметр запроса · ОбязательноРежим планового обслуживания Hallify. Обслуживание в зале и ASAP исключены.
stringПолное определение
{ "type": "string", "enum": [ "PICKUP", "DELIVERY", "CATERING" ], "example": "PICKUP" }fromПараметр запроса · ОбязательноНачало окна включительно в RFC 3339 с явным смещением UTC.
string · date-timeПолное определение
{ "maxLength": 64, "format": "date-time", "example": "2026-12-31T10:00:00.000Z", "type": "string" }toПараметр запроса · ОбязательноВерхняя граница начала слотов в RFC 3339 с явным смещением UTC; сама граница не включается. Она должна быть позже from, но не более чем на семь суток. Выбранный слот может закончиться позже этой границы.
string · date-timeПолное определение
{ "maxLength": 64, "format": "date-time", "example": "2026-12-31T12:00:00.000Z", "type": "string" }partySizeПараметр запроса · ОбязательноЧисло гостей для проверки политики вместимости Hallify.
integerПолное определение
{ "minimum": 1, "maximum": 10000, "type": "integer", "example": 1 }originЗаголовок · ОбязательноФактический Origin браузера, разрешённый как канонический Hallify либо точным текущим Storefront PREORDER Resource. Widget-запросы используют изолированный frame Origin и подписанный context. Отсутствующий или несовпавший Origin отклоняется.
stringПолное определение
{ "type": "string", "maxLength": 2048, "example": "https://hallify.co" }x-hallify-connection-idЗаголовок · НеобязательноНесекретный идентификатор connection в Storefront. Если передан, точное представление проверяется даже на основном Origin; сам идентификатор не предоставляет доступ.
stringПолное определение
{ "type": "string", "minLength": 1, "maxLength": 64, "pattern": "^[A-Za-z0-9_-]{1,64}$", "example": "example" }
Ответы
200Полный ограниченный список слотов и определённый сервером контекст заведения и канала.
Полное определение
{
"$ref": "#/components/schemas/PublicPreorderAvailabilityDto"
}{
"publicHandle": "example",
"venueId": "0604de3a-da74-4ad5-89f6-2dfe000d5391",
"salesChannelId": "ff0fa725-ba44-4e7a-82bb-a15650e0a0cc",
"timeZone": "Asia/Tbilisi",
"currency": "GEL",
"serviceMode": "PICKUP",
"partySize": 1,
"from": "2026-12-31T10:00:00.000Z",
"to": "2026-12-31T12:00:00.000Z",
"generatedAt": "2026-12-30T10:00:00.000Z",
"slots": [
{
"startsAt": "2026-12-31T10:00:00.000Z",
"endsAt": "2026-12-31T10:30:00.000Z",
"available": true
}
]
}400Некорректный запрос или неподдерживаемое окно времени. Код доменной ошибки: PREORDER_PUBLIC_AVAILABILITY_INVALID; стандартная проверка DTO также возвращает 400.
Полное определение
{
"$ref": "#/components/schemas/TranslatedErrorDto"
}{
"statusCode": 400,
"error": "errors:http.badRequest",
"code": "HTTP_BAD_REQUEST",
"message": "errors:http.badRequest",
"translationKey": "errors:http.badRequest"
}404Недоступен канал Hallify, активный канал продаж либо текущий доступ представления. Коды ошибок: PREORDER_PUBLIC_RESOURCE_NOT_FOUND, STOREFRONT_PRESENTATION_UNAVAILABLE.
Полное определение
{
"$ref": "#/components/schemas/TranslatedErrorDto"
}{
"statusCode": 404,
"error": "errors:http.notFound",
"code": "HTTP_NOT_FOUND",
"message": "errors:http.notFound",
"translationKey": "errors:http.notFound"
}429Достигнут лимит публичных запросов. Код ошибки: RATE_LIMITED. Оставшееся время ожидания указано в Retry-After.
Заголовки ответа
Retry-AfterЦелое количество секунд ожидания перед повтором отклонённого запроса.
integerПолное определение
{
"type": "integer",
"minimum": 1,
"example": 60
}Полное определение
{
"$ref": "#/components/schemas/TranslatedErrorDto"
}{
"statusCode": 429,
"error": "errors:http.tooManyRequests",
"code": "HTTP_TOO_MANY_REQUESTS",
"message": "errors:http.tooManyRequests",
"translationKey": "errors:http.tooManyRequests"
}503Невозможно безопасно спроецировать нативную политику или ограниченную группу слотов либо недоступна конфигурация widget authority. Коды: PREORDER_PUBLIC_AVAILABILITY_UNAVAILABLE, STOREFRONT_WIDGET_UNAVAILABLE.
Полное определение
{
"$ref": "#/components/schemas/TranslatedErrorDto"
}{
"statusCode": 503,
"error": "errors:http.serviceUnavailable",
"code": "HTTP_SERVICE_UNAVAILABLE",
"message": "errors:http.serviceUnavailable",
"translationKey": "errors:http.serviceUnavailable"
}Схемы
PublicPreorderAvailabilityDto
Ограниченный публичный список слотов для фактического канала предзаказов Hallify с учётом текущего доступа представления.
deliveryMethodsНеобязательноДоступные сейчас способы доставки заведения для DELIVERY; для других режимов список пуст. Выбор способа не резервирует предложение провайдера.
arrayПолное определение
{ "type": "array", "maxItems": 3, "description": "Доступные сейчас способы доставки заведения для DELIVERY; для других режимов список пуст. Выбор способа не резервирует предложение провайдера.", "items": { "type": "string", "enum": [ "SELF", "UBER_DIRECT", "WOLT_DRIVE" ], "example": "SELF" }, "example": [ "SELF" ] }publicHandleОбязательноТекущий публичный handle канала предзаказов Hallify.
stringПолное определение
{ "type": "string", "minLength": 3, "maxLength": 48, "description": "Текущий публичный handle канала предзаказов Hallify.", "example": "example" }venueIdОбязательноОпределённый сервером UUID заведения, которому принадлежит канал.
string · uuidПолное определение
{ "type": "string", "format": "uuid", "description": "Определённый сервером UUID заведения, которому принадлежит канал.", "example": "0604de3a-da74-4ad5-89f6-2dfe000d5391" }salesChannelIdОбязательноОпределённый сервером UUID активного канала продаж.
string · uuidПолное определение
{ "type": "string", "format": "uuid", "description": "Определённый сервером UUID активного канала продаж.", "example": "ff0fa725-ba44-4e7a-82bb-a15650e0a0cc" }timeZoneОбязательноЧасовой пояс заведения в формате IANA для всех расчётов слотов.
stringПолное определение
{ "type": "string", "description": "Часовой пояс заведения в формате IANA для всех расчётов слотов.", "example": "Asia/Tbilisi" }currencyОбязательноОпределённая сервером валюта заведения. Ответ не содержит цен.
stringПолное определение
{ "type": "string", "pattern": "^[A-Z]{3}$", "description": "Определённая сервером валюта заведения. Ответ не содержит цен.", "example": "GEL" }serviceModeОбязательноРежим планового обслуживания, проверенный соответствующим доменом Hallify.
stringПолное определение
{ "type": "string", "enum": [ "PICKUP", "DELIVERY", "CATERING" ], "description": "Режим планового обслуживания, проверенный соответствующим доменом Hallify.", "example": "PICKUP" }partySizeОбязательноЧисло гостей, проверенное соответствующим доменом Hallify.
integerПолное определение
{ "type": "integer", "minimum": 1, "maximum": 10000, "description": "Число гостей, проверенное соответствующим доменом Hallify.", "example": 1 }fromОбязательноНижняя граница начала слотов включительно в UTC.
string · date-timeПолное определение
{ "type": "string", "format": "date-time", "description": "Нижняя граница начала слотов включительно в UTC.", "example": "2026-12-31T10:00:00.000Z" }toОбязательноВерхняя граница начала слотов в UTC; сама граница не включается. Выбранный слот может закончиться позже.
string · date-timeПолное определение
{ "type": "string", "format": "date-time", "description": "Верхняя граница начала слотов в UTC; сама граница не включается. Выбранный слот может закончиться позже.", "example": "2026-12-31T12:00:00.000Z" }generatedAtОбязательноЕдиное серверное время для проверки истечения срока и минимального времени подготовки.
string · date-timeПолное определение
{ "type": "string", "format": "date-time", "description": "Единое серверное время для проверки истечения срока и минимального времени подготовки.", "example": "2026-12-30T10:00:00.000Z" }slotsОбязательноПолный хронологический список слотов для ограниченного окна. Превышение лимита исходных данных или результатов вызывает отказ вместо возврата усечённого списка.
arrayПолное определение
{ "maxItems": 500, "description": "Полный хронологический список слотов для ограниченного окна. Превышение лимита исходных данных или результатов вызывает отказ вместо возврата усечённого списка.", "type": "array", "items": { "$ref": "#/components/schemas/PublicPreorderSlotChoiceDto" }, "example": [ { "startsAt": "2026-12-31T10:00:00.000Z", "endsAt": "2026-12-31T10:30:00.000Z", "available": true } ] }
Полное определение
{
"type": "object",
"properties": {
"deliveryMethods": {
"type": "array",
"maxItems": 3,
"description": "Доступные сейчас способы доставки заведения для DELIVERY; для других режимов список пуст. Выбор способа не резервирует предложение провайдера.",
"items": {
"type": "string",
"enum": [
"SELF",
"UBER_DIRECT",
"WOLT_DRIVE"
],
"example": "SELF"
},
"example": [
"SELF"
]
},
"publicHandle": {
"type": "string",
"minLength": 3,
"maxLength": 48,
"description": "Текущий публичный handle канала предзаказов Hallify.",
"example": "example"
},
"venueId": {
"type": "string",
"format": "uuid",
"description": "Определённый сервером UUID заведения, которому принадлежит канал.",
"example": "0604de3a-da74-4ad5-89f6-2dfe000d5391"
},
"salesChannelId": {
"type": "string",
"format": "uuid",
"description": "Определённый сервером UUID активного канала продаж.",
"example": "ff0fa725-ba44-4e7a-82bb-a15650e0a0cc"
},
"timeZone": {
"type": "string",
"description": "Часовой пояс заведения в формате IANA для всех расчётов слотов.",
"example": "Asia/Tbilisi"
},
"currency": {
"type": "string",
"pattern": "^[A-Z]{3}$",
"description": "Определённая сервером валюта заведения. Ответ не содержит цен.",
"example": "GEL"
},
"serviceMode": {
"type": "string",
"enum": [
"PICKUP",
"DELIVERY",
"CATERING"
],
"description": "Режим планового обслуживания, проверенный соответствующим доменом Hallify.",
"example": "PICKUP"
},
"partySize": {
"type": "integer",
"minimum": 1,
"maximum": 10000,
"description": "Число гостей, проверенное соответствующим доменом Hallify.",
"example": 1
},
"from": {
"type": "string",
"format": "date-time",
"description": "Нижняя граница начала слотов включительно в UTC.",
"example": "2026-12-31T10:00:00.000Z"
},
"to": {
"type": "string",
"format": "date-time",
"description": "Верхняя граница начала слотов в UTC; сама граница не включается. Выбранный слот может закончиться позже.",
"example": "2026-12-31T12:00:00.000Z"
},
"generatedAt": {
"type": "string",
"format": "date-time",
"description": "Единое серверное время для проверки истечения срока и минимального времени подготовки.",
"example": "2026-12-30T10:00:00.000Z"
},
"slots": {
"maxItems": 500,
"description": "Полный хронологический список слотов для ограниченного окна. Превышение лимита исходных данных или результатов вызывает отказ вместо возврата усечённого списка.",
"type": "array",
"items": {
"$ref": "#/components/schemas/PublicPreorderSlotChoiceDto"
},
"example": [
{
"startsAt": "2026-12-31T10:00:00.000Z",
"endsAt": "2026-12-31T10:30:00.000Z",
"available": true
}
]
}
},
"description": "Ограниченный публичный список слотов для фактического канала предзаказов Hallify с учётом текущего доступа представления.",
"required": [
"publicHandle",
"venueId",
"salesChannelId",
"timeZone",
"currency",
"serviceMode",
"partySize",
"from",
"to",
"generatedAt",
"slots"
],
"example": {
"publicHandle": "example",
"venueId": "0604de3a-da74-4ad5-89f6-2dfe000d5391",
"salesChannelId": "ff0fa725-ba44-4e7a-82bb-a15650e0a0cc",
"timeZone": "Asia/Tbilisi",
"currency": "GEL",
"serviceMode": "PICKUP",
"partySize": 1,
"from": "2026-12-31T10:00:00.000Z",
"to": "2026-12-31T12:00:00.000Z",
"generatedAt": "2026-12-30T10:00:00.000Z",
"slots": [
{
"startsAt": "2026-12-31T10:00:00.000Z",
"endsAt": "2026-12-31T10:30:00.000Z",
"available": true
}
]
}
}PublicPreorderSlotChoiceDto
Слот планового обслуживания без внутренних данных о вместимости.
startsAtОбязательноНачало слота Hallify включительно в UTC.
string · date-timeПолное определение
{ "type": "string", "format": "date-time", "description": "Начало слота Hallify включительно в UTC.", "example": "2026-12-31T10:00:00.000Z" }endsAtОбязательноКонец слота Hallify в UTC, не включаемый в слот.
string · date-timeПолное определение
{ "type": "string", "format": "date-time", "description": "Конец слота Hallify в UTC, не включаемый в слот.", "example": "2026-12-31T10:30:00.000Z" }availableОбязательноДопускает ли общая вместимость заведения указанное число гостей сейчас. Чтение не резервирует вместимость; расчёт дополнительно проверяет корзину и зону доставки.
booleanПолное определение
{ "type": "boolean", "description": "Допускает ли общая вместимость заведения указанное число гостей сейчас. Чтение не резервирует вместимость; расчёт дополнительно проверяет корзину и зону доставки.", "example": true }
Полное определение
{
"type": "object",
"properties": {
"startsAt": {
"type": "string",
"format": "date-time",
"description": "Начало слота Hallify включительно в UTC.",
"example": "2026-12-31T10:00:00.000Z"
},
"endsAt": {
"type": "string",
"format": "date-time",
"description": "Конец слота Hallify в UTC, не включаемый в слот.",
"example": "2026-12-31T10:30:00.000Z"
},
"available": {
"type": "boolean",
"description": "Допускает ли общая вместимость заведения указанное число гостей сейчас. Чтение не резервирует вместимость; расчёт дополнительно проверяет корзину и зону доставки.",
"example": true
}
},
"description": "Слот планового обслуживания без внутренних данных о вместимости.",
"required": [
"startsAt",
"endsAt",
"available"
],
"example": {
"startsAt": "2026-12-31T10:00:00.000Z",
"endsAt": "2026-12-31T10:30:00.000Z",
"available": true
}
}TranslatedErrorDto
Стабильная оболочка ошибки общего обработчика HTTP-исключений. Дополнительные машинные данные домена вложены в details.
statusCodeОбязательноHTTP-статус, повторённый из ответа.
integerПолное определение
{ "type": "integer", "description": "HTTP-статус, повторённый из ответа.", "example": 400 }errorОбязательноКлюч перевода HTTP-категории, например errors:http.conflict. Конкретную причину определяют code и translationKey.
stringПолное определение
{ "type": "string", "description": "Ключ перевода HTTP-категории, например errors:http.conflict. Конкретную причину определяют code и translationKey.", "example": "errors.request.invalid" }codeОбязательноСтабильный машинный код домена либо стандартный HTTP_*, если доменный код не задан. Используйте это поле и HTTP-статус для программной логики; локализованная формулировка не управляет повторами или бизнес-решениями.
stringПолное определение
{ "type": "string", "example": "HTTP_BAD_REQUEST", "description": "Стабильный машинный код домена либо стандартный HTTP_*, если доменный код не задан. Используйте это поле и HTTP-статус для программной логики; локализованная формулировка не управляет повторами или бизнес-решениями." }messageОбязательноКлюч перевода, идентичный translationKey. API не возвращает локализованный текст интерфейса. Найдите перевод ключа и подставьте translationValues в приложении-потребителе.
stringПолное определение
{ "type": "string", "example": "errors:http.badRequest", "description": "Ключ перевода, идентичный translationKey. API не возвращает локализованный текст интерфейса. Найдите перевод ключа и подставьте translationValues в приложении-потребителе." }translationKeyОбязательноКанонический ключ перевода, идентичный message. Ключи errors:http.* соответствующего статуса описывают неуточнённые ошибки. Публичные ключи и пояснения EN/RU перечислены в Developers; неизвестный ключ требует локализованного запасного сообщения в клиенте.
stringПолное определение
{ "type": "string", "example": "errors:http.badRequest", "description": "Канонический ключ перевода, идентичный message. Ключи errors:http.* соответствующего статуса описывают неуточнённые ошибки. Публичные ключи и пояснения EN/RU перечислены в Developers; неизвестный ключ требует локализованного запасного сообщения в клиенте." }translationValuesНеобязательноНеобязательные скалярные значения параметров шаблона перевода. Обрабатывайте их как данные, экранируйте при отображении и никогда не используйте как настройки переводчика.
objectПолное определение
{ "type": "object", "additionalProperties": { "oneOf": [ { "type": "string", "example": "example" }, { "type": "number", "example": 0 }, { "type": "boolean", "example": true } ], "example": "example" }, "description": "Необязательные скалярные значения параметров шаблона перевода. Обрабатывайте их как данные, экранируйте при отображении и никогда не используйте как настройки переводчика.", "example": { "exampleKey": "example" } }validationErrorsНеобязательноОшибки проверки полей с ключами переводов и стабильными кодами валидаторов. Введённые значения и исходные тексты валидаторов не включаются.
arrayПолное определение
{ "description": "Ошибки проверки полей с ключами переводов и стабильными кодами валидаторов. Введённые значения и исходные тексты валидаторов не включаются.", "type": "array", "items": { "$ref": "#/components/schemas/ValidationErrorDto" }, "example": [ { "field": "email", "translationKey": "validation:isEmail", "code": "isEmail", "message": "validation:isEmail" } ] }detailsНеобязательноНеобязательные сведения о доменных препятствиях или ошибках валидации.
oneOfПолное определение
{ "description": "Необязательные сведения о доменных препятствиях или ошибках валидации.", "oneOf": [ { "type": "array", "items": { "$ref": "#/components/schemas/JsonValue" }, "example": [ "example" ] }, { "type": "object", "additionalProperties": { "$ref": "#/components/schemas/JsonValue" }, "example": { "exampleKey": "example" } } ], "example": [ "example" ] }
Полное определение
{
"type": "object",
"properties": {
"statusCode": {
"type": "integer",
"description": "HTTP-статус, повторённый из ответа.",
"example": 400
},
"error": {
"type": "string",
"description": "Ключ перевода HTTP-категории, например errors:http.conflict. Конкретную причину определяют code и translationKey.",
"example": "errors.request.invalid"
},
"code": {
"type": "string",
"example": "HTTP_BAD_REQUEST",
"description": "Стабильный машинный код домена либо стандартный HTTP_*, если доменный код не задан. Используйте это поле и HTTP-статус для программной логики; локализованная формулировка не управляет повторами или бизнес-решениями."
},
"message": {
"type": "string",
"example": "errors:http.badRequest",
"description": "Ключ перевода, идентичный translationKey. API не возвращает локализованный текст интерфейса. Найдите перевод ключа и подставьте translationValues в приложении-потребителе."
},
"translationKey": {
"type": "string",
"example": "errors:http.badRequest",
"description": "Канонический ключ перевода, идентичный message. Ключи errors:http.* соответствующего статуса описывают неуточнённые ошибки. Публичные ключи и пояснения EN/RU перечислены в Developers; неизвестный ключ требует локализованного запасного сообщения в клиенте."
},
"translationValues": {
"type": "object",
"additionalProperties": {
"oneOf": [
{
"type": "string",
"example": "example"
},
{
"type": "number",
"example": 0
},
{
"type": "boolean",
"example": true
}
],
"example": "example"
},
"description": "Необязательные скалярные значения параметров шаблона перевода. Обрабатывайте их как данные, экранируйте при отображении и никогда не используйте как настройки переводчика.",
"example": {
"exampleKey": "example"
}
},
"validationErrors": {
"description": "Ошибки проверки полей с ключами переводов и стабильными кодами валидаторов. Введённые значения и исходные тексты валидаторов не включаются.",
"type": "array",
"items": {
"$ref": "#/components/schemas/ValidationErrorDto"
},
"example": [
{
"field": "email",
"translationKey": "validation:isEmail",
"code": "isEmail",
"message": "validation:isEmail"
}
]
},
"details": {
"description": "Необязательные сведения о доменных препятствиях или ошибках валидации.",
"oneOf": [
{
"type": "array",
"items": {
"$ref": "#/components/schemas/JsonValue"
},
"example": [
"example"
]
},
{
"type": "object",
"additionalProperties": {
"$ref": "#/components/schemas/JsonValue"
},
"example": {
"exampleKey": "example"
}
}
],
"example": [
"example"
]
}
},
"required": [
"statusCode",
"error",
"code",
"message",
"translationKey"
],
"description": "Стабильная оболочка ошибки общего обработчика HTTP-исключений. Дополнительные машинные данные домена вложены в details.",
"example": {
"statusCode": 400,
"error": "errors:http.badRequest",
"code": "HTTP_BAD_REQUEST",
"message": "errors:http.badRequest",
"translationKey": "errors:http.badRequest"
}
}ValidationErrorDto
Ошибка проверки поля с путём поля, стабильным кодом валидатора и ключом перевода. Человекочитаемый текст принадлежит приложению-потребителю.
fieldОбязательноПубличный путь поля. Вложенные свойства и индексы массива разделены точками.
stringПолное определение
{ "type": "string", "example": "email", "description": "Публичный путь поля. Вложенные свойства и индексы массива разделены точками." }translationKeyОбязательноКлюч перевода этого валидатора, идентичный message. Найдите его в клиентском словаре; см. публичный каталог ошибок Developers.
stringПолное определение
{ "type": "string", "example": "validation:isEmail", "description": "Ключ перевода этого валидатора, идентичный message. Найдите его в клиентском словаре; см. публичный каталог ошибок Developers." }codeОбязательноСтабильный идентификатор валидатора для ошибки поля. Пользовательские валидаторы могут определять дополнительные идентификаторы.
stringПолное определение
{ "type": "string", "example": "isEmail", "description": "Стабильный идентификатор валидатора для ошибки поля. Пользовательские валидаторы могут определять дополнительные идентификаторы." }messageОбязательноКлюч перевода, описывающий ошибку проверки поля, идентичный translationKey. Введённые значения и тексты валидаторов не включаются.
stringПолное определение
{ "type": "string", "example": "validation:isEmail", "description": "Ключ перевода, описывающий ошибку проверки поля, идентичный translationKey. Введённые значения и тексты валидаторов не включаются." }translationValuesНеобязательноНеобязательные скалярные значения параметров шаблона перевода. Обрабатывайте их как данные, экранируйте при отображении и никогда не используйте как настройки переводчика.
objectПолное определение
{ "type": "object", "additionalProperties": { "oneOf": [ { "type": "string", "example": "example" }, { "type": "number", "example": 0 }, { "type": "boolean", "example": true } ], "example": "example" }, "description": "Необязательные скалярные значения параметров шаблона перевода. Обрабатывайте их как данные, экранируйте при отображении и никогда не используйте как настройки переводчика.", "example": { "exampleKey": "example" } }
Полное определение
{
"type": "object",
"properties": {
"field": {
"type": "string",
"example": "email",
"description": "Публичный путь поля. Вложенные свойства и индексы массива разделены точками."
},
"translationKey": {
"type": "string",
"example": "validation:isEmail",
"description": "Ключ перевода этого валидатора, идентичный message. Найдите его в клиентском словаре; см. публичный каталог ошибок Developers."
},
"code": {
"type": "string",
"example": "isEmail",
"description": "Стабильный идентификатор валидатора для ошибки поля. Пользовательские валидаторы могут определять дополнительные идентификаторы."
},
"message": {
"type": "string",
"example": "validation:isEmail",
"description": "Ключ перевода, описывающий ошибку проверки поля, идентичный translationKey. Введённые значения и тексты валидаторов не включаются."
},
"translationValues": {
"type": "object",
"additionalProperties": {
"oneOf": [
{
"type": "string",
"example": "example"
},
{
"type": "number",
"example": 0
},
{
"type": "boolean",
"example": true
}
],
"example": "example"
},
"description": "Необязательные скалярные значения параметров шаблона перевода. Обрабатывайте их как данные, экранируйте при отображении и никогда не используйте как настройки переводчика.",
"example": {
"exampleKey": "example"
}
}
},
"required": [
"field",
"translationKey",
"code",
"message"
],
"description": "Ошибка проверки поля с путём поля, стабильным кодом валидатора и ключом перевода. Человекочитаемый текст принадлежит приложению-потребителю.",
"example": {
"field": "email",
"translationKey": "validation:isEmail",
"code": "isEmail",
"message": "validation:isEmail"
}
}JsonValue
Рекурсивно допустимое JSON-значение. Используется только там, где контракт явно разрешает произвольные структурированные данные.
Полное определение
{
"oneOf": [
{
"type": "string",
"nullable": true,
"example": "example"
},
{
"type": "number",
"example": 0
},
{
"type": "boolean",
"example": true
},
{
"type": "array",
"items": {
"$ref": "#/components/schemas/JsonValue"
},
"example": [
"example"
]
},
{
"type": "object",
"additionalProperties": {
"$ref": "#/components/schemas/JsonValue"
},
"example": {
"exampleKey": "example"
}
}
],
"description": "Рекурсивно допустимое JSON-значение. Используется только там, где контракт явно разрешает произвольные структурированные данные.",
"example": "example"
}