@doswiftly/storefront-operations 5.5.0 → 6.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
@@ -3,9 +3,29 @@
3
3
  # ------------------------------------------------------
4
4
 
5
5
  """
6
- Sets contextual hints on an operation (Shopify Storefront API parity). Currently supports preferredLocationId; country/language/buyer will follow.
6
+ Sets contextual hints on an operation country, language, currency, buyer, preferredLocationId. Resolution priority: directive > request header > cookie > auto-detect > shop default.
7
7
  """
8
8
  directive @inContext(
9
+ """
10
+ B2B / impersonation buyer context. Use for explicit auth (admin acting as customer) or company-location catalog scoping. Browser storefronts should prefer cookie / Bearer header.
11
+ """
12
+ buyer: BuyerInput
13
+
14
+ """
15
+ ISO 3166-1 alpha-2 country code (e.g. "PL", "DE"). Drives Markets pricing / shipping availability. Validated against shop config — unknown codes silently fall through to next priority layer.
16
+ """
17
+ country: String
18
+
19
+ """
20
+ ISO 4217 currency code (e.g. "EUR", "USD"). Constrained to `shop.supportedCurrencies` — unsupported codes silently fall through. Typically inferred from `country` via Markets.
21
+ """
22
+ currency: String
23
+
24
+ """
25
+ ISO 639-1 language code (e.g. "pl", "en"). Constrained to `shop.supportedLanguages` — unsupported codes silently fall through. Avoids `Accept-Language` ambiguity for SSR / Edge.
26
+ """
27
+ language: String
28
+
9
29
  """
10
30
  Biases field resolvers (e.g. storeAvailability) toward this location. Must reference an active InventoryLocation in the current shop — invalid / inactive IDs are silently ignored by resolvers.
11
31
  """
@@ -135,7 +155,7 @@ input AttributeInput {
135
155
  }
136
156
 
137
157
  """
138
- Surcharge calculation: FIXED (minor units) or PERCENT (thousandths of percent — Faza 2)
158
+ Surcharge calculation: FIXED (minor units) or PERCENT (thousandths of percent)
139
159
  """
140
160
  enum AttributeOptionSurchargeType {
141
161
  FIXED
@@ -242,8 +262,10 @@ enum AttributeType {
242
262
 
243
263
  """Available filters for product listing"""
244
264
  type AvailableFilters {
245
- """Number of currently active filters"""
246
- activeFilterCount: Int!
265
+ """
266
+ Number of currently active filters (renamed from activeFilterCount in Storefront 5.0)
267
+ """
268
+ activeCount: Int!
247
269
 
248
270
  """Filterable attributes with values"""
249
271
  attributes: [AttributeDefinition!]!
@@ -251,11 +273,13 @@ type AvailableFilters {
251
273
  """Categories available for filtering"""
252
274
  categories: [CategoryFilterOption!]
253
275
 
276
+ """
277
+ Total products matching current context, before filters (renamed from totalProducts in Storefront 5.0)
278
+ """
279
+ matchCount: Int!
280
+
254
281
  """Price range for filtering"""
255
282
  priceRange: PriceRange
256
-
257
- """Total products matching current context (before filters)"""
258
- totalProducts: Int!
259
283
  }
260
284
 
261
285
  """Context for available filters query"""
@@ -326,12 +350,12 @@ type AvailableShippingMethodsPayload {
326
350
 
327
351
  """Live carrier shipping rates payload"""
328
352
  type AvailableShippingRatesPayload {
329
- """Whether the result was served from cache"""
330
- cached: Boolean!
331
-
332
353
  """Providers that failed to return rates"""
333
354
  errors: [CarrierRateError!]!
334
355
 
356
+ """Whether the result was served from cache"""
357
+ isCached: Boolean!
358
+
335
359
  """Available rates sorted by price"""
336
360
  rates: [CarrierShippingRate!]!
337
361
  }
@@ -431,11 +455,11 @@ type BlogPost {
431
455
  """Full content (HTML)"""
432
456
  content: String!
433
457
 
434
- """Content type (html or markdown)"""
435
- contentType: String!
458
+ """Format of stored content (HTML or MARKDOWN)"""
459
+ contentFormat: ContentFormat!
436
460
 
437
461
  """Created date (ISO 8601)"""
438
- createdAt: String!
462
+ createdAt: DateTime!
439
463
 
440
464
  """Short excerpt/summary"""
441
465
  excerpt: String
@@ -450,10 +474,10 @@ type BlogPost {
450
474
  isFeatured: Boolean!
451
475
 
452
476
  """Published date (ISO 8601)"""
453
- publishedAt: String
477
+ publishedAt: DateTime
454
478
 
455
479
  """Estimated reading time in minutes"""
456
- readingTime: Int!
480
+ readingTimeMinutes: Int!
457
481
 
458
482
  """SEO metadata"""
459
483
  seo: SEO
@@ -471,7 +495,7 @@ type BlogPost {
471
495
  title: String!
472
496
 
473
497
  """Updated date (ISO 8601)"""
474
- updatedAt: String!
498
+ updatedAt: DateTime!
475
499
 
476
500
  """View count"""
477
501
  viewCount: Int!
@@ -553,6 +577,42 @@ type BotProtectionProviderInfo {
553
577
  siteKey: String!
554
578
  }
555
579
 
580
+ """Shop brand metadata (logo, colors, slogan)"""
581
+ type Brand {
582
+ """Primary + secondary brand colors"""
583
+ colors: BrandColors
584
+
585
+ """Cover image / hero banner"""
586
+ coverImage: Image
587
+
588
+ """Primary logo"""
589
+ logo: Image
590
+
591
+ """Short brand description"""
592
+ shortDescription: String
593
+
594
+ """Marketing slogan / tagline"""
595
+ slogan: String
596
+
597
+ """Square logo variant (favicons, app tiles)"""
598
+ squareLogo: Image
599
+ }
600
+
601
+ """Single brand color group (background + foreground hex)"""
602
+ type BrandColorGroup {
603
+ """Background color (hex, e.g. "#0F172A")"""
604
+ background: String
605
+
606
+ """Foreground/text color (hex)"""
607
+ foreground: String
608
+ }
609
+
610
+ """Pair of brand color groups (primary + secondary)"""
611
+ type BrandColors {
612
+ primary: BrandColorGroup
613
+ secondary: BrandColorGroup
614
+ }
615
+
556
616
  """Business hours for a day"""
557
617
  type BusinessHour {
558
618
  """Closing time (HH:MM format)"""
@@ -601,6 +661,19 @@ type BusinessHoursWindow {
601
661
  openHour: Int!
602
662
  }
603
663
 
664
+ """
665
+ Buyer context for `@inContext` — supports B2B impersonation and company-scoped catalog.
666
+ """
667
+ input BuyerInput {
668
+ """B2B company location ID (planned — multi-location buyer scoping)."""
669
+ companyLocationId: ID
670
+
671
+ """
672
+ Customer JWT for explicit auth context (mobile / server-to-server / admin impersonation). For browser storefronts prefer the httpOnly `customerAccessToken` cookie or `Authorization: Bearer` header — directive args are propagated through query logs.
673
+ """
674
+ customerAccessToken: String
675
+ }
676
+
604
677
  """Provider error when fetching rates"""
605
678
  type CarrierRateError {
606
679
  """Error message"""
@@ -612,14 +685,14 @@ type CarrierRateError {
612
685
 
613
686
  """Live shipping rate from a carrier"""
614
687
  type CarrierShippingRate {
615
- """Whether cash on delivery is available"""
616
- cashOnDeliveryAvailable: Boolean!
617
-
618
688
  """Estimated delivery in business days"""
619
689
  estimatedDeliveryDays: Int!
620
690
 
691
+ """Whether cash on delivery is available"""
692
+ isCashOnDeliveryAvailable: Boolean!
693
+
621
694
  """Whether pickup is available for this service"""
622
- pickupAvailable: Boolean!
695
+ isPickupAvailable: Boolean!
623
696
 
624
697
  """Rate price"""
625
698
  price: Money!
@@ -635,7 +708,7 @@ type CarrierShippingRate {
635
708
  }
636
709
 
637
710
  """Shopping cart"""
638
- type Cart {
711
+ type Cart implements Node {
639
712
  """Cart attributes"""
640
713
  attributes: [CartAttribute!]!
641
714
 
@@ -643,7 +716,7 @@ type Cart {
643
716
  buyerIdentity: CartBuyerIdentity
644
717
 
645
718
  """Checkout URL"""
646
- checkoutUrl: String
719
+ checkoutUrl: URL
647
720
 
648
721
  """Cost breakdown"""
649
722
  cost: CartCost!
@@ -660,8 +733,8 @@ type Cart {
660
733
  """Unique cart identifier"""
661
734
  id: ID!
662
735
 
663
- """Cart line items"""
664
- lines(first: Float = 100): [CartLine!]!
736
+ """Cart line items (Relay Connection)"""
737
+ lines(after: String, before: String, first: Float, last: Float): CartLineConnection!
665
738
 
666
739
  """Cart note"""
667
740
  note: String
@@ -676,6 +749,34 @@ type Cart {
676
749
  updatedAt: DateTime!
677
750
  }
678
751
 
752
+ """Result of adding lines to cart"""
753
+ type CartAddLinesPayload {
754
+ """Updated cart"""
755
+ cart: Cart
756
+
757
+ """
758
+ User errors (code is namespaced — e.g. CART_NOT_FOUND, CART_LINE_NOT_FOUND)
759
+ """
760
+ userErrors: [UserError!]!
761
+
762
+ """Non-fatal warnings"""
763
+ warnings: [CartWarning!]!
764
+ }
765
+
766
+ """Result of applying discount codes"""
767
+ type CartApplyDiscountCodesPayload {
768
+ """Updated cart"""
769
+ cart: Cart
770
+
771
+ """
772
+ User errors (code is namespaced — e.g. CART_NOT_FOUND, CART_LINE_NOT_FOUND)
773
+ """
774
+ userErrors: [UserError!]!
775
+
776
+ """Non-fatal warnings"""
777
+ warnings: [CartWarning!]!
778
+ }
779
+
679
780
  """Cart line attribute"""
680
781
  type CartAttribute {
681
782
  """Attribute key"""
@@ -694,19 +795,10 @@ input CartAttributeInput {
694
795
  value: String
695
796
  }
696
797
 
697
- """Result of updating cart attributes"""
698
- type CartAttributesUpdatePayload {
699
- """Updated cart"""
700
- cart: Cart
701
-
702
- """User errors"""
703
- userErrors: [UserError!]!
704
- }
705
-
706
798
  """Buyer identity information"""
707
799
  type CartBuyerIdentity {
708
- """Country code (ISO 3166-1 alpha-2)"""
709
- countryCode: String
800
+ """ISO 3166-1 alpha-2 country code"""
801
+ countryCode: CountryCode
710
802
 
711
803
  """Customer ID"""
712
804
  customerId: ID
@@ -714,14 +806,17 @@ type CartBuyerIdentity {
714
806
  """Customer email"""
715
807
  email: String
716
808
 
809
+ """ISO 639-1 preferred language code"""
810
+ languageCode: LanguageCode
811
+
717
812
  """Customer phone"""
718
813
  phone: String
719
814
  }
720
815
 
721
816
  """Input for buyer identity"""
722
817
  input CartBuyerIdentityInput {
723
- """Country code (ISO 3166-1 alpha-2)"""
724
- countryCode: String
818
+ """ISO 3166-1 alpha-2 country code"""
819
+ countryCode: CountryCode
725
820
 
726
821
  """Customer ID"""
727
822
  customerId: ID
@@ -729,35 +824,44 @@ input CartBuyerIdentityInput {
729
824
  """Customer email"""
730
825
  email: String
731
826
 
827
+ """ISO 639-1 preferred language code"""
828
+ languageCode: LanguageCode
829
+
732
830
  """Customer phone"""
733
831
  phone: String
734
832
  }
735
833
 
736
- """Result of updating buyer identity"""
737
- type CartBuyerIdentityUpdatePayload {
738
- """Updated cart"""
739
- cart: Cart
740
-
741
- """User errors"""
742
- userErrors: [UserError!]!
743
- }
744
-
745
834
  """Cart cost breakdown"""
746
835
  type CartCost {
747
- """Checkout charge amount"""
748
- checkoutChargeAmount: PriceMoney
836
+ """Checkout charge amount."""
837
+ checkoutCharge: Money
749
838
 
750
- """Subtotal before taxes and shipping (in customer currency)"""
751
- subtotalAmount: PriceMoney!
839
+ """Opt-in: checkoutCharge with conversion transparency."""
840
+ checkoutChargeWithConversion: PriceMoney
752
841
 
753
- """Total amount including taxes (in customer currency)"""
754
- totalAmount: PriceMoney!
842
+ """Subtotal before taxes and shipping. Default field."""
843
+ subtotal: Money!
755
844
 
756
- """Total duty amount"""
757
- totalDutyAmount: PriceMoney
845
+ """Opt-in: subtotal with full conversion transparency."""
846
+ subtotalWithConversion: PriceMoney
758
847
 
759
- """Total tax amount"""
760
- totalTaxAmount: PriceMoney
848
+ """Total amount including taxes."""
849
+ total: Money!
850
+
851
+ """Total duty amount."""
852
+ totalDuty: Money
853
+
854
+ """Opt-in: totalDuty with conversion transparency."""
855
+ totalDutyWithConversion: PriceMoney
856
+
857
+ """Total tax amount."""
858
+ totalTax: Money
859
+
860
+ """Opt-in: totalTax with conversion transparency."""
861
+ totalTaxWithConversion: PriceMoney
862
+
863
+ """Opt-in: total with conversion transparency."""
864
+ totalWithConversion: PriceMoney
761
865
  }
762
866
 
763
867
  """Input for creating a cart"""
@@ -783,8 +887,13 @@ type CartCreatePayload {
783
887
  """Created cart"""
784
888
  cart: Cart
785
889
 
786
- """User errors"""
890
+ """
891
+ User errors (code is namespaced — e.g. CART_NOT_FOUND, CART_LINE_NOT_FOUND)
892
+ """
787
893
  userErrors: [UserError!]!
894
+
895
+ """Non-fatal warnings"""
896
+ warnings: [CartWarning!]!
788
897
  }
789
898
 
790
899
  """Discount allocation showing how discount is applied"""
@@ -798,32 +907,19 @@ type CartDiscountAllocation {
798
907
 
799
908
  """Discount code applied to cart"""
800
909
  type CartDiscountCode {
801
- """Whether the code is applicable"""
802
- applicable: Boolean!
803
-
804
910
  """Discount code string"""
805
911
  code: String!
806
- }
807
-
808
- """Result of updating discount codes"""
809
- type CartDiscountCodesUpdatePayload {
810
- """Updated cart"""
811
- cart: Cart
812
912
 
813
- """User errors"""
814
- userErrors: [UserError!]!
913
+ """Whether the code is applicable"""
914
+ isApplicable: Boolean!
815
915
  }
816
916
 
817
917
  """Single line item in the cart"""
818
918
  type CartLine {
819
- """
820
- Typed customer-filled attribute selections (Faza 1 R5 — surcharge + tax snapshot)
821
- """
919
+ """Typed customer-filled attribute selections (surcharge + tax snapshot)"""
822
920
  attributeSelections: [AttributeSelection!]!
823
921
 
824
- """
825
- Shopify-compatible Line Item Properties — raw key/value pairs (e.g., gift wrap, engraving)
826
- """
922
+ """Line Item Properties — raw key/value pairs"""
827
923
  attributes: [Attribute!]!
828
924
 
829
925
  """Cost information for this line"""
@@ -832,9 +928,6 @@ type CartLine {
832
928
  """Unique line identifier"""
833
929
  id: ID!
834
930
 
835
- """Product variant being purchased"""
836
- merchandise: ProductVariant!
837
-
838
931
  """Parent product handle (slug)"""
839
932
  productHandle: String
840
933
 
@@ -849,21 +942,60 @@ type CartLine {
849
942
 
850
943
  """Quantity of this item"""
851
944
  quantity: Int!
945
+
946
+ """Product variant being purchased"""
947
+ variant: ProductVariant!
948
+ }
949
+
950
+ """Paginated cart lines"""
951
+ type CartLineConnection {
952
+ """Cart line edges with cursors"""
953
+ edges: [CartLineEdge!]!
954
+
955
+ """Cart line nodes (shortcut for edges.map(e => e.node))"""
956
+ nodes: [CartLine!]!
957
+
958
+ """Pagination info"""
959
+ pageInfo: PageInfo!
960
+
961
+ """Total count of cart lines"""
962
+ totalCount: Int!
852
963
  }
853
964
 
854
965
  """Cost information for a single cart line"""
855
966
  type CartLineCost {
856
- """Amount per quantity (in customer currency)"""
857
- amountPerQuantity: PriceMoney!
967
+ """Compare-at price per unit if discounted."""
968
+ compareAtPricePerUnit: Money
858
969
 
859
- """Original price per quantity if discounted"""
860
- compareAtAmountPerQuantity: PriceMoney
970
+ """Opt-in: compareAtPricePerUnit with conversion transparency."""
971
+ compareAtPricePerUnitWithConversion: PriceMoney
861
972
 
862
- """Subtotal before discounts (in customer currency)"""
863
- subtotalAmount: PriceMoney!
973
+ """Price per unit. Default field — shop base currency."""
974
+ pricePerUnit: Money!
864
975
 
865
- """Total after discounts (in customer currency)"""
866
- totalAmount: PriceMoney!
976
+ """Opt-in: pricePerUnit with conversion transparency."""
977
+ pricePerUnitWithConversion: PriceMoney
978
+
979
+ """Subtotal before discounts."""
980
+ subtotal: Money!
981
+
982
+ """Opt-in: subtotal with conversion transparency."""
983
+ subtotalWithConversion: PriceMoney
984
+
985
+ """Total after discounts."""
986
+ total: Money!
987
+
988
+ """Opt-in: total with conversion transparency."""
989
+ totalWithConversion: PriceMoney
990
+ }
991
+
992
+ """Edge in a CartLine connection"""
993
+ type CartLineEdge {
994
+ """Cursor for pagination"""
995
+ cursor: String!
996
+
997
+ """Cart line node"""
998
+ node: CartLine!
867
999
  }
868
1000
 
869
1001
  """Input for adding a line to cart"""
@@ -871,14 +1003,14 @@ input CartLineInput {
871
1003
  """Customer-filled AttributeDefinition selections (Faza 1 R5)"""
872
1004
  attributeSelections: [AttributeSelectionInput!]
873
1005
 
874
- """Line attributes (Shopify Line Item Properties)"""
1006
+ """Line attributes (Line Item Properties)"""
875
1007
  attributes: [AttributeInput!]
876
1008
 
877
- """Product variant ID"""
878
- merchandiseId: ID!
879
-
880
1009
  """Quantity to add"""
881
1010
  quantity: Int! = 1
1011
+
1012
+ """Product variant ID"""
1013
+ variantId: ID!
882
1014
  }
883
1015
 
884
1016
  """Input for updating a cart line"""
@@ -888,7 +1020,7 @@ input CartLineUpdateInput {
888
1020
  """
889
1021
  attributeSelections: [AttributeSelectionInput!]
890
1022
 
891
- """Updated Shopify Line Item Properties (null preserves)"""
1023
+ """Updated Line Item Properties (null preserves)"""
892
1024
  attributes: [AttributeInput!]
893
1025
 
894
1026
  """Cart line ID to update"""
@@ -898,61 +1030,114 @@ input CartLineUpdateInput {
898
1030
  quantity: Int!
899
1031
  }
900
1032
 
901
- """Result of adding lines to cart"""
902
- type CartLinesAddPayload {
1033
+ """Recommendations based on cart contents"""
1034
+ type CartRecommendations {
1035
+ """Products frequently bought together with cart items"""
1036
+ frequentlyBoughtTogether: [ProductRecommendation!]!
1037
+
1038
+ """Products to consider adding"""
1039
+ youMayAlsoLike: [ProductRecommendation!]!
1040
+ }
1041
+
1042
+ """Result of removing cart lines"""
1043
+ type CartRemoveLinesPayload {
903
1044
  """Updated cart"""
904
1045
  cart: Cart
905
1046
 
906
- """User errors"""
1047
+ """
1048
+ User errors (code is namespaced — e.g. CART_NOT_FOUND, CART_LINE_NOT_FOUND)
1049
+ """
907
1050
  userErrors: [UserError!]!
1051
+
1052
+ """Non-fatal warnings"""
1053
+ warnings: [CartWarning!]!
908
1054
  }
909
1055
 
910
- """Result of removing cart lines"""
911
- type CartLinesRemovePayload {
1056
+ """Cart data for shipping calculation"""
1057
+ input CartShippingInput {
1058
+ """Currency code (ISO 4217)"""
1059
+ currencyCode: String
1060
+
1061
+ """Cart subtotal in cents"""
1062
+ subtotal: Int
1063
+
1064
+ """Total weight in grams"""
1065
+ totalWeight: Int
1066
+ }
1067
+
1068
+ """Result of updating cart attributes"""
1069
+ type CartUpdateAttributesPayload {
912
1070
  """Updated cart"""
913
1071
  cart: Cart
914
1072
 
915
- """User errors"""
1073
+ """
1074
+ User errors (code is namespaced — e.g. CART_NOT_FOUND, CART_LINE_NOT_FOUND)
1075
+ """
916
1076
  userErrors: [UserError!]!
1077
+
1078
+ """Non-fatal warnings"""
1079
+ warnings: [CartWarning!]!
917
1080
  }
918
1081
 
919
- """Result of updating cart lines"""
920
- type CartLinesUpdatePayload {
1082
+ """Result of updating buyer identity"""
1083
+ type CartUpdateBuyerIdentityPayload {
921
1084
  """Updated cart"""
922
1085
  cart: Cart
923
1086
 
924
- """User errors"""
1087
+ """
1088
+ User errors (code is namespaced — e.g. CART_NOT_FOUND, CART_LINE_NOT_FOUND)
1089
+ """
925
1090
  userErrors: [UserError!]!
1091
+
1092
+ """Non-fatal warnings"""
1093
+ warnings: [CartWarning!]!
926
1094
  }
927
1095
 
928
- """Result of updating cart note"""
929
- type CartNoteUpdatePayload {
1096
+ """Result of updating cart lines"""
1097
+ type CartUpdateLinesPayload {
930
1098
  """Updated cart"""
931
1099
  cart: Cart
932
1100
 
933
- """User errors"""
1101
+ """
1102
+ User errors (code is namespaced — e.g. CART_NOT_FOUND, CART_LINE_NOT_FOUND)
1103
+ """
934
1104
  userErrors: [UserError!]!
1105
+
1106
+ """Non-fatal warnings"""
1107
+ warnings: [CartWarning!]!
935
1108
  }
936
1109
 
937
- """Recommendations based on cart contents"""
938
- type CartRecommendations {
939
- """Products frequently bought together with cart items"""
940
- frequentlyBoughtTogether: [ProductRecommendation!]!
1110
+ """Result of updating cart note"""
1111
+ type CartUpdateNotePayload {
1112
+ """Updated cart"""
1113
+ cart: Cart
941
1114
 
942
- """Products to consider adding"""
943
- youMayAlsoLike: [ProductRecommendation!]!
1115
+ """
1116
+ User errors (code is namespaced — e.g. CART_NOT_FOUND, CART_LINE_NOT_FOUND)
1117
+ """
1118
+ userErrors: [UserError!]!
1119
+
1120
+ """Non-fatal warnings"""
1121
+ warnings: [CartWarning!]!
944
1122
  }
945
1123
 
946
- """Cart data for shipping calculation"""
947
- input CartShippingInput {
948
- """Currency code (ISO 4217)"""
949
- currencyCode: String
1124
+ """Cart warning (non-fatal advisory)"""
1125
+ type CartWarning {
1126
+ """Typed warning code"""
1127
+ code: CartWarningCode!
950
1128
 
951
- """Cart subtotal in cents"""
952
- subtotal: Int
1129
+ """Warning message"""
1130
+ message: String!
953
1131
 
954
- """Total weight in grams"""
955
- totalWeight: Int
1132
+ """Target identifier (cart line ID lub field path)"""
1133
+ target: String!
1134
+ }
1135
+
1136
+ """Non-fatal cart warnings"""
1137
+ enum CartWarningCode {
1138
+ MERCHANDISE_NOT_AVAILABLE
1139
+ MERCHANDISE_NOT_ENOUGH_STOCK
1140
+ PAYMENTS_AMOUNT_REGION_MISMATCH
956
1141
  }
957
1142
 
958
1143
  """Product category - hierarchical organization"""
@@ -1018,6 +1203,12 @@ type CategoryEdge {
1018
1203
  node: Category!
1019
1204
  }
1020
1205
 
1206
+ """Category filter"""
1207
+ input CategoryFilter {
1208
+ """Category ID"""
1209
+ id: ID
1210
+ }
1211
+
1021
1212
  """Category filter option"""
1022
1213
  type CategoryFilterOption {
1023
1214
  """Category ID"""
@@ -1062,12 +1253,12 @@ type Checkout {
1062
1253
  """Billing address"""
1063
1254
  billingAddress: MailingAddress
1064
1255
 
1065
- """Whether checkout is completed"""
1066
- completed: Boolean!
1067
-
1068
1256
  """Completed order ID"""
1069
1257
  completedOrderId: String
1070
1258
 
1259
+ """Cost breakdown (subtotal/total/totalTax/totalShipping/totalDiscounts)"""
1260
+ cost: CheckoutCost!
1261
+
1071
1262
  """Created at"""
1072
1263
  createdAt: DateTime!
1073
1264
 
@@ -1089,6 +1280,12 @@ type Checkout {
1089
1280
  """Checkout ID"""
1090
1281
  id: ID!
1091
1282
 
1283
+ """Whether checkout is completed"""
1284
+ isCompleted: Boolean!
1285
+
1286
+ """Whether checkout is ready for payment"""
1287
+ isReady: Boolean!
1288
+
1092
1289
  """Line items"""
1093
1290
  lineItems: [CheckoutLineItem!]!
1094
1291
 
@@ -1101,9 +1298,6 @@ type Checkout {
1101
1298
  """Customer phone"""
1102
1299
  phone: String
1103
1300
 
1104
- """Whether checkout is ready for payment"""
1105
- ready: Boolean!
1106
-
1107
1301
  """Selected payment method ID (Requirements: R23.5)"""
1108
1302
  selectedPaymentMethodId: ID
1109
1303
 
@@ -1116,30 +1310,15 @@ type Checkout {
1116
1310
  """Whether shipping rates are ready"""
1117
1311
  shippingRatesReady: Boolean!
1118
1312
 
1119
- """Subtotal before discounts and taxes"""
1120
- subtotalPrice: Money!
1121
-
1122
1313
  """Tax breakdown"""
1123
1314
  taxLines: [TaxLine!]!
1124
1315
 
1125
- """Total discount amount"""
1126
- totalDiscounts: Money!
1127
-
1128
1316
  """Total amount covered by gift cards"""
1129
1317
  totalGiftCardAmount: Money!
1130
1318
 
1131
- """Total price"""
1132
- totalPrice: Money!
1133
-
1134
1319
  """Total quantity"""
1135
1320
  totalQuantity: Float!
1136
1321
 
1137
- """Total shipping price"""
1138
- totalShippingPrice: Money!
1139
-
1140
- """Total tax amount"""
1141
- totalTax: Money!
1142
-
1143
1322
  """Updated at"""
1144
1323
  updatedAt: DateTime!
1145
1324
 
@@ -1149,20 +1328,14 @@ type Checkout {
1149
1328
 
1150
1329
  """Mailing address input"""
1151
1330
  input CheckoutAddressInput {
1152
- """Address line 1"""
1153
- address1: String!
1154
-
1155
- """Address line 2"""
1156
- address2: String
1157
-
1158
1331
  """City"""
1159
1332
  city: String!
1160
1333
 
1161
1334
  """Company name"""
1162
1335
  company: String
1163
1336
 
1164
- """Country code (ISO)"""
1165
- country: String!
1337
+ """ISO 3166-1 alpha-2 country code"""
1338
+ country: CountryCode!
1166
1339
 
1167
1340
  """First name"""
1168
1341
  firstName: String
@@ -1173,20 +1346,39 @@ input CheckoutAddressInput {
1173
1346
  """Phone number"""
1174
1347
  phone: String
1175
1348
 
1176
- """Province/State"""
1177
- province: String
1349
+ """Postal / ZIP code"""
1350
+ postalCode: String!
1351
+
1352
+ """State / province"""
1353
+ state: String
1354
+
1355
+ """First line of street address"""
1356
+ streetLine1: String!
1178
1357
 
1179
- """ZIP/Postal code"""
1180
- zip: String!
1358
+ """Second line of street address"""
1359
+ streetLine2: String
1181
1360
  }
1182
1361
 
1183
- """Checkout billing address update payload"""
1184
- type CheckoutBillingAddressUpdatePayload {
1362
+ """Checkout discount code apply payload"""
1363
+ type CheckoutApplyDiscountCodePayload {
1185
1364
  """Updated checkout"""
1186
1365
  checkout: Checkout
1187
1366
 
1188
- """User errors"""
1189
- userErrors: [CheckoutUserError!]!
1367
+ """
1368
+ User errors (code is namespaced — e.g. CHECKOUT_NOT_FOUND, CHECKOUT_PAYMENT_FAILED)
1369
+ """
1370
+ userErrors: [UserError!]!
1371
+ }
1372
+
1373
+ """Checkout gift card apply payload"""
1374
+ type CheckoutApplyGiftCardPayload {
1375
+ """Updated checkout"""
1376
+ checkout: Checkout
1377
+
1378
+ """
1379
+ User errors (code is namespaced — e.g. CHECKOUT_NOT_FOUND, CHECKOUT_PAYMENT_FAILED)
1380
+ """
1381
+ userErrors: [UserError!]!
1190
1382
  }
1191
1383
 
1192
1384
  """Checkout complete input"""
@@ -1209,8 +1401,28 @@ type CheckoutCompletePayload {
1209
1401
  """Payment redirect URL (if payment required)"""
1210
1402
  paymentUrl: String
1211
1403
 
1212
- """User errors"""
1213
- userErrors: [CheckoutUserError!]!
1404
+ """
1405
+ User errors (code is namespaced — e.g. CHECKOUT_NOT_FOUND, CHECKOUT_PAYMENT_FAILED)
1406
+ """
1407
+ userErrors: [UserError!]!
1408
+ }
1409
+
1410
+ """Checkout cost breakdown"""
1411
+ type CheckoutCost {
1412
+ """Subtotal before discounts and taxes"""
1413
+ subtotal: Money!
1414
+
1415
+ """Total amount (after discounts, including taxes and shipping)"""
1416
+ total: Money!
1417
+
1418
+ """Total discount amount"""
1419
+ totalDiscounts: Money!
1420
+
1421
+ """Total shipping cost"""
1422
+ totalShipping: Money!
1423
+
1424
+ """Total tax amount"""
1425
+ totalTax: Money!
1214
1426
  }
1215
1427
 
1216
1428
  """Checkout create input"""
@@ -1239,80 +1451,10 @@ type CheckoutCreatePayload {
1239
1451
  """Created checkout"""
1240
1452
  checkout: Checkout
1241
1453
 
1242
- """User errors"""
1243
- userErrors: [CheckoutUserError!]!
1244
- }
1245
-
1246
- """Checkout discount code apply payload"""
1247
- type CheckoutDiscountCodeApplyPayload {
1248
- """Updated checkout"""
1249
- checkout: Checkout
1250
-
1251
- """User errors"""
1252
- userErrors: [CheckoutUserError!]!
1253
- }
1254
-
1255
- """Checkout discount code remove payload"""
1256
- type CheckoutDiscountCodeRemovePayload {
1257
- """Updated checkout"""
1258
- checkout: Checkout
1259
-
1260
- """User errors"""
1261
- userErrors: [CheckoutUserError!]!
1262
- }
1263
-
1264
- """Checkout discount code validation result"""
1265
- type CheckoutDiscountCodeValidatePayload {
1266
- """Validation result"""
1267
- result: DiscountValidationResult!
1268
-
1269
- """User errors (for checkout-level issues)"""
1270
- userErrors: [CheckoutUserError!]!
1271
- }
1272
-
1273
- """Checkout email update payload"""
1274
- type CheckoutEmailUpdatePayload {
1275
- """Updated checkout"""
1276
- checkout: Checkout
1277
-
1278
- """User errors"""
1279
- userErrors: [CheckoutUserError!]!
1280
- }
1281
-
1282
- """Checkout error codes"""
1283
- enum CheckoutErrorCode {
1284
- ALREADY_COMPLETED
1285
- BLANK
1286
- CART_NOT_FOUND
1287
- CHECKOUT_NOT_FOUND
1288
- CUSTOMER_ALREADY_USED_ONCE_PER_CUSTOMER_DISCOUNT_NOTICE
1289
- DISCOUNT_DISABLED
1290
- DISCOUNT_LIMIT_REACHED
1291
- DISCOUNT_NOT_FOUND
1292
- EMPTY_CART
1293
- GIFT_CARD_DEPLETED
1294
- GIFT_CARD_DISABLED
1295
- GIFT_CARD_EXPIRED
1296
- GIFT_CARD_NOT_FOUND
1297
- GIFT_CARD_UNUSABLE
1298
- INVALID
1299
- INVALID_PAYMENT_METHOD
1300
- INVALID_SHIPPING_ADDRESS
1301
- LINE_ITEM_NOT_FOUND
1302
- MISSING_SHIPPING_METHOD
1303
- NOT_ENOUGH_IN_STOCK
1304
- NO_PAYMENT_METHODS
1305
- SHIPPING_RATE_EXPIRED
1306
- TOO_LONG
1307
- }
1308
-
1309
- """Checkout gift card apply payload"""
1310
- type CheckoutGiftCardApplyPayload {
1311
- """Updated checkout"""
1312
- checkout: Checkout
1313
-
1314
- """User errors"""
1315
- userErrors: [CheckoutUserError!]!
1454
+ """
1455
+ User errors (code is namespaced — e.g. CHECKOUT_NOT_FOUND, CHECKOUT_PAYMENT_FAILED)
1456
+ """
1457
+ userErrors: [UserError!]!
1316
1458
  }
1317
1459
 
1318
1460
  """Gift card recipient input"""
@@ -1333,24 +1475,6 @@ input CheckoutGiftCardRecipientInput {
1333
1475
  recipientName: String
1334
1476
  }
1335
1477
 
1336
- """Checkout gift card recipient update payload"""
1337
- type CheckoutGiftCardRecipientUpdatePayload {
1338
- """Updated checkout"""
1339
- checkout: Checkout
1340
-
1341
- """User errors"""
1342
- userErrors: [CheckoutUserError!]!
1343
- }
1344
-
1345
- """Checkout gift card remove payload"""
1346
- type CheckoutGiftCardRemovePayload {
1347
- """Updated checkout"""
1348
- checkout: Checkout
1349
-
1350
- """User errors"""
1351
- userErrors: [CheckoutUserError!]!
1352
- }
1353
-
1354
1478
  """Checkout line item"""
1355
1479
  type CheckoutLineItem {
1356
1480
  """Line item ID"""
@@ -1359,6 +1483,9 @@ type CheckoutLineItem {
1359
1483
  """Product image"""
1360
1484
  image: Image
1361
1485
 
1486
+ """Price per unit"""
1487
+ pricePerUnit: Money!
1488
+
1362
1489
  """Product ID"""
1363
1490
  productId: String
1364
1491
 
@@ -1371,11 +1498,8 @@ type CheckoutLineItem {
1371
1498
  """Product title"""
1372
1499
  title: String!
1373
1500
 
1374
- """Total price"""
1375
- totalPrice: Money!
1376
-
1377
- """Unit price"""
1378
- unitPrice: Money!
1501
+ """Total price for this line"""
1502
+ total: Money!
1379
1503
 
1380
1504
  """Product variant"""
1381
1505
  variant: ProductVariant
@@ -1396,47 +1520,107 @@ input CheckoutLineItemInput {
1396
1520
  variantId: ID!
1397
1521
  }
1398
1522
 
1399
- """Checkout payment method update payload"""
1400
- type CheckoutPaymentMethodUpdatePayload {
1523
+ """Checkout discount code remove payload"""
1524
+ type CheckoutRemoveDiscountCodePayload {
1401
1525
  """Updated checkout"""
1402
1526
  checkout: Checkout
1403
1527
 
1404
- """User errors"""
1405
- userErrors: [CheckoutUserError!]!
1528
+ """
1529
+ User errors (code is namespaced — e.g. CHECKOUT_NOT_FOUND, CHECKOUT_PAYMENT_FAILED)
1530
+ """
1531
+ userErrors: [UserError!]!
1406
1532
  }
1407
1533
 
1408
- """Checkout shipping address update payload"""
1409
- type CheckoutShippingAddressUpdatePayload {
1534
+ """Checkout gift card remove payload"""
1535
+ type CheckoutRemoveGiftCardPayload {
1410
1536
  """Updated checkout"""
1411
1537
  checkout: Checkout
1412
1538
 
1413
- """User errors"""
1414
- userErrors: [CheckoutUserError!]!
1539
+ """
1540
+ User errors (code is namespaced — e.g. CHECKOUT_NOT_FOUND, CHECKOUT_PAYMENT_FAILED)
1541
+ """
1542
+ userErrors: [UserError!]!
1543
+ }
1544
+
1545
+ """Checkout payment method update payload"""
1546
+ type CheckoutSelectPaymentMethodPayload {
1547
+ """Updated checkout"""
1548
+ checkout: Checkout
1549
+
1550
+ """
1551
+ User errors (code is namespaced — e.g. CHECKOUT_NOT_FOUND, CHECKOUT_PAYMENT_FAILED)
1552
+ """
1553
+ userErrors: [UserError!]!
1415
1554
  }
1416
1555
 
1417
1556
  """Checkout shipping line update payload"""
1418
- type CheckoutShippingLineUpdatePayload {
1557
+ type CheckoutSelectShippingRatePayload {
1419
1558
  """Updated checkout"""
1420
1559
  checkout: Checkout
1421
1560
 
1422
- """User errors"""
1423
- userErrors: [CheckoutUserError!]!
1561
+ """
1562
+ User errors (code is namespaced — e.g. CHECKOUT_NOT_FOUND, CHECKOUT_PAYMENT_FAILED)
1563
+ """
1564
+ userErrors: [UserError!]!
1424
1565
  }
1425
1566
 
1426
- """Checkout user error"""
1427
- type CheckoutUserError {
1428
- """Error code"""
1429
- code: CheckoutErrorCode
1567
+ """Checkout billing address update payload"""
1568
+ type CheckoutUpdateBillingAddressPayload {
1569
+ """Updated checkout"""
1570
+ checkout: Checkout
1430
1571
 
1431
- """Path to error field"""
1432
- field: [String!]!
1572
+ """
1573
+ User errors (code is namespaced — e.g. CHECKOUT_NOT_FOUND, CHECKOUT_PAYMENT_FAILED)
1574
+ """
1575
+ userErrors: [UserError!]!
1576
+ }
1433
1577
 
1434
- """Error message"""
1435
- message: String!
1578
+ """Checkout email update payload"""
1579
+ type CheckoutUpdateEmailPayload {
1580
+ """Updated checkout"""
1581
+ checkout: Checkout
1582
+
1583
+ """
1584
+ User errors (code is namespaced — e.g. CHECKOUT_NOT_FOUND, CHECKOUT_PAYMENT_FAILED)
1585
+ """
1586
+ userErrors: [UserError!]!
1587
+ }
1588
+
1589
+ """Checkout gift card recipient update payload"""
1590
+ type CheckoutUpdateGiftCardRecipientPayload {
1591
+ """Updated checkout"""
1592
+ checkout: Checkout
1593
+
1594
+ """
1595
+ User errors (code is namespaced — e.g. CHECKOUT_NOT_FOUND, CHECKOUT_PAYMENT_FAILED)
1596
+ """
1597
+ userErrors: [UserError!]!
1598
+ }
1599
+
1600
+ """Checkout shipping address update payload"""
1601
+ type CheckoutUpdateShippingAddressPayload {
1602
+ """Updated checkout"""
1603
+ checkout: Checkout
1604
+
1605
+ """
1606
+ User errors (code is namespaced — e.g. CHECKOUT_NOT_FOUND, CHECKOUT_PAYMENT_FAILED)
1607
+ """
1608
+ userErrors: [UserError!]!
1609
+ }
1610
+
1611
+ """Checkout discount code validation result"""
1612
+ type CheckoutValidateDiscountCodePayload {
1613
+ """Validation result"""
1614
+ result: DiscountValidationResult!
1615
+
1616
+ """
1617
+ User errors (for checkout-level issues; code is namespaced — e.g. CHECKOUT_NOT_FOUND)
1618
+ """
1619
+ userErrors: [UserError!]!
1436
1620
  }
1437
1621
 
1438
1622
  """Collection - curated group of products"""
1439
- type Collection {
1623
+ type Collection implements Node {
1440
1624
  """Creation timestamp"""
1441
1625
  createdAt: DateTime!
1442
1626
 
@@ -1456,7 +1640,7 @@ type Collection {
1456
1640
  image: Image
1457
1641
 
1458
1642
  """Products in collection"""
1459
- products(after: String, first: Int = 20, reverse: Boolean = false, sortKey: ProductSortKeys = BEST_SELLING): ProductConnection!
1643
+ products(after: String, before: String, filters: [ProductFilter!], first: Int, last: Int, reverse: Boolean = false, sortKey: ProductSortKeys = BEST_SELLING): ProductConnection!
1460
1644
 
1461
1645
  """SEO metadata"""
1462
1646
  seo: SEO
@@ -1503,6 +1687,12 @@ enum CompensationType {
1503
1687
  STORE_CREDIT
1504
1688
  }
1505
1689
 
1690
+ """Format of stored content (HTML or MARKDOWN)"""
1691
+ enum ContentFormat {
1692
+ HTML
1693
+ MARKDOWN
1694
+ }
1695
+
1506
1696
  """Price range in converted currency"""
1507
1697
  type ConvertedPriceRange {
1508
1698
  """Maximum variant price (converted)"""
@@ -1512,6 +1702,68 @@ type ConvertedPriceRange {
1512
1702
  minVariantPrice: PriceMoney!
1513
1703
  }
1514
1704
 
1705
+ """Wspierany kraj sklepu (ISO 3166-1 alpha-2)"""
1706
+ type Country implements Node {
1707
+ """Języki wspierane przez sklep dostępne w tym kraju"""
1708
+ availableLanguages: [Language!]!
1709
+
1710
+ """Primary currency w tym kraju"""
1711
+ currency: Currency!
1712
+
1713
+ """Globally-unique identifier (np. "country:PL")"""
1714
+ id: ID!
1715
+
1716
+ """ISO 3166-1 alpha-2 country code"""
1717
+ isoCode: CountryCode!
1718
+
1719
+ """English name kraju (np. "Poland", "Germany")"""
1720
+ name: String!
1721
+
1722
+ """System jednostek (metric/imperial)"""
1723
+ unitSystem: UnitSystem!
1724
+ }
1725
+
1726
+ """ISO 3166-1 alpha-2 country code"""
1727
+ enum CountryCode {
1728
+ AT
1729
+ AU
1730
+ BE
1731
+ BG
1732
+ CA
1733
+ CH
1734
+ CY
1735
+ CZ
1736
+ DE
1737
+ DK
1738
+ EE
1739
+ ES
1740
+ FI
1741
+ FR
1742
+ GB
1743
+ GR
1744
+ HR
1745
+ HU
1746
+ IE
1747
+ IS
1748
+ IT
1749
+ LI
1750
+ LT
1751
+ LU
1752
+ LV
1753
+ MT
1754
+ NL
1755
+ NO
1756
+ NZ
1757
+ PL
1758
+ PT
1759
+ RO
1760
+ SE
1761
+ SI
1762
+ SK
1763
+ US
1764
+ ZZ
1765
+ }
1766
+
1515
1767
  """Region to crop the image"""
1516
1768
  enum CropRegion {
1517
1769
  BOTTOM
@@ -1524,7 +1776,7 @@ enum CropRegion {
1524
1776
  """Currency information"""
1525
1777
  type Currency {
1526
1778
  """ISO 4217 currency code"""
1527
- code: String!
1779
+ code: CurrencyCode!
1528
1780
 
1529
1781
  """Number of decimal places"""
1530
1782
  decimalPlaces: Float!
@@ -1535,8 +1787,179 @@ type Currency {
1535
1787
  """Currency symbol"""
1536
1788
  symbol: String!
1537
1789
 
1538
- """Symbol position relative to amount: before or after"""
1539
- symbolPosition: String!
1790
+ """Symbol position relative to amount"""
1791
+ symbolPosition: CurrencySymbolPosition!
1792
+ }
1793
+
1794
+ """ISO 4217 currency code"""
1795
+ enum CurrencyCode {
1796
+ AED
1797
+ AFN
1798
+ ALL
1799
+ AMD
1800
+ ANG
1801
+ AOA
1802
+ ARS
1803
+ AUD
1804
+ AWG
1805
+ AZN
1806
+ BAM
1807
+ BBD
1808
+ BDT
1809
+ BGN
1810
+ BHD
1811
+ BIF
1812
+ BMD
1813
+ BND
1814
+ BOB
1815
+ BOV
1816
+ BRL
1817
+ BSD
1818
+ BTN
1819
+ BWP
1820
+ BYN
1821
+ BZD
1822
+ CAD
1823
+ CDF
1824
+ CHE
1825
+ CHF
1826
+ CHW
1827
+ CLF
1828
+ CLP
1829
+ CNY
1830
+ COP
1831
+ COU
1832
+ CRC
1833
+ CUC
1834
+ CUP
1835
+ CVE
1836
+ CZK
1837
+ DJF
1838
+ DKK
1839
+ DOP
1840
+ DZD
1841
+ EGP
1842
+ ERN
1843
+ ETB
1844
+ EUR
1845
+ FJD
1846
+ FKP
1847
+ GBP
1848
+ GEL
1849
+ GHS
1850
+ GIP
1851
+ GMD
1852
+ GNF
1853
+ GTQ
1854
+ GYD
1855
+ HKD
1856
+ HNL
1857
+ HTG
1858
+ HUF
1859
+ IDR
1860
+ ILS
1861
+ INR
1862
+ IQD
1863
+ IRR
1864
+ ISK
1865
+ JMD
1866
+ JOD
1867
+ JPY
1868
+ KES
1869
+ KGS
1870
+ KHR
1871
+ KMF
1872
+ KPW
1873
+ KRW
1874
+ KWD
1875
+ KYD
1876
+ KZT
1877
+ LAK
1878
+ LBP
1879
+ LKR
1880
+ LRD
1881
+ LSL
1882
+ LYD
1883
+ MAD
1884
+ MDL
1885
+ MGA
1886
+ MKD
1887
+ MMK
1888
+ MNT
1889
+ MOP
1890
+ MRU
1891
+ MUR
1892
+ MVR
1893
+ MWK
1894
+ MXN
1895
+ MXV
1896
+ MYR
1897
+ MZN
1898
+ NAD
1899
+ NGN
1900
+ NIO
1901
+ NOK
1902
+ NPR
1903
+ NZD
1904
+ OMR
1905
+ PAB
1906
+ PEN
1907
+ PGK
1908
+ PHP
1909
+ PKR
1910
+ PLN
1911
+ PYG
1912
+ QAR
1913
+ RON
1914
+ RSD
1915
+ RUB
1916
+ RWF
1917
+ SAR
1918
+ SBD
1919
+ SCR
1920
+ SDG
1921
+ SEK
1922
+ SGD
1923
+ SHP
1924
+ SLE
1925
+ SOS
1926
+ SRD
1927
+ SSP
1928
+ STN
1929
+ SVC
1930
+ SYP
1931
+ SZL
1932
+ THB
1933
+ TJS
1934
+ TMT
1935
+ TND
1936
+ TOP
1937
+ TRY
1938
+ TTD
1939
+ TWD
1940
+ TZS
1941
+ UAH
1942
+ UGX
1943
+ USD
1944
+ USN
1945
+ UYI
1946
+ UYU
1947
+ UYW
1948
+ UZS
1949
+ VED
1950
+ VES
1951
+ VND
1952
+ VUV
1953
+ WST
1954
+ XAF
1955
+ XCD
1956
+ XOF
1957
+ XPF
1958
+ XXX
1959
+ YER
1960
+ ZAR
1961
+ ZMW
1962
+ ZWG
1540
1963
  }
1541
1964
 
1542
1965
  """Currency conversion result"""
@@ -1576,14 +1999,26 @@ enum CurrencyRateSource {
1576
1999
  MANUAL
1577
2000
  }
1578
2001
 
2002
+ """Whether the currency symbol renders before or after the amount."""
2003
+ enum CurrencySymbolPosition {
2004
+ AFTER
2005
+ BEFORE
2006
+ }
2007
+
1579
2008
  """Customer - registered user"""
1580
- type Customer {
1581
- """Saved addresses"""
1582
- addresses(first: Int = 10): [MailingAddress!]!
2009
+ type Customer implements Node {
2010
+ """Saved addresses (Relay Connection)"""
2011
+ addresses(after: String, before: String, first: Int, last: Int): MailingAddressConnection!
2012
+
2013
+ """Company name (populated for COMPANY type)"""
2014
+ companyName: String
1583
2015
 
1584
2016
  """Account creation date"""
1585
2017
  createdAt: DateTime!
1586
2018
 
2019
+ """Business type discriminator (INDIVIDUAL/COMPANY)"""
2020
+ customerType: CustomerType!
2021
+
1587
2022
  """Default address"""
1588
2023
  defaultAddress: MailingAddress
1589
2024
 
@@ -1594,10 +2029,7 @@ type Customer {
1594
2029
  email: String!
1595
2030
 
1596
2031
  """Email marketing consent state"""
1597
- emailMarketingState: String!
1598
-
1599
- """Whether email is verified"""
1600
- emailVerified: Boolean!
2032
+ emailMarketing: EmailMarketingState!
1601
2033
 
1602
2034
  """First name"""
1603
2035
  firstName: String
@@ -1605,23 +2037,38 @@ type Customer {
1605
2037
  """Unique identifier"""
1606
2038
  id: ID!
1607
2039
 
2040
+ """Whether email is verified"""
2041
+ isEmailVerified: Boolean!
2042
+
1608
2043
  """Last name"""
1609
2044
  lastName: String
1610
2045
 
2046
+ """Total orders count (UnsignedInt64 — BigInt-safe)"""
2047
+ orderCount: UnsignedInt64!
2048
+
1611
2049
  """Customer orders"""
1612
2050
  orders(after: String, first: Int = 10): OrderConnection!
1613
2051
 
1614
- """Total orders count"""
1615
- ordersCount: Int!
1616
-
1617
2052
  """Phone number"""
1618
2053
  phone: String
1619
2054
 
2055
+ """Polish business registry number — REGON"""
2056
+ regon: String
2057
+
2058
+ """Customer tags for segmentation (e.g. vip, wholesale, b2b)"""
2059
+ tags: [String!]!
2060
+
2061
+ """Polish tax ID — NIP"""
2062
+ taxId: String
2063
+
1620
2064
  """Total amount spent"""
1621
2065
  totalSpent: Money!
1622
2066
 
1623
2067
  """Last update date"""
1624
2068
  updatedAt: DateTime!
2069
+
2070
+ """EU VAT number"""
2071
+ vatNumber: String
1625
2072
  }
1626
2073
 
1627
2074
  """Customer access token"""
@@ -1629,8 +2076,8 @@ type CustomerAccessToken {
1629
2076
  """Access token string"""
1630
2077
  accessToken: String!
1631
2078
 
1632
- """Token expiration"""
1633
- expiresAt: String!
2079
+ """Token expiration (ISO 8601)"""
2080
+ expiresAt: DateTime!
1634
2081
  }
1635
2082
 
1636
2083
  """Input for customer login"""
@@ -1642,65 +2089,40 @@ input CustomerAccessTokenCreateInput {
1642
2089
  password: String!
1643
2090
  }
1644
2091
 
1645
- """Result of customer login"""
1646
- type CustomerAccessTokenCreatePayload {
1647
- """Access token"""
1648
- customerAccessToken: CustomerAccessToken
1649
-
1650
- """User errors"""
1651
- userErrors: [UserError!]!
1652
- }
1653
-
1654
- """Result of token deletion (logout)"""
1655
- type CustomerAccessTokenDeletePayload {
1656
- """Deleted access token"""
1657
- deletedAccessToken: String
1658
-
1659
- """Deleted token ID"""
1660
- deletedCustomerAccessTokenId: String
1661
-
1662
- """User errors"""
1663
- userErrors: [UserError!]!
1664
- }
2092
+ """
2093
+ Result of customerActivateByUrl mutation — admin-created customer sets initial password
2094
+ """
2095
+ type CustomerActivatePayload {
2096
+ """Activated customer"""
2097
+ customer: Customer
1665
2098
 
1666
- """Result of token renewal"""
1667
- type CustomerAccessTokenRenewPayload {
1668
- """New access token"""
2099
+ """Auto-login access token"""
1669
2100
  customerAccessToken: CustomerAccessToken
1670
2101
 
1671
- """User errors"""
2102
+ """
2103
+ User errors (code is namespaced — e.g. CUSTOMER_NOT_FOUND, CUSTOMER_TOKEN_INVALID, CUSTOMER_PASSWORD_TOO_WEAK)
2104
+ """
1672
2105
  userErrors: [UserError!]!
1673
2106
  }
1674
2107
 
1675
2108
  """Result of address creation"""
1676
- type CustomerAddressCreatePayload {
2109
+ type CustomerAddAddressPayload {
1677
2110
  """Created address"""
1678
2111
  address: MailingAddress
1679
2112
 
1680
- """User errors"""
1681
- userErrors: [UserError!]!
1682
- }
1683
-
1684
- """Result of address deletion"""
1685
- type CustomerAddressDeletePayload {
1686
- """Deleted address ID"""
1687
- deletedAddressId: ID
1688
-
1689
- """User errors"""
1690
- userErrors: [UserError!]!
1691
- }
1692
-
1693
- """Result of address update"""
1694
- type CustomerAddressUpdatePayload {
1695
- """Updated address"""
1696
- address: MailingAddress
1697
-
1698
- """User errors"""
2113
+ """
2114
+ User errors (code is namespaced — e.g. CUSTOMER_NOT_FOUND, CUSTOMER_TOKEN_INVALID, CUSTOMER_PASSWORD_TOO_WEAK)
2115
+ """
1699
2116
  userErrors: [UserError!]!
1700
2117
  }
1701
2118
 
1702
2119
  """Input for customer registration"""
1703
2120
  input CustomerCreateInput {
2121
+ """
2122
+ 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.
2123
+ """
2124
+ acceptsMarketing: Boolean
2125
+
1704
2126
  """Email address"""
1705
2127
  email: String!
1706
2128
 
@@ -1710,6 +2132,11 @@ input CustomerCreateInput {
1710
2132
  """Last name"""
1711
2133
  lastName: String
1712
2134
 
2135
+ """
2136
+ Opt-in level. Default SINGLE_OPT_IN (signup = email proven implicitly). Set CONFIRMED_OPT_IN to force double opt-in via confirmation email.
2137
+ """
2138
+ marketingOptInLevel: MarketingOptInLevel
2139
+
1713
2140
  """Password"""
1714
2141
  password: String!
1715
2142
 
@@ -1717,27 +2144,6 @@ input CustomerCreateInput {
1717
2144
  phone: String
1718
2145
  }
1719
2146
 
1720
- """Result of customer creation"""
1721
- type CustomerCreatePayload {
1722
- """Created customer"""
1723
- customer: Customer
1724
-
1725
- """Access token for new customer"""
1726
- customerAccessToken: CustomerAccessToken
1727
-
1728
- """User errors"""
1729
- userErrors: [UserError!]!
1730
- }
1731
-
1732
- """Result of default address update"""
1733
- type CustomerDefaultAddressUpdatePayload {
1734
- """Updated customer"""
1735
- customer: Customer
1736
-
1737
- """User errors"""
1738
- userErrors: [UserError!]!
1739
- }
1740
-
1741
2147
  """Customer group for B2B pricing"""
1742
2148
  type CustomerGroup {
1743
2149
  """Group code"""
@@ -1759,26 +2165,147 @@ type CustomerGroup {
1759
2165
  taxExempt: Boolean!
1760
2166
  }
1761
2167
 
2168
+ """Result of customer login"""
2169
+ type CustomerLoginPayload {
2170
+ """Access token"""
2171
+ customerAccessToken: CustomerAccessToken
2172
+
2173
+ """
2174
+ User errors (code is namespaced — e.g. CUSTOMER_NOT_FOUND, CUSTOMER_TOKEN_INVALID, CUSTOMER_PASSWORD_TOO_WEAK)
2175
+ """
2176
+ userErrors: [UserError!]!
2177
+ }
2178
+
2179
+ """Result of token deletion (logout)"""
2180
+ type CustomerLogoutPayload {
2181
+ """Deleted access token"""
2182
+ deletedAccessToken: String
2183
+
2184
+ """Deleted token ID"""
2185
+ deletedCustomerAccessTokenId: String
2186
+
2187
+ """
2188
+ User errors (code is namespaced — e.g. CUSTOMER_NOT_FOUND, CUSTOMER_TOKEN_INVALID, CUSTOMER_PASSWORD_TOO_WEAK)
2189
+ """
2190
+ userErrors: [UserError!]!
2191
+ }
2192
+
2193
+ """Result of token renewal"""
2194
+ type CustomerRefreshTokenPayload {
2195
+ """New access token"""
2196
+ customerAccessToken: CustomerAccessToken
2197
+
2198
+ """
2199
+ User errors (code is namespaced — e.g. CUSTOMER_NOT_FOUND, CUSTOMER_TOKEN_INVALID, CUSTOMER_PASSWORD_TOO_WEAK)
2200
+ """
2201
+ userErrors: [UserError!]!
2202
+ }
2203
+
2204
+ """Result of address deletion"""
2205
+ type CustomerRemoveAddressPayload {
2206
+ """Deleted address ID"""
2207
+ deletedAddressId: ID
2208
+
2209
+ """
2210
+ User errors (code is namespaced — e.g. CUSTOMER_NOT_FOUND, CUSTOMER_TOKEN_INVALID, CUSTOMER_PASSWORD_TOO_WEAK)
2211
+ """
2212
+ userErrors: [UserError!]!
2213
+ }
2214
+
1762
2215
  """Result of password recovery"""
1763
- type CustomerRecoverPayload {
1764
- """User errors"""
2216
+ type CustomerRequestPasswordResetPayload {
2217
+ """
2218
+ User errors (code is namespaced — e.g. CUSTOMER_NOT_FOUND, CUSTOMER_TOKEN_INVALID, CUSTOMER_PASSWORD_TOO_WEAK)
2219
+ """
2220
+ userErrors: [UserError!]!
2221
+ }
2222
+
2223
+ """Result of customerResetByUrl mutation — password reset via signed URL"""
2224
+ type CustomerResetPasswordPayload {
2225
+ """Customer with reset password"""
2226
+ customer: Customer
2227
+
2228
+ """Auto-login access token"""
2229
+ customerAccessToken: CustomerAccessToken
2230
+
2231
+ """
2232
+ User errors (code is namespaced — e.g. CUSTOMER_NOT_FOUND, CUSTOMER_TOKEN_INVALID, CUSTOMER_PASSWORD_TOO_WEAK)
2233
+ """
1765
2234
  userErrors: [UserError!]!
1766
2235
  }
1767
2236
 
1768
- """Result of password reset"""
1769
- type CustomerResetPayload {
1770
- """Updated customer"""
1771
- customer: Customer
2237
+ """Result of default address update"""
2238
+ type CustomerSetDefaultAddressPayload {
2239
+ """Updated customer"""
2240
+ customer: Customer
2241
+
2242
+ """
2243
+ User errors (code is namespaced — e.g. CUSTOMER_NOT_FOUND, CUSTOMER_TOKEN_INVALID, CUSTOMER_PASSWORD_TOO_WEAK)
2244
+ """
2245
+ userErrors: [UserError!]!
2246
+ }
2247
+
2248
+ """Result of customer creation"""
2249
+ type CustomerSignupPayload {
2250
+ """Created customer"""
2251
+ customer: Customer
2252
+
2253
+ """Access token for new customer"""
2254
+ customerAccessToken: CustomerAccessToken
2255
+
2256
+ """
2257
+ User errors (code is namespaced — e.g. CUSTOMER_NOT_FOUND, CUSTOMER_TOKEN_INVALID, CUSTOMER_PASSWORD_TOO_WEAK)
2258
+ """
2259
+ userErrors: [UserError!]!
2260
+ }
2261
+
2262
+ """Input for newsletter subscribe (guest-friendly)."""
2263
+ input CustomerSubscribeToMarketingInput {
2264
+ """Email address to subscribe to newsletter"""
2265
+ email: String!
2266
+
2267
+ """
2268
+ Opt-in level. Guest mutation always enforces CONFIRMED_OPT_IN regardless of value.
2269
+ """
2270
+ marketingOptInLevel: MarketingOptInLevel
2271
+ }
2272
+
2273
+ """Customer business type — INDIVIDUAL (B2C) or COMPANY (B2B)."""
2274
+ enum CustomerType {
2275
+ COMPANY
2276
+ INDIVIDUAL
2277
+ }
1772
2278
 
1773
- """New access token"""
1774
- customerAccessToken: CustomerAccessToken
2279
+ """Input for newsletter unsubscribe (guest-friendly)."""
2280
+ input CustomerUnsubscribeFromMarketingInput {
2281
+ """Email address to unsubscribe"""
2282
+ email: String!
2283
+ }
1775
2284
 
1776
- """User errors"""
2285
+ """Result of address update"""
2286
+ type CustomerUpdateAddressPayload {
2287
+ """Updated address"""
2288
+ address: MailingAddress
2289
+
2290
+ """
2291
+ User errors (code is namespaced — e.g. CUSTOMER_NOT_FOUND, CUSTOMER_TOKEN_INVALID, CUSTOMER_PASSWORD_TOO_WEAK)
2292
+ """
1777
2293
  userErrors: [UserError!]!
1778
2294
  }
1779
2295
 
1780
2296
  """Input for customer update"""
1781
2297
  input CustomerUpdateInput {
2298
+ """
2299
+ Email marketing toggle. true → state SUBSCRIBED bezpośrednio (auth'd customer = email proven). false → UNSUBSCRIBED. null/undefined → no change.
2300
+ """
2301
+ acceptsMarketing: Boolean
2302
+
2303
+ """Company name (required when customerType is COMPANY)"""
2304
+ companyName: String
2305
+
2306
+ """Business type discriminator (INDIVIDUAL/COMPANY)"""
2307
+ customerType: CustomerType
2308
+
1782
2309
  """First name"""
1783
2310
  firstName: String
1784
2311
 
@@ -1787,6 +2314,15 @@ input CustomerUpdateInput {
1787
2314
 
1788
2315
  """Phone number"""
1789
2316
  phone: String
2317
+
2318
+ """Polish business registry number — REGON (9 or 14 digits with checksum)"""
2319
+ regon: String
2320
+
2321
+ """Polish tax ID — NIP (10 digits with checksum)"""
2322
+ taxId: String
2323
+
2324
+ """EU VAT number (e.g. PL1234567890)"""
2325
+ vatNumber: String
1790
2326
  }
1791
2327
 
1792
2328
  """Result of customer update"""
@@ -1794,7 +2330,9 @@ type CustomerUpdatePayload {
1794
2330
  """Updated customer"""
1795
2331
  customer: Customer
1796
2332
 
1797
- """User errors"""
2333
+ """
2334
+ User errors (code is namespaced — e.g. CUSTOMER_NOT_FOUND, CUSTOMER_TOKEN_INVALID, CUSTOMER_PASSWORD_TOO_WEAK)
2335
+ """
1798
2336
  userErrors: [UserError!]!
1799
2337
  }
1800
2338
 
@@ -1803,6 +2341,11 @@ A date-time string at UTC, such as 2019-12-03T09:54:33Z, compliant with the date
1803
2341
  """
1804
2342
  scalar DateTime
1805
2343
 
2344
+ """
2345
+ Decimal money amount, JSON-serialized as String. Format: "{int}.{dec}" e.g. "10.50".
2346
+ """
2347
+ scalar Decimal
2348
+
1806
2349
  """Estimated delivery timeframe"""
1807
2350
  type DeliveryEstimate {
1808
2351
  """Human-readable delivery estimate"""
@@ -1847,9 +2390,6 @@ type DiscountApplication {
1847
2390
  """Items affected by this discount (for BXGY type)"""
1848
2391
  affectedItems: [DiscountAffectedItem!]
1849
2392
 
1850
- """Whether discount is applicable"""
1851
- applicable: Boolean!
1852
-
1853
2393
  """Buy quantity for BXGY (e.g., 2 in "Buy 2 Get 1")"""
1854
2394
  buyQuantity: Int
1855
2395
 
@@ -1862,6 +2402,9 @@ type DiscountApplication {
1862
2402
  """Get quantity for BXGY (e.g., 1 in "Buy 2 Get 1")"""
1863
2403
  getQuantity: Int
1864
2404
 
2405
+ """Whether discount is applicable"""
2406
+ isApplicable: Boolean!
2407
+
1865
2408
  """Discount title/description"""
1866
2409
  title: String
1867
2410
 
@@ -1882,11 +2425,11 @@ enum DiscountApplicationType {
1882
2425
 
1883
2426
  """Discount code applied to checkout"""
1884
2427
  type DiscountCode {
1885
- """Whether the code is currently applicable"""
1886
- applicable: Boolean!
1887
-
1888
2428
  """Discount code string"""
1889
2429
  code: String!
2430
+
2431
+ """Whether the code is currently applicable"""
2432
+ isApplicable: Boolean!
1890
2433
  }
1891
2434
 
1892
2435
  """Error codes for discount validation"""
@@ -1940,7 +2483,29 @@ type DiscountValidationResult {
1940
2483
  error: DiscountValidationError
1941
2484
 
1942
2485
  """Whether the discount code is valid"""
1943
- valid: Boolean!
2486
+ isValid: Boolean!
2487
+ }
2488
+
2489
+ """Shop domain (host, full URL, SSL state)"""
2490
+ type Domain {
2491
+ """Host name (e.g. "shop.example.com")"""
2492
+ host: String!
2493
+
2494
+ """Whether HTTPS is enforced"""
2495
+ isSslEnabled: Boolean!
2496
+
2497
+ """Full URL z protocol"""
2498
+ url: URL!
2499
+ }
2500
+
2501
+ """Customer email marketing consent state (Prisma-derived)."""
2502
+ enum EmailMarketingState {
2503
+ INVALID
2504
+ NOT_SUBSCRIBED
2505
+ PENDING
2506
+ REDACTED
2507
+ SUBSCRIBED
2508
+ UNSUBSCRIBED
1944
2509
  }
1945
2510
 
1946
2511
  """Exchange rate between currencies"""
@@ -1961,6 +2526,60 @@ type ExchangeRate {
1961
2526
  updatedAt: DateTime!
1962
2527
  }
1963
2528
 
2529
+ """Faceted filter for product listing"""
2530
+ type Filter {
2531
+ """
2532
+ Unique filter identifier (e.g., "filter.v.option.color", "filter.v.price")
2533
+ """
2534
+ id: ID!
2535
+
2536
+ """Display label (e.g., "Color", "Price", "Availability")"""
2537
+ label: String!
2538
+
2539
+ """Display hint (SWATCH for COLOR, IMAGE for pattern, TEXT default)"""
2540
+ presentation: FilterPresentation
2541
+
2542
+ """Filter type (LIST | PRICE_RANGE | BOOLEAN)"""
2543
+ type: FilterType!
2544
+
2545
+ """Available values for this filter, with product counts"""
2546
+ values: [FilterValue!]!
2547
+ }
2548
+
2549
+ """Filter presentation hint"""
2550
+ enum FilterPresentation {
2551
+ IMAGE
2552
+ SWATCH
2553
+ TEXT
2554
+ }
2555
+
2556
+ """Type of filter"""
2557
+ enum FilterType {
2558
+ BOOLEAN
2559
+ LIST
2560
+ PRICE_RANGE
2561
+ }
2562
+
2563
+ """Filter value with product count"""
2564
+ type FilterValue {
2565
+ """Number of products matching this value in current result set"""
2566
+ count: Int!
2567
+
2568
+ """Unique identifier within filter"""
2569
+ id: ID!
2570
+
2571
+ """
2572
+ Pre-built ProductFilter input — paste verbatim into `filters` arg to refetch with this value applied. Example: `{"variantOption":{"name":"Color","value":"Red"}}`
2573
+ """
2574
+ input: JSON!
2575
+
2576
+ """Display label (e.g., "Red", "Extra Large", "$50 - $200")"""
2577
+ label: String!
2578
+
2579
+ """DoSwiftly: visual swatch (color hex or pattern image)"""
2580
+ swatch: AttributeSwatch
2581
+ }
2582
+
1964
2583
  """Free shipping progress indicator"""
1965
2584
  type FreeShippingProgress {
1966
2585
  """Current cart subtotal"""
@@ -1993,8 +2612,8 @@ type GenerateReferralCodePayload {
1993
2612
  """Whether generation was successful"""
1994
2613
  success: Boolean!
1995
2614
 
1996
- """Error messages if any"""
1997
- userErrors: [String!]!
2615
+ """Typed user errors"""
2616
+ userErrors: [UserError!]!
1998
2617
  }
1999
2618
 
2000
2619
  """Geographic coordinates (latitude/longitude)"""
@@ -2023,10 +2642,9 @@ type GiftCard {
2023
2642
  """Initial gift card amount"""
2024
2643
  initialAmount: Money!
2025
2644
 
2026
- """Last 4 characters of code"""
2027
- lastCharacters: String!
2028
-
2029
- """Gift card code (masked for security)"""
2645
+ """
2646
+ Gift card code (masked for security; client may slice last 4 chars for display)
2647
+ """
2030
2648
  maskedCode: String!
2031
2649
 
2032
2650
  """Personal message"""
@@ -2037,9 +2655,6 @@ type GiftCard {
2037
2655
 
2038
2656
  """Gift card status"""
2039
2657
  status: GiftCardStatus!
2040
-
2041
- """Transaction history"""
2042
- transactions: [GiftCardTransaction!]!
2043
2658
  }
2044
2659
 
2045
2660
  """Gift card validation error"""
@@ -2062,15 +2677,6 @@ enum GiftCardErrorCode {
2062
2677
  NOT_FOUND
2063
2678
  }
2064
2679
 
2065
- """Result of gift card lookup"""
2066
- type GiftCardPayload {
2067
- """Gift card if found"""
2068
- giftCard: GiftCard
2069
-
2070
- """User errors"""
2071
- userErrors: [UserError!]!
2072
- }
2073
-
2074
2680
  """Gift card status"""
2075
2681
  enum GiftCardStatus {
2076
2682
  ACTIVE
@@ -2079,27 +2685,6 @@ enum GiftCardStatus {
2079
2685
  USED
2080
2686
  }
2081
2687
 
2082
- """Gift card transaction record"""
2083
- type GiftCardTransaction {
2084
- """Transaction amount"""
2085
- amount: Money!
2086
-
2087
- """Balance after transaction"""
2088
- balanceAfter: Money!
2089
-
2090
- """Transaction timestamp"""
2091
- createdAt: DateTime!
2092
-
2093
- """Transaction ID"""
2094
- id: ID!
2095
-
2096
- """Order ID if related to order"""
2097
- orderId: ID
2098
-
2099
- """Transaction type"""
2100
- type: String!
2101
- }
2102
-
2103
2688
  """Result of gift card validation"""
2104
2689
  type GiftCardValidatePayload {
2105
2690
  """User errors"""
@@ -2121,7 +2706,7 @@ type GiftCardValidation {
2121
2706
  giftCard: GiftCard
2122
2707
 
2123
2708
  """Whether the gift card is valid for use"""
2124
- valid: Boolean!
2709
+ isValid: Boolean!
2125
2710
  }
2126
2711
 
2127
2712
  """Image with URL and metadata"""
@@ -2147,6 +2732,21 @@ type Image {
2147
2732
  width: Int
2148
2733
  }
2149
2734
 
2735
+ """Paginated list of images (Relay Connection)"""
2736
+ type ImageConnection {
2737
+ """Image edges with cursors"""
2738
+ edges: [ImageEdge!]!
2739
+
2740
+ """Image nodes (shortcut for edges.map(e => e.node))"""
2741
+ nodes: [Image!]!
2742
+
2743
+ """Pagination info"""
2744
+ pageInfo: PageInfo!
2745
+
2746
+ """Total count of images"""
2747
+ totalCount: Int!
2748
+ }
2749
+
2150
2750
  """Image content type for output format"""
2151
2751
  enum ImageContentType {
2152
2752
  AVIF
@@ -2155,7 +2755,16 @@ enum ImageContentType {
2155
2755
  WEBP
2156
2756
  }
2157
2757
 
2158
- """Image transform options (Shopify-compatible)"""
2758
+ """Edge in an Image connection"""
2759
+ type ImageEdge {
2760
+ """Cursor for pagination"""
2761
+ cursor: String!
2762
+
2763
+ """Image node"""
2764
+ node: Image!
2765
+ }
2766
+
2767
+ """Image transform options"""
2159
2768
  input ImageTransformInput {
2160
2769
  """Crop region"""
2161
2770
  crop: CropRegion
@@ -2173,6 +2782,11 @@ input ImageTransformInput {
2173
2782
  scale: Int
2174
2783
  }
2175
2784
 
2785
+ """
2786
+ Opaque JSON payload — shape documented per field. Klient parsuje strukturę sam.
2787
+ """
2788
+ scalar JSON
2789
+
2176
2790
  """Language configuration"""
2177
2791
  type Language {
2178
2792
  """Language code (ISO 639-1)"""
@@ -2194,6 +2808,31 @@ type Language {
2194
2808
  nativeName: String!
2195
2809
  }
2196
2810
 
2811
+ """ISO 639-1 language code"""
2812
+ enum LanguageCode {
2813
+ CS
2814
+ DA
2815
+ DE
2816
+ EN
2817
+ ES
2818
+ FI
2819
+ FR
2820
+ HR
2821
+ HU
2822
+ IT
2823
+ LT
2824
+ LV
2825
+ NL
2826
+ NO
2827
+ PL
2828
+ PT
2829
+ RO
2830
+ SK
2831
+ SL
2832
+ SV
2833
+ UK
2834
+ }
2835
+
2197
2836
  """Text direction for the language"""
2198
2837
  enum LanguageDirection {
2199
2838
  LTR
@@ -2204,6 +2843,9 @@ enum LanguageDirection {
2204
2843
  Summary of a ProductVariant linked to an AttributeOption (Faza 1.5 configurator).
2205
2844
  """
2206
2845
  type LinkedVariantSummary {
2846
+ """Available stock (stock − active reservations, zawsze ≥ 0)."""
2847
+ availableStock: Int!
2848
+
2207
2849
  """Variant ID (w tenant DB)."""
2208
2850
  id: ID!
2209
2851
 
@@ -2213,9 +2855,6 @@ type LinkedVariantSummary {
2213
2855
  """Parent product ID."""
2214
2856
  productId: ID!
2215
2857
 
2216
- """Dostępna ilość (stock − active reservations, zawsze ≥ 0)."""
2217
- quantityAvailable: Int!
2218
-
2219
2858
  """SKU jeśli zdefiniowany."""
2220
2859
  sku: String
2221
2860
 
@@ -2228,13 +2867,28 @@ type LinkedVariantSummary {
2228
2867
 
2229
2868
  """Locale to currency mapping entry"""
2230
2869
  type LocaleCurrencyMapping {
2231
- """Currency code (e.g., "PLN", "USD")"""
2232
- currency: String!
2870
+ """Currency code (ISO 4217)"""
2871
+ currency: CurrencyCode!
2233
2872
 
2234
2873
  """Browser locale (e.g., "pl-PL", "en-US")"""
2235
2874
  locale: String!
2236
2875
  }
2237
2876
 
2877
+ """Localization context dla storefronta"""
2878
+ type Localization {
2879
+ """Wszystkie wsparte kraje (z aktywnych shipping zones)"""
2880
+ availableCountries: [Country!]!
2881
+
2882
+ """Wszystkie wsparte języki sklepu"""
2883
+ availableLanguages: [Language!]!
2884
+
2885
+ """Aktualny kraj klienta (z `@inContext` lub geo-detection)"""
2886
+ country: Country!
2887
+
2888
+ """Aktualny język klienta (z `Accept-Language` lub `@inContext`)"""
2889
+ language: Language!
2890
+ }
2891
+
2238
2892
  """Inventory location (warehouse, store, pickup point)"""
2239
2893
  type Location {
2240
2894
  """Physical address and coordinates"""
@@ -2251,12 +2905,12 @@ type Location {
2251
2905
  """Location display name"""
2252
2906
  name: String!
2253
2907
 
2254
- """Whether this location supports BOPIS pickup"""
2255
- pickupEnabled: Boolean!
2256
-
2257
2908
  """Optional merchant pickup instructions (e.g., "Show ID at counter")"""
2258
2909
  pickupInstructions: String
2259
2910
 
2911
+ """Whether this location supports BOPIS pickup"""
2912
+ supportsPickup: Boolean!
2913
+
2260
2914
  """
2261
2915
  IANA timezone identifier (e.g., "Europe/Warsaw"). Falls back to shop timezone if null.
2262
2916
  """
@@ -2266,14 +2920,8 @@ type Location {
2266
2920
  type: LocationType!
2267
2921
  }
2268
2922
 
2269
- """Physical address of a location (Shopify LocationAddress parity)"""
2923
+ """Physical address of a location"""
2270
2924
  type LocationAddress {
2271
- """Street address line 1"""
2272
- address1: String
2273
-
2274
- """Street address line 2 (apartment, suite)"""
2275
- address2: String
2276
-
2277
2925
  """City"""
2278
2926
  city: String
2279
2927
 
@@ -2295,14 +2943,20 @@ type LocationAddress {
2295
2943
  """Phone number"""
2296
2944
  phone: String
2297
2945
 
2946
+ """Postal / ZIP code"""
2947
+ postalCode: String
2948
+
2298
2949
  """State / province name"""
2299
- province: String
2950
+ state: String
2300
2951
 
2301
2952
  """State / province code (e.g., CA, MZ)"""
2302
- provinceCode: String
2953
+ stateCode: String
2303
2954
 
2304
- """Postal / ZIP code"""
2305
- zip: String
2955
+ """First line of street address"""
2956
+ streetLine1: String
2957
+
2958
+ """Second line of street address (apartment, suite)"""
2959
+ streetLine2: String
2306
2960
  }
2307
2961
 
2308
2962
  """Paginated location connection"""
@@ -2337,7 +2991,7 @@ enum LocationType {
2337
2991
  """Available point earning action"""
2338
2992
  type LoyaltyAction {
2339
2993
  """Whether action is enabled"""
2340
- enabled: Boolean!
2994
+ isEnabled: Boolean!
2341
2995
 
2342
2996
  """Points awarded for this action (if fixed)"""
2343
2997
  points: Int
@@ -2355,13 +3009,13 @@ type LoyaltyMember {
2355
3009
  customerId: ID!
2356
3010
 
2357
3011
  """Enrollment date"""
2358
- enrolledAt: String!
3012
+ enrolledAt: DateTime!
2359
3013
 
2360
3014
  """Member ID"""
2361
3015
  id: ID!
2362
3016
 
2363
3017
  """Last activity date"""
2364
- lastActivityAt: String
3018
+ lastActivityAt: DateTime
2365
3019
 
2366
3020
  """Points summary"""
2367
3021
  points: LoyaltyPointsSummary!
@@ -2399,8 +3053,8 @@ type LoyaltyPointsSummary {
2399
3053
  """Points expiring soon (next 30 days)"""
2400
3054
  expiringPoints: Int
2401
3055
 
2402
- """Next expiry date"""
2403
- nextExpiryDate: String
3056
+ """Next expiry date (ISO 8601)"""
3057
+ nextExpiryDate: DateTime
2404
3058
 
2405
3059
  """Points pending (from incomplete orders)"""
2406
3060
  pendingPoints: Int!
@@ -2414,9 +3068,6 @@ type LoyaltyPointsSummary {
2414
3068
 
2415
3069
  """Redeemable loyalty reward"""
2416
3070
  type LoyaltyReward {
2417
- """Whether reward is available"""
2418
- available: Boolean!
2419
-
2420
3071
  """Description"""
2421
3072
  description: String
2422
3073
 
@@ -2432,14 +3083,17 @@ type LoyaltyReward {
2432
3083
  """Reward image"""
2433
3084
  image: Image
2434
3085
 
3086
+ """Whether reward is available"""
3087
+ isAvailable: Boolean!
3088
+
2435
3089
  """Reward name"""
2436
3090
  name: String!
2437
3091
 
2438
3092
  """Points required to redeem"""
2439
3093
  pointsCost: Int!
2440
3094
 
2441
- """Remaining redemptions (null = unlimited)"""
2442
- remainingRedemptions: Int
3095
+ """Redemptions remaining (null = unlimited)"""
3096
+ redemptionsRemaining: Int
2443
3097
 
2444
3098
  """URL-friendly slug"""
2445
3099
  slug: String!
@@ -2457,7 +3111,7 @@ type LoyaltySettings {
2457
3111
  availableActions: [LoyaltyAction!]!
2458
3112
 
2459
3113
  """Whether loyalty program is enabled"""
2460
- enabled: Boolean!
3114
+ isEnabled: Boolean!
2461
3115
 
2462
3116
  """Months until points expire (null = no expiry)"""
2463
3117
  pointsExpiryMonths: Int
@@ -2517,13 +3171,13 @@ type LoyaltyTransaction {
2517
3171
  balanceAfter: Int!
2518
3172
 
2519
3173
  """Transaction date"""
2520
- createdAt: String!
3174
+ createdAt: DateTime!
2521
3175
 
2522
3176
  """Description"""
2523
3177
  description: String
2524
3178
 
2525
3179
  """Expiry date for earned points"""
2526
- expiresAt: String
3180
+ expiresAt: DateTime
2527
3181
 
2528
3182
  """Transaction ID"""
2529
3183
  id: ID!
@@ -2574,13 +3228,7 @@ enum LoyaltyTransactionType {
2574
3228
  }
2575
3229
 
2576
3230
  """Customer mailing address"""
2577
- type MailingAddress {
2578
- """First line of address"""
2579
- address1: String
2580
-
2581
- """Second line of address"""
2582
- address2: String
2583
-
3231
+ type MailingAddress implements Node {
2584
3232
  """City"""
2585
3233
  city: String
2586
3234
 
@@ -2590,50 +3238,87 @@ type MailingAddress {
2590
3238
  """Country"""
2591
3239
  country: String
2592
3240
 
2593
- """Country code (ISO)"""
2594
- countryCode: String
3241
+ """ISO 3166-1 alpha-2 country code"""
3242
+ countryCode: CountryCode
2595
3243
 
2596
3244
  """First name"""
2597
3245
  firstName: String
2598
3246
 
3247
+ """
3248
+ 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.
3249
+ """
3250
+ formatted: [String!]!
3251
+
3252
+ """
3253
+ Single-line area summary, e.g. "Warszawa, MZ, Poland"
3254
+ """
3255
+ formattedArea: String
3256
+
2599
3257
  """Unique identifier"""
2600
3258
  id: ID!
2601
3259
 
2602
- """Whether this is default address"""
3260
+ """Whether this is default address (DoSwiftly extension)"""
2603
3261
  isDefault: Boolean!
2604
3262
 
2605
3263
  """Last name"""
2606
3264
  lastName: String
2607
3265
 
3266
+ """Computed full name (firstName + " " + lastName)"""
3267
+ name: String
3268
+
2608
3269
  """Phone number"""
2609
3270
  phone: String
2610
3271
 
2611
- """Province/State"""
2612
- province: String
3272
+ """Postal / ZIP code"""
3273
+ postalCode: String
3274
+
3275
+ """State / province"""
3276
+ state: String
3277
+
3278
+ """State / province code (ISO 3166-2 subdivision)"""
3279
+ stateCode: String
2613
3280
 
2614
- """Province code"""
2615
- provinceCode: String
3281
+ """First line of street address"""
3282
+ streetLine1: String
2616
3283
 
2617
- """ZIP/Postal code"""
2618
- zip: String
3284
+ """Second line of street address"""
3285
+ streetLine2: String
2619
3286
  }
2620
3287
 
2621
- """Input for mailing address"""
2622
- input MailingAddressInput {
2623
- """First line of address"""
2624
- address1: String
3288
+ """Paginated mailing addresses (Relay Connection)"""
3289
+ type MailingAddressConnection {
3290
+ """Address edges with cursors"""
3291
+ edges: [MailingAddressEdge!]!
3292
+
3293
+ """Address nodes (shortcut for edges.map(e => e.node))"""
3294
+ nodes: [MailingAddress!]!
3295
+
3296
+ """Pagination info"""
3297
+ pageInfo: PageInfo!
3298
+
3299
+ """Total count of addresses"""
3300
+ totalCount: Int!
3301
+ }
3302
+
3303
+ """Edge in a MailingAddress connection"""
3304
+ type MailingAddressEdge {
3305
+ """Cursor for pagination"""
3306
+ cursor: String!
2625
3307
 
2626
- """Second line of address"""
2627
- address2: String
3308
+ """MailingAddress node"""
3309
+ node: MailingAddress!
3310
+ }
2628
3311
 
3312
+ """Input for mailing address"""
3313
+ input MailingAddressInput {
2629
3314
  """City"""
2630
3315
  city: String
2631
3316
 
2632
3317
  """Company"""
2633
3318
  company: String
2634
3319
 
2635
- """Country code (ISO)"""
2636
- country: String
3320
+ """ISO 3166-1 alpha-2 country code"""
3321
+ country: CountryCode
2637
3322
 
2638
3323
  """First name"""
2639
3324
  firstName: String
@@ -2644,11 +3329,26 @@ input MailingAddressInput {
2644
3329
  """Phone"""
2645
3330
  phone: String
2646
3331
 
2647
- """Province/State"""
2648
- province: String
3332
+ """Postal / ZIP code"""
3333
+ postalCode: String
3334
+
3335
+ """State / province"""
3336
+ state: String
2649
3337
 
2650
- """ZIP/Postal code"""
2651
- zip: String
3338
+ """First line of street address"""
3339
+ streetLine1: String
3340
+
3341
+ """Second line of street address"""
3342
+ streetLine2: String
3343
+ }
3344
+
3345
+ """
3346
+ Email marketing opt-in level — SINGLE_OPT_IN, CONFIRMED_OPT_IN, UNKNOWN.
3347
+ """
3348
+ enum MarketingOptInLevel {
3349
+ CONFIRMED_OPT_IN
3350
+ SINGLE_OPT_IN
3351
+ UNKNOWN
2652
3352
  }
2653
3353
 
2654
3354
  """Navigation menu"""
@@ -2662,9 +3362,6 @@ type Menu {
2662
3362
  """Top-level menu items"""
2663
3363
  items: [MenuItem!]!
2664
3364
 
2665
- """The count of top-level items on the menu (equal to items.length)"""
2666
- itemsCount: Int!
2667
-
2668
3365
  """Menu title"""
2669
3366
  title: String!
2670
3367
  }
@@ -2697,7 +3394,7 @@ type MenuItem {
2697
3394
  """
2698
3395
  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.
2699
3396
  """
2700
- url: String
3397
+ url: URL
2701
3398
  }
2702
3399
 
2703
3400
  union MenuItemResource = Category | Collection | Product | ShopPage
@@ -2718,142 +3415,197 @@ enum MenuItemType {
2718
3415
  """Monetary value with currency"""
2719
3416
  type Money {
2720
3417
  """Decimal money amount"""
2721
- amount: String!
3418
+ amount: Decimal!
2722
3419
 
2723
- """Currency code (ISO 4217)"""
2724
- currencyCode: String!
3420
+ """ISO 4217 currency code"""
3421
+ currencyCode: CurrencyCode!
2725
3422
  }
2726
3423
 
2727
3424
  type Mutation {
2728
- """Update cart attributes"""
2729
- cartAttributesUpdate(attributes: [CartAttributeInput!]!, cartId: ID!): CartAttributesUpdatePayload!
3425
+ """Add lines to cart"""
3426
+ cartAddLines(id: ID!, lines: [CartLineInput!]!): CartAddLinesPayload!
2730
3427
 
2731
- """Update buyer identity"""
2732
- cartBuyerIdentityUpdate(buyerIdentity: CartBuyerIdentityInput!, cartId: ID!): CartBuyerIdentityUpdatePayload!
3428
+ """Apply discount codes"""
3429
+ cartApplyDiscountCodes(discountCodes: [String!]!, id: ID!): CartApplyDiscountCodesPayload!
2733
3430
 
2734
3431
  """Create new cart"""
2735
3432
  cartCreate(input: CartCreateInput): CartCreatePayload!
2736
3433
 
2737
- """Update discount codes"""
2738
- cartDiscountCodesUpdate(cartId: ID!, discountCodes: [String!]!): CartDiscountCodesUpdatePayload!
3434
+ """Remove lines from cart"""
3435
+ cartRemoveLines(id: ID!, lineIds: [ID!]!): CartRemoveLinesPayload!
2739
3436
 
2740
- """Add lines to cart"""
2741
- cartLinesAdd(cartId: ID!, lines: [CartLineInput!]!): CartLinesAddPayload!
3437
+ """Update cart attributes"""
3438
+ cartUpdateAttributes(attributes: [CartAttributeInput!]!, id: ID!): CartUpdateAttributesPayload!
2742
3439
 
2743
- """Remove lines from cart"""
2744
- cartLinesRemove(cartId: ID!, lineIds: [ID!]!): CartLinesRemovePayload!
3440
+ """Update buyer identity"""
3441
+ cartUpdateBuyerIdentity(buyerIdentity: CartBuyerIdentityInput!, id: ID!): CartUpdateBuyerIdentityPayload!
2745
3442
 
2746
3443
  """Update cart lines"""
2747
- cartLinesUpdate(cartId: ID!, lines: [CartLineUpdateInput!]!): CartLinesUpdatePayload!
3444
+ cartUpdateLines(id: ID!, lines: [CartLineUpdateInput!]!): CartUpdateLinesPayload!
2748
3445
 
2749
3446
  """Update cart note"""
2750
- cartNoteUpdate(cartId: ID!, note: String!): CartNoteUpdatePayload!
3447
+ cartUpdateNote(id: ID!, note: String!): CartUpdateNotePayload!
2751
3448
 
2752
- """Update checkout billing address"""
2753
- checkoutBillingAddressUpdate(billingAddress: CheckoutAddressInput!, checkoutId: ID!): CheckoutBillingAddressUpdatePayload!
3449
+ """Apply discount code to checkout"""
3450
+ checkoutApplyDiscountCode(discountCode: String!, id: ID!): CheckoutApplyDiscountCodePayload!
3451
+
3452
+ """Apply gift card to checkout"""
3453
+ checkoutApplyGiftCard(giftCardCode: String!, id: ID!): CheckoutApplyGiftCardPayload!
2754
3454
 
2755
3455
  """Complete checkout and create order"""
2756
- checkoutComplete(checkoutId: ID!, input: CheckoutCompleteInput): CheckoutCompletePayload!
3456
+ checkoutComplete(id: ID!, input: CheckoutCompleteInput): CheckoutCompletePayload!
2757
3457
 
2758
3458
  """Create new checkout"""
2759
3459
  checkoutCreate(input: CheckoutCreateInput!): CheckoutCreatePayload!
2760
3460
 
2761
- """Apply discount code to checkout"""
2762
- checkoutDiscountCodeApply(checkoutId: ID!, discountCode: String!): CheckoutDiscountCodeApplyPayload!
2763
-
2764
3461
  """Remove discount code from checkout"""
2765
- checkoutDiscountCodeRemove(checkoutId: ID!, discountCode: String!): CheckoutDiscountCodeRemovePayload!
3462
+ checkoutRemoveDiscountCode(discountCode: String!, id: ID!): CheckoutRemoveDiscountCodePayload!
2766
3463
 
2767
- """Validate discount code without applying"""
2768
- checkoutDiscountCodeValidate(checkoutId: ID!, discountCode: String!): CheckoutDiscountCodeValidatePayload!
3464
+ """Remove gift card from checkout"""
3465
+ checkoutRemoveGiftCard(giftCardCode: String!, id: ID!): CheckoutRemoveGiftCardPayload!
2769
3466
 
2770
- """Update checkout email"""
2771
- checkoutEmailUpdate(checkoutId: ID!, email: String!): CheckoutEmailUpdatePayload!
3467
+ """Select payment method for checkout"""
3468
+ checkoutSelectPaymentMethod(id: ID!, paymentMethodId: ID!): CheckoutSelectPaymentMethodPayload!
2772
3469
 
2773
- """Apply gift card to checkout"""
2774
- checkoutGiftCardApply(checkoutId: ID!, giftCardCode: String!): CheckoutGiftCardApplyPayload!
3470
+ """Select shipping rate for checkout"""
3471
+ checkoutSelectShippingRate(
3472
+ id: ID!
2775
3473
 
2776
- """Update gift card recipient info for a line item"""
2777
- checkoutGiftCardRecipientUpdate(input: CheckoutGiftCardRecipientInput!): CheckoutGiftCardRecipientUpdatePayload!
3474
+ """Shipping rate handle/id from checkout.availableShippingRates"""
3475
+ rateId: String!
3476
+ ): CheckoutSelectShippingRatePayload!
2778
3477
 
2779
- """Remove gift card from checkout"""
2780
- checkoutGiftCardRemove(checkoutId: ID!, giftCardCode: String!): CheckoutGiftCardRemovePayload!
3478
+ """Update checkout billing address"""
3479
+ checkoutUpdateBillingAddress(billingAddress: CheckoutAddressInput!, id: ID!): CheckoutUpdateBillingAddressPayload!
2781
3480
 
2782
- """Update checkout payment method"""
2783
- checkoutPaymentMethodUpdate(checkoutId: ID!, paymentMethodId: ID!): CheckoutPaymentMethodUpdatePayload!
3481
+ """Update checkout email"""
3482
+ checkoutUpdateEmail(email: String!, id: ID!): CheckoutUpdateEmailPayload!
3483
+
3484
+ """Update gift card recipient info for a line item"""
3485
+ checkoutUpdateGiftCardRecipient(input: CheckoutGiftCardRecipientInput!): CheckoutUpdateGiftCardRecipientPayload!
2784
3486
 
2785
3487
  """Update checkout shipping address"""
2786
- checkoutShippingAddressUpdate(checkoutId: ID!, shippingAddress: CheckoutAddressInput!): CheckoutShippingAddressUpdatePayload!
3488
+ checkoutUpdateShippingAddress(id: ID!, shippingAddress: CheckoutAddressInput!): CheckoutUpdateShippingAddressPayload!
3489
+
3490
+ """Validate discount code without applying"""
3491
+ checkoutValidateDiscountCode(discountCode: String!, id: ID!): CheckoutValidateDiscountCodePayload!
3492
+
3493
+ """
3494
+ Activate customer account using raw activation token (admin-created flow)
3495
+ """
3496
+ customerActivate(
3497
+ password: String!
2787
3498
 
2788
- """Update checkout shipping method"""
2789
- checkoutShippingLineUpdate(checkoutId: ID!, shippingRateHandle: String!): CheckoutShippingLineUpdatePayload!
3499
+ """Raw activation token from the activation email"""
3500
+ token: String!
3501
+ ): CustomerActivatePayload!
3502
+
3503
+ """Add customer address"""
3504
+ customerAddAddress(address: MailingAddressInput!): CustomerAddAddressPayload!
2790
3505
 
2791
3506
  """Login customer"""
2792
- customerAccessTokenCreate(input: CustomerAccessTokenCreateInput!): CustomerAccessTokenCreatePayload!
3507
+ customerLogin(input: CustomerAccessTokenCreateInput!): CustomerLoginPayload!
2793
3508
 
2794
- """Logout customer"""
2795
- customerAccessTokenDelete(customerAccessToken: String!): CustomerAccessTokenDeletePayload!
3509
+ """Logout customer (clears auth cookie)"""
3510
+ customerLogout: CustomerLogoutPayload!
2796
3511
 
2797
3512
  """Refresh access token"""
2798
- customerAccessTokenRenew(customerAccessToken: String!): CustomerAccessTokenRenewPayload!
3513
+ customerRefreshToken: CustomerRefreshTokenPayload!
2799
3514
 
2800
- """Create customer address"""
2801
- customerAddressCreate(address: MailingAddressInput!, customerAccessToken: String!): CustomerAddressCreatePayload!
3515
+ """Remove customer address"""
3516
+ customerRemoveAddress(id: ID!): CustomerRemoveAddressPayload!
2802
3517
 
2803
- """Delete customer address"""
2804
- customerAddressDelete(customerAccessToken: String!, id: ID!): CustomerAddressDeletePayload!
3518
+ """Request password reset email"""
3519
+ customerRequestPasswordReset(email: String!): CustomerRequestPasswordResetPayload!
2805
3520
 
2806
- """Update customer address"""
2807
- customerAddressUpdate(address: MailingAddressInput!, customerAccessToken: String!, id: ID!): CustomerAddressUpdatePayload!
3521
+ """Reset customer password via signed URL from email"""
3522
+ customerResetPassword(
3523
+ newPassword: String!
2808
3524
 
2809
- """Register new customer"""
2810
- customerCreate(input: CustomerCreateInput!): CustomerCreatePayload!
3525
+ """Raw password-reset token from the password-reset email"""
3526
+ token: String!
3527
+ ): CustomerResetPasswordPayload!
2811
3528
 
2812
3529
  """Set default address"""
2813
- customerDefaultAddressUpdate(addressId: ID!, customerAccessToken: String!): CustomerDefaultAddressUpdatePayload!
3530
+ customerSetDefaultAddress(addressId: ID!): CustomerSetDefaultAddressPayload!
3531
+
3532
+ """Register new customer"""
3533
+ customerSignup(input: CustomerCreateInput!): CustomerSignupPayload!
2814
3534
 
2815
- """Send password reset email"""
2816
- customerRecover(email: String!): CustomerRecoverPayload!
3535
+ """Subscribe an email to the newsletter (guest-friendly, double opt-in)."""
3536
+ customerSubscribeToMarketing(input: CustomerSubscribeToMarketingInput!): SubscribeToMarketingPayload!
2817
3537
 
2818
- """Reset password"""
2819
- customerReset(id: ID!, input: String!, password: String!): CustomerResetPayload!
3538
+ """Unsubscribe an email from the newsletter (guest-friendly, idempotent)."""
3539
+ customerUnsubscribeFromMarketing(input: CustomerUnsubscribeFromMarketingInput!): UnsubscribeFromMarketingPayload!
2820
3540
 
2821
3541
  """Update customer profile"""
2822
- customerUpdate(customer: CustomerUpdateInput!, customerAccessToken: String!): CustomerUpdatePayload!
3542
+ customerUpdate(customer: CustomerUpdateInput!): CustomerUpdatePayload!
3543
+
3544
+ """Update customer address"""
3545
+ customerUpdateAddress(address: MailingAddressInput!, id: ID!): CustomerUpdateAddressPayload!
2823
3546
 
2824
3547
  """Generate or retrieve referral code"""
2825
- generateReferralCode: GenerateReferralCodePayload!
3548
+ loyaltyGenerateReferralCode: GenerateReferralCodePayload!
2826
3549
 
2827
3550
  """Redeem a loyalty reward"""
2828
- redeemLoyaltyReward(input: RedeemRewardInput!): RedeemRewardPayload!
3551
+ loyaltyRedeemReward(input: RedeemRewardInput!): RedeemRewardPayload!
2829
3552
 
2830
3553
  """Cancel a return request"""
2831
- returnCancel(customerAccessToken: String!, id: ID!): ReturnCancelPayload!
3554
+ returnCancel(id: ID!): ReturnCancelPayload!
2832
3555
 
2833
3556
  """Create a return request"""
2834
- returnCreate(customerAccessToken: String!, input: ReturnCreateInput!): ReturnCreatePayload!
3557
+ returnCreate(input: ReturnCreateInput!): ReturnCreatePayload!
2835
3558
 
2836
3559
  """Create a product review"""
2837
3560
  reviewCreate(input: ReviewCreateInput!): ReviewPayload!
2838
3561
 
2839
- """Vote on review helpfulness"""
2840
- reviewVote(isHelpful: Boolean!, reviewId: ID!): ReviewPayload!
3562
+ """
3563
+ Mark review as not helpful (downvote). Replaces any prior vote by same customer.
3564
+ """
3565
+ reviewDownvote(reviewId: ID!): ReviewPayload!
3566
+
3567
+ """
3568
+ Mark review as helpful (upvote). Replaces any prior vote by same customer.
3569
+ """
3570
+ reviewUpvote(reviewId: ID!): ReviewPayload!
2841
3571
 
2842
3572
  """Add item to wishlist"""
2843
- wishlistAddItem(input: WishlistItemInput!, wishlistId: ID!): WishlistPayload!
3573
+ wishlistAddItem(id: ID!, input: WishlistItemInput!): WishlistPayload!
2844
3574
 
2845
3575
  """Create a new wishlist"""
2846
3576
  wishlistCreate(input: WishlistCreateInput!): WishlistPayload!
2847
3577
 
2848
3578
  """Delete a wishlist"""
2849
- wishlistDelete(wishlistId: ID!): WishlistPayload!
3579
+ wishlistDelete(id: ID!): WishlistPayload!
2850
3580
 
2851
3581
  """Remove item from wishlist"""
2852
- wishlistRemoveItem(itemId: ID!, wishlistId: ID!): WishlistPayload!
3582
+ wishlistRemoveItem(id: ID!, itemId: ID!): WishlistPayload!
3583
+ }
3584
+
3585
+ """GraphQL Node interface — universal ID-based lookup"""
3586
+ interface Node {
3587
+ """Globally-unique identifier"""
3588
+ id: ID!
3589
+ }
3590
+
3591
+ """
3592
+ Type discriminator dla node()/nodes() queries (UUID nie zawiera type prefix)
3593
+ """
3594
+ enum NodeType {
3595
+ ARTICLE
3596
+ CART
3597
+ CATEGORY
3598
+ COLLECTION
3599
+ CUSTOMER
3600
+ MAILING_ADDRESS
3601
+ ORDER
3602
+ PAGE
3603
+ PRODUCT
3604
+ PRODUCT_VARIANT
2853
3605
  }
2854
3606
 
2855
3607
  """Customer order summary"""
2856
- type Order {
3608
+ type Order implements Node {
2857
3609
  """When order was cancelled"""
2858
3610
  cancelledAt: DateTime
2859
3611
 
@@ -2863,9 +3615,6 @@ type Order {
2863
3615
  """When order expired"""
2864
3616
  expiredAt: DateTime
2865
3617
 
2866
- """Financial status"""
2867
- financialStatus: OrderFinancialStatus!
2868
-
2869
3618
  """Fulfillment status"""
2870
3619
  fulfillmentStatus: OrderFulfillmentStatus!
2871
3620
 
@@ -2873,13 +3622,16 @@ type Order {
2873
3622
  id: ID!
2874
3623
 
2875
3624
  """Line items count"""
2876
- lineItemsCount: Int!
3625
+ itemCount: Int!
2877
3626
 
2878
3627
  """Order number (human-readable)"""
2879
3628
  orderNumber: String!
2880
3629
 
2881
- """Order date"""
2882
- processedAt: String!
3630
+ """Payment status"""
3631
+ paymentStatus: OrderPaymentStatus!
3632
+
3633
+ """Order date (ISO 8601)"""
3634
+ processedAt: DateTime!
2883
3635
 
2884
3636
  """Order shipments"""
2885
3637
  shipments: [Shipment!]!
@@ -2890,17 +3642,8 @@ type Order {
2890
3642
  """Order lifecycle status"""
2891
3643
  status: StorefrontOrderStatus!
2892
3644
 
2893
- """Order subtotal"""
2894
- subtotalPrice: Money!
2895
-
2896
- """Order total"""
2897
- totalPrice: Money!
2898
-
2899
- """Total shipping"""
2900
- totalShipping: Money
2901
-
2902
- """Total tax"""
2903
- totalTax: Money
3645
+ """Cost totals breakdown (subtotal/total/totalTax/totalShipping)"""
3646
+ totals: OrderTotals!
2904
3647
  }
2905
3648
 
2906
3649
  """Paginated order connection"""
@@ -2924,8 +3667,20 @@ type OrderEdge {
2924
3667
  node: Order!
2925
3668
  }
2926
3669
 
2927
- """Financial status of an order"""
2928
- enum OrderFinancialStatus {
3670
+ """Fulfillment status of an order"""
3671
+ enum OrderFulfillmentStatus {
3672
+ DELIVERED
3673
+ FULFILLED
3674
+ IN_TRANSIT
3675
+ LOST
3676
+ PARTIALLY_FULFILLED
3677
+ PARTIALLY_RETURNED
3678
+ RETURNED
3679
+ UNFULFILLED
3680
+ }
3681
+
3682
+ """Payment status of an order"""
3683
+ enum OrderPaymentStatus {
2929
3684
  AUTHORIZED
2930
3685
  CHARGEBACK
2931
3686
  FAILED
@@ -2939,16 +3694,19 @@ enum OrderFinancialStatus {
2939
3694
  VOIDED
2940
3695
  }
2941
3696
 
2942
- """Fulfillment status of an order"""
2943
- enum OrderFulfillmentStatus {
2944
- DELIVERED
2945
- FULFILLED
2946
- IN_TRANSIT
2947
- LOST
2948
- PARTIALLY_FULFILLED
2949
- PARTIALLY_RETURNED
2950
- RETURNED
2951
- UNFULFILLED
3697
+ """Order cost totals breakdown"""
3698
+ type OrderTotals {
3699
+ """Order subtotal (before tax and shipping)"""
3700
+ subtotal: Money!
3701
+
3702
+ """Order total (after tax and shipping)"""
3703
+ total: Money!
3704
+
3705
+ """Total shipping cost"""
3706
+ totalShipping: Money
3707
+
3708
+ """Total tax amount"""
3709
+ totalTax: Money
2952
3710
  }
2953
3711
 
2954
3712
  """Package dimensions for rate calculation"""
@@ -3030,6 +3788,23 @@ enum PaymentMethodType {
3030
3788
  PAYPAL
3031
3789
  }
3032
3790
 
3791
+ """Shop payment configuration (currency, country, providers)"""
3792
+ type PaymentSettings {
3793
+ """Country code sklepu — driver dostępności metod płatności"""
3794
+ countryCode: CountryCode!
3795
+
3796
+ """Primary currency użyty do procesowania płatności"""
3797
+ currencyCode: CurrencyCode!
3798
+
3799
+ """Waluty displayable on storefront (Money.currencyCode allowlist)"""
3800
+ enabledPresentmentCurrencies: [CurrencyCode!]!
3801
+
3802
+ """
3803
+ Kody aktywnych payment providerów dla tego sklepu (z IntegrationProvider table, type=PAYMENT). Np. ["payu", "cash_on_delivery"]. Storefront-dev używa do warunkowania UI checkout.
3804
+ """
3805
+ paymentProviders: [String!]!
3806
+ }
3807
+
3033
3808
  """Points estimate for an order"""
3034
3809
  type PointsEstimate {
3035
3810
  """Base points to earn"""
@@ -3045,6 +3820,15 @@ type PointsEstimate {
3045
3820
  totalPoints: Int!
3046
3821
  }
3047
3822
 
3823
+ """Predictive search result for typeahead UI"""
3824
+ type PredictiveSearchResult {
3825
+ """Top matching products (FTS-ranked)"""
3826
+ products: [Product!]!
3827
+
3828
+ """Top product title suggestions with highlighted query matches"""
3829
+ queries: [SearchQuerySuggestion!]!
3830
+ }
3831
+
3048
3832
  """Price with full conversion transparency"""
3049
3833
  type PriceMoney {
3050
3834
  """Price amount in display currency"""
@@ -3081,6 +3865,15 @@ type PriceRange {
3081
3865
  min: Money!
3082
3866
  }
3083
3867
 
3868
+ """Price range filter (major units)"""
3869
+ input PriceRangeFilter {
3870
+ """Maximum price (major units)"""
3871
+ max: Float
3872
+
3873
+ """Minimum price (major units, e.g. 50.0 PLN)"""
3874
+ min: Float
3875
+ }
3876
+
3084
3877
  """Quantity-based pricing tier"""
3085
3878
  type PricingTier {
3086
3879
  """Discount percentage from retail"""
@@ -3097,8 +3890,8 @@ type PricingTier {
3097
3890
  }
3098
3891
 
3099
3892
  """Product - main catalog item"""
3100
- type Product {
3101
- """Assigned AttributeSet ID (Hybrid Magento — shared template fields)"""
3893
+ type Product implements Node {
3894
+ """Assigned AttributeSet ID (shared template fields)"""
3102
3895
  attributeSetId: ID
3103
3896
 
3104
3897
  """
@@ -3106,17 +3899,21 @@ type Product {
3106
3899
  """
3107
3900
  attributes(filter: ProductAttributeFilterInput): [ProductAttributeDefinition!]!
3108
3901
 
3109
- """Whether product is available for sale (any variant in stock)"""
3110
- availableForSale: Boolean!
3111
-
3112
3902
  """Average rating (1-5)"""
3113
3903
  averageRating: Float
3114
3904
 
3115
- """Whether storefront checkout collects recipient data for this product"""
3116
- collectRecipientInfo: Boolean!
3905
+ """
3906
+ Product category (free-text classification, e.g. "Footwear", "Electronics")
3907
+ """
3908
+ category: String
3909
+
3910
+ """
3911
+ Compare-at price range (Money pair). Null gdy żaden variant nie ma compareAtPrice.
3912
+ """
3913
+ compareAtPriceRange: ProductPriceRange
3117
3914
 
3118
- """Compare-at price range in customer preferred currency (auto-converted)"""
3119
- compareAtPriceRange: ConvertedPriceRange
3915
+ """Opt-in: compare-at price range with conversion transparency."""
3916
+ compareAtPriceRangeWithConversion: ConvertedPriceRange
3120
3917
 
3121
3918
  """Creation timestamp"""
3122
3919
  createdAt: DateTime!
@@ -3136,49 +3933,51 @@ type Product {
3136
3933
  """Unique identifier"""
3137
3934
  id: ID!
3138
3935
 
3139
- """All product images"""
3140
- images(first: Float = 10): [Image!]!
3936
+ """Product images (Relay Connection)"""
3937
+ images(after: String, before: String, first: Float, last: Float): ImageConnection!
3938
+
3939
+ """Whether product is available for sale (any variant in stock)"""
3940
+ isAvailable: Boolean!
3941
+
3942
+ """
3943
+ Whether the storefront should offer a direct purchase path (Add to cart / Buy now). Mirrors `visibility === PUBLIC`. BUNDLE_ONLY ("Komponent") products resolve to false — the PDP renders a Komponent banner explaining access is only via configurator.
3944
+ """
3945
+ isPurchasable: Boolean!
3141
3946
 
3142
3947
  """
3143
3948
  Per-product option definitions (Color, Size, …) with their available values. Use these to build a variant picker without aggregating `selectedOptions` manually.
3144
3949
  """
3145
3950
  options: [ProductOption!]!
3146
3951
 
3147
- """Original compare-at price range in shop base currency"""
3148
- originalCompareAtPriceRange: ProductPriceRange
3149
-
3150
- """Original price range in shop base currency"""
3151
- originalPriceRange: ProductPriceRange
3152
-
3153
- """Price range in customer preferred currency (auto-converted)"""
3154
- priceRange: ConvertedPriceRange!
3155
-
3156
- """Product type/category (free text)"""
3157
- productType: String
3952
+ """Price range (Money pair). Default field industry-standard schema."""
3953
+ priceRange: ProductPriceRange!
3158
3954
 
3159
3955
  """
3160
- Whether the storefront should offer a direct purchase path (Add to cart / Buy now). Mirrors `visibility === PUBLIC`. BUNDLE_ONLY ("Komponent") products resolve to false the PDP renders a Komponent banner explaining access is only via configurator.
3956
+ Opt-in: price range with full conversion transparency (exchangeRate, baseCurrency, isConverted). Use dla currency-converter UI gdy customer ma preferred currency inną niż shop base.
3161
3957
  """
3162
- purchasable: Boolean!
3958
+ priceRangeWithConversion: ConvertedPriceRange
3163
3959
 
3164
3960
  """Similar products recommendations"""
3165
3961
  recommendations(first: Int = 4): ProductRecommendations
3166
3962
 
3963
+ """Whether storefront checkout requires recipient data for this product"""
3964
+ requiresRecipientInfo: Boolean!
3965
+
3167
3966
  """Number of reviews"""
3168
3967
  reviewCount: Int
3169
3968
 
3170
3969
  """SEO metadata"""
3171
3970
  seo: SEO
3172
3971
 
3972
+ """Total stock across all variants"""
3973
+ stockTotal: Int
3974
+
3173
3975
  """Product tags"""
3174
3976
  tags: [String!]!
3175
3977
 
3176
3978
  """Product title"""
3177
3979
  title: String!
3178
3980
 
3179
- """Total inventory across all variants"""
3180
- totalInventory: Int
3181
-
3182
3981
  """
3183
3982
  Product type enum (PHYSICAL, DIGITAL, SERVICE, SUBSCRIPTION, GIFT_CARD)
3184
3983
  """
@@ -3187,8 +3986,8 @@ type Product {
3187
3986
  """Last update timestamp"""
3188
3987
  updatedAt: DateTime!
3189
3988
 
3190
- """Product variants"""
3191
- variants(first: Float = 100): [ProductVariant!]!
3989
+ """Product variants (Relay Connection)"""
3990
+ variants(after: String, before: String, first: Float, last: Float): ProductVariantConnection!
3192
3991
 
3193
3992
  """Vendor/brand name"""
3194
3993
  vendor: String
@@ -3200,7 +3999,7 @@ type Product {
3200
3999
  """Product attribute definition (configurator)"""
3201
4000
  type ProductAttributeDefinition {
3202
4001
  """Billing mode — BUNDLED | SEPARATE_LINE; null = informational only"""
3203
- billingMode: String
4002
+ billingMode: AttributeBillingMode
3204
4003
 
3205
4004
  """Customer-facing description"""
3206
4005
  description: String
@@ -3209,7 +4008,7 @@ type ProductAttributeDefinition {
3209
4008
  displayOrder: Int!
3210
4009
 
3211
4010
  """Filling mode — MERCHANT | CUSTOMER | BOTH"""
3212
- fillingMode: String!
4011
+ fillingMode: AttributeFillingMode!
3213
4012
 
3214
4013
  """Definition ID"""
3215
4014
  id: ID!
@@ -3252,7 +4051,7 @@ input ProductAttributeFilterInput {
3252
4051
  """
3253
4052
  Filter by filling mode — MERCHANT | CUSTOMER | BOTH (configurator UI uses CUSTOMER + BOTH)
3254
4053
  """
3255
- fillingMode: String
4054
+ fillingMode: AttributeFillingMode
3256
4055
  }
3257
4056
 
3258
4057
  """Selectable option of a product attribute (configurator)"""
@@ -3288,7 +4087,7 @@ type ProductAttributeOption {
3288
4087
  surchargeAmount: Int
3289
4088
 
3290
4089
  """Surcharge type — FIXED | PERCENT (Faza 2)"""
3291
- surchargeType: String
4090
+ surchargeType: AttributeOptionSurchargeType
3292
4091
 
3293
4092
  """Internal value (slug-style)"""
3294
4093
  value: String!
@@ -3296,9 +4095,17 @@ type ProductAttributeOption {
3296
4095
 
3297
4096
  """Paginated product list"""
3298
4097
  type ProductConnection {
3299
- """Product edges"""
4098
+ """Product edges with cursors"""
3300
4099
  edges: [ProductEdge!]!
3301
4100
 
4101
+ """
4102
+ Faceted filters driven by current result set. Use FilterValue.input to construct refinement queries.
4103
+ """
4104
+ filters: [Filter!]!
4105
+
4106
+ """Product nodes (shortcut for edges.map(e => e.node))"""
4107
+ nodes: [Product!]!
4108
+
3302
4109
  """Pagination info"""
3303
4110
  pageInfo: PageInfo!
3304
4111
 
@@ -3315,52 +4122,49 @@ type ProductEdge {
3315
4122
  node: Product!
3316
4123
  }
3317
4124
 
3318
- """Product filter options"""
3319
- input ProductFilterInput {
3320
- """Dynamic attribute filters (Requirements: R35.12, R35.13, R35.14)"""
4125
+ """Single product filter"""
4126
+ input ProductFilter {
4127
+ """
4128
+ DoSwiftly: dynamic attribute filters (configurator system). Product/variant metafield filters will be added in Wave 5.
4129
+ """
3321
4130
  attributes: [AttributeFilterInput!]
3322
4131
 
3323
- """Filter by availability"""
4132
+ """Filter by availability for sale"""
3324
4133
  available: Boolean
3325
4134
 
3326
- """
3327
- Filter by category ID (supports comma-separated UUIDs for multi-category)
3328
- """
3329
- categoryId: ID
4135
+ """Filter by category"""
4136
+ category: CategoryFilter
3330
4137
 
3331
4138
  """
3332
- Filter by collection ID (supports comma-separated UUIDs for multi-collection)
4139
+ DoSwiftly: filter by collection ID (supports comma-separated UUIDs). Use Collection.products(filters) for collection-scoped queries.
3333
4140
  """
3334
4141
  collectionId: ID
3335
4142
 
3336
- """Filter by maximum price"""
3337
- maxPrice: Float
4143
+ """Filter by variant price range"""
4144
+ price: PriceRangeFilter
3338
4145
 
3339
- """Filter by minimum price"""
3340
- minPrice: Float
4146
+ """
4147
+ Filter by product category (free-text classification, stored on Product.category). Distinct from `category: CategoryFilter` which selects by structured Category entity.
4148
+ """
4149
+ productCategory: String
3341
4150
 
3342
- """Filter by product type"""
3343
- productType: String
4151
+ """
4152
+ Filter by product type enum (PHYSICAL/DIGITAL/SERVICE/SUBSCRIPTION/GIFT_CARD). Distinct from `productCategory` (free-text classification).
4153
+ """
4154
+ productType: ProductTypeEnum
3344
4155
 
3345
- """Filter by product types"""
3346
- productTypes: [String!]
4156
+ """
4157
+ Filter by product vendor (renamed from legacy `vendor` in ProductFilterInput)
4158
+ """
4159
+ productVendor: String
3347
4160
 
3348
- """Filter by tag"""
4161
+ """Filter by product tag"""
3349
4162
  tag: String
3350
4163
 
3351
- """Filter by tags"""
3352
- tags: [String!]
3353
-
3354
4164
  """
3355
- Filter by per-product variant options (e.g. Color=Red, Size=M). Multiple entries are combined with AND across different option names and OR within the same name. Matching is case-insensitive. Shopify parity.
4165
+ Filter by single variant option (e.g. Color=Red). For multi-value filtering use multiple ProductFilter entries.
3356
4166
  """
3357
- variantOption: [VariantOptionFilter!]
3358
-
3359
- """Filter by vendor"""
3360
- vendor: String
3361
-
3362
- """Filter by vendor names"""
3363
- vendors: [String!]
4167
+ variantOption: VariantOptionFilter
3364
4168
  }
3365
4169
 
3366
4170
  """Product option"""
@@ -3373,10 +4177,10 @@ type ProductOption {
3373
4177
  """Option name (e.g. "Color", "Size")"""
3374
4178
  name: String!
3375
4179
 
3376
- """Sort position among the product's options"""
3377
- position: Int!
4180
+ """Sort order among the product's options"""
4181
+ sortOrder: Int!
3378
4182
 
3379
- """Available values, ordered by position"""
4183
+ """Available values, ordered by sortOrder"""
3380
4184
  values: [ProductOptionValue!]!
3381
4185
  }
3382
4186
 
@@ -3400,8 +4204,8 @@ type ProductOptionValue {
3400
4204
  """Display name (e.g. "Red", "XL")"""
3401
4205
  name: String!
3402
4206
 
3403
- """Sort position (0-based)"""
3404
- position: Int!
4207
+ """Sort order (0-based)"""
4208
+ sortOrder: Int!
3405
4209
  }
3406
4210
 
3407
4211
  """Original price range in shop base currency"""
@@ -3451,7 +4255,7 @@ type ProductReview {
3451
4255
  """Review date"""
3452
4256
  createdAt: DateTime!
3453
4257
 
3454
- """Helpful votes count"""
4258
+ """Helpful votes count (upvotes)"""
3455
4259
  helpfulCount: Int!
3456
4260
  id: ID!
3457
4261
 
@@ -3476,6 +4280,9 @@ type ProductReview {
3476
4280
 
3477
4281
  """Review title"""
3478
4282
  title: String
4283
+
4284
+ """Unhelpful votes count (downvotes)"""
4285
+ unhelpfulCount: Int!
3479
4286
  }
3480
4287
 
3481
4288
  """Paginated reviews connection"""
@@ -3495,10 +4302,13 @@ type ProductReviewEdge {
3495
4302
  enum ProductSortKeys {
3496
4303
  BEST_SELLING
3497
4304
  CREATED_AT
4305
+ ID
3498
4306
  PRICE
4307
+ PRODUCT_TYPE
3499
4308
  RELEVANCE
3500
4309
  TITLE
3501
4310
  UPDATED_AT
4311
+ VENDOR
3502
4312
  }
3503
4313
 
3504
4314
  """Product type classification"""
@@ -3512,14 +4322,19 @@ enum ProductTypeEnum {
3512
4322
 
3513
4323
  """Product variant - purchasable unit"""
3514
4324
  type ProductVariant {
3515
- """Whether variant is available for purchase"""
3516
- available: Boolean!
4325
+ """
4326
+ Available stock (computed: stock - reserved). Null when track is disabled.
4327
+ """
4328
+ availableStock: Int
3517
4329
 
3518
4330
  """Barcode"""
3519
4331
  barcode: String
3520
4332
 
3521
- """Compare at price in customer preferred currency"""
3522
- compareAtPrice: PriceMoney
4333
+ """Compare at price (Money). Null gdy variant nie jest na promocji."""
4334
+ compareAtPrice: Money
4335
+
4336
+ """Opt-in: compare-at price with conversion transparency."""
4337
+ compareAtPriceWithConversion: PriceMoney
3523
4338
 
3524
4339
  """Unique identifier"""
3525
4340
  id: ID!
@@ -3527,20 +4342,16 @@ type ProductVariant {
3527
4342
  """Variant image"""
3528
4343
  image: Image
3529
4344
 
3530
- """Original compare at price in shop base currency"""
3531
- originalCompareAtPrice: Money
3532
-
3533
- """Original price in shop base currency"""
3534
- originalPrice: Money
3535
-
3536
- """Position in product variants list"""
3537
- position: Int
4345
+ """Whether variant is available for purchase"""
4346
+ isAvailable: Boolean!
3538
4347
 
3539
- """Price in customer preferred currency (auto-converted)"""
3540
- price: PriceMoney!
4348
+ """Variant price (Money). Default field — industry-standard schema."""
4349
+ price: Money!
3541
4350
 
3542
- """Quantity available in stock"""
3543
- quantityAvailable: Int
4351
+ """
4352
+ Opt-in: price with full conversion transparency. Use dla currency-converter UI.
4353
+ """
4354
+ priceWithConversion: PriceMoney
3544
4355
 
3545
4356
  """Selected options for this variant"""
3546
4357
  selectedOptions: [SelectedOption!]!
@@ -3548,8 +4359,11 @@ type ProductVariant {
3548
4359
  """SKU code"""
3549
4360
  sku: String
3550
4361
 
4362
+ """Sort order among product variants"""
4363
+ sortOrder: Int
4364
+
3551
4365
  """
3552
- Per-location stock availability (Shopify StoreAvailability parity). Null for single-location shops. Resolved by StoreAvailabilityResolver with `near`, `locationType`, and `@inContext(preferredLocationId)` support.
4366
+ Per-location stock availability. Null for single-location shops. Resolved by StoreAvailabilityResolver with `near`, `locationType`, and `@inContext(preferredLocationId)` support.
3553
4367
  """
3554
4368
  storeAvailability(
3555
4369
  """Cursor for pagination"""
@@ -3558,7 +4372,7 @@ type ProductVariant {
3558
4372
  """Number of locations to return"""
3559
4373
  first: Int! = 10
3560
4374
 
3561
- """Filter by location type (DoSwiftly extension beyond Shopify parity)"""
4375
+ """Filter by location type (DoSwiftly extension)"""
3562
4376
  locationType: LocationType
3563
4377
 
3564
4378
  """Sort locations by proximity to these coordinates"""
@@ -3568,8 +4382,32 @@ type ProductVariant {
3568
4382
  """Variant title (e.g., "Large / Red")"""
3569
4383
  title: String!
3570
4384
 
3571
- """Weight in grams"""
3572
- weight: Float
4385
+ """Variant weight (canonical unit GRAMS — Prisma stores integer grams)"""
4386
+ weight: Weight
4387
+ }
4388
+
4389
+ """Paginated list of product variants (Relay Connection)"""
4390
+ type ProductVariantConnection {
4391
+ """Variant edges with cursors"""
4392
+ edges: [ProductVariantEdge!]!
4393
+
4394
+ """Variant nodes (shortcut for edges.map(e => e.node))"""
4395
+ nodes: [ProductVariant!]!
4396
+
4397
+ """Pagination info"""
4398
+ pageInfo: PageInfo!
4399
+
4400
+ """Total count of variants"""
4401
+ totalCount: Int!
4402
+ }
4403
+
4404
+ """Edge in a ProductVariant connection"""
4405
+ type ProductVariantEdge {
4406
+ """Cursor for pagination"""
4407
+ cursor: String!
4408
+
4409
+ """Variant node"""
4410
+ node: ProductVariant!
3573
4411
  }
3574
4412
 
3575
4413
  """Catalog placement — PUBLIC | HIDDEN | BUNDLE_ONLY (Faza 1.5)"""
@@ -3583,9 +4421,6 @@ type Query {
3583
4421
  """List of all currencies supported by the system (ECB rates)"""
3584
4422
  allSupportedCurrencies: [Currency!]!
3585
4423
 
3586
- """Get available filters for product listing"""
3587
- availableFilters(input: AvailableFiltersInput): AvailableFilters!
3588
-
3589
4424
  """Get available payment methods"""
3590
4425
  availablePaymentMethods: AvailablePaymentMethods!
3591
4426
 
@@ -3643,13 +4478,6 @@ type Query {
3643
4478
  """Get cart by ID"""
3644
4479
  cart(id: ID!): Cart
3645
4480
 
3646
- """Get recommendations based on cart contents"""
3647
- cartRecommendations(
3648
- """Cart ID to base recommendations on"""
3649
- cartId: String!
3650
- first: Int = 4
3651
- ): CartRecommendations!
3652
-
3653
4481
  """Get category tree"""
3654
4482
  categories(
3655
4483
  """Cursor for pagination"""
@@ -3725,14 +4553,14 @@ type Query {
3725
4553
  code: String!
3726
4554
  ): Currency
3727
4555
 
3728
- """Get authenticated customer"""
3729
- customer(customerAccessToken: String!): Customer
4556
+ """Get authenticated customer (cookie / Authorization Bearer)"""
4557
+ customer: Customer
3730
4558
 
3731
4559
  """Get available customer groups"""
3732
4560
  customerGroups: [CustomerGroup!]
3733
4561
 
3734
4562
  """Get single order for authenticated customer"""
3735
- customerOrder(customerAccessToken: String!, orderId: ID!): Order
4563
+ customerOrder(orderId: ID!): Order
3736
4564
 
3737
4565
  """Estimate points for an order amount"""
3738
4566
  estimatePoints(
@@ -3749,8 +4577,8 @@ type Query {
3749
4577
  to: String!
3750
4578
  ): ExchangeRate
3751
4579
 
3752
- """Get gift card by code"""
3753
- giftCard(code: String!): GiftCardPayload!
4580
+ """Get gift card by code (null if not found)"""
4581
+ giftCard(code: String!): GiftCard
3754
4582
 
3755
4583
  """Validate gift card for use"""
3756
4584
  giftCardValidate(amount: Float, code: String!): GiftCardValidatePayload!
@@ -3758,6 +4586,9 @@ type Query {
3758
4586
  """Get available languages for this shop"""
3759
4587
  languages: [Language!]!
3760
4588
 
4589
+ """Localization context (kraje, języki, aktualny kraj/język klienta)"""
4590
+ localization: Localization!
4591
+
3761
4592
  """
3762
4593
  Fetch a single active location by ID. Returns null when missing, inactive, or owned by another shop (tenant isolation via StorefrontShopGuard).
3763
4594
  """
@@ -3767,7 +4598,7 @@ type Query {
3767
4598
  ): Location
3768
4599
 
3769
4600
  """
3770
- Paginated locations for the current shop (Shopify parity). Supports proximity (`near`), pickup-only filter (`hasPickupEnabled`), and `locationType` filter.
4601
+ Paginated locations for the current shop. Supports proximity (`near`), pickup-only filter (`hasPickupEnabled`), and `locationType` filter.
3771
4602
  """
3772
4603
  locations(
3773
4604
  """Cursor for pagination"""
@@ -3804,6 +4635,14 @@ type Query {
3804
4635
  """Get a navigation menu by handle"""
3805
4636
  menu(handle: String!): Menu
3806
4637
 
4638
+ """Universal ID-based lookup (Relay Node spec)"""
4639
+ node(id: ID!, type: NodeType!): Node
4640
+
4641
+ """
4642
+ Batch ID-based lookup; same NodeType dla all IDs. Missing/wrong IDs → null entries (preserved length).
4643
+ """
4644
+ nodes(ids: [ID!]!, type: NodeType!): [Node]!
4645
+
3807
4646
  """Get a page by handle or ID"""
3808
4647
  page(
3809
4648
  """Page handle"""
@@ -3831,6 +4670,9 @@ type Query {
3831
4670
  sortKey: PageSortKeys! = TITLE
3832
4671
  ): ShopPageConnection!
3833
4672
 
4673
+ """Get personalized product recommendations for the current customer"""
4674
+ personalizedRecommendations(first: Int = 10): ProductRecommendations!
4675
+
3834
4676
  """Get single product by ID or handle"""
3835
4677
  product(
3836
4678
  """Product handle (slug)"""
@@ -3840,6 +4682,11 @@ type Query {
3840
4682
  id: ID
3841
4683
  ): Product
3842
4684
 
4685
+ """
4686
+ Get available filters for product listing (renamed from availableFilters in Storefront 5.0)
4687
+ """
4688
+ productFilters(input: AvailableFiltersInput): AvailableFilters!
4689
+
3843
4690
  """Get recommended products similar to the given product"""
3844
4691
  productRecommendations(
3845
4692
  """Type of recommendations (SIMILAR, COMPLEMENTARY, UPSELL)"""
@@ -3855,62 +4702,84 @@ type Query {
3855
4702
  """Get product reviews"""
3856
4703
  productReviews(after: String, first: Int = 10, productId: ID!, reverse: Boolean = true, sortKey: ReviewSortKey = CREATED_AT): ProductReviewConnection!
3857
4704
 
3858
- """Search products"""
3859
- productSearch(
3860
- """Cursor for pagination"""
3861
- after: String
3862
-
3863
- """Filter options"""
3864
- filters: ProductFilterInput
3865
-
3866
- """Number of items to fetch"""
3867
- first: Int! = 20
3868
-
3869
- """Search query"""
3870
- query: String!
3871
- ): ProductConnection!
3872
-
3873
4705
  """List products with pagination and filtering"""
3874
4706
  products(
3875
- """Cursor for pagination"""
4707
+ """Cursor for forward pagination"""
3876
4708
  after: String
3877
4709
 
3878
- """Product filters"""
3879
- filters: ProductFilterInput
4710
+ """Cursor for backward pagination"""
4711
+ before: String
3880
4712
 
3881
- """Number of items to fetch"""
3882
- first: Int! = 20
4713
+ """Array of ProductFilter objects (multi-filter pattern)"""
4714
+ filters: [ProductFilter!]
3883
4715
 
3884
- """Search query"""
4716
+ """Number of items to fetch (forward pagination, max 100)"""
4717
+ first: Int
4718
+
4719
+ """Number of items to fetch (backward pagination, max 100)"""
4720
+ last: Int
4721
+
4722
+ """
4723
+ Search query (syntax: tag:, product_type:, vendor:, available_for_sale:, variants.price:>10, AND/OR/NOT)
4724
+ """
3885
4725
  query: String
3886
4726
 
3887
4727
  """Reverse sort order"""
3888
4728
  reverse: Boolean! = false
3889
4729
 
3890
4730
  """Sort key"""
3891
- sortKey: ProductSortKeys = BEST_SELLING
4731
+ sortKey: ProductSortKeys = RELEVANCE
3892
4732
  ): ProductConnection!
3893
4733
 
3894
- """Get personalized product recommendations"""
3895
- recommendations(first: Int = 10): ProductRecommendations!
3896
-
3897
4734
  """Get referral program statistics"""
3898
4735
  referralStats: ReferralStats
3899
4736
 
3900
4737
  """Get return by ID"""
3901
- return(customerAccessToken: String!, id: ID!): ReturnPayload!
4738
+ return(id: ID!): ReturnPayload!
3902
4739
 
3903
4740
  """Get available return reasons"""
3904
4741
  returnReasons: [ReturnReasonOption!]!
3905
4742
 
3906
4743
  """Get returns for an order"""
3907
- returnsByOrder(customerAccessToken: String!, orderId: ID!): ReturnConnection!
4744
+ returnsByOrder(orderId: ID!): ReturnConnection!
3908
4745
 
3909
4746
  """Get product review statistics"""
3910
4747
  reviewStats(productId: ID!): ReviewStats!
3911
4748
 
4749
+ """Search products (DoSwiftly alias for products() with required query)"""
4750
+ searchProducts(
4751
+ """Cursor for forward pagination"""
4752
+ after: String
4753
+
4754
+ """Cursor for backward pagination"""
4755
+ before: String
4756
+
4757
+ """Array of ProductFilter objects"""
4758
+ filters: [ProductFilter!]
4759
+
4760
+ """Number of items to fetch (forward pagination)"""
4761
+ first: Int
4762
+
4763
+ """Number of items to fetch (backward pagination)"""
4764
+ last: Int
4765
+
4766
+ """Search query (required)"""
4767
+ query: String!
4768
+ ): ProductConnection!
4769
+
4770
+ """
4771
+ Search suggestions (typeahead) — top-N products + styled query suggestions (Products only). Powered by PostgreSQL FTS with prefix matching for Polish morphology coverage.
4772
+ """
4773
+ searchSuggestions(
4774
+ """Maximum number of products to return (default 10, max 50)"""
4775
+ limit: Int = 10
4776
+
4777
+ """Search query (typeahead input)"""
4778
+ query: String!
4779
+ ): PredictiveSearchResult!
4780
+
3912
4781
  """Get shipment by ID"""
3913
- shipment(customerAccessToken: String!, id: ID!): ShipmentPayload!
4782
+ shipment(id: ID!): ShipmentPayload!
3914
4783
 
3915
4784
  """Get shipment by tracking number"""
3916
4785
  shipmentByTrackingNumber(trackingNumber: String!): ShipmentPayload!
@@ -3921,14 +4790,6 @@ type Query {
3921
4790
  """Get currency configuration for the current shop"""
3922
4791
  shopCurrencyConfig: ShopCurrencyConfig!
3923
4792
 
3924
- """Get products similar to a specific product"""
3925
- similarProducts(
3926
- first: Int = 6
3927
-
3928
- """Product ID to find similar products for"""
3929
- productId: String!
3930
- ): ProductRecommendations!
3931
-
3932
4793
  """Get translations for a language"""
3933
4794
  translations(input: TranslationsInput!): Translations!
3934
4795
 
@@ -3948,7 +4809,13 @@ type Query {
3948
4809
  ): Wishlist
3949
4810
 
3950
4811
  """Get customer wishlists (requires customer auth)"""
3951
- wishlists: [Wishlist!]!
4812
+ wishlists(
4813
+ """Cursor: return items after this cursor"""
4814
+ after: String
4815
+
4816
+ """First N items (1-100)"""
4817
+ first: Int = 20
4818
+ ): WishlistConnection!
3952
4819
  }
3953
4820
 
3954
4821
  """Type of product recommendations to return"""
@@ -3991,8 +4858,8 @@ type RedeemRewardPayload {
3991
4858
  """Whether redemption was successful"""
3992
4859
  success: Boolean!
3993
4860
 
3994
- """Error messages if any"""
3995
- userErrors: [String!]!
4861
+ """Typed user errors"""
4862
+ userErrors: [UserError!]!
3996
4863
  }
3997
4864
 
3998
4865
  """Referral program statistics"""
@@ -4338,6 +5205,15 @@ type SEO {
4338
5205
  title: String
4339
5206
  }
4340
5207
 
5208
+ """Predictive search query suggestion (typeahead)"""
5209
+ type SearchQuerySuggestion {
5210
+ """Suggestion with <mark> highlights matching the query prefix"""
5211
+ styledText: String!
5212
+
5213
+ """Plain text suggestion (product title)"""
5214
+ text: String!
5215
+ }
5216
+
4341
5217
  """Selected product option"""
4342
5218
  type SelectedOption {
4343
5219
  """Option name (e.g., "Size", "Color")"""
@@ -4360,8 +5236,8 @@ type Shipment {
4360
5236
  """When the shipment was delivered"""
4361
5237
  deliveredAt: DateTime
4362
5238
 
4363
- """Estimated delivery date"""
4364
- estimatedDeliveryDate: DateTime
5239
+ """Estimated delivery timestamp"""
5240
+ estimatedDeliveryAt: DateTime
4365
5241
 
4366
5242
  """Tracking events timeline"""
4367
5243
  events: [ShipmentEvent!]
@@ -4496,14 +5372,11 @@ enum ShipmentStatus {
4496
5372
 
4497
5373
  """Address input for shipping calculation"""
4498
5374
  input ShippingAddressInput {
4499
- """Street address line 1"""
4500
- address1: String
4501
-
4502
5375
  """City"""
4503
5376
  city: String
4504
5377
 
4505
- """Country code (ISO 3166-1 alpha-2)"""
4506
- country: String!
5378
+ """ISO 3166-1 alpha-2 country code"""
5379
+ country: CountryCode!
4507
5380
 
4508
5381
  """Email address"""
4509
5382
  email: String
@@ -4517,11 +5390,14 @@ input ShippingAddressInput {
4517
5390
  """Phone number"""
4518
5391
  phone: String
4519
5392
 
4520
- """Postal/ZIP code"""
5393
+ """Postal / ZIP code"""
4521
5394
  postalCode: String
4522
5395
 
4523
- """Province/State/Region"""
4524
- province: String
5396
+ """State / province / region"""
5397
+ state: String
5398
+
5399
+ """First line of street address"""
5400
+ streetLine1: String
4525
5401
  }
4526
5402
 
4527
5403
  """Shipping carrier information"""
@@ -4559,6 +5435,9 @@ type Shop {
4559
5435
  """Bot protection configuration (platform-level)"""
4560
5436
  botProtection: BotProtectionInfo
4561
5437
 
5438
+ """Industry-standard brand metadata (logo + slogan + colors)"""
5439
+ brand: Brand
5440
+
4562
5441
  """Complete branding configuration"""
4563
5442
  branding: ShopBranding
4564
5443
 
@@ -4568,14 +5447,20 @@ type Shop {
4568
5447
  """Contact email address"""
4569
5448
  contactEmail: String
4570
5449
 
5450
+ """Contact information policy"""
5451
+ contactInformation: ShopPolicy
5452
+
4571
5453
  """Contact phone number"""
4572
5454
  contactPhone: String
4573
5455
 
4574
5456
  """Default currency code (ISO 4217)"""
4575
- currencyCode: String!
5457
+ currencyCode: CurrencyCode!
5458
+
5459
+ """Customer account URL (login/orders) — z primaryDomain"""
5460
+ customerAccountUrl: URL
4576
5461
 
4577
- """Default language code"""
4578
- defaultLanguage: String
5462
+ """Default language code (ISO 639-1)"""
5463
+ defaultLanguage: LanguageCode
4579
5464
 
4580
5465
  """Shop description"""
4581
5466
  description: String
@@ -4583,26 +5468,55 @@ type Shop {
4583
5468
  """Shop unique identifier"""
4584
5469
  id: ID!
4585
5470
 
5471
+ """Legal notice / impressum"""
5472
+ legalNotice: ShopPolicy
5473
+
4586
5474
  """Locale to currency mapping for auto-detection (SSOT)"""
4587
5475
  localeToCurrencyMap: [LocaleCurrencyMapping!]!
4588
5476
 
4589
5477
  """Shop logo"""
4590
5478
  logo: Image
4591
5479
 
5480
+ """
5481
+ Money display format z `{{amount}}` placeholder, np. "{{amount}} zł"
5482
+ """
5483
+ moneyFormat: String!
5484
+
4592
5485
  """Shop name"""
4593
5486
  name: String!
4594
5487
 
4595
5488
  """Supported payment currencies"""
4596
- paymentCurrencies: [String!]!
5489
+ paymentCurrencies: [CurrencyCode!]!
5490
+
5491
+ """Payment configuration (currency, accepted cards, digital wallets)"""
5492
+ paymentSettings: PaymentSettings!
5493
+
5494
+ """Primary domain (host + URL + SSL state)"""
5495
+ primaryDomain: Domain!
5496
+
5497
+ """Privacy policy"""
5498
+ privacyPolicy: ShopPolicy
5499
+
5500
+ """Refund / return policy"""
5501
+ refundPolicy: ShopPolicy
4597
5502
 
4598
- """Primary domain URL"""
4599
- primaryDomain: String
5503
+ """Shipping policy"""
5504
+ shippingPolicy: ShopPolicy
5505
+
5506
+ """Countries shop ships to (z shipping zones)"""
5507
+ shipsToCountries: [CountryCode!]!
4600
5508
 
4601
5509
  """Supported currencies for price display"""
4602
- supportedCurrencies: [String!]!
5510
+ supportedCurrencies: [CurrencyCode!]!
5511
+
5512
+ """Supported languages (ISO 639-1)"""
5513
+ supportedLanguages: [LanguageCode!]
5514
+
5515
+ """Terms of sale"""
5516
+ termsOfSale: ShopPolicy
4603
5517
 
4604
- """Supported languages"""
4605
- supportedLanguages: [String!]
5518
+ """Terms of service"""
5519
+ termsOfService: ShopPolicy
4606
5520
 
4607
5521
  """Shop timezone"""
4608
5522
  timezone: String
@@ -4610,23 +5524,23 @@ type Shop {
4610
5524
 
4611
5525
  """Shop physical address"""
4612
5526
  type ShopAddress {
4613
- """Street address line 1"""
4614
- address1: String
4615
-
4616
- """Street address line 2"""
4617
- address2: String
4618
-
4619
5527
  """City"""
4620
5528
  city: String
4621
5529
 
4622
5530
  """Country code (ISO 3166-1 alpha-2)"""
4623
5531
  country: String
4624
5532
 
4625
- """Postal/ZIP code"""
5533
+ """Postal / ZIP code"""
4626
5534
  postalCode: String
4627
5535
 
4628
- """State/Province"""
5536
+ """State / province"""
4629
5537
  state: String
5538
+
5539
+ """First line of street address"""
5540
+ streetLine1: String
5541
+
5542
+ """Second line of street address"""
5543
+ streetLine2: String
4630
5544
  }
4631
5545
 
4632
5546
  """Shop branding configuration"""
@@ -4691,11 +5605,11 @@ type ShopPage {
4691
5605
  """HTML body content"""
4692
5606
  body: String!
4693
5607
 
4694
- """Auto-generated plain text summary"""
4695
- bodySummary: String!
4696
-
4697
5608
  """Created date (ISO 8601)"""
4698
- createdAt: String!
5609
+ createdAt: DateTime!
5610
+
5611
+ """Auto-generated plain text summary"""
5612
+ excerpt: String!
4699
5613
 
4700
5614
  """URL handle"""
4701
5615
  handle: String!
@@ -4704,7 +5618,7 @@ type ShopPage {
4704
5618
  id: ID!
4705
5619
 
4706
5620
  """Publish date (ISO 8601)"""
4707
- publishedAt: String
5621
+ publishedAt: DateTime
4708
5622
 
4709
5623
  """SEO metadata"""
4710
5624
  seo: SEO
@@ -4713,7 +5627,7 @@ type ShopPage {
4713
5627
  title: String!
4714
5628
 
4715
5629
  """Updated date (ISO 8601)"""
4716
- updatedAt: String!
5630
+ updatedAt: DateTime!
4717
5631
  }
4718
5632
 
4719
5633
  """Paginated shop pages"""
@@ -4737,6 +5651,24 @@ type ShopPageEdge {
4737
5651
  node: ShopPage!
4738
5652
  }
4739
5653
 
5654
+ """Shop legal/info policy document"""
5655
+ type ShopPolicy implements Node {
5656
+ """Policy body (markdown)"""
5657
+ body: String!
5658
+
5659
+ """URL-friendly handle (slug)"""
5660
+ handle: String!
5661
+
5662
+ """Globally-unique identifier"""
5663
+ id: ID!
5664
+
5665
+ """Policy title (e.g. "Privacy Policy")"""
5666
+ title: String!
5667
+
5668
+ """Canonical URL on storefront"""
5669
+ url: URL!
5670
+ }
5671
+
4740
5672
  """Shop social media links"""
4741
5673
  type SocialLinks {
4742
5674
  """Facebook page URL"""
@@ -4761,10 +5693,15 @@ type SocialLinks {
4761
5693
  youtube: String
4762
5694
  }
4763
5695
 
4764
- """Per-location stock availability (Shopify StoreAvailability parity)"""
5696
+ """Per-location stock availability"""
4765
5697
  type StoreAvailability {
5698
+ """
5699
+ Available stock at this location (computed: stock - reserved). Token-gated: null for anonymous requests, Int for authenticated customer context.
5700
+ """
5701
+ availableStock: Int
5702
+
4766
5703
  """Whether the variant is in stock at this location"""
4767
- available: Boolean!
5704
+ isAvailable: Boolean!
4768
5705
 
4769
5706
  """Location where this stock resides"""
4770
5707
  location: Location!
@@ -4772,12 +5709,7 @@ type StoreAvailability {
4772
5709
  """
4773
5710
  Human-readable pickup readiness string, localized (e.g., "Usually ready in 2 hours"). Null if location does not support pickup.
4774
5711
  """
4775
- pickUpTime: String
4776
-
4777
- """
4778
- Quantity available at this location. Token-gated: null for anonymous requests, Int for authenticated customer context (Shopify parity).
4779
- """
4780
- quantityAvailable: Int
5712
+ pickupTime: String
4781
5713
  }
4782
5714
 
4783
5715
  """Paginated store availability connection"""
@@ -4813,6 +5745,17 @@ enum StorefrontOrderStatus {
4813
5745
  PROCESSING
4814
5746
  }
4815
5747
 
5748
+ """Payload for customerSubscribeToMarketing mutation"""
5749
+ type SubscribeToMarketingPayload {
5750
+ """
5751
+ Always true (anti-enumeration). Backend may silently skip enqueue if rate-limited or already SUBSCRIBED.
5752
+ """
5753
+ accepted: Boolean!
5754
+
5755
+ """User-facing errors"""
5756
+ userErrors: [UserError!]!
5757
+ }
5758
+
4816
5759
  """Tax line item"""
4817
5760
  type TaxLine {
4818
5761
  """Tax amount"""
@@ -4891,6 +5834,31 @@ input TranslationsInput {
4891
5834
  namespaces: [String!]
4892
5835
  }
4893
5836
 
5837
+ """
5838
+ URL string per RFC 3986 (e.g. "https://shop.example.com/products/foo").
5839
+ """
5840
+ scalar URL
5841
+
5842
+ """Measurement system (metric vs imperial) — wpływa na display formats"""
5843
+ enum UnitSystem {
5844
+ IMPERIAL_SYSTEM
5845
+ METRIC_SYSTEM
5846
+ }
5847
+
5848
+ """
5849
+ Unsigned 64-bit integer, JSON-serialized as String (BigInt-safe). Format: "{integer}".
5850
+ """
5851
+ scalar UnsignedInt64
5852
+
5853
+ """Payload for customerUnsubscribeFromMarketing mutation"""
5854
+ type UnsubscribeFromMarketingPayload {
5855
+ """Always true (anti-enumeration)."""
5856
+ accepted: Boolean!
5857
+
5858
+ """User-facing errors"""
5859
+ userErrors: [UserError!]!
5860
+ }
5861
+
4894
5862
  """URL redirect (SEO, store migration)"""
4895
5863
  type UrlRedirect {
4896
5864
  """Source path"""
@@ -4921,7 +5889,7 @@ type UserError {
4921
5889
  message: String!
4922
5890
  }
4923
5891
 
4924
- """Per-product variant option filter (Color, Size, …)"""
5892
+ """Per-product variant option filter (e.g. Color=Red)"""
4925
5893
  input VariantOptionFilter {
4926
5894
  """Option name (e.g. "Color")"""
4927
5895
  name: String!
@@ -4930,6 +5898,23 @@ input VariantOptionFilter {
4930
5898
  value: String!
4931
5899
  }
4932
5900
 
5901
+ """Weight value with unit"""
5902
+ type Weight {
5903
+ """Weight unit"""
5904
+ unit: WeightUnit!
5905
+
5906
+ """Weight value"""
5907
+ value: Float!
5908
+ }
5909
+
5910
+ """Weight unit (GRAMS canonical, KILOGRAMS/OUNCES/POUNDS for display)"""
5911
+ enum WeightUnit {
5912
+ GRAMS
5913
+ KILOGRAMS
5914
+ OUNCES
5915
+ POUNDS
5916
+ }
5917
+
4933
5918
  """Customer wishlist"""
4934
5919
  type Wishlist {
4935
5920
  """Created date"""
@@ -4955,12 +5940,36 @@ type Wishlist {
4955
5940
  updatedAt: DateTime!
4956
5941
  }
4957
5942
 
5943
+ """Paginated list of wishlists"""
5944
+ type WishlistConnection {
5945
+ """Wishlist edges with cursors"""
5946
+ edges: [WishlistEdge!]!
5947
+
5948
+ """Wishlist nodes (shortcut for edges.map(e => e.node))"""
5949
+ nodes: [Wishlist!]!
5950
+
5951
+ """Pagination info"""
5952
+ pageInfo: PageInfo!
5953
+
5954
+ """Total count of wishlists"""
5955
+ totalCount: Int!
5956
+ }
5957
+
4958
5958
  """Input for creating a wishlist"""
4959
5959
  input WishlistCreateInput {
4960
5960
  isPublic: Boolean = false
4961
5961
  name: String = "My Wishlist"
4962
5962
  }
4963
5963
 
5964
+ """Wishlist edge for pagination"""
5965
+ type WishlistEdge {
5966
+ """Cursor for pagination"""
5967
+ cursor: String!
5968
+
5969
+ """Wishlist node"""
5970
+ node: Wishlist!
5971
+ }
5972
+
4964
5973
  """Wishlist item"""
4965
5974
  type WishlistItem {
4966
5975
  """Date added"""
@@ -4974,7 +5983,7 @@ type WishlistItem {
4974
5983
  notifyOnSale: Boolean!
4975
5984
 
4976
5985
  """Price when added to wishlist"""
4977
- priceAtAdd: Money!
5986
+ priceWhenAdded: Money!
4978
5987
 
4979
5988
  """Product details"""
4980
5989
  product: Product
@@ -4995,7 +6004,7 @@ input WishlistItemInput {
4995
6004
 
4996
6005
  """Wishlist mutation payload"""
4997
6006
  type WishlistPayload {
4998
- """User errors"""
4999
- userErrors: [String!]!
6007
+ """Typed user errors"""
6008
+ userErrors: [UserError!]!
5000
6009
  wishlist: Wishlist
5001
6010
  }