@proveanything/smartlinks 1.15.0 → 1.15.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/openapi.yaml CHANGED
@@ -3337,6 +3337,63 @@ paths:
3337
3337
  description: Unauthorized
3338
3338
  404:
3339
3339
  description: Not found
3340
+ /admin/collection/{collectionId}/domain:
3341
+ get:
3342
+ tags:
3343
+ - collection
3344
+ summary: "Get the managed-certificate status for a collection's custom domain (admin only)."
3345
+ operationId: collection_getDomainStatus
3346
+ security:
3347
+ - bearerAuth: []
3348
+ parameters:
3349
+ - name: collectionId
3350
+ in: path
3351
+ required: true
3352
+ schema:
3353
+ type: string
3354
+ responses:
3355
+ 200:
3356
+ description: Success
3357
+ content:
3358
+ application/json:
3359
+ schema: {}
3360
+ 400:
3361
+ description: Bad request
3362
+ 401:
3363
+ description: Unauthorized
3364
+ 404:
3365
+ description: Not found
3366
+ post:
3367
+ tags:
3368
+ - collection
3369
+ summary: Register a custom domain for a collection and provision its managed certificate (admin only).
3370
+ operationId: collection_registerDomain
3371
+ security:
3372
+ - bearerAuth: []
3373
+ parameters:
3374
+ - name: collectionId
3375
+ in: path
3376
+ required: true
3377
+ schema:
3378
+ type: string
3379
+ responses:
3380
+ 200:
3381
+ description: Success
3382
+ content:
3383
+ application/json:
3384
+ schema: {}
3385
+ 400:
3386
+ description: Bad request
3387
+ 401:
3388
+ description: Unauthorized
3389
+ 404:
3390
+ description: Not found
3391
+ requestBody:
3392
+ required: true
3393
+ content:
3394
+ application/json:
3395
+ schema:
3396
+ $ref: "#/components/schemas/DomainTarget"
3340
3397
  /admin/collection/{collectionId}/facets:
3341
3398
  get:
3342
3399
  tags:
@@ -3372,6 +3429,11 @@ paths:
3372
3429
  required: false
3373
3430
  schema:
3374
3431
  type: boolean
3432
+ - name: namespace
3433
+ in: query
3434
+ required: false
3435
+ schema:
3436
+ type: string
3375
3437
  responses:
3376
3438
  200:
3377
3439
  description: Success
@@ -3417,6 +3479,33 @@ paths:
3417
3479
  application/json:
3418
3480
  schema:
3419
3481
  $ref: "#/components/schemas/FacetDefinitionWriteInput"
3482
+ /admin/collection/{collectionId}/facets/namespaces:
3483
+ get:
3484
+ tags:
3485
+ - facets
3486
+ summary: facets.namespaces
3487
+ operationId: facets_namespaces
3488
+ security:
3489
+ - bearerAuth: []
3490
+ parameters:
3491
+ - name: collectionId
3492
+ in: path
3493
+ required: true
3494
+ schema:
3495
+ type: string
3496
+ responses:
3497
+ 200:
3498
+ description: Success
3499
+ content:
3500
+ application/json:
3501
+ schema:
3502
+ $ref: "#/components/schemas/FacetNamespaceListResponse"
3503
+ 400:
3504
+ description: Bad request
3505
+ 401:
3506
+ description: Unauthorized
3507
+ 404:
3508
+ description: Not found
3420
3509
  /admin/collection/{collectionId}/facets/query:
3421
3510
  post:
3422
3511
  tags:
@@ -3871,6 +3960,60 @@ paths:
3871
3960
  description: Unauthorized
3872
3961
  404:
3873
3962
  description: Not found
3963
+ /admin/collection/{collectionId}/hub:
3964
+ post:
3965
+ tags:
3966
+ - collection
3967
+ summary: Claim or rename the Hub subdomain for a collection (admin only).
3968
+ operationId: collection_claimHub
3969
+ security:
3970
+ - bearerAuth: []
3971
+ parameters:
3972
+ - name: collectionId
3973
+ in: path
3974
+ required: true
3975
+ schema:
3976
+ type: string
3977
+ responses:
3978
+ 200:
3979
+ description: Success
3980
+ content:
3981
+ application/json:
3982
+ schema:
3983
+ $ref: "#/components/schemas/CollectionResponse"
3984
+ 400:
3985
+ description: Bad request
3986
+ 401:
3987
+ description: Unauthorized
3988
+ 404:
3989
+ description: Not found
3990
+ /admin/collection/{collectionId}/hub/available:
3991
+ get:
3992
+ tags:
3993
+ - collection
3994
+ summary: Check whether a Hub subdomain name is available to claim (admin only).
3995
+ operationId: collection_checkHubAvailability
3996
+ security:
3997
+ - bearerAuth: []
3998
+ parameters:
3999
+ - name: collectionId
4000
+ in: path
4001
+ required: true
4002
+ schema:
4003
+ type: string
4004
+ responses:
4005
+ 200:
4006
+ description: Success
4007
+ content:
4008
+ application/json:
4009
+ schema:
4010
+ $ref: "#/components/schemas/HubAvailabilityResponse"
4011
+ 400:
4012
+ description: Bad request
4013
+ 401:
4014
+ description: Unauthorized
4015
+ 404:
4016
+ description: Not found
3874
4017
  /admin/collection/{collectionId}/interactions:
3875
4018
  get:
3876
4019
  tags:
@@ -9205,6 +9348,52 @@ paths:
9205
9348
  application/json:
9206
9349
  schema:
9207
9350
  $ref: "#/components/schemas/RequestUploadTokenOptions"
9351
+ /public/collection/by-domain/{domain}:
9352
+ get:
9353
+ tags:
9354
+ - collection
9355
+ summary: Resolve the collection for an explicit Hub domain (public endpoint).
9356
+ operationId: collection_getByDomain
9357
+ security: []
9358
+ parameters:
9359
+ - name: domain
9360
+ in: path
9361
+ required: true
9362
+ schema:
9363
+ type: string
9364
+ responses:
9365
+ 200:
9366
+ description: Success
9367
+ content:
9368
+ application/json:
9369
+ schema:
9370
+ $ref: "#/components/schemas/CollectionResponse"
9371
+ 400:
9372
+ description: Bad request
9373
+ 401:
9374
+ description: Unauthorized
9375
+ 404:
9376
+ description: Not found
9377
+ /public/collection/getByHub:
9378
+ get:
9379
+ tags:
9380
+ - collection
9381
+ summary: Resolve the collection for the current Hub domain (public endpoint).
9382
+ operationId: collection_getByHub
9383
+ security: []
9384
+ responses:
9385
+ 200:
9386
+ description: Success
9387
+ content:
9388
+ application/json:
9389
+ schema:
9390
+ $ref: "#/components/schemas/CollectionResponse"
9391
+ 400:
9392
+ description: Bad request
9393
+ 401:
9394
+ description: Unauthorized
9395
+ 404:
9396
+ description: Not found
9208
9397
  /public/collection/getShortId/{shortId}:
9209
9398
  get:
9210
9399
  tags:
@@ -10680,6 +10869,11 @@ paths:
10680
10869
  required: false
10681
10870
  schema:
10682
10871
  type: boolean
10872
+ - name: namespace
10873
+ in: query
10874
+ required: false
10875
+ schema:
10876
+ type: string
10683
10877
  responses:
10684
10878
  200:
10685
10879
  description: Success
@@ -10693,6 +10887,32 @@ paths:
10693
10887
  description: Unauthorized
10694
10888
  404:
10695
10889
  description: Not found
10890
+ /public/collection/{collectionId}/facets/namespaces:
10891
+ get:
10892
+ tags:
10893
+ - facets
10894
+ summary: facets.publicNamespaces
10895
+ operationId: facets_publicNamespaces
10896
+ security: []
10897
+ parameters:
10898
+ - name: collectionId
10899
+ in: path
10900
+ required: true
10901
+ schema:
10902
+ type: string
10903
+ responses:
10904
+ 200:
10905
+ description: Success
10906
+ content:
10907
+ application/json:
10908
+ schema:
10909
+ $ref: "#/components/schemas/FacetNamespaceListResponse"
10910
+ 400:
10911
+ description: Bad request
10912
+ 401:
10913
+ description: Unauthorized
10914
+ 404:
10915
+ description: Not found
10696
10916
  /public/collection/{collectionId}/facets/query:
10697
10917
  post:
10698
10918
  tags:
@@ -10748,6 +10968,11 @@ paths:
10748
10968
  required: false
10749
10969
  schema:
10750
10970
  type: boolean
10971
+ - name: namespace
10972
+ in: query
10973
+ required: false
10974
+ schema:
10975
+ type: string
10751
10976
  responses:
10752
10977
  200:
10753
10978
  description: Success
@@ -18908,6 +19133,10 @@ components:
18908
19133
  type: string
18909
19134
  redirectUrl:
18910
19135
  type: string
19136
+ hubName:
19137
+ type: string
19138
+ hubCustomDomain:
19139
+ type: string
18911
19140
  shortId:
18912
19141
  type: string
18913
19142
  dark:
@@ -18942,6 +19171,16 @@ components:
18942
19171
  - variants
18943
19172
  - batches
18944
19173
  - defaultAuthKitId
19174
+ HubAvailabilityResponse:
19175
+ type: object
19176
+ properties:
19177
+ available:
19178
+ type: boolean
19179
+ domain:
19180
+ type: string
19181
+ required:
19182
+ - available
19183
+ - domain
18945
19184
  AppConfig:
18946
19185
  type: object
18947
19186
  properties:
@@ -20552,6 +20791,8 @@ components:
20552
20791
  type: string
20553
20792
  description:
20554
20793
  type: string
20794
+ namespace:
20795
+ type: string
20555
20796
  cardinality:
20556
20797
  type: object
20557
20798
  additionalProperties: true
@@ -20647,6 +20888,8 @@ components:
20647
20888
  type: string
20648
20889
  description:
20649
20890
  type: string
20891
+ namespace:
20892
+ type: string
20650
20893
  cardinality:
20651
20894
  type: object
20652
20895
  additionalProperties: true
@@ -20742,6 +20985,8 @@ components:
20742
20985
  type: boolean
20743
20986
  includeDeleted:
20744
20987
  type: boolean
20988
+ namespace:
20989
+ type: string
20745
20990
  query:
20746
20991
  type: object
20747
20992
  additionalProperties: true
@@ -20809,11 +21054,24 @@ components:
20809
21054
  additionalProperties: true
20810
21055
  reserved:
20811
21056
  type: boolean
21057
+ namespace:
21058
+ type: string
20812
21059
  PublicFacetListParams:
20813
21060
  type: object
20814
21061
  properties:
20815
21062
  includeValues:
20816
21063
  type: boolean
21064
+ namespace:
21065
+ type: string
21066
+ FacetNamespaceListResponse:
21067
+ type: object
21068
+ properties:
21069
+ namespaces:
21070
+ type: array
21071
+ items:
21072
+ type: string
21073
+ required:
21074
+ - namespaces
20817
21075
  FacetGetParams:
20818
21076
  type: object
20819
21077
  properties:
@@ -41,6 +41,10 @@ export interface Collection {
41
41
  groupTags?: string[];
42
42
  /** Whether the collection has a custom domain */
43
43
  redirectUrl?: string;
44
+ /** The claimed Hub subdomain prefix (e.g. "acme" → acme.mysmartlinks.app) */
45
+ hubName?: string;
46
+ /** The collection's bring-your-own custom Hub domain (e.g. "hub.acme.com") */
47
+ hubCustomDomain?: string;
44
48
  /** The shortId of this collection */
45
49
  shortId: string;
46
50
  /** if dark mode is enabled for this collection */
@@ -59,6 +63,21 @@ export interface Collection {
59
63
  export type CollectionResponse = Collection;
60
64
  export type CollectionCreateRequest = Omit<Collection, 'id' | 'shortId'>;
61
65
  export type CollectionUpdateRequest = Partial<Omit<Collection, 'id' | 'shortId'>>;
66
+ /**
67
+ * Which load balancer / certificate map a custom domain registration targets.
68
+ * - `"smartlinks"` (default): the id.smartlinks.app load balancer (legacy behaviour)
69
+ * - `"hub"`: the SmartLinks Hub load balancer
70
+ */
71
+ export type DomainTarget = "smartlinks" | "hub";
72
+ /**
73
+ * Response from checking whether a Hub subdomain name is available.
74
+ */
75
+ export interface HubAvailabilityResponse {
76
+ /** Whether the name can be claimed by this collection */
77
+ available: boolean;
78
+ /** The full domain that was checked (e.g. "acme.mysmartlinks.app") */
79
+ domain: string;
80
+ }
62
81
  /**
63
82
  * Configuration for an app module within a collection.
64
83
  */
@@ -6,6 +6,7 @@ export interface FacetDefinition {
6
6
  key: string;
7
7
  name: string;
8
8
  description?: string | null;
9
+ namespace?: string | null;
9
10
  cardinality?: "single" | "multi";
10
11
  kind?: "system" | "custom";
11
12
  hierarchical?: boolean;
@@ -46,6 +47,7 @@ export interface FacetDefinitionWriteInput {
46
47
  key?: string;
47
48
  name: string;
48
49
  description?: string | null;
50
+ namespace?: string | null;
49
51
  cardinality?: "single" | "multi";
50
52
  kind?: "system" | "custom";
51
53
  hierarchical?: boolean;
@@ -83,6 +85,7 @@ export interface FacetQueryRequest {
83
85
  facetKeys?: string[];
84
86
  includeEmpty?: boolean;
85
87
  includeDeleted?: boolean;
88
+ namespace?: string | null;
86
89
  query?: ProductQueryRequest["query"] & {
87
90
  facetEquals?: Record<string, JsonValue | JsonValue[]>;
88
91
  };
@@ -109,9 +112,14 @@ export interface FacetListParams {
109
112
  includeDeleted?: boolean;
110
113
  kind?: "system" | "custom";
111
114
  reserved?: boolean;
115
+ namespace?: string;
112
116
  }
113
117
  export interface PublicFacetListParams {
114
118
  includeValues?: boolean;
119
+ namespace?: string;
120
+ }
121
+ export interface FacetNamespaceListResponse {
122
+ namespaces: string[];
115
123
  }
116
124
  export interface FacetGetParams {
117
125
  includeValues?: boolean;
@@ -1,6 +1,6 @@
1
1
  # Smartlinks API Summary
2
2
 
3
- Version: 1.15.0 | Generated: 2026-06-03T10:03:05.999Z
3
+ Version: 1.15.2 | Generated: 2026-07-05T07:39:20.416Z
4
4
 
5
5
  This is a concise summary of all available API functions and types.
6
6
 
@@ -3606,6 +3606,8 @@ interface Collection {
3606
3606
  } // User roles mapping with user IDs as keys and role names as values
3607
3607
  groupTags?: string[] // Array of group tag names
3608
3608
  redirectUrl?: string // Whether the collection has a custom domain
3609
+ hubName?: string
3610
+ hubCustomDomain?: string
3609
3611
  shortId: string, // The shortId of this collection
3610
3612
  dark?: boolean // if dark mode is enabled for this collection
3611
3613
  primaryColor?: string
@@ -3618,6 +3620,14 @@ interface Collection {
3618
3620
  }
3619
3621
  ```
3620
3622
 
3623
+ **HubAvailabilityResponse** (interface)
3624
+ ```typescript
3625
+ interface HubAvailabilityResponse {
3626
+ available: boolean
3627
+ domain: string
3628
+ }
3629
+ ```
3630
+
3621
3631
  **AppConfig** (interface)
3622
3632
  ```typescript
3623
3633
  interface AppConfig {
@@ -3657,6 +3667,8 @@ interface AppsConfigResponse {
3657
3667
 
3658
3668
  **CollectionUpdateRequest** = `Partial<Omit<Collection, 'id' | 'shortId'>>`
3659
3669
 
3670
+ **DomainTarget** = `"smartlinks" | "hub"`
3671
+
3660
3672
  ### common
3661
3673
 
3662
3674
  **IdField** = `'userId' | 'contactId'`
@@ -5027,6 +5039,7 @@ interface FacetDefinition {
5027
5039
  key: string
5028
5040
  name: string
5029
5041
  description?: string | null
5042
+ namespace?: string | null
5030
5043
  cardinality?: "single" | "multi"
5031
5044
  kind?: "system" | "custom"
5032
5045
  hierarchical?: boolean
@@ -5075,6 +5088,7 @@ interface FacetDefinitionWriteInput {
5075
5088
  key?: string
5076
5089
  name: string
5077
5090
  description?: string | null
5091
+ namespace?: string | null
5078
5092
  cardinality?: "single" | "multi"
5079
5093
  kind?: "system" | "custom"
5080
5094
  hierarchical?: boolean
@@ -5132,6 +5146,7 @@ interface FacetQueryRequest {
5132
5146
  facetKeys?: string[]
5133
5147
  includeEmpty?: boolean
5134
5148
  includeDeleted?: boolean
5149
+ namespace?: string | null
5135
5150
  query?: ProductQueryRequest["query"] & {
5136
5151
  facetEquals?: Record<string, JsonValue | JsonValue[]>
5137
5152
  }
@@ -5170,6 +5185,7 @@ interface FacetListParams {
5170
5185
  includeDeleted?: boolean
5171
5186
  kind?: "system" | "custom"
5172
5187
  reserved?: boolean
5188
+ namespace?: string
5173
5189
  }
5174
5190
  ```
5175
5191
 
@@ -5177,6 +5193,14 @@ interface FacetListParams {
5177
5193
  ```typescript
5178
5194
  interface PublicFacetListParams {
5179
5195
  includeValues?: boolean
5196
+ namespace?: string
5197
+ }
5198
+ ```
5199
+
5200
+ **FacetNamespaceListResponse** (interface)
5201
+ ```typescript
5202
+ interface FacetNamespaceListResponse {
5203
+ namespaces: string[]
5180
5204
  }
5181
5205
  ```
5182
5206
 
@@ -8604,6 +8628,24 @@ Retrieves all Collections.
8604
8628
  **getShortId**(shortId: string) → `Promise<CollectionResponse>`
8605
8629
  Retrieve a collection by its shortId (public endpoint).
8606
8630
 
8631
+ **getByHub**() → `Promise<CollectionResponse>`
8632
+ Resolve the collection for the current Hub domain (public endpoint). The server derives the requesting domain from the request headers (`X-Source-Domain` / `X-Forwarded-Host` / `Host`), so no identifier is passed — this is the call a Hub frontend makes on load to find out which collection it is serving, whether it's reached via `{brand}.mysmartlinks.app` or a bring-your-own custom domain (e.g. `hub.acme.com`).
8633
+
8634
+ **getByDomain**(domain: string) → `Promise<CollectionResponse>`
8635
+ Resolve the collection for an explicit Hub domain (public endpoint). Unlike {@link getByHub}, the domain is passed explicitly rather than derived from request headers — use this for raw/cross-origin calls where the Hub frontend knows its own hostname (e.g. "erbauer.mysmartlinks.app").
8636
+
8637
+ **checkHubAvailability**(collectionId: string, name: string) → `Promise<HubAvailabilityResponse>`
8638
+ Check whether a Hub subdomain name is available to claim (admin only).
8639
+
8640
+ **claimHub**(collectionId: string, hubName: string) → `Promise<CollectionResponse>`
8641
+ Claim or rename the Hub subdomain for a collection (admin only). Maps `{hubName}.mysmartlinks.app` to the collection. If the collection already had a different hub name, the previous subdomain is released automatically.
8642
+
8643
+ **registerDomain**(collectionId: string, domain: string, target: DomainTarget = "smartlinks") → `Promise<any>`
8644
+ Register a custom domain for a collection and provision its managed certificate (admin only). `"smartlinks"` (the id.smartlinks.app load balancer). Pass `"hub"` to register a bring-your-own Hub domain.
8645
+
8646
+ **getDomainStatus**(collectionId: string, target: DomainTarget = "smartlinks") → `Promise<any>`
8647
+ Get the managed-certificate status for a collection's custom domain (admin only). or `"hub"` (uses `hubCustomDomain`)
8648
+
8607
8649
  **getSettings**(collectionId: string, settingGroup: string, admin?: boolean) → `Promise<any>`
8608
8650
  Retrieve a specific settings group for a collection. Public reads return the public view of the settings group. If the stored payload contains a top-level `admin` object, that block is omitted from public responses and included when `admin === true`.
8609
8651
 
@@ -8915,6 +8957,8 @@ Delete a crate for a collection (admin only). This performs a soft delete. ```ty
8915
8957
  **query**(collectionId: string,
8916
8958
  body: FacetQueryRequest) → `Promise<FacetQueryResponse>`
8917
8959
 
8960
+ **namespaces**(collectionId: string) → `Promise<FacetNamespaceListResponse>`
8961
+
8918
8962
  **publicList**(collectionId: string,
8919
8963
  params?: PublicFacetListParams) → `Promise<FacetListResponse>`
8920
8964
 
@@ -8932,6 +8976,8 @@ Delete a crate for a collection (admin only). This performs a soft delete. ```ty
8932
8976
  **publicQuery**(collectionId: string,
8933
8977
  body: FacetQueryRequest) → `Promise<FacetQueryResponse>`
8934
8978
 
8979
+ **publicNamespaces**(collectionId: string) → `Promise<FacetNamespaceListResponse>`
8980
+
8935
8981
  ### form
8936
8982
 
8937
8983
  **get**(collectionId: string, formId: string, admin?: boolean) → `Promise<any>`
@@ -42,6 +42,21 @@ includeValues?: boolean
42
42
  includeDeleted?: boolean
43
43
  kind?: 'system' | 'custom'
44
44
  reserved?: boolean
45
+ namespace?: string
46
+ ```
47
+
48
+ When `namespace` is provided, returns facets matching that namespace plus global facets (`namespace: null`). Omit the param to return all facets.
49
+
50
+ ### List namespaces
51
+
52
+ ```ts
53
+ GET /api/v1/admin/collection/:collectionId/facets/namespaces
54
+ ```
55
+
56
+ Returns all distinct namespaces in use for the collection (excludes globals).
57
+
58
+ ```ts
59
+ { namespaces: string[] }
45
60
  ```
46
61
 
47
62
  ### Create facet definition
@@ -50,6 +65,8 @@ reserved?: boolean
50
65
  POST /api/v1/admin/collection/:collectionId/facets
51
66
  ```
52
67
 
68
+ Pass `namespace` in the body to scope the facet to a domain (e.g. `"dpp"`, `"nutrition"`). Omit it to create a global facet.
69
+
53
70
  ### Get facet definition
54
71
 
55
72
  ```ts
@@ -146,6 +163,8 @@ Supported query filters now:
146
163
  - `tags`
147
164
  - `facetEquals`
148
165
 
166
+ Body also accepts `namespace` (optional) to scope aggregation to a namespace plus global facets.
167
+
149
168
  ## Public endpoints
150
169
 
151
170
  ### List facet definitions
@@ -158,6 +177,21 @@ Optional query params:
158
177
 
159
178
  ```ts
160
179
  includeValues?: boolean
180
+ namespace?: string
181
+ ```
182
+
183
+ When `namespace` is provided, returns facets matching that namespace plus global facets (`namespace: null`). Omit the param to return all facets.
184
+
185
+ ### List namespaces
186
+
187
+ ```ts
188
+ GET /api/v1/public/collection/:collectionId/facets/namespaces
189
+ ```
190
+
191
+ Returns all distinct namespaces in use for the collection (excludes globals).
192
+
193
+ ```ts
194
+ { namespaces: string[] }
161
195
  ```
162
196
 
163
197
  ### Get facet definition
@@ -215,6 +249,7 @@ export interface FacetDefinition {
215
249
  key: string
216
250
  name: string
217
251
  description?: string | null
252
+ namespace?: string | null
218
253
  cardinality: 'single' | 'multi'
219
254
  kind: 'system' | 'custom'
220
255
  hierarchical: boolean
@@ -230,6 +265,7 @@ export interface FacetDefinitionWriteInput {
230
265
  key?: string
231
266
  name: string
232
267
  description?: string | null
268
+ namespace?: string | null
233
269
  cardinality?: 'single' | 'multi'
234
270
  kind?: 'system' | 'custom'
235
271
  hierarchical?: boolean
@@ -305,6 +341,7 @@ export interface FacetQueryRequest {
305
341
  facetKeys?: string[]
306
342
  includeEmpty?: boolean
307
343
  includeDeleted?: boolean
344
+ namespace?: string | null
308
345
  query?: {
309
346
  search?: string
310
347
  status?: string[]
@@ -326,6 +363,10 @@ export interface FacetBucket {
326
363
  count: number
327
364
  }
328
365
 
366
+ export interface FacetNamespaceListResponse {
367
+ namespaces: string[]
368
+ }
369
+
329
370
  export interface FacetQueryResponse {
330
371
  items: Array<{
331
372
  facet: FacetDefinition
@@ -344,4 +385,5 @@ export interface FacetQueryResponse {
344
385
  - treat facet definitions and facet values as collection-scoped resources
345
386
  - use the facet API to manage definitions and values
346
387
  - use product read/write routes to assign facet data onto products
347
- - treat `label` and `category` as reserved system facets when present
388
+ - treat `label` and `category` as reserved system facets when present
389
+ - facets with `namespace: null` are global and appear in all contexts; namespaced facets belong to a specific domain (e.g. `"dpp"`, `"nutrition"`)