The composite and enum shapes below are the minimum guaranteed contract every Frontic project ships with. Each can be extended — added fields on a composite, added keys on an enum — from Settings → Data Types. Custom additions appear alongside the built-ins on every record that uses the type, but the built-in fields and keys themselves can’t be removed or renamed. Code written against the shapes below stays safe across every project; code that wants extensions reads them off the response when they’re present. See Data Types for the extension flow.
Field capabilities
Each field on a storage carries a small set of flags that change how its value is stored, returned, and resolved per request. They’re independent — a field can be array + translatable + scoped at the same time — and you set them when adding or editing the field.isArray
Whether the field stores a list of values rather than a single value. The JSON return type becomes the array form (string[], Price[], and so on). Some composites are always arrays by design — Option and Sorting exist to be lists of attribute/value pairs and can’t be set to single-value mode.
isTranslatable
Whether the field has per-locale variants. The same field on the same record can hold different values per project locale; the API returns the value for the caller’s resolved locale, falling back to the project’s default locale when a translation is missing. Use this for any user-visible copy — product names, descriptions, marketing text.
isScoped
Whether the field is segmented by scope. A scoped field can hold a different value per scope (e.g. b2b vs public); the API returns the value for the caller’s resolved scope. Use this for content that legitimately diverges across audiences — wholesale pricing on a B2B scope, audience-specific descriptions, scope-specific imagery.
isTranslatable and isScoped compose. A field that’s both gives you one value per (scope, locale) pair.
The following capability applies only to fields on a Products storage.
sharedAcrossVariants
This controls whether the field’s value lives at the product level (one value shared across every variant of the product) or at the variant level (each variant has its own value).
- Shared examples: name, description, brand, breadcrumbs, hero imagery — they describe the product as a whole.
- Variant-level examples: price, size, SKU, stock — they describe a specific buyable item.
isSystem
Read-only flag that marks built-in fields the platform manages directly. Every storage ships with key (the record identifier) and active (the visibility toggle). Products storages add parentKey (the variant → product link), options (the variant’s option array), and price (the variant’s primary price).
System fields can’t be removed, renamed, or have their flags changed — they’re part of the contract every storage of that type guarantees. You populate their values via syncs or the admin UI like any other field.
Primitives
Scalar values for simple data.| Type | JSON | Description |
|---|---|---|
String | string | Text data. |
Integer | number | Whole numbers. |
Float | number | Floating-point numbers. |
Boolean | boolean | True/false values. |
DateTime | string | ISO-8601 date and time. |
Any | any | Any valid JSON value. |
Composites
Structured data types covering common commerce use cases. Each composite has a fixed inner shape that other configurations (Data Storages, Blocks) can reuse by reference.Media
Images, video thumbnails, and other assets — with alt text, MIME type, and an optional thumbnail variant.
Option
Product options (color, size, material). Always used as an array — auto-generates dynamic facets grouped by attribute when used as a filter in a Search Listing.
Price
Prices with currency, precision, and optional reference price + tiered scales. The price amount is stored as an integer in the smallest unit at the configured precision — amount: 4999, precision: 2 represents 49.99. Resolved to the caller’s currency via Request Context.
PriceScale
A single tier of a tiered price ladder — used inside Price.scales for quantity discounts.
SEO
Meta titles, descriptions, and keywords. Typically translatable. See URLs & SEO.
Sorting
Parameterized sort positions for category-specific or collection-specific ordering. Always used as an array — when used as a sort option in a listing, the parameter value is matched against the key to determine order.
Swatch
Color or material swatches with a label, optional swatch image, and an optional hex color — for variant pickers and product grids.
Vendor
Vendor/supplier identity — a key, display label, and optional logo.
Weight
Weight value with unit.
Enums
String values with a discrete set of possible keys. You can customize the available keys.Availability
Availability status for products. Default keys: in-stock, out-of-stock, preorder, backorder. Google Merchant Center-compatible.
StockLevel
Simplified stock display without exposing real inventory counts. Default keys: low, medium, high.