@doswiftly/storefront-operations 16.1.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
 
@@ -880,13 +886,20 @@ type Cart implements Node {
880
886
  """
881
887
  attributes: [CartAttribute!]!
882
888
 
883
- """Available payment methods dla tego cart (shop-configured providers)"""
889
+ """
890
+ Available payment methods for this cart — deduplicated per type, sorted by merchant priority.
891
+ """
884
892
  availablePaymentMethods: [PaymentMethod!]!
885
893
 
886
894
  """
887
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.
888
896
  """
889
- 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!
890
903
 
891
904
  """
892
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).
@@ -935,7 +948,23 @@ type Cart implements Node {
935
948
  id: ID!
936
949
 
937
950
  """Lines in the cart (paginated, Relay Connection)."""
938
- 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!
939
968
 
940
969
  """
941
970
  Buyer-supplied note (e.g. delivery instructions). Free-form, surfaced to the merchant on the order.
@@ -948,13 +977,21 @@ type Cart implements Node {
948
977
  phone: String
949
978
 
950
979
  """Product recommendations based on cart contents"""
951
- 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
952
984
 
953
985
  """
954
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.
955
987
  """
956
988
  requiresShipping: Boolean!
957
989
 
990
+ """
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 }`.
992
+ """
993
+ selectedPaymentInstrument: String
994
+
958
995
  """
959
996
  The payment method currently selected on the cart. Null until the buyer picks a method via `cartSelectPaymentMethod`.
960
997
  """
@@ -982,6 +1019,11 @@ type Cart implements Node {
982
1019
 
983
1020
  """When the cart was last modified (ISO 8601)."""
984
1021
  updatedAt: DateTime!
1022
+
1023
+ """
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.
1025
+ """
1026
+ warnings: [CartWarning!]!
985
1027
  }
986
1028
 
987
1029
  """Result of `cartAddLines`."""
@@ -1171,6 +1213,30 @@ input CartBuyerIdentityInput {
1171
1213
  phone: String
1172
1214
  }
1173
1215
 
1216
+ """
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.
1218
+ """
1219
+ input CartClearPaymentSelectionInput {
1220
+ """ID of the cart to clear payment selection on."""
1221
+ cartId: ID!
1222
+ }
1223
+
1224
+ """
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).
1226
+ """
1227
+ type CartClearPaymentSelectionPayload {
1228
+ """The updated cart with cleared payment selection."""
1229
+ cart: Cart
1230
+
1231
+ """
1232
+ Business / validation errors carrying a stable `CartErrorCode` in `code` (e.g. `ALREADY_COMPLETED`).
1233
+ """
1234
+ userErrors: [UserError!]!
1235
+
1236
+ """Non-fatal advisories — the mutation itself succeeded."""
1237
+ warnings: [CartWarning!]!
1238
+ }
1239
+
1174
1240
  """Input for `cartComplete` — finalises the cart into an `Order`."""
1175
1241
  input CartCompleteInput {
1176
1242
  """ID of the cart to complete."""
@@ -1551,15 +1617,27 @@ type CartRemoveLinesPayload {
1551
1617
  warnings: [CartWarning!]!
1552
1618
  }
1553
1619
 
1554
- """Input for `cartSelectPaymentMethod`."""
1620
+ """
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).
1622
+ """
1555
1623
  input CartSelectPaymentMethodInput {
1556
1624
  """ID of the cart to update."""
1557
1625
  cartId: ID!
1558
1626
 
1559
1627
  """
1560
- ID of the chosen payment method (matches a `PaymentMethod.id` from `availablePaymentMethods`).
1628
+ Category of the payment method the buyer picked (matches `PaymentMethod.type` from `availablePaymentMethods`).
1629
+ """
1630
+ methodType: PaymentMethodType!
1631
+
1632
+ """
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.
1561
1634
  """
1562
- paymentMethodId: ID!
1635
+ preferredInstrument: String
1636
+
1637
+ """
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.
1639
+ """
1640
+ preferredProvider: PaymentProvider
1563
1641
  }
1564
1642
 
1565
1643
  """Result of `cartSelectPaymentMethod`."""
@@ -1807,6 +1885,7 @@ enum CartWarningCode {
1807
1885
  MERCHANDISE_NOT_AVAILABLE
1808
1886
  MERCHANDISE_NOT_ENOUGH_STOCK
1809
1887
  PAYMENTS_AMOUNT_REGION_MISMATCH
1888
+ PAYMENT_SELECTION_STALE
1810
1889
  SHIPPING_METHOD_AUTO_CLEARED
1811
1890
  }
1812
1891
 
@@ -1845,7 +1924,17 @@ type Category {
1845
1924
  productCount: Int!
1846
1925
 
1847
1926
  """Products in category"""
1848
- 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!
1849
1938
 
1850
1939
  """SEO metadata"""
1851
1940
  seo: SEO
@@ -1926,7 +2015,38 @@ type Collection implements Node {
1926
2015
  image: Image
1927
2016
 
1928
2017
  """Products in collection"""
1929
- 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!
1930
2050
 
1931
2051
  """SEO metadata"""
1932
2052
  seo: SEO
@@ -1988,24 +2108,24 @@ type ConvertedPriceRange {
1988
2108
  minVariantPrice: PriceMoney!
1989
2109
  }
1990
2110
 
1991
- """Wspierany kraj sklepu (ISO 3166-1 alpha-2)"""
2111
+ """A country supported by the shop (ISO 3166-1 alpha-2)"""
1992
2112
  type Country implements Node {
1993
- """Języki wspierane przez sklep dostępne w tym kraju"""
2113
+ """Shop languages available in this country"""
1994
2114
  availableLanguages: [Language!]!
1995
2115
 
1996
- """Primary currency w tym kraju"""
2116
+ """Primary currency in this country"""
1997
2117
  currency: Currency!
1998
2118
 
1999
- """Globally-unique identifier (np. "country:PL")"""
2119
+ """Globally-unique identifier (e.g. "country:PL")"""
2000
2120
  id: ID!
2001
2121
 
2002
2122
  """ISO 3166-1 alpha-2 country code"""
2003
2123
  isoCode: CountryCode!
2004
2124
 
2005
- """English name kraju (np. "Poland", "Germany")"""
2125
+ """English country name (e.g. "Poland", "Germany")"""
2006
2126
  name: String!
2007
2127
 
2008
- """System jednostek (metric/imperial)"""
2128
+ """Measurement system (metric/imperial)"""
2009
2129
  unitSystem: UnitSystem!
2010
2130
  }
2011
2131
 
@@ -2298,10 +2418,35 @@ type Customer implements Node {
2298
2418
  """
2299
2419
  Saved address book of the customer (Relay Connection). Use to render an address picker on checkout.
2300
2420
  """
2301
- 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!
2302
2442
 
2303
2443
  """Customer custom field values (post-Opcja A unified custom fields)."""
2304
- 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!]!
2305
2450
 
2306
2451
  """
2307
2452
  Company name. Populated when `customerType` is COMPANY; null for INDIVIDUAL profiles.
@@ -2354,7 +2499,15 @@ type Customer implements Node {
2354
2499
  """
2355
2500
  Orders placed by this customer (Relay Connection). Use for the order history page.
2356
2501
  """
2357
- 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!
2358
2511
 
2359
2512
  """Customer phone number (free-form)."""
2360
2513
  phone: String
@@ -2364,6 +2517,11 @@ type Customer implements Node {
2364
2517
  """
2365
2518
  regon: String
2366
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
+
2367
2525
  """
2368
2526
  Merchant-assigned segmentation tags (e.g. "vip", "wholesale", "b2b"). Use to customise UI / pricing rules on the storefront.
2369
2527
  """
@@ -2804,7 +2962,7 @@ type Domain {
2804
2962
  """Whether HTTPS is enforced"""
2805
2963
  isSslEnabled: Boolean!
2806
2964
 
2807
- """Full URL z protocol"""
2965
+ """Full URL including protocol"""
2808
2966
  url: URL!
2809
2967
  }
2810
2968
 
@@ -3103,7 +3261,12 @@ type Image {
3103
3261
  """
3104
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.
3105
3263
  """
3106
- url(transform: ImageTransformInput): String!
3264
+ url(
3265
+ """
3266
+ Optional CDN transform (maxWidth/maxHeight/crop/scale/preferredContentType WEBP/AVIF)
3267
+ """
3268
+ transform: ImageTransformInput
3269
+ ): String!
3107
3270
 
3108
3271
  """Native width of the source image in pixels."""
3109
3272
  width: Int
@@ -3217,28 +3380,28 @@ enum LanguageDirection {
3217
3380
  }
3218
3381
 
3219
3382
  """
3220
- Summary of a ProductVariant linked to an AttributeOption (Faza 1.5 configurator).
3383
+ Summary of a ProductVariant linked to an AttributeOption (product configurator).
3221
3384
  """
3222
3385
  type LinkedVariantSummary {
3223
- """Available stock (stock − active reservations, zawsze ≥ 0)."""
3386
+ """Available stock (stock − active reservations, always ≥ 0)."""
3224
3387
  availableStock: Int!
3225
3388
 
3226
- """Variant ID (w tenant DB)."""
3389
+ """Variant ID."""
3227
3390
  id: ID!
3228
3391
 
3229
- """Czy w tej chwili dostępny do zakupu (uwzględnia allowBackorder)."""
3392
+ """Whether currently purchasable (accounts for allowBackorder)."""
3230
3393
  isAvailable: Boolean!
3231
3394
 
3232
3395
  """Parent product ID."""
3233
3396
  productId: ID!
3234
3397
 
3235
- """SKU jeśli zdefiniowany."""
3398
+ """SKU when defined."""
3236
3399
  sku: String
3237
3400
 
3238
- """Variant name (e.g., "Finiszer Zewnętrzny SD")."""
3401
+ """Variant name (e.g., "Large / Graphite")."""
3239
3402
  title: String!
3240
3403
 
3241
- """Czy magazyn śledzi stock dla tego wariantu."""
3404
+ """Whether inventory is tracked for this variant."""
3242
3405
  trackQuantity: Boolean!
3243
3406
  }
3244
3407
 
@@ -3251,18 +3414,18 @@ type LocaleCurrencyMapping {
3251
3414
  locale: String!
3252
3415
  }
3253
3416
 
3254
- """Localization context dla storefronta"""
3417
+ """Localization context for the storefront"""
3255
3418
  type Localization {
3256
- """Wszystkie wsparte kraje (z aktywnych shipping zones)"""
3419
+ """All supported countries (from active shipping zones)"""
3257
3420
  availableCountries: [Country!]!
3258
3421
 
3259
- """Wszystkie wsparte języki sklepu"""
3422
+ """All supported shop languages"""
3260
3423
  availableLanguages: [Language!]!
3261
3424
 
3262
- """Aktualny kraj klienta (z `@inContext` lub geo-detection)"""
3425
+ """The customer current country (from `@inContext` or geo-detection)"""
3263
3426
  country: Country!
3264
3427
 
3265
- """Aktualny język klienta (z `Accept-Language` lub `@inContext`)"""
3428
+ """The customer current language (from `Accept-Language` or `@inContext`)"""
3266
3429
  language: Language!
3267
3430
  }
3268
3431
 
@@ -3836,87 +3999,191 @@ type Mutation {
3836
3999
  """
3837
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).
3838
4001
  """
3839
- 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!
3840
4011
 
3841
4012
  """
3842
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).
3843
4014
  """
3844
- cartApplyGiftCard(input: CartApplyGiftCardInput!): CartApplyGiftCardPayload!
4015
+ cartApplyGiftCard(
4016
+ """Cart UUID + full gift card code to redeem against the cart"""
4017
+ input: CartApplyGiftCardInput!
4018
+ ): CartApplyGiftCardPayload!
4019
+
4020
+ """
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`).
4022
+ """
4023
+ cartClearPaymentSelection(
4024
+ """
4025
+ Cart UUID to clear all payment selection state (method, provider, instrument)
4026
+ """
4027
+ input: CartClearPaymentSelectionInput!
4028
+ ): CartClearPaymentSelectionPayload!
3845
4029
 
3846
4030
  """
3847
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.
3848
4032
  """
3849
- 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!
3850
4039
 
3851
4040
  """
3852
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.
3853
4042
  """
3854
- 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!
3855
4049
 
3856
4050
  """
3857
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.
3858
4052
  """
3859
- 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!
3860
4062
 
3861
4063
  """
3862
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.
3863
4065
  """
3864
- cartRemoveGiftCard(input: CartRemoveGiftCardInput!): CartRemoveGiftCardPayload!
4066
+ cartRemoveGiftCard(
4067
+ """Cart UUID + applied gift card UUID to remove from the cart"""
4068
+ input: CartRemoveGiftCardInput!
4069
+ ): CartRemoveGiftCardPayload!
3865
4070
 
3866
4071
  """
3867
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.
3868
4073
  """
3869
- 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!
3870
4081
 
3871
4082
  """
3872
- Select a payment method on the cart. Validates against the active shop payment methods and currency. The selection is finalised at `cartComplete`; payment itself is initiated via a separate `paymentCreate` mutation after the order is created.
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`.
3873
4084
  """
3874
- 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!
3875
4091
 
3876
4092
  """
3877
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.
3878
4094
  """
3879
- cartSelectShippingMethod(input: CartSelectShippingMethodInput!): CartSelectShippingMethodPayload!
4095
+ cartSelectShippingMethod(
4096
+ """Cart UUID + shipping method UUID to select for the cart"""
4097
+ input: CartSelectShippingMethodInput!
4098
+ ): CartSelectShippingMethodPayload!
3880
4099
 
3881
4100
  """
3882
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).
3883
4102
  """
3884
- 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!
3885
4109
 
3886
4110
  """
3887
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.
3888
4112
  """
3889
- 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!
3890
4119
 
3891
4120
  """
3892
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`.
3893
4122
  """
3894
- 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!
3895
4132
 
3896
4133
  """
3897
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.
3898
4135
  """
3899
- 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!
3900
4145
 
3901
4146
  """
3902
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.
3903
4148
  """
3904
- 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!
3905
4155
 
3906
4156
  """
3907
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`.
3908
4158
  """
3909
- 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!
3910
4168
 
3911
4169
  """
3912
4170
  Set or replace the buyer note on the cart (free-form, up to 1000 chars). Surfaced to the merchant on the resulting order.
3913
4171
  """
3914
- 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!
3915
4181
 
3916
4182
  """
3917
4183
  Activate customer account using raw activation token (admin-created flow)
3918
4184
  """
3919
4185
  customerActivate(
4186
+ """New password (must satisfy the shop password policy)"""
3920
4187
  password: String!
3921
4188
 
3922
4189
  """Raw activation token from the activation email"""
@@ -3924,12 +4191,20 @@ type Mutation {
3924
4191
  ): CustomerActivatePayload!
3925
4192
 
3926
4193
  """Add customer address"""
3927
- 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!
3928
4200
 
3929
4201
  """
3930
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).
3931
4203
  """
3932
- customerLogin(input: CustomerAccessTokenCreateInput!): CustomerLoginPayload!
4204
+ customerLogin(
4205
+ """Login credentials — email + password"""
4206
+ input: CustomerAccessTokenCreateInput!
4207
+ ): CustomerLoginPayload!
3933
4208
 
3934
4209
  """
3935
4210
  Sign the current customer out. Invalidates the access token on the server; the SDK BFF auth helpers additionally clear the HTTP-only cookie.
@@ -3942,13 +4217,22 @@ type Mutation {
3942
4217
  customerRefreshToken: CustomerRefreshTokenPayload!
3943
4218
 
3944
4219
  """Remove customer address"""
3945
- customerRemoveAddress(id: ID!): CustomerRemoveAddressPayload!
4220
+ customerRemoveAddress(
4221
+ """UUID of the address to remove"""
4222
+ id: ID!
4223
+ ): CustomerRemoveAddressPayload!
3946
4224
 
3947
4225
  """Request password reset email"""
3948
- 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!
3949
4232
 
3950
4233
  """Reset customer password via signed URL from email"""
3951
4234
  customerResetPassword(
4235
+ """New password (must satisfy the shop password policy)"""
3952
4236
  newPassword: String!
3953
4237
 
3954
4238
  """Raw password-reset token from the password-reset email"""
@@ -3956,66 +4240,142 @@ type Mutation {
3956
4240
  ): CustomerResetPasswordPayload!
3957
4241
 
3958
4242
  """Set default address"""
3959
- 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!
3960
4249
 
3961
4250
  """
3962
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.
3963
4252
  """
3964
- 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!
3965
4259
 
3966
4260
  """Subscribe an email to the newsletter (guest-friendly, double opt-in)."""
3967
- 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!
3968
4267
 
3969
4268
  """Unsubscribe an email from the newsletter (guest-friendly, idempotent)."""
3970
- customerUnsubscribeFromMarketing(input: CustomerUnsubscribeFromMarketingInput!): UnsubscribeFromMarketingPayload!
4269
+ customerUnsubscribeFromMarketing(
4270
+ """
4271
+ Newsletter unsubscribe — email to opt out (idempotent, anti-enumeration)
4272
+ """
4273
+ input: CustomerUnsubscribeFromMarketingInput!
4274
+ ): UnsubscribeFromMarketingPayload!
3971
4275
 
3972
4276
  """Update customer profile"""
3973
- customerUpdate(customer: CustomerUpdateInput!): CustomerUpdatePayload!
4277
+ customerUpdate(
4278
+ """
4279
+ Customer profile changes — only supplied fields are touched (strict-hybrid)
4280
+ """
4281
+ customer: CustomerUpdateInput!
4282
+ ): CustomerUpdatePayload!
3974
4283
 
3975
4284
  """Update customer address"""
3976
- 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!
3977
4292
 
3978
4293
  """Generate or retrieve referral code"""
3979
4294
  loyaltyGenerateReferralCode: GenerateReferralCodePayload!
3980
4295
 
3981
4296
  """Redeem a loyalty reward"""
3982
- loyaltyRedeemReward(input: RedeemRewardInput!): RedeemRewardPayload!
4297
+ loyaltyRedeemReward(
4298
+ """Reward redemption payload (rewardId UUID)"""
4299
+ input: RedeemRewardInput!
4300
+ ): RedeemRewardPayload!
3983
4301
 
3984
4302
  """
3985
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.
3986
4304
  """
3987
- 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!
3988
4311
 
3989
4312
  """Cancel a return request"""
3990
- returnCancel(id: ID!): ReturnCancelPayload!
4313
+ returnCancel(
4314
+ """Return UUID to cancel (only REQUESTED/APPROVED/DRAFT statuses)"""
4315
+ id: ID!
4316
+ ): ReturnCancelPayload!
3991
4317
 
3992
4318
  """Create a return request"""
3993
- returnCreate(input: ReturnCreateInput!): ReturnCreatePayload!
4319
+ returnCreate(
4320
+ """
4321
+ Return request payload (orderId, reason, items[], optional customerNote/compensationType/idempotencyKey)
4322
+ """
4323
+ input: ReturnCreateInput!
4324
+ ): ReturnCreatePayload!
3994
4325
 
3995
4326
  """Create a product review"""
3996
- 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!
3997
4333
 
3998
4334
  """
3999
4335
  Mark review as not helpful (downvote). Replaces any prior vote by same customer.
4000
4336
  """
4001
- reviewDownvote(reviewId: ID!): ReviewPayload!
4337
+ reviewDownvote(
4338
+ """Review UUID to downvote"""
4339
+ reviewId: ID!
4340
+ ): ReviewPayload!
4002
4341
 
4003
4342
  """
4004
4343
  Mark review as helpful (upvote). Replaces any prior vote by same customer.
4005
4344
  """
4006
- reviewUpvote(reviewId: ID!): ReviewPayload!
4345
+ reviewUpvote(
4346
+ """Review UUID to upvote"""
4347
+ reviewId: ID!
4348
+ ): ReviewPayload!
4007
4349
 
4008
4350
  """Add item to wishlist"""
4009
- 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!
4010
4358
 
4011
4359
  """Create a new wishlist"""
4012
- wishlistCreate(input: WishlistCreateInput!): WishlistPayload!
4360
+ wishlistCreate(
4361
+ """Wishlist details (name + isPublic flag for share-by-link visibility)"""
4362
+ input: WishlistCreateInput!
4363
+ ): WishlistPayload!
4013
4364
 
4014
4365
  """Delete a wishlist"""
4015
- wishlistDelete(id: ID!): WishlistPayload!
4366
+ wishlistDelete(
4367
+ """Wishlist UUID to delete (must be owned by the authenticated customer)"""
4368
+ id: ID!
4369
+ ): WishlistPayload!
4016
4370
 
4017
4371
  """Remove item from wishlist"""
4018
- 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!
4019
4379
  }
4020
4380
 
4021
4381
  """GraphQL Node interface — universal ID-based lookup"""
@@ -4025,7 +4385,7 @@ interface Node {
4025
4385
  }
4026
4386
 
4027
4387
  """
4028
- 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)
4029
4389
  """
4030
4390
  enum NodeType {
4031
4391
  ARTICLE
@@ -4050,7 +4410,12 @@ type Order implements Node {
4050
4410
  accessToken: String!
4051
4411
 
4052
4412
  """Order custom field values (post-Opcja A unified custom fields)."""
4053
- 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!]!
4054
4419
 
4055
4420
  """
4056
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.
@@ -4086,7 +4451,17 @@ type Order implements Node {
4086
4451
  """
4087
4452
  Line items on the order (paginated, Relay Connection). Use to render the order summary on the confirmation or order detail page.
4088
4453
  """
4089
- 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!
4090
4465
 
4091
4466
  """
4092
4467
  Human-readable order number shown to the buyer and the merchant (e.g. "1042"). Distinct from `id`.
@@ -4094,7 +4469,7 @@ type Order implements Node {
4094
4469
  orderNumber: String!
4095
4470
 
4096
4471
  """
4097
- 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).
4098
4473
  """
4099
4474
  paymentMethodType: PaymentMethodType!
4100
4475
 
@@ -4163,39 +4538,39 @@ enum OrderFulfillmentStatus {
4163
4538
  UNFULFILLED
4164
4539
  }
4165
4540
 
4166
- """Pozycja zamówienia (line item) z variant snapshot i live enrichment"""
4541
+ """Order line item with variant snapshot and live enrichment"""
4167
4542
  type OrderLineItem {
4168
4543
  """Unique identifier"""
4169
4544
  id: ID!
4170
4545
 
4171
4546
  """
4172
- Całkowita cena linii z momentu zakupu (unitPrice × quantity, minor units)
4547
+ Line total captured at purchase time (unitPrice × quantity, minor units)
4173
4548
  """
4174
4549
  originalTotalPrice: Money!
4175
4550
 
4176
4551
  """
4177
- Cena jednostkowa z momentu zakupu (minor units, include BUNDLED surcharges)
4552
+ Unit price captured at purchase time (minor units, includes BUNDLED surcharges)
4178
4553
  """
4179
4554
  originalUnitPrice: Money!
4180
4555
 
4181
- """Ilość zamówiona (snapshot z checkout)"""
4556
+ """Quantity ordered (snapshot from checkout)"""
4182
4557
  quantity: Int!
4183
4558
 
4184
- """Ilość już zrealizowana (shipped — per-item fulfillment tracking)"""
4559
+ """Quantity already fulfilled (shipped — per-item fulfillment tracking)"""
4185
4560
  quantityFulfilled: Int!
4186
4561
 
4187
4562
  """
4188
- 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.
4189
4564
  """
4190
4565
  refundableQuantity: Int!
4191
4566
 
4192
4567
  """
4193
- 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).
4194
4569
  """
4195
4570
  title: String!
4196
4571
 
4197
4572
  """
4198
- 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`.
4199
4574
  """
4200
4575
  variant: ProductVariant
4201
4576
  }
@@ -4212,7 +4587,7 @@ type OrderLineItemConnection {
4212
4587
  pageInfo: PageInfo!
4213
4588
 
4214
4589
  """
4215
- 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)
4216
4591
  """
4217
4592
  totalCount: Int!
4218
4593
  }
@@ -4337,9 +4712,14 @@ type PaymentCreatePayload {
4337
4712
  payment: PaymentSession
4338
4713
 
4339
4714
  """
4340
- Business / validation errors carrying a stable `PaymentErrorCode` in `code` (e.g. `ORDER_NOT_FOUND`, `ORDER_ALREADY_PAID`, `ORDER_NOT_PAYABLE`, `PAYMENT_PROVIDER_NOT_CONFIGURED`, `RETURN_URL_INVALID`, `PAYMENT_FAILED`).
4715
+ Business / validation errors carrying a stable `PaymentErrorCode` in `code` (e.g. `ORDER_NOT_FOUND`, `ORDER_ALREADY_PAID`, `ORDER_NOT_PAYABLE`, `PAYMENT_PROVIDER_NOT_CONFIGURED`, `RETURN_URL_INVALID`, `PAYMENT_FAILED`, `INSTRUMENT_PRESELECTION_FAILED`).
4341
4716
  """
4342
4717
  userErrors: [UserError!]!
4718
+
4719
+ """
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.
4721
+ """
4722
+ warnings: [PaymentWarning!]!
4343
4723
  }
4344
4724
 
4345
4725
  """
@@ -4352,25 +4732,96 @@ enum PaymentInitiationFlow {
4352
4732
  ONLINE_REDIRECT
4353
4733
  }
4354
4734
 
4735
+ """
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.
4737
+ """
4738
+ type PaymentInstrument {
4739
+ """
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).
4741
+ """
4742
+ brandImage: Image
4743
+
4744
+ """
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.
4746
+ """
4747
+ code: String!
4748
+
4749
+ """
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.
4751
+ """
4752
+ displayHint: PaymentInstrumentDisplayHint!
4753
+
4754
+ """
4755
+ Buyer-facing display name (e.g. "BLIK", "mBank", "ING Bank Śląski", "Apple Pay").
4756
+ """
4757
+ displayName: String!
4758
+
4759
+ """
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).
4761
+ """
4762
+ enabled: Boolean!
4763
+
4764
+ """
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).
4766
+ """
4767
+ provider: PaymentProvider!
4768
+
4769
+ """
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.
4771
+ """
4772
+ type: PaymentInstrumentType!
4773
+ }
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
+
4355
4796
  """
4356
4797
  A payment method offered to the buyer at checkout — what to render in the payment picker and pass to `cartSelectPaymentMethod`.
4357
4798
  """
4358
4799
  type PaymentMethod {
4800
+ """
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.
4802
+ """
4803
+ available: Boolean!
4804
+
4359
4805
  """
4360
4806
  Optional buyer-facing description shown under the name (e.g. "Pay with your bank app").
4361
4807
  """
4362
4808
  description: String
4363
4809
 
4364
4810
  """
4365
- Optional icon URL configured by the merchant. Use as the method tile artwork.
4811
+ Optional icon image configured by the merchant. Use `icon { url(transform: { maxWidth: 64 }) altText }` as the method tile artwork in the payment picker.
4366
4812
  """
4367
- icon: String
4813
+ icon: Image
4368
4814
 
4369
4815
  """
4370
4816
  Stable ID of the payment method. Pass to `cartSelectPaymentMethod` to select it.
4371
4817
  """
4372
4818
  id: ID!
4373
4819
 
4820
+ """
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.
4822
+ """
4823
+ instruments: [PaymentInstrument!]
4824
+
4374
4825
  """
4375
4826
  True when the merchant has marked this method as the default. Pre-select it in the picker.
4376
4827
  """
@@ -4387,9 +4838,19 @@ type PaymentMethod {
4387
4838
  position: Float!
4388
4839
 
4389
4840
  """
4390
- Provider code (e.g. "payu", "stripe", "p24", "cash_on_delivery"). Identifies the integration behind the method; do not branch UI on it use `type` instead.
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.
4391
4842
  """
4392
- provider: String!
4843
+ preferredProvider: PaymentProvider
4844
+
4845
+ """
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.
4847
+ """
4848
+ provider: PaymentProvider!
4849
+
4850
+ """
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.
4852
+ """
4853
+ providersAvailable: [PaymentProvider!]
4393
4854
 
4394
4855
  """
4395
4856
  ISO 4217 currency codes the method accepts. Null when the method accepts the shop currency without restriction.
@@ -4397,20 +4858,51 @@ type PaymentMethod {
4397
4858
  supportedCurrencies: [String!]
4398
4859
 
4399
4860
  """
4400
- Category of the method (CARD, BLIK, BANK_TRANSFER, CASH_ON_DELIVERY, OTHER). Drives iconography and copy.
4861
+ Category of the method (CARD, BLIK, BANK_TRANSFER, INSTALLMENT, WALLET, CASH_ON_DELIVERY, OTHER). Drives iconography and copy.
4401
4862
  """
4402
4863
  type: PaymentMethodType!
4864
+
4865
+ """
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").
4867
+ """
4868
+ unavailableReason: PaymentMethodUnavailableReason
4403
4869
  }
4404
4870
 
4405
4871
  """
4406
- 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.
4407
4873
  """
4408
4874
  enum PaymentMethodType {
4409
4875
  BANK_TRANSFER
4410
4876
  BLIK
4411
4877
  CARD
4412
4878
  CASH_ON_DELIVERY
4879
+ INSTALLMENT
4413
4880
  OTHER
4881
+ WALLET
4882
+ }
4883
+
4884
+ """
4885
+ Why a payment method is currently unavailable. GATEWAY_DOWN/DISABLED/NO_INSTRUMENTS are transient (gateway-side); CREDENTIALS_INVALID needs merchant action in the admin panel.
4886
+ """
4887
+ enum PaymentMethodUnavailableReason {
4888
+ CREDENTIALS_INVALID
4889
+ GATEWAY_DISABLED
4890
+ GATEWAY_DOWN
4891
+ NO_INSTRUMENTS
4892
+ }
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
4414
4906
  }
4415
4907
 
4416
4908
  """
@@ -4456,21 +4948,50 @@ type PaymentSession {
4456
4948
 
4457
4949
  """Shop payment configuration (currency, country, providers)"""
4458
4950
  type PaymentSettings {
4459
- """Country code sklepu driver dostępności metod płatności"""
4951
+ """Shop country code — drives payment method availability"""
4460
4952
  countryCode: CountryCode!
4461
4953
 
4462
- """Primary currency użyty do procesowania płatności"""
4954
+ """Primary currency used to process payments"""
4463
4955
  currencyCode: CurrencyCode!
4464
4956
 
4465
- """Waluty displayable on storefront (Money.currencyCode allowlist)"""
4957
+ """
4958
+ Currencies displayable on the storefront (Money.currencyCode allowlist)
4959
+ """
4466
4960
  enabledPresentmentCurrencies: [CurrencyCode!]!
4467
4961
 
4468
4962
  """
4469
- 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.
4470
4964
  """
4471
4965
  paymentProviders: [String!]!
4472
4966
  }
4473
4967
 
4968
+ """
4969
+ Non-blocking signal emitted alongside `userErrors` — backend state change context (e.g. an auto-clear, a server-side adjustment) that the storefront may surface as a retry hint or analytics event. Always pre-translated by backend per shop locale.
4970
+ """
4971
+ type PaymentWarning {
4972
+ """
4973
+ Machine-readable code — branch on this to dispatch UI retry hints. Add a new code only when there is a distinct UX response.
4974
+ """
4975
+ code: PaymentWarningCode!
4976
+
4977
+ """
4978
+ Pre-translated user-facing message describing what happened (Polish-first per shop locale).
4979
+ """
4980
+ message: String!
4981
+
4982
+ """
4983
+ Optional additional hint string for UI dispatch — currently unused for `INSTRUMENT_CLEARED_FOR_RETRY` (semantic encoded in `message`). Reserved for future warning codes (e.g. `SLOW_GATEWAY_RESPONSE` → "Retry in 30s").
4984
+ """
4985
+ retryHint: String
4986
+ }
4987
+
4988
+ """
4989
+ Machine-readable code for `PaymentWarning.code`. Non-blocking signals from payment mutations — branch on this to dispatch UI retry hints. `INSTRUMENT_CLEARED_FOR_RETRY` indicates backend auto-cleared a preselected payment instrument after gateway rejection; next `paymentCreate` will land on the gateway default page.
4990
+ """
4991
+ enum PaymentWarningCode {
4992
+ INSTRUMENT_CLEARED_FOR_RETRY
4993
+ }
4994
+
4474
4995
  """
4475
4996
  A pickup point (parcel locker or staffed collection point) attached to a delivery address. The buyer picks it in the carrier widget; it is persisted on the cart shipping address and carried through to the order.
4476
4997
  """
@@ -4603,23 +5124,28 @@ type Product implements Node {
4603
5124
  """
4604
5125
  Customer-facing product attributes (configurator) — set definitions + per-product scoped
4605
5126
  """
4606
- 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!]!
4607
5133
 
4608
5134
  """Average rating (1-5)"""
4609
5135
  averageRating: Float
4610
5136
 
4611
5137
  """
4612
- 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.
4613
5139
  """
4614
5140
  brand: Brand
4615
5141
 
4616
5142
  """
4617
- 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.
4618
5144
  """
4619
5145
  categories: [Category!]!
4620
5146
 
4621
5147
  """
4622
- 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.
4623
5149
  """
4624
5150
  compareAtPriceRange: ProductPriceRange
4625
5151
 
@@ -4645,7 +5171,25 @@ type Product implements Node {
4645
5171
  id: ID!
4646
5172
 
4647
5173
  """Product images (Relay Connection)"""
4648
- 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!
4649
5193
 
4650
5194
  """Whether product is available for sale (any variant in stock)"""
4651
5195
  isAvailable: Boolean!
@@ -4664,17 +5208,20 @@ type Product implements Node {
4664
5208
  priceRange: ProductPriceRange!
4665
5209
 
4666
5210
  """
4667
- 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.
4668
5212
  """
4669
5213
  priceRangeWithConversion: ConvertedPriceRange
4670
5214
 
4671
5215
  """
4672
- 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.
4673
5217
  """
4674
5218
  primaryCategory: Category
4675
5219
 
4676
5220
  """Similar products recommendations"""
4677
- recommendations(first: Int = 4): ProductRecommendations
5221
+ recommendations(
5222
+ """Number of similar products to return (default 4, max 100)"""
5223
+ first: Int = 4
5224
+ ): ProductRecommendations
4678
5225
 
4679
5226
  """Number of reviews"""
4680
5227
  reviewCount: Int
@@ -4700,14 +5247,34 @@ type Product implements Node {
4700
5247
  updatedAt: DateTime!
4701
5248
 
4702
5249
  """Product variants (Relay Connection)"""
4703
- 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!
4704
5271
 
4705
5272
  """
4706
- 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).
4707
5274
  """
4708
5275
  vendor: String
4709
5276
 
4710
- """Catalog visibility (Faza 1.5) — PUBLIC | HIDDEN | BUNDLE_ONLY"""
5277
+ """Catalog visibility — PUBLIC | HIDDEN | BUNDLE_ONLY"""
4711
5278
  visibility: ProductVisibility!
4712
5279
  }
4713
5280
 
@@ -4784,12 +5351,12 @@ type ProductAttributeOption {
4784
5351
  label: String!
4785
5352
 
4786
5353
  """
4787
- 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.
4788
5355
  """
4789
5356
  linkedVariant: LinkedVariantSummary
4790
5357
 
4791
5358
  """
4792
- Linked ProductVariant ID for component stock decrement (Faza 1.5 — Hidden Products pattern)
5359
+ Linked ProductVariant ID for component stock decrement (hidden-products pattern).
4793
5360
  """
4794
5361
  linkedVariantId: ID
4795
5362
 
@@ -4797,11 +5364,11 @@ type ProductAttributeOption {
4797
5364
  sortOrder: Int!
4798
5365
 
4799
5366
  """
4800
- 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).
4801
5368
  """
4802
5369
  surchargeAmount: Int
4803
5370
 
4804
- """Surcharge type — FIXED | PERCENT (Faza 2)"""
5371
+ """Surcharge type — FIXED | PERCENT."""
4805
5372
  surchargeType: AttributeOptionSurchargeType
4806
5373
 
4807
5374
  """Internal value (slug-style)"""
@@ -4840,7 +5407,7 @@ type ProductEdge {
4840
5407
  """Single product filter"""
4841
5408
  input ProductFilter {
4842
5409
  """
4843
- 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.
4844
5411
  """
4845
5412
  attributes: [AttributeFilterInput!]
4846
5413
 
@@ -4848,7 +5415,7 @@ input ProductFilter {
4848
5415
  available: Boolean
4849
5416
 
4850
5417
  """
4851
- 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`.
4852
5419
  """
4853
5420
  brand: BrandFilter
4854
5421
 
@@ -4974,8 +5541,10 @@ type ProductReview {
4974
5541
  helpfulCount: Int!
4975
5542
  id: ID!
4976
5543
 
4977
- """Review images"""
4978
- 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!]!
4979
5548
 
4980
5549
  """Is verified purchase"""
4981
5550
  isVerifiedPurchase: Boolean!
@@ -5042,7 +5611,12 @@ A purchasable unit of a product — one variant out of the product variants list
5042
5611
  """
5043
5612
  type ProductVariant {
5044
5613
  """Variant custom field values (post-Opcja A unified custom fields)."""
5045
- 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!]!
5046
5620
 
5047
5621
  """
5048
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).
@@ -5103,7 +5677,7 @@ type ProductVariant {
5103
5677
  sortOrder: Int
5104
5678
 
5105
5679
  """
5106
- 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.
5107
5681
  """
5108
5682
  storeAvailability(
5109
5683
  """Cursor for pagination"""
@@ -5154,7 +5728,7 @@ type ProductVariantEdge {
5154
5728
  node: ProductVariant!
5155
5729
  }
5156
5730
 
5157
- """Catalog placement — PUBLIC | HIDDEN | BUNDLE_ONLY (Faza 1.5)"""
5731
+ """Catalog placement — PUBLIC | HIDDEN | BUNDLE_ONLY"""
5158
5732
  enum ProductVisibility {
5159
5733
  BUNDLE_ONLY
5160
5734
  HIDDEN
@@ -5166,25 +5740,58 @@ type Query {
5166
5740
  allSupportedCurrencies: [Currency!]!
5167
5741
 
5168
5742
  """
5169
- 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).
5170
5744
  """
5171
- 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!
5172
5751
 
5173
5752
  """
5174
- Payment methods active for the current shop, plus the merchant default. Shop-level independent of cart contents in this iteration. Fetch once for the checkout payment step.
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.
5175
5754
  """
5176
5755
  availablePaymentMethods: AvailablePaymentMethods!
5177
5756
 
5178
5757
  """
5179
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.
5180
5759
  """
5181
- 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!
5182
5769
 
5183
5770
  """Get live shipping rates from configured carriers"""
5184
- 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!
5185
5783
 
5186
5784
  """Get B2B pricing for a product variant"""
5187
- 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
5188
5795
 
5189
5796
  """List blog categories"""
5190
5797
  blogCategories: [BlogCategory!]!
@@ -5226,20 +5833,32 @@ type Query {
5226
5833
  ): BlogPostConnection!
5227
5834
 
5228
5835
  """List blog tags"""
5229
- blogTags(limit: Int = 50): [BlogTag!]!
5836
+ blogTags(
5837
+ """Maximum number of tags to return (default 50, max 200)"""
5838
+ limit: Int = 50
5839
+ ): [BlogTag!]!
5230
5840
 
5231
5841
  """
5232
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.
5233
5843
  """
5234
- cart(id: ID!): Cart
5844
+ cart(
5845
+ """Cart UUID to fetch"""
5846
+ id: ID!
5847
+ ): Cart
5235
5848
 
5236
5849
  """
5237
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.
5238
5851
  """
5239
- 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!
5240
5859
 
5241
5860
  """
5242
- Lista kategorii (Relay Connection) z opcjonalnym filtrem rootsOnly/parentId
5861
+ List of categories (Relay Connection) with optional rootsOnly/parentId filtering
5243
5862
  """
5244
5863
  categories(
5245
5864
  """Forward pagination cursor (after this element)"""
@@ -5255,7 +5874,7 @@ type Query {
5255
5874
  last: Int
5256
5875
 
5257
5876
  """
5258
- 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
5259
5878
  """
5260
5879
  parentId: ID
5261
5880
 
@@ -5331,11 +5950,16 @@ type Query {
5331
5950
  """
5332
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.
5333
5952
  """
5334
- customerOrder(orderId: ID!): Order
5953
+ customerOrder(
5954
+ """Order UUID owned by the authenticated customer"""
5955
+ orderId: ID!
5956
+ ): Order
5335
5957
 
5336
5958
  """Estimate points for an order amount"""
5337
5959
  estimatePoints(
5338
- """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
+ """
5339
5963
  orderTotal: Float!
5340
5964
  ): PointsEstimate!
5341
5965
 
@@ -5349,19 +5973,30 @@ type Query {
5349
5973
  ): ExchangeRate
5350
5974
 
5351
5975
  """Get gift card by code (null if not found)"""
5352
- giftCard(code: String!): GiftCard
5976
+ giftCard(
5977
+ """Gift card code to look up (case-sensitive)"""
5978
+ code: String!
5979
+ ): GiftCard
5353
5980
 
5354
5981
  """Validate gift card for use"""
5355
- 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!
5356
5989
 
5357
5990
  """Get available languages for this shop"""
5358
5991
  languages: [Language!]!
5359
5992
 
5360
- """Localization context (kraje, języki, aktualny kraj/język klienta)"""
5993
+ """
5994
+ Localization context (countries, languages, the customer current country/language)
5995
+ """
5361
5996
  localization: Localization!
5362
5997
 
5363
5998
  """
5364
- 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).
5365
6000
  """
5366
6001
  location(
5367
6002
  """Location UUID"""
@@ -5401,18 +6036,47 @@ type Query {
5401
6036
  loyaltyTiers: [LoyaltyTier!]!
5402
6037
 
5403
6038
  """Get loyalty transaction history"""
5404
- 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!
5405
6050
 
5406
6051
  """Get a navigation menu by handle"""
5407
- 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
5408
6058
 
5409
6059
  """Universal ID-based lookup (Relay Node spec)"""
5410
- 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
5411
6069
 
5412
6070
  """
5413
- 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).
5414
6072
  """
5415
- 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]!
5416
6080
 
5417
6081
  """
5418
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.
@@ -5455,7 +6119,10 @@ type Query {
5455
6119
  ): ShopPageConnection!
5456
6120
 
5457
6121
  """Get personalized product recommendations for the current customer"""
5458
- personalizedRecommendations(first: Int = 10): ProductRecommendations!
6122
+ personalizedRecommendations(
6123
+ """Number of recommendations to return (default 10, max 100)"""
6124
+ first: Int = 10
6125
+ ): ProductRecommendations!
5459
6126
 
5460
6127
  """Get single product by ID or handle"""
5461
6128
  product(
@@ -5469,7 +6136,12 @@ type Query {
5469
6136
  """
5470
6137
  Get available filters for product listing (renamed from availableFilters in Storefront 5.0)
5471
6138
  """
5472
- 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!
5473
6145
 
5474
6146
  """Get recommended products similar to the given product"""
5475
6147
  productRecommendations(
@@ -5519,16 +6191,25 @@ type Query {
5519
6191
  referralStats: ReferralStats
5520
6192
 
5521
6193
  """Get return by ID"""
5522
- return(id: ID!): ReturnPayload!
6194
+ return(
6195
+ """Return UUID to fetch (customer-owned, ownership verified)"""
6196
+ id: ID!
6197
+ ): ReturnPayload!
5523
6198
 
5524
6199
  """Get available return reasons"""
5525
6200
  returnReasons: [ReturnReasonOption!]!
5526
6201
 
5527
6202
  """Get returns for an order"""
5528
- returnsByOrder(orderId: ID!): ReturnConnection!
6203
+ returnsByOrder(
6204
+ """Order UUID to list returns for (ownership verified)"""
6205
+ orderId: ID!
6206
+ ): ReturnConnection!
5529
6207
 
5530
6208
  """Get product review statistics"""
5531
- reviewStats(productId: ID!): ReviewStats!
6209
+ reviewStats(
6210
+ """Product UUID to fetch review statistics for"""
6211
+ productId: ID!
6212
+ ): ReviewStats!
5532
6213
 
5533
6214
  """Search products (DoSwiftly alias for products() with required query)"""
5534
6215
  searchProducts(
@@ -5563,10 +6244,16 @@ type Query {
5563
6244
  ): PredictiveSearchResult!
5564
6245
 
5565
6246
  """Get shipment by ID"""
5566
- shipment(id: ID!): ShipmentPayload!
6247
+ shipment(
6248
+ """Shipment UUID (customer must own parent order)"""
6249
+ id: ID!
6250
+ ): ShipmentPayload!
5567
6251
 
5568
6252
  """Get shipment by tracking number"""
5569
- shipmentByTrackingNumber(trackingNumber: String!): ShipmentPayload!
6253
+ shipmentByTrackingNumber(
6254
+ """Carrier tracking number (public lookup, no auth required)"""
6255
+ trackingNumber: String!
6256
+ ): ShipmentPayload!
5570
6257
 
5571
6258
  """Get current shop information"""
5572
6259
  shop: Shop!
@@ -5575,7 +6262,12 @@ type Query {
5575
6262
  shopCurrencyConfig: ShopCurrencyConfig!
5576
6263
 
5577
6264
  """Get translations for a language"""
5578
- 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!
5579
6271
 
5580
6272
  """List URL redirects"""
5581
6273
  urlRedirects(
@@ -5795,8 +6487,10 @@ type ReturnItem {
5795
6487
  """Item ID"""
5796
6488
  id: ID!
5797
6489
 
5798
- """Product image URL"""
5799
- 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
5800
6494
 
5801
6495
  """Evidence photos"""
5802
6496
  photos: [ReturnItemPhoto!]
@@ -6103,8 +6797,10 @@ type ShipmentItem {
6103
6797
  """Item ID"""
6104
6798
  id: ID!
6105
6799
 
6106
- """Product image URL"""
6107
- 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
6108
6804
 
6109
6805
  """Quantity shipped"""
6110
6806
  quantity: Int!
@@ -6202,9 +6898,9 @@ type ShippingCarrier {
6202
6898
  id: ID
6203
6899
 
6204
6900
  """
6205
- 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.
6206
6902
  """
6207
- logoUrl: String
6903
+ logo: Image
6208
6904
 
6209
6905
  """Carrier display name (e.g. "InPost", "DPD", "DHL")."""
6210
6906
  name: String!
@@ -6246,7 +6942,7 @@ type Shop {
6246
6942
  """Default currency code (ISO 4217)"""
6247
6943
  currencyCode: CurrencyCode!
6248
6944
 
6249
- """Customer account URL (login/orders) — z primaryDomain"""
6945
+ """Customer account URL (login/orders) — derived from primaryDomain"""
6250
6946
  customerAccountUrl: URL
6251
6947
 
6252
6948
  """Default language code (ISO 639-1)"""
@@ -6268,7 +6964,7 @@ type Shop {
6268
6964
  logo: Image
6269
6965
 
6270
6966
  """
6271
- Money display format z `{{amount}}` placeholder, np. "{{amount}} zł"
6967
+ Money display format with the `{{amount}}` placeholder, e.g. "{{amount}} zł"
6272
6968
  """
6273
6969
  moneyFormat: String!
6274
6970
 
@@ -6574,8 +7270,10 @@ type TierBenefit {
6574
7270
  """Benefit description"""
6575
7271
  description: String
6576
7272
 
6577
- """Benefit icon"""
6578
- 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
6579
7277
 
6580
7278
  """Benefit name"""
6581
7279
  name: String!
@@ -6640,7 +7338,7 @@ URL string per RFC 3986 (e.g. "https://shop.example.com/products/foo").
6640
7338
  """
6641
7339
  scalar URL
6642
7340
 
6643
- """Measurement system (metric vs imperial) — wpływa na display formats"""
7341
+ """Measurement system (metric vs imperial) — affects display formats"""
6644
7342
  enum UnitSystem {
6645
7343
  IMPERIAL_SYSTEM
6646
7344
  METRIC_SYSTEM