Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.uselayers.com/llms.txt

Use this file to discover all available pages before exploring further.

Installation

npm install @commerce-blocks/sdk

Configuration

Required configuration

OptionTypeRequiredDescription
tokenstringYesLayers API public token
sortsSort[]YesSort options (see below)
facetsFacet[]YesFacet fields (see below)
Sort:
PropertyTypeRequiredDescription
namestringYesDisplay name shown to users
codestringYesSort order code configured in Layers
scope('search' | 'collection')[]NoRestrict to specific controllers. Omit to allow everywhere.
ordernumberNoDisplay order (lower numbers appear first)
Facet:
PropertyTypeRequiredDescription
namestringYesDisplay name shown to users
codestringYesAttribute code in Layers (e.g. options.color, vendor, variants.price)

Optional configuration

OptionTypeDescription
attributesstring[]Product attributes to fetch
baseUrlstringCustom API URL
fetchCustomFetchCustom fetch implementation (SSR, testing)
contextContextDefault market and shopper context applied to every controller (see Context)

Context

Pass market and shopper context to personalize results across all controllers. Set it globally on the client config, per-query on execute(), or both — per-query context shallow-merges with and overrides the global context.
import { createClient } from '@commerce-blocks/sdk'

const { data: client } = createClient({
  token: 'your-token',
  sorts: [{ name: 'Featured', code: 'featured' }],
  facets: [{ name: 'Color', code: 'options.color' }],
  context: {
    market: 'US',
    geo: { country: 'US' },
    shoppingChannel: 'web',
  },
})

// Per-query override — merges with global context
const collection = client.collection({ handle: 'shirts' })
await collection.execute({
  context: { geo: { country: 'CA', province: 'ON' } },
})
// Effective context: { market: 'US', geo: { country: 'CA', province: 'ON' }, shoppingChannel: 'web' }
Context fields:
FieldTypeDescription
geoGeoLocationGeographic location: { country, province, city }
marketstringMarket identifier
productsInCartCartProduct[]Products currently in the shopper’s cart
productsPurchasedCartProduct[]Previously purchased products
priorSearchesPriorSearch[]Recent searches: { searchQuery, hadClick, hasResults }
marketingMarketingUTM-style attribution: { source, medium, campaign, term }
customerCustomerContextCustomer profile: { signedIn, returning, numberOfOrders, ... }
shoppingChannel'web' | 'app'Shopping channel the request originates from
customRecord<string, unknown>Custom key-value pairs forwarded to merchandising strategies
CartProduct:
PropertyTypeRequiredDescription
titlestringYesProduct title
pricenumberNoUnit price
typestringNoProduct type
productIdstringNoProduct ID
variantIdstringNoVariant ID
quantitynumberNoQuantity in cart
optionsRecord<string, string>NoSelected options (e.g. { Size: 'L' })
CustomerContext:
PropertyTypeDescription
signedInbooleanWhether the shopper is signed in
returningbooleanWhether the shopper has visited before
numberOfOrdersnumberLifetime order count
averageOrderValuenumberAverage order value
daysBetweenOrdersnumberAverage days between orders
daysSinceLastOrdernumberDays since the most recent order
daysSinceOldestOrdernumberDays since the first order
totalSpentnumberLifetime spend
Use the global context for values that rarely change within a session (market, channel, customer profile). Use per-query context for values that vary by page or interaction (current cart, geo override).

Product configuration

OptionTypeDescription
currencystringCurrency for price formatting
formatPrice(amount, currency) => stringCustom price formatter
swatchesSwatch[]Color swatch definitions (see below)
includeMetabooleanInclude _meta in results (applied rules, variant breakouts)
Swatch:
PropertyTypeRequiredDescription
namestringYesOption name this swatch belongs to (e.g. Color)
valuestringYesOption value to match (e.g. Red)
colorstring | nullYesCSS color value (e.g. #ff0000)
imageUrlstring | nullYesURL to a swatch image. Use when a color alone is not sufficient.

Transforms and filter aliases

Transforms post-process results before caching. Filter aliases map URL-friendly keys to API property names.
OptionTypeDescription
transforms.product({ base, raw }) => objectExtend products with custom fields
transforms.collection(result, raw) => resultTransform collection results
transforms.search(result, raw) => resultTransform search results
transforms.block(result, raw) => resultTransform block results
transforms.searchContent(result, raw) => resultTransform content search results
transforms.filters(filters) => FilterGroupCustom filter transformation
filterAliasesFilterAliasesURL-friendly filter key mapping
Once configured, transforms and aliases are applied automatically:
import { createClient } from '@commerce-blocks/sdk'

const { data: client } = createClient({
  token: 'your-token',
  sorts: [{ name: 'Featured', code: 'featured' }],
  facets: [{ name: 'Color', code: 'options.color' }],
  attributes: ['body_html'],
  transforms: {
    product: ({ raw }) => ({
      description: raw.body_html ?? '',
      rating: raw.calculated?.average_rating ?? 0,
    }),
  },
  filterAliases: {
    color: 'options.color',
    size: 'options.size',
    brand: { property: 'vendor', values: { nike: 'Nike', adidas: 'Adidas' } },
  },
})

// Aliases resolve automatically
const collection = client.collection({ handle: 'shirts' })
await collection.execute({ filters: { color: 'Red', brand: 'nike' } })
// Products now include description and rating from the product transform

Cache configuration

OptionTypeDescription
cacheLimitnumberMax entries in cache
cacheLifetimenumberTTL in milliseconds
storageStorageAdapterCustom storage adapter for cache persistence (defaults to localStorage in browser)
initialDataCacheDataPre-populate cache at initialization
restoreCachebooleanAuto-restore from storage on init (default: true)

Singleton access

After initialization, access the client anywhere:
import { getClient, isInitialized } from '@commerce-blocks/sdk'

if (isInitialized()) {
  const { data: client } = getClient()
  if (client) {
    // Use client
  }
}

Important notes

All SDK methods return a Result type instead of throwing exceptions. Always check for result.error before accessing result.data.