@doswiftly/storefront-operations 13.1.0 → 15.1.0

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/schema.graphql CHANGED
@@ -32,12 +32,14 @@ directive @inContext(
32
32
  preferredLocationId: ID
33
33
  ) on MUTATION | QUERY | SUBSCRIPTION
34
34
 
35
- """Generic attribute"""
35
+ """
36
+ A generic key/value attribute — used for line item properties and other free-form metadata.
37
+ """
36
38
  type Attribute {
37
- """Attribute key"""
39
+ """Attribute key."""
38
40
  key: String!
39
41
 
40
- """Attribute value"""
42
+ """Attribute value. Null when the key is set without an associated value."""
41
43
  value: String
42
44
  }
43
45
 
@@ -63,7 +65,9 @@ type AttributeDefinition {
63
65
  """Attribute ID"""
64
66
  id: ID!
65
67
 
66
- """Whether attribute is filterable"""
68
+ """
69
+ Whether attribute is filterable (admin toggle). For storefront UI rendering signal use `isUsableAsFilter` (computed).
70
+ """
67
71
  isFilterable: Boolean!
68
72
 
69
73
  """Whether attribute is visible on product pages"""
@@ -140,6 +144,34 @@ type AttributeFilterValue {
140
144
  value: String!
141
145
  }
142
146
 
147
+ """Paginated + searchable attribute options (Relay Connection)"""
148
+ type AttributeFilterValueConnection {
149
+ """Paginated edges z cursorami"""
150
+ edges: [AttributeFilterValueEdge!]!
151
+
152
+ """Shortcut: edges.map(e => e.node)"""
153
+ nodes: [AttributeFilterValue!]!
154
+
155
+ """Relay pagination info (hasNextPage, hasPreviousPage, cursors)"""
156
+ pageInfo: PageInfo!
157
+
158
+ """
159
+ Total number of attribute options matching the filter (po zastosowaniu search + context). NIE zmienia się przy paginacji — pokazuje pełną liczbę dla counter UI.
160
+ """
161
+ totalCount: Int!
162
+ }
163
+
164
+ """Edge w AttributeFilterValueConnection (Relay spec)"""
165
+ type AttributeFilterValueEdge {
166
+ """
167
+ Opaque pagination cursor (base64-encoded). Echo as `after` for next page.
168
+ """
169
+ cursor: String!
170
+
171
+ """Attribute filter value (option + product count + swatch)"""
172
+ node: AttributeFilterValue!
173
+ }
174
+
143
175
  """Attribute input"""
144
176
  input AttributeInput {
145
177
  """Attribute key"""
@@ -157,6 +189,37 @@ enum AttributeOptionSurchargeType {
157
189
  PERCENT
158
190
  }
159
191
 
192
+ """Input dla attributeOptionsSearch query"""
193
+ input AttributeOptionsSearchInput {
194
+ """Opaque cursor z pageInfo.endCursor poprzedniej strony"""
195
+ after: String
196
+
197
+ """
198
+ Produktowy kontekst (categoryId/collectionId/searchQuery/currentFilters) dla accurate productCount. Exclude-self: gdy currentFilters zawiera ten sam atrybut, jest pomijany.
199
+ """
200
+ contextInput: AvailableFiltersInput
201
+
202
+ """Liczba zwracanych opcji (default 50, max 100)"""
203
+ first: Int
204
+
205
+ """Attribute handle (URL-friendly identifier, np. "licencja")"""
206
+ handle: String!
207
+
208
+ """Wyszukiwanie po value/label (case-insensitive ILIKE, max 100 znaków)"""
209
+ search: String
210
+
211
+ """
212
+ Sort — COUNT_DESC default (most popular first), LABEL_ASC dla alphabetical
213
+ """
214
+ sort: AttributeOptionsSearchSort
215
+ }
216
+
217
+ """Sort order for attributeOptionsSearch results"""
218
+ enum AttributeOptionsSearchSort {
219
+ COUNT_DESC
220
+ LABEL_ASC
221
+ }
222
+
160
223
  """Min/max bounds for numeric attributes"""
161
224
  type AttributeRangeBounds {
162
225
  """Currency code for CURRENCY type"""
@@ -169,64 +232,88 @@ type AttributeRangeBounds {
169
232
  min: Float
170
233
  }
171
234
 
172
- """Typed snapshot of customer-filled attribute selection (Faza 1 R5)"""
235
+ """
236
+ A configurator selection that the buyer filled in on a line item — typed snapshot taken at add-to-cart and frozen on the resulting order. Distinct from `CartLine.attributes` (free-form key/value line item properties): selections are validated against the product attribute definition, carry pricing surcharges and can link to a hidden component variant.
237
+ """
173
238
  type AttributeSelection {
174
- """AttributeDefinition ID (snapshot at addItem)"""
239
+ """ID of the attribute definition this selection refers to."""
175
240
  attributeDefinitionId: ID!
176
241
 
177
- """AttributeDefinition name (snapshot)"""
242
+ """Display name of the attribute at the moment it was added to the cart."""
178
243
  attributeName: String!
179
244
 
180
- """Billing mode; null = informational only"""
245
+ """
246
+ How the surcharge is charged: BUNDLED (folded into the line unit price) or SEPARATE_LINE (its own line on the order). Null when the selection is informational and has no surcharge.
247
+ """
181
248
  billingMode: AttributeBillingMode
182
249
 
183
- """Filling mode (snapshot)"""
250
+ """
251
+ Who supplies the value: MERCHANT (set on the product), CUSTOMER (filled at add-to-cart) or BOTH.
252
+ """
184
253
  fillingMode: AttributeFillingMode!
185
254
 
186
- """Linked ProductVariant ID for component stock (Faza 1.5)"""
255
+ """
256
+ Linked variant whose stock is decremented when this option is chosen — used by the hidden-product configurator pattern (e.g. finish, accessory). Null when no component stock is tied to the selection.
257
+ """
187
258
  linkedVariantId: ID
188
259
 
189
- """Selected option ID (SELECT/RADIO/CHECKBOX)"""
260
+ """
261
+ Selected option ID for single-choice types (SELECT, RADIO, single-CHECKBOX).
262
+ """
190
263
  optionId: ID
191
264
 
192
- """Selected option IDs (MULTI_SELECT — Faza 2)"""
265
+ """
266
+ Selected option IDs for multi-choice types (MULTI_SELECT, CHECKBOX list).
267
+ """
193
268
  optionIds: [ID!]
194
269
 
195
- """Selected option label (snapshot)"""
270
+ """Display label of the selected option at the moment of selection."""
196
271
  optionLabel: String
197
272
 
198
273
  """
199
- Surcharge amount snapshot (FIXED = grosze; PERCENT = thousandths of percent)
274
+ Surcharge attached to this selection in minor units of the shop currency when `surchargeType` is FIXED; thousandths of a percent (per mille of a percent) when PERCENT. Already reflected in the line cost.
200
275
  """
201
276
  surchargeAmount: Int!
202
277
 
203
- """Surcharge type (snapshot)"""
278
+ """
279
+ How the surcharge is calculated — FIXED (absolute amount) or PERCENT. Null when the selection has no surcharge.
280
+ """
204
281
  surchargeType: AttributeOptionSurchargeType
205
282
 
206
- """Tax class ID (snapshot); null = inherit from variant"""
283
+ """
284
+ Tax class applied to this selection. Null means the line inherits its tax class from the variant.
285
+ """
207
286
  taxClassId: ID
208
287
 
209
- """Free-text value (TEXT/TEXTAREA/NUMBER/DATE)"""
288
+ """Free-text value for TEXT, TEXTAREA, NUMBER or DATE attribute types."""
210
289
  textValue: String
211
290
 
212
- """AttributeDefinition type (snapshot)"""
291
+ """
292
+ Attribute data type (TEXT, SELECT, RADIO, CHECKBOX, NUMBER, DATE, COLOR, etc.). Drives which value field is populated.
293
+ """
213
294
  type: AttributeType!
214
295
  }
215
296
 
216
297
  """
217
- Customer-filled attribute selection (Faza 1 R5 — server-side validated)
298
+ A configurator selection on a cart line — server-side validated against the product attribute definition. The value goes into one of `optionId`, `optionIds` or `textValue` depending on the attribute type.
218
299
  """
219
300
  input AttributeSelectionInput {
220
- """AttributeDefinition ID"""
301
+ """ID of the attribute definition this selection refers to."""
221
302
  attributeDefinitionId: ID!
222
303
 
223
- """Selected option ID for SELECT/RADIO/CHECKBOX"""
304
+ """
305
+ Selected option ID for single-choice attribute types (SELECT, RADIO, single-CHECKBOX).
306
+ """
224
307
  optionId: ID
225
308
 
226
- """Selected option IDs for MULTI_SELECT (Faza 2)"""
309
+ """
310
+ Selected option IDs for multi-choice attribute types (MULTI_SELECT, CHECKBOX list).
311
+ """
227
312
  optionIds: [ID!]
228
313
 
229
- """Free-text value for TEXT/TEXTAREA/NUMBER/DATE"""
314
+ """
315
+ Free-text value for TEXT, TEXTAREA, NUMBER or DATE attribute types (max 2000 chars).
316
+ """
230
317
  textValue: String
231
318
  }
232
319
 
@@ -271,7 +358,7 @@ type AvailableFilters {
271
358
  availableCount: Int!
272
359
 
273
360
  """
274
- Faza 3 (2026-05-17): canonical Brand entities z product counts w current context. Storefront UI renderuje checkbox list / dropdown z logo per brand. Klik → `filters: [{brand: {slug}}]`. Tylko brandy z >0 produktów w current product set + isActive=true.
361
+ Faza 3 (2026-05-17): canonical Brand entities z product counts w current context. Storefront UI renderuje checkbox list / dropdown z logo per brand. Klik → `filters: [{brand: {handle}}]`. Tylko brandy z >0 produktów w current product set + isActive=true.
275
362
  """
276
363
  brands: [BrandFilterValue!]
277
364
 
@@ -309,54 +396,89 @@ input AvailableFiltersInput {
309
396
  searchQuery: String
310
397
  }
311
398
 
312
- """Available payment methods for checkout"""
399
+ """
400
+ Result of `availablePaymentMethods` — the methods to render in the payment picker plus the merchant default.
401
+ """
313
402
  type AvailablePaymentMethods {
314
- """Default payment method"""
403
+ """
404
+ Method marked as the merchant default — pre-select in the picker. Null when no default is configured.
405
+ """
315
406
  defaultMethod: PaymentMethod
316
407
 
317
- """List of available payment methods"""
408
+ """Payment methods active for the shop, sorted by `position`."""
318
409
  methods: [PaymentMethod!]!
319
410
  }
320
411
 
321
- """Available shipping method"""
412
+ """
413
+ A shipping method offered to the buyer for the current cart and destination — what to render in the shipping picker.
414
+ """
322
415
  type AvailableShippingMethod {
323
- """Carrier information"""
416
+ """
417
+ Carrier behind the method. Null when the merchant configured a custom non-carrier method.
418
+ """
324
419
  carrier: ShippingCarrier
325
420
 
326
- """Method description"""
421
+ """
422
+ Destination type — HOME (courier to the street address), PICKUP_POINT (staffed counter) or LOCKER (parcel locker). Drives whether the storefront must render a pickup-point picker for the method instead of inferring it from the method name.
423
+ """
424
+ deliveryType: DeliveryType!
425
+
426
+ """
427
+ Optional method description shown under the name (e.g. "Saturday delivery available").
428
+ """
327
429
  description: String
328
430
 
329
- """Estimated delivery time"""
431
+ """
432
+ Estimated delivery window. Null when the merchant has not configured an estimate for this method.
433
+ """
330
434
  estimatedDelivery: DeliveryEstimate
331
435
 
332
- """Free shipping progress if threshold exists"""
436
+ """
437
+ Progress towards the free-shipping threshold for this method, when one is configured. Null otherwise.
438
+ """
333
439
  freeShippingProgress: FreeShippingProgress
334
440
 
335
- """Shipping method ID (used as handle for selection)"""
441
+ """
442
+ Stable ID of the shipping method. Pass to `cartSelectShippingMethod` to select it.
443
+ """
336
444
  id: ID!
337
445
 
338
- """Whether shipping is free"""
446
+ """
447
+ True when the price is zero — the method is free for this cart (e.g. free-shipping threshold met).
448
+ """
339
449
  isFree: Boolean!
340
450
 
341
- """Method name"""
451
+ """Display name of the method (e.g. "DPD Standard")."""
342
452
  name: String!
343
453
 
344
- """Shipping price"""
454
+ """
455
+ Cost of the method for the current cart (in the buyer preferred currency).
456
+ """
345
457
  price: Money!
346
458
 
347
- """Sort order for display"""
459
+ """
460
+ Merchant-configured display position — lower values come first in the picker.
461
+ """
348
462
  sortOrder: Int!
349
463
  }
350
464
 
351
- """Available shipping methods result"""
465
+ """
466
+ Result of `availableShippingMethods` / `cart.availableShippingMethods` — the methods to render plus optional free-shipping progress and any user errors.
467
+ """
352
468
  type AvailableShippingMethodsPayload {
353
- """Best free shipping progress across all methods"""
469
+ """
470
+ Best free-shipping progress across all returned methods. Use to render a single banner above the picker.
471
+ """
354
472
  freeShippingProgress: FreeShippingProgress
355
473
 
356
- """Available shipping methods"""
474
+ """
475
+ Methods available for the current cart and destination, sorted by `sortOrder`.
476
+ """
357
477
  methods: [AvailableShippingMethod!]!
358
478
 
359
- """User errors"""
479
+ """
480
+ Validation / availability errors — e.g. `DIGITAL_ONLY_NO_SHIPPING` when the cart contains only non-physical items. Branch on `code`.
481
+ """
360
482
  userErrors: [UserError!]!
361
483
  }
362
484
 
@@ -431,6 +553,9 @@ type BlogCategory {
431
553
  """Category description"""
432
554
  description: String
433
555
 
556
+ """URL-friendly handle"""
557
+ handle: String!
558
+
434
559
  """Category ID"""
435
560
  id: ID!
436
561
 
@@ -445,9 +570,6 @@ type BlogCategory {
445
570
 
446
571
  """SEO metadata"""
447
572
  seo: SEO
448
-
449
- """URL-friendly slug"""
450
- slug: String!
451
573
  }
452
574
 
453
575
  """Blog post"""
@@ -479,6 +601,9 @@ type BlogPost {
479
601
  """Featured image"""
480
602
  featuredImage: Image
481
603
 
604
+ """URL-friendly handle"""
605
+ handle: String!
606
+
482
607
  """Post ID"""
483
608
  id: ID!
484
609
 
@@ -494,9 +619,6 @@ type BlogPost {
494
619
  """SEO metadata"""
495
620
  seo: SEO
496
621
 
497
- """URL-friendly slug"""
498
- slug: String!
499
-
500
622
  """Post status"""
501
623
  status: BlogPostStatus!
502
624
 
@@ -552,6 +674,9 @@ enum BlogPostStatus {
552
674
 
553
675
  """Blog tag"""
554
676
  type BlogTag {
677
+ """URL-friendly handle"""
678
+ handle: String!
679
+
555
680
  """Tag ID"""
556
681
  id: ID!
557
682
 
@@ -560,9 +685,6 @@ type BlogTag {
560
685
 
561
686
  """Number of posts with this tag"""
562
687
  postCount: Int!
563
-
564
- """URL-friendly slug"""
565
- slug: String!
566
688
  }
567
689
 
568
690
  """Bot protection configuration (platform-level)"""
@@ -589,25 +711,21 @@ type BotProtectionProviderInfo {
589
711
  siteKey: String!
590
712
  }
591
713
 
592
- """Shop brand metadata (logo, colors, slogan)"""
714
+ """
715
+ Canonical product brand entity (np. Funko, Nike). Distinct od ShopBrand (shop branding metadata).
716
+ """
593
717
  type Brand {
594
- """Primary + secondary brand colors"""
595
- colors: BrandColors
596
-
597
- """Cover image / hero banner"""
598
- coverImage: Image
599
-
600
- """Primary logo"""
601
- logo: Image
718
+ """URL-friendly handle (e.g. "funko" → /brands/funko). Stable per-shop."""
719
+ handle: String!
602
720
 
603
- """Short brand description"""
604
- shortDescription: String
721
+ """Brand unique identifier"""
722
+ id: ID!
605
723
 
606
- """Marketing slogan / tagline"""
607
- slogan: String
724
+ """Brand logo URL (CDN-served, storefront-rendered)"""
725
+ logo: String
608
726
 
609
- """Square logo variant (favicons, app tiles)"""
610
- squareLogo: Image
727
+ """Brand display name (e.g. "Funko", "Nintendo")"""
728
+ name: String!
611
729
  }
612
730
 
613
731
  """Single brand color group (background + foreground hex)"""
@@ -627,17 +745,20 @@ type BrandColors {
627
745
 
628
746
  """Filter products po brand (canonical entity)"""
629
747
  input BrandFilter {
630
- """Brand ID — exact UUID match"""
631
- id: ID
632
-
633
748
  """
634
- Brand slug — URL-friendly identifier. Preferowany over `id` dla storefront refetch (stable po URL share).
749
+ Brand handle — URL-friendly identifier. Preferowany over `id` dla storefront refetch (stable po URL share).
635
750
  """
636
- slug: String
751
+ handle: String
752
+
753
+ """Brand ID — exact UUID match"""
754
+ id: ID
637
755
  }
638
756
 
639
757
  """Brand filter value z product count"""
640
758
  type BrandFilterValue {
759
+ """Brand handle (refetch payload — paste w ProductFilter.brand.handle)"""
760
+ handle: String!
761
+
641
762
  """Brand ID"""
642
763
  id: ID!
643
764
 
@@ -649,26 +770,6 @@ type BrandFilterValue {
649
770
 
650
771
  """Liczba produktów z tym brandem w current product set"""
651
772
  productCount: Int!
652
-
653
- """Brand slug (refetch payload — paste w ProductFilter.brand.slug)"""
654
- slug: String!
655
- }
656
-
657
- """
658
- Brand summary — minimalna projekcja dla storefront catalog + filter rendering
659
- """
660
- type BrandSummary {
661
- """Brand unique identifier"""
662
- id: ID!
663
-
664
- """Brand logo URL (CDN-served, storefront-rendered)"""
665
- logo: String
666
-
667
- """Brand display name (e.g. "Funko", "Nintendo")"""
668
- name: String!
669
-
670
- """URL-friendly slug — używane dla future /marka/[slug] landing pages"""
671
- slug: String!
672
773
  }
673
774
 
674
775
  """Business hours for a day"""
@@ -765,61 +866,79 @@ type CarrierShippingRate {
765
866
  serviceName: String!
766
867
  }
767
868
 
768
- """Shopping cart"""
869
+ """
870
+ A shopping cart — the buyer-facing aggregate that holds items, totals, buyer identity, addresses, selected shipping and payment methods, gift cards and discount codes through to checkout completion.
871
+ """
769
872
  type Cart implements Node {
770
- """Gift cards applied do tego koszyka (debited at cartComplete)"""
873
+ """
874
+ Gift cards attached to the cart. Each card is debited by its `appliedAmount` when the cart completes.
875
+ """
771
876
  appliedGiftCards: [CartAppliedGiftCard!]!
772
877
 
773
- """Cart attributes"""
878
+ """
879
+ Cart-level custom attributes (free-form key/value). Use for cart-wide metadata such as B2B PO number or marketing source. Replace (not merge) the list with `cartUpdateAttributes`.
880
+ """
774
881
  attributes: [CartAttribute!]!
775
882
 
776
883
  """Available payment methods dla tego cart (shop-configured providers)"""
777
884
  availablePaymentMethods: [PaymentMethod!]!
778
885
 
779
886
  """
780
- Cart-aware shipping methods discovery. Returns empty methods + DIGITAL_ONLY_NO_SHIPPING user error when the cart contains only non-physical items (digital, gift card, service, subscription). Physical / mixed carts get the same method computation as the standalone `availableShippingMethods` query but with subtotal and weight pulled from the cart aggregate.
887
+ Shipping methods available for this cart at the given destination. Reads the cart subtotal and weight directly — for pre-cart preview (e.g. a product detail page calculator) use the top-level `availableShippingMethods(address, cart)` query instead. Returns an empty `methods` list plus a `DIGITAL_ONLY_NO_SHIPPING` user error when the cart has no shippable items; the storefront can use this to skip the shipping step entirely.
781
888
  """
782
889
  availableShippingMethods(address: ShippingAddressInput!): AvailableShippingMethodsPayload!
783
890
 
784
891
  """
785
- Billing address ustawiony przez cartSetBillingAddress (jeśli różny od shipping)
892
+ Billing address attached to the cart via `cartSetBillingAddress`. Null when the buyer reuses the shipping address as billing (the order will then mirror the shipping address).
786
893
  """
787
894
  billingAddress: MailingAddress
788
895
 
789
- """Buyer identity information"""
896
+ """
897
+ Buyer identity attached to the cart (email, phone, country and language hints). Null on a fresh cart before any identity is captured.
898
+ """
790
899
  buyerIdentity: CartBuyerIdentity
791
900
 
792
- """Checkout URL"""
901
+ """
902
+ Hosted checkout URL the storefront may redirect to as a fallback. The recommended flow is to drive checkout through SDK mutations (`cartSetShippingAddress`, `cartSelectShippingMethod`, `cartSelectPaymentMethod`, `cartComplete`).
903
+ """
793
904
  checkoutUrl: URL
794
905
 
795
- """Cost breakdown"""
906
+ """
907
+ Cost breakdown for the cart (subtotal, tax, shipping, discount, grand total).
908
+ """
796
909
  cost: CartCost!
797
910
 
798
- """Creation timestamp"""
911
+ """When the cart was created (ISO 8601)."""
799
912
  createdAt: DateTime!
800
913
 
801
- """Discount allocations"""
914
+ """
915
+ Per-code discount amounts that make up `cost.totalDiscount`. Render line-item discount breakdown from this list.
916
+ """
802
917
  discountAllocations: [CartDiscountAllocation!]!
803
918
 
804
- """Applied discount codes"""
919
+ """Discount codes attached to the cart with their applicability flag."""
805
920
  discountCodes: [CartDiscountCode!]!
806
921
 
807
922
  """
808
- Customer email (D2 persisted via cartUpdateBuyerIdentity). Convenience accessor; pełen kontekst w buyerIdentity.email.
923
+ Convenience accessor — buyer email as last set via `cartUpdateBuyerIdentity`. The same value is available on `buyerIdentity.email`.
809
924
  """
810
925
  email: String
811
926
 
812
- """Unique cart identifier"""
927
+ """
928
+ Stable cart identifier — persist in a cookie / local store between sessions.
929
+ """
813
930
  id: ID!
814
931
 
815
- """Cart line items (Relay Connection)"""
932
+ """Lines in the cart (paginated, Relay Connection)."""
816
933
  lines(after: String, before: String, first: Float, last: Float): CartLineConnection!
817
934
 
818
- """Cart note"""
935
+ """
936
+ Buyer-supplied note (e.g. delivery instructions). Free-form, surfaced to the merchant on the order.
937
+ """
819
938
  note: String
820
939
 
821
940
  """
822
- Customer phone (D2). Convenience accessor; pełen kontekst w buyerIdentity.phone.
941
+ Convenience accessor — buyer phone as last set via `cartUpdateBuyerIdentity`. The same value is available on `buyerIdentity.phone`.
823
942
  """
824
943
  phone: String
825
944
 
@@ -827,43 +946,51 @@ type Cart implements Node {
827
946
  recommendations(first: Int = 4): CartRecommendations
828
947
 
829
948
  """
830
- True if any line in the cart requires physical shipping. False when every line is non-physical (digital, gift card, service, subscription). Use as the single signal to render or skip the shipping picker in checkout.
949
+ True when at least one line in the cart requires physical shipping. False when every line is non-physical (digital, gift card, service, subscription). Use as the single signal to render or skip the shipping step in checkout.
831
950
  """
832
951
  requiresShipping: Boolean!
833
952
 
834
- """Selected payment method (PayU/Stripe/COD/etc.)"""
953
+ """
954
+ The payment method currently selected on the cart. Null until the buyer picks a method via `cartSelectPaymentMethod`.
955
+ """
835
956
  selectedPaymentMethod: PaymentMethod
836
957
 
837
958
  """
838
- Selected shipping method (D8 term unification wcześniej selectedShippingRate)
959
+ The shipping method currently selected on the cart (label + cost). Null until the buyer picks a method.
839
960
  """
840
961
  selectedShippingMethod: CartShippingMethod
841
962
 
842
- """Shipping address ustawiony przez cartSetShippingAddress"""
963
+ """
964
+ Shipping address attached to the cart via `cartSetShippingAddress`. Null until set.
965
+ """
843
966
  shippingAddress: MailingAddress
844
967
 
845
- """Total quantity of all items"""
968
+ """
969
+ Sum of `quantity` across all lines — the badge number for the cart icon.
970
+ """
846
971
  totalQuantity: Int!
847
972
 
848
- """Last update timestamp"""
973
+ """When the cart was last modified (ISO 8601)."""
849
974
  updatedAt: DateTime!
850
975
  }
851
976
 
852
- """Result of adding lines to cart"""
977
+ """Result of `cartAddLines`."""
853
978
  type CartAddLinesPayload {
854
- """Updated cart"""
979
+ """The updated cart on success; null when `userErrors` is non-empty."""
855
980
  cart: Cart
856
981
 
857
982
  """
858
- User errors (code is namespaced e.g. CART_NOT_FOUND, CART_LINE_NOT_FOUND)
983
+ Business / validation errors carrying a stable `CartErrorCode` in `code` (e.g. `CART_NOT_FOUND`, `NOT_ENOUGH_IN_STOCK`).
859
984
  """
860
985
  userErrors: [UserError!]!
861
986
 
862
- """Non-fatal warnings"""
987
+ """Non-fatal advisories — the mutation itself succeeded."""
863
988
  warnings: [CartWarning!]!
864
989
  }
865
990
 
866
- """Mailing address input dla cart fulfillment mutations"""
991
+ """
992
+ Mailing address used as the shipping or billing address on a cart. Carries an optional pickup point (for parcel locker / collection-point delivery) and optional B2B fields (`taxId`, `regon`).
993
+ """
867
994
  input CartAddressInput {
868
995
  """City"""
869
996
  city: String!
@@ -883,9 +1010,19 @@ input CartAddressInput {
883
1010
  """Phone number"""
884
1011
  phone: String
885
1012
 
1013
+ """
1014
+ Selected pickup point — required when the chosen shipping method has a deliveryType other than HOME (parcel locker / collection point).
1015
+ """
1016
+ pickupPoint: PickupPointInput
1017
+
886
1018
  """Postal / ZIP code"""
887
1019
  postalCode: String!
888
1020
 
1021
+ """
1022
+ Buyer business registry number for B2B invoicing (Polish REGON). Persisted on the resulting order at checkout completion.
1023
+ """
1024
+ regon: String
1025
+
889
1026
  """State / province"""
890
1027
  state: String
891
1028
 
@@ -894,153 +1031,209 @@ input CartAddressInput {
894
1031
 
895
1032
  """Second line of street address"""
896
1033
  streetLine2: String
1034
+
1035
+ """
1036
+ Buyer tax ID for B2B invoicing (Polish NIP). Persisted on the resulting order at checkout completion.
1037
+ """
1038
+ taxId: String
897
1039
  }
898
1040
 
899
- """Gift card applied to a cart"""
1041
+ """
1042
+ A gift card that the buyer has attached to the cart. The card is debited when the cart completes.
1043
+ """
900
1044
  type CartAppliedGiftCard {
901
- """Amount applied to this cart"""
1045
+ """Amount of this gift card that will be applied to the cart total."""
902
1046
  appliedAmount: Money!
903
1047
 
904
- """Last 4 characters of the gift card code"""
1048
+ """
1049
+ Stable identifier of this applied gift card on the cart. Pass it to `cartRemoveGiftCard` so the storefront never has to hold the full gift card code.
1050
+ """
1051
+ id: ID!
1052
+
1053
+ """
1054
+ Last 4 characters of the gift card code — useful when several cards are applied.
1055
+ """
905
1056
  lastCharacters: String!
906
1057
 
907
- """Masked gift card code for display (np. "****-****-****-ABCD")"""
1058
+ """Masked code safe for display (e.g. "****-****-****-ABCD")."""
908
1059
  maskedCode: String!
909
1060
 
910
- """Remaining balance on the gift card after this cart"""
1061
+ """Remaining balance on the gift card after this cart is completed."""
911
1062
  remainingBalance: Money!
912
1063
  }
913
1064
 
914
- """Input dla cartApplyGiftCard mutation"""
1065
+ """Input for `cartApplyGiftCard`."""
915
1066
  input CartApplyGiftCardInput {
916
- """Cart ID"""
1067
+ """ID of the cart to update."""
917
1068
  cartId: ID!
918
1069
 
919
- """Gift card code (np. ABCD-1234-EFGH-5678)"""
1070
+ """
1071
+ Full gift card code entered by the buyer (e.g. "ABCD-1234-EFGH-5678"). Max 64 chars.
1072
+ """
920
1073
  giftCardCode: String!
921
1074
  }
922
1075
 
923
- """Result of applying gift card to cart"""
1076
+ """Result of `cartApplyGiftCard`."""
924
1077
  type CartApplyGiftCardPayload {
925
- """Updated cart z appliedGiftCards"""
1078
+ """The updated cart with the gift card included in `appliedGiftCards`."""
926
1079
  cart: Cart
927
1080
 
928
1081
  """
929
- User errors (CartErrorCode-namespaced np. GIFT_CARD_NOT_FOUND, GIFT_CARD_DEPLETED, GIFT_CARD_UNUSABLE)
1082
+ Business / validation errors carrying a stable `CartErrorCode` in `code` (e.g. `GIFT_CARD_NOT_FOUND`, `GIFT_CARD_DEPLETED`, `GIFT_CARD_UNUSABLE`).
930
1083
  """
931
1084
  userErrors: [UserError!]!
932
1085
 
933
- """Non-fatal warnings"""
1086
+ """Non-fatal advisories — the mutation itself succeeded."""
934
1087
  warnings: [CartWarning!]!
935
1088
  }
936
1089
 
937
- """Cart line attribute"""
1090
+ """
1091
+ Custom attribute on a cart line — free-form key/value used for line item properties such as engraving text or gift wrap flags.
1092
+ """
938
1093
  type CartAttribute {
939
- """Attribute key"""
1094
+ """Attribute key (e.g. "giftWrap", "engraving")."""
940
1095
  key: String!
941
1096
 
942
- """Attribute value"""
1097
+ """Attribute value. Null when the key is set without an associated value."""
943
1098
  value: String
944
1099
  }
945
1100
 
946
- """Input for cart attribute"""
1101
+ """
1102
+ A custom cart attribute key/value pair. Used by `cartUpdateAttributes`; the full list is replaced on each call.
1103
+ """
947
1104
  input CartAttributeInput {
948
- """Attribute key"""
1105
+ """Attribute key (max 255 chars)."""
949
1106
  key: String!
950
1107
 
951
- """Attribute value"""
1108
+ """Attribute value (max 500 chars). Omit to set the key without a value."""
952
1109
  value: String
953
1110
  }
954
1111
 
955
- """Buyer identity information"""
1112
+ """
1113
+ Buyer identity attached to the cart — email, phone, locale hints used during checkout and on the resulting order.
1114
+ """
956
1115
  type CartBuyerIdentity {
957
- """ISO 3166-1 alpha-2 country code"""
1116
+ """
1117
+ Buyer country (ISO 3166-1 alpha-2). Hint for pricing, tax and shipping eligibility before an address is provided.
1118
+ """
958
1119
  countryCode: CountryCode
959
1120
 
960
- """Customer ID"""
1121
+ """
1122
+ Customer record ID when the cart is owned by a signed-in customer. Null for guest carts.
1123
+ """
961
1124
  customerId: ID
962
1125
 
963
- """Customer email"""
1126
+ """Buyer email — receives the order confirmation when the cart completes."""
964
1127
  email: String
965
1128
 
966
- """ISO 639-1 preferred language code"""
1129
+ """
1130
+ Buyer preferred language (ISO 639-1). Used for the order confirmation email and any localised content.
1131
+ """
967
1132
  languageCode: LanguageCode
968
1133
 
969
- """Customer phone"""
1134
+ """Buyer phone number, free-form (validated only for length)."""
970
1135
  phone: String
971
1136
  }
972
1137
 
973
- """Input for buyer identity"""
1138
+ """
1139
+ Buyer identity to attach to a cart. All fields are optional — only the supplied fields are updated.
1140
+ """
974
1141
  input CartBuyerIdentityInput {
975
- """ISO 3166-1 alpha-2 country code"""
1142
+ """
1143
+ Buyer country (ISO 3166-1 alpha-2). Hint for currency, tax and shipping eligibility before an address is set.
1144
+ """
976
1145
  countryCode: CountryCode
977
1146
 
978
- """Customer ID"""
1147
+ """
1148
+ ID of a signed-in customer that owns this cart. Pass to bind a guest cart to a customer record.
1149
+ """
979
1150
  customerId: ID
980
1151
 
981
- """Customer email"""
1152
+ """Buyer email address. Persisted to the order at checkout completion."""
982
1153
  email: String
983
1154
 
984
- """ISO 639-1 preferred language code"""
1155
+ """
1156
+ Buyer preferred language (ISO 639-1). Used for the order confirmation email and localised content.
1157
+ """
985
1158
  languageCode: LanguageCode
986
1159
 
987
- """Customer phone"""
1160
+ """Buyer phone number. Free-form; max 30 chars."""
988
1161
  phone: String
989
1162
  }
990
1163
 
991
- """Input dla cartComplete mutation finalizuje cart do Order"""
1164
+ """Input for `cartComplete`finalises the cart into an `Order`."""
992
1165
  input CartCompleteInput {
993
- """Cart ID do skompletowania"""
1166
+ """ID of the cart to complete."""
994
1167
  cartId: ID!
995
1168
 
996
1169
  """
997
- Optional idempotency key — zapobiega duplicate Orders przy retry / network issue (jeśli null, generowany z cartId + minute timestamp)
1170
+ Optional idempotency key — guards against duplicate orders on retry / network issue. When omitted, the server derives one from the cart ID and the current minute, which is sufficient for the typical "user double-clicks the pay button" case.
998
1171
  """
999
1172
  idempotencyKey: String
1000
1173
  }
1001
1174
 
1002
1175
  """
1003
- Result of completing cart — transition cart order (per D4 NO paymentUrl). Cart NIE w payload po complete koszyk jest CONVERTED/locked.
1176
+ Result of `cartComplete`. The cart is converted into an `Order` and locked no further mutations are accepted on it. Payment is initiated separately via `paymentCreate` (after checking `order.canCreatePayment`).
1004
1177
  """
1005
1178
  type CartCompletePayload {
1006
1179
  """
1007
- Order created z cart. Zapewnia canCreatePayment + paymentMethodType (Phase 4 ResolveFields) dla decyzji storefront przycisku "Zapłać".
1180
+ The order created from the cart. Carries `canCreatePayment` and `paymentMethodType` signals so the storefront can decide whether to render a "Pay now" button or send the buyer straight to the confirmation page (for offline methods).
1008
1181
  """
1009
1182
  order: Order
1010
1183
 
1011
1184
  """
1012
- User errors (CartErrorCode-namespaced np. INSUFFICIENT_STOCK, SHIPPING_ADDRESS_REQUIRED, PAYMENT_METHOD_REQUIRED, EMAIL_REQUIRED)
1185
+ Business / validation errors carrying a stable `CartErrorCode` in `code` (e.g. `NOT_ENOUGH_IN_STOCK`, `SHIPPING_ADDRESS_REQUIRED`, `SHIPPING_METHOD_REQUIRED`, `PAYMENT_METHOD_REQUIRED`, `EMAIL_REQUIRED`, `ALREADY_COMPLETED`).
1013
1186
  """
1014
1187
  userErrors: [UserError!]!
1015
1188
 
1016
- """Non-fatal warnings"""
1189
+ """Non-fatal advisories — the mutation itself succeeded."""
1017
1190
  warnings: [CartWarning!]!
1018
1191
  }
1019
1192
 
1020
- """Cart cost breakdown"""
1193
+ """
1194
+ Cart cost breakdown. All amounts are in the buyer preferred currency (auto-converted when the shop runs multi-currency). `total` is what the buyer will pay at checkout — no need to recompute.
1195
+ """
1021
1196
  type CartCost {
1022
- """Checkout charge amount."""
1197
+ """
1198
+ Additional fixed checkout fee configured by the shop (e.g. small-order surcharge). Null when no such fee applies.
1199
+ """
1023
1200
  checkoutCharge: Money
1024
1201
 
1025
1202
  """Opt-in: checkoutCharge with conversion transparency."""
1026
1203
  checkoutChargeWithConversion: PriceMoney
1027
1204
 
1028
- """Subtotal before taxes and shipping. Default field."""
1205
+ """Subtotal of items in the cart before taxes, shipping and discounts."""
1029
1206
  subtotal: Money!
1030
1207
 
1031
1208
  """Opt-in: subtotal with full conversion transparency."""
1032
1209
  subtotalWithConversion: PriceMoney
1033
1210
 
1034
- """Total amount including taxes."""
1211
+ """
1212
+ Grand total the buyer will pay — includes taxes, discounts and any selected shipping. Use this directly on the checkout summary instead of summing `subtotal` + extras.
1213
+ """
1035
1214
  total: Money!
1036
1215
 
1037
- """Total duty amount."""
1216
+ """
1217
+ Aggregated discount across the cart — the sum of every entry in `discountAllocations`. Returns an amount of 0 when no discount applies.
1218
+ """
1219
+ totalDiscount: Money!
1220
+
1221
+ """
1222
+ Total customs duty on the cart. Null when no duty applies (most domestic orders).
1223
+ """
1038
1224
  totalDuty: Money
1039
1225
 
1040
1226
  """Opt-in: totalDuty with conversion transparency."""
1041
1227
  totalDutyWithConversion: PriceMoney
1042
1228
 
1043
- """Total tax amount."""
1229
+ """
1230
+ Cost of the currently selected shipping method. Null until a shipping method is selected — a selected free-shipping method returns an amount of 0, so null unambiguously means "no method chosen yet".
1231
+ """
1232
+ totalShipping: Money
1233
+
1234
+ """
1235
+ Total tax across all lines. Null when tax has not yet been calculated for this cart (e.g. before an address is set in tax-inclusive shops).
1236
+ """
1044
1237
  totalTax: Money
1045
1238
 
1046
1239
  """Opt-in: totalTax with conversion transparency."""
@@ -1050,150 +1243,194 @@ type CartCost {
1050
1243
  totalWithConversion: PriceMoney
1051
1244
  }
1052
1245
 
1053
- """Input for creating a cart"""
1246
+ """
1247
+ Input for `cartCreate`. All fields are optional — pass only what you have at cart creation time.
1248
+ """
1054
1249
  input CartCreateInput {
1055
- """Cart attributes"""
1250
+ """
1251
+ Cart-level custom attributes to set on the new cart (up to 50 entries).
1252
+ """
1056
1253
  attributes: [CartAttributeInput!]
1057
1254
 
1058
- """Buyer identity"""
1255
+ """
1256
+ Buyer identity to attach to the new cart (email, phone, customer ID, country, language).
1257
+ """
1059
1258
  buyerIdentity: CartBuyerIdentityInput
1060
1259
 
1061
- """Discount codes to apply"""
1260
+ """
1261
+ Discount codes to apply at creation (up to 10). Equivalent to calling `cartDiscountCodesUpdate` immediately after creating the cart.
1262
+ """
1062
1263
  discountCodes: [String!]
1063
1264
 
1064
- """Customer email (Phase 3 D2 — merge funkcjonalności checkoutCreate)"""
1265
+ """
1266
+ Buyer email — shortcut for `buyerIdentity.email`. If both are provided, this field wins.
1267
+ """
1065
1268
  email: String
1066
1269
 
1067
- """Initial cart lines"""
1270
+ """Initial lines to add to the cart (up to 100)."""
1068
1271
  lines: [CartLineInput!]
1069
1272
 
1070
- """Cart note"""
1273
+ """Buyer-supplied note (max 1000 chars), e.g. delivery instructions."""
1071
1274
  note: String
1072
1275
 
1073
- """Shipping address (Phase 3 — fulfillment context w jednym round-trip)"""
1276
+ """
1277
+ Shipping address to attach to the new cart — lets the storefront skip a follow-up `cartSetShippingAddress` call.
1278
+ """
1074
1279
  shippingAddress: CartAddressInput
1075
1280
  }
1076
1281
 
1077
- """Result of cart creation"""
1282
+ """Result of `cartCreate`."""
1078
1283
  type CartCreatePayload {
1079
- """Created cart"""
1284
+ """The created cart on success; null when `userErrors` is non-empty."""
1080
1285
  cart: Cart
1081
1286
 
1082
1287
  """
1083
- User errors (code is namespaced e.g. CART_NOT_FOUND, CART_LINE_NOT_FOUND)
1288
+ Business / validation errors. Each entry carries a stable `code` (e.g. `CART_NOT_FOUND`, `NOT_ENOUGH_IN_STOCK`, `INVALID_MERCHANDISE_LINE`) — branch on `code`, never on `message`.
1084
1289
  """
1085
1290
  userErrors: [UserError!]!
1086
1291
 
1087
- """Non-fatal warnings"""
1292
+ """
1293
+ Non-fatal advisories (informational only; the mutation itself succeeded).
1294
+ """
1088
1295
  warnings: [CartWarning!]!
1089
1296
  }
1090
1297
 
1091
- """Discount allocation showing how discount is applied"""
1298
+ """
1299
+ Per-code discount amount applied to the cart. Sum these for the aggregate total — or read `CartCost.totalDiscount`.
1300
+ """
1092
1301
  type CartDiscountAllocation {
1093
- """Discount amount"""
1302
+ """Amount discounted by this code on the cart."""
1094
1303
  amount: Money!
1095
1304
 
1096
- """Discount code"""
1305
+ """The discount code that produced this allocation."""
1097
1306
  discountCode: String!
1098
1307
  }
1099
1308
 
1100
- """Discount code applied to cart"""
1309
+ """A discount code that the buyer has attached to the cart."""
1101
1310
  type CartDiscountCode {
1102
- """Discount code string"""
1311
+ """The code string as entered by the buyer (case is preserved as stored)."""
1103
1312
  code: String!
1104
1313
 
1105
- """Whether the code is applicable"""
1314
+ """
1315
+ Whether this code currently produces a discount on the cart. False when the code is recognised but its conditions are not met (e.g. minimum-order, customer-eligibility, or product-set restrictions) — keep the chip visible and surface the reason.
1316
+ """
1106
1317
  isApplicable: Boolean!
1107
1318
  }
1108
1319
 
1109
- """Result of applying discount codes"""
1320
+ """Result of `cartDiscountCodesUpdate`."""
1110
1321
  type CartDiscountCodesUpdatePayload {
1111
- """Updated cart"""
1322
+ """The updated cart on success."""
1112
1323
  cart: Cart
1113
1324
 
1114
1325
  """
1115
- User errors (code is namespaced e.g. CART_NOT_FOUND, CART_LINE_NOT_FOUND)
1326
+ Business / validation errors carrying a stable `CartErrorCode` in `code` (e.g. `INVALID_DISCOUNT_CODE`).
1116
1327
  """
1117
1328
  userErrors: [UserError!]!
1118
1329
 
1119
- """Non-fatal warnings"""
1330
+ """Non-fatal advisories — the mutation itself succeeded."""
1120
1331
  warnings: [CartWarning!]!
1121
1332
  }
1122
1333
 
1123
- """Single line item in the cart"""
1334
+ """
1335
+ A single line item in the cart — one variant, a quantity and the data attached to it (cost, attributes, configurator selections).
1336
+ """
1124
1337
  type CartLine {
1125
- """Typed customer-filled attribute selections (surcharge + tax snapshot)"""
1338
+ """
1339
+ Typed configurator selections filled in by the buyer (snapshot from add-to-cart). Validated server-side against the product attribute definition; carries any pricing surcharge.
1340
+ """
1126
1341
  attributeSelections: [AttributeSelection!]!
1127
1342
 
1128
- """Line Item Properties — raw key/value pairs"""
1343
+ """
1344
+ Free-form custom attributes (line item properties) attached to this line — engraving text, gift wrap, B2B PO line reference, etc.
1345
+ """
1129
1346
  attributes: [Attribute!]!
1130
1347
 
1131
- """Cost information for this line"""
1348
+ """
1349
+ Per-line cost breakdown (unit price, subtotal, total, optional compare-at).
1350
+ """
1132
1351
  cost: CartLineCost!
1133
1352
 
1134
- """Unique line identifier"""
1353
+ """
1354
+ Stable line identifier. Use it to address the line in `cartUpdateLines` / `cartRemoveLines`.
1355
+ """
1135
1356
  id: ID!
1136
1357
 
1137
- """Parent product handle (slug)"""
1358
+ """
1359
+ URL handle (slug) of the parent product — link target for the cart drawer (denormalised).
1360
+ """
1138
1361
  productHandle: String
1139
1362
 
1140
- """Parent product ID"""
1363
+ """
1364
+ ID of the parent product. Denormalised so a cart drawer renders without an extra round-trip.
1365
+ """
1141
1366
  productId: ID
1142
1367
 
1143
- """Parent product title"""
1368
+ """Display title of the parent product (denormalised)."""
1144
1369
  productTitle: String
1145
1370
 
1146
- """Parent product type"""
1371
+ """
1372
+ Type of the parent product (PHYSICAL, DIGITAL, SERVICE, SUBSCRIPTION, GIFT_CARD). Drives whether the line requires shipping and which post-purchase flow applies.
1373
+ """
1147
1374
  productType: ProductTypeEnum
1148
1375
 
1149
- """Quantity of this item"""
1376
+ """
1377
+ Quantity of the variant in this line (≥ 1; set to 0 with `cartUpdateLines` to remove).
1378
+ """
1150
1379
  quantity: Int!
1151
1380
 
1152
1381
  """
1153
- True if this line item requires physical shipping (productType=PHYSICAL). False for digital, gift card, service, and subscription items. Use to skip the shipping step in checkout when every line is non-physical.
1382
+ True when this line requires physical shipping (`productType` = PHYSICAL). False for digital, gift card, service and subscription items. Use together with `Cart.requiresShipping` to decide whether to render the shipping step.
1154
1383
  """
1155
1384
  requiresShipping: Boolean!
1156
1385
 
1157
- """Product variant being purchased"""
1386
+ """
1387
+ The variant being purchased — fresh data (current price, image, stock).
1388
+ """
1158
1389
  variant: ProductVariant!
1159
1390
  }
1160
1391
 
1161
- """Paginated cart lines"""
1392
+ """Paginated list of cart lines (Relay Connection)."""
1162
1393
  type CartLineConnection {
1163
- """Cart line edges with cursors"""
1394
+ """Edges with the line and its cursor — use for cursor-based pagination."""
1164
1395
  edges: [CartLineEdge!]!
1165
1396
 
1166
- """Cart line nodes (shortcut for edges.map(e => e.node))"""
1397
+ """Cart line nodes — convenience shortcut for `edges.map(e => e.node)`."""
1167
1398
  nodes: [CartLine!]!
1168
1399
 
1169
- """Pagination info"""
1400
+ """Cursor pagination info (`hasNextPage`, `endCursor`, etc.)."""
1170
1401
  pageInfo: PageInfo!
1171
1402
 
1172
- """Total count of cart lines"""
1403
+ """Total number of lines in the cart across all pages."""
1173
1404
  totalCount: Int!
1174
1405
  }
1175
1406
 
1176
- """Cost information for a single cart line"""
1407
+ """Cost breakdown for a single cart line."""
1177
1408
  type CartLineCost {
1178
- """Compare-at price per unit if discounted."""
1409
+ """
1410
+ Strike-through compare-at unit price when the line is on sale. Null when the line is not discounted; show the strike-through only when this is present and greater than `pricePerUnit`.
1411
+ """
1179
1412
  compareAtPricePerUnit: Money
1180
1413
 
1181
1414
  """Opt-in: compareAtPricePerUnit with conversion transparency."""
1182
1415
  compareAtPricePerUnitWithConversion: PriceMoney
1183
1416
 
1184
- """Price per unit. Default field — shop base currency."""
1417
+ """
1418
+ Unit price of the line item in the shop base currency. Use this for per-unit display.
1419
+ """
1185
1420
  pricePerUnit: Money!
1186
1421
 
1187
1422
  """Opt-in: pricePerUnit with conversion transparency."""
1188
1423
  pricePerUnitWithConversion: PriceMoney
1189
1424
 
1190
- """Subtotal before discounts."""
1425
+ """Line subtotal before line-level discounts (`pricePerUnit` × quantity)."""
1191
1426
  subtotal: Money!
1192
1427
 
1193
1428
  """Opt-in: subtotal with conversion transparency."""
1194
1429
  subtotalWithConversion: PriceMoney
1195
1430
 
1196
- """Total after discounts."""
1431
+ """
1432
+ Line total after any line-level discounts and surcharges. This is what the buyer pays for the line.
1433
+ """
1197
1434
  total: Money!
1198
1435
 
1199
1436
  """Opt-in: total with conversion transparency."""
@@ -1209,35 +1446,45 @@ type CartLineEdge {
1209
1446
  node: CartLine!
1210
1447
  }
1211
1448
 
1212
- """Input for adding a line to cart"""
1449
+ """
1450
+ A line to add to the cart — variant, quantity and optional custom attributes / configurator selections.
1451
+ """
1213
1452
  input CartLineInput {
1214
- """Customer-filled AttributeDefinition selections (Faza 1 R5)"""
1453
+ """
1454
+ Typed configurator selections to apply to this line — validated against the product attribute definition; pricing surcharges are taken from a snapshot at add-to-cart.
1455
+ """
1215
1456
  attributeSelections: [AttributeSelectionInput!]
1216
1457
 
1217
- """Line attributes (Line Item Properties)"""
1458
+ """
1459
+ Free-form custom attributes (line item properties) — e.g. engraving text, gift wrap, B2B PO line reference. Up to 50 entries.
1460
+ """
1218
1461
  attributes: [AttributeInput!]
1219
1462
 
1220
- """Quantity to add"""
1463
+ """Quantity to add (1 to 9999). Defaults to 1 when omitted."""
1221
1464
  quantity: Int! = 1
1222
1465
 
1223
- """Product variant ID"""
1466
+ """ID of the product variant being purchased."""
1224
1467
  variantId: ID!
1225
1468
  }
1226
1469
 
1227
- """Input for updating a cart line"""
1470
+ """
1471
+ An update to apply to an existing cart line — new quantity (set to 0 to remove) and optional attribute updates.
1472
+ """
1228
1473
  input CartLineUpdateInput {
1229
1474
  """
1230
- Updated customer-filled attribute selections (null preserves; [] clears)
1475
+ Replacement list of configurator selections. Omit (or pass null) to keep the existing selections; pass an empty array to clear them.
1231
1476
  """
1232
1477
  attributeSelections: [AttributeSelectionInput!]
1233
1478
 
1234
- """Updated Line Item Properties (null preserves)"""
1479
+ """
1480
+ Replacement list of custom attributes on the line. Omit (or pass null) to keep the existing list; pass an empty array to clear it.
1481
+ """
1235
1482
  attributes: [AttributeInput!]
1236
1483
 
1237
- """Cart line ID to update"""
1484
+ """ID of the cart line to update (`CartLine.id`)."""
1238
1485
  id: ID!
1239
1486
 
1240
- """New quantity"""
1487
+ """New quantity. Use 0 to remove the line from the cart."""
1241
1488
  quantity: Int!
1242
1489
  }
1243
1490
 
@@ -1250,130 +1497,142 @@ type CartRecommendations {
1250
1497
  youMayAlsoLike: [ProductRecommendation!]!
1251
1498
  }
1252
1499
 
1253
- """Input dla cartRemoveGiftCard mutation"""
1500
+ """Input for `cartRemoveGiftCard`."""
1254
1501
  input CartRemoveGiftCardInput {
1255
- """Cart ID"""
1502
+ """ID of the cart to update."""
1256
1503
  cartId: ID!
1257
1504
 
1258
- """Gift card code (matching wartości aplikowanej karty)"""
1259
- giftCardCode: String!
1505
+ """
1506
+ ID of the applied gift card to remove — `CartAppliedGiftCard.id` from the cart.
1507
+ """
1508
+ giftCardId: ID!
1260
1509
  }
1261
1510
 
1262
- """Result of removing gift card from cart"""
1511
+ """Result of `cartRemoveGiftCard`."""
1263
1512
  type CartRemoveGiftCardPayload {
1264
- """Updated cart (gift card usunięty z appliedGiftCards)"""
1513
+ """The updated cart with the gift card removed from `appliedGiftCards`."""
1265
1514
  cart: Cart
1266
1515
 
1267
- """User errors (CartErrorCode-namespaced)"""
1516
+ """
1517
+ Business / validation errors carrying a stable `CartErrorCode` in `code`.
1518
+ """
1268
1519
  userErrors: [UserError!]!
1269
1520
 
1270
- """Non-fatal warnings"""
1521
+ """Non-fatal advisories — the mutation itself succeeded."""
1271
1522
  warnings: [CartWarning!]!
1272
1523
  }
1273
1524
 
1274
- """Result of removing cart lines"""
1525
+ """Result of `cartRemoveLines`."""
1275
1526
  type CartRemoveLinesPayload {
1276
- """Updated cart"""
1527
+ """The updated cart on success; null when `userErrors` is non-empty."""
1277
1528
  cart: Cart
1278
1529
 
1279
1530
  """
1280
- User errors (code is namespaced e.g. CART_NOT_FOUND, CART_LINE_NOT_FOUND)
1531
+ Business / validation errors carrying a stable `CartErrorCode` in `code`.
1281
1532
  """
1282
1533
  userErrors: [UserError!]!
1283
1534
 
1284
- """Non-fatal warnings"""
1535
+ """Non-fatal advisories — the mutation itself succeeded."""
1285
1536
  warnings: [CartWarning!]!
1286
1537
  }
1287
1538
 
1288
- """Input dla cartSelectPaymentMethod mutation"""
1539
+ """Input for `cartSelectPaymentMethod`."""
1289
1540
  input CartSelectPaymentMethodInput {
1290
- """Cart ID"""
1541
+ """ID of the cart to update."""
1291
1542
  cartId: ID!
1292
1543
 
1293
- """Payment method (integration provider) ID"""
1544
+ """
1545
+ ID of the chosen payment method (matches a `PaymentMethod.id` from `availablePaymentMethods`).
1546
+ """
1294
1547
  paymentMethodId: ID!
1295
1548
  }
1296
1549
 
1297
- """Result of selecting payment method on cart"""
1550
+ """Result of `cartSelectPaymentMethod`."""
1298
1551
  type CartSelectPaymentMethodPayload {
1299
- """Updated cart (selectedPaymentMethod populated)"""
1552
+ """The updated cart with `selectedPaymentMethod` populated."""
1300
1553
  cart: Cart
1301
1554
 
1302
1555
  """
1303
- User errors (CartErrorCode-namespaced np. PAYMENT_METHOD_REQUIRED, INVALID_PAYMENT)
1556
+ Business / validation errors carrying a stable `CartErrorCode` in `code` (e.g. `PAYMENT_METHOD_REQUIRED`, `INVALID_PAYMENT_METHOD`, `PAYMENT_METHOD_NOT_SUPPORTED`).
1304
1557
  """
1305
1558
  userErrors: [UserError!]!
1306
1559
 
1307
- """Non-fatal warnings"""
1560
+ """Non-fatal advisories — the mutation itself succeeded."""
1308
1561
  warnings: [CartWarning!]!
1309
1562
  }
1310
1563
 
1311
- """Input dla cartSelectShippingMethod mutation (D8 term unification)"""
1564
+ """Input for `cartSelectShippingMethod`."""
1312
1565
  input CartSelectShippingMethodInput {
1313
- """Cart ID"""
1566
+ """ID of the cart to update."""
1314
1567
  cartId: ID!
1315
1568
 
1316
1569
  """
1317
- Shipping method ID (handle z available shipping methods query). Typed ID! per D8 rename argument rateId → shippingMethodId.
1570
+ ID of the chosen shipping method (matches an `AvailableShippingMethod.id` from `cart.availableShippingMethods`).
1318
1571
  """
1319
1572
  shippingMethodId: ID!
1320
1573
  }
1321
1574
 
1322
- """Result of selecting shipping method on cart (D8 term unification)"""
1575
+ """Result of `cartSelectShippingMethod`."""
1323
1576
  type CartSelectShippingMethodPayload {
1324
- """Updated cart (selectedShippingMethod populated)"""
1577
+ """
1578
+ The updated cart with `selectedShippingMethod` populated and `cost.totalShipping` updated.
1579
+ """
1325
1580
  cart: Cart
1326
1581
 
1327
1582
  """
1328
- User errors (CartErrorCode-namespaced np. SHIPPING_METHOD_REQUIRED, ZIP_CODE_NOT_SUPPORTED)
1583
+ Business / validation errors carrying a stable `CartErrorCode` in `code` (e.g. `SHIPPING_METHOD_REQUIRED`, `FORBIDDEN_SHIPPING_METHOD`, `ZIP_CODE_NOT_SUPPORTED`).
1329
1584
  """
1330
1585
  userErrors: [UserError!]!
1331
1586
 
1332
- """Non-fatal warnings"""
1587
+ """Non-fatal advisories — the mutation itself succeeded."""
1333
1588
  warnings: [CartWarning!]!
1334
1589
  }
1335
1590
 
1336
- """Input dla cartSetBillingAddress mutation"""
1591
+ """Input for `cartSetBillingAddress`."""
1337
1592
  input CartSetBillingAddressInput {
1338
- """Billing address (zostawia shipping bez zmian)"""
1593
+ """New billing address. The shipping address is left unchanged."""
1339
1594
  address: CartAddressInput!
1340
1595
 
1341
- """Cart ID"""
1596
+ """ID of the cart to update."""
1342
1597
  cartId: ID!
1343
1598
  }
1344
1599
 
1345
- """Result of setting cart billing address"""
1600
+ """Result of `cartSetBillingAddress`."""
1346
1601
  type CartSetBillingAddressPayload {
1347
- """Updated cart"""
1602
+ """The updated cart with the new billing address."""
1348
1603
  cart: Cart
1349
1604
 
1350
- """User errors (CartErrorCode-namespaced)"""
1605
+ """
1606
+ Business / validation errors carrying a stable `CartErrorCode` in `code`.
1607
+ """
1351
1608
  userErrors: [UserError!]!
1352
1609
 
1353
- """Non-fatal warnings"""
1610
+ """Non-fatal advisories — the mutation itself succeeded."""
1354
1611
  warnings: [CartWarning!]!
1355
1612
  }
1356
1613
 
1357
- """Input dla cartSetShippingAddress mutation"""
1614
+ """Input for `cartSetShippingAddress`."""
1358
1615
  input CartSetShippingAddressInput {
1359
- """Shipping address"""
1616
+ """
1617
+ New shipping address. Replaces any previous shipping address on the cart.
1618
+ """
1360
1619
  address: CartAddressInput!
1361
1620
 
1362
- """Cart ID"""
1621
+ """ID of the cart to update."""
1363
1622
  cartId: ID!
1364
1623
  }
1365
1624
 
1366
- """Result of setting cart shipping address"""
1625
+ """Result of `cartSetShippingAddress`."""
1367
1626
  type CartSetShippingAddressPayload {
1368
- """Updated cart"""
1627
+ """The updated cart with the new shipping address."""
1369
1628
  cart: Cart
1370
1629
 
1371
1630
  """
1372
- User errors (CartErrorCode-namespaced np. INVALID_ADDRESS, EMAIL_REQUIRED)
1631
+ Business / validation errors carrying a stable `CartErrorCode` in `code` (e.g. `INVALID_ADDRESS`, `EMAIL_REQUIRED`, `PICKUP_POINT_REQUIRED`).
1373
1632
  """
1374
1633
  userErrors: [UserError!]!
1375
1634
 
1376
- """Non-fatal warnings"""
1635
+ """Non-fatal advisories — the mutation itself succeeded."""
1377
1636
  warnings: [CartWarning!]!
1378
1637
  }
1379
1638
 
@@ -1389,123 +1648,140 @@ input CartShippingInput {
1389
1648
  totalWeight: Int
1390
1649
  }
1391
1650
 
1392
- """Shipping method selected on a cart (D8 term unification)"""
1651
+ """
1652
+ The shipping method currently selected on a cart, with its display label and cost.
1653
+ """
1393
1654
  type CartShippingMethod {
1394
- """Shipping method (rate) handle"""
1655
+ """
1656
+ Handle of the selected shipping method — matches the `id` of an `AvailableShippingMethod`.
1657
+ """
1395
1658
  handle: ID!
1396
1659
 
1397
- """Shipping cost"""
1660
+ """Cost of the selected shipping method."""
1398
1661
  price: Money!
1399
1662
 
1400
- """Display title (e.g. "DPD Standard 2 dni")"""
1663
+ """Display title for the checkout summary (e.g. "DPD Standard, 2 days")."""
1401
1664
  title: String!
1402
1665
  }
1403
1666
 
1404
- """Result of updating cart attributes"""
1667
+ """Result of `cartUpdateAttributes`."""
1405
1668
  type CartUpdateAttributesPayload {
1406
- """Updated cart"""
1669
+ """The updated cart on success."""
1407
1670
  cart: Cart
1408
1671
 
1409
1672
  """
1410
- User errors (code is namespaced e.g. CART_NOT_FOUND, CART_LINE_NOT_FOUND)
1673
+ Business / validation errors carrying a stable `CartErrorCode` in `code` (e.g. `CART_ATTRIBUTES_UPDATE_FAILED`).
1411
1674
  """
1412
1675
  userErrors: [UserError!]!
1413
1676
 
1414
- """Non-fatal warnings"""
1677
+ """Non-fatal advisories — the mutation itself succeeded."""
1415
1678
  warnings: [CartWarning!]!
1416
1679
  }
1417
1680
 
1418
- """Result of updating buyer identity"""
1681
+ """Result of `cartUpdateBuyerIdentity`."""
1419
1682
  type CartUpdateBuyerIdentityPayload {
1420
- """Updated cart"""
1683
+ """The updated cart on success."""
1421
1684
  cart: Cart
1422
1685
 
1423
1686
  """
1424
- User errors (code is namespaced e.g. CART_NOT_FOUND, CART_LINE_NOT_FOUND)
1687
+ Business / validation errors carrying a stable `CartErrorCode` in `code`.
1425
1688
  """
1426
1689
  userErrors: [UserError!]!
1427
1690
 
1428
- """Non-fatal warnings"""
1691
+ """Non-fatal advisories — the mutation itself succeeded."""
1429
1692
  warnings: [CartWarning!]!
1430
1693
  }
1431
1694
 
1432
1695
  """
1433
- Input dla cartUpdateGiftCardRecipient mutation (gift card line item recipient info)
1696
+ Input for `cartUpdateGiftCardRecipient` sets the recipient details for a gift card line item.
1434
1697
  """
1435
1698
  input CartUpdateGiftCardRecipientInput {
1436
- """Cart ID"""
1699
+ """ID of the cart to update."""
1437
1700
  cartId: ID!
1438
1701
 
1439
- """Cart line item ID (musi reprezentować gift card SKU)"""
1702
+ """ID of the cart line; the line must be a gift card SKU."""
1440
1703
  lineItemId: ID!
1441
1704
 
1442
- """Personalised message dla recipienta (max 500 znaków)"""
1705
+ """Personalised message included with the gift card (max 500 chars)."""
1443
1706
  message: String
1444
1707
 
1445
- """Recipient email (gift card delivery target)"""
1708
+ """Recipient email — where the gift card code will be delivered."""
1446
1709
  recipientEmail: String
1447
1710
 
1448
- """Recipient display name"""
1711
+ """Recipient display name."""
1449
1712
  recipientName: String
1450
1713
  }
1451
1714
 
1452
- """Result of updating gift card recipient info on cart line item"""
1715
+ """Result of `cartUpdateGiftCardRecipient`."""
1453
1716
  type CartUpdateGiftCardRecipientPayload {
1454
- """Updated cart"""
1717
+ """
1718
+ The updated cart with the new gift card recipient info on the target line.
1719
+ """
1455
1720
  cart: Cart
1456
1721
 
1457
- """User errors (CartErrorCode-namespaced)"""
1722
+ """
1723
+ Business / validation errors carrying a stable `CartErrorCode` in `code`.
1724
+ """
1458
1725
  userErrors: [UserError!]!
1459
1726
 
1460
- """Non-fatal warnings"""
1727
+ """Non-fatal advisories — the mutation itself succeeded."""
1461
1728
  warnings: [CartWarning!]!
1462
1729
  }
1463
1730
 
1464
- """Result of updating cart lines"""
1731
+ """Result of `cartUpdateLines`."""
1465
1732
  type CartUpdateLinesPayload {
1466
- """Updated cart"""
1733
+ """The updated cart on success; null when `userErrors` is non-empty."""
1467
1734
  cart: Cart
1468
1735
 
1469
1736
  """
1470
- User errors (code is namespaced e.g. CART_NOT_FOUND, CART_LINE_NOT_FOUND)
1737
+ Business / validation errors carrying a stable `CartErrorCode` in `code` (e.g. `CART_NOT_FOUND`, `NOT_ENOUGH_IN_STOCK`).
1471
1738
  """
1472
1739
  userErrors: [UserError!]!
1473
1740
 
1474
- """Non-fatal warnings"""
1741
+ """Non-fatal advisories — the mutation itself succeeded."""
1475
1742
  warnings: [CartWarning!]!
1476
1743
  }
1477
1744
 
1478
- """Result of updating cart note"""
1745
+ """Result of `cartUpdateNote`."""
1479
1746
  type CartUpdateNotePayload {
1480
- """Updated cart"""
1747
+ """The updated cart on success."""
1481
1748
  cart: Cart
1482
1749
 
1483
1750
  """
1484
- User errors (code is namespaced e.g. CART_NOT_FOUND, CART_LINE_NOT_FOUND)
1751
+ Business / validation errors carrying a stable `CartErrorCode` in `code`.
1485
1752
  """
1486
1753
  userErrors: [UserError!]!
1487
1754
 
1488
- """Non-fatal warnings"""
1755
+ """Non-fatal advisories — the mutation itself succeeded."""
1489
1756
  warnings: [CartWarning!]!
1490
1757
  }
1491
1758
 
1492
1759
  """Cart warning (non-fatal advisory)"""
1493
1760
  type CartWarning {
1494
- """Typed warning code"""
1761
+ """
1762
+ Stable machine-readable warning code. Branch on this for UI behaviour — never on `message` (translated, locale-dependent).
1763
+ """
1495
1764
  code: CartWarningCode!
1496
1765
 
1497
- """Warning message"""
1766
+ """
1767
+ Human-readable warning message — informational, the mutation itself succeeded.
1768
+ """
1498
1769
  message: String!
1499
1770
 
1500
- """Target identifier (cart line ID lub field path)"""
1771
+ """
1772
+ What the warning is about — a cart line ID when the warning refers to a specific item, or a field path otherwise.
1773
+ """
1501
1774
  target: String!
1502
1775
  }
1503
1776
 
1504
- """Non-fatal cart warnings"""
1777
+ """
1778
+ Stable, machine-readable codes for non-fatal cart warnings. The mutation succeeded; the storefront can surface a toast or stay silent based on the code.
1779
+ """
1505
1780
  enum CartWarningCode {
1506
1781
  MERCHANDISE_NOT_AVAILABLE
1507
1782
  MERCHANDISE_NOT_ENOUGH_STOCK
1508
1783
  PAYMENTS_AMOUNT_REGION_MISMATCH
1784
+ SHIPPING_METHOD_AUTO_CLEARED
1509
1785
  }
1510
1786
 
1511
1787
  """Product category - hierarchical organization"""
@@ -1516,6 +1792,11 @@ type Category {
1516
1792
  """Category description"""
1517
1793
  description: String
1518
1794
 
1795
+ """
1796
+ URL-friendly handle (e.g. "electronics" -> /categories/electronics). Stable per-shop.
1797
+ """
1798
+ handle: String!
1799
+
1519
1800
  """Unique identifier"""
1520
1801
  id: ID!
1521
1802
 
@@ -1543,9 +1824,6 @@ type Category {
1543
1824
  """SEO metadata"""
1544
1825
  seo: SEO
1545
1826
 
1546
- """URL-friendly slug"""
1547
- slug: String!
1548
-
1549
1827
  """Sort order within parent"""
1550
1828
  sortOrder: Int!
1551
1829
  }
@@ -1582,6 +1860,9 @@ input CategoryFilter {
1582
1860
 
1583
1861
  """Category filter option"""
1584
1862
  type CategoryFilterOption {
1863
+ """URL-friendly handle"""
1864
+ handle: String!
1865
+
1585
1866
  """Category ID"""
1586
1867
  id: ID!
1587
1868
 
@@ -1596,9 +1877,6 @@ type CategoryFilterOption {
1596
1877
 
1597
1878
  """Number of products in this category"""
1598
1879
  productCount: Int!
1599
-
1600
- """URL-friendly slug"""
1601
- slug: String!
1602
1880
  }
1603
1881
 
1604
1882
  """Collection - curated group of products"""
@@ -1705,7 +1983,7 @@ type Country implements Node {
1705
1983
  unitSystem: UnitSystem!
1706
1984
  }
1707
1985
 
1708
- """ISO 3166-1 alpha-2 country code"""
1986
+ """ISO 3166-1 alpha-2 country code (2-letter uppercase, e.g. PL, DE, US)."""
1709
1987
  enum CountryCode {
1710
1988
  AT
1711
1989
  AU
@@ -1773,7 +2051,7 @@ type Currency {
1773
2051
  symbolPosition: CurrencySymbolPosition!
1774
2052
  }
1775
2053
 
1776
- """ISO 4217 currency code"""
2054
+ """ISO 4217 currency code (3-letter uppercase, e.g. PLN, EUR, USD)."""
1777
2055
  enum CurrencyCode {
1778
2056
  AED
1779
2057
  AFN
@@ -1987,90 +2265,122 @@ enum CurrencySymbolPosition {
1987
2265
  BEFORE
1988
2266
  }
1989
2267
 
1990
- """Customer - registered user"""
2268
+ """
2269
+ A registered customer of the shop — identity, profile, B2B fields, saved addresses and order history. Returned by `customer` (currently authenticated) and `customerSignup`.
2270
+ """
1991
2271
  type Customer implements Node {
1992
- """Saved addresses (Relay Connection)"""
2272
+ """
2273
+ Saved address book of the customer (Relay Connection). Use to render an address picker on checkout.
2274
+ """
1993
2275
  addresses(after: String, before: String, first: Int, last: Int): MailingAddressConnection!
1994
2276
 
1995
2277
  """Customer custom field values (post-Opcja A unified custom fields)."""
1996
2278
  attributes(namespace: String): [EntityAttributeField!]!
1997
2279
 
1998
- """Company name (populated for COMPANY type)"""
2280
+ """
2281
+ Company name. Populated when `customerType` is COMPANY; null for INDIVIDUAL profiles.
2282
+ """
1999
2283
  companyName: String
2000
2284
 
2001
- """Account creation date"""
2285
+ """When the customer account was created (ISO 8601)."""
2002
2286
  createdAt: DateTime!
2003
2287
 
2004
- """Business type discriminator (INDIVIDUAL/COMPANY)"""
2288
+ """
2289
+ Profile type — INDIVIDUAL (B2C) or COMPANY (B2B). When COMPANY, the company fields below are populated.
2290
+ """
2005
2291
  customerType: CustomerType!
2006
2292
 
2007
- """Default address"""
2293
+ """
2294
+ Default address pre-selected in checkout pickers. Null when the customer has no saved addresses.
2295
+ """
2008
2296
  defaultAddress: MailingAddress
2009
2297
 
2010
- """Display name"""
2298
+ """
2299
+ Display name — typically `firstName lastName`, with sensible fallback to email when neither is set. Render directly in the UI.
2300
+ """
2011
2301
  displayName: String!
2012
2302
 
2013
- """Email address"""
2303
+ """Customer email address (login identity)."""
2014
2304
  email: String!
2015
2305
 
2016
- """Email marketing consent state"""
2306
+ """
2307
+ Marketing consent state (NOT_SUBSCRIBED, PENDING, SUBSCRIBED, UNSUBSCRIBED, REDACTED, INVALID). Drive newsletter UI and opt-in / opt-out controls from this value.
2308
+ """
2017
2309
  emailMarketing: EmailMarketingState!
2018
2310
 
2019
- """First name"""
2311
+ """Customer first name."""
2020
2312
  firstName: String
2021
2313
 
2022
- """Unique identifier"""
2314
+ """Stable identifier of the customer."""
2023
2315
  id: ID!
2024
2316
 
2025
- """Whether email is verified"""
2317
+ """True when the customer has confirmed ownership of their email address."""
2026
2318
  isEmailVerified: Boolean!
2027
2319
 
2028
- """Last name"""
2320
+ """Customer last name."""
2029
2321
  lastName: String
2030
2322
 
2031
- """Total orders count (UnsignedInt64 — BigInt-safe)"""
2323
+ """
2324
+ Total number of orders the customer has placed. Stringified for BigInt safety.
2325
+ """
2032
2326
  orderCount: UnsignedInt64!
2033
2327
 
2034
- """Customer orders"""
2328
+ """
2329
+ Orders placed by this customer (Relay Connection). Use for the order history page.
2330
+ """
2035
2331
  orders(after: String, first: Int = 10): OrderConnection!
2036
2332
 
2037
- """Phone number"""
2333
+ """Customer phone number (free-form)."""
2038
2334
  phone: String
2039
2335
 
2040
- """Polish business registry number — REGON"""
2336
+ """
2337
+ Customer-wide Polish business registry number (REGON, 9 or 14 digits with checksum).
2338
+ """
2041
2339
  regon: String
2042
2340
 
2043
- """Customer tags for segmentation (e.g. vip, wholesale, b2b)"""
2341
+ """
2342
+ Merchant-assigned segmentation tags (e.g. "vip", "wholesale", "b2b"). Use to customise UI / pricing rules on the storefront.
2343
+ """
2044
2344
  tags: [String!]!
2045
2345
 
2046
- """Polish tax ID — NIP"""
2346
+ """
2347
+ Customer-wide Polish tax ID (NIP, 10 digits with checksum). Default for new addresses; can be overridden per address via `MailingAddress.taxId`.
2348
+ """
2047
2349
  taxId: String
2048
2350
 
2049
- """Total amount spent"""
2351
+ """Lifetime amount the customer has spent (sum of paid orders)."""
2050
2352
  totalSpent: Money!
2051
2353
 
2052
- """Last update date"""
2354
+ """When the customer profile was last modified (ISO 8601)."""
2053
2355
  updatedAt: DateTime!
2054
2356
 
2055
- """EU VAT number"""
2357
+ """
2358
+ Customer-wide EU VAT number (e.g. `PL1234567890`). Default for new addresses; can be overridden per address via `MailingAddress.vatNumber`.
2359
+ """
2056
2360
  vatNumber: String
2057
2361
  }
2058
2362
 
2059
- """Customer access token"""
2363
+ """
2364
+ Access token returned by `customerLogin`, `customerSignup` and `customerRefreshToken`. Send it on subsequent requests in the `Authorization: Bearer <token>` header, or store it in an HTTP-only cookie via the SDK BFF helpers. Never write it to `localStorage`.
2365
+ """
2060
2366
  type CustomerAccessToken {
2061
- """Access token string"""
2367
+ """The access token string (JWT). Treat as sensitive — do not log."""
2062
2368
  accessToken: String!
2063
2369
 
2064
- """Token expiration (ISO 8601)"""
2370
+ """
2371
+ When the token stops being valid (ISO 8601). Call `customerRefreshToken` before this to obtain a fresh one.
2372
+ """
2065
2373
  expiresAt: DateTime!
2066
2374
  }
2067
2375
 
2068
- """Input for customer login"""
2376
+ """
2377
+ Input for `customerLogin` — exchanges email + password for an access token.
2378
+ """
2069
2379
  input CustomerAccessTokenCreateInput {
2070
- """Email address"""
2380
+ """Customer email address."""
2071
2381
  email: String!
2072
2382
 
2073
- """Password"""
2383
+ """Customer password."""
2074
2384
  password: String!
2075
2385
  }
2076
2386
 
@@ -2101,31 +2411,35 @@ type CustomerAddAddressPayload {
2101
2411
  userErrors: [UserError!]!
2102
2412
  }
2103
2413
 
2104
- """Input for customer registration"""
2414
+ """Input for `customerSignup` — registers a new customer."""
2105
2415
  input CustomerCreateInput {
2106
2416
  """
2107
- Opt-in to email marketing checkbox. true → state SUBSCRIBED (single opt-in) unless `marketingOptInLevel: CONFIRMED_OPT_IN` is also set (then PENDING + double opt-in confirmation email). false/null → no consent change.
2417
+ Marketing opt-in checkbox. true → consent state SUBSCRIBED (single opt-in) unless `marketingOptInLevel: CONFIRMED_OPT_IN` is also sent (then PENDING and the server sends a double-opt-in confirmation email). false / null → no consent change.
2108
2418
  """
2109
2419
  acceptsMarketing: Boolean
2110
2420
 
2111
- """Email address"""
2421
+ """
2422
+ Email address — must be unique within the shop. Used as the login identity.
2423
+ """
2112
2424
  email: String!
2113
2425
 
2114
- """First name"""
2426
+ """First name."""
2115
2427
  firstName: String
2116
2428
 
2117
- """Last name"""
2429
+ """Last name."""
2118
2430
  lastName: String
2119
2431
 
2120
2432
  """
2121
- Opt-in level. Default SINGLE_OPT_IN (signup = email proven implicitly). Set CONFIRMED_OPT_IN to force double opt-in via confirmation email.
2433
+ Opt-in level. Defaults to SINGLE_OPT_IN (signup itself is treated as email proof). Pass CONFIRMED_OPT_IN to enforce double opt-in the server then emails a confirmation link and leaves consent in PENDING until the buyer clicks it.
2122
2434
  """
2123
2435
  marketingOptInLevel: MarketingOptInLevel
2124
2436
 
2125
- """Password"""
2437
+ """
2438
+ Password (8 to 128 chars). The shop password policy may impose additional strength rules.
2439
+ """
2126
2440
  password: String!
2127
2441
 
2128
- """Phone number"""
2442
+ """Phone number (free-form)."""
2129
2443
  phone: String
2130
2444
  }
2131
2445
 
@@ -2150,38 +2464,44 @@ type CustomerGroup {
2150
2464
  taxExempt: Boolean!
2151
2465
  }
2152
2466
 
2153
- """Result of customer login"""
2467
+ """Result of `customerLogin`."""
2154
2468
  type CustomerLoginPayload {
2155
- """Access token"""
2469
+ """Access token on success; null when `userErrors` is non-empty."""
2156
2470
  customerAccessToken: CustomerAccessToken
2157
2471
 
2158
2472
  """
2159
- User errors (code is namespaced e.g. CUSTOMER_NOT_FOUND, CUSTOMER_TOKEN_INVALID, CUSTOMER_PASSWORD_TOO_WEAK)
2473
+ Errors carrying a stable `CustomerErrorCode` in `code` (e.g. `INVALID_CREDENTIALS`, `CUSTOMER_DISABLED`, `UNIDENTIFIED_CUSTOMER`).
2160
2474
  """
2161
2475
  userErrors: [UserError!]!
2162
2476
  }
2163
2477
 
2164
- """Result of token deletion (logout)"""
2478
+ """
2479
+ Result of `customerLogout` — invalidates the current access token on the server.
2480
+ """
2165
2481
  type CustomerLogoutPayload {
2166
- """Deleted access token"""
2482
+ """
2483
+ The token string that was invalidated. Useful for client-side cache clearing.
2484
+ """
2167
2485
  deletedAccessToken: String
2168
2486
 
2169
- """Deleted token ID"""
2487
+ """ID of the invalidated token record."""
2170
2488
  deletedCustomerAccessTokenId: String
2171
2489
 
2172
2490
  """
2173
- User errors (code is namespaced e.g. CUSTOMER_NOT_FOUND, CUSTOMER_TOKEN_INVALID, CUSTOMER_PASSWORD_TOO_WEAK)
2491
+ Errors carrying a stable `CustomerErrorCode` in `code` (e.g. `TOKEN_INVALID`, `TOKEN_EXPIRED`).
2174
2492
  """
2175
2493
  userErrors: [UserError!]!
2176
2494
  }
2177
2495
 
2178
- """Result of token renewal"""
2496
+ """
2497
+ Result of `customerRefreshToken` — exchanges a valid current token for a fresh one with a later expiry.
2498
+ """
2179
2499
  type CustomerRefreshTokenPayload {
2180
- """New access token"""
2500
+ """Fresh access token on success; null when `userErrors` is non-empty."""
2181
2501
  customerAccessToken: CustomerAccessToken
2182
2502
 
2183
2503
  """
2184
- User errors (code is namespaced e.g. CUSTOMER_NOT_FOUND, CUSTOMER_TOKEN_INVALID, CUSTOMER_PASSWORD_TOO_WEAK)
2504
+ Errors carrying a stable `CustomerErrorCode` in `code` (e.g. `TOKEN_INVALID`, `TOKEN_EXPIRED`, `TOKEN_RENEWAL_FAILED`).
2185
2505
  """
2186
2506
  userErrors: [UserError!]!
2187
2507
  }
@@ -2230,16 +2550,18 @@ type CustomerSetDefaultAddressPayload {
2230
2550
  userErrors: [UserError!]!
2231
2551
  }
2232
2552
 
2233
- """Result of customer creation"""
2553
+ """Result of `customerSignup`."""
2234
2554
  type CustomerSignupPayload {
2235
- """Created customer"""
2555
+ """The created customer on success; null when `userErrors` is non-empty."""
2236
2556
  customer: Customer
2237
2557
 
2238
- """Access token for new customer"""
2558
+ """
2559
+ Access token for the new customer — saves a follow-up login round-trip.
2560
+ """
2239
2561
  customerAccessToken: CustomerAccessToken
2240
2562
 
2241
2563
  """
2242
- User errors (code is namespaced e.g. CUSTOMER_NOT_FOUND, CUSTOMER_TOKEN_INVALID, CUSTOMER_PASSWORD_TOO_WEAK)
2564
+ Validation / business errors carrying a stable `CustomerErrorCode` in `code` (e.g. `TAKEN`, `INVALID`, `PASSWORD_TOO_WEAK`, `BAD_DOMAIN`).
2243
2565
  """
2244
2566
  userErrors: [UserError!]!
2245
2567
  }
@@ -2255,7 +2577,9 @@ input CustomerSubscribeToMarketingInput {
2255
2577
  marketingOptInLevel: MarketingOptInLevel
2256
2578
  }
2257
2579
 
2258
- """Customer business type — INDIVIDUAL (B2C) or COMPANY (B2B)."""
2580
+ """
2581
+ Customer profile type — INDIVIDUAL (B2C buyer) or COMPANY (B2B buyer). Drives which company fields are required and which appear on tax documents.
2582
+ """
2259
2583
  enum CustomerType {
2260
2584
  COMPANY
2261
2585
  INDIVIDUAL
@@ -2331,19 +2655,41 @@ Decimal money amount, JSON-serialized as String. Format: "{int}.{dec}" e.g. "10.
2331
2655
  """
2332
2656
  scalar Decimal
2333
2657
 
2334
- """Estimated delivery timeframe"""
2658
+ """Estimated delivery window for a shipping method, in business days."""
2335
2659
  type DeliveryEstimate {
2336
- """Human-readable delivery estimate"""
2660
+ """
2661
+ Pre-formatted human-readable estimate (e.g. "1-2 business days"). Localised; render as-is.
2662
+ """
2337
2663
  description: String
2338
2664
 
2339
- """Maximum delivery days"""
2665
+ """Maximum expected delivery time in business days."""
2340
2666
  maxDays: Int
2341
2667
 
2342
- """Minimum delivery days"""
2668
+ """Minimum expected delivery time in business days."""
2343
2669
  minDays: Int
2344
2670
  }
2345
2671
 
2346
- """Type of discount being applied"""
2672
+ """
2673
+ Delivery destination type of a shipping method — signals whether the storefront must collect a pickup point.
2674
+ """
2675
+ enum DeliveryType {
2676
+ """Courier delivery to the street address — no pickup point required."""
2677
+ HOME
2678
+
2679
+ """
2680
+ Automated parcel locker — the buyer collects from a 24/7 self-service machine.
2681
+ """
2682
+ LOCKER
2683
+
2684
+ """
2685
+ Staffed pickup point / parcel shop — the buyer collects the parcel at a counter.
2686
+ """
2687
+ PICKUP_POINT
2688
+ }
2689
+
2690
+ """
2691
+ Category of discount: `PERCENTAGE` (percent off), `FIXED_AMOUNT` (amount off), `FREE_SHIPPING` (zeroes shipping) or `BUY_X_GET_Y` (item-quantity-based).
2692
+ """
2347
2693
  enum DiscountApplicationType {
2348
2694
  BUY_X_GET_Y
2349
2695
  FIXED_AMOUNT
@@ -2351,7 +2697,9 @@ enum DiscountApplicationType {
2351
2697
  PERCENTAGE
2352
2698
  }
2353
2699
 
2354
- """Error codes for discount validation"""
2700
+ """
2701
+ Stable reasons why a discount code is not applicable to the current cart / customer.
2702
+ """
2355
2703
  enum DiscountErrorCode {
2356
2704
  CUSTOMER_GROUP_NOT_ELIGIBLE
2357
2705
  CUSTOMER_NOT_ELIGIBLE
@@ -2367,42 +2715,58 @@ enum DiscountErrorCode {
2367
2715
  USAGE_LIMIT_REACHED
2368
2716
  }
2369
2717
 
2370
- """Information about a valid discount"""
2718
+ """
2719
+ Details of a discount that the buyer entered and that is currently valid for the cart.
2720
+ """
2371
2721
  type DiscountInfo {
2372
- """Discount code"""
2722
+ """The discount code as entered."""
2373
2723
  code: String!
2374
2724
 
2375
- """Calculated discount amount"""
2725
+ """
2726
+ Calculated savings the discount produces against the current cart. Null when the savings cannot be computed without a cart context.
2727
+ """
2376
2728
  discountAmount: Money
2377
2729
 
2378
- """Discount title"""
2730
+ """Merchant-facing title of the discount (e.g. "Summer sale 10%")."""
2379
2731
  title: String!
2380
2732
 
2381
- """Type of discount"""
2733
+ """
2734
+ Category of the discount: `PERCENTAGE`, `FIXED_AMOUNT`, `FREE_SHIPPING` or `BUY_X_GET_Y`. Drives how `value` is interpreted.
2735
+ """
2382
2736
  type: DiscountApplicationType!
2383
2737
 
2384
- """Discount value (percentage or amount)"""
2738
+ """
2739
+ Discount value — percent points for `PERCENTAGE`, amount (in major currency units) for `FIXED_AMOUNT`. Ignored for `FREE_SHIPPING` / `BUY_X_GET_Y`.
2740
+ """
2385
2741
  value: Float!
2386
2742
  }
2387
2743
 
2388
- """Discount validation error"""
2744
+ """
2745
+ Reason why a discount code is not valid for the current cart / customer.
2746
+ """
2389
2747
  type DiscountValidationError {
2390
- """Error code"""
2748
+ """
2749
+ Stable reason code (e.g. `EXPIRED`, `USAGE_LIMIT_REACHED`, `MINIMUM_ORDER_NOT_MET`). Branch on this for UI behaviour.
2750
+ """
2391
2751
  code: DiscountErrorCode!
2392
2752
 
2393
- """Error message"""
2753
+ """Human-readable explanation of the validation failure."""
2394
2754
  message: String!
2395
2755
  }
2396
2756
 
2397
- """Result of validating a discount code"""
2757
+ """
2758
+ Result of validating a discount code against a cart — preview only, no cart side effects.
2759
+ """
2398
2760
  type DiscountValidationResult {
2399
- """Discount info (if valid)"""
2761
+ """Discount details when `isValid` is true. Null otherwise."""
2400
2762
  discount: DiscountInfo
2401
2763
 
2402
- """Error details (if invalid)"""
2764
+ """Validation failure details when `isValid` is false. Null otherwise."""
2403
2765
  error: DiscountValidationError
2404
2766
 
2405
- """Whether the discount code is valid"""
2767
+ """
2768
+ True when the code is currently applicable to the cart. When false, see `error` for the reason.
2769
+ """
2406
2770
  isValid: Boolean!
2407
2771
  }
2408
2772
 
@@ -2418,7 +2782,9 @@ type Domain {
2418
2782
  url: URL!
2419
2783
  }
2420
2784
 
2421
- """Customer email marketing consent state (Prisma-derived)."""
2785
+ """
2786
+ Email marketing consent state of a customer. NOT_SUBSCRIBED = never opted in. PENDING = single opt-in awaiting double opt-in confirmation. SUBSCRIBED = active opt-in. UNSUBSCRIBED = explicitly opted out. REDACTED = data erased on request. INVALID = email rejected (bounce / spam complaint).
2787
+ """
2422
2788
  enum EmailMarketingState {
2423
2789
  INVALID
2424
2790
  NOT_SUBSCRIBED
@@ -2533,24 +2899,32 @@ type FilterValue {
2533
2899
  swatch: AttributeSwatch
2534
2900
  }
2535
2901
 
2536
- """Free shipping progress indicator"""
2902
+ """
2903
+ Progress towards the free shipping threshold configured by the merchant — drives "Add X more to get free shipping" banners.
2904
+ """
2537
2905
  type FreeShippingProgress {
2538
- """Current cart subtotal"""
2906
+ """Current qualifying subtotal of the cart."""
2539
2907
  currentAmount: Money
2540
2908
 
2541
- """Human-readable progress message"""
2909
+ """
2910
+ Pre-formatted, localised banner message (e.g. "Add 15.00 PLN more for free shipping"). Render as-is when present.
2911
+ """
2542
2912
  message: String
2543
2913
 
2544
- """Progress percentage (0-100)"""
2914
+ """
2915
+ Progress towards the threshold expressed as a percentage between 0 and 100. Use as the value of a progress bar.
2916
+ """
2545
2917
  progressPercent: Float
2546
2918
 
2547
- """Whether free shipping is achieved"""
2919
+ """True when the cart already qualifies for free shipping."""
2548
2920
  qualifies: Boolean!
2549
2921
 
2550
- """Amount remaining for free shipping"""
2922
+ """
2923
+ How much more the buyer needs to add to qualify. Zero when `qualifies` is true.
2924
+ """
2551
2925
  remaining: Money
2552
2926
 
2553
- """Threshold for free shipping"""
2927
+ """Subtotal threshold that unlocks free shipping."""
2554
2928
  threshold: Money
2555
2929
  }
2556
2930
 
@@ -2662,26 +3036,34 @@ type GiftCardValidation {
2662
3036
  isValid: Boolean!
2663
3037
  }
2664
3038
 
2665
- """Image with URL and metadata"""
3039
+ """
3040
+ An image with its URL and presentation metadata. The URL accepts an `Image.url(transform: ...)` argument for responsive resizing / format selection.
3041
+ """
2666
3042
  type Image {
2667
- """Alt text for accessibility"""
3043
+ """
3044
+ Alt text for accessibility / SEO. Null when the merchant has not provided one.
3045
+ """
2668
3046
  altText: String
2669
3047
 
2670
- """Image height in pixels"""
3048
+ """Native height of the source image in pixels."""
2671
3049
  height: Int
2672
3050
 
2673
- """Image ID"""
3051
+ """
3052
+ Stable image identifier. Null for ad-hoc images that are not stored as media library entries.
3053
+ """
2674
3054
  id: ID
2675
3055
 
2676
3056
  """
2677
- ThumbHash placeholder for progressive loading (base64-encoded, ~40 chars). Decode with thumbHashToDataURL() on the client.
3057
+ ThumbHash placeholder for progressive loading (base64-encoded, ~40 chars). Decode with `thumbHashToDataURL()` on the client to render an instant blurry preview while the full image loads.
2678
3058
  """
2679
3059
  thumbhash: String
2680
3060
 
2681
- """Image URL. Pass transform argument for resized/cropped CDN URLs."""
3061
+ """
3062
+ Public image URL. Pass an optional `transform` argument (max width / height, crop region, scale, preferred format) to obtain a resized / reformatted CDN variant — useful for responsive images and modern formats like WebP / AVIF.
3063
+ """
2682
3064
  url(transform: ImageTransformInput): String!
2683
3065
 
2684
- """Image width in pixels"""
3066
+ """Native width of the source image in pixels."""
2685
3067
  width: Int
2686
3068
  }
2687
3069
 
@@ -2761,7 +3143,7 @@ type Language {
2761
3143
  nativeName: String!
2762
3144
  }
2763
3145
 
2764
- """ISO 639-1 language code"""
3146
+ """ISO 639-1 language code (2-letter uppercase, e.g. PL, EN, DE)."""
2765
3147
  enum LanguageCode {
2766
3148
  CS
2767
3149
  DA
@@ -3030,6 +3412,9 @@ type LoyaltyReward {
3030
3412
  """Discount percentage (if discount type)"""
3031
3413
  discountPercent: Float
3032
3414
 
3415
+ """URL-friendly handle"""
3416
+ handle: String!
3417
+
3033
3418
  """Reward ID"""
3034
3419
  id: ID!
3035
3420
 
@@ -3048,9 +3433,6 @@ type LoyaltyReward {
3048
3433
  """Redemptions remaining (null = unlimited)"""
3049
3434
  redemptionsRemaining: Int
3050
3435
 
3051
- """URL-friendly slug"""
3052
- slug: String!
3053
-
3054
3436
  """Minimum tier required"""
3055
3437
  tierRequired: LoyaltyTier
3056
3438
 
@@ -3180,86 +3562,99 @@ enum LoyaltyTransactionType {
3180
3562
  REFUND_REVERSAL
3181
3563
  }
3182
3564
 
3183
- """Customer mailing address"""
3565
+ """
3566
+ A mailing address — shipping or billing — used on a cart, on the resulting order, or saved in a customer address book. Carries optional B2B fields (`taxId`, `vatNumber`) and an optional `pickupPoint` for parcel locker / collection-point delivery.
3567
+ """
3184
3568
  type MailingAddress implements Node {
3185
- """City"""
3569
+ """City / town."""
3186
3570
  city: String
3187
3571
 
3188
- """Company name"""
3572
+ """Company name (relevant for B2B addresses)."""
3189
3573
  company: String
3190
3574
 
3191
- """Country"""
3575
+ """
3576
+ Country name in the request locale (e.g. "Poland", "Polska"). For machine logic use `countryCode`.
3577
+ """
3192
3578
  country: String
3193
3579
 
3194
- """ISO 3166-1 alpha-2 country code"""
3580
+ """ISO 3166-1 alpha-2 country code (e.g. PL, DE, US)."""
3195
3581
  countryCode: CountryCode
3196
3582
 
3197
- """First name"""
3583
+ """Buyer first name."""
3198
3584
  firstName: String
3199
3585
 
3200
3586
  """
3201
- Country-aware ordered address lines. Format zależy od country: PL = [name, streetLine1, "postalCode city"]; US = [name, streetLine1, "city, state postalCode"]; default = [name, streetLine1, streetLine2, city, postalCode, country]. Use bezpośrednio jako lines w UI bez ręcznego konstruowania.
3587
+ Country-aware ordered address lines, ready to render line by line in UI without manual formatting. The exact line layout depends on country (e.g. PL puts postal code before city, US after state).
3202
3588
  """
3203
3589
  formatted: [String!]!
3204
3590
 
3205
3591
  """
3206
- Single-line area summary, e.g. "Warszawa, MZ, Poland"
3592
+ Single-line summary of the area, e.g. "Warszawa, MZ, Poland". Useful for compact display in lists.
3207
3593
  """
3208
3594
  formattedArea: String
3209
3595
 
3210
- """Unique identifier"""
3596
+ """Stable identifier of the address."""
3211
3597
  id: ID!
3212
3598
 
3213
- """Whether this is default address (DoSwiftly extension)"""
3599
+ """True when this is the default address for the owning customer."""
3214
3600
  isDefault: Boolean!
3215
3601
 
3216
- """Last name"""
3602
+ """Buyer last name."""
3217
3603
  lastName: String
3218
3604
 
3219
- """Computed full name (firstName + " " + lastName)"""
3605
+ """Convenience full name (`firstName` + " " + `lastName`)."""
3220
3606
  name: String
3221
3607
 
3222
- """Phone number"""
3608
+ """Phone number associated with the address (free-form)."""
3223
3609
  phone: String
3224
3610
 
3225
- """Postal / ZIP code"""
3611
+ """
3612
+ Selected pickup point when the shipping method delivers to a parcel locker / collection point instead of the street address. Null for home delivery.
3613
+ """
3614
+ pickupPoint: PickupPoint
3615
+
3616
+ """Postal / ZIP code."""
3226
3617
  postalCode: String
3227
3618
 
3228
- """State / province"""
3619
+ """State / province / region name."""
3229
3620
  state: String
3230
3621
 
3231
- """State / province code (ISO 3166-2 subdivision)"""
3622
+ """State / province code (ISO 3166-2 subdivision, e.g. PL-MZ)."""
3232
3623
  stateCode: String
3233
3624
 
3234
- """First line of street address"""
3625
+ """First line of the street address (street and house / building number)."""
3235
3626
  streetLine1: String
3236
3627
 
3237
- """Second line of street address"""
3628
+ """
3629
+ Second line of the street address (apartment, suite, floor — optional).
3630
+ """
3238
3631
  streetLine2: String
3239
3632
 
3240
3633
  """
3241
- Per-address tax ID (Polish NIP, 10 digits z checksum). B2B use case: różne dane firmowe per adres — np. faktura na firmę matkę z NIP A, dostawa na oddział z NIP B. Distinct from `Customer.taxId` (customer-level globally).
3634
+ Per-address buyer tax ID for B2B invoicing — Polish NIP, 10 digits with checksum. Lets B2B buyers invoice different addresses to different legal entities. Independent of `Customer.taxId` (which is the customer-wide default).
3242
3635
  """
3243
3636
  taxId: String
3244
3637
 
3245
3638
  """
3246
- Per-address EU VAT number (e.g. PL1234567890). B2B cross-border: różny VAT per adres dostawy. Distinct from `Customer.vatNumber` (customer-level globally).
3639
+ Per-address EU VAT number (e.g. `PL1234567890`) for cross-border B2B. Independent of `Customer.vatNumber` (which is the customer-wide default).
3247
3640
  """
3248
3641
  vatNumber: String
3249
3642
  }
3250
3643
 
3251
- """Paginated mailing addresses (Relay Connection)"""
3644
+ """Paginated list of mailing addresses (Relay Connection)."""
3252
3645
  type MailingAddressConnection {
3253
- """Address edges with cursors"""
3646
+ """
3647
+ Edges with the address and its cursor — use for cursor-based pagination.
3648
+ """
3254
3649
  edges: [MailingAddressEdge!]!
3255
3650
 
3256
- """Address nodes (shortcut for edges.map(e => e.node))"""
3651
+ """Address nodes — convenience shortcut for `edges.map(e => e.node)`."""
3257
3652
  nodes: [MailingAddress!]!
3258
3653
 
3259
- """Pagination info"""
3654
+ """Cursor pagination info (`hasNextPage`, `endCursor`, etc.)."""
3260
3655
  pageInfo: PageInfo!
3261
3656
 
3262
- """Total count of addresses"""
3657
+ """Total number of saved addresses for the customer across all pages."""
3263
3658
  totalCount: Int!
3264
3659
  }
3265
3660
 
@@ -3363,16 +3758,17 @@ type MenuItem {
3363
3758
  type: MenuItemType!
3364
3759
 
3365
3760
  """
3366
- Resolved URL path computed server-side (e.g., /categories/funko, /products/toy-1, /pages/about, /collections/sale). Static types resolve to /, /search, /products, /blog. HTTP type returns the manually stored URL. Null only when type is a resource link (CATEGORY/COLLECTION/PAGE/PRODUCT) and the resource was deleted.
3761
+ Pre-resolved URL path computed server-side using a standard route convention: /categories/<handle>, /collections/<handle>, /pages/<handle>, /products/<handle>, /brands/<handle>. Static types resolve to /, /search, /products, /blog. HTTP returns the manually stored URL. Null when type is a resource link and the underlying resource was deleted. If your storefront uses non-standard routing (e.g. single-segment /<handle>), prefer reading the `resource` field instead and build URLs yourself from `resource.__typename` + `handle`.
3367
3762
  """
3368
3763
  url: URL
3369
3764
  }
3370
3765
 
3371
- union MenuItemResource = Category | Collection | Product | ShopPage
3766
+ union MenuItemResource = Brand | Category | Collection | Product | ShopPage
3372
3767
 
3373
3768
  """Menu item link type"""
3374
3769
  enum MenuItemType {
3375
3770
  BLOG
3771
+ BRAND
3376
3772
  CATALOG
3377
3773
  CATEGORY
3378
3774
  COLLECTION
@@ -3383,66 +3779,96 @@ enum MenuItemType {
3383
3779
  SEARCH
3384
3780
  }
3385
3781
 
3386
- """Monetary value with currency"""
3782
+ """A monetary amount with its ISO 4217 currency code."""
3387
3783
  type Money {
3388
- """Decimal money amount"""
3784
+ """
3785
+ Amount as a decimal string in major currency units (e.g. "12.99"). String, not float — preserves precision across locales.
3786
+ """
3389
3787
  amount: Decimal!
3390
3788
 
3391
- """ISO 4217 currency code"""
3789
+ """ISO 4217 currency code (e.g. PLN, EUR, USD)."""
3392
3790
  currencyCode: CurrencyCode!
3393
3791
  }
3394
3792
 
3395
3793
  type Mutation {
3396
- """Add lines to cart"""
3794
+ """
3795
+ Add one or more lines to the cart. Adding the same variant a second time merges into the existing line (sums the quantity). Returns the full updated cart plus any non-fatal warnings (e.g. stock dropped below requested quantity).
3796
+ """
3397
3797
  cartAddLines(id: ID!, lines: [CartLineInput!]!): CartAddLinesPayload!
3398
3798
 
3399
- """Apply gift card to cart"""
3799
+ """
3800
+ Apply a gift card to the cart by full code. The card is debited at `cartComplete`. Rate-limited to 5 requests per minute per IP+shop (gift card codes form a finite enumerable space).
3801
+ """
3400
3802
  cartApplyGiftCard(input: CartApplyGiftCardInput!): CartApplyGiftCardPayload!
3401
3803
 
3402
3804
  """
3403
- Complete cart create Order (D6delegates do CartCompletionOrchestrator.processCart)
3805
+ Finalise the cart into an `Order`. The cart is locked and no longer accepts mutations. Payment is initiated separately via `paymentCreate` check `order.canCreatePayment` to decide whether to render a "Pay now" button or send the buyer directly to the confirmation page (for offline methods such as cash on delivery). Rate-limited to 5 requests per minute per IP+shop; pass an `idempotencyKey` to guard against duplicate orders on retry.
3404
3806
  """
3405
3807
  cartComplete(input: CartCompleteInput!): CartCompletePayload!
3406
3808
 
3407
- """Create new cart"""
3809
+ """
3810
+ Create a new cart. All fields on `input` are optional — call with no input to create an empty cart, or pass initial lines, buyer identity, attributes, discount codes, email and a shipping address to skip the corresponding follow-up calls.
3811
+ """
3408
3812
  cartCreate(input: CartCreateInput): CartCreatePayload!
3409
3813
 
3410
- """Apply discount codes"""
3814
+ """
3815
+ Replace (not merge) the list of discount codes on the cart. Pass an empty array to clear all codes. Rate-limited to 10 requests per minute per IP+shop.
3816
+ """
3411
3817
  cartDiscountCodesUpdate(discountCodes: [String!]!, id: ID!): CartDiscountCodesUpdatePayload!
3412
3818
 
3413
- """Remove gift card from cart"""
3819
+ """
3820
+ Remove a previously applied gift card from the cart by its `CartAppliedGiftCard.id`. The storefront never has to handle the full gift card code on the client.
3821
+ """
3414
3822
  cartRemoveGiftCard(input: CartRemoveGiftCardInput!): CartRemoveGiftCardPayload!
3415
3823
 
3416
- """Remove lines from cart"""
3824
+ """
3825
+ Remove one or more lines from the cart by `CartLine.id`. Equivalent to `cartUpdateLines` with `quantity: 0` but lets the storefront express the intent explicitly.
3826
+ """
3417
3827
  cartRemoveLines(id: ID!, lineIds: [ID!]!): CartRemoveLinesPayload!
3418
3828
 
3419
- """Select payment method on cart"""
3829
+ """
3830
+ Select a payment method on the cart. Validates against the active shop payment methods and currency. The selection is finalised at `cartComplete`; payment itself is initiated via a separate `paymentCreate` mutation after the order is created.
3831
+ """
3420
3832
  cartSelectPaymentMethod(input: CartSelectPaymentMethodInput!): CartSelectPaymentMethodPayload!
3421
3833
 
3422
3834
  """
3423
- Select shipping method on cart (D8 term unification wcześniej cartSelectShippingRate)
3835
+ Select a shipping method on the cart. Validates the method against the cart contents and the shipping address (must be eligible for the destination, and a pickup point must be set when the method delivers to a locker / collection point). Updates `cost.totalShipping` and the grand total.
3424
3836
  """
3425
3837
  cartSelectShippingMethod(input: CartSelectShippingMethodInput!): CartSelectShippingMethodPayload!
3426
3838
 
3427
- """Set billing address on cart"""
3839
+ """
3840
+ Set the billing address on a cart. The shipping address is left unchanged — pass billing only when it differs from shipping (otherwise the order mirrors the shipping address as the billing address).
3841
+ """
3428
3842
  cartSetBillingAddress(input: CartSetBillingAddressInput!): CartSetBillingAddressPayload!
3429
3843
 
3430
- """Set shipping address on cart"""
3844
+ """
3845
+ Set the shipping address on a cart. Pass `address.pickupPoint` when the buyer is delivering to a parcel locker / collection point — required for non-HOME shipping methods. Replaces any previous shipping address; the billing address is left untouched.
3846
+ """
3431
3847
  cartSetShippingAddress(input: CartSetShippingAddressInput!): CartSetShippingAddressPayload!
3432
3848
 
3433
- """Update cart attributes"""
3849
+ """
3850
+ Replace (not merge) the cart-level custom attributes — free-form key/value pairs surfaced to the merchant on the order. Use for cart-wide metadata such as a B2B PO number or marketing source. Max 250 pairs / 255-char keys; over the limit returns `CART_ATTRIBUTES_LIMIT_EXCEEDED`.
3851
+ """
3434
3852
  cartUpdateAttributes(attributes: [CartAttributeInput!]!, id: ID!): CartUpdateAttributesPayload!
3435
3853
 
3436
- """Update buyer identity"""
3854
+ """
3855
+ Update buyer identity on the cart — email, phone, customer ID, country and language hints. Only supplied fields are touched; omit a field to leave it unchanged.
3856
+ """
3437
3857
  cartUpdateBuyerIdentity(buyerIdentity: CartBuyerIdentityInput!, id: ID!): CartUpdateBuyerIdentityPayload!
3438
3858
 
3439
- """Set recipient info on gift card line item (personalised delivery)"""
3859
+ """
3860
+ Set recipient details (email, display name, personalised message) on a gift card line item — the gift card will be delivered to this recipient on order completion.
3861
+ """
3440
3862
  cartUpdateGiftCardRecipient(input: CartUpdateGiftCardRecipientInput!): CartUpdateGiftCardRecipientPayload!
3441
3863
 
3442
- """Update cart lines"""
3864
+ """
3865
+ Update existing cart lines — quantity, custom attributes and / or configurator selections. Set `quantity` to 0 to remove a line. Address lines by `CartLine.id`.
3866
+ """
3443
3867
  cartUpdateLines(id: ID!, lines: [CartLineUpdateInput!]!): CartUpdateLinesPayload!
3444
3868
 
3445
- """Update cart note"""
3869
+ """
3870
+ Set or replace the buyer note on the cart (free-form, up to 1000 chars). Surfaced to the merchant on the resulting order.
3871
+ """
3446
3872
  cartUpdateNote(id: ID!, note: String!): CartUpdateNotePayload!
3447
3873
 
3448
3874
  """
@@ -3458,13 +3884,19 @@ type Mutation {
3458
3884
  """Add customer address"""
3459
3885
  customerAddAddress(address: MailingAddressInput!): CustomerAddAddressPayload!
3460
3886
 
3461
- """Login customer"""
3887
+ """
3888
+ Sign a customer in with email and password. Returns an access token to use on subsequent requests (as a Bearer header or via the SDK auth cookie).
3889
+ """
3462
3890
  customerLogin(input: CustomerAccessTokenCreateInput!): CustomerLoginPayload!
3463
3891
 
3464
- """Logout customer (clears auth cookie)"""
3892
+ """
3893
+ Sign the current customer out. Invalidates the access token on the server; the SDK BFF auth helpers additionally clear the HTTP-only cookie.
3894
+ """
3465
3895
  customerLogout: CustomerLogoutPayload!
3466
3896
 
3467
- """Refresh access token"""
3897
+ """
3898
+ Exchange a still-valid access token for a fresh one with a later expiry. Call before `expiresAt` to keep the session alive without prompting the buyer to log in again.
3899
+ """
3468
3900
  customerRefreshToken: CustomerRefreshTokenPayload!
3469
3901
 
3470
3902
  """Remove customer address"""
@@ -3484,7 +3916,9 @@ type Mutation {
3484
3916
  """Set default address"""
3485
3917
  customerSetDefaultAddress(addressId: ID!): CustomerSetDefaultAddressPayload!
3486
3918
 
3487
- """Register new customer"""
3919
+ """
3920
+ Register a new customer with email and password. Returns the created customer plus an access token so the storefront can sign the buyer in immediately, no follow-up login call needed.
3921
+ """
3488
3922
  customerSignup(input: CustomerCreateInput!): CustomerSignupPayload!
3489
3923
 
3490
3924
  """Subscribe an email to the newsletter (guest-friendly, double opt-in)."""
@@ -3506,7 +3940,7 @@ type Mutation {
3506
3940
  loyaltyRedeemReward(input: RedeemRewardInput!): RedeemRewardPayload!
3507
3941
 
3508
3942
  """
3509
- Initiate a payment session for an order call after cartComplete when order.canCreatePayment is true
3943
+ Initiate a payment session for an order created by `cartComplete`. Call after checking `order.canCreatePayment`. Idempotent on the order — a second call returns the existing still-valid session. Branch on the returned `payment.flow` to launch the payment (redirect / embedded / instant). Rate-limited to 5 requests per minute per IP+shop.
3510
3944
  """
3511
3945
  paymentCreate(input: PaymentCreateInput!): PaymentCreatePayload!
3512
3946
 
@@ -3564,64 +3998,88 @@ enum NodeType {
3564
3998
  PRODUCT_VARIANT
3565
3999
  }
3566
4000
 
3567
- """Customer order summary"""
4001
+ """
4002
+ A buyer order — the result of completing a cart. Carries totals, status, addresses, line items and the signals needed to drive payment (`canCreatePayment`, `paymentMethodType`) and a guest confirmation page (`accessToken`).
4003
+ """
3568
4004
  type Order implements Node {
3569
4005
  """
3570
- Opaque access token (UUID v4) umożliwiający dostęp do podsumowania zamówienia bez sesji (guest order access via orderByToken query). Trwały per order share dla forwarded receipts. Storefront powinien przechowywać HTTP-only cookie / sessionStorage (NIGDY localStorage). Defense-in-depth: orderByToken akceptuje opcjonalny email guard żeby ograniczyć blast radius kompromisu.
4006
+ Opaque access token (UUID v4) that grants read access to the order summary without an authenticated session — pass it to the `orderByToken` query to build a guest confirmation page. Persistent for the lifetime of the order so it can be re-used in forwarded receipts. Store on the storefront in an HTTP-only cookie or `sessionStorage`; never in `localStorage`. As defense-in-depth, `orderByToken` also accepts an optional email guard to limit the blast radius if the token leaks.
3571
4007
  """
3572
4008
  accessToken: String!
3573
4009
 
3574
4010
  """Order custom field values (post-Opcja A unified custom fields)."""
3575
4011
  attributes(namespace: String): [EntityAttributeField!]!
3576
4012
 
3577
- """Czy storefront może zainicjować płatność dla tego order"""
4013
+ """
4014
+ True when the storefront should initiate an online payment for this order — render a "Pay now" button. False when the order is cancelled, already paid, or uses an offline payment method (cash on delivery, manual bank transfer) where no online flow applies. Retry-friendly: returns true for UNPAID / PENDING / FAILED payment statuses when the method supports online init.
4015
+ """
3578
4016
  canCreatePayment: Boolean!
3579
4017
 
3580
- """When order was cancelled"""
4018
+ """When the order was cancelled. Null when not cancelled."""
3581
4019
  cancelledAt: DateTime
3582
4020
 
3583
- """When order was confirmed"""
4021
+ """
4022
+ When the order was confirmed (e.g. payment authorised / approved). Null until confirmation.
4023
+ """
3584
4024
  confirmedAt: DateTime
3585
4025
 
3586
- """When order expired"""
4026
+ """
4027
+ When the order expired (e.g. pending payment timed out). Null when not expired.
4028
+ """
3587
4029
  expiredAt: DateTime
3588
4030
 
3589
- """Fulfillment status"""
4031
+ """
4032
+ Fulfillment progress (UNFULFILLED, PARTIALLY_FULFILLED, FULFILLED, IN_TRANSIT, DELIVERED, PARTIALLY_RETURNED, RETURNED, LOST).
4033
+ """
3590
4034
  fulfillmentStatus: OrderFulfillmentStatus!
3591
4035
 
3592
- """Unique identifier"""
4036
+ """Stable identifier of the order."""
3593
4037
  id: ID!
3594
4038
 
3595
- """Line items count"""
4039
+ """
4040
+ Number of line items on the order (sum of distinct lines, not quantities).
4041
+ """
3596
4042
  itemCount: Int!
3597
4043
 
3598
4044
  """
3599
- Pozycje zamówienia (top-level connection) eliminuje N+1 vs Order.shipments.items
4045
+ Line items on the order (paginated, Relay Connection). Use to render the order summary on the confirmation or order detail page.
3600
4046
  """
3601
4047
  lineItems(after: String, first: Int = 10): OrderLineItemConnection!
3602
4048
 
3603
- """Order number (human-readable)"""
4049
+ """
4050
+ Human-readable order number shown to the buyer and the merchant (e.g. "1042"). Distinct from `id`.
4051
+ """
3604
4052
  orderNumber: String!
3605
4053
 
3606
- """Kategoria payment method zmapowana z provider code"""
4054
+ """
4055
+ Category of the payment method on the order (CARD, BLIK, BANK_TRANSFER, CASH_ON_DELIVERY, OTHER). Use to drive iconography and copy on the confirmation page (e.g. show the card icon for CARD, the BLIK logo for BLIK).
4056
+ """
3607
4057
  paymentMethodType: PaymentMethodType!
3608
4058
 
3609
- """Payment status"""
4059
+ """
4060
+ Payment progress (UNPAID, PENDING, AUTHORIZED, PAID, PARTIALLY_PAID, PARTIALLY_REFUNDED, REFUNDED, FAILED, CHARGEBACK, VOIDED, REFUND_PENDING).
4061
+ """
3610
4062
  paymentStatus: OrderPaymentStatus!
3611
4063
 
3612
- """Order date (ISO 8601)"""
4064
+ """
4065
+ When the order was placed (ISO 8601). Use as the canonical "order date" in receipts.
4066
+ """
3613
4067
  processedAt: DateTime!
3614
4068
 
3615
4069
  """Order shipments"""
3616
4070
  shipments: [Shipment!]!
3617
4071
 
3618
- """Shipping address"""
4072
+ """
4073
+ Shipping address snapshot at the moment the order was placed. Null for digital-only orders.
4074
+ """
3619
4075
  shippingAddress: MailingAddress
3620
4076
 
3621
- """Order lifecycle status"""
4077
+ """
4078
+ High-level lifecycle status of the order (DRAFT, PENDING, CONFIRMED, PROCESSING, ON_HOLD, COMPLETED, CANCELLED, EXPIRED).
4079
+ """
3622
4080
  status: StorefrontOrderStatus!
3623
4081
 
3624
- """Cost totals breakdown (subtotal/total/totalTax/totalShipping)"""
4082
+ """Cost breakdown on the order (subtotal, total, tax, shipping)."""
3625
4083
  totals: OrderTotals!
3626
4084
  }
3627
4085
 
@@ -3649,7 +4107,9 @@ type OrderEdge {
3649
4107
  node: Order!
3650
4108
  }
3651
4109
 
3652
- """Fulfillment status of an order"""
4110
+ """
4111
+ Fulfillment progress of an order. UNFULFILLED → PARTIALLY_FULFILLED → FULFILLED (items shipped) → IN_TRANSIT → DELIVERED. PARTIALLY_RETURNED / RETURNED reflect post-delivery returns; LOST marks a parcel that never reached the buyer.
4112
+ """
3653
4113
  enum OrderFulfillmentStatus {
3654
4114
  DELIVERED
3655
4115
  FULFILLED
@@ -3724,7 +4184,9 @@ type OrderLineItemEdge {
3724
4184
  node: OrderLineItem!
3725
4185
  }
3726
4186
 
3727
- """Payment status of an order"""
4187
+ """
4188
+ Payment status of an order. UNPAID = no payment recorded yet; PENDING = initiated, awaiting confirmation; AUTHORIZED = held but not captured; PAID = fully paid; PARTIALLY_PAID / PARTIALLY_REFUNDED = intermediate states; REFUNDED = fully refunded; FAILED, CHARGEBACK, VOIDED, REFUND_PENDING = terminal / in-flight unpaid states.
4189
+ """
3728
4190
  enum OrderPaymentStatus {
3729
4191
  AUTHORIZED
3730
4192
  CHARGEBACK
@@ -3739,18 +4201,26 @@ enum OrderPaymentStatus {
3739
4201
  VOIDED
3740
4202
  }
3741
4203
 
3742
- """Order cost totals breakdown"""
4204
+ """
4205
+ Cost totals on an order — symmetric with `CartCost` so the confirmation page renders the same breakdown the buyer saw at checkout.
4206
+ """
3743
4207
  type OrderTotals {
3744
- """Order subtotal (before tax and shipping)"""
4208
+ """Order subtotal — items only, before tax, shipping and discounts."""
3745
4209
  subtotal: Money!
3746
4210
 
3747
- """Order total (after tax and shipping)"""
4211
+ """
4212
+ Grand total the buyer was charged — includes taxes, shipping and discounts.
4213
+ """
3748
4214
  total: Money!
3749
4215
 
3750
- """Total shipping cost"""
4216
+ """
4217
+ Total shipping cost on the order. Null for digital-only orders that did not go through shipping.
4218
+ """
3751
4219
  totalShipping: Money
3752
4220
 
3753
- """Total tax amount"""
4221
+ """
4222
+ Total tax across the order. Null when the order has no taxable component.
4223
+ """
3754
4224
  totalTax: Money
3755
4225
  }
3756
4226
 
@@ -3769,18 +4239,26 @@ input PackageDimensionsInput {
3769
4239
  width: Int
3770
4240
  }
3771
4241
 
3772
- """Pagination information"""
4242
+ """Cursor pagination info for a Relay Connection."""
3773
4243
  type PageInfo {
3774
- """Cursor of last item"""
4244
+ """
4245
+ Cursor of the last item on the current page — opaque, base64-encoded. Echo as the `after` argument to fetch the next page.
4246
+ """
3775
4247
  endCursor: String
3776
4248
 
3777
- """Whether there are more items after"""
4249
+ """
4250
+ True when more pages follow this one. Use to decide whether to enable a "load more" / next page action.
4251
+ """
3778
4252
  hasNextPage: Boolean!
3779
4253
 
3780
- """Whether there are more items before"""
4254
+ """
4255
+ True when pages exist before this one (relevant for bidirectional pagination).
4256
+ """
3781
4257
  hasPreviousPage: Boolean!
3782
4258
 
3783
- """Cursor of first item"""
4259
+ """
4260
+ Cursor of the first item on the current page — opaque, base64-encoded. Echo as the `before` argument to paginate backwards.
4261
+ """
3784
4262
  startCursor: String
3785
4263
  }
3786
4264
 
@@ -3791,33 +4269,39 @@ enum PageSortKeys {
3791
4269
  UPDATED_AT
3792
4270
  }
3793
4271
 
3794
- """Input dla paymentCreate mutation"""
4272
+ """
4273
+ Input for `paymentCreate` — initiates a payment for an order created by `cartComplete`. Idempotent on the order: a second call returns the existing still-valid session.
4274
+ """
3795
4275
  input PaymentCreateInput {
3796
4276
  """
3797
- URL powrotu klienta po anulowaniu płatności musi być na zweryfikowanej domenie sklepu
4277
+ URL the gateway returns the buyer to after they cancel the payment. Must point to a verified domain of the shop.
3798
4278
  """
3799
4279
  cancelUrl: URL
3800
4280
 
3801
- """ID zamówienia (z cartComplete) do opłacenia"""
4281
+ """ID of the order to pay for — `cartComplete.order.id`."""
3802
4282
  orderId: ID!
3803
4283
 
3804
4284
  """
3805
- URL powrotu klienta po płatności musi być na zweryfikowanej domenie sklepu
4285
+ URL the gateway returns the buyer to after a successful payment. Must point to a verified domain of the shop; rejected with `RETURN_URL_INVALID` otherwise.
3806
4286
  """
3807
4287
  returnUrl: URL
3808
4288
  }
3809
4289
 
3810
- """Wynik paymentCreate mutation"""
4290
+ """Result of `paymentCreate`."""
3811
4291
  type PaymentCreatePayload {
3812
- """Utworzona sesja płatności (null gdy userErrors)"""
4292
+ """
4293
+ The created (or reused) payment session on success; null when `userErrors` is non-empty.
4294
+ """
3813
4295
  payment: PaymentSession
3814
4296
 
3815
- """Błędy walidacji / biznesowe"""
4297
+ """
4298
+ Business / validation errors carrying a stable `PaymentErrorCode` in `code` (e.g. `ORDER_NOT_FOUND`, `ORDER_ALREADY_PAID`, `ORDER_NOT_PAYABLE`, `PAYMENT_PROVIDER_NOT_CONFIGURED`, `RETURN_URL_INVALID`, `PAYMENT_FAILED`).
4299
+ """
3816
4300
  userErrors: [UserError!]!
3817
4301
  }
3818
4302
 
3819
4303
  """
3820
- Sposób uruchomienia płatności po stronie klientastorefront rozgałęzia krok po tej wartości
4304
+ How the storefront should launch the payment after `paymentCreate`. ONLINE_REDIRECT = redirect the browser to `redirectUrl`. ONLINE_EMBEDDED = render an in-page widget using `clientSecret`. INSTANT_DIRECT = the payment is already settled, check `status`. OFFLINE_MANUAL never appears here when the order uses an offline method `canCreatePayment` is false and `paymentCreate` is not called.
3821
4305
  """
3822
4306
  enum PaymentInitiationFlow {
3823
4307
  INSTANT_DIRECT
@@ -3826,37 +4310,59 @@ enum PaymentInitiationFlow {
3826
4310
  ONLINE_REDIRECT
3827
4311
  }
3828
4312
 
3829
- """Payment method available for checkout"""
4313
+ """
4314
+ A payment method offered to the buyer at checkout — what to render in the payment picker and pass to `cartSelectPaymentMethod`.
4315
+ """
3830
4316
  type PaymentMethod {
3831
- """Description for customers"""
4317
+ """
4318
+ Optional buyer-facing description shown under the name (e.g. "Pay with your bank app").
4319
+ """
3832
4320
  description: String
3833
4321
 
3834
- """Icon URL or path"""
4322
+ """
4323
+ Optional icon URL configured by the merchant. Use as the method tile artwork.
4324
+ """
3835
4325
  icon: String
3836
4326
 
3837
- """Payment method ID"""
4327
+ """
4328
+ Stable ID of the payment method. Pass to `cartSelectPaymentMethod` to select it.
4329
+ """
3838
4330
  id: ID!
3839
4331
 
3840
- """Whether this is the default payment method"""
4332
+ """
4333
+ True when the merchant has marked this method as the default. Pre-select it in the picker.
4334
+ """
3841
4335
  isDefault: Boolean!
3842
4336
 
3843
- """Display name"""
4337
+ """
4338
+ Display name configured by the merchant (e.g. "BLIK", "Credit card", "Cash on delivery").
4339
+ """
3844
4340
  name: String!
3845
4341
 
3846
- """Display position (lower = higher priority)"""
4342
+ """
4343
+ Merchant-configured display position — lower values come first in the picker.
4344
+ """
3847
4345
  position: Float!
3848
4346
 
3849
- """Provider code (payu, stripe, p24, etc.)"""
4347
+ """
4348
+ Provider code (e.g. "payu", "stripe", "p24", "cash_on_delivery"). Identifies the integration behind the method; do not branch UI on it — use `type` instead.
4349
+ """
3850
4350
  provider: String!
3851
4351
 
3852
- """Supported currency codes"""
4352
+ """
4353
+ ISO 4217 currency codes the method accepts. Null when the method accepts the shop currency without restriction.
4354
+ """
3853
4355
  supportedCurrencies: [String!]
3854
4356
 
3855
- """Type of payment method"""
4357
+ """
4358
+ Category of the method (CARD, BLIK, BANK_TRANSFER, CASH_ON_DELIVERY, OTHER). Drives iconography and copy.
4359
+ """
3856
4360
  type: PaymentMethodType!
3857
4361
  }
3858
4362
 
3859
- """Type of payment method"""
4363
+ """
4364
+ Category of a payment method: CARD, BLIK, BANK_TRANSFER, CASH_ON_DELIVERY or OTHER. Drives iconography and copy in the payment picker; do not branch on `provider` directly.
4365
+ """
3860
4366
  enum PaymentMethodType {
3861
4367
  BANK_TRANSFER
3862
4368
  BLIK
@@ -3865,30 +4371,44 @@ enum PaymentMethodType {
3865
4371
  OTHER
3866
4372
  }
3867
4373
 
3868
- """Sesja płatności utworzona dla zamówienia"""
4374
+ """
4375
+ Payment session created for an order. Branch on `flow` to launch payment: ONLINE_REDIRECT → redirect to `redirectUrl`; ONLINE_EMBEDDED → render an in-page widget using `clientSecret`; INSTANT_DIRECT → the payment is already settled, check `status`.
4376
+ """
3869
4377
  type PaymentSession {
3870
- """Token/secret do widgetu in-page — wypełniony dla flow ONLINE_EMBEDDED"""
4378
+ """
4379
+ Client secret / token for the in-page payment widget. Populated only when `flow` is ONLINE_EMBEDDED. Treat as sensitive — do not log.
4380
+ """
3871
4381
  clientSecret: String
3872
4382
 
3873
- """Kiedy redirectUrl/clientSecret przestaje być ważny (ISO 8601)"""
4383
+ """
4384
+ When the `redirectUrl` / `clientSecret` stops being usable (ISO 8601). The storefront should call `paymentCreate` again to get a fresh session after this time.
4385
+ """
3874
4386
  expiresAt: String
3875
4387
 
3876
- """Sposób uruchomienia — storefront robi switch(flow)"""
4388
+ """
4389
+ How the storefront should launch the payment — branch on this with `switch(flow)`.
4390
+ """
3877
4391
  flow: PaymentInitiationFlow!
3878
4392
 
3879
- """ID rekordu płatności"""
4393
+ """Stable identifier of the payment record."""
3880
4394
  id: ID!
3881
4395
 
3882
- """ID zamówienia"""
4396
+ """ID of the order this payment is for."""
3883
4397
  orderId: ID!
3884
4398
 
3885
- """Kod providera płatności (np. PAYU)"""
4399
+ """
4400
+ Provider code of the integration behind the session (e.g. "PAYU", "STRIPE"). Use for analytics; do not branch UI on it — use `flow` and the order `paymentMethodType` instead.
4401
+ """
3886
4402
  provider: String!
3887
4403
 
3888
- """URL hosted gateway — wypełniony dla flow ONLINE_REDIRECT"""
4404
+ """
4405
+ Hosted-gateway URL to redirect the buyer to. Populated only when `flow` is ONLINE_REDIRECT.
4406
+ """
3889
4407
  redirectUrl: URL
3890
4408
 
3891
- """Status płatności zamówienia"""
4409
+ """
4410
+ Payment status of the order at the time the session was created. For INSTANT_DIRECT, this already reflects the settled outcome.
4411
+ """
3892
4412
  status: OrderPaymentStatus!
3893
4413
  }
3894
4414
 
@@ -3909,6 +4429,46 @@ type PaymentSettings {
3909
4429
  paymentProviders: [String!]!
3910
4430
  }
3911
4431
 
4432
+ """
4433
+ A pickup point (parcel locker or staffed collection point) attached to a delivery address. The buyer picks it in the carrier widget; it is persisted on the cart shipping address and carried through to the order.
4434
+ """
4435
+ type PickupPoint {
4436
+ """
4437
+ Point address as a single human-readable line — show alongside the name on the confirmation page.
4438
+ """
4439
+ address: String
4440
+
4441
+ """Display name of the point as shown in the carrier widget."""
4442
+ name: String
4443
+
4444
+ """
4445
+ Identifier of the point within the provider network (e.g. an InPost parcel locker code such as `KRA010`). Pass back to `PickupPointInput.pointId` when attaching the same point to another address.
4446
+ """
4447
+ pointId: String!
4448
+
4449
+ """
4450
+ Carrier network code that owns the point (e.g. `inpost`, `orlen`, `dpd`).
4451
+ """
4452
+ provider: String!
4453
+ }
4454
+
4455
+ """
4456
+ Pickup point (parcel locker / collection point) for a cart shipping address
4457
+ """
4458
+ input PickupPointInput {
4459
+ """Point address as a single line"""
4460
+ address: String
4461
+
4462
+ """Human-readable point name"""
4463
+ name: String
4464
+
4465
+ """Point identifier within the provider network"""
4466
+ pointId: String!
4467
+
4468
+ """Courier network code (e.g. inpost, orlen, dpd)"""
4469
+ provider: String!
4470
+ }
4471
+
3912
4472
  """Points estimate for an order"""
3913
4473
  type PointsEstimate {
3914
4474
  """Base points to earn"""
@@ -4009,7 +4569,7 @@ type Product implements Node {
4009
4569
  """
4010
4570
  Canonical brand entity (Faza 3, 2026-05-17). Resolved via DataLoader (N+1 safe dla list queries). Null gdy product nie ma przypisanego brand_id.
4011
4571
  """
4012
- brand: BrandSummary
4572
+ brand: Brand
4013
4573
 
4014
4574
  """
4015
4575
  Wszystkie kategorie do których produkt należy (M2M przez ProductCategory junction). Posortowane po junction.sortOrder ASC. Empty list gdy produkt nie jest w żadnej kategorii.
@@ -4123,6 +4683,9 @@ type ProductAttributeDefinition {
4123
4683
  """Filling mode — MERCHANT | CUSTOMER | BOTH"""
4124
4684
  fillingMode: AttributeFillingMode!
4125
4685
 
4686
+ """URL-friendly handle"""
4687
+ handle: String!
4688
+
4126
4689
  """Definition ID"""
4127
4690
  id: ID!
4128
4691
 
@@ -4149,9 +4712,6 @@ type ProductAttributeDefinition {
4149
4712
  """
4150
4713
  scopeProductId: ID
4151
4714
 
4152
- """URL-friendly slug"""
4153
- slug: String!
4154
-
4155
4715
  """Tax class ID; null = inherit from variant"""
4156
4716
  taxClassId: ID
4157
4717
 
@@ -4424,7 +4984,9 @@ enum ProductSortKeys {
4424
4984
  VENDOR
4425
4985
  }
4426
4986
 
4427
- """Product type classification"""
4987
+ """
4988
+ Product type classification. PHYSICAL = ships to an address (requires the shipping step). DIGITAL = delivered electronically. SERVICE = booking / appointment, no shipment. SUBSCRIPTION = recurring billing. GIFT_CARD = issues a redeemable card on completion.
4989
+ """
4428
4990
  enum ProductTypeEnum {
4429
4991
  DIGITAL
4430
4992
  GIFT_CARD
@@ -4433,49 +4995,69 @@ enum ProductTypeEnum {
4433
4995
  SUBSCRIPTION
4434
4996
  }
4435
4997
 
4436
- """Product variant - purchasable unit"""
4998
+ """
4999
+ A purchasable unit of a product — one variant out of the product variants list, identified by its `id` and described by its options.
5000
+ """
4437
5001
  type ProductVariant {
4438
5002
  """Variant custom field values (post-Opcja A unified custom fields)."""
4439
5003
  attributes(namespace: String): [EntityAttributeField!]!
4440
5004
 
4441
5005
  """
4442
- Available stock (computed: stock - reserved). Null when track is disabled.
5006
+ Available stock what the buyer can buy now (on-hand minus active reservations, never below 0). Null when the merchant has disabled stock tracking for this variant (e.g. digital, made-to-order).
4443
5007
  """
4444
5008
  availableStock: Int
4445
5009
 
4446
- """Barcode"""
5010
+ """
5011
+ Barcode (EAN/UPC/etc.) as set by the merchant. Null when not configured.
5012
+ """
4447
5013
  barcode: String
4448
5014
 
4449
- """Compare at price (Money). Null gdy variant nie jest na promocji."""
5015
+ """
5016
+ Strike-through compare-at price when the variant is on sale. Null when the variant is not discounted; show the strike-through only when this is present and greater than `price`.
5017
+ """
4450
5018
  compareAtPrice: Money
4451
5019
 
4452
- """Opt-in: compare-at price with conversion transparency."""
5020
+ """Optional opt-in: `compareAtPrice` with full conversion transparency."""
4453
5021
  compareAtPriceWithConversion: PriceMoney
4454
5022
 
4455
- """Unique identifier"""
5023
+ """
5024
+ Stable identifier of the variant. Pass to `cartAddLines.variantId` to add the variant to a cart.
5025
+ """
4456
5026
  id: ID!
4457
5027
 
4458
- """Variant image"""
5028
+ """
5029
+ Image specific to this variant. Null when the variant inherits the parent product image.
5030
+ """
4459
5031
  image: Image
4460
5032
 
4461
- """Whether variant is available for purchase"""
5033
+ """
5034
+ True when the variant can be purchased right now (in stock, or backorder allowed by the merchant).
5035
+ """
4462
5036
  isAvailable: Boolean!
4463
5037
 
4464
- """Variant price (Money). Default field — industry-standard schema."""
5038
+ """
5039
+ Current price of the variant in the buyer preferred currency (auto-converted from the shop base currency when multi-currency is enabled).
5040
+ """
4465
5041
  price: Money!
4466
5042
 
4467
5043
  """
4468
- Opt-in: price with full conversion transparency. Use dla currency-converter UI.
5044
+ Optional opt-in: `price` with full conversion transparency (original shop-currency amount, exchange rate, conversion timestamp). Use when building a currency-converter UI.
4469
5045
  """
4470
5046
  priceWithConversion: PriceMoney
4471
5047
 
4472
- """Selected options for this variant"""
5048
+ """
5049
+ Option values that define this variant (e.g. Size = Large, Color = Red).
5050
+ """
4473
5051
  selectedOptions: [SelectedOption!]!
4474
5052
 
4475
- """SKU code"""
5053
+ """
5054
+ Stock-keeping unit code as set by the merchant. Null when not configured.
5055
+ """
4476
5056
  sku: String
4477
5057
 
4478
- """Sort order among product variants"""
5058
+ """
5059
+ Display position of this variant within the parent product list. Lower values come first.
5060
+ """
4479
5061
  sortOrder: Int
4480
5062
 
4481
5063
  """
@@ -4495,10 +5077,14 @@ type ProductVariant {
4495
5077
  near: GeoCoordinateInput
4496
5078
  ): StoreAvailabilityConnection
4497
5079
 
4498
- """Variant title (e.g., "Large / Red")"""
5080
+ """
5081
+ Display title of the variant (e.g. "Large / Red"). Composed from the variant options.
5082
+ """
4499
5083
  title: String!
4500
5084
 
4501
- """Variant weight (canonical unit GRAMS — Prisma stores integer grams)"""
5085
+ """
5086
+ Variant weight with its unit. Stored in grams; pick a display unit on the storefront if needed. Null when the merchant has not set a weight.
5087
+ """
4502
5088
  weight: Weight
4503
5089
  }
4504
5090
 
@@ -4537,10 +5123,19 @@ type Query {
4537
5123
  """List of all currencies supported by the system (ECB rates)"""
4538
5124
  allSupportedCurrencies: [Currency!]!
4539
5125
 
4540
- """Get available payment methods"""
5126
+ """
5127
+ Paginated + searchable attribute options dla drill-into filter UI (np. dropdown z 800 licencjami + search input). Honors product context z exclude-self per attribute. Sort: COUNT_DESC default (most popular first), LABEL_ASC dla alfabetycznego z polskim collation.
5128
+ """
5129
+ attributeOptionsSearch(input: AttributeOptionsSearchInput!): AttributeFilterValueConnection!
5130
+
5131
+ """
5132
+ Payment methods active for the current shop, plus the merchant default. Shop-level — independent of cart contents in this iteration. Fetch once for the checkout payment step.
5133
+ """
4541
5134
  availablePaymentMethods: AvailablePaymentMethods!
4542
5135
 
4543
- """Get available shipping methods for address"""
5136
+ """
5137
+ Standalone shipping-method preview for an address — does not require a cart. Pass an optional `cart` summary (subtotal, weight, currency) to evaluate price-based / weight-based rules and free-shipping thresholds. For an already-created cart, prefer `cart.availableShippingMethods(address)` — it reads the cart contents directly.
5138
+ """
4544
5139
  availableShippingMethods(address: ShippingAddressInput!, cart: CartShippingInput): AvailableShippingMethodsPayload!
4545
5140
 
4546
5141
  """Get live shipping rates from configured carriers"""
@@ -4554,11 +5149,11 @@ type Query {
4554
5149
 
4555
5150
  """Get single blog post"""
4556
5151
  blogPost(
5152
+ """Post handle"""
5153
+ handle: String
5154
+
4557
5155
  """Post ID"""
4558
5156
  id: ID
4559
-
4560
- """Post slug"""
4561
- slug: String
4562
5157
  ): BlogPost
4563
5158
 
4564
5159
  """List blog posts"""
@@ -4569,8 +5164,8 @@ type Query {
4569
5164
  """Filter by author ID"""
4570
5165
  authorId: String
4571
5166
 
4572
- """Filter by category slug"""
4573
- categorySlug: String
5167
+ """Filter by category handle"""
5168
+ categoryHandle: String
4574
5169
 
4575
5170
  """Filter featured posts only"""
4576
5171
  featured: Boolean
@@ -4584,17 +5179,21 @@ type Query {
4584
5179
  """Sort key"""
4585
5180
  sortKey: BlogPostSortKey = PUBLISHED_AT
4586
5181
 
4587
- """Filter by tag slug"""
4588
- tagSlug: String
5182
+ """Filter by tag handle"""
5183
+ tagHandle: String
4589
5184
  ): BlogPostConnection!
4590
5185
 
4591
5186
  """List blog tags"""
4592
5187
  blogTags(limit: Int = 50): [BlogTag!]!
4593
5188
 
4594
- """Get cart by ID"""
5189
+ """
5190
+ Fetch a cart by ID — returns null when the cart does not exist or has already been completed (converted to an order). Use to hydrate the cart state on page load or after a recovery flow.
5191
+ """
4595
5192
  cart(id: ID!): Cart
4596
5193
 
4597
- """Validate discount code preview (read-only, no cart side effects)"""
5194
+ """
5195
+ Preview whether a discount code is currently applicable to a cart — read-only, no cart side effects. Use for inline feedback while the buyer types a code, before calling `cartDiscountCodesUpdate`. Result depends on the cart subtotal (minimum-order rules) so do not cache aggressively: prefer `fetchPolicy: "network-only"` or include `cart.subtotal` in the cache key.
5196
+ """
4598
5197
  cartValidateDiscountCode(cartId: ID!, discountCode: String!): DiscountValidationResult!
4599
5198
 
4600
5199
  """
@@ -4624,11 +5223,11 @@ type Query {
4624
5223
 
4625
5224
  """Get category by ID or slug"""
4626
5225
  category(
5226
+ """Category handle (URL-friendly)"""
5227
+ handle: String
5228
+
4627
5229
  """Category ID"""
4628
5230
  id: ID
4629
-
4630
- """Category slug"""
4631
- slug: String
4632
5231
  ): Category
4633
5232
 
4634
5233
  """Get single collection"""
@@ -4679,13 +5278,17 @@ type Query {
4679
5278
  code: String!
4680
5279
  ): Currency
4681
5280
 
4682
- """Get authenticated customer (cookie / Authorization Bearer)"""
5281
+ """
5282
+ The authenticated customer for the current request. The request must carry a valid customer access token (in the `Authorization: Bearer ...` header or an HTTP-only auth cookie). Returns null for anonymous requests.
5283
+ """
4683
5284
  customer: Customer
4684
5285
 
4685
5286
  """Get available customer groups"""
4686
5287
  customerGroups: [CustomerGroup!]
4687
5288
 
4688
- """Get single order for authenticated customer"""
5289
+ """
5290
+ Fetch a single order owned by the authenticated customer. Returns null silently when there is no authenticated customer or the order does not belong to them. For guest order access use `orderByToken` instead.
5291
+ """
4689
5292
  customerOrder(orderId: ID!): Order
4690
5293
 
4691
5294
  """Estimate points for an order amount"""
@@ -5353,17 +5956,19 @@ type SearchQuerySuggestion {
5353
5956
  text: String!
5354
5957
  }
5355
5958
 
5356
- """Selected product option"""
5959
+ """
5960
+ One option of a product variant — e.g. `{ name: "Size", value: "Large" }`.
5961
+ """
5357
5962
  type SelectedOption {
5358
- """Option name (e.g., "Size", "Color")"""
5963
+ """Option name (e.g. "Size", "Color")."""
5359
5964
  name: String!
5360
5965
 
5361
5966
  """
5362
- Relational `ProductOptionValue.id`stable FK reference. Null only for legacy variants whose option values have not yet been migrated to the relational model.
5967
+ Stable ID of the option value useful as a key when rendering variant selectors. Null only for legacy variants not yet migrated to relational option values.
5363
5968
  """
5364
5969
  optionValueId: ID
5365
5970
 
5366
- """Option value (e.g., "Large", "Red")"""
5971
+ """Option value for this variant (e.g. "Large", "Red")."""
5367
5972
  value: String!
5368
5973
  }
5369
5974
 
@@ -5509,48 +6114,62 @@ enum ShipmentStatus {
5509
6114
  RETURNED
5510
6115
  }
5511
6116
 
5512
- """Address input for shipping calculation"""
6117
+ """
6118
+ Destination address used to evaluate which shipping methods are available for a cart. Country is required; the rest are optional and improve carrier rate accuracy when provided.
6119
+ """
5513
6120
  input ShippingAddressInput {
5514
- """City"""
6121
+ """City / town."""
5515
6122
  city: String
5516
6123
 
5517
- """ISO 3166-1 alpha-2 country code"""
6124
+ """
6125
+ Destination country (ISO 3166-1 alpha-2). Required — drives carrier eligibility and tax/region rules.
6126
+ """
5518
6127
  country: CountryCode!
5519
6128
 
5520
- """Email address"""
6129
+ """
6130
+ Buyer email — useful when the shipping carrier needs notification contact details.
6131
+ """
5521
6132
  email: String
5522
6133
 
5523
- """First name"""
6134
+ """Buyer first name."""
5524
6135
  firstName: String
5525
6136
 
5526
- """Last name"""
6137
+ """Buyer last name."""
5527
6138
  lastName: String
5528
6139
 
5529
- """Phone number"""
6140
+ """Buyer phone number (free-form)."""
5530
6141
  phone: String
5531
6142
 
5532
- """Postal / ZIP code"""
6143
+ """Postal / ZIP code — required by most carriers for accurate rates."""
5533
6144
  postalCode: String
5534
6145
 
5535
- """State / province / region"""
6146
+ """State / province / region."""
5536
6147
  state: String
5537
6148
 
5538
- """First line of street address"""
6149
+ """First line of the street address (street and house / building number)."""
5539
6150
  streetLine1: String
5540
6151
  }
5541
6152
 
5542
- """Shipping carrier information"""
6153
+ """
6154
+ Shipping carrier associated with a shipping method (e.g. InPost, DPD, DHL).
6155
+ """
5543
6156
  type ShippingCarrier {
5544
- """Carrier provider ID"""
6157
+ """
6158
+ Stable carrier identifier. Null when the method does not map to a registered carrier (e.g. local pickup configured by the merchant).
6159
+ """
5545
6160
  id: ID
5546
6161
 
5547
- """Carrier logo URL"""
6162
+ """
6163
+ URL of the carrier logo. Use for the method tile in the shipping picker.
6164
+ """
5548
6165
  logoUrl: String
5549
6166
 
5550
- """Carrier name (e.g., InPost, DPD, DHL)"""
6167
+ """Carrier display name (e.g. "InPost", "DPD", "DHL")."""
5551
6168
  name: String!
5552
6169
 
5553
- """Service code"""
6170
+ """
6171
+ Carrier service code as configured by the merchant (e.g. "inpost_paczkomat"). Useful when integrating carrier widgets.
6172
+ """
5554
6173
  serviceCode: String
5555
6174
  }
5556
6175
 
@@ -5562,8 +6181,10 @@ type Shop {
5562
6181
  """Bot protection configuration (platform-level)"""
5563
6182
  botProtection: BotProtectionInfo
5564
6183
 
5565
- """Industry-standard brand metadata (logo + slogan + colors)"""
5566
- brand: Brand
6184
+ """
6185
+ Shop brand metadata (logo + slogan + colors). Tenant-scoped (vs canonical product `Brand` entity used in `Product.brand`).
6186
+ """
6187
+ brand: ShopBrand
5567
6188
 
5568
6189
  """Complete branding configuration"""
5569
6190
  branding: ShopBranding
@@ -5670,6 +6291,27 @@ type ShopAddress {
5670
6291
  streetLine2: String
5671
6292
  }
5672
6293
 
6294
+ """Shop brand metadata (logo, colors, slogan)"""
6295
+ type ShopBrand {
6296
+ """Primary + secondary brand colors"""
6297
+ colors: BrandColors
6298
+
6299
+ """Cover image / hero banner"""
6300
+ coverImage: Image
6301
+
6302
+ """Primary logo"""
6303
+ logo: Image
6304
+
6305
+ """Short brand description"""
6306
+ shortDescription: String
6307
+
6308
+ """Marketing slogan / tagline"""
6309
+ slogan: String
6310
+
6311
+ """Square logo variant (favicons, app tiles)"""
6312
+ squareLogo: Image
6313
+ }
6314
+
5673
6315
  """Shop branding configuration"""
5674
6316
  type ShopBranding {
5675
6317
  """Brand colors"""
@@ -5860,7 +6502,9 @@ type StoreAvailabilityEdge {
5860
6502
  node: StoreAvailability!
5861
6503
  }
5862
6504
 
5863
- """Lifecycle status of an order"""
6505
+ """
6506
+ High-level lifecycle of an order. DRAFT (not yet placed) → PENDING (placed, awaiting confirmation) → CONFIRMED → PROCESSING → COMPLETED. ON_HOLD pauses the order; CANCELLED and EXPIRED are terminal states.
6507
+ """
5864
6508
  enum StorefrontOrderStatus {
5865
6509
  CANCELLED
5866
6510
  COMPLETED
@@ -5992,15 +6636,23 @@ type UrlRedirectConnection {
5992
6636
  pageInfo: PageInfo!
5993
6637
  }
5994
6638
 
5995
- """User-facing error from mutations"""
6639
+ """
6640
+ A validation or business error returned alongside a mutation result. Surfaced as `userErrors[]`; the cart/order itself is null when the mutation could not be applied. Always branch on `code` for UI behaviour — `message` is translated and locale-dependent.
6641
+ """
5996
6642
  type UserError {
5997
- """Error code"""
6643
+ """
6644
+ Stable machine-readable code (e.g. `CART_NOT_FOUND`, `NOT_ENOUGH_IN_STOCK`, `INVALID_DISCOUNT_CODE`). The list of possible codes is defined per mutation by `CartErrorCode`, `CustomerErrorCode`, `PaymentErrorCode`, etc.
6645
+ """
5998
6646
  code: String
5999
6647
 
6000
- """Path to field that caused error"""
6648
+ """
6649
+ Path of the input field that caused the error (e.g. `["input", "lines", 0, "quantity"]`). Use to highlight the offending control in a form.
6650
+ """
6001
6651
  field: [String!]
6002
6652
 
6003
- """Error message"""
6653
+ """
6654
+ Human-readable error message localised to the request locale (e.g. `Accept-Language`). For display only.
6655
+ """
6004
6656
  message: String!
6005
6657
  }
6006
6658
 
@@ -6013,16 +6665,18 @@ input VariantOptionFilter {
6013
6665
  value: String!
6014
6666
  }
6015
6667
 
6016
- """Weight value with unit"""
6668
+ """A weight value paired with its unit."""
6017
6669
  type Weight {
6018
- """Weight unit"""
6670
+ """Unit of the weight (GRAMS, KILOGRAMS, OUNCES or POUNDS)."""
6019
6671
  unit: WeightUnit!
6020
6672
 
6021
- """Weight value"""
6673
+ """Weight magnitude, interpreted according to `unit`."""
6022
6674
  value: Float!
6023
6675
  }
6024
6676
 
6025
- """Weight unit (GRAMS canonical, KILOGRAMS/OUNCES/POUNDS for display)"""
6677
+ """
6678
+ Weight unit. GRAMS is the canonical storage unit; KILOGRAMS / OUNCES / POUNDS are display variants for shipping and checkout UI.
6679
+ """
6026
6680
  enum WeightUnit {
6027
6681
  GRAMS
6028
6682
  KILOGRAMS