Data & Storage
Product Facets SDK
Simple SDK-facing reference for the product facet API.
Product Facets SDK Reference
Simple SDK-facing reference for the facet API.
This document covers:
- admin facet endpoints
- public facet endpoints
- collection-level facet routes
- TypeScript interfaces for facet definitions, values, and aggregation queries
Current route model
The facet API stays under /api/v1.
Facets are mounted directly under the collection.
Admin base
/api/v1/admin/collection/:collectionId/facets
Public base
/api/v1/public/collection/:collectionId/facets
Admin endpoints
List facet definitions
GET /api/v1/admin/collection/:collectionId/facets
Optional query params:
includeValues?: boolean
includeDeleted?: boolean
kind?: 'system' | 'custom'
reserved?: boolean
Create facet definition
POST /api/v1/admin/collection/:collectionId/facets
Get facet definition
GET /api/v1/admin/collection/:collectionId/facets/:facetKey
Optional query params:
includeValues?: boolean
includeDeleted?: boolean
Update facet definition
PUT /api/v1/admin/collection/:collectionId/facets/:facetKey
Delete facet definition
DELETE /api/v1/admin/collection/:collectionId/facets/:facetKey
Current behavior:
- reserved facet definitions cannot be deleted
- facet definitions with product assignments cannot be deleted
List facet values
GET /api/v1/admin/collection/:collectionId/facets/:facetKey/values
Optional query params:
includeDeleted?: boolean
Create facet value
POST /api/v1/admin/collection/:collectionId/facets/:facetKey/values
Get facet value
GET /api/v1/admin/collection/:collectionId/facets/:facetKey/values/:valueKey
Optional query params:
includeDeleted?: boolean
Update facet value
PUT /api/v1/admin/collection/:collectionId/facets/:facetKey/values/:valueKey
Delete facet value
DELETE /api/v1/admin/collection/:collectionId/facets/:facetKey/values/:valueKey
Current behavior:
- deleting a facet value removes its product assignments
- affected product
facetssummaries are synchronized after the delete
Query facet counts
POST /api/v1/admin/collection/:collectionId/facets/query
Supported query filters now:
searchstatusschemaTypetypeproductIdsskugtincategorytagsfacetEquals
Public endpoints
List facet definitions
GET /api/v1/public/collection/:collectionId/facets
Optional query params:
includeValues?: boolean
Get facet definition
GET /api/v1/public/collection/:collectionId/facets/:facetKey
Optional query params:
includeValues?: boolean
List facet values
GET /api/v1/public/collection/:collectionId/facets/:facetKey/values
Get facet value
GET /api/v1/public/collection/:collectionId/facets/:facetKey/values/:valueKey
Query facet counts
POST /api/v1/public/collection/:collectionId/facets/query
Public endpoints are read-only.
TypeScript interfaces
Core JSON types
export type JsonPrimitive = string | number | boolean | null
export type JsonValue =
| JsonPrimitive
| JsonValue[]
| { [key: string]: JsonValue }
Facet definition types
export interface FacetDefinition {
id: string
orgId: string
collectionId: string
key: string
name: string
description?: string | null
cardinality: 'single' | 'multi'
kind: 'system' | 'custom'
hierarchical: boolean
reserved: boolean
config: Record<string, JsonValue>
createdAt: string
updatedAt: string
deletedAt?: string | null
values?: FacetValue[]
}
export interface FacetDefinitionWriteInput {
key?: string
name: string
description?: string | null
cardinality?: 'single' | 'multi'
kind?: 'system' | 'custom'
hierarchical?: boolean
reserved?: boolean
config?: Record<string, JsonValue>
}
Facet value types
export interface FacetValue {
id: string
orgId: string
collectionId: string
facetDefinitionId: string
facetKey?: string
key: string
slug?: string | null
name: string
shortName?: string | null
description?: string | null
color?: string | null
icon?: string | null
image?: Record<string, JsonValue> | null
metadata: Record<string, JsonValue>
sortOrder: number
parentValueId?: string | null
parentValueKey?: string | null
createdAt: string
updatedAt: string
deletedAt?: string | null
count?: number
}
export interface FacetValueWriteInput {
key?: string
slug?: string | null
name: string
shortName?: string | null
description?: string | null
color?: string | null
icon?: string | null
image?: Record<string, JsonValue> | null
metadata?: Record<string, JsonValue>
sortOrder?: number
parentValueKey?: string | null
}
List response types
export interface FacetListResponse {
items: FacetDefinition[]
}
export interface FacetValueListResponse {
facet: FacetDefinition
items: FacetValue[]
}
export interface FacetValueResponse {
facet: FacetDefinition
item: FacetValue
}
Query types
export interface FacetQueryRequest {
facetKeys?: string[]
includeEmpty?: boolean
includeDeleted?: boolean
query?: {
search?: string
status?: string[]
schemaType?: string[]
type?: string[]
productIds?: string[]
sku?: string
gtin?: string
category?: string[]
tags?: string[]
facetEquals?: Record<string, JsonValue | JsonValue[]>
}
}
export interface FacetBucket {
facetKey: string
valueKey: string
name?: string
count: number
}
export interface FacetQueryResponse {
items: Array<{
facet: FacetDefinition
values: FacetValue[]
}>
buckets: FacetBucket[]
meta?: {
source?: 'postgres'
matchedProducts?: number
}
}
Notes for SDK implementers
- treat facet definitions and facet values as collection-scoped resources
- use the facet API to manage definitions and values
- use product read/write routes to assign facet data onto products
- treat
labelandcategoryas reserved system facets when present