Parameters
2 query
Query parameters
· 2productCodestringRequiredUnique product code.
my-productlocalestringOptionalLocale code for translated fields. Falls back to primary locale if not provided.
csReturns full product detail including all editable fields, custom fields, field definitions, and linked events. Translatable fields (name, descriptions) are resolved from the translation table with locale fallback.
2 query
productCodestringRequiredUnique product code.
my-productlocalestringOptionalLocale code for translated fields. Falls back to primary locale if not provided.
cs1 status code documented
idstringRequiredProduct code (used as identifier).
codestringRequiredUnique product code.
namestringRequiredProduct name (translated if locale is specified).
slugstringRequiredURL slug.
eanstringOptionalEAN barcode.
shortDescriptionstringRequiredShort HTML description.
longDescriptionstringRequiredLong HTML description.
internalNotestringRequiredInternal note (admin only).
activebooleanRequiredWhether the product is active.
deletedbooleanRequiredWhether the product is soft-deleted (legacy boolean — prefer deletedDate).
deletedDatestringOptionalISO timestamp when the product was soft-deleted. Canonical signal for soft-delete; absent on live products.
b2bbooleanRequiredWhether the product is B2B only.
showInFeedbooleanRequiredWhether the product appears in product feeds.
soldOutbooleanRequiredWhether the product is sold out.
mainImageUrlstringOptionalURL of the main product image (source blob).
mainImageobjectOptionalFull main-image payload with all pre-rendered variants (issue #80).
Rendering contract for the FE: always paint lqip immediately as a CSS background, then progressively enhance with whichever sharp variant matches the intended display size — thumbUrl (≤ 128 px), cardUrl (≤ 480 px), heroUrl (≤ 1280 px), zoomUrl (≤ 2048 px). Fall back to originalUrl only for lightbox / download-as-image cases where the pre-rendered variants are insufficient.
Nullable slots vs. progressive rendering: every variant slot is present on the wire; null means scout hasn't rendered that particular size yet. The read model is rebuilt automatically the moment all four variants land, so a subsequent fetch will return the URLs — usually within seconds of a fresh upload, longer under scout backlog. Never fall back to originalUrl for a null variant in list UIs — that would defeat the whole point of pre-generating right-sized derivatives.
idstringRequiredExternal blob token of the source image (stable across variant regenerations). Use this to correlate frontend cache keys and re-request the payload after an update.
a1b2c3d4e5f6g7h8originalUrlstringRequiredPublic CDN URL of the original upload — always present when the product has a main image.
Format: whatever the operator uploaded (typically JPEG or PNG, occasionally WebP or AVIF). Dimensions and byte size are unbounded and depend on the source; expect anywhere from 200 KB to several MB.
Use cases:
Do not use the original for above-the-fold rendering or list thumbnails — the pipeline exists precisely so those cases can bind to a pre-rendered, right-sized WebP variant instead.
https://storage.xhp.cz/org-slug/product/2026-08/abc123.jpglqipstringRequiredneeded to render it.
Intended use: paint immediately as a CSS background-image on the wrapper element. Once one of the sharp variants (thumbUrl, cardUrl, heroUrl, zoomUrl) finishes loading, fade it in on top; the LQIP remains behind and covers any transparent pixels.
Edge case: an empty string is possible only if the source blob was unreadable when the LQIP was generated (sharp threw and no fallback was stored). Treat empty as "no LQIP available" and skip the background paint.
data:image/webp;base64,UklGRi4AAABXRUJQVlA4ICI…thumbUrlstring | nullRequiredScout-generated 128×128 WebP thumbnail URL, or null while the variant hasn't been rendered yet (see § "When null" below).
Dimensions: 128×128 px, square, cover-cropped. Format: WebP q75. Byte range: ~4–14 KB per file.
Intended use: row-level thumbnails in lists, autocomplete dropdowns, chat message previews, notification cards, mobile grid cells (60–120 px). At this size no other variant is worth requesting.
When null: the source image has been uploaded but the scout worker on the Contabo VPS hasn't finished rendering this variant yet. Fall back to the LQIP blur alone (with an optional "processing" overlay for cells ≥ 80 px). The read model is rebuilt automatically the moment all four variants land, so a subsequent fetch will return a non-null URL — usually within seconds for a fresh upload, longer under scout backlog.
https://storage.xhp.cz/org-slug/product/2026-08/abc123.thumb-webp.webpcardUrlstring | nullRequiredScout-generated 480×480 WebP URL, or null while the variant hasn't been rendered yet.
Dimensions: 480×480 px, square, cover-cropped. Format: WebP q80. Byte range: ~15–45 KB per file.
Intended use: medium-sized product previews — product-detail sidebar (240–520 px), category grid tiles on mobile / small desktop, storefront cards, hover popovers, e-mail template thumbnails. The single most-used variant in typical e-shop UI.
When null: same story as thumbUrl — variant not yet rendered by scout. Prefer thumbUrl (if available) as a temporary substitute over the LQIP blur alone.
https://storage.xhp.cz/org-slug/product/2026-08/abc123.card-webp.webpheroUrlstring | nullRequiredScout-generated 1280×1280 WebP URL, or null while the variant hasn't been rendered yet.
Dimensions: 1280×1280 px, square, cover-cropped. Format: WebP q82. Byte range: ~50–150 KB per file.
Intended use: large product previews — desktop product-detail hero image (520–1280 px), homepage feature slots, campaign landing pages, retina 2× rendering for card-sized cells.
When null: same story as thumbUrl — variant not yet rendered by scout. If falling back, prefer cardUrl over thumbUrl when the intended display size is > ~480 px.
https://storage.xhp.cz/org-slug/product/2026-08/abc123.hero-webp.webpzoomUrlstring | nullRequiredScout-generated 2048×2048 WebP URL, or null while the variant hasn't been rendered yet.
Dimensions: 2048×2048 px, square, cover-cropped. Format: WebP q82. Byte range: ~150–400 KB per file.
Intended use: lightbox / product-image zoom UI, retina 2× rendering for hero-sized cells, download-as-image feature. The largest pre-rendered variant — for anything sharper, fall back to originalUrl (unbounded, unmodified source).
When null: same story as thumbUrl — variant not yet rendered by scout. If a lightbox request comes in before zoomUrl is ready, use originalUrl as an interim fallback so the feature still works.
https://storage.xhp.cz/org-slug/product/2026-08/abc123.zoom-webp.webpmainCategoryIdnumberOptionalInternal ID of the main category.
brandIdnumberOptionalInternal ID of the brand.
defaultCurrencystringRequiredDefault currency code (e.g. "CZK").
pricenumberRequiredPrice with VAT as a number.
costnumberRequiredInternal cost in the organisation default currency. 0 when not set. Snapshotted onto shop__order_item.cost at order creation, FX-converted to the order currency.
standardPricePercentagenumberOptionalStandard price percentage for discount calculation.
vatnumberOptionalVAT rate percentage.
sizeWidthMmnumberOptionalProduct width in millimeters.
sizeHeightMmnumberOptionalProduct height in millimeters.
sizeDepthMmnumberOptionalProduct depth in millimeters.
weightGramsnumberOptionalProduct weight in grams.
warehouseAllQuantitynumberOptionalTotal warehouse stock quantity.
warehouseLimitnumberOptionalMinimum stock level before reorder alert.
isVariantProductbooleanRequiredWhether the product has variants.
variantCountnumberRequiredNumber of product variants.
customFieldsobject[]RequiredCustom fields attached to the product.
keystringRequiredCustom field key identifier.
valuestringRequiredCustom field value.
activebooleanRequiredWhether the field is active.
insertedDateDate | string | string | numberRequiredDate when the field was created/updated.
Date when the field was created/updated.
customFieldsDefinitionobject[]RequiredAvailable custom field definitions for the product category.
keystringRequiredField key identifier.
typestringRequiredField type: text, textarea, number, or boolean.
labelstringRequiredDisplay label for the field.
helperTextstringOptionalHelper text shown below the field.
placeholderstringOptionalPlaceholder text for the input.
requiredbooleanRequiredWhether the field is required.
validationPatternstringOptionalRegex pattern for validation.
eventListobject[]RequiredCalendar events linked to this product.
idstringRequiredEvent code.
type"direct" | "eventType"RequiredHow the event is linked: directly or via event type.
titlestringRequiredEvent title.
isStornobooleanRequiredWhether the event is cancelled.
startTimeDate | string | string | numberRequiredEvent start time.
Event start time.
endTimeDate | string | string | numberRequiredEvent end time.
Event end time.
typeCodestringOptionalEvent type code.
typeLabelstringOptionalEvent type label.
typeColorstringOptionalEvent type color (hex, e.g. "#FF5733").
translatedLocalesstring[]RequiredLocales for which a translation exists in shop__product_translation.
Locale code (e.g. "cs", "en").
voucherTemplateCountnumberRequiredNumber of voucher templates linked to this product.
subscriptionPlanCountnumberRequiredNumber of subscription plans linked to this product.
pricelistRulesobject[]RequiredDynamic pricing rules. Empty array on products with static pricing.
idstringRequiredStable UUID — preserved across edits.
namestringRequiredHuman label shown in the rule grid.
enabledbooleanRequiredWhether the resolver considers this rule.
prioritynumberRequiredHigher value wins; ties broken by specificity.
validFromstring | nullRequiredInclusive lower date bound (YYYY-MM-DD).
validTostring | nullRequiredInclusive upper date bound (YYYY-MM-DD).
weekdaysnumber[] | nullRequiredAllowed ISO weekdays (Mon=1 … Sun=7), or null for every day.
timeFromstring | nullRequiredInclusive lower time-of-day bound (HH:mm).
timeTostring | nullRequiredInclusive upper time-of-day bound (HH:mm). When < timeFrom the window crosses midnight.
variantCodestring | nullRequiredVariant code scope, or null for all variants.
pricenumberRequiredPrice applied when this rule wins.
{
"id": "example_id",
"code": "example_code",
"name": "example_name",
"slug": "example_slug",
"ean": "example_ean",
"shortDescription": "example_shortDescription",
"longDescription": "example_longDescription",
"internalNote": "example_internalNote",
"active": false,
"deleted": false,
"deletedDate": "example_deletedDate",
"b2b": false,
"showInFeed": false,
"soldOut": false,
"mainImageUrl": "example_mainImageUrl",
"mainImage": {
"id": "a1b2c3d4e5f6g7h8",
"originalUrl": "https://storage.xhp.cz/org-slug/product/2026-08/abc123.jpg",
"lqip": "data:image/webp;base64,UklGRi4AAABXRUJQVlA4ICI…"
},
"mainCategoryId": 0,
"brandId": 0,
"defaultCurrency": "example_defaultCurrency",
"price": 0,
"cost": 0,
"standardPricePercentage": 0,
"vat": 0,
"sizeWidthMm": 0,
"sizeHeightMm": 0,
"sizeDepthMm": 0,
"weightGrams": 0,
"warehouseAllQuantity": 0,
"warehouseLimit": 0,
"isVariantProduct": false,
"variantCount": 0,
"customFields": [
{
"key": "example_key",
"value": "example_value",
"active": false
}
],
"customFieldsDefinition": [
{
"key": "example_key",
"type": "example_type",
"label": "example_label",
"helperText": "example_helperText",
"placeholder": "example_placeholder",
"required": false,
"validationPattern": "example_validationPattern"
}
],
"eventList": [
{
"id": "example_id",
"title": "example_title",
"isStorno": false,
"typeCode": "example_typeCode",
"typeLabel": "example_typeLabel",
"typeColor": "example_typeColor"
}
],
"translatedLocales": [
"string"
],
"voucherTemplateCount": 0,
"subscriptionPlanCount": 0,
"pricelistRules": [
{
"id": "example_id",
"name": "example_name",
"enabled": false,
"priority": 0,
"price": 0
}
]
}GET /bff/product/product-detail
curl -X GET "https://api.bizkithub.com/bff/product/product-detail?productCode=my-product&locale=cs" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY"All BizKitHub public API endpoints require authentication via API key.