@doswiftly/storefront-operations 5.4.1 → 6.0.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
1571
+
1572
+ """
1573
+ User errors (code is namespaced — e.g. CHECKOUT_NOT_FOUND, CHECKOUT_PAYMENT_FAILED)
1574
+ """
1575
+ userErrors: [UserError!]!
1576
+ }
1430
1577
 
1431
- """Path to error field"""
1432
- field: [String!]!
1578
+ """Checkout email update payload"""
1579
+ type CheckoutUpdateEmailPayload {
1580
+ """Updated checkout"""
1581
+ checkout: Checkout
1433
1582
 
1434
- """Error message"""
1435
- message: String!
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,10 +1999,16 @@ 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!
1583
2012
 
1584
2013
  """Account creation date"""
1585
2014
  createdAt: DateTime!
@@ -1594,10 +2023,7 @@ type Customer {
1594
2023
  email: String!
1595
2024
 
1596
2025
  """Email marketing consent state"""
1597
- emailMarketingState: String!
1598
-
1599
- """Whether email is verified"""
1600
- emailVerified: Boolean!
2026
+ emailMarketing: EmailMarketingState!
1601
2027
 
1602
2028
  """First name"""
1603
2029
  firstName: String
@@ -1605,18 +2031,24 @@ type Customer {
1605
2031
  """Unique identifier"""
1606
2032
  id: ID!
1607
2033
 
2034
+ """Whether email is verified"""
2035
+ isEmailVerified: Boolean!
2036
+
1608
2037
  """Last name"""
1609
2038
  lastName: String
1610
2039
 
2040
+ """Total orders count (UnsignedInt64 — BigInt-safe)"""
2041
+ orderCount: UnsignedInt64!
2042
+
1611
2043
  """Customer orders"""
1612
2044
  orders(after: String, first: Int = 10): OrderConnection!
1613
2045
 
1614
- """Total orders count"""
1615
- ordersCount: Int!
1616
-
1617
2046
  """Phone number"""
1618
2047
  phone: String
1619
2048
 
2049
+ """Customer tags for segmentation (e.g. vip, wholesale, b2b)"""
2050
+ tags: [String!]!
2051
+
1620
2052
  """Total amount spent"""
1621
2053
  totalSpent: Money!
1622
2054
 
@@ -1629,8 +2061,8 @@ type CustomerAccessToken {
1629
2061
  """Access token string"""
1630
2062
  accessToken: String!
1631
2063
 
1632
- """Token expiration"""
1633
- expiresAt: String!
2064
+ """Token expiration (ISO 8601)"""
2065
+ expiresAt: DateTime!
1634
2066
  }
1635
2067
 
1636
2068
  """Input for customer login"""
@@ -1642,60 +2074,30 @@ input CustomerAccessTokenCreateInput {
1642
2074
  password: String!
1643
2075
  }
1644
2076
 
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
- }
2077
+ """
2078
+ Result of customerActivateByUrl mutation — admin-created customer sets initial password
2079
+ """
2080
+ type CustomerActivatePayload {
2081
+ """Activated customer"""
2082
+ customer: Customer
1665
2083
 
1666
- """Result of token renewal"""
1667
- type CustomerAccessTokenRenewPayload {
1668
- """New access token"""
2084
+ """Auto-login access token"""
1669
2085
  customerAccessToken: CustomerAccessToken
1670
2086
 
1671
- """User errors"""
2087
+ """
2088
+ User errors (code is namespaced — e.g. CUSTOMER_NOT_FOUND, CUSTOMER_TOKEN_INVALID, CUSTOMER_PASSWORD_TOO_WEAK)
2089
+ """
1672
2090
  userErrors: [UserError!]!
1673
2091
  }
1674
2092
 
1675
2093
  """Result of address creation"""
1676
- type CustomerAddressCreatePayload {
2094
+ type CustomerAddAddressPayload {
1677
2095
  """Created address"""
1678
2096
  address: MailingAddress
1679
2097
 
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"""
2098
+ """
2099
+ User errors (code is namespaced — e.g. CUSTOMER_NOT_FOUND, CUSTOMER_TOKEN_INVALID, CUSTOMER_PASSWORD_TOO_WEAK)
2100
+ """
1699
2101
  userErrors: [UserError!]!
1700
2102
  }
1701
2103
 
@@ -1717,27 +2119,6 @@ input CustomerCreateInput {
1717
2119
  phone: String
1718
2120
  }
1719
2121
 
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
2122
  """Customer group for B2B pricing"""
1742
2123
  type CustomerGroup {
1743
2124
  """Group code"""
@@ -1759,21 +2140,108 @@ type CustomerGroup {
1759
2140
  taxExempt: Boolean!
1760
2141
  }
1761
2142
 
1762
- """Result of password recovery"""
1763
- type CustomerRecoverPayload {
1764
- """User errors"""
2143
+ """Result of customer login"""
2144
+ type CustomerLoginPayload {
2145
+ """Access token"""
2146
+ customerAccessToken: CustomerAccessToken
2147
+
2148
+ """
2149
+ User errors (code is namespaced — e.g. CUSTOMER_NOT_FOUND, CUSTOMER_TOKEN_INVALID, CUSTOMER_PASSWORD_TOO_WEAK)
2150
+ """
2151
+ userErrors: [UserError!]!
2152
+ }
2153
+
2154
+ """Result of token deletion (logout)"""
2155
+ type CustomerLogoutPayload {
2156
+ """Deleted access token"""
2157
+ deletedAccessToken: String
2158
+
2159
+ """Deleted token ID"""
2160
+ deletedCustomerAccessTokenId: String
2161
+
2162
+ """
2163
+ User errors (code is namespaced — e.g. CUSTOMER_NOT_FOUND, CUSTOMER_TOKEN_INVALID, CUSTOMER_PASSWORD_TOO_WEAK)
2164
+ """
2165
+ userErrors: [UserError!]!
2166
+ }
2167
+
2168
+ """Result of token renewal"""
2169
+ type CustomerRefreshTokenPayload {
2170
+ """New 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 address deletion"""
2180
+ type CustomerRemoveAddressPayload {
2181
+ """Deleted address ID"""
2182
+ deletedAddressId: ID
2183
+
2184
+ """
2185
+ User errors (code is namespaced — e.g. CUSTOMER_NOT_FOUND, CUSTOMER_TOKEN_INVALID, CUSTOMER_PASSWORD_TOO_WEAK)
2186
+ """
2187
+ userErrors: [UserError!]!
2188
+ }
2189
+
2190
+ """Result of password recovery"""
2191
+ type CustomerRequestPasswordResetPayload {
2192
+ """
2193
+ User errors (code is namespaced — e.g. CUSTOMER_NOT_FOUND, CUSTOMER_TOKEN_INVALID, CUSTOMER_PASSWORD_TOO_WEAK)
2194
+ """
2195
+ userErrors: [UserError!]!
2196
+ }
2197
+
2198
+ """Result of customerResetByUrl mutation — password reset via signed URL"""
2199
+ type CustomerResetPasswordPayload {
2200
+ """Customer with reset password"""
2201
+ customer: Customer
2202
+
2203
+ """Auto-login access token"""
2204
+ customerAccessToken: CustomerAccessToken
2205
+
2206
+ """
2207
+ User errors (code is namespaced — e.g. CUSTOMER_NOT_FOUND, CUSTOMER_TOKEN_INVALID, CUSTOMER_PASSWORD_TOO_WEAK)
2208
+ """
1765
2209
  userErrors: [UserError!]!
1766
2210
  }
1767
2211
 
1768
- """Result of password reset"""
1769
- type CustomerResetPayload {
2212
+ """Result of default address update"""
2213
+ type CustomerSetDefaultAddressPayload {
1770
2214
  """Updated customer"""
1771
2215
  customer: Customer
1772
2216
 
1773
- """New access token"""
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 customer creation"""
2224
+ type CustomerSignupPayload {
2225
+ """Created customer"""
2226
+ customer: Customer
2227
+
2228
+ """Access token for new customer"""
1774
2229
  customerAccessToken: CustomerAccessToken
1775
2230
 
1776
- """User errors"""
2231
+ """
2232
+ User errors (code is namespaced — e.g. CUSTOMER_NOT_FOUND, CUSTOMER_TOKEN_INVALID, CUSTOMER_PASSWORD_TOO_WEAK)
2233
+ """
2234
+ userErrors: [UserError!]!
2235
+ }
2236
+
2237
+ """Result of address update"""
2238
+ type CustomerUpdateAddressPayload {
2239
+ """Updated address"""
2240
+ address: MailingAddress
2241
+
2242
+ """
2243
+ User errors (code is namespaced — e.g. CUSTOMER_NOT_FOUND, CUSTOMER_TOKEN_INVALID, CUSTOMER_PASSWORD_TOO_WEAK)
2244
+ """
1777
2245
  userErrors: [UserError!]!
1778
2246
  }
1779
2247
 
@@ -1794,7 +2262,9 @@ type CustomerUpdatePayload {
1794
2262
  """Updated customer"""
1795
2263
  customer: Customer
1796
2264
 
1797
- """User errors"""
2265
+ """
2266
+ User errors (code is namespaced — e.g. CUSTOMER_NOT_FOUND, CUSTOMER_TOKEN_INVALID, CUSTOMER_PASSWORD_TOO_WEAK)
2267
+ """
1798
2268
  userErrors: [UserError!]!
1799
2269
  }
1800
2270
 
@@ -1803,6 +2273,11 @@ A date-time string at UTC, such as 2019-12-03T09:54:33Z, compliant with the date
1803
2273
  """
1804
2274
  scalar DateTime
1805
2275
 
2276
+ """
2277
+ Decimal money amount, JSON-serialized as String. Format: "{int}.{dec}" e.g. "10.50".
2278
+ """
2279
+ scalar Decimal
2280
+
1806
2281
  """Estimated delivery timeframe"""
1807
2282
  type DeliveryEstimate {
1808
2283
  """Human-readable delivery estimate"""
@@ -1847,9 +2322,6 @@ type DiscountApplication {
1847
2322
  """Items affected by this discount (for BXGY type)"""
1848
2323
  affectedItems: [DiscountAffectedItem!]
1849
2324
 
1850
- """Whether discount is applicable"""
1851
- applicable: Boolean!
1852
-
1853
2325
  """Buy quantity for BXGY (e.g., 2 in "Buy 2 Get 1")"""
1854
2326
  buyQuantity: Int
1855
2327
 
@@ -1862,6 +2334,9 @@ type DiscountApplication {
1862
2334
  """Get quantity for BXGY (e.g., 1 in "Buy 2 Get 1")"""
1863
2335
  getQuantity: Int
1864
2336
 
2337
+ """Whether discount is applicable"""
2338
+ isApplicable: Boolean!
2339
+
1865
2340
  """Discount title/description"""
1866
2341
  title: String
1867
2342
 
@@ -1882,11 +2357,11 @@ enum DiscountApplicationType {
1882
2357
 
1883
2358
  """Discount code applied to checkout"""
1884
2359
  type DiscountCode {
1885
- """Whether the code is currently applicable"""
1886
- applicable: Boolean!
1887
-
1888
2360
  """Discount code string"""
1889
2361
  code: String!
2362
+
2363
+ """Whether the code is currently applicable"""
2364
+ isApplicable: Boolean!
1890
2365
  }
1891
2366
 
1892
2367
  """Error codes for discount validation"""
@@ -1940,7 +2415,29 @@ type DiscountValidationResult {
1940
2415
  error: DiscountValidationError
1941
2416
 
1942
2417
  """Whether the discount code is valid"""
1943
- valid: Boolean!
2418
+ isValid: Boolean!
2419
+ }
2420
+
2421
+ """Shop domain (host, full URL, SSL state)"""
2422
+ type Domain {
2423
+ """Host name (e.g. "shop.example.com")"""
2424
+ host: String!
2425
+
2426
+ """Whether HTTPS is enforced"""
2427
+ isSslEnabled: Boolean!
2428
+
2429
+ """Full URL z protocol"""
2430
+ url: URL!
2431
+ }
2432
+
2433
+ """Customer email marketing consent state (Prisma-derived)."""
2434
+ enum EmailMarketingState {
2435
+ INVALID
2436
+ NOT_SUBSCRIBED
2437
+ PENDING
2438
+ REDACTED
2439
+ SUBSCRIBED
2440
+ UNSUBSCRIBED
1944
2441
  }
1945
2442
 
1946
2443
  """Exchange rate between currencies"""
@@ -1961,6 +2458,60 @@ type ExchangeRate {
1961
2458
  updatedAt: DateTime!
1962
2459
  }
1963
2460
 
2461
+ """Faceted filter for product listing"""
2462
+ type Filter {
2463
+ """
2464
+ Unique filter identifier (e.g., "filter.v.option.color", "filter.v.price")
2465
+ """
2466
+ id: ID!
2467
+
2468
+ """Display label (e.g., "Color", "Price", "Availability")"""
2469
+ label: String!
2470
+
2471
+ """Display hint (SWATCH for COLOR, IMAGE for pattern, TEXT default)"""
2472
+ presentation: FilterPresentation
2473
+
2474
+ """Filter type (LIST | PRICE_RANGE | BOOLEAN)"""
2475
+ type: FilterType!
2476
+
2477
+ """Available values for this filter, with product counts"""
2478
+ values: [FilterValue!]!
2479
+ }
2480
+
2481
+ """Filter presentation hint"""
2482
+ enum FilterPresentation {
2483
+ IMAGE
2484
+ SWATCH
2485
+ TEXT
2486
+ }
2487
+
2488
+ """Type of filter"""
2489
+ enum FilterType {
2490
+ BOOLEAN
2491
+ LIST
2492
+ PRICE_RANGE
2493
+ }
2494
+
2495
+ """Filter value with product count"""
2496
+ type FilterValue {
2497
+ """Number of products matching this value in current result set"""
2498
+ count: Int!
2499
+
2500
+ """Unique identifier within filter"""
2501
+ id: ID!
2502
+
2503
+ """
2504
+ Pre-built ProductFilter input — paste verbatim into `filters` arg to refetch with this value applied. Example: `{"variantOption":{"name":"Color","value":"Red"}}`
2505
+ """
2506
+ input: JSON!
2507
+
2508
+ """Display label (e.g., "Red", "Extra Large", "$50 - $200")"""
2509
+ label: String!
2510
+
2511
+ """DoSwiftly: visual swatch (color hex or pattern image)"""
2512
+ swatch: AttributeSwatch
2513
+ }
2514
+
1964
2515
  """Free shipping progress indicator"""
1965
2516
  type FreeShippingProgress {
1966
2517
  """Current cart subtotal"""
@@ -1993,8 +2544,8 @@ type GenerateReferralCodePayload {
1993
2544
  """Whether generation was successful"""
1994
2545
  success: Boolean!
1995
2546
 
1996
- """Error messages if any"""
1997
- userErrors: [String!]!
2547
+ """Typed user errors"""
2548
+ userErrors: [UserError!]!
1998
2549
  }
1999
2550
 
2000
2551
  """Geographic coordinates (latitude/longitude)"""
@@ -2023,10 +2574,9 @@ type GiftCard {
2023
2574
  """Initial gift card amount"""
2024
2575
  initialAmount: Money!
2025
2576
 
2026
- """Last 4 characters of code"""
2027
- lastCharacters: String!
2028
-
2029
- """Gift card code (masked for security)"""
2577
+ """
2578
+ Gift card code (masked for security; client may slice last 4 chars for display)
2579
+ """
2030
2580
  maskedCode: String!
2031
2581
 
2032
2582
  """Personal message"""
@@ -2037,9 +2587,6 @@ type GiftCard {
2037
2587
 
2038
2588
  """Gift card status"""
2039
2589
  status: GiftCardStatus!
2040
-
2041
- """Transaction history"""
2042
- transactions: [GiftCardTransaction!]!
2043
2590
  }
2044
2591
 
2045
2592
  """Gift card validation error"""
@@ -2062,15 +2609,6 @@ enum GiftCardErrorCode {
2062
2609
  NOT_FOUND
2063
2610
  }
2064
2611
 
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
2612
  """Gift card status"""
2075
2613
  enum GiftCardStatus {
2076
2614
  ACTIVE
@@ -2079,27 +2617,6 @@ enum GiftCardStatus {
2079
2617
  USED
2080
2618
  }
2081
2619
 
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
2620
  """Result of gift card validation"""
2104
2621
  type GiftCardValidatePayload {
2105
2622
  """User errors"""
@@ -2121,7 +2638,7 @@ type GiftCardValidation {
2121
2638
  giftCard: GiftCard
2122
2639
 
2123
2640
  """Whether the gift card is valid for use"""
2124
- valid: Boolean!
2641
+ isValid: Boolean!
2125
2642
  }
2126
2643
 
2127
2644
  """Image with URL and metadata"""
@@ -2147,6 +2664,21 @@ type Image {
2147
2664
  width: Int
2148
2665
  }
2149
2666
 
2667
+ """Paginated list of images (Relay Connection)"""
2668
+ type ImageConnection {
2669
+ """Image edges with cursors"""
2670
+ edges: [ImageEdge!]!
2671
+
2672
+ """Image nodes (shortcut for edges.map(e => e.node))"""
2673
+ nodes: [Image!]!
2674
+
2675
+ """Pagination info"""
2676
+ pageInfo: PageInfo!
2677
+
2678
+ """Total count of images"""
2679
+ totalCount: Int!
2680
+ }
2681
+
2150
2682
  """Image content type for output format"""
2151
2683
  enum ImageContentType {
2152
2684
  AVIF
@@ -2155,7 +2687,16 @@ enum ImageContentType {
2155
2687
  WEBP
2156
2688
  }
2157
2689
 
2158
- """Image transform options (Shopify-compatible)"""
2690
+ """Edge in an Image connection"""
2691
+ type ImageEdge {
2692
+ """Cursor for pagination"""
2693
+ cursor: String!
2694
+
2695
+ """Image node"""
2696
+ node: Image!
2697
+ }
2698
+
2699
+ """Image transform options"""
2159
2700
  input ImageTransformInput {
2160
2701
  """Crop region"""
2161
2702
  crop: CropRegion
@@ -2173,6 +2714,11 @@ input ImageTransformInput {
2173
2714
  scale: Int
2174
2715
  }
2175
2716
 
2717
+ """
2718
+ Opaque JSON payload — shape documented per field. Klient parsuje strukturę sam.
2719
+ """
2720
+ scalar JSON
2721
+
2176
2722
  """Language configuration"""
2177
2723
  type Language {
2178
2724
  """Language code (ISO 639-1)"""
@@ -2194,6 +2740,31 @@ type Language {
2194
2740
  nativeName: String!
2195
2741
  }
2196
2742
 
2743
+ """ISO 639-1 language code"""
2744
+ enum LanguageCode {
2745
+ CS
2746
+ DA
2747
+ DE
2748
+ EN
2749
+ ES
2750
+ FI
2751
+ FR
2752
+ HR
2753
+ HU
2754
+ IT
2755
+ LT
2756
+ LV
2757
+ NL
2758
+ NO
2759
+ PL
2760
+ PT
2761
+ RO
2762
+ SK
2763
+ SL
2764
+ SV
2765
+ UK
2766
+ }
2767
+
2197
2768
  """Text direction for the language"""
2198
2769
  enum LanguageDirection {
2199
2770
  LTR
@@ -2204,6 +2775,9 @@ enum LanguageDirection {
2204
2775
  Summary of a ProductVariant linked to an AttributeOption (Faza 1.5 configurator).
2205
2776
  """
2206
2777
  type LinkedVariantSummary {
2778
+ """Available stock (stock − active reservations, zawsze ≥ 0)."""
2779
+ availableStock: Int!
2780
+
2207
2781
  """Variant ID (w tenant DB)."""
2208
2782
  id: ID!
2209
2783
 
@@ -2213,9 +2787,6 @@ type LinkedVariantSummary {
2213
2787
  """Parent product ID."""
2214
2788
  productId: ID!
2215
2789
 
2216
- """Dostępna ilość (stock − active reservations, zawsze ≥ 0)."""
2217
- quantityAvailable: Int!
2218
-
2219
2790
  """SKU jeśli zdefiniowany."""
2220
2791
  sku: String
2221
2792
 
@@ -2228,13 +2799,28 @@ type LinkedVariantSummary {
2228
2799
 
2229
2800
  """Locale to currency mapping entry"""
2230
2801
  type LocaleCurrencyMapping {
2231
- """Currency code (e.g., "PLN", "USD")"""
2232
- currency: String!
2802
+ """Currency code (ISO 4217)"""
2803
+ currency: CurrencyCode!
2233
2804
 
2234
2805
  """Browser locale (e.g., "pl-PL", "en-US")"""
2235
2806
  locale: String!
2236
2807
  }
2237
2808
 
2809
+ """Localization context dla storefronta"""
2810
+ type Localization {
2811
+ """Wszystkie wsparte kraje (z aktywnych shipping zones)"""
2812
+ availableCountries: [Country!]!
2813
+
2814
+ """Wszystkie wsparte języki sklepu"""
2815
+ availableLanguages: [Language!]!
2816
+
2817
+ """Aktualny kraj klienta (z `@inContext` lub geo-detection)"""
2818
+ country: Country!
2819
+
2820
+ """Aktualny język klienta (z `Accept-Language` lub `@inContext`)"""
2821
+ language: Language!
2822
+ }
2823
+
2238
2824
  """Inventory location (warehouse, store, pickup point)"""
2239
2825
  type Location {
2240
2826
  """Physical address and coordinates"""
@@ -2251,12 +2837,12 @@ type Location {
2251
2837
  """Location display name"""
2252
2838
  name: String!
2253
2839
 
2254
- """Whether this location supports BOPIS pickup"""
2255
- pickupEnabled: Boolean!
2256
-
2257
2840
  """Optional merchant pickup instructions (e.g., "Show ID at counter")"""
2258
2841
  pickupInstructions: String
2259
2842
 
2843
+ """Whether this location supports BOPIS pickup"""
2844
+ supportsPickup: Boolean!
2845
+
2260
2846
  """
2261
2847
  IANA timezone identifier (e.g., "Europe/Warsaw"). Falls back to shop timezone if null.
2262
2848
  """
@@ -2266,14 +2852,8 @@ type Location {
2266
2852
  type: LocationType!
2267
2853
  }
2268
2854
 
2269
- """Physical address of a location (Shopify LocationAddress parity)"""
2855
+ """Physical address of a location"""
2270
2856
  type LocationAddress {
2271
- """Street address line 1"""
2272
- address1: String
2273
-
2274
- """Street address line 2 (apartment, suite)"""
2275
- address2: String
2276
-
2277
2857
  """City"""
2278
2858
  city: String
2279
2859
 
@@ -2295,14 +2875,20 @@ type LocationAddress {
2295
2875
  """Phone number"""
2296
2876
  phone: String
2297
2877
 
2878
+ """Postal / ZIP code"""
2879
+ postalCode: String
2880
+
2298
2881
  """State / province name"""
2299
- province: String
2882
+ state: String
2300
2883
 
2301
2884
  """State / province code (e.g., CA, MZ)"""
2302
- provinceCode: String
2885
+ stateCode: String
2303
2886
 
2304
- """Postal / ZIP code"""
2305
- zip: String
2887
+ """First line of street address"""
2888
+ streetLine1: String
2889
+
2890
+ """Second line of street address (apartment, suite)"""
2891
+ streetLine2: String
2306
2892
  }
2307
2893
 
2308
2894
  """Paginated location connection"""
@@ -2337,7 +2923,7 @@ enum LocationType {
2337
2923
  """Available point earning action"""
2338
2924
  type LoyaltyAction {
2339
2925
  """Whether action is enabled"""
2340
- enabled: Boolean!
2926
+ isEnabled: Boolean!
2341
2927
 
2342
2928
  """Points awarded for this action (if fixed)"""
2343
2929
  points: Int
@@ -2355,13 +2941,13 @@ type LoyaltyMember {
2355
2941
  customerId: ID!
2356
2942
 
2357
2943
  """Enrollment date"""
2358
- enrolledAt: String!
2944
+ enrolledAt: DateTime!
2359
2945
 
2360
2946
  """Member ID"""
2361
2947
  id: ID!
2362
2948
 
2363
2949
  """Last activity date"""
2364
- lastActivityAt: String
2950
+ lastActivityAt: DateTime
2365
2951
 
2366
2952
  """Points summary"""
2367
2953
  points: LoyaltyPointsSummary!
@@ -2399,8 +2985,8 @@ type LoyaltyPointsSummary {
2399
2985
  """Points expiring soon (next 30 days)"""
2400
2986
  expiringPoints: Int
2401
2987
 
2402
- """Next expiry date"""
2403
- nextExpiryDate: String
2988
+ """Next expiry date (ISO 8601)"""
2989
+ nextExpiryDate: DateTime
2404
2990
 
2405
2991
  """Points pending (from incomplete orders)"""
2406
2992
  pendingPoints: Int!
@@ -2414,9 +3000,6 @@ type LoyaltyPointsSummary {
2414
3000
 
2415
3001
  """Redeemable loyalty reward"""
2416
3002
  type LoyaltyReward {
2417
- """Whether reward is available"""
2418
- available: Boolean!
2419
-
2420
3003
  """Description"""
2421
3004
  description: String
2422
3005
 
@@ -2432,14 +3015,17 @@ type LoyaltyReward {
2432
3015
  """Reward image"""
2433
3016
  image: Image
2434
3017
 
3018
+ """Whether reward is available"""
3019
+ isAvailable: Boolean!
3020
+
2435
3021
  """Reward name"""
2436
3022
  name: String!
2437
3023
 
2438
3024
  """Points required to redeem"""
2439
3025
  pointsCost: Int!
2440
3026
 
2441
- """Remaining redemptions (null = unlimited)"""
2442
- remainingRedemptions: Int
3027
+ """Redemptions remaining (null = unlimited)"""
3028
+ redemptionsRemaining: Int
2443
3029
 
2444
3030
  """URL-friendly slug"""
2445
3031
  slug: String!
@@ -2457,7 +3043,7 @@ type LoyaltySettings {
2457
3043
  availableActions: [LoyaltyAction!]!
2458
3044
 
2459
3045
  """Whether loyalty program is enabled"""
2460
- enabled: Boolean!
3046
+ isEnabled: Boolean!
2461
3047
 
2462
3048
  """Months until points expire (null = no expiry)"""
2463
3049
  pointsExpiryMonths: Int
@@ -2517,13 +3103,13 @@ type LoyaltyTransaction {
2517
3103
  balanceAfter: Int!
2518
3104
 
2519
3105
  """Transaction date"""
2520
- createdAt: String!
3106
+ createdAt: DateTime!
2521
3107
 
2522
3108
  """Description"""
2523
3109
  description: String
2524
3110
 
2525
3111
  """Expiry date for earned points"""
2526
- expiresAt: String
3112
+ expiresAt: DateTime
2527
3113
 
2528
3114
  """Transaction ID"""
2529
3115
  id: ID!
@@ -2574,13 +3160,7 @@ enum LoyaltyTransactionType {
2574
3160
  }
2575
3161
 
2576
3162
  """Customer mailing address"""
2577
- type MailingAddress {
2578
- """First line of address"""
2579
- address1: String
2580
-
2581
- """Second line of address"""
2582
- address2: String
2583
-
3163
+ type MailingAddress implements Node {
2584
3164
  """City"""
2585
3165
  city: String
2586
3166
 
@@ -2590,50 +3170,87 @@ type MailingAddress {
2590
3170
  """Country"""
2591
3171
  country: String
2592
3172
 
2593
- """Country code (ISO)"""
2594
- countryCode: String
3173
+ """ISO 3166-1 alpha-2 country code"""
3174
+ countryCode: CountryCode
2595
3175
 
2596
3176
  """First name"""
2597
3177
  firstName: String
2598
3178
 
3179
+ """
3180
+ 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.
3181
+ """
3182
+ formatted: [String!]!
3183
+
3184
+ """
3185
+ Single-line area summary, e.g. "Warszawa, MZ, Poland"
3186
+ """
3187
+ formattedArea: String
3188
+
2599
3189
  """Unique identifier"""
2600
3190
  id: ID!
2601
3191
 
2602
- """Whether this is default address"""
3192
+ """Whether this is default address (DoSwiftly extension)"""
2603
3193
  isDefault: Boolean!
2604
3194
 
2605
3195
  """Last name"""
2606
3196
  lastName: String
2607
3197
 
3198
+ """Computed full name (firstName + " " + lastName)"""
3199
+ name: String
3200
+
2608
3201
  """Phone number"""
2609
3202
  phone: String
2610
3203
 
2611
- """Province/State"""
2612
- province: String
3204
+ """Postal / ZIP code"""
3205
+ postalCode: String
3206
+
3207
+ """State / province"""
3208
+ state: String
3209
+
3210
+ """State / province code (ISO 3166-2 subdivision)"""
3211
+ stateCode: String
2613
3212
 
2614
- """Province code"""
2615
- provinceCode: String
3213
+ """First line of street address"""
3214
+ streetLine1: String
2616
3215
 
2617
- """ZIP/Postal code"""
2618
- zip: String
3216
+ """Second line of street address"""
3217
+ streetLine2: String
2619
3218
  }
2620
3219
 
2621
- """Input for mailing address"""
2622
- input MailingAddressInput {
2623
- """First line of address"""
2624
- address1: String
3220
+ """Paginated mailing addresses (Relay Connection)"""
3221
+ type MailingAddressConnection {
3222
+ """Address edges with cursors"""
3223
+ edges: [MailingAddressEdge!]!
3224
+
3225
+ """Address nodes (shortcut for edges.map(e => e.node))"""
3226
+ nodes: [MailingAddress!]!
3227
+
3228
+ """Pagination info"""
3229
+ pageInfo: PageInfo!
2625
3230
 
2626
- """Second line of address"""
2627
- address2: String
3231
+ """Total count of addresses"""
3232
+ totalCount: Int!
3233
+ }
3234
+
3235
+ """Edge in a MailingAddress connection"""
3236
+ type MailingAddressEdge {
3237
+ """Cursor for pagination"""
3238
+ cursor: String!
3239
+
3240
+ """MailingAddress node"""
3241
+ node: MailingAddress!
3242
+ }
2628
3243
 
3244
+ """Input for mailing address"""
3245
+ input MailingAddressInput {
2629
3246
  """City"""
2630
3247
  city: String
2631
3248
 
2632
3249
  """Company"""
2633
3250
  company: String
2634
3251
 
2635
- """Country code (ISO)"""
2636
- country: String
3252
+ """ISO 3166-1 alpha-2 country code"""
3253
+ country: CountryCode
2637
3254
 
2638
3255
  """First name"""
2639
3256
  firstName: String
@@ -2644,11 +3261,17 @@ input MailingAddressInput {
2644
3261
  """Phone"""
2645
3262
  phone: String
2646
3263
 
2647
- """Province/State"""
2648
- province: String
3264
+ """Postal / ZIP code"""
3265
+ postalCode: String
3266
+
3267
+ """State / province"""
3268
+ state: String
3269
+
3270
+ """First line of street address"""
3271
+ streetLine1: String
2649
3272
 
2650
- """ZIP/Postal code"""
2651
- zip: String
3273
+ """Second line of street address"""
3274
+ streetLine2: String
2652
3275
  }
2653
3276
 
2654
3277
  """Navigation menu"""
@@ -2662,9 +3285,6 @@ type Menu {
2662
3285
  """Top-level menu items"""
2663
3286
  items: [MenuItem!]!
2664
3287
 
2665
- """Total count of items across all levels"""
2666
- itemsCount: Int!
2667
-
2668
3288
  """Menu title"""
2669
3289
  title: String!
2670
3290
  }
@@ -2680,7 +3300,9 @@ type MenuItem {
2680
3300
  """Child menu items (max 3 levels)"""
2681
3301
  items: [MenuItem!]!
2682
3302
 
2683
- """Linked resource object (lazy, via DataLoader)"""
3303
+ """
3304
+ Linked resource object resolved server-side via DataLoader (batched per resource type — no N+1). Null when type is HTTP/FRONTPAGE/SEARCH/CATALOG/BLOG, or when resourceId points to a deleted resource.
3305
+ """
2684
3306
  resource: MenuItemResource
2685
3307
 
2686
3308
  """Linked resource ID"""
@@ -2692,8 +3314,10 @@ type MenuItem {
2692
3314
  """Link type"""
2693
3315
  type: MenuItemType!
2694
3316
 
2695
- """Resolved URL (always computed server-side)"""
2696
- url: String
3317
+ """
3318
+ 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.
3319
+ """
3320
+ url: URL
2697
3321
  }
2698
3322
 
2699
3323
  union MenuItemResource = Category | Collection | Product | ShopPage
@@ -2714,142 +3338,191 @@ enum MenuItemType {
2714
3338
  """Monetary value with currency"""
2715
3339
  type Money {
2716
3340
  """Decimal money amount"""
2717
- amount: String!
3341
+ amount: Decimal!
2718
3342
 
2719
- """Currency code (ISO 4217)"""
2720
- currencyCode: String!
3343
+ """ISO 4217 currency code"""
3344
+ currencyCode: CurrencyCode!
2721
3345
  }
2722
3346
 
2723
3347
  type Mutation {
2724
- """Update cart attributes"""
2725
- cartAttributesUpdate(attributes: [CartAttributeInput!]!, cartId: ID!): CartAttributesUpdatePayload!
3348
+ """Add lines to cart"""
3349
+ cartAddLines(id: ID!, lines: [CartLineInput!]!): CartAddLinesPayload!
2726
3350
 
2727
- """Update buyer identity"""
2728
- cartBuyerIdentityUpdate(buyerIdentity: CartBuyerIdentityInput!, cartId: ID!): CartBuyerIdentityUpdatePayload!
3351
+ """Apply discount codes"""
3352
+ cartApplyDiscountCodes(discountCodes: [String!]!, id: ID!): CartApplyDiscountCodesPayload!
2729
3353
 
2730
3354
  """Create new cart"""
2731
3355
  cartCreate(input: CartCreateInput): CartCreatePayload!
2732
3356
 
2733
- """Update discount codes"""
2734
- cartDiscountCodesUpdate(cartId: ID!, discountCodes: [String!]!): CartDiscountCodesUpdatePayload!
3357
+ """Remove lines from cart"""
3358
+ cartRemoveLines(id: ID!, lineIds: [ID!]!): CartRemoveLinesPayload!
2735
3359
 
2736
- """Add lines to cart"""
2737
- cartLinesAdd(cartId: ID!, lines: [CartLineInput!]!): CartLinesAddPayload!
3360
+ """Update cart attributes"""
3361
+ cartUpdateAttributes(attributes: [CartAttributeInput!]!, id: ID!): CartUpdateAttributesPayload!
2738
3362
 
2739
- """Remove lines from cart"""
2740
- cartLinesRemove(cartId: ID!, lineIds: [ID!]!): CartLinesRemovePayload!
3363
+ """Update buyer identity"""
3364
+ cartUpdateBuyerIdentity(buyerIdentity: CartBuyerIdentityInput!, id: ID!): CartUpdateBuyerIdentityPayload!
2741
3365
 
2742
3366
  """Update cart lines"""
2743
- cartLinesUpdate(cartId: ID!, lines: [CartLineUpdateInput!]!): CartLinesUpdatePayload!
3367
+ cartUpdateLines(id: ID!, lines: [CartLineUpdateInput!]!): CartUpdateLinesPayload!
2744
3368
 
2745
3369
  """Update cart note"""
2746
- cartNoteUpdate(cartId: ID!, note: String!): CartNoteUpdatePayload!
3370
+ cartUpdateNote(id: ID!, note: String!): CartUpdateNotePayload!
2747
3371
 
2748
- """Update checkout billing address"""
2749
- checkoutBillingAddressUpdate(billingAddress: CheckoutAddressInput!, checkoutId: ID!): CheckoutBillingAddressUpdatePayload!
3372
+ """Apply discount code to checkout"""
3373
+ checkoutApplyDiscountCode(discountCode: String!, id: ID!): CheckoutApplyDiscountCodePayload!
3374
+
3375
+ """Apply gift card to checkout"""
3376
+ checkoutApplyGiftCard(giftCardCode: String!, id: ID!): CheckoutApplyGiftCardPayload!
2750
3377
 
2751
3378
  """Complete checkout and create order"""
2752
- checkoutComplete(checkoutId: ID!, input: CheckoutCompleteInput): CheckoutCompletePayload!
3379
+ checkoutComplete(id: ID!, input: CheckoutCompleteInput): CheckoutCompletePayload!
2753
3380
 
2754
3381
  """Create new checkout"""
2755
3382
  checkoutCreate(input: CheckoutCreateInput!): CheckoutCreatePayload!
2756
3383
 
2757
- """Apply discount code to checkout"""
2758
- checkoutDiscountCodeApply(checkoutId: ID!, discountCode: String!): CheckoutDiscountCodeApplyPayload!
2759
-
2760
3384
  """Remove discount code from checkout"""
2761
- checkoutDiscountCodeRemove(checkoutId: ID!, discountCode: String!): CheckoutDiscountCodeRemovePayload!
3385
+ checkoutRemoveDiscountCode(discountCode: String!, id: ID!): CheckoutRemoveDiscountCodePayload!
2762
3386
 
2763
- """Validate discount code without applying"""
2764
- checkoutDiscountCodeValidate(checkoutId: ID!, discountCode: String!): CheckoutDiscountCodeValidatePayload!
3387
+ """Remove gift card from checkout"""
3388
+ checkoutRemoveGiftCard(giftCardCode: String!, id: ID!): CheckoutRemoveGiftCardPayload!
2765
3389
 
2766
- """Update checkout email"""
2767
- checkoutEmailUpdate(checkoutId: ID!, email: String!): CheckoutEmailUpdatePayload!
3390
+ """Select payment method for checkout"""
3391
+ checkoutSelectPaymentMethod(id: ID!, paymentMethodId: ID!): CheckoutSelectPaymentMethodPayload!
2768
3392
 
2769
- """Apply gift card to checkout"""
2770
- checkoutGiftCardApply(checkoutId: ID!, giftCardCode: String!): CheckoutGiftCardApplyPayload!
3393
+ """Select shipping rate for checkout"""
3394
+ checkoutSelectShippingRate(
3395
+ id: ID!
2771
3396
 
2772
- """Update gift card recipient info for a line item"""
2773
- checkoutGiftCardRecipientUpdate(input: CheckoutGiftCardRecipientInput!): CheckoutGiftCardRecipientUpdatePayload!
3397
+ """Shipping rate handle/id from checkout.availableShippingRates"""
3398
+ rateId: String!
3399
+ ): CheckoutSelectShippingRatePayload!
2774
3400
 
2775
- """Remove gift card from checkout"""
2776
- checkoutGiftCardRemove(checkoutId: ID!, giftCardCode: String!): CheckoutGiftCardRemovePayload!
3401
+ """Update checkout billing address"""
3402
+ checkoutUpdateBillingAddress(billingAddress: CheckoutAddressInput!, id: ID!): CheckoutUpdateBillingAddressPayload!
3403
+
3404
+ """Update checkout email"""
3405
+ checkoutUpdateEmail(email: String!, id: ID!): CheckoutUpdateEmailPayload!
2777
3406
 
2778
- """Update checkout payment method"""
2779
- checkoutPaymentMethodUpdate(checkoutId: ID!, paymentMethodId: ID!): CheckoutPaymentMethodUpdatePayload!
3407
+ """Update gift card recipient info for a line item"""
3408
+ checkoutUpdateGiftCardRecipient(input: CheckoutGiftCardRecipientInput!): CheckoutUpdateGiftCardRecipientPayload!
2780
3409
 
2781
3410
  """Update checkout shipping address"""
2782
- checkoutShippingAddressUpdate(checkoutId: ID!, shippingAddress: CheckoutAddressInput!): CheckoutShippingAddressUpdatePayload!
3411
+ checkoutUpdateShippingAddress(id: ID!, shippingAddress: CheckoutAddressInput!): CheckoutUpdateShippingAddressPayload!
3412
+
3413
+ """Validate discount code without applying"""
3414
+ checkoutValidateDiscountCode(discountCode: String!, id: ID!): CheckoutValidateDiscountCodePayload!
3415
+
3416
+ """
3417
+ Activate customer account using raw activation token (admin-created flow)
3418
+ """
3419
+ customerActivate(
3420
+ password: String!
2783
3421
 
2784
- """Update checkout shipping method"""
2785
- checkoutShippingLineUpdate(checkoutId: ID!, shippingRateHandle: String!): CheckoutShippingLineUpdatePayload!
3422
+ """Raw activation token from the activation email"""
3423
+ token: String!
3424
+ ): CustomerActivatePayload!
3425
+
3426
+ """Add customer address"""
3427
+ customerAddAddress(address: MailingAddressInput!): CustomerAddAddressPayload!
2786
3428
 
2787
3429
  """Login customer"""
2788
- customerAccessTokenCreate(input: CustomerAccessTokenCreateInput!): CustomerAccessTokenCreatePayload!
3430
+ customerLogin(input: CustomerAccessTokenCreateInput!): CustomerLoginPayload!
2789
3431
 
2790
- """Logout customer"""
2791
- customerAccessTokenDelete(customerAccessToken: String!): CustomerAccessTokenDeletePayload!
3432
+ """Logout customer (clears auth cookie)"""
3433
+ customerLogout: CustomerLogoutPayload!
2792
3434
 
2793
3435
  """Refresh access token"""
2794
- customerAccessTokenRenew(customerAccessToken: String!): CustomerAccessTokenRenewPayload!
3436
+ customerRefreshToken: CustomerRefreshTokenPayload!
2795
3437
 
2796
- """Create customer address"""
2797
- customerAddressCreate(address: MailingAddressInput!, customerAccessToken: String!): CustomerAddressCreatePayload!
3438
+ """Remove customer address"""
3439
+ customerRemoveAddress(id: ID!): CustomerRemoveAddressPayload!
2798
3440
 
2799
- """Delete customer address"""
2800
- customerAddressDelete(customerAccessToken: String!, id: ID!): CustomerAddressDeletePayload!
3441
+ """Request password reset email"""
3442
+ customerRequestPasswordReset(email: String!): CustomerRequestPasswordResetPayload!
2801
3443
 
2802
- """Update customer address"""
2803
- customerAddressUpdate(address: MailingAddressInput!, customerAccessToken: String!, id: ID!): CustomerAddressUpdatePayload!
3444
+ """Reset customer password via signed URL from email"""
3445
+ customerResetPassword(
3446
+ newPassword: String!
2804
3447
 
2805
- """Register new customer"""
2806
- customerCreate(input: CustomerCreateInput!): CustomerCreatePayload!
3448
+ """Raw password-reset token from the password-reset email"""
3449
+ token: String!
3450
+ ): CustomerResetPasswordPayload!
2807
3451
 
2808
3452
  """Set default address"""
2809
- customerDefaultAddressUpdate(addressId: ID!, customerAccessToken: String!): CustomerDefaultAddressUpdatePayload!
2810
-
2811
- """Send password reset email"""
2812
- customerRecover(email: String!): CustomerRecoverPayload!
3453
+ customerSetDefaultAddress(addressId: ID!): CustomerSetDefaultAddressPayload!
2813
3454
 
2814
- """Reset password"""
2815
- customerReset(id: ID!, input: String!, password: String!): CustomerResetPayload!
3455
+ """Register new customer"""
3456
+ customerSignup(input: CustomerCreateInput!): CustomerSignupPayload!
2816
3457
 
2817
3458
  """Update customer profile"""
2818
- customerUpdate(customer: CustomerUpdateInput!, customerAccessToken: String!): CustomerUpdatePayload!
3459
+ customerUpdate(customer: CustomerUpdateInput!): CustomerUpdatePayload!
3460
+
3461
+ """Update customer address"""
3462
+ customerUpdateAddress(address: MailingAddressInput!, id: ID!): CustomerUpdateAddressPayload!
2819
3463
 
2820
3464
  """Generate or retrieve referral code"""
2821
- generateReferralCode: GenerateReferralCodePayload!
3465
+ loyaltyGenerateReferralCode: GenerateReferralCodePayload!
2822
3466
 
2823
3467
  """Redeem a loyalty reward"""
2824
- redeemLoyaltyReward(input: RedeemRewardInput!): RedeemRewardPayload!
3468
+ loyaltyRedeemReward(input: RedeemRewardInput!): RedeemRewardPayload!
2825
3469
 
2826
3470
  """Cancel a return request"""
2827
- returnCancel(customerAccessToken: String!, id: ID!): ReturnCancelPayload!
3471
+ returnCancel(id: ID!): ReturnCancelPayload!
2828
3472
 
2829
3473
  """Create a return request"""
2830
- returnCreate(customerAccessToken: String!, input: ReturnCreateInput!): ReturnCreatePayload!
3474
+ returnCreate(input: ReturnCreateInput!): ReturnCreatePayload!
2831
3475
 
2832
3476
  """Create a product review"""
2833
3477
  reviewCreate(input: ReviewCreateInput!): ReviewPayload!
2834
3478
 
2835
- """Vote on review helpfulness"""
2836
- reviewVote(isHelpful: Boolean!, reviewId: ID!): ReviewPayload!
3479
+ """
3480
+ Mark review as not helpful (downvote). Replaces any prior vote by same customer.
3481
+ """
3482
+ reviewDownvote(reviewId: ID!): ReviewPayload!
3483
+
3484
+ """
3485
+ Mark review as helpful (upvote). Replaces any prior vote by same customer.
3486
+ """
3487
+ reviewUpvote(reviewId: ID!): ReviewPayload!
2837
3488
 
2838
3489
  """Add item to wishlist"""
2839
- wishlistAddItem(input: WishlistItemInput!, wishlistId: ID!): WishlistPayload!
3490
+ wishlistAddItem(id: ID!, input: WishlistItemInput!): WishlistPayload!
2840
3491
 
2841
3492
  """Create a new wishlist"""
2842
3493
  wishlistCreate(input: WishlistCreateInput!): WishlistPayload!
2843
3494
 
2844
3495
  """Delete a wishlist"""
2845
- wishlistDelete(wishlistId: ID!): WishlistPayload!
3496
+ wishlistDelete(id: ID!): WishlistPayload!
2846
3497
 
2847
3498
  """Remove item from wishlist"""
2848
- wishlistRemoveItem(itemId: ID!, wishlistId: ID!): WishlistPayload!
3499
+ wishlistRemoveItem(id: ID!, itemId: ID!): WishlistPayload!
3500
+ }
3501
+
3502
+ """GraphQL Node interface — universal ID-based lookup"""
3503
+ interface Node {
3504
+ """Globally-unique identifier"""
3505
+ id: ID!
3506
+ }
3507
+
3508
+ """
3509
+ Type discriminator dla node()/nodes() queries (UUID nie zawiera type prefix)
3510
+ """
3511
+ enum NodeType {
3512
+ ARTICLE
3513
+ CART
3514
+ CATEGORY
3515
+ COLLECTION
3516
+ CUSTOMER
3517
+ MAILING_ADDRESS
3518
+ ORDER
3519
+ PAGE
3520
+ PRODUCT
3521
+ PRODUCT_VARIANT
2849
3522
  }
2850
3523
 
2851
3524
  """Customer order summary"""
2852
- type Order {
3525
+ type Order implements Node {
2853
3526
  """When order was cancelled"""
2854
3527
  cancelledAt: DateTime
2855
3528
 
@@ -2859,9 +3532,6 @@ type Order {
2859
3532
  """When order expired"""
2860
3533
  expiredAt: DateTime
2861
3534
 
2862
- """Financial status"""
2863
- financialStatus: OrderFinancialStatus!
2864
-
2865
3535
  """Fulfillment status"""
2866
3536
  fulfillmentStatus: OrderFulfillmentStatus!
2867
3537
 
@@ -2869,13 +3539,16 @@ type Order {
2869
3539
  id: ID!
2870
3540
 
2871
3541
  """Line items count"""
2872
- lineItemsCount: Int!
3542
+ itemCount: Int!
2873
3543
 
2874
3544
  """Order number (human-readable)"""
2875
3545
  orderNumber: String!
2876
3546
 
2877
- """Order date"""
2878
- processedAt: String!
3547
+ """Payment status"""
3548
+ paymentStatus: OrderPaymentStatus!
3549
+
3550
+ """Order date (ISO 8601)"""
3551
+ processedAt: DateTime!
2879
3552
 
2880
3553
  """Order shipments"""
2881
3554
  shipments: [Shipment!]!
@@ -2886,17 +3559,8 @@ type Order {
2886
3559
  """Order lifecycle status"""
2887
3560
  status: StorefrontOrderStatus!
2888
3561
 
2889
- """Order subtotal"""
2890
- subtotalPrice: Money!
2891
-
2892
- """Order total"""
2893
- totalPrice: Money!
2894
-
2895
- """Total shipping"""
2896
- totalShipping: Money
2897
-
2898
- """Total tax"""
2899
- totalTax: Money
3562
+ """Cost totals breakdown (subtotal/total/totalTax/totalShipping)"""
3563
+ totals: OrderTotals!
2900
3564
  }
2901
3565
 
2902
3566
  """Paginated order connection"""
@@ -2920,8 +3584,20 @@ type OrderEdge {
2920
3584
  node: Order!
2921
3585
  }
2922
3586
 
2923
- """Financial status of an order"""
2924
- enum OrderFinancialStatus {
3587
+ """Fulfillment status of an order"""
3588
+ enum OrderFulfillmentStatus {
3589
+ DELIVERED
3590
+ FULFILLED
3591
+ IN_TRANSIT
3592
+ LOST
3593
+ PARTIALLY_FULFILLED
3594
+ PARTIALLY_RETURNED
3595
+ RETURNED
3596
+ UNFULFILLED
3597
+ }
3598
+
3599
+ """Payment status of an order"""
3600
+ enum OrderPaymentStatus {
2925
3601
  AUTHORIZED
2926
3602
  CHARGEBACK
2927
3603
  FAILED
@@ -2935,16 +3611,19 @@ enum OrderFinancialStatus {
2935
3611
  VOIDED
2936
3612
  }
2937
3613
 
2938
- """Fulfillment status of an order"""
2939
- enum OrderFulfillmentStatus {
2940
- DELIVERED
2941
- FULFILLED
2942
- IN_TRANSIT
2943
- LOST
2944
- PARTIALLY_FULFILLED
2945
- PARTIALLY_RETURNED
2946
- RETURNED
2947
- UNFULFILLED
3614
+ """Order cost totals breakdown"""
3615
+ type OrderTotals {
3616
+ """Order subtotal (before tax and shipping)"""
3617
+ subtotal: Money!
3618
+
3619
+ """Order total (after tax and shipping)"""
3620
+ total: Money!
3621
+
3622
+ """Total shipping cost"""
3623
+ totalShipping: Money
3624
+
3625
+ """Total tax amount"""
3626
+ totalTax: Money
2948
3627
  }
2949
3628
 
2950
3629
  """Package dimensions for rate calculation"""
@@ -3026,6 +3705,23 @@ enum PaymentMethodType {
3026
3705
  PAYPAL
3027
3706
  }
3028
3707
 
3708
+ """Shop payment configuration (currency, country, providers)"""
3709
+ type PaymentSettings {
3710
+ """Country code sklepu — driver dostępności metod płatności"""
3711
+ countryCode: CountryCode!
3712
+
3713
+ """Primary currency użyty do procesowania płatności"""
3714
+ currencyCode: CurrencyCode!
3715
+
3716
+ """Waluty displayable on storefront (Money.currencyCode allowlist)"""
3717
+ enabledPresentmentCurrencies: [CurrencyCode!]!
3718
+
3719
+ """
3720
+ 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.
3721
+ """
3722
+ paymentProviders: [String!]!
3723
+ }
3724
+
3029
3725
  """Points estimate for an order"""
3030
3726
  type PointsEstimate {
3031
3727
  """Base points to earn"""
@@ -3041,6 +3737,15 @@ type PointsEstimate {
3041
3737
  totalPoints: Int!
3042
3738
  }
3043
3739
 
3740
+ """Predictive search result for typeahead UI"""
3741
+ type PredictiveSearchResult {
3742
+ """Top matching products (FTS-ranked)"""
3743
+ products: [Product!]!
3744
+
3745
+ """Top product title suggestions with highlighted query matches"""
3746
+ queries: [SearchQuerySuggestion!]!
3747
+ }
3748
+
3044
3749
  """Price with full conversion transparency"""
3045
3750
  type PriceMoney {
3046
3751
  """Price amount in display currency"""
@@ -3077,6 +3782,15 @@ type PriceRange {
3077
3782
  min: Money!
3078
3783
  }
3079
3784
 
3785
+ """Price range filter (major units)"""
3786
+ input PriceRangeFilter {
3787
+ """Maximum price (major units)"""
3788
+ max: Float
3789
+
3790
+ """Minimum price (major units, e.g. 50.0 PLN)"""
3791
+ min: Float
3792
+ }
3793
+
3080
3794
  """Quantity-based pricing tier"""
3081
3795
  type PricingTier {
3082
3796
  """Discount percentage from retail"""
@@ -3093,8 +3807,8 @@ type PricingTier {
3093
3807
  }
3094
3808
 
3095
3809
  """Product - main catalog item"""
3096
- type Product {
3097
- """Assigned AttributeSet ID (Hybrid Magento — shared template fields)"""
3810
+ type Product implements Node {
3811
+ """Assigned AttributeSet ID (shared template fields)"""
3098
3812
  attributeSetId: ID
3099
3813
 
3100
3814
  """
@@ -3102,17 +3816,21 @@ type Product {
3102
3816
  """
3103
3817
  attributes(filter: ProductAttributeFilterInput): [ProductAttributeDefinition!]!
3104
3818
 
3105
- """Whether product is available for sale (any variant in stock)"""
3106
- availableForSale: Boolean!
3107
-
3108
3819
  """Average rating (1-5)"""
3109
3820
  averageRating: Float
3110
3821
 
3111
- """Whether storefront checkout collects recipient data for this product"""
3112
- collectRecipientInfo: Boolean!
3822
+ """
3823
+ Product category (free-text classification, e.g. "Footwear", "Electronics")
3824
+ """
3825
+ category: String
3826
+
3827
+ """
3828
+ Compare-at price range (Money pair). Null gdy żaden variant nie ma compareAtPrice.
3829
+ """
3830
+ compareAtPriceRange: ProductPriceRange
3113
3831
 
3114
- """Compare-at price range in customer preferred currency (auto-converted)"""
3115
- compareAtPriceRange: ConvertedPriceRange
3832
+ """Opt-in: compare-at price range with conversion transparency."""
3833
+ compareAtPriceRangeWithConversion: ConvertedPriceRange
3116
3834
 
3117
3835
  """Creation timestamp"""
3118
3836
  createdAt: DateTime!
@@ -3132,49 +3850,51 @@ type Product {
3132
3850
  """Unique identifier"""
3133
3851
  id: ID!
3134
3852
 
3135
- """All product images"""
3136
- images(first: Float = 10): [Image!]!
3853
+ """Product images (Relay Connection)"""
3854
+ images(after: String, before: String, first: Float, last: Float): ImageConnection!
3855
+
3856
+ """Whether product is available for sale (any variant in stock)"""
3857
+ isAvailable: Boolean!
3858
+
3859
+ """
3860
+ 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.
3861
+ """
3862
+ isPurchasable: Boolean!
3137
3863
 
3138
3864
  """
3139
3865
  Per-product option definitions (Color, Size, …) with their available values. Use these to build a variant picker without aggregating `selectedOptions` manually.
3140
3866
  """
3141
3867
  options: [ProductOption!]!
3142
3868
 
3143
- """Original compare-at price range in shop base currency"""
3144
- originalCompareAtPriceRange: ProductPriceRange
3145
-
3146
- """Original price range in shop base currency"""
3147
- originalPriceRange: ProductPriceRange
3148
-
3149
- """Price range in customer preferred currency (auto-converted)"""
3150
- priceRange: ConvertedPriceRange!
3151
-
3152
- """Product type/category (free text)"""
3153
- productType: String
3869
+ """Price range (Money pair). Default field industry-standard schema."""
3870
+ priceRange: ProductPriceRange!
3154
3871
 
3155
3872
  """
3156
- 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.
3873
+ 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.
3157
3874
  """
3158
- purchasable: Boolean!
3875
+ priceRangeWithConversion: ConvertedPriceRange
3159
3876
 
3160
3877
  """Similar products recommendations"""
3161
3878
  recommendations(first: Int = 4): ProductRecommendations
3162
3879
 
3880
+ """Whether storefront checkout requires recipient data for this product"""
3881
+ requiresRecipientInfo: Boolean!
3882
+
3163
3883
  """Number of reviews"""
3164
3884
  reviewCount: Int
3165
3885
 
3166
3886
  """SEO metadata"""
3167
3887
  seo: SEO
3168
3888
 
3889
+ """Total stock across all variants"""
3890
+ stockTotal: Int
3891
+
3169
3892
  """Product tags"""
3170
3893
  tags: [String!]!
3171
3894
 
3172
3895
  """Product title"""
3173
3896
  title: String!
3174
3897
 
3175
- """Total inventory across all variants"""
3176
- totalInventory: Int
3177
-
3178
3898
  """
3179
3899
  Product type enum (PHYSICAL, DIGITAL, SERVICE, SUBSCRIPTION, GIFT_CARD)
3180
3900
  """
@@ -3183,8 +3903,8 @@ type Product {
3183
3903
  """Last update timestamp"""
3184
3904
  updatedAt: DateTime!
3185
3905
 
3186
- """Product variants"""
3187
- variants(first: Float = 100): [ProductVariant!]!
3906
+ """Product variants (Relay Connection)"""
3907
+ variants(after: String, before: String, first: Float, last: Float): ProductVariantConnection!
3188
3908
 
3189
3909
  """Vendor/brand name"""
3190
3910
  vendor: String
@@ -3196,7 +3916,7 @@ type Product {
3196
3916
  """Product attribute definition (configurator)"""
3197
3917
  type ProductAttributeDefinition {
3198
3918
  """Billing mode — BUNDLED | SEPARATE_LINE; null = informational only"""
3199
- billingMode: String
3919
+ billingMode: AttributeBillingMode
3200
3920
 
3201
3921
  """Customer-facing description"""
3202
3922
  description: String
@@ -3205,7 +3925,7 @@ type ProductAttributeDefinition {
3205
3925
  displayOrder: Int!
3206
3926
 
3207
3927
  """Filling mode — MERCHANT | CUSTOMER | BOTH"""
3208
- fillingMode: String!
3928
+ fillingMode: AttributeFillingMode!
3209
3929
 
3210
3930
  """Definition ID"""
3211
3931
  id: ID!
@@ -3248,7 +3968,7 @@ input ProductAttributeFilterInput {
3248
3968
  """
3249
3969
  Filter by filling mode — MERCHANT | CUSTOMER | BOTH (configurator UI uses CUSTOMER + BOTH)
3250
3970
  """
3251
- fillingMode: String
3971
+ fillingMode: AttributeFillingMode
3252
3972
  }
3253
3973
 
3254
3974
  """Selectable option of a product attribute (configurator)"""
@@ -3284,7 +4004,7 @@ type ProductAttributeOption {
3284
4004
  surchargeAmount: Int
3285
4005
 
3286
4006
  """Surcharge type — FIXED | PERCENT (Faza 2)"""
3287
- surchargeType: String
4007
+ surchargeType: AttributeOptionSurchargeType
3288
4008
 
3289
4009
  """Internal value (slug-style)"""
3290
4010
  value: String!
@@ -3292,9 +4012,17 @@ type ProductAttributeOption {
3292
4012
 
3293
4013
  """Paginated product list"""
3294
4014
  type ProductConnection {
3295
- """Product edges"""
4015
+ """Product edges with cursors"""
3296
4016
  edges: [ProductEdge!]!
3297
4017
 
4018
+ """
4019
+ Faceted filters driven by current result set. Use FilterValue.input to construct refinement queries.
4020
+ """
4021
+ filters: [Filter!]!
4022
+
4023
+ """Product nodes (shortcut for edges.map(e => e.node))"""
4024
+ nodes: [Product!]!
4025
+
3298
4026
  """Pagination info"""
3299
4027
  pageInfo: PageInfo!
3300
4028
 
@@ -3311,52 +4039,49 @@ type ProductEdge {
3311
4039
  node: Product!
3312
4040
  }
3313
4041
 
3314
- """Product filter options"""
3315
- input ProductFilterInput {
3316
- """Dynamic attribute filters (Requirements: R35.12, R35.13, R35.14)"""
4042
+ """Single product filter"""
4043
+ input ProductFilter {
4044
+ """
4045
+ DoSwiftly: dynamic attribute filters (configurator system). Product/variant metafield filters will be added in Wave 5.
4046
+ """
3317
4047
  attributes: [AttributeFilterInput!]
3318
4048
 
3319
- """Filter by availability"""
4049
+ """Filter by availability for sale"""
3320
4050
  available: Boolean
3321
4051
 
3322
- """
3323
- Filter by category ID (supports comma-separated UUIDs for multi-category)
3324
- """
3325
- categoryId: ID
4052
+ """Filter by category"""
4053
+ category: CategoryFilter
3326
4054
 
3327
4055
  """
3328
- Filter by collection ID (supports comma-separated UUIDs for multi-collection)
4056
+ DoSwiftly: filter by collection ID (supports comma-separated UUIDs). Use Collection.products(filters) for collection-scoped queries.
3329
4057
  """
3330
4058
  collectionId: ID
3331
4059
 
3332
- """Filter by maximum price"""
3333
- maxPrice: Float
4060
+ """Filter by variant price range"""
4061
+ price: PriceRangeFilter
3334
4062
 
3335
- """Filter by minimum price"""
3336
- minPrice: Float
4063
+ """
4064
+ Filter by product category (free-text classification, stored on Product.category). Distinct from `category: CategoryFilter` which selects by structured Category entity.
4065
+ """
4066
+ productCategory: String
3337
4067
 
3338
- """Filter by product type"""
3339
- productType: String
4068
+ """
4069
+ Filter by product type enum (PHYSICAL/DIGITAL/SERVICE/SUBSCRIPTION/GIFT_CARD). Distinct from `productCategory` (free-text classification).
4070
+ """
4071
+ productType: ProductTypeEnum
3340
4072
 
3341
- """Filter by product types"""
3342
- productTypes: [String!]
4073
+ """
4074
+ Filter by product vendor (renamed from legacy `vendor` in ProductFilterInput)
4075
+ """
4076
+ productVendor: String
3343
4077
 
3344
- """Filter by tag"""
4078
+ """Filter by product tag"""
3345
4079
  tag: String
3346
4080
 
3347
- """Filter by tags"""
3348
- tags: [String!]
3349
-
3350
4081
  """
3351
- 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.
4082
+ Filter by single variant option (e.g. Color=Red). For multi-value filtering use multiple ProductFilter entries.
3352
4083
  """
3353
- variantOption: [VariantOptionFilter!]
3354
-
3355
- """Filter by vendor"""
3356
- vendor: String
3357
-
3358
- """Filter by vendor names"""
3359
- vendors: [String!]
4084
+ variantOption: VariantOptionFilter
3360
4085
  }
3361
4086
 
3362
4087
  """Product option"""
@@ -3369,10 +4094,10 @@ type ProductOption {
3369
4094
  """Option name (e.g. "Color", "Size")"""
3370
4095
  name: String!
3371
4096
 
3372
- """Sort position among the product's options"""
3373
- position: Int!
4097
+ """Sort order among the product's options"""
4098
+ sortOrder: Int!
3374
4099
 
3375
- """Available values, ordered by position"""
4100
+ """Available values, ordered by sortOrder"""
3376
4101
  values: [ProductOptionValue!]!
3377
4102
  }
3378
4103
 
@@ -3396,8 +4121,8 @@ type ProductOptionValue {
3396
4121
  """Display name (e.g. "Red", "XL")"""
3397
4122
  name: String!
3398
4123
 
3399
- """Sort position (0-based)"""
3400
- position: Int!
4124
+ """Sort order (0-based)"""
4125
+ sortOrder: Int!
3401
4126
  }
3402
4127
 
3403
4128
  """Original price range in shop base currency"""
@@ -3447,7 +4172,7 @@ type ProductReview {
3447
4172
  """Review date"""
3448
4173
  createdAt: DateTime!
3449
4174
 
3450
- """Helpful votes count"""
4175
+ """Helpful votes count (upvotes)"""
3451
4176
  helpfulCount: Int!
3452
4177
  id: ID!
3453
4178
 
@@ -3472,6 +4197,9 @@ type ProductReview {
3472
4197
 
3473
4198
  """Review title"""
3474
4199
  title: String
4200
+
4201
+ """Unhelpful votes count (downvotes)"""
4202
+ unhelpfulCount: Int!
3475
4203
  }
3476
4204
 
3477
4205
  """Paginated reviews connection"""
@@ -3491,10 +4219,13 @@ type ProductReviewEdge {
3491
4219
  enum ProductSortKeys {
3492
4220
  BEST_SELLING
3493
4221
  CREATED_AT
4222
+ ID
3494
4223
  PRICE
4224
+ PRODUCT_TYPE
3495
4225
  RELEVANCE
3496
4226
  TITLE
3497
4227
  UPDATED_AT
4228
+ VENDOR
3498
4229
  }
3499
4230
 
3500
4231
  """Product type classification"""
@@ -3508,14 +4239,19 @@ enum ProductTypeEnum {
3508
4239
 
3509
4240
  """Product variant - purchasable unit"""
3510
4241
  type ProductVariant {
3511
- """Whether variant is available for purchase"""
3512
- available: Boolean!
4242
+ """
4243
+ Available stock (computed: stock - reserved). Null when track is disabled.
4244
+ """
4245
+ availableStock: Int
3513
4246
 
3514
4247
  """Barcode"""
3515
4248
  barcode: String
3516
4249
 
3517
- """Compare at price in customer preferred currency"""
3518
- compareAtPrice: PriceMoney
4250
+ """Compare at price (Money). Null gdy variant nie jest na promocji."""
4251
+ compareAtPrice: Money
4252
+
4253
+ """Opt-in: compare-at price with conversion transparency."""
4254
+ compareAtPriceWithConversion: PriceMoney
3519
4255
 
3520
4256
  """Unique identifier"""
3521
4257
  id: ID!
@@ -3523,20 +4259,16 @@ type ProductVariant {
3523
4259
  """Variant image"""
3524
4260
  image: Image
3525
4261
 
3526
- """Original compare at price in shop base currency"""
3527
- originalCompareAtPrice: Money
3528
-
3529
- """Original price in shop base currency"""
3530
- originalPrice: Money
3531
-
3532
- """Position in product variants list"""
3533
- position: Int
4262
+ """Whether variant is available for purchase"""
4263
+ isAvailable: Boolean!
3534
4264
 
3535
- """Price in customer preferred currency (auto-converted)"""
3536
- price: PriceMoney!
4265
+ """Variant price (Money). Default field — industry-standard schema."""
4266
+ price: Money!
3537
4267
 
3538
- """Quantity available in stock"""
3539
- quantityAvailable: Int
4268
+ """
4269
+ Opt-in: price with full conversion transparency. Use dla currency-converter UI.
4270
+ """
4271
+ priceWithConversion: PriceMoney
3540
4272
 
3541
4273
  """Selected options for this variant"""
3542
4274
  selectedOptions: [SelectedOption!]!
@@ -3544,8 +4276,11 @@ type ProductVariant {
3544
4276
  """SKU code"""
3545
4277
  sku: String
3546
4278
 
4279
+ """Sort order among product variants"""
4280
+ sortOrder: Int
4281
+
3547
4282
  """
3548
- Per-location stock availability (Shopify StoreAvailability parity). Null for single-location shops. Resolved by StoreAvailabilityResolver with `near`, `locationType`, and `@inContext(preferredLocationId)` support.
4283
+ Per-location stock availability. Null for single-location shops. Resolved by StoreAvailabilityResolver with `near`, `locationType`, and `@inContext(preferredLocationId)` support.
3549
4284
  """
3550
4285
  storeAvailability(
3551
4286
  """Cursor for pagination"""
@@ -3554,7 +4289,7 @@ type ProductVariant {
3554
4289
  """Number of locations to return"""
3555
4290
  first: Int! = 10
3556
4291
 
3557
- """Filter by location type (DoSwiftly extension beyond Shopify parity)"""
4292
+ """Filter by location type (DoSwiftly extension)"""
3558
4293
  locationType: LocationType
3559
4294
 
3560
4295
  """Sort locations by proximity to these coordinates"""
@@ -3564,8 +4299,32 @@ type ProductVariant {
3564
4299
  """Variant title (e.g., "Large / Red")"""
3565
4300
  title: String!
3566
4301
 
3567
- """Weight in grams"""
3568
- weight: Float
4302
+ """Variant weight (canonical unit GRAMS — Prisma stores integer grams)"""
4303
+ weight: Weight
4304
+ }
4305
+
4306
+ """Paginated list of product variants (Relay Connection)"""
4307
+ type ProductVariantConnection {
4308
+ """Variant edges with cursors"""
4309
+ edges: [ProductVariantEdge!]!
4310
+
4311
+ """Variant nodes (shortcut for edges.map(e => e.node))"""
4312
+ nodes: [ProductVariant!]!
4313
+
4314
+ """Pagination info"""
4315
+ pageInfo: PageInfo!
4316
+
4317
+ """Total count of variants"""
4318
+ totalCount: Int!
4319
+ }
4320
+
4321
+ """Edge in a ProductVariant connection"""
4322
+ type ProductVariantEdge {
4323
+ """Cursor for pagination"""
4324
+ cursor: String!
4325
+
4326
+ """Variant node"""
4327
+ node: ProductVariant!
3569
4328
  }
3570
4329
 
3571
4330
  """Catalog placement — PUBLIC | HIDDEN | BUNDLE_ONLY (Faza 1.5)"""
@@ -3579,9 +4338,6 @@ type Query {
3579
4338
  """List of all currencies supported by the system (ECB rates)"""
3580
4339
  allSupportedCurrencies: [Currency!]!
3581
4340
 
3582
- """Get available filters for product listing"""
3583
- availableFilters(input: AvailableFiltersInput): AvailableFilters!
3584
-
3585
4341
  """Get available payment methods"""
3586
4342
  availablePaymentMethods: AvailablePaymentMethods!
3587
4343
 
@@ -3639,13 +4395,6 @@ type Query {
3639
4395
  """Get cart by ID"""
3640
4396
  cart(id: ID!): Cart
3641
4397
 
3642
- """Get recommendations based on cart contents"""
3643
- cartRecommendations(
3644
- """Cart ID to base recommendations on"""
3645
- cartId: String!
3646
- first: Int = 4
3647
- ): CartRecommendations!
3648
-
3649
4398
  """Get category tree"""
3650
4399
  categories(
3651
4400
  """Cursor for pagination"""
@@ -3721,14 +4470,14 @@ type Query {
3721
4470
  code: String!
3722
4471
  ): Currency
3723
4472
 
3724
- """Get authenticated customer"""
3725
- customer(customerAccessToken: String!): Customer
4473
+ """Get authenticated customer (cookie / Authorization Bearer)"""
4474
+ customer: Customer
3726
4475
 
3727
4476
  """Get available customer groups"""
3728
4477
  customerGroups: [CustomerGroup!]
3729
4478
 
3730
4479
  """Get single order for authenticated customer"""
3731
- customerOrder(customerAccessToken: String!, orderId: ID!): Order
4480
+ customerOrder(orderId: ID!): Order
3732
4481
 
3733
4482
  """Estimate points for an order amount"""
3734
4483
  estimatePoints(
@@ -3745,8 +4494,8 @@ type Query {
3745
4494
  to: String!
3746
4495
  ): ExchangeRate
3747
4496
 
3748
- """Get gift card by code"""
3749
- giftCard(code: String!): GiftCardPayload!
4497
+ """Get gift card by code (null if not found)"""
4498
+ giftCard(code: String!): GiftCard
3750
4499
 
3751
4500
  """Validate gift card for use"""
3752
4501
  giftCardValidate(amount: Float, code: String!): GiftCardValidatePayload!
@@ -3754,6 +4503,9 @@ type Query {
3754
4503
  """Get available languages for this shop"""
3755
4504
  languages: [Language!]!
3756
4505
 
4506
+ """Localization context (kraje, języki, aktualny kraj/język klienta)"""
4507
+ localization: Localization!
4508
+
3757
4509
  """
3758
4510
  Fetch a single active location by ID. Returns null when missing, inactive, or owned by another shop (tenant isolation via StorefrontShopGuard).
3759
4511
  """
@@ -3763,7 +4515,7 @@ type Query {
3763
4515
  ): Location
3764
4516
 
3765
4517
  """
3766
- Paginated locations for the current shop (Shopify parity). Supports proximity (`near`), pickup-only filter (`hasPickupEnabled`), and `locationType` filter.
4518
+ Paginated locations for the current shop. Supports proximity (`near`), pickup-only filter (`hasPickupEnabled`), and `locationType` filter.
3767
4519
  """
3768
4520
  locations(
3769
4521
  """Cursor for pagination"""
@@ -3800,6 +4552,14 @@ type Query {
3800
4552
  """Get a navigation menu by handle"""
3801
4553
  menu(handle: String!): Menu
3802
4554
 
4555
+ """Universal ID-based lookup (Relay Node spec)"""
4556
+ node(id: ID!, type: NodeType!): Node
4557
+
4558
+ """
4559
+ Batch ID-based lookup; same NodeType dla all IDs. Missing/wrong IDs → null entries (preserved length).
4560
+ """
4561
+ nodes(ids: [ID!]!, type: NodeType!): [Node]!
4562
+
3803
4563
  """Get a page by handle or ID"""
3804
4564
  page(
3805
4565
  """Page handle"""
@@ -3827,6 +4587,9 @@ type Query {
3827
4587
  sortKey: PageSortKeys! = TITLE
3828
4588
  ): ShopPageConnection!
3829
4589
 
4590
+ """Get personalized product recommendations for the current customer"""
4591
+ personalizedRecommendations(first: Int = 10): ProductRecommendations!
4592
+
3830
4593
  """Get single product by ID or handle"""
3831
4594
  product(
3832
4595
  """Product handle (slug)"""
@@ -3836,6 +4599,11 @@ type Query {
3836
4599
  id: ID
3837
4600
  ): Product
3838
4601
 
4602
+ """
4603
+ Get available filters for product listing (renamed from availableFilters in Storefront 5.0)
4604
+ """
4605
+ productFilters(input: AvailableFiltersInput): AvailableFilters!
4606
+
3839
4607
  """Get recommended products similar to the given product"""
3840
4608
  productRecommendations(
3841
4609
  """Type of recommendations (SIMILAR, COMPLEMENTARY, UPSELL)"""
@@ -3851,62 +4619,84 @@ type Query {
3851
4619
  """Get product reviews"""
3852
4620
  productReviews(after: String, first: Int = 10, productId: ID!, reverse: Boolean = true, sortKey: ReviewSortKey = CREATED_AT): ProductReviewConnection!
3853
4621
 
3854
- """Search products"""
3855
- productSearch(
3856
- """Cursor for pagination"""
3857
- after: String
3858
-
3859
- """Filter options"""
3860
- filters: ProductFilterInput
3861
-
3862
- """Number of items to fetch"""
3863
- first: Int! = 20
3864
-
3865
- """Search query"""
3866
- query: String!
3867
- ): ProductConnection!
3868
-
3869
4622
  """List products with pagination and filtering"""
3870
4623
  products(
3871
- """Cursor for pagination"""
4624
+ """Cursor for forward pagination"""
3872
4625
  after: String
3873
4626
 
3874
- """Product filters"""
3875
- filters: ProductFilterInput
4627
+ """Cursor for backward pagination"""
4628
+ before: String
3876
4629
 
3877
- """Number of items to fetch"""
3878
- first: Int! = 20
4630
+ """Array of ProductFilter objects (multi-filter pattern)"""
4631
+ filters: [ProductFilter!]
3879
4632
 
3880
- """Search query"""
4633
+ """Number of items to fetch (forward pagination, max 100)"""
4634
+ first: Int
4635
+
4636
+ """Number of items to fetch (backward pagination, max 100)"""
4637
+ last: Int
4638
+
4639
+ """
4640
+ Search query (syntax: tag:, product_type:, vendor:, available_for_sale:, variants.price:>10, AND/OR/NOT)
4641
+ """
3881
4642
  query: String
3882
4643
 
3883
4644
  """Reverse sort order"""
3884
4645
  reverse: Boolean! = false
3885
4646
 
3886
4647
  """Sort key"""
3887
- sortKey: ProductSortKeys = BEST_SELLING
4648
+ sortKey: ProductSortKeys = RELEVANCE
3888
4649
  ): ProductConnection!
3889
4650
 
3890
- """Get personalized product recommendations"""
3891
- recommendations(first: Int = 10): ProductRecommendations!
3892
-
3893
4651
  """Get referral program statistics"""
3894
4652
  referralStats: ReferralStats
3895
4653
 
3896
4654
  """Get return by ID"""
3897
- return(customerAccessToken: String!, id: ID!): ReturnPayload!
4655
+ return(id: ID!): ReturnPayload!
3898
4656
 
3899
4657
  """Get available return reasons"""
3900
4658
  returnReasons: [ReturnReasonOption!]!
3901
4659
 
3902
4660
  """Get returns for an order"""
3903
- returnsByOrder(customerAccessToken: String!, orderId: ID!): ReturnConnection!
4661
+ returnsByOrder(orderId: ID!): ReturnConnection!
3904
4662
 
3905
4663
  """Get product review statistics"""
3906
4664
  reviewStats(productId: ID!): ReviewStats!
3907
4665
 
4666
+ """Search products (DoSwiftly alias for products() with required query)"""
4667
+ searchProducts(
4668
+ """Cursor for forward pagination"""
4669
+ after: String
4670
+
4671
+ """Cursor for backward pagination"""
4672
+ before: String
4673
+
4674
+ """Array of ProductFilter objects"""
4675
+ filters: [ProductFilter!]
4676
+
4677
+ """Number of items to fetch (forward pagination)"""
4678
+ first: Int
4679
+
4680
+ """Number of items to fetch (backward pagination)"""
4681
+ last: Int
4682
+
4683
+ """Search query (required)"""
4684
+ query: String!
4685
+ ): ProductConnection!
4686
+
4687
+ """
4688
+ Search suggestions (typeahead) — top-N products + styled query suggestions (Products only). Powered by PostgreSQL FTS with prefix matching for Polish morphology coverage.
4689
+ """
4690
+ searchSuggestions(
4691
+ """Maximum number of products to return (default 10, max 50)"""
4692
+ limit: Int = 10
4693
+
4694
+ """Search query (typeahead input)"""
4695
+ query: String!
4696
+ ): PredictiveSearchResult!
4697
+
3908
4698
  """Get shipment by ID"""
3909
- shipment(customerAccessToken: String!, id: ID!): ShipmentPayload!
4699
+ shipment(id: ID!): ShipmentPayload!
3910
4700
 
3911
4701
  """Get shipment by tracking number"""
3912
4702
  shipmentByTrackingNumber(trackingNumber: String!): ShipmentPayload!
@@ -3917,14 +4707,6 @@ type Query {
3917
4707
  """Get currency configuration for the current shop"""
3918
4708
  shopCurrencyConfig: ShopCurrencyConfig!
3919
4709
 
3920
- """Get products similar to a specific product"""
3921
- similarProducts(
3922
- first: Int = 6
3923
-
3924
- """Product ID to find similar products for"""
3925
- productId: String!
3926
- ): ProductRecommendations!
3927
-
3928
4710
  """Get translations for a language"""
3929
4711
  translations(input: TranslationsInput!): Translations!
3930
4712
 
@@ -3944,7 +4726,13 @@ type Query {
3944
4726
  ): Wishlist
3945
4727
 
3946
4728
  """Get customer wishlists (requires customer auth)"""
3947
- wishlists: [Wishlist!]!
4729
+ wishlists(
4730
+ """Cursor: return items after this cursor"""
4731
+ after: String
4732
+
4733
+ """First N items (1-100)"""
4734
+ first: Int = 20
4735
+ ): WishlistConnection!
3948
4736
  }
3949
4737
 
3950
4738
  """Type of product recommendations to return"""
@@ -3987,8 +4775,8 @@ type RedeemRewardPayload {
3987
4775
  """Whether redemption was successful"""
3988
4776
  success: Boolean!
3989
4777
 
3990
- """Error messages if any"""
3991
- userErrors: [String!]!
4778
+ """Typed user errors"""
4779
+ userErrors: [UserError!]!
3992
4780
  }
3993
4781
 
3994
4782
  """Referral program statistics"""
@@ -4334,6 +5122,15 @@ type SEO {
4334
5122
  title: String
4335
5123
  }
4336
5124
 
5125
+ """Predictive search query suggestion (typeahead)"""
5126
+ type SearchQuerySuggestion {
5127
+ """Suggestion with <mark> highlights matching the query prefix"""
5128
+ styledText: String!
5129
+
5130
+ """Plain text suggestion (product title)"""
5131
+ text: String!
5132
+ }
5133
+
4337
5134
  """Selected product option"""
4338
5135
  type SelectedOption {
4339
5136
  """Option name (e.g., "Size", "Color")"""
@@ -4356,8 +5153,8 @@ type Shipment {
4356
5153
  """When the shipment was delivered"""
4357
5154
  deliveredAt: DateTime
4358
5155
 
4359
- """Estimated delivery date"""
4360
- estimatedDeliveryDate: DateTime
5156
+ """Estimated delivery timestamp"""
5157
+ estimatedDeliveryAt: DateTime
4361
5158
 
4362
5159
  """Tracking events timeline"""
4363
5160
  events: [ShipmentEvent!]
@@ -4492,14 +5289,11 @@ enum ShipmentStatus {
4492
5289
 
4493
5290
  """Address input for shipping calculation"""
4494
5291
  input ShippingAddressInput {
4495
- """Street address line 1"""
4496
- address1: String
4497
-
4498
5292
  """City"""
4499
5293
  city: String
4500
5294
 
4501
- """Country code (ISO 3166-1 alpha-2)"""
4502
- country: String!
5295
+ """ISO 3166-1 alpha-2 country code"""
5296
+ country: CountryCode!
4503
5297
 
4504
5298
  """Email address"""
4505
5299
  email: String
@@ -4513,11 +5307,14 @@ input ShippingAddressInput {
4513
5307
  """Phone number"""
4514
5308
  phone: String
4515
5309
 
4516
- """Postal/ZIP code"""
5310
+ """Postal / ZIP code"""
4517
5311
  postalCode: String
4518
5312
 
4519
- """Province/State/Region"""
4520
- province: String
5313
+ """State / province / region"""
5314
+ state: String
5315
+
5316
+ """First line of street address"""
5317
+ streetLine1: String
4521
5318
  }
4522
5319
 
4523
5320
  """Shipping carrier information"""
@@ -4555,6 +5352,9 @@ type Shop {
4555
5352
  """Bot protection configuration (platform-level)"""
4556
5353
  botProtection: BotProtectionInfo
4557
5354
 
5355
+ """Industry-standard brand metadata (logo + slogan + colors)"""
5356
+ brand: Brand
5357
+
4558
5358
  """Complete branding configuration"""
4559
5359
  branding: ShopBranding
4560
5360
 
@@ -4564,14 +5364,20 @@ type Shop {
4564
5364
  """Contact email address"""
4565
5365
  contactEmail: String
4566
5366
 
5367
+ """Contact information policy"""
5368
+ contactInformation: ShopPolicy
5369
+
4567
5370
  """Contact phone number"""
4568
5371
  contactPhone: String
4569
5372
 
4570
5373
  """Default currency code (ISO 4217)"""
4571
- currencyCode: String!
5374
+ currencyCode: CurrencyCode!
5375
+
5376
+ """Customer account URL (login/orders) — z primaryDomain"""
5377
+ customerAccountUrl: URL
4572
5378
 
4573
- """Default language code"""
4574
- defaultLanguage: String
5379
+ """Default language code (ISO 639-1)"""
5380
+ defaultLanguage: LanguageCode
4575
5381
 
4576
5382
  """Shop description"""
4577
5383
  description: String
@@ -4579,26 +5385,55 @@ type Shop {
4579
5385
  """Shop unique identifier"""
4580
5386
  id: ID!
4581
5387
 
5388
+ """Legal notice / impressum"""
5389
+ legalNotice: ShopPolicy
5390
+
4582
5391
  """Locale to currency mapping for auto-detection (SSOT)"""
4583
5392
  localeToCurrencyMap: [LocaleCurrencyMapping!]!
4584
5393
 
4585
5394
  """Shop logo"""
4586
5395
  logo: Image
4587
5396
 
5397
+ """
5398
+ Money display format z `{{amount}}` placeholder, np. "{{amount}} zł"
5399
+ """
5400
+ moneyFormat: String!
5401
+
4588
5402
  """Shop name"""
4589
5403
  name: String!
4590
5404
 
4591
5405
  """Supported payment currencies"""
4592
- paymentCurrencies: [String!]!
5406
+ paymentCurrencies: [CurrencyCode!]!
5407
+
5408
+ """Payment configuration (currency, accepted cards, digital wallets)"""
5409
+ paymentSettings: PaymentSettings!
5410
+
5411
+ """Primary domain (host + URL + SSL state)"""
5412
+ primaryDomain: Domain!
4593
5413
 
4594
- """Primary domain URL"""
4595
- primaryDomain: String
5414
+ """Privacy policy"""
5415
+ privacyPolicy: ShopPolicy
5416
+
5417
+ """Refund / return policy"""
5418
+ refundPolicy: ShopPolicy
5419
+
5420
+ """Shipping policy"""
5421
+ shippingPolicy: ShopPolicy
5422
+
5423
+ """Countries shop ships to (z shipping zones)"""
5424
+ shipsToCountries: [CountryCode!]!
4596
5425
 
4597
5426
  """Supported currencies for price display"""
4598
- supportedCurrencies: [String!]!
5427
+ supportedCurrencies: [CurrencyCode!]!
4599
5428
 
4600
- """Supported languages"""
4601
- supportedLanguages: [String!]
5429
+ """Supported languages (ISO 639-1)"""
5430
+ supportedLanguages: [LanguageCode!]
5431
+
5432
+ """Terms of sale"""
5433
+ termsOfSale: ShopPolicy
5434
+
5435
+ """Terms of service"""
5436
+ termsOfService: ShopPolicy
4602
5437
 
4603
5438
  """Shop timezone"""
4604
5439
  timezone: String
@@ -4606,23 +5441,23 @@ type Shop {
4606
5441
 
4607
5442
  """Shop physical address"""
4608
5443
  type ShopAddress {
4609
- """Street address line 1"""
4610
- address1: String
4611
-
4612
- """Street address line 2"""
4613
- address2: String
4614
-
4615
5444
  """City"""
4616
5445
  city: String
4617
5446
 
4618
5447
  """Country code (ISO 3166-1 alpha-2)"""
4619
5448
  country: String
4620
5449
 
4621
- """Postal/ZIP code"""
5450
+ """Postal / ZIP code"""
4622
5451
  postalCode: String
4623
5452
 
4624
- """State/Province"""
5453
+ """State / province"""
4625
5454
  state: String
5455
+
5456
+ """First line of street address"""
5457
+ streetLine1: String
5458
+
5459
+ """Second line of street address"""
5460
+ streetLine2: String
4626
5461
  }
4627
5462
 
4628
5463
  """Shop branding configuration"""
@@ -4687,11 +5522,11 @@ type ShopPage {
4687
5522
  """HTML body content"""
4688
5523
  body: String!
4689
5524
 
4690
- """Auto-generated plain text summary"""
4691
- bodySummary: String!
4692
-
4693
5525
  """Created date (ISO 8601)"""
4694
- createdAt: String!
5526
+ createdAt: DateTime!
5527
+
5528
+ """Auto-generated plain text summary"""
5529
+ excerpt: String!
4695
5530
 
4696
5531
  """URL handle"""
4697
5532
  handle: String!
@@ -4700,7 +5535,7 @@ type ShopPage {
4700
5535
  id: ID!
4701
5536
 
4702
5537
  """Publish date (ISO 8601)"""
4703
- publishedAt: String
5538
+ publishedAt: DateTime
4704
5539
 
4705
5540
  """SEO metadata"""
4706
5541
  seo: SEO
@@ -4709,7 +5544,7 @@ type ShopPage {
4709
5544
  title: String!
4710
5545
 
4711
5546
  """Updated date (ISO 8601)"""
4712
- updatedAt: String!
5547
+ updatedAt: DateTime!
4713
5548
  }
4714
5549
 
4715
5550
  """Paginated shop pages"""
@@ -4733,6 +5568,24 @@ type ShopPageEdge {
4733
5568
  node: ShopPage!
4734
5569
  }
4735
5570
 
5571
+ """Shop legal/info policy document"""
5572
+ type ShopPolicy implements Node {
5573
+ """Policy body (markdown)"""
5574
+ body: String!
5575
+
5576
+ """URL-friendly handle (slug)"""
5577
+ handle: String!
5578
+
5579
+ """Globally-unique identifier"""
5580
+ id: ID!
5581
+
5582
+ """Policy title (e.g. "Privacy Policy")"""
5583
+ title: String!
5584
+
5585
+ """Canonical URL on storefront"""
5586
+ url: URL!
5587
+ }
5588
+
4736
5589
  """Shop social media links"""
4737
5590
  type SocialLinks {
4738
5591
  """Facebook page URL"""
@@ -4757,10 +5610,15 @@ type SocialLinks {
4757
5610
  youtube: String
4758
5611
  }
4759
5612
 
4760
- """Per-location stock availability (Shopify StoreAvailability parity)"""
5613
+ """Per-location stock availability"""
4761
5614
  type StoreAvailability {
5615
+ """
5616
+ Available stock at this location (computed: stock - reserved). Token-gated: null for anonymous requests, Int for authenticated customer context.
5617
+ """
5618
+ availableStock: Int
5619
+
4762
5620
  """Whether the variant is in stock at this location"""
4763
- available: Boolean!
5621
+ isAvailable: Boolean!
4764
5622
 
4765
5623
  """Location where this stock resides"""
4766
5624
  location: Location!
@@ -4768,12 +5626,7 @@ type StoreAvailability {
4768
5626
  """
4769
5627
  Human-readable pickup readiness string, localized (e.g., "Usually ready in 2 hours"). Null if location does not support pickup.
4770
5628
  """
4771
- pickUpTime: String
4772
-
4773
- """
4774
- Quantity available at this location. Token-gated: null for anonymous requests, Int for authenticated customer context (Shopify parity).
4775
- """
4776
- quantityAvailable: Int
5629
+ pickupTime: String
4777
5630
  }
4778
5631
 
4779
5632
  """Paginated store availability connection"""
@@ -4887,6 +5740,22 @@ input TranslationsInput {
4887
5740
  namespaces: [String!]
4888
5741
  }
4889
5742
 
5743
+ """
5744
+ URL string per RFC 3986 (e.g. "https://shop.example.com/products/foo").
5745
+ """
5746
+ scalar URL
5747
+
5748
+ """Measurement system (metric vs imperial) — wpływa na display formats"""
5749
+ enum UnitSystem {
5750
+ IMPERIAL_SYSTEM
5751
+ METRIC_SYSTEM
5752
+ }
5753
+
5754
+ """
5755
+ Unsigned 64-bit integer, JSON-serialized as String (BigInt-safe). Format: "{integer}".
5756
+ """
5757
+ scalar UnsignedInt64
5758
+
4890
5759
  """URL redirect (SEO, store migration)"""
4891
5760
  type UrlRedirect {
4892
5761
  """Source path"""
@@ -4917,7 +5786,7 @@ type UserError {
4917
5786
  message: String!
4918
5787
  }
4919
5788
 
4920
- """Per-product variant option filter (Color, Size, …)"""
5789
+ """Per-product variant option filter (e.g. Color=Red)"""
4921
5790
  input VariantOptionFilter {
4922
5791
  """Option name (e.g. "Color")"""
4923
5792
  name: String!
@@ -4926,6 +5795,23 @@ input VariantOptionFilter {
4926
5795
  value: String!
4927
5796
  }
4928
5797
 
5798
+ """Weight value with unit"""
5799
+ type Weight {
5800
+ """Weight unit"""
5801
+ unit: WeightUnit!
5802
+
5803
+ """Weight value"""
5804
+ value: Float!
5805
+ }
5806
+
5807
+ """Weight unit (GRAMS canonical, KILOGRAMS/OUNCES/POUNDS for display)"""
5808
+ enum WeightUnit {
5809
+ GRAMS
5810
+ KILOGRAMS
5811
+ OUNCES
5812
+ POUNDS
5813
+ }
5814
+
4929
5815
  """Customer wishlist"""
4930
5816
  type Wishlist {
4931
5817
  """Created date"""
@@ -4951,12 +5837,36 @@ type Wishlist {
4951
5837
  updatedAt: DateTime!
4952
5838
  }
4953
5839
 
5840
+ """Paginated list of wishlists"""
5841
+ type WishlistConnection {
5842
+ """Wishlist edges with cursors"""
5843
+ edges: [WishlistEdge!]!
5844
+
5845
+ """Wishlist nodes (shortcut for edges.map(e => e.node))"""
5846
+ nodes: [Wishlist!]!
5847
+
5848
+ """Pagination info"""
5849
+ pageInfo: PageInfo!
5850
+
5851
+ """Total count of wishlists"""
5852
+ totalCount: Int!
5853
+ }
5854
+
4954
5855
  """Input for creating a wishlist"""
4955
5856
  input WishlistCreateInput {
4956
5857
  isPublic: Boolean = false
4957
5858
  name: String = "My Wishlist"
4958
5859
  }
4959
5860
 
5861
+ """Wishlist edge for pagination"""
5862
+ type WishlistEdge {
5863
+ """Cursor for pagination"""
5864
+ cursor: String!
5865
+
5866
+ """Wishlist node"""
5867
+ node: Wishlist!
5868
+ }
5869
+
4960
5870
  """Wishlist item"""
4961
5871
  type WishlistItem {
4962
5872
  """Date added"""
@@ -4970,7 +5880,7 @@ type WishlistItem {
4970
5880
  notifyOnSale: Boolean!
4971
5881
 
4972
5882
  """Price when added to wishlist"""
4973
- priceAtAdd: Money!
5883
+ priceWhenAdded: Money!
4974
5884
 
4975
5885
  """Product details"""
4976
5886
  product: Product
@@ -4991,7 +5901,7 @@ input WishlistItemInput {
4991
5901
 
4992
5902
  """Wishlist mutation payload"""
4993
5903
  type WishlistPayload {
4994
- """User errors"""
4995
- userErrors: [String!]!
5904
+ """Typed user errors"""
5905
+ userErrors: [UserError!]!
4996
5906
  wishlist: Wishlist
4997
5907
  }