@doswiftly/storefront-operations 17.0.0 → 18.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
@@ -77,7 +77,7 @@ type AttributeDefinition {
77
77
  name: String!
78
78
 
79
79
  """
80
- Faza 3 Opcja A (2026-05-17): opcjonalne grupowanie atrybutu (np. "inventory", "marketing", "content"). NULL = atrybut bez grupy. Pomaga storefront-devom rozpoznać "te atrybuty są custom dane ERP" vs "te filtrowalne cechy katalogu".
80
+ Optional grouping namespace (e.g. "inventory", "marketing", "content"). NULL = ungrouped. Helps distinguish custom ERP-data attributes from filterable catalog facets.
81
81
  """
82
82
  namespace: String
83
83
 
@@ -109,7 +109,7 @@ input AttributeFilterInput {
109
109
  minValue: Float
110
110
 
111
111
  """
112
- Opcjonalny dyskryminator grupy atrybutów (np. "inventory", "marketing"). Faza 3 Opcja A (2026-05-17): konsolidacja MetaProperty-style custom fields pod AttributeDefinition — namespace pozwala filtrować "Marka z grupy XYZ" gdy multiple shopów ma `Marka` w różnych grupach.
112
+ Optional attribute-group discriminator (e.g. "inventory", "marketing"). Lets you filter a grouped attribute (e.g. "Brand in group XYZ") when the same attribute name exists under different groups.
113
113
  """
114
114
  namespace: String
115
115
 
@@ -146,7 +146,7 @@ type AttributeFilterValue {
146
146
 
147
147
  """Paginated + searchable attribute options (Relay Connection)"""
148
148
  type AttributeFilterValueConnection {
149
- """Paginated edges z cursorami"""
149
+ """Paginated edges with cursors"""
150
150
  edges: [AttributeFilterValueEdge!]!
151
151
 
152
152
  """Shortcut: edges.map(e => e.node)"""
@@ -156,12 +156,12 @@ type AttributeFilterValueConnection {
156
156
  pageInfo: PageInfo!
157
157
 
158
158
  """
159
- Total number of attribute options matching the filter (po zastosowaniu search + context). NIE zmienia się przy paginacji pokazuje pełną liczbę dla counter UI.
159
+ Total number of attribute options matching the filter (after applying search + context). Stable across pagination shows the full count for a counter UI.
160
160
  """
161
161
  totalCount: Int!
162
162
  }
163
163
 
164
- """Edge w AttributeFilterValueConnection (Relay spec)"""
164
+ """Edge in AttributeFilterValueConnection (Relay spec)"""
165
165
  type AttributeFilterValueEdge {
166
166
  """
167
167
  Opaque pagination cursor (base64-encoded). Echo as `after` for next page.
@@ -189,27 +189,27 @@ enum AttributeOptionSurchargeType {
189
189
  PERCENT
190
190
  }
191
191
 
192
- """Input dla attributeOptionsSearch query"""
192
+ """Input for the attributeOptionsSearch query"""
193
193
  input AttributeOptionsSearchInput {
194
- """Opaque cursor z pageInfo.endCursor poprzedniej strony"""
194
+ """Opaque cursor from the previous page (pageInfo.endCursor)"""
195
195
  after: String
196
196
 
197
197
  """
198
- Produktowy kontekst (categoryId/collectionId/searchQuery/currentFilters) dla accurate productCount. Exclude-self: gdy currentFilters zawiera ten sam atrybut, jest pomijany.
198
+ Product context (categoryId/collectionId/searchQuery/currentFilters) for accurate productCount. Exclude-self: when currentFilters contains the same attribute, it is skipped.
199
199
  """
200
200
  contextInput: AvailableFiltersInput
201
201
 
202
- """Liczba zwracanych opcji (default 50, max 100)"""
202
+ """Number of options returned (default 50, max 100)"""
203
203
  first: Int
204
204
 
205
- """Attribute handle (URL-friendly identifier, np. "licencja")"""
205
+ """Attribute handle (URL-friendly identifier, e.g. "license")"""
206
206
  handle: String!
207
207
 
208
- """Wyszukiwanie po value/label (case-insensitive ILIKE, max 100 znaków)"""
208
+ """Search by value/label (case-insensitive, max 100 characters)"""
209
209
  search: String
210
210
 
211
211
  """
212
- Sort — COUNT_DESC default (most popular first), LABEL_ASC dla alphabetical
212
+ Sort — COUNT_DESC default (most popular first), LABEL_ASC for alphabetical
213
213
  """
214
214
  sort: AttributeOptionsSearchSort
215
215
  }
@@ -322,8 +322,10 @@ type AttributeSwatch {
322
322
  """Hex color code (e.g., #FF5733)"""
323
323
  colorHex: String
324
324
 
325
- """Image URL for pattern swatches"""
326
- imageUrl: String
325
+ """
326
+ Image swatch for pattern/material attributes (e.g. fabric texture, wood grain). Use `image { url(transform: { maxWidth: 80 }) altText }` for small swatch tiles. Mutually meaningful with `colorHex` only when storefront chooses to render texture-over-color preview.
327
+ """
328
+ image: Image
327
329
  }
328
330
 
329
331
  """Type of product attribute"""
@@ -345,7 +347,7 @@ enum AttributeType {
345
347
  """Available filters for product listing"""
346
348
  type AvailableFilters {
347
349
  """
348
- Liczba currently applied filters w `currentFilters` (Storefront UI renderuje "Filtry (3)" w sidebar header).
350
+ Number of currently applied filters in `currentFilters` (render as "Filters (3)" in a sidebar header).
349
351
  """
350
352
  activeCount: Int!
351
353
 
@@ -353,12 +355,12 @@ type AvailableFilters {
353
355
  attributes: [AttributeDefinition!]!
354
356
 
355
357
  """
356
- Boolean facet count: liczba produktów w current context spełniających `Product.isAvailable` (przynajmniej jeden aktywny wariant z untracked inventory LUB available>0). Exclude-self: jeśli `available: true` jest w `currentFilters`, count IGNORUJE ten filtr i pokazuje "ile produktów dostępnych w bazowym kontekście" (nie "ile teraz widać"). Spójne semantically z `attributes[].filterValues[].productCount` (per-enum-value facet) i `brands[].productCount` (per-brand facet) — wszystkie używają exclude-self per dimension. Untracked inventory (gift cards, digital, na-zamówienie) zawsze liczy się jako available.
358
+ Boolean facet count: number of products in the current context that satisfy `Product.isAvailable` (at least one active variant with untracked inventory OR available>0). Exclude-self: if `available: true` is in `currentFilters`, the count IGNORES that filter and shows "how many products are available in the base context" (not "how many are visible right now"). Semantically consistent with `attributes[].filterValues[].productCount` (per-enum-value facet) and `brands[].productCount` (per-brand facet) — all use exclude-self per dimension. Untracked inventory (gift cards, digital, made-to-order) always counts as available.
357
359
  """
358
360
  availableCount: Int!
359
361
 
360
362
  """
361
- Faza 3 (2026-05-17): canonical Brand entities z product counts w current context. Storefront UI renderuje checkbox list / dropdown z logo per brand. Klik `filters: [{brand: {handle}}]`. Tylko brandy z >0 produktów w current product set + isActive=true.
363
+ Canonical Brand entities with product counts in the current context. Render a checkbox list / dropdown with a logo per brand; clicking maps to `filters: [{brand: {handle}}]`. Only brands with >0 products in the current product set and isActive=true are returned.
362
364
  """
363
365
  brands: [BrandFilterValue!]
364
366
 
@@ -369,7 +371,7 @@ type AvailableFilters {
369
371
  priceRange: PriceRange
370
372
 
371
373
  """
372
- Total products w current context (categoryId/collectionId/searchQuery) PRZED zaaplikowaniem faceted filters z `currentFilters`. Spójne z `ProductConnection.totalCount` Relay Connection spec — gdy `currentFilters` jest pusty, `AvailableFilters.totalCount` === `products(filters).totalCount`. Użyj do "Wszystkie produkty (N)" w sidebar header.
374
+ Total products in the current context (categoryId/collectionId/searchQuery) BEFORE applying the faceted filters in `currentFilters`. Consistent with the `ProductConnection.totalCount` Relay Connection spec — when `currentFilters` is empty, `AvailableFilters.totalCount` === `products(filters).totalCount`. Use for "All products (N)" in a sidebar header.
373
375
  """
374
376
  totalCount: Int!
375
377
  }
@@ -377,7 +379,7 @@ type AvailableFilters {
377
379
  """Context for available filters query"""
378
380
  input AvailableFiltersInput {
379
381
  """
380
- Czy filtr "dostępne" jest currently zaaplikowany. Mirror `ProductFilter.available`. Backend używa do exclude-self semantyki: gdy `available: true` (lub `false`) tutaj, `AvailableFilters.availableCount` IGNORUJE ten filtr (pokazuje "ile produktów ten facet odsłoni gdy włączysz"), pozostałe facet counts (`attributes[].filterValues[].productCount`, `brands[].productCount`, `categories[].productCount`) APLIKUJĄ go (pokazują "ile produktów w obecnym kontekście + tym facet"). Pomiń (null/undefined) gdy storefront nie aplikuje "dostępne" filter.
382
+ Whether the "available" filter is currently applied. Mirrors `ProductFilter.available`. Drives exclude-self semantics: when `available: true` (or `false`) here, `AvailableFilters.availableCount` IGNORES this filter (shows "how many products this facet reveals when enabled"), while the other facet counts (`attributes[].filterValues[].productCount`, `brands[].productCount`, `categories[].productCount`) APPLY it (show "how many products in the current context plus this facet"). Omit (null/undefined) when the storefront does not apply the "available" filter.
381
383
  """
382
384
  available: Boolean
383
385
 
@@ -388,7 +390,7 @@ input AvailableFiltersInput {
388
390
  collectionId: ID
389
391
 
390
392
  """
391
- Currently applied attribute filters (to update facet counts). Per facet `productCount` używa exclude-self pattern: gdy attrId X jest w currentFilters, facet values X.* liczone IGNORUJĄC X (pokazują "ile produktów dla X=Y w pozostałym kontekście"). Pozostałe attrIds aplikowane.
393
+ Currently applied attribute filters (to update facet counts). Each facet `productCount` uses the exclude-self pattern: when attrId X is in currentFilters, facet values X.* are counted IGNORING X (showing "how many products for X=Y in the remaining context"). Other attrIds are applied.
392
394
  """
393
395
  currentFilters: [AttributeFilterInput!]
394
396
 
@@ -712,7 +714,7 @@ type BotProtectionProviderInfo {
712
714
  }
713
715
 
714
716
  """
715
- Canonical product brand entity (np. Funko, Nike). Distinct od ShopBrand (shop branding metadata).
717
+ Canonical product brand entity (e.g. Funko, Nike). Distinct from ShopBrand (shop branding metadata).
716
718
  """
717
719
  type Brand {
718
720
  """URL-friendly handle (e.g. "funko" → /brands/funko). Stable per-shop."""
@@ -721,8 +723,10 @@ type Brand {
721
723
  """Brand unique identifier"""
722
724
  id: ID!
723
725
 
724
- """Brand logo URL (CDN-served, storefront-rendered)"""
725
- logo: String
726
+ """
727
+ Brand logo image. Use `logo { url(transform: { maxWidth: 200 }) altText }` for responsive sizing on brand tiles, breadcrumbs, and brand landing pages.
728
+ """
729
+ logo: Image
726
730
 
727
731
  """Brand display name (e.g. "Funko", "Nintendo")"""
728
732
  name: String!
@@ -743,10 +747,10 @@ type BrandColors {
743
747
  secondary: BrandColorGroup
744
748
  }
745
749
 
746
- """Filter products po brand (canonical entity)"""
750
+ """Filter products by brand (canonical entity)"""
747
751
  input BrandFilter {
748
752
  """
749
- Brand handle — URL-friendly identifier. Preferowany over `id` dla storefront refetch (stable po URL share).
753
+ Brand handle — URL-friendly identifier. Preferred over `id` for storefront refetch (stable across URL shares).
750
754
  """
751
755
  handle: String
752
756
 
@@ -754,21 +758,23 @@ input BrandFilter {
754
758
  id: ID
755
759
  }
756
760
 
757
- """Brand filter value z product count"""
761
+ """Brand filter value with product count"""
758
762
  type BrandFilterValue {
759
- """Brand handle (refetch payload — paste w ProductFilter.brand.handle)"""
763
+ """Brand handle (refetch payload — paste into ProductFilter.brand.handle)"""
760
764
  handle: String!
761
765
 
762
766
  """Brand ID"""
763
767
  id: ID!
764
768
 
765
- """Brand logo URL (UI rendering)"""
766
- logo: String
769
+ """
770
+ Brand logo image (UI rendering — facet sidebars / dropdowns). Use `logo { url(transform: { maxWidth: 80 }) altText }` for small thumbs.
771
+ """
772
+ logo: Image
767
773
 
768
774
  """Brand name"""
769
775
  name: String!
770
776
 
771
- """Liczba produktów z tym brandem w current product set"""
777
+ """Number of products with this brand in the current product set"""
772
778
  productCount: Int!
773
779
  }
774
780
 
@@ -881,14 +887,19 @@ type Cart implements Node {
881
887
  attributes: [CartAttribute!]!
882
888
 
883
889
  """
884
- Available payment methods dla tego cartadeduplikowane per type, sorted by merchant priority.
890
+ Available payment methods for this cartdeduplicated per type, sorted by merchant priority.
885
891
  """
886
892
  availablePaymentMethods: [PaymentMethod!]!
887
893
 
888
894
  """
889
895
  Shipping methods available for this cart at the given destination. Reads the cart subtotal and weight directly — for pre-cart preview (e.g. a product detail page calculator) use the top-level `availableShippingMethods(address, cart)` query instead. Returns an empty `methods` list plus a `DIGITAL_ONLY_NO_SHIPPING` user error when the cart has no shippable items; the storefront can use this to skip the shipping step entirely.
890
896
  """
891
- availableShippingMethods(address: ShippingAddressInput!): AvailableShippingMethodsPayload!
897
+ availableShippingMethods(
898
+ """
899
+ Destination address — country (ISO 3166-1 alpha-2), region, postal code and city
900
+ """
901
+ address: ShippingAddressInput!
902
+ ): AvailableShippingMethodsPayload!
892
903
 
893
904
  """
894
905
  Billing address attached to the cart via `cartSetBillingAddress`. Null when the buyer reuses the shipping address as billing (the order will then mirror the shipping address).
@@ -937,7 +948,23 @@ type Cart implements Node {
937
948
  id: ID!
938
949
 
939
950
  """Lines in the cart (paginated, Relay Connection)."""
940
- lines(after: String, before: String, first: Float, last: Float): CartLineConnection!
951
+ lines(
952
+ """
953
+ Cursor for forward pagination (cursor of the last edge from the previous page)
954
+ """
955
+ after: String
956
+
957
+ """
958
+ Cursor for backward pagination (cursor of the first edge from the next page)
959
+ """
960
+ before: String
961
+
962
+ """Number of lines to return from the start (forward pagination, max 100)"""
963
+ first: Float
964
+
965
+ """Number of lines to return from the end (backward pagination, max 100)"""
966
+ last: Float
967
+ ): CartLineConnection!
941
968
 
942
969
  """
943
970
  Buyer-supplied note (e.g. delivery instructions). Free-form, surfaced to the merchant on the order.
@@ -950,7 +977,10 @@ type Cart implements Node {
950
977
  phone: String
951
978
 
952
979
  """Product recommendations based on cart contents"""
953
- recommendations(first: Int = 4): CartRecommendations
980
+ recommendations(
981
+ """Number of cart-based recommendations per bucket (default 4, max 100)"""
982
+ first: Int = 4
983
+ ): CartRecommendations
954
984
 
955
985
  """
956
986
  True when at least one line in the cart requires physical shipping. False when every line is non-physical (digital, gift card, service, subscription). Use as the single signal to render or skip the shipping step in checkout.
@@ -958,9 +988,9 @@ type Cart implements Node {
958
988
  requiresShipping: Boolean!
959
989
 
960
990
  """
961
- Optional concrete instrument code selected within `selectedPaymentMethod` (e.g. `"blik"`, `"mb"`, `"154"`). Set gdy klient klika konkretny instrument tile na storefront (per `PaymentMethod.instruments`). Pre-payment intent: skopiowany do `Order.paymentInstrumentCode` przy `cartComplete`. Storefront może cross-reference z `availablePaymentMethods.methods[].instruments[]` żeby dostać `displayName` / `brandImageUrl`. Added by payment-instrument-preselection core sprint Req 3 AC7.
991
+ Optional concrete instrument code selected within `selectedPaymentMethod` (e.g. `"blik"`, `"mb"`, `"154"`). Set when the buyer clicks a specific instrument tile on the storefront (per `PaymentMethod.instruments`). Pre-payment intent: copied to `Order.paymentInstrument` on `cartComplete`. Cross-reference with `availablePaymentMethods.methods[].instruments[]` to resolve `displayName` / `brandImage { url }`.
962
992
  """
963
- selectedPaymentInstrumentCode: String
993
+ selectedPaymentInstrument: String
964
994
 
965
995
  """
966
996
  The payment method currently selected on the cart. Null until the buyer picks a method via `cartSelectPaymentMethod`.
@@ -991,7 +1021,7 @@ type Cart implements Node {
991
1021
  updatedAt: DateTime!
992
1022
 
993
1023
  """
994
- Non-fatal advisories computed at query time. Currently emitted: `PAYMENT_SELECTION_STALE` when `selectedPaymentMethod` / `selectedPaymentInstrumentCode` are no longer in live gateway capabilities (storefront re-prompts the buyer). Read-only — backend state is not mutated. Added by payment-instrument-preselection-advanced sub-sprint Adv-2 Req 1.
1024
+ Non-fatal advisories computed at query time. Currently emitted: `PAYMENT_SELECTION_STALE` when `selectedPaymentMethod` / `selectedPaymentInstrument` are no longer in live gateway capabilities (storefront re-prompts the buyer). Read-only — backend state is not mutated.
995
1025
  """
996
1026
  warnings: [CartWarning!]!
997
1027
  }
@@ -1184,7 +1214,7 @@ input CartBuyerIdentityInput {
1184
1214
  }
1185
1215
 
1186
1216
  """
1187
- Input for `cartClearPaymentSelection` — explicit deselect mutation. Use when the buyer goes back to the payment method picker w accordion UI bez hack typu re-selectując method. Atomic NULL na wszystkich payment selection fields (method type + provider code + instrument code + legacy method ID). Idempotent — wielokrotne wywołanie = same final state. Added by payment-instrument-preselection-advanced Adv-1 Req 3.1.
1217
+ Input for `cartClearPaymentSelection` — explicit deselect mutation. Use when the buyer goes back to the payment method picker in an accordion UI instead of re-selecting a method as a workaround. Atomically nulls all payment selection fields (method type + provider code + instrument code + legacy method ID). Idempotent — repeated calls yield the same final state.
1188
1218
  """
1189
1219
  input CartClearPaymentSelectionInput {
1190
1220
  """ID of the cart to clear payment selection on."""
@@ -1192,10 +1222,10 @@ input CartClearPaymentSelectionInput {
1192
1222
  }
1193
1223
 
1194
1224
  """
1195
- Result of `cartClearPaymentSelection`. `cart` populated on success z cleared selection fields (`selectedPaymentMethod === null`, `selectedPaymentInstrumentCode === null`). `userErrors` populated gdy cart locked (CONVERTED status → `ALREADY_COMPLETED` code).
1225
+ Result of `cartClearPaymentSelection`. `cart` is populated on success with cleared selection fields (`selectedPaymentMethod === null`, `selectedPaymentInstrument === null`). `userErrors` is populated when the cart is locked (CONVERTED status → `ALREADY_COMPLETED` code).
1196
1226
  """
1197
1227
  type CartClearPaymentSelectionPayload {
1198
- """The updated cart z cleared payment selection."""
1228
+ """The updated cart with cleared payment selection."""
1199
1229
  cart: Cart
1200
1230
 
1201
1231
  """
@@ -1588,7 +1618,7 @@ type CartRemoveLinesPayload {
1588
1618
  }
1589
1619
 
1590
1620
  """
1591
- Input for `cartSelectPaymentMethod` (Intelligent Payment Methods). Method-centric: the buyer picks a category (BLIK, CARD, BANK_TRANSFER, ...) and the backend resolves the preferred provider from `MerchantPaymentConfig` (priority-sorted, merchant-configurable per shop). Optional `preferredProviderCode` + `preferredInstrumentCode` enable instrument-level deep-link na gateway hosted page (skipa default landing).
1621
+ Input for `cartSelectPaymentMethod` (Intelligent Payment Methods). Method-centric: the buyer picks a category (BLIK, CARD, BANK_TRANSFER, ...) and the backend resolves the preferred provider from `MerchantPaymentConfig` (priority-sorted, merchant-configurable per shop). Optional `preferredProvider` + `preferredInstrument` enable instrument-level deep-link to the gateway hosted page (skips the default landing).
1592
1622
  """
1593
1623
  input CartSelectPaymentMethodInput {
1594
1624
  """ID of the cart to update."""
@@ -1600,14 +1630,14 @@ input CartSelectPaymentMethodInput {
1600
1630
  methodType: PaymentMethodType!
1601
1631
 
1602
1632
  """
1603
- Optional gateway-specific instrument code (`blik`, `mb`, `c`, `154`, ...) z `PaymentMethod.instruments[].instrumentCode`. Wymaga ustawienia `preferredProviderCode` — instrument code jest provider-specific. Bez restrictive regex (różne bramki używają `.` / `:` / `/` w przyszłości). SQL injection chroniona przez Prisma parametrized queries. Added by payment-instrument-preselection core sprint Req 3.1.
1633
+ Optional gateway-specific instrument code (`blik`, `mb`, `c`, `154`, ...) from `PaymentMethod.instruments[].code`. Requires `preferredProvider` to be set — instrument codes are provider-specific. No restrictive format is enforced, since different gateways may use `.` / `:` / `/` in future codes.
1604
1634
  """
1605
- preferredInstrumentCode: String
1635
+ preferredInstrument: String
1606
1636
 
1607
1637
  """
1608
- Optional override of `PaymentMethod.preferredProvider`. Pass a provider code (`payu`, `przelewy24`, ...) from `providersAvailable` when the buyer explicitly picks one (rare usually the merchant priority is enough). Format: lowercase alphanumerics + underscore + hyphen, 2-50 characters. Renamed from `preferredProviderId` `*Code` is reserved for lowercase string identifiers, `*Id` for UUIDs.
1638
+ Optional override of `PaymentMethod.preferredProvider`. Pass a `PaymentProvider` enum value (`PAYU`, `PRZELEWY24`, ...) read off `providersAvailable` / `PaymentInstrument.provider` when the buyer explicitly picks a gateway. Symmetric with the output forward `instrument.provider` straight back, no case conversion.
1609
1639
  """
1610
- preferredProviderCode: String
1640
+ preferredProvider: PaymentProvider
1611
1641
  }
1612
1642
 
1613
1643
  """Result of `cartSelectPaymentMethod`."""
@@ -1894,7 +1924,17 @@ type Category {
1894
1924
  productCount: Int!
1895
1925
 
1896
1926
  """Products in category"""
1897
- products(after: String, first: Float! = 20): CategoryConnection!
1927
+ products(
1928
+ """
1929
+ Cursor for forward pagination (cursor of the last edge from the previous page)
1930
+ """
1931
+ after: String
1932
+
1933
+ """
1934
+ Number of products to return from the start (forward pagination, max 100)
1935
+ """
1936
+ first: Float! = 20
1937
+ ): CategoryConnection!
1898
1938
 
1899
1939
  """SEO metadata"""
1900
1940
  seo: SEO
@@ -1975,7 +2015,38 @@ type Collection implements Node {
1975
2015
  image: Image
1976
2016
 
1977
2017
  """Products in collection"""
1978
- products(after: String, before: String, filters: [ProductFilter!], first: Int, last: Int, reverse: Boolean = false, sortKey: ProductSortKeys = BEST_SELLING): ProductConnection!
2018
+ products(
2019
+ """
2020
+ Cursor for forward pagination (cursor of the last edge from the previous page)
2021
+ """
2022
+ after: String
2023
+
2024
+ """
2025
+ Cursor for backward pagination (cursor of the first edge from the next page)
2026
+ """
2027
+ before: String
2028
+
2029
+ """
2030
+ Faceted filters to narrow the result set (collection scope always wins)
2031
+ """
2032
+ filters: [ProductFilter!]
2033
+
2034
+ """
2035
+ Number of products to return from the start (forward pagination, max 100)
2036
+ """
2037
+ first: Int
2038
+
2039
+ """
2040
+ Number of products to return from the end (backward pagination, max 100)
2041
+ """
2042
+ last: Int
2043
+
2044
+ """Reverse the sort order when true (descending by sortKey)"""
2045
+ reverse: Boolean = false
2046
+
2047
+ """Sort key for ordering products within the collection"""
2048
+ sortKey: ProductSortKeys = BEST_SELLING
2049
+ ): ProductConnection!
1979
2050
 
1980
2051
  """SEO metadata"""
1981
2052
  seo: SEO
@@ -2037,24 +2108,24 @@ type ConvertedPriceRange {
2037
2108
  minVariantPrice: PriceMoney!
2038
2109
  }
2039
2110
 
2040
- """Wspierany kraj sklepu (ISO 3166-1 alpha-2)"""
2111
+ """A country supported by the shop (ISO 3166-1 alpha-2)"""
2041
2112
  type Country implements Node {
2042
- """Języki wspierane przez sklep dostępne w tym kraju"""
2113
+ """Shop languages available in this country"""
2043
2114
  availableLanguages: [Language!]!
2044
2115
 
2045
- """Primary currency w tym kraju"""
2116
+ """Primary currency in this country"""
2046
2117
  currency: Currency!
2047
2118
 
2048
- """Globally-unique identifier (np. "country:PL")"""
2119
+ """Globally-unique identifier (e.g. "country:PL")"""
2049
2120
  id: ID!
2050
2121
 
2051
2122
  """ISO 3166-1 alpha-2 country code"""
2052
2123
  isoCode: CountryCode!
2053
2124
 
2054
- """English name kraju (np. "Poland", "Germany")"""
2125
+ """English country name (e.g. "Poland", "Germany")"""
2055
2126
  name: String!
2056
2127
 
2057
- """System jednostek (metric/imperial)"""
2128
+ """Measurement system (metric/imperial)"""
2058
2129
  unitSystem: UnitSystem!
2059
2130
  }
2060
2131
 
@@ -2347,10 +2418,35 @@ type Customer implements Node {
2347
2418
  """
2348
2419
  Saved address book of the customer (Relay Connection). Use to render an address picker on checkout.
2349
2420
  """
2350
- addresses(after: String, before: String, first: Int, last: Int): MailingAddressConnection!
2421
+ addresses(
2422
+ """
2423
+ Cursor for forward pagination (cursor of the last edge from the previous page)
2424
+ """
2425
+ after: String
2426
+
2427
+ """
2428
+ Cursor for backward pagination (cursor of the first edge from the next page)
2429
+ """
2430
+ before: String
2431
+
2432
+ """
2433
+ Number of addresses to return from the start (forward pagination, default 10, max 100)
2434
+ """
2435
+ first: Int
2436
+
2437
+ """
2438
+ Number of addresses to return from the end (backward pagination, max 100)
2439
+ """
2440
+ last: Int
2441
+ ): MailingAddressConnection!
2351
2442
 
2352
2443
  """Customer custom field values (post-Opcja A unified custom fields)."""
2353
- attributes(namespace: String): [EntityAttributeField!]!
2444
+ attributes(
2445
+ """
2446
+ Optional attribute group filter (e.g. `loyalty`, `b2b`); omit to return all groups
2447
+ """
2448
+ namespace: String
2449
+ ): [EntityAttributeField!]!
2354
2450
 
2355
2451
  """
2356
2452
  Company name. Populated when `customerType` is COMPANY; null for INDIVIDUAL profiles.
@@ -2403,7 +2499,15 @@ type Customer implements Node {
2403
2499
  """
2404
2500
  Orders placed by this customer (Relay Connection). Use for the order history page.
2405
2501
  """
2406
- orders(after: String, first: Int = 10): OrderConnection!
2502
+ orders(
2503
+ """
2504
+ Cursor for forward pagination (cursor of the last edge from the previous page)
2505
+ """
2506
+ after: String
2507
+
2508
+ """Number of orders to return per page (default 10, max 100)"""
2509
+ first: Int = 10
2510
+ ): OrderConnection!
2407
2511
 
2408
2512
  """Customer phone number (free-form)."""
2409
2513
  phone: String
@@ -2413,6 +2517,11 @@ type Customer implements Node {
2413
2517
  """
2414
2518
  regon: String
2415
2519
 
2520
+ """
2521
+ Expiry of the access token authenticating the current request (ISO 8601). Present only on the authenticated current customer (the `customer` query); null otherwise. Schedule a proactive `customerRefreshToken` before this to keep the session alive.
2522
+ """
2523
+ sessionExpiresAt: DateTime
2524
+
2416
2525
  """
2417
2526
  Merchant-assigned segmentation tags (e.g. "vip", "wholesale", "b2b"). Use to customise UI / pricing rules on the storefront.
2418
2527
  """
@@ -2853,7 +2962,7 @@ type Domain {
2853
2962
  """Whether HTTPS is enforced"""
2854
2963
  isSslEnabled: Boolean!
2855
2964
 
2856
- """Full URL z protocol"""
2965
+ """Full URL including protocol"""
2857
2966
  url: URL!
2858
2967
  }
2859
2968
 
@@ -3152,7 +3261,12 @@ type Image {
3152
3261
  """
3153
3262
  Public image URL. Pass an optional `transform` argument (max width / height, crop region, scale, preferred format) to obtain a resized / reformatted CDN variant — useful for responsive images and modern formats like WebP / AVIF.
3154
3263
  """
3155
- url(transform: ImageTransformInput): String!
3264
+ url(
3265
+ """
3266
+ Optional CDN transform (maxWidth/maxHeight/crop/scale/preferredContentType WEBP/AVIF)
3267
+ """
3268
+ transform: ImageTransformInput
3269
+ ): String!
3156
3270
 
3157
3271
  """Native width of the source image in pixels."""
3158
3272
  width: Int
@@ -3266,28 +3380,28 @@ enum LanguageDirection {
3266
3380
  }
3267
3381
 
3268
3382
  """
3269
- Summary of a ProductVariant linked to an AttributeOption (Faza 1.5 configurator).
3383
+ Summary of a ProductVariant linked to an AttributeOption (product configurator).
3270
3384
  """
3271
3385
  type LinkedVariantSummary {
3272
- """Available stock (stock − active reservations, zawsze ≥ 0)."""
3386
+ """Available stock (stock − active reservations, always ≥ 0)."""
3273
3387
  availableStock: Int!
3274
3388
 
3275
- """Variant ID (w tenant DB)."""
3389
+ """Variant ID."""
3276
3390
  id: ID!
3277
3391
 
3278
- """Czy w tej chwili dostępny do zakupu (uwzględnia allowBackorder)."""
3392
+ """Whether currently purchasable (accounts for allowBackorder)."""
3279
3393
  isAvailable: Boolean!
3280
3394
 
3281
3395
  """Parent product ID."""
3282
3396
  productId: ID!
3283
3397
 
3284
- """SKU jeśli zdefiniowany."""
3398
+ """SKU when defined."""
3285
3399
  sku: String
3286
3400
 
3287
- """Variant name (e.g., "Finiszer Zewnętrzny SD")."""
3401
+ """Variant name (e.g., "Large / Graphite")."""
3288
3402
  title: String!
3289
3403
 
3290
- """Czy magazyn śledzi stock dla tego wariantu."""
3404
+ """Whether inventory is tracked for this variant."""
3291
3405
  trackQuantity: Boolean!
3292
3406
  }
3293
3407
 
@@ -3300,18 +3414,18 @@ type LocaleCurrencyMapping {
3300
3414
  locale: String!
3301
3415
  }
3302
3416
 
3303
- """Localization context dla storefronta"""
3417
+ """Localization context for the storefront"""
3304
3418
  type Localization {
3305
- """Wszystkie wsparte kraje (z aktywnych shipping zones)"""
3419
+ """All supported countries (from active shipping zones)"""
3306
3420
  availableCountries: [Country!]!
3307
3421
 
3308
- """Wszystkie wsparte języki sklepu"""
3422
+ """All supported shop languages"""
3309
3423
  availableLanguages: [Language!]!
3310
3424
 
3311
- """Aktualny kraj klienta (z `@inContext` lub geo-detection)"""
3425
+ """The customer current country (from `@inContext` or geo-detection)"""
3312
3426
  country: Country!
3313
3427
 
3314
- """Aktualny język klienta (z `Accept-Language` lub `@inContext`)"""
3428
+ """The customer current language (from `Accept-Language` or `@inContext`)"""
3315
3429
  language: Language!
3316
3430
  }
3317
3431
 
@@ -3885,92 +3999,191 @@ type Mutation {
3885
3999
  """
3886
4000
  Add one or more lines to the cart. Adding the same variant a second time merges into the existing line (sums the quantity). Returns the full updated cart plus any non-fatal warnings (e.g. stock dropped below requested quantity).
3887
4001
  """
3888
- cartAddLines(id: ID!, lines: [CartLineInput!]!): CartAddLinesPayload!
4002
+ cartAddLines(
4003
+ """Cart UUID to add lines to"""
4004
+ id: ID!
4005
+
4006
+ """
4007
+ Lines to add — each one variant + quantity (+ optional attributes / selections)
4008
+ """
4009
+ lines: [CartLineInput!]!
4010
+ ): CartAddLinesPayload!
3889
4011
 
3890
4012
  """
3891
4013
  Apply a gift card to the cart by full code. The card is debited at `cartComplete`. Rate-limited to 5 requests per minute per IP+shop (gift card codes form a finite enumerable space).
3892
4014
  """
3893
- cartApplyGiftCard(input: CartApplyGiftCardInput!): CartApplyGiftCardPayload!
4015
+ cartApplyGiftCard(
4016
+ """Cart UUID + full gift card code to redeem against the cart"""
4017
+ input: CartApplyGiftCardInput!
4018
+ ): CartApplyGiftCardPayload!
3894
4019
 
3895
4020
  """
3896
- Clear all payment selection state on the cart in a single atomic operation. Use for accordion "back to method picker" flows w storefront UI. Idempotent — calling twice yields the same end state. Cart MUSI być `ACTIVE` (CONVERTED carts reject z `ALREADY_COMPLETED`).
4021
+ Clear all payment selection state on the cart in a single atomic operation. Use for accordion "back to method picker" flows in the storefront UI. Idempotent — calling twice yields the same end state. The cart must be `ACTIVE` (CONVERTED carts reject with `ALREADY_COMPLETED`).
3897
4022
  """
3898
- cartClearPaymentSelection(input: CartClearPaymentSelectionInput!): CartClearPaymentSelectionPayload!
4023
+ cartClearPaymentSelection(
4024
+ """
4025
+ Cart UUID to clear all payment selection state (method, provider, instrument)
4026
+ """
4027
+ input: CartClearPaymentSelectionInput!
4028
+ ): CartClearPaymentSelectionPayload!
3899
4029
 
3900
4030
  """
3901
4031
  Finalise the cart into an `Order`. The cart is locked and no longer accepts mutations. Payment is initiated separately via `paymentCreate` — check `order.canCreatePayment` to decide whether to render a "Pay now" button or send the buyer directly to the confirmation page (for offline methods such as cash on delivery). Rate-limited to 5 requests per minute per IP+shop; pass an `idempotencyKey` to guard against duplicate orders on retry.
3902
4032
  """
3903
- cartComplete(input: CartCompleteInput!): CartCompletePayload!
4033
+ cartComplete(
4034
+ """
4035
+ Cart UUID + optional idempotency key to guard against duplicate orders on retry
4036
+ """
4037
+ input: CartCompleteInput!
4038
+ ): CartCompletePayload!
3904
4039
 
3905
4040
  """
3906
4041
  Create a new cart. All fields on `input` are optional — call with no input to create an empty cart, or pass initial lines, buyer identity, attributes, discount codes, email and a shipping address to skip the corresponding follow-up calls.
3907
4042
  """
3908
- cartCreate(input: CartCreateInput): CartCreatePayload!
4043
+ cartCreate(
4044
+ """
4045
+ Optional initial cart contents — lines, buyer identity, email, address, attributes, discount codes
4046
+ """
4047
+ input: CartCreateInput
4048
+ ): CartCreatePayload!
3909
4049
 
3910
4050
  """
3911
4051
  Replace (not merge) the list of discount codes on the cart. Pass an empty array to clear all codes. Rate-limited to 10 requests per minute per IP+shop.
3912
4052
  """
3913
- cartDiscountCodesUpdate(discountCodes: [String!]!, id: ID!): CartDiscountCodesUpdatePayload!
4053
+ cartDiscountCodesUpdate(
4054
+ """
4055
+ Full replacement list of discount codes (case-insensitive); empty array clears all
4056
+ """
4057
+ discountCodes: [String!]!
4058
+
4059
+ """Cart UUID to apply discount codes to"""
4060
+ id: ID!
4061
+ ): CartDiscountCodesUpdatePayload!
3914
4062
 
3915
4063
  """
3916
4064
  Remove a previously applied gift card from the cart by its `CartAppliedGiftCard.id`. The storefront never has to handle the full gift card code on the client.
3917
4065
  """
3918
- cartRemoveGiftCard(input: CartRemoveGiftCardInput!): CartRemoveGiftCardPayload!
4066
+ cartRemoveGiftCard(
4067
+ """Cart UUID + applied gift card UUID to remove from the cart"""
4068
+ input: CartRemoveGiftCardInput!
4069
+ ): CartRemoveGiftCardPayload!
3919
4070
 
3920
4071
  """
3921
4072
  Remove one or more lines from the cart by `CartLine.id`. Equivalent to `cartUpdateLines` with `quantity: 0` but lets the storefront express the intent explicitly.
3922
4073
  """
3923
- cartRemoveLines(id: ID!, lineIds: [ID!]!): CartRemoveLinesPayload!
4074
+ cartRemoveLines(
4075
+ """Cart UUID to remove lines from"""
4076
+ id: ID!
4077
+
4078
+ """UUIDs of cart lines to remove (`CartLine.id`)"""
4079
+ lineIds: [ID!]!
4080
+ ): CartRemoveLinesPayload!
3924
4081
 
3925
4082
  """
3926
- Select a payment method on the cart by category (BLIK, CARD, BANK_TRANSFER, ...). Backend resolves the preferred provider from `MerchantPaymentConfig` at `paymentCreate` time. Optional `preferredProviderCode` overrides the merchant priority when the buyer explicitly picks a gateway from `PaymentMethod.providersAvailable`. Optional `preferredInstrumentCode` enables instrument-level deep-link na gateway hosted page (BLIK ekran, mBank flow, etc.) — wymaga `preferredProviderCode`.
4083
+ Select a payment method on the cart by category (BLIK, CARD, BANK_TRANSFER, ...). Backend resolves the preferred provider from `MerchantPaymentConfig` at `paymentCreate` time. Optional `preferredProvider` overrides the merchant priority when the buyer explicitly picks a gateway from `PaymentMethod.providersAvailable`. Optional `preferredInstrument` enables instrument-level deep-link na gateway hosted page (BLIK ekran, mBank flow, etc.) — wymaga `preferredProvider`.
3927
4084
  """
3928
- cartSelectPaymentMethod(input: CartSelectPaymentMethodInput!): CartSelectPaymentMethodPayload!
4085
+ cartSelectPaymentMethod(
4086
+ """
4087
+ Cart UUID + payment method category, with optional provider and instrument overrides
4088
+ """
4089
+ input: CartSelectPaymentMethodInput!
4090
+ ): CartSelectPaymentMethodPayload!
3929
4091
 
3930
4092
  """
3931
4093
  Select a shipping method on the cart. Validates the method against the cart contents and the shipping address (must be eligible for the destination, and a pickup point must be set when the method delivers to a locker / collection point). Updates `cost.totalShipping` and the grand total.
3932
4094
  """
3933
- cartSelectShippingMethod(input: CartSelectShippingMethodInput!): CartSelectShippingMethodPayload!
4095
+ cartSelectShippingMethod(
4096
+ """Cart UUID + shipping method UUID to select for the cart"""
4097
+ input: CartSelectShippingMethodInput!
4098
+ ): CartSelectShippingMethodPayload!
3934
4099
 
3935
4100
  """
3936
4101
  Set the billing address on a cart. The shipping address is left unchanged — pass billing only when it differs from shipping (otherwise the order mirrors the shipping address as the billing address).
3937
4102
  """
3938
- cartSetBillingAddress(input: CartSetBillingAddressInput!): CartSetBillingAddressPayload!
4103
+ cartSetBillingAddress(
4104
+ """
4105
+ Cart UUID + billing address (pass only when billing differs from shipping)
4106
+ """
4107
+ input: CartSetBillingAddressInput!
4108
+ ): CartSetBillingAddressPayload!
3939
4109
 
3940
4110
  """
3941
4111
  Set the shipping address on a cart. Pass `address.pickupPoint` when the buyer is delivering to a parcel locker / collection point — required for non-HOME shipping methods. Replaces any previous shipping address; the billing address is left untouched.
3942
4112
  """
3943
- cartSetShippingAddress(input: CartSetShippingAddressInput!): CartSetShippingAddressPayload!
4113
+ cartSetShippingAddress(
4114
+ """
4115
+ Cart UUID + shipping address (with optional pickup point for parcel locker delivery)
4116
+ """
4117
+ input: CartSetShippingAddressInput!
4118
+ ): CartSetShippingAddressPayload!
3944
4119
 
3945
4120
  """
3946
4121
  Replace (not merge) the cart-level custom attributes — free-form key/value pairs surfaced to the merchant on the order. Use for cart-wide metadata such as a B2B PO number or marketing source. Max 250 pairs / 255-char keys; over the limit returns `CART_ATTRIBUTES_LIMIT_EXCEEDED`.
3947
4122
  """
3948
- cartUpdateAttributes(attributes: [CartAttributeInput!]!, id: ID!): CartUpdateAttributesPayload!
4123
+ cartUpdateAttributes(
4124
+ """
4125
+ Full replacement list of cart-level key/value attributes (max 250 pairs, 255-char keys)
4126
+ """
4127
+ attributes: [CartAttributeInput!]!
4128
+
4129
+ """Cart UUID whose attributes are replaced"""
4130
+ id: ID!
4131
+ ): CartUpdateAttributesPayload!
3949
4132
 
3950
4133
  """
3951
4134
  Update buyer identity on the cart — email, phone, customer ID, country and language hints. Only supplied fields are touched; omit a field to leave it unchanged.
3952
4135
  """
3953
- cartUpdateBuyerIdentity(buyerIdentity: CartBuyerIdentityInput!, id: ID!): CartUpdateBuyerIdentityPayload!
4136
+ cartUpdateBuyerIdentity(
4137
+ """
4138
+ Buyer identity fields — email / phone / customer ID / country / language; only supplied fields touched
4139
+ """
4140
+ buyerIdentity: CartBuyerIdentityInput!
4141
+
4142
+ """Cart UUID whose buyer identity is updated"""
4143
+ id: ID!
4144
+ ): CartUpdateBuyerIdentityPayload!
3954
4145
 
3955
4146
  """
3956
4147
  Set recipient details (email, display name, personalised message) on a gift card line item — the gift card will be delivered to this recipient on order completion.
3957
4148
  """
3958
- cartUpdateGiftCardRecipient(input: CartUpdateGiftCardRecipientInput!): CartUpdateGiftCardRecipientPayload!
4149
+ cartUpdateGiftCardRecipient(
4150
+ """
4151
+ Cart UUID + gift card line item UUID + recipient details (email, name, message)
4152
+ """
4153
+ input: CartUpdateGiftCardRecipientInput!
4154
+ ): CartUpdateGiftCardRecipientPayload!
3959
4155
 
3960
4156
  """
3961
4157
  Update existing cart lines — quantity, custom attributes and / or configurator selections. Set `quantity` to 0 to remove a line. Address lines by `CartLine.id`.
3962
4158
  """
3963
- cartUpdateLines(id: ID!, lines: [CartLineUpdateInput!]!): CartUpdateLinesPayload!
4159
+ cartUpdateLines(
4160
+ """Cart UUID to update lines on"""
4161
+ id: ID!
4162
+
4163
+ """
4164
+ Line updates — addressed by `CartLine.id`; `quantity: 0` removes the line
4165
+ """
4166
+ lines: [CartLineUpdateInput!]!
4167
+ ): CartUpdateLinesPayload!
3964
4168
 
3965
4169
  """
3966
4170
  Set or replace the buyer note on the cart (free-form, up to 1000 chars). Surfaced to the merchant on the resulting order.
3967
4171
  """
3968
- cartUpdateNote(id: ID!, note: String!): CartUpdateNotePayload!
4172
+ cartUpdateNote(
4173
+ """Cart UUID whose note is updated"""
4174
+ id: ID!
4175
+
4176
+ """
4177
+ Free-form buyer note (max 1000 chars), surfaced to the merchant on the order
4178
+ """
4179
+ note: String!
4180
+ ): CartUpdateNotePayload!
3969
4181
 
3970
4182
  """
3971
4183
  Activate customer account using raw activation token (admin-created flow)
3972
4184
  """
3973
4185
  customerActivate(
4186
+ """New password (must satisfy the shop password policy)"""
3974
4187
  password: String!
3975
4188
 
3976
4189
  """Raw activation token from the activation email"""
@@ -3978,12 +4191,20 @@ type Mutation {
3978
4191
  ): CustomerActivatePayload!
3979
4192
 
3980
4193
  """Add customer address"""
3981
- customerAddAddress(address: MailingAddressInput!): CustomerAddAddressPayload!
4194
+ customerAddAddress(
4195
+ """
4196
+ Address to add to the customer address book (incl. optional B2B `taxId` / `vatNumber`)
4197
+ """
4198
+ address: MailingAddressInput!
4199
+ ): CustomerAddAddressPayload!
3982
4200
 
3983
4201
  """
3984
4202
  Sign a customer in with email and password. Returns an access token to use on subsequent requests (as a Bearer header or via the SDK auth cookie).
3985
4203
  """
3986
- customerLogin(input: CustomerAccessTokenCreateInput!): CustomerLoginPayload!
4204
+ customerLogin(
4205
+ """Login credentials — email + password"""
4206
+ input: CustomerAccessTokenCreateInput!
4207
+ ): CustomerLoginPayload!
3987
4208
 
3988
4209
  """
3989
4210
  Sign the current customer out. Invalidates the access token on the server; the SDK BFF auth helpers additionally clear the HTTP-only cookie.
@@ -3996,13 +4217,22 @@ type Mutation {
3996
4217
  customerRefreshToken: CustomerRefreshTokenPayload!
3997
4218
 
3998
4219
  """Remove customer address"""
3999
- customerRemoveAddress(id: ID!): CustomerRemoveAddressPayload!
4220
+ customerRemoveAddress(
4221
+ """UUID of the address to remove"""
4222
+ id: ID!
4223
+ ): CustomerRemoveAddressPayload!
4000
4224
 
4001
4225
  """Request password reset email"""
4002
- customerRequestPasswordReset(email: String!): CustomerRequestPasswordResetPayload!
4226
+ customerRequestPasswordReset(
4227
+ """
4228
+ Customer email (RFC 5322); always returns success to prevent account enumeration
4229
+ """
4230
+ email: String!
4231
+ ): CustomerRequestPasswordResetPayload!
4003
4232
 
4004
4233
  """Reset customer password via signed URL from email"""
4005
4234
  customerResetPassword(
4235
+ """New password (must satisfy the shop password policy)"""
4006
4236
  newPassword: String!
4007
4237
 
4008
4238
  """Raw password-reset token from the password-reset email"""
@@ -4010,66 +4240,142 @@ type Mutation {
4010
4240
  ): CustomerResetPasswordPayload!
4011
4241
 
4012
4242
  """Set default address"""
4013
- customerSetDefaultAddress(addressId: ID!): CustomerSetDefaultAddressPayload!
4243
+ customerSetDefaultAddress(
4244
+ """
4245
+ UUID of the address to mark as default for shipping and billing pickers
4246
+ """
4247
+ addressId: ID!
4248
+ ): CustomerSetDefaultAddressPayload!
4014
4249
 
4015
4250
  """
4016
4251
  Register a new customer with email and password. Returns the created customer plus an access token so the storefront can sign the buyer in immediately, no follow-up login call needed.
4017
4252
  """
4018
- customerSignup(input: CustomerCreateInput!): CustomerSignupPayload!
4253
+ customerSignup(
4254
+ """
4255
+ New customer registration data — email, password, optional profile and marketing consent
4256
+ """
4257
+ input: CustomerCreateInput!
4258
+ ): CustomerSignupPayload!
4019
4259
 
4020
4260
  """Subscribe an email to the newsletter (guest-friendly, double opt-in)."""
4021
- customerSubscribeToMarketing(input: CustomerSubscribeToMarketingInput!): SubscribeToMarketingPayload!
4261
+ customerSubscribeToMarketing(
4262
+ """
4263
+ Newsletter subscribe — email to opt in (double opt-in flow, anti-enumeration)
4264
+ """
4265
+ input: CustomerSubscribeToMarketingInput!
4266
+ ): SubscribeToMarketingPayload!
4022
4267
 
4023
4268
  """Unsubscribe an email from the newsletter (guest-friendly, idempotent)."""
4024
- customerUnsubscribeFromMarketing(input: CustomerUnsubscribeFromMarketingInput!): UnsubscribeFromMarketingPayload!
4269
+ customerUnsubscribeFromMarketing(
4270
+ """
4271
+ Newsletter unsubscribe — email to opt out (idempotent, anti-enumeration)
4272
+ """
4273
+ input: CustomerUnsubscribeFromMarketingInput!
4274
+ ): UnsubscribeFromMarketingPayload!
4025
4275
 
4026
4276
  """Update customer profile"""
4027
- customerUpdate(customer: CustomerUpdateInput!): CustomerUpdatePayload!
4277
+ customerUpdate(
4278
+ """
4279
+ Customer profile changes — only supplied fields are touched (strict-hybrid)
4280
+ """
4281
+ customer: CustomerUpdateInput!
4282
+ ): CustomerUpdatePayload!
4028
4283
 
4029
4284
  """Update customer address"""
4030
- customerUpdateAddress(address: MailingAddressInput!, id: ID!): CustomerUpdateAddressPayload!
4285
+ customerUpdateAddress(
4286
+ """New values — supplied fields replace existing ones"""
4287
+ address: MailingAddressInput!
4288
+
4289
+ """UUID of the address to update"""
4290
+ id: ID!
4291
+ ): CustomerUpdateAddressPayload!
4031
4292
 
4032
4293
  """Generate or retrieve referral code"""
4033
4294
  loyaltyGenerateReferralCode: GenerateReferralCodePayload!
4034
4295
 
4035
4296
  """Redeem a loyalty reward"""
4036
- loyaltyRedeemReward(input: RedeemRewardInput!): RedeemRewardPayload!
4297
+ loyaltyRedeemReward(
4298
+ """Reward redemption payload (rewardId UUID)"""
4299
+ input: RedeemRewardInput!
4300
+ ): RedeemRewardPayload!
4037
4301
 
4038
4302
  """
4039
4303
  Initiate a payment session for an order created by `cartComplete`. Call after checking `order.canCreatePayment`. Idempotent on the order — a second call returns the existing still-valid session. Branch on the returned `payment.flow` to launch the payment (redirect / embedded / instant). Rate-limited to 5 requests per minute per IP+shop.
4040
4304
  """
4041
- paymentCreate(input: PaymentCreateInput!): PaymentCreatePayload!
4305
+ paymentCreate(
4306
+ """
4307
+ Payment session payload (orderId UUID, optional returnUrl/cancelUrl — open-redirect validated server-side)
4308
+ """
4309
+ input: PaymentCreateInput!
4310
+ ): PaymentCreatePayload!
4042
4311
 
4043
4312
  """Cancel a return request"""
4044
- returnCancel(id: ID!): ReturnCancelPayload!
4313
+ returnCancel(
4314
+ """Return UUID to cancel (only REQUESTED/APPROVED/DRAFT statuses)"""
4315
+ id: ID!
4316
+ ): ReturnCancelPayload!
4045
4317
 
4046
4318
  """Create a return request"""
4047
- returnCreate(input: ReturnCreateInput!): ReturnCreatePayload!
4319
+ returnCreate(
4320
+ """
4321
+ Return request payload (orderId, reason, items[], optional customerNote/compensationType/idempotencyKey)
4322
+ """
4323
+ input: ReturnCreateInput!
4324
+ ): ReturnCreatePayload!
4048
4325
 
4049
4326
  """Create a product review"""
4050
- reviewCreate(input: ReviewCreateInput!): ReviewPayload!
4327
+ reviewCreate(
4328
+ """
4329
+ Review payload (productId, rating 1-5, content min 10 chars, optional title/pros/cons/images)
4330
+ """
4331
+ input: ReviewCreateInput!
4332
+ ): ReviewPayload!
4051
4333
 
4052
4334
  """
4053
4335
  Mark review as not helpful (downvote). Replaces any prior vote by same customer.
4054
4336
  """
4055
- reviewDownvote(reviewId: ID!): ReviewPayload!
4337
+ reviewDownvote(
4338
+ """Review UUID to downvote"""
4339
+ reviewId: ID!
4340
+ ): ReviewPayload!
4056
4341
 
4057
4342
  """
4058
4343
  Mark review as helpful (upvote). Replaces any prior vote by same customer.
4059
4344
  """
4060
- reviewUpvote(reviewId: ID!): ReviewPayload!
4345
+ reviewUpvote(
4346
+ """Review UUID to upvote"""
4347
+ reviewId: ID!
4348
+ ): ReviewPayload!
4061
4349
 
4062
4350
  """Add item to wishlist"""
4063
- wishlistAddItem(id: ID!, input: WishlistItemInput!): WishlistPayload!
4351
+ wishlistAddItem(
4352
+ """Wishlist UUID to add the item to"""
4353
+ id: ID!
4354
+
4355
+ """Product UUID (and optional variant UUID) + notification preferences"""
4356
+ input: WishlistItemInput!
4357
+ ): WishlistPayload!
4064
4358
 
4065
4359
  """Create a new wishlist"""
4066
- wishlistCreate(input: WishlistCreateInput!): WishlistPayload!
4360
+ wishlistCreate(
4361
+ """Wishlist details (name + isPublic flag for share-by-link visibility)"""
4362
+ input: WishlistCreateInput!
4363
+ ): WishlistPayload!
4067
4364
 
4068
4365
  """Delete a wishlist"""
4069
- wishlistDelete(id: ID!): WishlistPayload!
4366
+ wishlistDelete(
4367
+ """Wishlist UUID to delete (must be owned by the authenticated customer)"""
4368
+ id: ID!
4369
+ ): WishlistPayload!
4070
4370
 
4071
4371
  """Remove item from wishlist"""
4072
- wishlistRemoveItem(id: ID!, itemId: ID!): WishlistPayload!
4372
+ wishlistRemoveItem(
4373
+ """Wishlist UUID containing the item"""
4374
+ id: ID!
4375
+
4376
+ """Wishlist item UUID to remove"""
4377
+ itemId: ID!
4378
+ ): WishlistPayload!
4073
4379
  }
4074
4380
 
4075
4381
  """GraphQL Node interface — universal ID-based lookup"""
@@ -4079,7 +4385,7 @@ interface Node {
4079
4385
  }
4080
4386
 
4081
4387
  """
4082
- Type discriminator dla node()/nodes() queries (UUID nie zawiera type prefix)
4388
+ Type discriminator for node()/nodes() queries (the UUID does not contain a type prefix)
4083
4389
  """
4084
4390
  enum NodeType {
4085
4391
  ARTICLE
@@ -4104,7 +4410,12 @@ type Order implements Node {
4104
4410
  accessToken: String!
4105
4411
 
4106
4412
  """Order custom field values (post-Opcja A unified custom fields)."""
4107
- attributes(namespace: String): [EntityAttributeField!]!
4413
+ attributes(
4414
+ """
4415
+ Optional namespace prefix to filter attributes (e.g. "erp", "b2b", "fulfillment")
4416
+ """
4417
+ namespace: String
4418
+ ): [EntityAttributeField!]!
4108
4419
 
4109
4420
  """
4110
4421
  True when the storefront should initiate an online payment for this order — render a "Pay now" button. False when the order is cancelled, already paid, or uses an offline payment method (cash on delivery, manual bank transfer) where no online flow applies. Retry-friendly: returns true for UNPAID / PENDING / FAILED payment statuses when the method supports online init.
@@ -4140,7 +4451,17 @@ type Order implements Node {
4140
4451
  """
4141
4452
  Line items on the order (paginated, Relay Connection). Use to render the order summary on the confirmation or order detail page.
4142
4453
  """
4143
- lineItems(after: String, first: Int = 10): OrderLineItemConnection!
4454
+ lineItems(
4455
+ """
4456
+ Cursor for forward pagination (cursor of the last edge from the previous page)
4457
+ """
4458
+ after: String
4459
+
4460
+ """
4461
+ Number of line items to return from the start (forward pagination, default 10)
4462
+ """
4463
+ first: Int = 10
4464
+ ): OrderLineItemConnection!
4144
4465
 
4145
4466
  """
4146
4467
  Human-readable order number shown to the buyer and the merchant (e.g. "1042"). Distinct from `id`.
@@ -4148,7 +4469,7 @@ type Order implements Node {
4148
4469
  orderNumber: String!
4149
4470
 
4150
4471
  """
4151
- Category of the payment method on the order (CARD, BLIK, BANK_TRANSFER, CASH_ON_DELIVERY, OTHER). Use to drive iconography and copy on the confirmation page (e.g. show the card icon for CARD, the BLIK logo for BLIK).
4472
+ Category of the payment method on the order (CARD, BLIK, BANK_TRANSFER, INSTALLMENT, WALLET, CASH_ON_DELIVERY, OTHER). Use to drive iconography and copy on the confirmation page (e.g. show the card icon for CARD, the BLIK logo for BLIK, the wallet icon for WALLET — Apple Pay / Google Pay).
4152
4473
  """
4153
4474
  paymentMethodType: PaymentMethodType!
4154
4475
 
@@ -4217,39 +4538,39 @@ enum OrderFulfillmentStatus {
4217
4538
  UNFULFILLED
4218
4539
  }
4219
4540
 
4220
- """Pozycja zamówienia (line item) z variant snapshot i live enrichment"""
4541
+ """Order line item with variant snapshot and live enrichment"""
4221
4542
  type OrderLineItem {
4222
4543
  """Unique identifier"""
4223
4544
  id: ID!
4224
4545
 
4225
4546
  """
4226
- Całkowita cena linii z momentu zakupu (unitPrice × quantity, minor units)
4547
+ Line total captured at purchase time (unitPrice × quantity, minor units)
4227
4548
  """
4228
4549
  originalTotalPrice: Money!
4229
4550
 
4230
4551
  """
4231
- Cena jednostkowa z momentu zakupu (minor units, include BUNDLED surcharges)
4552
+ Unit price captured at purchase time (minor units, includes BUNDLED surcharges)
4232
4553
  """
4233
4554
  originalUnitPrice: Money!
4234
4555
 
4235
- """Ilość zamówiona (snapshot z checkout)"""
4556
+ """Quantity ordered (snapshot from checkout)"""
4236
4557
  quantity: Int!
4237
4558
 
4238
- """Ilość już zrealizowana (shipped — per-item fulfillment tracking)"""
4559
+ """Quantity already fulfilled (shipped — per-item fulfillment tracking)"""
4239
4560
  quantityFulfilled: Int!
4240
4561
 
4241
4562
  """
4242
- Ilość pozostała do zwrotu/refund (quantity - returnedQuantity, clamp ≥ 0). Industry-standard semantyka dla refund tracking.
4563
+ Quantity still eligible for return/refund (quantity returnedQuantity, clamped ≥ 0). Industry-standard semantics for refund tracking.
4243
4564
  """
4244
4565
  refundableQuantity: Int!
4245
4566
 
4246
4567
  """
4247
- Nazwa produktu z momentu zakupu (snapshot). NIE live `Product.name` — preserved nawet po edycji produktu (KSeF/invoice compliance).
4568
+ Product name captured at purchase time (snapshot). Not the live `Product.name` — preserved even after the product is edited (invoice compliance).
4248
4569
  """
4249
4570
  title: String!
4250
4571
 
4251
4572
  """
4252
- Live wariant produktu (fresh image/price). Null jeśli wariant został usunięty po zakupieconsumer powinien użyć `title` jako fallback.
4573
+ Live product variant (fresh image/price). Null when the variant was deleted after purchase consumers should fall back to `title`.
4253
4574
  """
4254
4575
  variant: ProductVariant
4255
4576
  }
@@ -4266,7 +4587,7 @@ type OrderLineItemConnection {
4266
4587
  pageInfo: PageInfo!
4267
4588
 
4268
4589
  """
4269
- Total count of line items in the order (convention parity z OrderConnection/MailingAddressConnection)
4590
+ Total count of line items in the order (convention parity with OrderConnection/MailingAddressConnection)
4270
4591
  """
4271
4592
  totalCount: Int!
4272
4593
  }
@@ -4396,7 +4717,7 @@ type PaymentCreatePayload {
4396
4717
  userErrors: [UserError!]!
4397
4718
 
4398
4719
  """
4399
- Non-blocking signals — backend state change context (e.g. instrument auto-cleared, server-side adjustment). Default empty array. Storefront branches per `code` for UI retry hints / analytics events. Added by payment-instrument-preselection-advanced Adv-1 Req 2.3.
4720
+ Non-blocking signals — backend state change context (e.g. instrument auto-cleared, server-side adjustment). Default empty array. Storefront branches per `code` for UI retry hints / analytics events.
4400
4721
  """
4401
4722
  warnings: [PaymentWarning!]!
4402
4723
  }
@@ -4412,150 +4733,152 @@ enum PaymentInitiationFlow {
4412
4733
  }
4413
4734
 
4414
4735
  """
4415
- A payment method offered to the buyer at checkout what to render in the payment picker and pass to `cartSelectPaymentMethod`.
4736
+ A single concrete instrument exposed by a gateway provider (e.g. BLIK code, mBank Pay-By-Link, Apple Pay) within a broader PaymentMethod. Pass `code` as `preferredInstrument` in `cartSelectPaymentMethod` to deep-link the gateway straight to this screen.
4416
4737
  """
4417
- type PaymentMethod {
4738
+ type PaymentInstrument {
4418
4739
  """
4419
- True when the buyer can actually pick this method right now. False when the resolving gateway is temporarily unavailable (incident/maintenance) or reported the method as disabled. Storefront UI should gray-out the tile when false instead of hiding it gives merchants observability into routing failures.
4740
+ Optional brand image (bank logo, wallet icon). Use as tile artwork via `brandImage { url(transform: { maxWidth: 64 }) altText }`. Null when the gateway does not expose one or the instrument has no brand visual (BLIK code).
4420
4741
  """
4421
- available: Boolean!
4742
+ brandImage: Image
4422
4743
 
4423
4744
  """
4424
- Optional buyer-facing description shown under the name (e.g. "Pay with your bank app").
4745
+ Gateway-specific instrument identifier (PayU: `"blik"`/`"mb"`/`"c"`, P24: numeric ID string `"154"`). Pass as `preferredInstrument` in `cartSelectPaymentMethod`. Stable per provider — the gateway does not renumber.
4425
4746
  """
4426
- description: String
4747
+ code: String!
4427
4748
 
4428
4749
  """
4429
- Optional icon URL configured by the merchant. Use as the method tile artwork.
4750
+ UX rendering hint how the storefront should render this instrument (prominent button vs branded tile vs dropdown vs radio). Backend-agnostic mapping to visual treatment.
4430
4751
  """
4431
- icon: String
4752
+ displayHint: PaymentInstrumentDisplayHint!
4432
4753
 
4433
4754
  """
4434
- Stable ID of the payment method. Pass to `cartSelectPaymentMethod` to select it.
4755
+ Buyer-facing display name (e.g. "BLIK", "mBank", "ING Bank Śląski", "Apple Pay").
4435
4756
  """
4436
- id: ID!
4757
+ displayName: String!
4437
4758
 
4438
4759
  """
4439
- Concrete instruments exposed by gateway providers w obrębie tej method (BLIK code, branded banks, wallets, card brands). Null gdy żaden provider nie expose'uje granular data dla tej method. Empty array gdy gateway expose'uje ale wszystkie instruments są disabled lub po post-filter (cross-provider leak prevention). Storefront może wyrenderować listę i pass `instrumentCode` jako `preferredInstrumentCode` w `cartSelectPaymentMethod` → gateway deep-link na ten ekran. Added by payment-instrument-preselection core sprint Req 1.
4760
+ True when the instrument is currently enabled in the gateway live capabilities. The storefront can gray-out the tile when false instead of hiding it (observability for the merchant).
4440
4761
  """
4441
- instruments: [PaymentMethodInstrument!]
4762
+ enabled: Boolean!
4442
4763
 
4443
4764
  """
4444
- True when the merchant has marked this method as the default. Pre-select it in the picker.
4765
+ Provider that handles this instrument (UPPERCASE enum). Required for cross-provider dedupe (e.g. a BLIK code offered by both PayU and P24 — distinct instruments despite the same method type).
4445
4766
  """
4446
- isDefault: Boolean!
4767
+ provider: PaymentProvider!
4447
4768
 
4448
4769
  """
4449
- Display name configured by the merchant (e.g. "BLIK", "Credit card", "Cash on delivery").
4770
+ Semantic type classifying the instrument within the method (BLIK code vs bank vs wallet vs card brand). Storefront-facing dispatch for per-instrument UI components.
4450
4771
  """
4451
- name: String!
4772
+ type: PaymentInstrumentType!
4773
+ }
4452
4774
 
4775
+ """
4776
+ UX rendering hint for a payment instrument — the storefront can switch between prominent button / branded tile / dropdown / radio per hint. Backend-agnostic mapping to visual treatment.
4777
+ """
4778
+ enum PaymentInstrumentDisplayHint {
4779
+ BRANDED_TILE
4780
+ DROPDOWN_OPTION
4781
+ PROMINENT_BUTTON
4782
+ RADIO_OPTION
4783
+ }
4784
+
4785
+ """
4786
+ Classifies a concrete instrument within a PaymentMethod (BLIK code vs bank vs wallet vs card brand). Storefront-facing typing for per-instrument UI dispatch.
4787
+ """
4788
+ enum PaymentInstrumentType {
4789
+ BANK
4790
+ BLIK_CODE
4791
+ CARD_BRAND
4792
+ OTHER
4793
+ WALLET
4794
+ }
4795
+
4796
+ """
4797
+ A payment method offered to the buyer at checkout — what to render in the payment picker and pass to `cartSelectPaymentMethod`.
4798
+ """
4799
+ type PaymentMethod {
4453
4800
  """
4454
- Merchant-configured display position lower values come first in the picker.
4801
+ True when the buyer can actually pick this method right now. False when the resolving gateway is temporarily unavailable (incident/maintenance) or reported the method as disabled. Storefront UI should gray-out the tile when false instead of hiding it — gives merchants observability into routing failures.
4455
4802
  """
4456
- position: Float!
4803
+ available: Boolean!
4457
4804
 
4458
4805
  """
4459
- Preferred provider code (UPPERCASE enum) that the backend will route to when the buyer picks this method type and does not specify `preferredProviderCode`. Populated only when at least one provider supports the type. Typed enum since core sprint payment-instrument-preselection (was `String` pre-v9.0).
4806
+ Optional buyer-facing description shown under the name (e.g. "Pay with your bank app").
4460
4807
  """
4461
- preferredProvider: ProviderCode
4808
+ description: String
4462
4809
 
4463
4810
  """
4464
- Provider code (e.g. `PAYU`, `STRIPE`, `PRZELEWY24`, `CASH_ON_DELIVERY`). Identifies the integration behind the method; do not branch UI on it use `type` instead. Typed enum since core sprint payment-instrument-preselection (was `String` pre-v9.0).
4811
+ Optional icon image configured by the merchant. Use `icon { url(transform: { maxWidth: 64 }) altText }` as the method tile artwork in the payment picker.
4465
4812
  """
4466
- provider: ProviderCode!
4813
+ icon: Image
4467
4814
 
4468
4815
  """
4469
- Provider codes (UPPERCASE enum: `PAYU`, `PRZELEWY24`, ...) that can fulfil this method type for the current shop, ordered by merchant priority. Pre-select `preferredProvider`; expose the rest only when the buyer wants to choose explicitly. Single-element array when only one provider supports the type. Typed enum since core sprint payment-instrument-preselection (was `[String]` pre-v9.0).
4816
+ Stable ID of the payment method. Pass to `cartSelectPaymentMethod` to select it.
4470
4817
  """
4471
- providersAvailable: [ProviderCode!]
4818
+ id: ID!
4472
4819
 
4473
4820
  """
4474
- ISO 4217 currency codes the method accepts. Null when the method accepts the shop currency without restriction.
4821
+ Concrete instruments exposed by gateway providers within this method (BLIK code, branded banks, wallets, card brands). Null when no provider exposes granular data for this method. Empty array when a gateway exposes them but all instruments are disabled or removed by post-filtering (cross-provider leak prevention). Render the list and pass `code` as `preferredInstrument` in `cartSelectPaymentMethod` to deep-link the gateway to this screen.
4475
4822
  """
4476
- supportedCurrencies: [String!]
4823
+ instruments: [PaymentInstrument!]
4477
4824
 
4478
4825
  """
4479
- Category of the method (CARD, BLIK, BANK_TRANSFER, CASH_ON_DELIVERY, OTHER). Drives iconography and copy.
4826
+ True when the merchant has marked this method as the default. Pre-select it in the picker.
4480
4827
  """
4481
- type: PaymentMethodType!
4828
+ isDefault: Boolean!
4482
4829
 
4483
4830
  """
4484
- When `available` is false, this enum carries the diagnostic reason (GATEWAY_DOWN, GATEWAY_DISABLED, NO_INSTRUMENTS, CREDENTIALS_INVALID). Null when `available` is true. UI can render context-aware copy ("PayU is temporarily down" vs "Method not configured").
4831
+ Display name configured by the merchant (e.g. "BLIK", "Credit card", "Cash on delivery").
4485
4832
  """
4486
- unavailableReason: PaymentMethodUnavailableReason
4487
- }
4833
+ name: String!
4488
4834
 
4489
- """
4490
- A single concrete instrument exposed by a gateway provider (e.g. BLIK code, mBank Pay-By-Link, Apple Pay) within a broader PaymentMethod. Pass `instrumentCode` jako `preferredInstrumentCode` w `cartSelectPaymentMethod` żeby gateway deep-link prosto na ten ekran.
4491
- """
4492
- type PaymentMethodInstrument {
4493
4835
  """
4494
- Optional brand image URL (bank logo, wallet icon). Storefront może użyć jako tile artwork. Null gdy gateway nie expose'uje albo instrument nie ma brand visual (BLIK code).
4836
+ Merchant-configured display position lower values come first in the picker.
4495
4837
  """
4496
- brandImageUrl: String
4838
+ position: Float!
4497
4839
 
4498
4840
  """
4499
- UX rendering hint jak storefront powinien wyrenderować ten instrument (prominent button vs branded tile vs dropdown vs radio). Backend-agnostic mapping na visual treatment.
4841
+ Preferred provider (UPPERCASE enum) that the backend will route to when the buyer picks this method type and does not specify `preferredProvider`. Populated only when at least one provider supports the type.
4500
4842
  """
4501
- displayHint: PaymentMethodInstrumentDisplayHint!
4843
+ preferredProvider: PaymentProvider
4502
4844
 
4503
4845
  """
4504
- Buyer-facing display name (e.g. "BLIK", "mBank", "ING Bank Śląski", "Apple Pay"). Lokalizacja zazwyczaj PL/ENmulti-language defer post-v1.
4846
+ Provider (e.g. `PAYU`, `STRIPE`, `PRZELEWY24`, `CASH_ON_DELIVERY`). Identifies the integration behind the method; do not branch UI on it use `type` instead.
4505
4847
  """
4506
- displayName: String!
4848
+ provider: PaymentProvider!
4507
4849
 
4508
4850
  """
4509
- True gdy instrument jest currently enabled w gateway live capabilities. Storefront może gray-out tile gdy false zamiast hide (observability dla merchant).
4851
+ Providers (UPPERCASE enum: `PAYU`, `PRZELEWY24`, ...) that can fulfil this method type for the current shop, ordered by merchant priority. Pre-select `preferredProvider`; expose the rest only when the buyer wants to choose explicitly. Single-element array when only one provider supports the type.
4510
4852
  """
4511
- enabled: Boolean!
4853
+ providersAvailable: [PaymentProvider!]
4512
4854
 
4513
4855
  """
4514
- Gateway-specific instrument identifier (PayU: `"blik"`/`"mb"`/`"c"`, P24: numeric ID string `"154"`). Pass jako `preferredInstrumentCode` w `cartSelectPaymentMethod`. Stabilne per provider gateway nie renumeruje.
4856
+ ISO 4217 currency codes the method accepts. Null when the method accepts the shop currency without restriction.
4515
4857
  """
4516
- instrumentCode: String!
4858
+ supportedCurrencies: [String!]
4517
4859
 
4518
4860
  """
4519
- Provider obsługujący ten instrument (UPPERCASE enum). Wymagane dla cross-provider dedupe (np. BLIK code dostępny zarówno przez PayU jak P24 — różne instrumenty mimo tej samej method type).
4861
+ Category of the method (CARD, BLIK, BANK_TRANSFER, INSTALLMENT, WALLET, CASH_ON_DELIVERY, OTHER). Drives iconography and copy.
4520
4862
  """
4521
- providerCode: ProviderCode!
4863
+ type: PaymentMethodType!
4522
4864
 
4523
4865
  """
4524
- Semantic type klasyfikujący instrument w obrębie method (BLIK code vs bank vs wallet vs card brand). Storefront-facing dispatch dla per-instrument UI components.
4866
+ When `available` is false, this enum carries the diagnostic reason (GATEWAY_DOWN, GATEWAY_DISABLED, NO_INSTRUMENTS, CREDENTIALS_INVALID). Null when `available` is true. UI can render context-aware copy ("PayU is temporarily down" vs "Method not configured").
4525
4867
  """
4526
- type: PaymentMethodInstrumentType!
4527
- }
4528
-
4529
- """
4530
- UX rendering hint dla payment instrument — storefront może przełączać między prominent button / branded tile / dropdown / radio per hint. Backend-agnostic mapping na visual treatment.
4531
- """
4532
- enum PaymentMethodInstrumentDisplayHint {
4533
- BRANDED_TILE
4534
- DROPDOWN_OPTION
4535
- PROMINENT_BUTTON
4536
- RADIO_OPTION
4537
- }
4538
-
4539
- """
4540
- Klasyfikacja konkretnego instrumentu w obrębie PaymentMethod (BLIK kod vs bank vs wallet vs card brand). Storefront-facing typing dla per-instrument UI dispatch.
4541
- """
4542
- enum PaymentMethodInstrumentType {
4543
- BANK
4544
- BLIK_CODE
4545
- CARD_BRAND
4546
- OTHER
4547
- WALLET
4868
+ unavailableReason: PaymentMethodUnavailableReason
4548
4869
  }
4549
4870
 
4550
4871
  """
4551
- Category of a payment method: CARD, BLIK, BANK_TRANSFER, CASH_ON_DELIVERY or OTHER. Drives iconography and copy in the payment picker; do not branch on `provider` directly.
4872
+ Category of a payment method (CARD / BLIK / BANK_TRANSFER / INSTALLMENT / WALLET / CASH_ON_DELIVERY / OTHER). Drives iconography and copy in the payment picker; do not branch on `provider` directly — use this `type` instead.
4552
4873
  """
4553
4874
  enum PaymentMethodType {
4554
4875
  BANK_TRANSFER
4555
4876
  BLIK
4556
4877
  CARD
4557
4878
  CASH_ON_DELIVERY
4879
+ INSTALLMENT
4558
4880
  OTHER
4881
+ WALLET
4559
4882
  }
4560
4883
 
4561
4884
  """
@@ -4568,6 +4891,20 @@ enum PaymentMethodUnavailableReason {
4568
4891
  NO_INSTRUMENTS
4569
4892
  }
4570
4893
 
4894
+ """
4895
+ Canonical payment provider identifier (UPPERCASE per GraphQL convention). Used for `Order.paymentProvider`, `Payment.provider`, `PaymentMethod.provider`, `PaymentMethod.providersAvailable`, `PaymentMethod.preferredProvider` and `CartSelectPaymentMethodInput.preferredProvider`. The set of gateways a shop can use is configurable — the values listed here are the providers the platform currently supports.
4896
+ """
4897
+ enum PaymentProvider {
4898
+ BANK_TRANSFER
4899
+ CASH_ON_DELIVERY
4900
+ GIFT_CARD
4901
+ MANUAL_PAYMENT
4902
+ PAYU
4903
+ PRZELEWY24
4904
+ STRIPE
4905
+ TEST_GATEWAY
4906
+ }
4907
+
4571
4908
  """
4572
4909
  Payment session created for an order. Branch on `flow` to launch payment: ONLINE_REDIRECT → redirect to `redirectUrl`; ONLINE_EMBEDDED → render an in-page widget using `clientSecret`; INSTANT_DIRECT → the payment is already settled, check `status`.
4573
4910
  """
@@ -4611,17 +4948,19 @@ type PaymentSession {
4611
4948
 
4612
4949
  """Shop payment configuration (currency, country, providers)"""
4613
4950
  type PaymentSettings {
4614
- """Country code sklepu driver dostępności metod płatności"""
4951
+ """Shop country code — drives payment method availability"""
4615
4952
  countryCode: CountryCode!
4616
4953
 
4617
- """Primary currency użyty do procesowania płatności"""
4954
+ """Primary currency used to process payments"""
4618
4955
  currencyCode: CurrencyCode!
4619
4956
 
4620
- """Waluty displayable on storefront (Money.currencyCode allowlist)"""
4957
+ """
4958
+ Currencies displayable on the storefront (Money.currencyCode allowlist)
4959
+ """
4621
4960
  enabledPresentmentCurrencies: [CurrencyCode!]!
4622
4961
 
4623
4962
  """
4624
- 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.
4963
+ Codes of the payment providers active for this shop. E.g. ["payu", "cash_on_delivery"]. Use to conditionally render the checkout UI.
4625
4964
  """
4626
4965
  paymentProviders: [String!]!
4627
4966
  }
@@ -4785,23 +5124,28 @@ type Product implements Node {
4785
5124
  """
4786
5125
  Customer-facing product attributes (configurator) — set definitions + per-product scoped
4787
5126
  """
4788
- attributes(filter: ProductAttributeFilterInput): [ProductAttributeDefinition!]!
5127
+ attributes(
5128
+ """
5129
+ Optional filter — pass `{ fillingMode: CUSTOMER }` to return only buyer-fillable configurator fields
5130
+ """
5131
+ filter: ProductAttributeFilterInput
5132
+ ): [ProductAttributeDefinition!]!
4789
5133
 
4790
5134
  """Average rating (1-5)"""
4791
5135
  averageRating: Float
4792
5136
 
4793
5137
  """
4794
- Canonical brand entity (Faza 3, 2026-05-17). Resolved via DataLoader (N+1 safe dla list queries). Null gdy product nie ma przypisanego brand_id.
5138
+ Canonical brand entity. Resolved via DataLoader (N+1 safe for list queries). Null when the product has no assigned brand.
4795
5139
  """
4796
5140
  brand: Brand
4797
5141
 
4798
5142
  """
4799
- Wszystkie kategorie do których produkt należy (M2M przez ProductCategory junction). Posortowane po junction.sortOrder ASC. Empty list gdy produkt nie jest w żadnej kategorii.
5143
+ All categories the product belongs to (M2M via the ProductCategory junction). Sorted by junction.sortOrder ASC. Empty list when the product is in no category.
4800
5144
  """
4801
5145
  categories: [Category!]!
4802
5146
 
4803
5147
  """
4804
- Compare-at price range (Money pair). Null gdy żaden variant nie ma compareAtPrice.
5148
+ Compare-at price range (Money pair). Null when no variant has a compareAtPrice.
4805
5149
  """
4806
5150
  compareAtPriceRange: ProductPriceRange
4807
5151
 
@@ -4827,7 +5171,25 @@ type Product implements Node {
4827
5171
  id: ID!
4828
5172
 
4829
5173
  """Product images (Relay Connection)"""
4830
- images(after: String, before: String, first: Float, last: Float): ImageConnection!
5174
+ images(
5175
+ """
5176
+ Cursor for forward pagination (cursor of the last edge from the previous page)
5177
+ """
5178
+ after: String
5179
+
5180
+ """
5181
+ Cursor for backward pagination (cursor of the first edge from the next page)
5182
+ """
5183
+ before: String
5184
+
5185
+ """
5186
+ Number of images to return from the start (forward pagination, default 10, max 100)
5187
+ """
5188
+ first: Float
5189
+
5190
+ """Number of images to return from the end (backward pagination, max 100)"""
5191
+ last: Float
5192
+ ): ImageConnection!
4831
5193
 
4832
5194
  """Whether product is available for sale (any variant in stock)"""
4833
5195
  isAvailable: Boolean!
@@ -4846,17 +5208,20 @@ type Product implements Node {
4846
5208
  priceRange: ProductPriceRange!
4847
5209
 
4848
5210
  """
4849
- 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.
5211
+ Opt-in: price range with full conversion transparency (exchangeRate, baseCurrency, isConverted). Use for a currency-converter UI when the customer has a preferred currency different from the shop base.
4850
5212
  """
4851
5213
  priceRangeWithConversion: ConvertedPriceRange
4852
5214
 
4853
5215
  """
4854
- Domyślna kategoria dla breadcrumb/nav (= categories[0] po sortOrder). Null gdy produkt nie jest w żadnej kategorii.
5216
+ Default category for breadcrumb/nav (= categories[0] by sortOrder). Null when the product is in no category.
4855
5217
  """
4856
5218
  primaryCategory: Category
4857
5219
 
4858
5220
  """Similar products recommendations"""
4859
- recommendations(first: Int = 4): ProductRecommendations
5221
+ recommendations(
5222
+ """Number of similar products to return (default 4, max 100)"""
5223
+ first: Int = 4
5224
+ ): ProductRecommendations
4860
5225
 
4861
5226
  """Number of reviews"""
4862
5227
  reviewCount: Int
@@ -4882,14 +5247,34 @@ type Product implements Node {
4882
5247
  updatedAt: DateTime!
4883
5248
 
4884
5249
  """Product variants (Relay Connection)"""
4885
- variants(after: String, before: String, first: Float, last: Float): ProductVariantConnection!
5250
+ variants(
5251
+ """
5252
+ Cursor for forward pagination (cursor of the last edge from the previous page)
5253
+ """
5254
+ after: String
5255
+
5256
+ """
5257
+ Cursor for backward pagination (cursor of the first edge from the next page)
5258
+ """
5259
+ before: String
5260
+
5261
+ """
5262
+ Number of variants to return from the start (forward pagination, max 100)
5263
+ """
5264
+ first: Float
5265
+
5266
+ """
5267
+ Number of variants to return from the end (backward pagination, max 100)
5268
+ """
5269
+ last: Float
5270
+ ): ProductVariantConnection!
4886
5271
 
4887
5272
  """
4888
- Legacy vendor/brand name (free-text). Preferred: `brand` field (canonical Brand entity, Faza 3).
5273
+ Legacy vendor/brand name (free-text). Preferred: `brand` field (canonical Brand entity).
4889
5274
  """
4890
5275
  vendor: String
4891
5276
 
4892
- """Catalog visibility (Faza 1.5) — PUBLIC | HIDDEN | BUNDLE_ONLY"""
5277
+ """Catalog visibility — PUBLIC | HIDDEN | BUNDLE_ONLY"""
4893
5278
  visibility: ProductVisibility!
4894
5279
  }
4895
5280
 
@@ -4966,12 +5351,12 @@ type ProductAttributeOption {
4966
5351
  label: String!
4967
5352
 
4968
5353
  """
4969
- Summary powiązanego ProductVariant (Faza 1.5). Null gdy option nie ma linkedVariantId albo wariant został usunięty.
5354
+ Summary of the linked ProductVariant. Null when the option has no linkedVariantId or the variant was deleted.
4970
5355
  """
4971
5356
  linkedVariant: LinkedVariantSummary
4972
5357
 
4973
5358
  """
4974
- Linked ProductVariant ID for component stock decrement (Faza 1.5 — Hidden Products pattern)
5359
+ Linked ProductVariant ID for component stock decrement (hidden-products pattern).
4975
5360
  """
4976
5361
  linkedVariantId: ID
4977
5362
 
@@ -4979,11 +5364,11 @@ type ProductAttributeOption {
4979
5364
  sortOrder: Int!
4980
5365
 
4981
5366
  """
4982
- Surcharge amount when selected (FIXED = grosze; PERCENT = thousandths of percent — Faza 2)
5367
+ Surcharge amount when selected (FIXED = minor currency units; PERCENT = thousandths of percent).
4983
5368
  """
4984
5369
  surchargeAmount: Int
4985
5370
 
4986
- """Surcharge type — FIXED | PERCENT (Faza 2)"""
5371
+ """Surcharge type — FIXED | PERCENT."""
4987
5372
  surchargeType: AttributeOptionSurchargeType
4988
5373
 
4989
5374
  """Internal value (slug-style)"""
@@ -5022,7 +5407,7 @@ type ProductEdge {
5022
5407
  """Single product filter"""
5023
5408
  input ProductFilter {
5024
5409
  """
5025
- DoSwiftly: dynamic attribute filters (configurator + custom fields system). Optional `namespace` w AttributeFilterInput dyskryminuje per grupa atrybutów.
5410
+ DoSwiftly: dynamic attribute filters (configurator + custom fields system). Optional `namespace` in AttributeFilterInput discriminates per attribute group.
5026
5411
  """
5027
5412
  attributes: [AttributeFilterInput!]
5028
5413
 
@@ -5030,7 +5415,7 @@ input ProductFilter {
5030
5415
  available: Boolean
5031
5416
 
5032
5417
  """
5033
- Faza 3 (2026-05-17): filter by canonical Brand entity. Wybierz po `slug` (URL-stable) lub `id` (raw UUID). Multiple `brand` entries w `filters[]` array = OR semantics. Vendor (legacy free-text) wciąż wspierany via `productVendor`.
5418
+ Filter by canonical Brand entity. Choose by `slug` (URL-stable) or `id` (raw UUID). Multiple `brand` entries in the `filters[]` array = OR semantics. Vendor (legacy free-text) is still supported via `productVendor`.
5034
5419
  """
5035
5420
  brand: BrandFilter
5036
5421
 
@@ -5156,8 +5541,10 @@ type ProductReview {
5156
5541
  helpfulCount: Int!
5157
5542
  id: ID!
5158
5543
 
5159
- """Review images"""
5160
- images: [String!]!
5544
+ """
5545
+ Review image attachments uploaded by the reviewer. Use `images { url(transform: { maxWidth: 600 }) altText }` for responsive gallery rendering in the review card.
5546
+ """
5547
+ images: [Image!]!
5161
5548
 
5162
5549
  """Is verified purchase"""
5163
5550
  isVerifiedPurchase: Boolean!
@@ -5224,7 +5611,12 @@ A purchasable unit of a product — one variant out of the product variants list
5224
5611
  """
5225
5612
  type ProductVariant {
5226
5613
  """Variant custom field values (post-Opcja A unified custom fields)."""
5227
- attributes(namespace: String): [EntityAttributeField!]!
5614
+ attributes(
5615
+ """
5616
+ Optional namespace filter (e.g. "erp", "b2b") to return only attributes with matching prefix
5617
+ """
5618
+ namespace: String
5619
+ ): [EntityAttributeField!]!
5228
5620
 
5229
5621
  """
5230
5622
  Available stock — what the buyer can buy now (on-hand minus active reservations, never below 0). Null when the merchant has disabled stock tracking for this variant (e.g. digital, made-to-order).
@@ -5285,7 +5677,7 @@ type ProductVariant {
5285
5677
  sortOrder: Int
5286
5678
 
5287
5679
  """
5288
- Per-location stock availability. Null for single-location shops. Resolved by StoreAvailabilityResolver with `near`, `locationType`, and `@inContext(preferredLocationId)` support.
5680
+ Per-location stock availability. Null for single-location shops. Resolved per-location with `near`, `locationType`, and `@inContext(preferredLocationId)` support.
5289
5681
  """
5290
5682
  storeAvailability(
5291
5683
  """Cursor for pagination"""
@@ -5336,35 +5728,26 @@ type ProductVariantEdge {
5336
5728
  node: ProductVariant!
5337
5729
  }
5338
5730
 
5339
- """Catalog placement — PUBLIC | HIDDEN | BUNDLE_ONLY (Faza 1.5)"""
5731
+ """Catalog placement — PUBLIC | HIDDEN | BUNDLE_ONLY"""
5340
5732
  enum ProductVisibility {
5341
5733
  BUNDLE_ONLY
5342
5734
  HIDDEN
5343
5735
  PUBLIC
5344
5736
  }
5345
5737
 
5346
- """
5347
- Canonical payment provider identifier (UPPERCASE per GraphQL convention). Use for `Order.paymentMethod`, `Payment.provider`, `PaymentMethod.providersAvailable`, `PaymentMethod.preferredProvider`. Add new providers in `@doswiftly/commerce-policy/provider-codes.ts` SSOT registry.
5348
- """
5349
- enum ProviderCode {
5350
- BANK_TRANSFER
5351
- CASH_ON_DELIVERY
5352
- GIFT_CARD
5353
- MANUAL_PAYMENT
5354
- PAYU
5355
- PRZELEWY24
5356
- STRIPE
5357
- TEST_GATEWAY
5358
- }
5359
-
5360
5738
  type Query {
5361
5739
  """List of all currencies supported by the system (ECB rates)"""
5362
5740
  allSupportedCurrencies: [Currency!]!
5363
5741
 
5364
5742
  """
5365
- Paginated + searchable attribute options dla drill-into filter UI (np. dropdown z 800 licencjami + search input). Honors product context z exclude-self per attribute. Sort: COUNT_DESC default (most popular first), LABEL_ASC dla alfabetycznego z polskim collation.
5743
+ Paginated + searchable attribute options for a drill-into filter UI (e.g. a dropdown of 800 licenses + search input). Honors product context with exclude-self per attribute. Sort: COUNT_DESC default (most popular first), LABEL_ASC for alphabetical (Polish collation).
5366
5744
  """
5367
- attributeOptionsSearch(input: AttributeOptionsSearchInput!): AttributeFilterValueConnection!
5745
+ attributeOptionsSearch(
5746
+ """
5747
+ Search payload (handle, search query, pagination, sort COUNT_DESC/LABEL_ASC, optional product context)
5748
+ """
5749
+ input: AttributeOptionsSearchInput!
5750
+ ): AttributeFilterValueConnection!
5368
5751
 
5369
5752
  """
5370
5753
  Payment methods active for the current shop, plus the merchant default. Returns one row per `PaymentMethodType` (BLIK, CARD, BANK_TRANSFER, ...) with `providersAvailable` (provider codes sorted by merchant priority) and `preferredProvider` (the head of the list). Shop-level — independent of cart contents.
@@ -5374,13 +5757,41 @@ type Query {
5374
5757
  """
5375
5758
  Standalone shipping-method preview for an address — does not require a cart. Pass an optional `cart` summary (subtotal, weight, currency) to evaluate price-based / weight-based rules and free-shipping thresholds. For an already-created cart, prefer `cart.availableShippingMethods(address)` — it reads the cart contents directly.
5376
5759
  """
5377
- availableShippingMethods(address: ShippingAddressInput!, cart: CartShippingInput): AvailableShippingMethodsPayload!
5760
+ availableShippingMethods(
5761
+ """Delivery address used to match shipping zones"""
5762
+ address: ShippingAddressInput!
5763
+
5764
+ """
5765
+ Optional cart summary (subtotal, weight, currency) for price/weight rules
5766
+ """
5767
+ cart: CartShippingInput
5768
+ ): AvailableShippingMethodsPayload!
5378
5769
 
5379
5770
  """Get live shipping rates from configured carriers"""
5380
- availableShippingRates(address: ShippingAddressInput!, packages: [PackageDimensionsInput!], totalWeight: Float): AvailableShippingRatesPayload!
5771
+ availableShippingRates(
5772
+ """Recipient address sent to carrier APIs for rate quotes"""
5773
+ address: ShippingAddressInput!
5774
+
5775
+ """
5776
+ Package dimensions (weight + length/width/height) for accurate rate calculation
5777
+ """
5778
+ packages: [PackageDimensionsInput!]
5779
+
5780
+ """Total cart weight in kilograms (fallback when packages omitted)"""
5781
+ totalWeight: Float
5782
+ ): AvailableShippingRatesPayload!
5381
5783
 
5382
5784
  """Get B2B pricing for a product variant"""
5383
- b2bPricing(quantity: Float = 1, retailPrice: Float!, variantId: ID!): B2BPriceDisplay
5785
+ b2bPricing(
5786
+ """Quantity for volume tier evaluation (default 1)"""
5787
+ quantity: Float = 1
5788
+
5789
+ """Retail price in minor units (e.g. 9999 = 99.99 PLN)"""
5790
+ retailPrice: Float!
5791
+
5792
+ """Product variant UUID to price"""
5793
+ variantId: ID!
5794
+ ): B2BPriceDisplay
5384
5795
 
5385
5796
  """List blog categories"""
5386
5797
  blogCategories: [BlogCategory!]!
@@ -5422,20 +5833,32 @@ type Query {
5422
5833
  ): BlogPostConnection!
5423
5834
 
5424
5835
  """List blog tags"""
5425
- blogTags(limit: Int = 50): [BlogTag!]!
5836
+ blogTags(
5837
+ """Maximum number of tags to return (default 50, max 200)"""
5838
+ limit: Int = 50
5839
+ ): [BlogTag!]!
5426
5840
 
5427
5841
  """
5428
5842
  Fetch a cart by ID — returns null when the cart does not exist or has already been completed (converted to an order). Use to hydrate the cart state on page load or after a recovery flow.
5429
5843
  """
5430
- cart(id: ID!): Cart
5844
+ cart(
5845
+ """Cart UUID to fetch"""
5846
+ id: ID!
5847
+ ): Cart
5431
5848
 
5432
5849
  """
5433
5850
  Preview whether a discount code is currently applicable to a cart — read-only, no cart side effects. Use for inline feedback while the buyer types a code, before calling `cartDiscountCodesUpdate`. Result depends on the cart subtotal (minimum-order rules) so do not cache aggressively: prefer `fetchPolicy: "network-only"` or include `cart.subtotal` in the cache key.
5434
5851
  """
5435
- cartValidateDiscountCode(cartId: ID!, discountCode: String!): DiscountValidationResult!
5852
+ cartValidateDiscountCode(
5853
+ """Cart UUID to validate the discount code against"""
5854
+ cartId: ID!
5855
+
5856
+ """Discount code to preview (case-insensitive)"""
5857
+ discountCode: String!
5858
+ ): DiscountValidationResult!
5436
5859
 
5437
5860
  """
5438
- Lista kategorii (Relay Connection) z opcjonalnym filtrem rootsOnly/parentId
5861
+ List of categories (Relay Connection) with optional rootsOnly/parentId filtering
5439
5862
  """
5440
5863
  categories(
5441
5864
  """Forward pagination cursor (after this element)"""
@@ -5451,7 +5874,7 @@ type Query {
5451
5874
  last: Int
5452
5875
 
5453
5876
  """
5454
- Filter by parent category ID — używaj `null` semantically dla "roots" via `rootsOnly` flag
5877
+ Filter by parent category ID — use `null` semantically for "roots" via the `rootsOnly` flag
5455
5878
  """
5456
5879
  parentId: ID
5457
5880
 
@@ -5527,11 +5950,16 @@ type Query {
5527
5950
  """
5528
5951
  Fetch a single order owned by the authenticated customer. Returns null silently when there is no authenticated customer or the order does not belong to them. For guest order access use `orderByToken` instead.
5529
5952
  """
5530
- customerOrder(orderId: ID!): Order
5953
+ customerOrder(
5954
+ """Order UUID owned by the authenticated customer"""
5955
+ orderId: ID!
5956
+ ): Order
5531
5957
 
5532
5958
  """Estimate points for an order amount"""
5533
5959
  estimatePoints(
5534
- """Order total in major currency units (e.g., PLN)"""
5960
+ """
5961
+ Order total in major currency units (e.g. 99.99 PLN) to estimate earned points for
5962
+ """
5535
5963
  orderTotal: Float!
5536
5964
  ): PointsEstimate!
5537
5965
 
@@ -5545,19 +5973,30 @@ type Query {
5545
5973
  ): ExchangeRate
5546
5974
 
5547
5975
  """Get gift card by code (null if not found)"""
5548
- giftCard(code: String!): GiftCard
5976
+ giftCard(
5977
+ """Gift card code to look up (case-sensitive)"""
5978
+ code: String!
5979
+ ): GiftCard
5549
5980
 
5550
5981
  """Validate gift card for use"""
5551
- giftCardValidate(amount: Float, code: String!): GiftCardValidatePayload!
5982
+ giftCardValidate(
5983
+ """Optional amount in major units to check balance sufficiency"""
5984
+ amount: Float
5985
+
5986
+ """Gift card code to validate"""
5987
+ code: String!
5988
+ ): GiftCardValidatePayload!
5552
5989
 
5553
5990
  """Get available languages for this shop"""
5554
5991
  languages: [Language!]!
5555
5992
 
5556
- """Localization context (kraje, języki, aktualny kraj/język klienta)"""
5993
+ """
5994
+ Localization context (countries, languages, the customer current country/language)
5995
+ """
5557
5996
  localization: Localization!
5558
5997
 
5559
5998
  """
5560
- Fetch a single active location by ID. Returns null when missing, inactive, or owned by another shop (tenant isolation via StorefrontShopGuard).
5999
+ Fetch a single active location by ID. Returns null when missing, inactive, or owned by another shop (tenant isolation enforced server-side).
5561
6000
  """
5562
6001
  location(
5563
6002
  """Location UUID"""
@@ -5597,18 +6036,47 @@ type Query {
5597
6036
  loyaltyTiers: [LoyaltyTier!]!
5598
6037
 
5599
6038
  """Get loyalty transaction history"""
5600
- loyaltyTransactions(after: String, first: Int = 20): LoyaltyTransactionConnection!
6039
+ loyaltyTransactions(
6040
+ """
6041
+ Cursor for forward pagination (cursor of the last edge from the previous page)
6042
+ """
6043
+ after: String
6044
+
6045
+ """
6046
+ Number of transactions to return from the start (forward pagination, max 100)
6047
+ """
6048
+ first: Int = 20
6049
+ ): LoyaltyTransactionConnection!
5601
6050
 
5602
6051
  """Get a navigation menu by handle"""
5603
- menu(handle: String!): Menu
6052
+ menu(
6053
+ """
6054
+ Navigation menu handle (e.g. "main-menu", "footer") configured in admin
6055
+ """
6056
+ handle: String!
6057
+ ): Menu
5604
6058
 
5605
6059
  """Universal ID-based lookup (Relay Node spec)"""
5606
- node(id: ID!, type: NodeType!): Node
6060
+ node(
6061
+ """Global object UUID to fetch"""
6062
+ id: ID!
6063
+
6064
+ """
6065
+ NodeType discriminator (PRODUCT / COLLECTION / CART / CUSTOMER / ORDER)
6066
+ """
6067
+ type: NodeType!
6068
+ ): Node
5607
6069
 
5608
6070
  """
5609
- Batch ID-based lookup; same NodeType dla all IDs. Missing/wrong IDs → null entries (preserved length).
6071
+ Batch ID-based lookup; same NodeType for all IDs. Missing/wrong IDs → null entries (preserved length).
5610
6072
  """
5611
- nodes(ids: [ID!]!, type: NodeType!): [Node]!
6073
+ nodes(
6074
+ """List of UUIDs to fetch (all must be the same NodeType)"""
6075
+ ids: [ID!]!
6076
+
6077
+ """NodeType discriminator applied to every id in the batch"""
6078
+ type: NodeType!
6079
+ ): [Node]!
5612
6080
 
5613
6081
  """
5614
6082
  Fetch a single order by its opaque access token (guest order access without a session). Optional `email` argument enables defense-in-depth: if provided, must match the order buyer email (case-insensitive); on mismatch the query returns null exactly like an invalid token. Rate-limited to 5 requests per minute per IP+shop. Response carries Cache-Control: no-store.
@@ -5651,7 +6119,10 @@ type Query {
5651
6119
  ): ShopPageConnection!
5652
6120
 
5653
6121
  """Get personalized product recommendations for the current customer"""
5654
- personalizedRecommendations(first: Int = 10): ProductRecommendations!
6122
+ personalizedRecommendations(
6123
+ """Number of recommendations to return (default 10, max 100)"""
6124
+ first: Int = 10
6125
+ ): ProductRecommendations!
5655
6126
 
5656
6127
  """Get single product by ID or handle"""
5657
6128
  product(
@@ -5665,7 +6136,12 @@ type Query {
5665
6136
  """
5666
6137
  Get available filters for product listing (renamed from availableFilters in Storefront 5.0)
5667
6138
  """
5668
- productFilters(input: AvailableFiltersInput): AvailableFilters!
6139
+ productFilters(
6140
+ """
6141
+ Product context (collectionId/categoryId/searchQuery) + currently applied filters for exclude-self facet counts
6142
+ """
6143
+ input: AvailableFiltersInput
6144
+ ): AvailableFilters!
5669
6145
 
5670
6146
  """Get recommended products similar to the given product"""
5671
6147
  productRecommendations(
@@ -5715,16 +6191,25 @@ type Query {
5715
6191
  referralStats: ReferralStats
5716
6192
 
5717
6193
  """Get return by ID"""
5718
- return(id: ID!): ReturnPayload!
6194
+ return(
6195
+ """Return UUID to fetch (customer-owned, ownership verified)"""
6196
+ id: ID!
6197
+ ): ReturnPayload!
5719
6198
 
5720
6199
  """Get available return reasons"""
5721
6200
  returnReasons: [ReturnReasonOption!]!
5722
6201
 
5723
6202
  """Get returns for an order"""
5724
- returnsByOrder(orderId: ID!): ReturnConnection!
6203
+ returnsByOrder(
6204
+ """Order UUID to list returns for (ownership verified)"""
6205
+ orderId: ID!
6206
+ ): ReturnConnection!
5725
6207
 
5726
6208
  """Get product review statistics"""
5727
- reviewStats(productId: ID!): ReviewStats!
6209
+ reviewStats(
6210
+ """Product UUID to fetch review statistics for"""
6211
+ productId: ID!
6212
+ ): ReviewStats!
5728
6213
 
5729
6214
  """Search products (DoSwiftly alias for products() with required query)"""
5730
6215
  searchProducts(
@@ -5759,10 +6244,16 @@ type Query {
5759
6244
  ): PredictiveSearchResult!
5760
6245
 
5761
6246
  """Get shipment by ID"""
5762
- shipment(id: ID!): ShipmentPayload!
6247
+ shipment(
6248
+ """Shipment UUID (customer must own parent order)"""
6249
+ id: ID!
6250
+ ): ShipmentPayload!
5763
6251
 
5764
6252
  """Get shipment by tracking number"""
5765
- shipmentByTrackingNumber(trackingNumber: String!): ShipmentPayload!
6253
+ shipmentByTrackingNumber(
6254
+ """Carrier tracking number (public lookup, no auth required)"""
6255
+ trackingNumber: String!
6256
+ ): ShipmentPayload!
5766
6257
 
5767
6258
  """Get current shop information"""
5768
6259
  shop: Shop!
@@ -5771,7 +6262,12 @@ type Query {
5771
6262
  shopCurrencyConfig: ShopCurrencyConfig!
5772
6263
 
5773
6264
  """Get translations for a language"""
5774
- translations(input: TranslationsInput!): Translations!
6265
+ translations(
6266
+ """
6267
+ Translation request (language code, optional namespaces filter) — falls back to shop default language
6268
+ """
6269
+ input: TranslationsInput!
6270
+ ): Translations!
5775
6271
 
5776
6272
  """List URL redirects"""
5777
6273
  urlRedirects(
@@ -5991,8 +6487,10 @@ type ReturnItem {
5991
6487
  """Item ID"""
5992
6488
  id: ID!
5993
6489
 
5994
- """Product image URL"""
5995
- imageUrl: String
6490
+ """
6491
+ Product image at time of return submission. Use `image { url(transform: { maxWidth: ... }) altText }` for responsive thumbnails in the merchant return dashboard.
6492
+ """
6493
+ image: Image
5996
6494
 
5997
6495
  """Evidence photos"""
5998
6496
  photos: [ReturnItemPhoto!]
@@ -6299,8 +6797,10 @@ type ShipmentItem {
6299
6797
  """Item ID"""
6300
6798
  id: ID!
6301
6799
 
6302
- """Product image URL"""
6303
- imageUrl: String
6800
+ """
6801
+ Live variant image with snapshot fallback. Use `image { url(transform: { maxWidth: 200, preferredContentType: WEBP }) altText }` for responsive thumbnails. Returns `null` when the variant has been deleted since fulfillment — render a placeholder client-side.
6802
+ """
6803
+ image: Image
6304
6804
 
6305
6805
  """Quantity shipped"""
6306
6806
  quantity: Int!
@@ -6398,9 +6898,9 @@ type ShippingCarrier {
6398
6898
  id: ID
6399
6899
 
6400
6900
  """
6401
- URL of the carrier logo. Use for the method tile in the shipping picker.
6901
+ Carrier logo image. Use `logo { url(transform: { maxWidth: 64 }) altText }` for the method tile in the shipping picker.
6402
6902
  """
6403
- logoUrl: String
6903
+ logo: Image
6404
6904
 
6405
6905
  """Carrier display name (e.g. "InPost", "DPD", "DHL")."""
6406
6906
  name: String!
@@ -6442,7 +6942,7 @@ type Shop {
6442
6942
  """Default currency code (ISO 4217)"""
6443
6943
  currencyCode: CurrencyCode!
6444
6944
 
6445
- """Customer account URL (login/orders) — z primaryDomain"""
6945
+ """Customer account URL (login/orders) — derived from primaryDomain"""
6446
6946
  customerAccountUrl: URL
6447
6947
 
6448
6948
  """Default language code (ISO 639-1)"""
@@ -6464,7 +6964,7 @@ type Shop {
6464
6964
  logo: Image
6465
6965
 
6466
6966
  """
6467
- Money display format z `{{amount}}` placeholder, np. "{{amount}} zł"
6967
+ Money display format with the `{{amount}}` placeholder, e.g. "{{amount}} zł"
6468
6968
  """
6469
6969
  moneyFormat: String!
6470
6970
 
@@ -6770,8 +7270,10 @@ type TierBenefit {
6770
7270
  """Benefit description"""
6771
7271
  description: String
6772
7272
 
6773
- """Benefit icon"""
6774
- icon: String
7273
+ """
7274
+ Benefit icon image. Use `icon { url(transform: { maxWidth: 48 }) altText }` for small visual markers on the tier benefits list.
7275
+ """
7276
+ icon: Image
6775
7277
 
6776
7278
  """Benefit name"""
6777
7279
  name: String!
@@ -6836,7 +7338,7 @@ URL string per RFC 3986 (e.g. "https://shop.example.com/products/foo").
6836
7338
  """
6837
7339
  scalar URL
6838
7340
 
6839
- """Measurement system (metric vs imperial) — wpływa na display formats"""
7341
+ """Measurement system (metric vs imperial) — affects display formats"""
6840
7342
  enum UnitSystem {
6841
7343
  IMPERIAL_SYSTEM
6842
7344
  METRIC_SYSTEM