Authentication
x-hallify-widget-context: <HALLIFY_STOREFRONT_WIDGET_CONTEXT>Short-lived server-authenticated widget presentation proof. It binds the configured frame origin to the exact verified parent binding and connection authority. Widget new demand requires this proof; existing native capabilities remain separate and retain their original authority and deadlines.
Parameters
publicHandlePath · RequiredCurrent native preorder public discovery handle.
stringFull definition
{ "type": "string", "minLength": 3, "maxLength": 48, "pattern": "^[a-z0-9][a-z0-9-]{2,47}$", "example": "example" }serviceModeQuery · RequiredScheduled native fulfillment mode. Dine-in and ASAP are excluded.
stringFull definition
{ "type": "string", "enum": [ "PICKUP", "DELIVERY", "CATERING" ], "example": "PICKUP" }fromQuery · RequiredInclusive RFC 3339 start instant with an explicit UTC offset.
string · date-timeFull definition
{ "maxLength": 64, "format": "date-time", "example": "2026-12-31T10:00:00.000Z", "type": "string" }toQuery · RequiredExclusive RFC 3339 upper bound for slot starts, with an explicit UTC offset, later than from and at most 7 elapsed days after it. A selected slot can end after this bound.
string · date-timeFull definition
{ "maxLength": 64, "format": "date-time", "example": "2026-12-31T12:00:00.000Z", "type": "string" }partySizeQuery · RequiredRequested party size used by the native fulfillment capacity policy.
integerFull definition
{ "minimum": 1, "maximum": 10000, "type": "integer", "example": 1 }originHeader · RequiredActual browser Origin authorized as canonical Hallify or by the exact current Storefront PREORDER Resource. Widget requests use the isolated frame Origin and signed widget context. Missing or mismatched Origin fails closed.
stringFull definition
{ "type": "string", "maxLength": 2048, "example": "https://hallify.co" }x-hallify-connection-idHeader · OptionalNonsecret Storefront connection locator. When supplied, the exact presentation is checked even on the canonical Origin; this value grants no authority.
stringFull definition
{ "type": "string", "minLength": 1, "maxLength": 64, "pattern": "^[A-Za-z0-9_-]{1,64}$", "example": "example" }
Responses
200Complete bounded slot choices and server-resolved venue/channel context.
Full definition
{
"$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
}
]
}400Malformed query or unsupported time window. Domain error code: PREORDER_PUBLIC_AVAILABILITY_INVALID; standard DTO validation also returns 400.
Full definition
{
"$ref": "#/components/schemas/TranslatedErrorDto"
}{
"statusCode": 400,
"error": "errors:http.badRequest",
"code": "HTTP_BAD_REQUEST",
"message": "errors:http.badRequest",
"translationKey": "errors:http.badRequest"
}404Native channel, active sales channel or current presentation authority is unavailable. Error codes: PREORDER_PUBLIC_RESOURCE_NOT_FOUND, STOREFRONT_PRESENTATION_UNAVAILABLE.
Full definition
{
"$ref": "#/components/schemas/TranslatedErrorDto"
}{
"statusCode": 404,
"error": "errors:http.notFound",
"code": "HTTP_NOT_FOUND",
"message": "errors:http.notFound",
"translationKey": "errors:http.notFound"
}429The public discovery rate limit was reached. Error code: RATE_LIMITED. Retry-After gives the remaining delay.
Response headers
Retry-AfterWhole seconds the client must wait before retrying the rejected request.
integerFull definition
{
"type": "integer",
"minimum": 1,
"example": 60
}Full definition
{
"$ref": "#/components/schemas/TranslatedErrorDto"
}{
"statusCode": 429,
"error": "errors:http.tooManyRequests",
"code": "HTTP_TOO_MANY_REQUESTS",
"message": "errors:http.tooManyRequests",
"translationKey": "errors:http.tooManyRequests"
}503The native policy or bounded slot cohort cannot be safely projected, or widget authority configuration is unavailable. Error codes: PREORDER_PUBLIC_AVAILABILITY_UNAVAILABLE, STOREFRONT_WIDGET_UNAVAILABLE.
Full definition
{
"$ref": "#/components/schemas/TranslatedErrorDto"
}{
"statusCode": 503,
"error": "errors:http.serviceUnavailable",
"code": "HTTP_SERVICE_UNAVAILABLE",
"message": "errors:http.serviceUnavailable",
"translationKey": "errors:http.serviceUnavailable"
}Schemas
PublicPreorderAvailabilityDto
Bounded public slot choices under the actual native preorder channel and current presentation authority.
deliveryMethodsOptionalCurrently usable venue delivery methods for DELIVERY; empty for other service modes. A method choice does not reserve a provider quote.
arrayFull definition
{ "type": "array", "maxItems": 3, "description": "Currently usable venue delivery methods for DELIVERY; empty for other service modes. A method choice does not reserve a provider quote.", "items": { "type": "string", "enum": [ "SELF", "UBER_DIRECT", "WOLT_DRIVE" ], "example": "SELF" }, "example": [ "SELF" ] }publicHandleRequiredCurrent native preorder public discovery handle.
stringFull definition
{ "type": "string", "minLength": 3, "maxLength": 48, "description": "Current native preorder public discovery handle.", "example": "example" }venueIdRequiredServer-resolved venue UUID owning the channel.
string · uuidFull definition
{ "type": "string", "format": "uuid", "description": "Server-resolved venue UUID owning the channel.", "example": "0604de3a-da74-4ad5-89f6-2dfe000d5391" }salesChannelIdRequiredServer-resolved active sales channel UUID.
string · uuidFull definition
{ "type": "string", "format": "uuid", "description": "Server-resolved active sales channel UUID.", "example": "ff0fa725-ba44-4e7a-82bb-a15650e0a0cc" }timeZoneRequiredVenue IANA timezone used for all slot calculations.
stringFull definition
{ "type": "string", "description": "Venue IANA timezone used for all slot calculations.", "example": "Asia/Tbilisi" }currencyRequiredServer-resolved venue currency. This response contains no prices.
stringFull definition
{ "type": "string", "pattern": "^[A-Z]{3}$", "description": "Server-resolved venue currency. This response contains no prices.", "example": "GEL" }serviceModeRequiredScheduled fulfillment mode evaluated by the native owner.
stringFull definition
{ "type": "string", "enum": [ "PICKUP", "DELIVERY", "CATERING" ], "description": "Scheduled fulfillment mode evaluated by the native owner.", "example": "PICKUP" }partySizeRequiredRequested party size evaluated by the native owner.
integerFull definition
{ "type": "integer", "minimum": 1, "maximum": 10000, "description": "Requested party size evaluated by the native owner.", "example": 1 }fromRequiredInclusive UTC lower bound for slot starts.
string · date-timeFull definition
{ "type": "string", "format": "date-time", "description": "Inclusive UTC lower bound for slot starts.", "example": "2026-12-31T10:00:00.000Z" }toRequiredExclusive UTC upper bound for slot starts. A selected slot can end later.
string · date-timeFull definition
{ "type": "string", "format": "date-time", "description": "Exclusive UTC upper bound for slot starts. A selected slot can end later.", "example": "2026-12-31T12:00:00.000Z" }generatedAtRequiredSingle server instant used to evaluate expiry and minimum lead time.
string · date-timeFull definition
{ "type": "string", "format": "date-time", "description": "Single server instant used to evaluate expiry and minimum lead time.", "example": "2026-12-30T10:00:00.000Z" }slotsRequiredComplete chronological slot choices for this bounded window. Oversized source or choice cohorts fail closed rather than returning a truncated list.
arrayFull definition
{ "maxItems": 500, "description": "Complete chronological slot choices for this bounded window. Oversized source or choice cohorts fail closed rather than returning a truncated list.", "type": "array", "items": { "$ref": "#/components/schemas/PublicPreorderSlotChoiceDto" }, "example": [ { "startsAt": "2026-12-31T10:00:00.000Z", "endsAt": "2026-12-31T10:30:00.000Z", "available": true } ] }
Full definition
{
"type": "object",
"properties": {
"deliveryMethods": {
"type": "array",
"maxItems": 3,
"description": "Currently usable venue delivery methods for DELIVERY; empty for other service modes. A method choice does not reserve a provider quote.",
"items": {
"type": "string",
"enum": [
"SELF",
"UBER_DIRECT",
"WOLT_DRIVE"
],
"example": "SELF"
},
"example": [
"SELF"
]
},
"publicHandle": {
"type": "string",
"minLength": 3,
"maxLength": 48,
"description": "Current native preorder public discovery handle.",
"example": "example"
},
"venueId": {
"type": "string",
"format": "uuid",
"description": "Server-resolved venue UUID owning the channel.",
"example": "0604de3a-da74-4ad5-89f6-2dfe000d5391"
},
"salesChannelId": {
"type": "string",
"format": "uuid",
"description": "Server-resolved active sales channel UUID.",
"example": "ff0fa725-ba44-4e7a-82bb-a15650e0a0cc"
},
"timeZone": {
"type": "string",
"description": "Venue IANA timezone used for all slot calculations.",
"example": "Asia/Tbilisi"
},
"currency": {
"type": "string",
"pattern": "^[A-Z]{3}$",
"description": "Server-resolved venue currency. This response contains no prices.",
"example": "GEL"
},
"serviceMode": {
"type": "string",
"enum": [
"PICKUP",
"DELIVERY",
"CATERING"
],
"description": "Scheduled fulfillment mode evaluated by the native owner.",
"example": "PICKUP"
},
"partySize": {
"type": "integer",
"minimum": 1,
"maximum": 10000,
"description": "Requested party size evaluated by the native owner.",
"example": 1
},
"from": {
"type": "string",
"format": "date-time",
"description": "Inclusive UTC lower bound for slot starts.",
"example": "2026-12-31T10:00:00.000Z"
},
"to": {
"type": "string",
"format": "date-time",
"description": "Exclusive UTC upper bound for slot starts. A selected slot can end later.",
"example": "2026-12-31T12:00:00.000Z"
},
"generatedAt": {
"type": "string",
"format": "date-time",
"description": "Single server instant used to evaluate expiry and minimum lead time.",
"example": "2026-12-30T10:00:00.000Z"
},
"slots": {
"maxItems": 500,
"description": "Complete chronological slot choices for this bounded window. Oversized source or choice cohorts fail closed rather than returning a truncated list.",
"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": "Bounded public slot choices under the actual native preorder channel and current presentation authority.",
"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
A scheduled fulfillment slot choice without internal capacity data.
startsAtRequiredInclusive UTC start of the native slot.
string · date-timeFull definition
{ "type": "string", "format": "date-time", "description": "Inclusive UTC start of the native slot.", "example": "2026-12-31T10:00:00.000Z" }endsAtRequiredExclusive UTC end of the native slot.
string · date-timeFull definition
{ "type": "string", "format": "date-time", "description": "Exclusive UTC end of the native slot.", "example": "2026-12-31T10:30:00.000Z" }availableRequiredWhether venue-wide capacity currently admits the requested party. This read reserves no capacity; the quote additionally validates the cart and delivery area.
booleanFull definition
{ "type": "boolean", "description": "Whether venue-wide capacity currently admits the requested party. This read reserves no capacity; the quote additionally validates the cart and delivery area.", "example": true }
Full definition
{
"type": "object",
"properties": {
"startsAt": {
"type": "string",
"format": "date-time",
"description": "Inclusive UTC start of the native slot.",
"example": "2026-12-31T10:00:00.000Z"
},
"endsAt": {
"type": "string",
"format": "date-time",
"description": "Exclusive UTC end of the native slot.",
"example": "2026-12-31T10:30:00.000Z"
},
"available": {
"type": "boolean",
"description": "Whether venue-wide capacity currently admits the requested party. This read reserves no capacity; the quote additionally validates the cart and delivery area.",
"example": true
}
},
"description": "A scheduled fulfillment slot choice without internal capacity data.",
"required": [
"startsAt",
"endsAt",
"available"
],
"example": {
"startsAt": "2026-12-31T10:00:00.000Z",
"endsAt": "2026-12-31T10:30:00.000Z",
"available": true
}
}TranslatedErrorDto
Stable error envelope emitted by the global HTTP exception boundary. Domain-specific machine data, when present, is nested under details.
statusCodeRequiredHTTP status code repeated from the response.
integerFull definition
{ "type": "integer", "description": "HTTP status code repeated from the response.", "example": 400 }errorRequiredTranslation key for the HTTP category, such as errors:http.conflict. The specific cause is identified by code and translationKey.
stringFull definition
{ "type": "string", "description": "Translation key for the HTTP category, such as errors:http.conflict. The specific cause is identified by code and translationKey.", "example": "errors.request.invalid" }codeRequiredStable machine-readable domain code, or an HTTP_* fallback when no domain code is provided. Branch on this field and the HTTP status; localized wording never controls retries or business decisions.
stringFull definition
{ "type": "string", "example": "HTTP_BAD_REQUEST", "description": "Stable machine-readable domain code, or an HTTP_* fallback when no domain code is provided. Branch on this field and the HTTP status; localized wording never controls retries or business decisions." }messageRequiredTranslation key, identical to translationKey. The API does not return localized display text. Resolve the key and translationValues in the consuming application.
stringFull definition
{ "type": "string", "example": "errors:http.badRequest", "description": "Translation key, identical to translationKey. The API does not return localized display text. Resolve the key and translationValues in the consuming application." }translationKeyRequiredCanonical translation key, identical to message. Status-specific errors:http.* keys cover unspecified failures. Public keys and EN/RU explanations are listed in Developers; unknown keys require a localized client fallback.
stringFull definition
{ "type": "string", "example": "errors:http.badRequest", "description": "Canonical translation key, identical to message. Status-specific errors:http.* keys cover unspecified failures. Public keys and EN/RU explanations are listed in Developers; unknown keys require a localized client fallback." }translationValuesOptionalOptional scalar values for placeholders in the translation. Treat values as data, escape them when rendering, and never use them as translation options.
objectFull definition
{ "type": "object", "additionalProperties": { "oneOf": [ { "type": "string", "example": "example" }, { "type": "number", "example": 0 }, { "type": "boolean", "example": true } ], "example": "example" }, "description": "Optional scalar values for placeholders in the translation. Treat values as data, escape them when rendering, and never use them as translation options.", "example": { "exampleKey": "example" } }validationErrorsOptionalField validation failures with translation keys and stable validator codes. Submitted values and raw validator text are not included.
arrayFull definition
{ "description": "Field validation failures with translation keys and stable validator codes. Submitted values and raw validator text are not included.", "type": "array", "items": { "$ref": "#/components/schemas/ValidationErrorDto" }, "example": [ { "field": "email", "translationKey": "validation:isEmail", "code": "isEmail", "message": "validation:isEmail" } ] }detailsOptionalOptional domain-specific blocker or validation details
oneOfFull definition
{ "description": "Optional domain-specific blocker or validation details", "oneOf": [ { "type": "array", "items": { "$ref": "#/components/schemas/JsonValue" }, "example": [ "example" ] }, { "type": "object", "additionalProperties": { "$ref": "#/components/schemas/JsonValue" }, "example": { "exampleKey": "example" } } ], "example": [ "example" ] }
Full definition
{
"type": "object",
"properties": {
"statusCode": {
"type": "integer",
"description": "HTTP status code repeated from the response.",
"example": 400
},
"error": {
"type": "string",
"description": "Translation key for the HTTP category, such as errors:http.conflict. The specific cause is identified by code and translationKey.",
"example": "errors.request.invalid"
},
"code": {
"type": "string",
"example": "HTTP_BAD_REQUEST",
"description": "Stable machine-readable domain code, or an HTTP_* fallback when no domain code is provided. Branch on this field and the HTTP status; localized wording never controls retries or business decisions."
},
"message": {
"type": "string",
"example": "errors:http.badRequest",
"description": "Translation key, identical to translationKey. The API does not return localized display text. Resolve the key and translationValues in the consuming application."
},
"translationKey": {
"type": "string",
"example": "errors:http.badRequest",
"description": "Canonical translation key, identical to message. Status-specific errors:http.* keys cover unspecified failures. Public keys and EN/RU explanations are listed in Developers; unknown keys require a localized client fallback."
},
"translationValues": {
"type": "object",
"additionalProperties": {
"oneOf": [
{
"type": "string",
"example": "example"
},
{
"type": "number",
"example": 0
},
{
"type": "boolean",
"example": true
}
],
"example": "example"
},
"description": "Optional scalar values for placeholders in the translation. Treat values as data, escape them when rendering, and never use them as translation options.",
"example": {
"exampleKey": "example"
}
},
"validationErrors": {
"description": "Field validation failures with translation keys and stable validator codes. Submitted values and raw validator text are not included.",
"type": "array",
"items": {
"$ref": "#/components/schemas/ValidationErrorDto"
},
"example": [
{
"field": "email",
"translationKey": "validation:isEmail",
"code": "isEmail",
"message": "validation:isEmail"
}
]
},
"details": {
"description": "Optional domain-specific blocker or validation details",
"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": "Stable error envelope emitted by the global HTTP exception boundary. Domain-specific machine data, when present, is nested under details.",
"example": {
"statusCode": 400,
"error": "errors:http.badRequest",
"code": "HTTP_BAD_REQUEST",
"message": "errors:http.badRequest",
"translationKey": "errors:http.badRequest"
}
}ValidationErrorDto
Field validation failure with a field path, stable validator code and a translation key. Human-readable text belongs to the consuming application.
fieldRequiredPublic field path. Nested properties and array indices are separated by dots.
stringFull definition
{ "type": "string", "example": "email", "description": "Public field path. Nested properties and array indices are separated by dots." }translationKeyRequiredTranslation key for this validator, identical to message. Resolve it using a client dictionary; see the public Developers error catalog.
stringFull definition
{ "type": "string", "example": "validation:isEmail", "description": "Translation key for this validator, identical to message. Resolve it using a client dictionary; see the public Developers error catalog." }codeRequiredStable validator identifier for this field failure. Custom validators may define additional identifiers.
stringFull definition
{ "type": "string", "example": "isEmail", "description": "Stable validator identifier for this field failure. Custom validators may define additional identifiers." }messageRequiredTranslation key describing this field validation failure, identical to translationKey. Submitted values and validator prose are not included.
stringFull definition
{ "type": "string", "example": "validation:isEmail", "description": "Translation key describing this field validation failure, identical to translationKey. Submitted values and validator prose are not included." }translationValuesOptionalOptional scalar values for placeholders in the translation. Treat values as data, escape them when rendering, and never use them as translation options.
objectFull definition
{ "type": "object", "additionalProperties": { "oneOf": [ { "type": "string", "example": "example" }, { "type": "number", "example": 0 }, { "type": "boolean", "example": true } ], "example": "example" }, "description": "Optional scalar values for placeholders in the translation. Treat values as data, escape them when rendering, and never use them as translation options.", "example": { "exampleKey": "example" } }
Full definition
{
"type": "object",
"properties": {
"field": {
"type": "string",
"example": "email",
"description": "Public field path. Nested properties and array indices are separated by dots."
},
"translationKey": {
"type": "string",
"example": "validation:isEmail",
"description": "Translation key for this validator, identical to message. Resolve it using a client dictionary; see the public Developers error catalog."
},
"code": {
"type": "string",
"example": "isEmail",
"description": "Stable validator identifier for this field failure. Custom validators may define additional identifiers."
},
"message": {
"type": "string",
"example": "validation:isEmail",
"description": "Translation key describing this field validation failure, identical to translationKey. Submitted values and validator prose are not included."
},
"translationValues": {
"type": "object",
"additionalProperties": {
"oneOf": [
{
"type": "string",
"example": "example"
},
{
"type": "number",
"example": 0
},
{
"type": "boolean",
"example": true
}
],
"example": "example"
},
"description": "Optional scalar values for placeholders in the translation. Treat values as data, escape them when rendering, and never use them as translation options.",
"example": {
"exampleKey": "example"
}
}
},
"required": [
"field",
"translationKey",
"code",
"message"
],
"description": "Field validation failure with a field path, stable validator code and a translation key. Human-readable text belongs to the consuming application.",
"example": {
"field": "email",
"translationKey": "validation:isEmail",
"code": "isEmail",
"message": "validation:isEmail"
}
}JsonValue
Recursively JSON-safe value used only where the owning contract intentionally allows free-form structured data.
Full definition
{
"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": "Recursively JSON-safe value used only where the owning contract intentionally allows free-form structured data.",
"example": "example"
}