spree_api 6.0.2 → 6.0.3

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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/concerns/spree/api/v3/admin/embed_permissions.rb +5 -2
  3. data/app/controllers/spree/api/v3/admin/products_controller.rb +56 -0
  4. data/app/serializers/spree/api/v3/admin/admin_user_serializer.rb +2 -2
  5. data/app/serializers/spree/api/v3/admin/delivery_profile_serializer.rb +2 -1
  6. data/app/serializers/spree/api/v3/admin/fulfillment_serializer.rb +1 -1
  7. data/app/serializers/spree/api/v3/admin/import_serializer.rb +1 -1
  8. data/app/serializers/spree/api/v3/admin/invitation_serializer.rb +2 -2
  9. data/app/serializers/spree/api/v3/admin/price_rule_serializer.rb +3 -1
  10. data/app/serializers/spree/api/v3/admin/product_serializer.rb +8 -0
  11. data/app/serializers/spree/api/v3/admin/promotion_action_serializer.rb +2 -2
  12. data/app/serializers/spree/api/v3/admin/promotion_rule_serializer.rb +4 -1
  13. data/app/serializers/spree/api/v3/admin/promotion_serializer.rb +13 -0
  14. data/app/serializers/spree/api/v3/admin/return_serializer.rb +1 -1
  15. data/app/serializers/spree/api/v3/admin/seller_requirement_status_serializer.rb +3 -2
  16. data/app/serializers/spree/api/v3/admin/seller_serializer.rb +2 -2
  17. data/app/serializers/spree/api/v3/fulfillment_serializer.rb +1 -1
  18. data/app/serializers/spree/api/v3/seller/import_serializer.rb +1 -1
  19. data/app/serializers/spree/api/v3/seller/invitation_serializer.rb +2 -2
  20. data/app/serializers/spree/api/v3/seller/product_serializer.rb +8 -0
  21. data/app/serializers/spree/api/v3/seller/requirement_status_serializer.rb +3 -2
  22. data/config/initializers/typelizer.rb +8 -19
  23. data/config/routes.rb +5 -0
  24. data/lib/spree/api/admin_document.rb +284 -0
  25. data/lib/spree/api/agent_operations.rb +300 -0
  26. data/lib/spree/api/agent_resource_map.rb +32 -7
  27. data/lib/spree/api/agent_write_schemas.rb +15 -51
  28. data/lib/spree/api/engine.rb +14 -1
  29. data/lib/spree/api/enum_types.rb +4 -1
  30. data/lib/spree/api/openapi/schema_helper.rb +3 -3
  31. data/lib/spree/api/sdk_types.rb +190 -0
  32. data/lib/spree/api/sdk_types_task.rb +68 -0
  33. data/lib/spree/api/testing_support/agent_tools.rb +35 -0
  34. data/lib/spree/api/testing_support/agent_tools_contract.rb +110 -0
  35. data/lib/spree/api/testing_support/deterministic_openapi.rb +147 -0
  36. data/lib/spree/api/testing_support/filter_parameters.rb +99 -0
  37. data/lib/spree/api/testing_support/openapi.rb +232 -0
  38. data/lib/spree/api/testing_support/openapi_tasks.rb +21 -0
  39. data/lib/spree/api/typelizer_generation.rb +39 -11
  40. data/lib/tasks/openapi.rake +5 -0
  41. data/lib/tasks/sdk_types.rake +6 -0
  42. data/lib/typelizer/open_enums.rb +13 -1
  43. data/openapi/admin.yaml +1540 -33
  44. metadata +20 -9
  45. data/lib/spree/api/agent_workflow_endpoints.rb +0 -113
data/openapi/admin.yaml CHANGED
@@ -3916,6 +3916,7 @@ paths:
3916
3916
  summary: Reposition a category product
3917
3917
  tags:
3918
3918
  - Categories
3919
+ operationId: categories_reposition_product
3919
3920
  security:
3920
3921
  - api_key: []
3921
3922
  bearer_auth: []
@@ -6081,6 +6082,9 @@ paths:
6081
6082
  "$ref": "#/components/schemas/ErrorResponse"
6082
6083
  "/api/v3/admin/customers/{id}/anonymize":
6083
6084
  post:
6085
+ x-spree-agent: false
6086
+ x-spree-agent-reason: Irreversible erasure of a person's data under GDPR Art.
6087
+ 17, which is not something to offer a model behind one confirmation prompt.
6084
6088
  summary: Erase a customer's personal data
6085
6089
  tags:
6086
6090
  - Customers
@@ -7701,6 +7705,94 @@ paths:
7701
7705
  schema:
7702
7706
  "$ref": "#/components/schemas/TaxIdentifierUpdateParams"
7703
7707
  required: true
7708
+ "/api/v3/admin/customers/{customer_id}/tax_identifiers/{id}/validate":
7709
+ parameters:
7710
+ - name: x-spree-api-key
7711
+ in: header
7712
+ required: true
7713
+ schema:
7714
+ type: string
7715
+ - name: Authorization
7716
+ in: header
7717
+ required: true
7718
+ schema:
7719
+ type: string
7720
+ - name: customer_id
7721
+ in: path
7722
+ required: true
7723
+ schema:
7724
+ type: string
7725
+ - name: id
7726
+ in: path
7727
+ required: true
7728
+ schema:
7729
+ type: string
7730
+ post:
7731
+ summary: Re-check a customer tax registration
7732
+ tags:
7733
+ - Customers
7734
+ x-codeSamples:
7735
+ - lang: javascript
7736
+ label: Spree Admin SDK
7737
+ source: |-
7738
+ import { createAdminClient } from '@spree/admin-sdk'
7739
+
7740
+ const client = createAdminClient({
7741
+ baseUrl: 'https://your-store.com',
7742
+ secretKey: 'sk_xxx',
7743
+ })
7744
+
7745
+ const registration = await client.customers.taxIdentifiers.validate(
7746
+ 'cust_UkLWZg9DAJ',
7747
+ 'txi_UkLWZg9DAJ',
7748
+ )
7749
+ - lang: bash
7750
+ label: Spree CLI
7751
+ source: spree api post /customers/{customer_id}/tax_identifiers/{id}/validate
7752
+ -d '{ ... }'
7753
+ operationId: customer_tax_identifiers_validate
7754
+ security:
7755
+ - api_key: []
7756
+ bearer_auth: []
7757
+ description: |-
7758
+ Asks the registry again. Manual because a registry answers only "valid now" — a number verified
7759
+ last year may have been deregistered since — and because a check that came back unavailable
7760
+ cannot otherwise be retried without editing the number.
7761
+
7762
+
7763
+ **Required scope:** `write_customers` (for API-key authentication).
7764
+ responses:
7765
+ '202':
7766
+ description: registry check queued
7767
+ content:
7768
+ application/json:
7769
+ example:
7770
+ id: txi_UkLWZg9DAJ
7771
+ kind: eu_vat
7772
+ value: DE100000032
7773
+ validation_status: pending
7774
+ validation_evidence:
7775
+ source:
7776
+ validated_at:
7777
+ created_at: '2026-01-15T12:00:00.000Z'
7778
+ updated_at: '2026-01-15T12:00:00.000Z'
7779
+ validatable: true
7780
+ customer_id: cust_UkLWZg9DAJ
7781
+ cart_id:
7782
+ order_id:
7783
+ schema:
7784
+ "$ref": "#/components/schemas/TaxIdentifier"
7785
+ '422':
7786
+ description: no validator installed for this kind
7787
+ content:
7788
+ application/json:
7789
+ example:
7790
+ error:
7791
+ code: tax_id_not_validatable
7792
+ message: No registry validator is installed for tax identifier kind
7793
+ 'eu_vat'
7794
+ schema:
7795
+ "$ref": "#/components/schemas/ErrorResponse"
7704
7796
  "/api/v3/admin/customers":
7705
7797
  get:
7706
7798
  summary: List customers
@@ -15999,6 +16091,81 @@ paths:
15999
16091
  schema:
16000
16092
  "$ref": "#/components/schemas/ClaimUpdateParams"
16001
16093
  required: true
16094
+ "/api/v3/admin/orders/{order_id}/claims/{id}/approve":
16095
+ patch:
16096
+ summary: Approve a claim
16097
+ tags:
16098
+ - Orders
16099
+ x-codeSamples:
16100
+ - lang: javascript
16101
+ label: Spree Admin SDK
16102
+ source: |-
16103
+ import { createAdminClient } from '@spree/admin-sdk'
16104
+
16105
+ const client = createAdminClient({
16106
+ baseUrl: 'https://your-store.com',
16107
+ secretKey: 'sk_xxx',
16108
+ })
16109
+
16110
+ const claim = await client.orders.claims.approve('or_UkLWZg9DAJ', 'claim_UkLWZg9DAJ')
16111
+ - lang: bash
16112
+ label: Spree CLI
16113
+ source: spree api patch /orders/{order_id}/claims/{id}/approve -d '{ ... }'
16114
+ security:
16115
+ - api_key: []
16116
+ bearer_auth: []
16117
+ description: |-
16118
+ Accepts an open claim, the step before resolving it with a refund, a replacement or both. Only an open claim can be approved; deny it to turn it down.
16119
+
16120
+ **Required scope:** `write_orders` (for API-key authentication).
16121
+ parameters:
16122
+ - name: x-spree-api-key
16123
+ in: header
16124
+ required: true
16125
+ schema:
16126
+ type: string
16127
+ - name: Authorization
16128
+ in: header
16129
+ required: true
16130
+ schema:
16131
+ type: string
16132
+ - name: order_id
16133
+ in: path
16134
+ required: true
16135
+ description: Order prefixed ID
16136
+ schema:
16137
+ type: string
16138
+ - name: id
16139
+ in: path
16140
+ required: true
16141
+ description: Claim prefixed ID
16142
+ schema:
16143
+ type: string
16144
+ responses:
16145
+ '200':
16146
+ description: claim approved
16147
+ content:
16148
+ application/json:
16149
+ example:
16150
+ id: claim_UkLWZg9DAJ
16151
+ number: CLM1001
16152
+ status: approved
16153
+ resolution:
16154
+ order_id: or_UkLWZg9DAJ
16155
+ reason_id:
16156
+ refund_total: '10.00'
16157
+ approved_at: '2026-01-15T12:00:00Z'
16158
+ resolved_at:
16159
+ denied_at:
16160
+ canceled_at:
16161
+ memo: Arrived with a cracked screen
16162
+ metadata: {}
16163
+ created_at: '2026-01-15T12:00:00.000Z'
16164
+ updated_at: '2026-01-15T12:00:00.000Z'
16165
+ created_by_id: adm_UkLWZg9DAJ
16166
+ created_by_type: admin_user
16167
+ schema:
16168
+ "$ref": "#/components/schemas/Claim"
16002
16169
  "/api/v3/admin/orders/{order_id}/claims/{id}/resolve":
16003
16170
  patch:
16004
16171
  summary: Resolve a claim
@@ -16510,6 +16677,149 @@ paths:
16510
16677
  required:
16511
16678
  - data
16512
16679
  - meta
16680
+ "/api/v3/admin/digital_links/{id}":
16681
+ parameters:
16682
+ - name: id
16683
+ in: path
16684
+ required: true
16685
+ description: Digital link ID
16686
+ schema:
16687
+ type: string
16688
+ get:
16689
+ summary: Get a digital link
16690
+ tags:
16691
+ - Orders
16692
+ security:
16693
+ - api_key: []
16694
+ bearer_auth: []
16695
+ description: |-
16696
+ Returns a single download link with its download count and expiry.
16697
+
16698
+ **Required scope:** `read_orders` (for API-key authentication).
16699
+ x-codeSamples:
16700
+ - lang: javascript
16701
+ label: Spree Admin SDK
16702
+ source: |-
16703
+ import { createAdminClient } from '@spree/admin-sdk'
16704
+
16705
+ const client = createAdminClient({
16706
+ baseUrl: 'https://your-store.com',
16707
+ secretKey: 'sk_xxx',
16708
+ })
16709
+
16710
+ const digitalLink = await client.digitalLinks.retrieve('dl_xxx')
16711
+ - lang: bash
16712
+ label: Spree CLI
16713
+ source: spree api get /digital_links/{id}
16714
+ parameters:
16715
+ - name: x-spree-api-key
16716
+ in: header
16717
+ required: true
16718
+ schema:
16719
+ type: string
16720
+ - name: Authorization
16721
+ in: header
16722
+ required: true
16723
+ description: Bearer token for admin authentication
16724
+ schema:
16725
+ type: string
16726
+ responses:
16727
+ '200':
16728
+ description: digital link found
16729
+ content:
16730
+ application/json:
16731
+ example:
16732
+ id: dl_UkLWZg9DAJ
16733
+ access_counter: 0
16734
+ filename: thinking-cat.jpg
16735
+ content_type: image/jpeg
16736
+ download_url: "/api/v3/store/digital_links/ks9F16gjTLQPCzwFDpj2ifrJ"
16737
+ expires_at: '2026-01-22T12:00:00Z'
16738
+ authorizable: true
16739
+ expired: false
16740
+ access_limit_exceeded: false
16741
+ created_at: '2026-01-15T12:00:00.000Z'
16742
+ updated_at: '2026-01-15T12:00:00.000Z'
16743
+ schema:
16744
+ "$ref": "#/components/schemas/DigitalLink"
16745
+ '404':
16746
+ description: digital link not found
16747
+ content:
16748
+ application/json:
16749
+ example:
16750
+ error:
16751
+ code: record_not_found
16752
+ message: Digital link not found
16753
+ schema:
16754
+ "$ref": "#/components/schemas/ErrorResponse"
16755
+ "/api/v3/admin/digital_links/{id}/reset":
16756
+ parameters:
16757
+ - name: id
16758
+ in: path
16759
+ required: true
16760
+ description: Digital link ID
16761
+ schema:
16762
+ type: string
16763
+ patch:
16764
+ summary: Reset a digital link
16765
+ tags:
16766
+ - Orders
16767
+ x-codeSamples:
16768
+ - lang: javascript
16769
+ label: Spree Admin SDK
16770
+ source: |-
16771
+ import { createAdminClient } from '@spree/admin-sdk'
16772
+
16773
+ const client = createAdminClient({
16774
+ baseUrl: 'https://your-store.com',
16775
+ secretKey: 'sk_xxx',
16776
+ })
16777
+
16778
+ const digitalLink = await client.digitalLinks.reset('dl_xxx')
16779
+ - lang: bash
16780
+ label: Spree CLI
16781
+ source: spree api patch /digital_links/{id}/reset -d '{ ... }'
16782
+ security:
16783
+ - api_key: []
16784
+ bearer_auth: []
16785
+ description: |-
16786
+ Gives the customer their full download allowance back and restarts the
16787
+ link's expiry clock. Use it when a download failed, or the file was
16788
+ replaced after the customer had used up their attempts.
16789
+
16790
+
16791
+ **Required scope:** `write_orders` (for API-key authentication).
16792
+ parameters:
16793
+ - name: x-spree-api-key
16794
+ in: header
16795
+ required: true
16796
+ schema:
16797
+ type: string
16798
+ - name: Authorization
16799
+ in: header
16800
+ required: true
16801
+ description: Bearer token for admin authentication
16802
+ schema:
16803
+ type: string
16804
+ responses:
16805
+ '200':
16806
+ description: digital link reset
16807
+ content:
16808
+ application/json:
16809
+ example:
16810
+ id: dl_UkLWZg9DAJ
16811
+ access_counter: 0
16812
+ filename: thinking-cat.jpg
16813
+ content_type: image/jpeg
16814
+ download_url: "/api/v3/store/digital_links/tPqch4JvZidezkNn2YoqxDLc"
16815
+ expires_at: '2026-01-22T12:00:00Z'
16816
+ authorizable: true
16817
+ expired: false
16818
+ access_limit_exceeded: false
16819
+ created_at: '2026-01-15T12:00:00.000Z'
16820
+ updated_at: '2026-01-15T12:00:00.000Z'
16821
+ schema:
16822
+ "$ref": "#/components/schemas/DigitalLink"
16513
16823
  "/api/v3/admin/exchanges":
16514
16824
  get:
16515
16825
  summary: List exchanges
@@ -16999,6 +17309,92 @@ paths:
16999
17309
  schema:
17000
17310
  "$ref": "#/components/schemas/ExchangeUpdateParams"
17001
17311
  required: true
17312
+ "/api/v3/admin/orders/{order_id}/exchanges/{id}/approve":
17313
+ patch:
17314
+ summary: Approve an exchange
17315
+ tags:
17316
+ - Orders
17317
+ x-codeSamples:
17318
+ - lang: javascript
17319
+ label: Spree Admin SDK
17320
+ source: |-
17321
+ import { createAdminClient } from '@spree/admin-sdk'
17322
+
17323
+ const client = createAdminClient({
17324
+ baseUrl: 'https://your-store.com',
17325
+ secretKey: 'sk_xxx',
17326
+ })
17327
+
17328
+ const exchange = await client.orders.exchanges.approve('or_UkLWZg9DAJ', 'exch_UkLWZg9DAJ')
17329
+ - lang: bash
17330
+ label: Spree CLI
17331
+ source: spree api patch /orders/{order_id}/exchanges/{id}/approve -d '{ ...
17332
+ }'
17333
+ security:
17334
+ - api_key: []
17335
+ bearer_auth: []
17336
+ description: |-
17337
+ Accepts a requested exchange so the customer can send the goods back for their replacement. Only a requested exchange can be approved; receive it once the goods arrive.
17338
+
17339
+ **Required scope:** `write_orders` (for API-key authentication).
17340
+ parameters:
17341
+ - name: x-spree-api-key
17342
+ in: header
17343
+ required: true
17344
+ schema:
17345
+ type: string
17346
+ - name: Authorization
17347
+ in: header
17348
+ required: true
17349
+ schema:
17350
+ type: string
17351
+ - name: order_id
17352
+ in: path
17353
+ required: true
17354
+ description: Order prefixed ID
17355
+ schema:
17356
+ type: string
17357
+ - name: id
17358
+ in: path
17359
+ required: true
17360
+ description: Exchange prefixed ID
17361
+ schema:
17362
+ type: string
17363
+ responses:
17364
+ '200':
17365
+ description: exchange approved
17366
+ content:
17367
+ application/json:
17368
+ example:
17369
+ id: exch_UkLWZg9DAJ
17370
+ number: EX1001
17371
+ status: approved
17372
+ order_id: or_UkLWZg9DAJ
17373
+ reason_id:
17374
+ price_difference: '9.99'
17375
+ approved_at: '2026-01-15T12:00:00Z'
17376
+ received_at:
17377
+ fulfilled_at:
17378
+ canceled_at:
17379
+ memo: Wrong size
17380
+ metadata: {}
17381
+ created_at: '2026-01-15T12:00:00.000Z'
17382
+ updated_at: '2026-01-15T12:00:00.000Z'
17383
+ stock_location_id: sloc_UkLWZg9DAJ
17384
+ created_by_id: adm_UkLWZg9DAJ
17385
+ created_by_type: admin_user
17386
+ schema:
17387
+ "$ref": "#/components/schemas/Exchange"
17388
+ '422':
17389
+ description: the exchange is not requested
17390
+ content:
17391
+ application/json:
17392
+ example:
17393
+ error:
17394
+ code: processing_error
17395
+ message: Not requested
17396
+ schema:
17397
+ "$ref": "#/components/schemas/ErrorResponse"
17002
17398
  "/api/v3/admin/orders/{order_id}/exchanges/{id}/receive":
17003
17399
  patch:
17004
17400
  summary: Receive an exchange
@@ -20613,6 +21009,147 @@ paths:
20613
21009
  cancel_reason_name:
20614
21010
  customer_id: cust_UkLWZg9DAJ
20615
21011
  freight_summary:
21012
+ "/api/v3/admin/orders/{id}/resend_digital_links":
21013
+ post:
21014
+ summary: Resend digital download links
21015
+ tags:
21016
+ - Orders
21017
+ x-codeSamples:
21018
+ - lang: javascript
21019
+ label: Spree Admin SDK
21020
+ source: |-
21021
+ import { createAdminClient } from '@spree/admin-sdk'
21022
+
21023
+ const client = createAdminClient({
21024
+ baseUrl: 'https://your-store.com',
21025
+ secretKey: 'sk_xxx',
21026
+ })
21027
+
21028
+ await client.orders.resendDigitalLinks('or_UkLWZg9DAJ')
21029
+ - lang: bash
21030
+ label: Spree CLI
21031
+ source: spree api post /orders/{id}/resend_digital_links -d '{ ... }'
21032
+ security:
21033
+ - api_key: []
21034
+ bearer_auth: []
21035
+ description: |-
21036
+ Emails the customer their download links for the digital products on
21037
+ this order again. Nothing is sent when the order has no digital links or
21038
+ the store does not send transactional emails. Use it when the original
21039
+ email was lost; to restore used-up downloads or an expired link, reset
21040
+ the digital link instead.
21041
+
21042
+
21043
+ **Required scope:** `write_orders` (for API-key authentication).
21044
+ parameters:
21045
+ - name: x-spree-api-key
21046
+ in: header
21047
+ required: true
21048
+ schema:
21049
+ type: string
21050
+ - name: Authorization
21051
+ in: header
21052
+ required: true
21053
+ description: Bearer token for admin authentication
21054
+ schema:
21055
+ type: string
21056
+ - name: id
21057
+ in: path
21058
+ required: true
21059
+ description: Order ID
21060
+ schema:
21061
+ type: string
21062
+ responses:
21063
+ '200':
21064
+ description: digital links resent
21065
+ content:
21066
+ application/json:
21067
+ example:
21068
+ id: or_UkLWZg9DAJ
21069
+ market_id: mkt_UkLWZg9DAJ
21070
+ withdrawal_period_ends_at:
21071
+ within_withdrawal_period: true
21072
+ shipping_eq_billing_address: false
21073
+ cart_id:
21074
+ channel_id: ch_UkLWZg9DAJ
21075
+ company_id:
21076
+ company_name:
21077
+ po_document_filename:
21078
+ po_document_byte_size:
21079
+ number: R1001
21080
+ email: ivana@schmidtfeest.com
21081
+ customer_note:
21082
+ po_number:
21083
+ currency: USD
21084
+ locale: en
21085
+ total_quantity: 1
21086
+ coupon_code:
21087
+ fulfillment_status:
21088
+ payment_status:
21089
+ completed_at: '2026-01-15T12:00:00.000Z'
21090
+ item_total: '10.00'
21091
+ discount_total: '0.00'
21092
+ tax_total: '0.00'
21093
+ included_tax_total: '0.00'
21094
+ additional_tax_total: '0.00'
21095
+ delivery_total: '100.00'
21096
+ fee_total: '0.00'
21097
+ gift_card_total: '0.00'
21098
+ store_credit_total: '0.00'
21099
+ total: '110.00'
21100
+ amount_due: '110.00'
21101
+ covered_by_store_credit: false
21102
+ adjustment_total: '0.00'
21103
+ gift_card:
21104
+ market:
21105
+ id: mkt_UkLWZg9DAJ
21106
+ name: United States
21107
+ currency: USD
21108
+ default_locale: en
21109
+ tax_inclusive: false
21110
+ default: true
21111
+ country_codes:
21112
+ - US
21113
+ supported_locales:
21114
+ - en
21115
+ created_at: '2026-11-03T16:44:09.130Z'
21116
+ updated_at: '2026-11-03T16:44:09.130Z'
21117
+ tax_provider:
21118
+ external_references: {}
21119
+ status: placed
21120
+ last_ip_address:
21121
+ considered_risky: false
21122
+ confirmation_delivered: false
21123
+ store_owner_notification_delivered:
21124
+ metadata: {}
21125
+ cancel_note:
21126
+ canceled_at:
21127
+ approved_at:
21128
+ created_at: '2026-01-15T12:00:00.000Z'
21129
+ updated_at: '2026-01-15T12:00:00.000Z'
21130
+ payment_total: '0.00'
21131
+ commission_amount_total: '0.00'
21132
+ commission_tax_total: '0.00'
21133
+ commission_total: '0.00'
21134
+ preferred_stock_location_id:
21135
+ po_document_url:
21136
+ seller_id:
21137
+ order_group_id:
21138
+ tags: []
21139
+ internal_note:
21140
+ internal_note_html:
21141
+ approver_id:
21142
+ approver_type:
21143
+ canceler_id:
21144
+ canceler_type:
21145
+ created_by_id:
21146
+ created_by_type:
21147
+ cancel_reason_id:
21148
+ cancel_reason_name:
21149
+ customer_id: cust_UkLWZg9DAJ
21150
+ freight_summary:
21151
+ schema:
21152
+ "$ref": "#/components/schemas/Order"
20616
21153
  "/api/v3/admin/returns":
20617
21154
  get:
20618
21155
  summary: List returns
@@ -21138,18 +21675,11 @@ paths:
21138
21675
  schema:
21139
21676
  "$ref": "#/components/schemas/ReturnUpdateParams"
21140
21677
  required: true
21141
- "/api/v3/admin/orders/{order_id}/returns/{id}/receive":
21678
+ "/api/v3/admin/orders/{order_id}/returns/{id}/approve":
21142
21679
  patch:
21143
- summary: Receive a return
21680
+ summary: Approve a return
21144
21681
  tags:
21145
21682
  - Orders
21146
- security:
21147
- - api_key: []
21148
- bearer_auth: []
21149
- description: |-
21150
- Records what arrived on an approved return. Omit `items` to receive everything as requested and resellable; send rows for a partial or damaged receipt.
21151
-
21152
- **Required scope:** `write_orders` (for API-key authentication).
21153
21683
  x-codeSamples:
21154
21684
  - lang: javascript
21155
21685
  label: Spree Admin SDK
@@ -21161,13 +21691,18 @@ paths:
21161
21691
  secretKey: 'sk_xxx',
21162
21692
  })
21163
21693
 
21164
- // Omit `items` to receive everything as requested and resellable.
21165
- const orderReturn = await client.orders.returns.receive('or_UkLWZg9DAJ', 'ret_UkLWZg9DAJ', {
21166
- items: [{ return_line_item_id: 'rli_UkLWZg9DAJ', quantity: 1, resellable: false }],
21167
- })
21694
+ const orderReturn = await client.orders.returns.approve('or_UkLWZg9DAJ', 'ret_UkLWZg9DAJ')
21168
21695
  - lang: bash
21169
21696
  label: Spree CLI
21170
- source: spree api patch /orders/{order_id}/returns/{id}/receive -d '{"items":[{"return_line_item_id":"rli_UkLWZg9DAJ","quantity":1,"resellable":false}]}'
21697
+ source: spree api patch /orders/{order_id}/returns/{id}/approve -d '{ ...
21698
+ }'
21699
+ security:
21700
+ - api_key: []
21701
+ bearer_auth: []
21702
+ description: |-
21703
+ Accepts a requested return so the customer can send the goods back. Only a requested return can be approved; receive it once the goods arrive.
21704
+
21705
+ **Required scope:** `write_orders` (for API-key authentication).
21171
21706
  parameters:
21172
21707
  - name: x-spree-api-key
21173
21708
  in: header
@@ -21193,19 +21728,19 @@ paths:
21193
21728
  type: string
21194
21729
  responses:
21195
21730
  '200':
21196
- description: return received
21731
+ description: return approved
21197
21732
  content:
21198
21733
  application/json:
21199
21734
  example:
21200
21735
  id: ret_UkLWZg9DAJ
21201
21736
  number: RET1001
21202
- status: received
21737
+ status: approved
21203
21738
  order_id: or_UkLWZg9DAJ
21204
21739
  reason_id:
21205
21740
  refund_total: '10.00'
21206
21741
  refund_tax_total: '0.00'
21207
21742
  approved_at: '2026-01-15T12:00:00Z'
21208
- received_at: '2026-01-15T12:00:00Z'
21743
+ received_at:
21209
21744
  refunded_at:
21210
21745
  canceled_at:
21211
21746
  external_references: {}
@@ -21214,8 +21749,8 @@ paths:
21214
21749
  created_at: '2026-01-15T12:00:00.000Z'
21215
21750
  updated_at: '2026-01-15T12:00:00.000Z'
21216
21751
  stock_location_id: sloc_UkLWZg9DAJ
21217
- created_by_id:
21218
- created_by_type:
21752
+ created_by_id: adm_UkLWZg9DAJ
21753
+ created_by_type: admin_user
21219
21754
  refunded_total: '0.00'
21220
21755
  refundable_total: '10.00'
21221
21756
  documents: []
@@ -21223,23 +21758,28 @@ paths:
21223
21758
  deliveries: []
21224
21759
  schema:
21225
21760
  "$ref": "#/components/schemas/Return"
21226
- requestBody:
21227
- content:
21228
- application/json:
21229
- schema:
21230
- "$ref": "#/components/schemas/ReturnReceiveParams"
21231
- "/api/v3/admin/orders/{order_id}/returns/{id}/refund":
21761
+ '422':
21762
+ description: the return is not requested
21763
+ content:
21764
+ application/json:
21765
+ example:
21766
+ error:
21767
+ code: processing_error
21768
+ message: Not requested
21769
+ schema:
21770
+ "$ref": "#/components/schemas/ErrorResponse"
21771
+ "/api/v3/admin/orders/{order_id}/returns/{id}/receive":
21232
21772
  patch:
21233
- summary: Refund a return
21773
+ summary: Receive a return
21234
21774
  tags:
21235
21775
  - Orders
21236
21776
  security:
21237
21777
  - api_key: []
21238
21778
  bearer_auth: []
21239
21779
  description: |-
21240
- Pays the customer back for a received return, to store credit or through the original payment.
21780
+ Records what arrived on an approved return. Omit `items` to receive everything as requested and resellable; send rows for a partial or damaged receipt.
21241
21781
 
21242
- **Required scope:** `write_orders` and `write_refunds` (for API-key authentication).
21782
+ **Required scope:** `write_orders` (for API-key authentication).
21243
21783
  x-codeSamples:
21244
21784
  - lang: javascript
21245
21785
  label: Spree Admin SDK
@@ -21251,13 +21791,103 @@ paths:
21251
21791
  secretKey: 'sk_xxx',
21252
21792
  })
21253
21793
 
21254
- const orderReturn = await client.orders.returns.refund('or_UkLWZg9DAJ', 'ret_UkLWZg9DAJ', {
21255
- amount: '29.99',
21256
- refund_method: 'original_payment',
21794
+ // Omit `items` to receive everything as requested and resellable.
21795
+ const orderReturn = await client.orders.returns.receive('or_UkLWZg9DAJ', 'ret_UkLWZg9DAJ', {
21796
+ items: [{ return_line_item_id: 'rli_UkLWZg9DAJ', quantity: 1, resellable: false }],
21257
21797
  })
21258
21798
  - lang: bash
21259
21799
  label: Spree CLI
21260
- source: spree api patch /orders/{order_id}/returns/{id}/refund -d '{"amount":"29.99","refund_method":"original_payment"}'
21800
+ source: spree api patch /orders/{order_id}/returns/{id}/receive -d '{"items":[{"return_line_item_id":"rli_UkLWZg9DAJ","quantity":1,"resellable":false}]}'
21801
+ parameters:
21802
+ - name: x-spree-api-key
21803
+ in: header
21804
+ required: true
21805
+ schema:
21806
+ type: string
21807
+ - name: Authorization
21808
+ in: header
21809
+ required: true
21810
+ schema:
21811
+ type: string
21812
+ - name: order_id
21813
+ in: path
21814
+ required: true
21815
+ description: Order prefixed ID
21816
+ schema:
21817
+ type: string
21818
+ - name: id
21819
+ in: path
21820
+ required: true
21821
+ description: Return prefixed ID
21822
+ schema:
21823
+ type: string
21824
+ responses:
21825
+ '200':
21826
+ description: return received
21827
+ content:
21828
+ application/json:
21829
+ example:
21830
+ id: ret_UkLWZg9DAJ
21831
+ number: RET1001
21832
+ status: received
21833
+ order_id: or_UkLWZg9DAJ
21834
+ reason_id:
21835
+ refund_total: '10.00'
21836
+ refund_tax_total: '0.00'
21837
+ approved_at: '2026-01-15T12:00:00Z'
21838
+ received_at: '2026-01-15T12:00:00Z'
21839
+ refunded_at:
21840
+ canceled_at:
21841
+ external_references: {}
21842
+ memo: Item did not fit
21843
+ metadata: {}
21844
+ created_at: '2026-01-15T12:00:00.000Z'
21845
+ updated_at: '2026-01-15T12:00:00.000Z'
21846
+ stock_location_id: sloc_UkLWZg9DAJ
21847
+ created_by_id:
21848
+ created_by_type:
21849
+ refunded_total: '0.00'
21850
+ refundable_total: '10.00'
21851
+ documents: []
21852
+ labels: []
21853
+ deliveries: []
21854
+ schema:
21855
+ "$ref": "#/components/schemas/Return"
21856
+ requestBody:
21857
+ content:
21858
+ application/json:
21859
+ schema:
21860
+ "$ref": "#/components/schemas/ReturnReceiveParams"
21861
+ "/api/v3/admin/orders/{order_id}/returns/{id}/refund":
21862
+ patch:
21863
+ summary: Refund a return
21864
+ tags:
21865
+ - Orders
21866
+ security:
21867
+ - api_key: []
21868
+ bearer_auth: []
21869
+ description: |-
21870
+ Pays the customer back for a received return, to store credit or through the original payment.
21871
+
21872
+ **Required scope:** `write_orders` and `write_refunds` (for API-key authentication).
21873
+ x-codeSamples:
21874
+ - lang: javascript
21875
+ label: Spree Admin SDK
21876
+ source: |-
21877
+ import { createAdminClient } from '@spree/admin-sdk'
21878
+
21879
+ const client = createAdminClient({
21880
+ baseUrl: 'https://your-store.com',
21881
+ secretKey: 'sk_xxx',
21882
+ })
21883
+
21884
+ const orderReturn = await client.orders.returns.refund('or_UkLWZg9DAJ', 'ret_UkLWZg9DAJ', {
21885
+ amount: '29.99',
21886
+ refund_method: 'original_payment',
21887
+ })
21888
+ - lang: bash
21889
+ label: Spree CLI
21890
+ source: spree api patch /orders/{order_id}/returns/{id}/refund -d '{"amount":"29.99","refund_method":"original_payment"}'
21261
21891
  parameters:
21262
21892
  - name: x-spree-api-key
21263
21893
  in: header
@@ -21558,6 +22188,107 @@ paths:
21558
22188
  required:
21559
22189
  - data
21560
22190
  - meta
22191
+ "/api/v3/admin/orders/{order_id}/returns/{return_id}/labels/{id}/refund":
22192
+ patch:
22193
+ summary: Refund a return label
22194
+ tags:
22195
+ - Orders
22196
+ x-codeSamples:
22197
+ - lang: javascript
22198
+ label: Spree Admin SDK
22199
+ source: |-
22200
+ import { createAdminClient } from '@spree/admin-sdk'
22201
+
22202
+ const client = createAdminClient({
22203
+ baseUrl: 'https://your-store.com',
22204
+ secretKey: 'sk_xxx',
22205
+ })
22206
+
22207
+ const label = await client.orders.returns.labels.refund(
22208
+ 'or_UkLWZg9DAJ',
22209
+ 'ret_UkLWZg9DAJ',
22210
+ 'lbl_UkLWZg9DAJ',
22211
+ )
22212
+ - lang: bash
22213
+ label: Spree CLI
22214
+ source: spree api patch /orders/{order_id}/returns/{return_id}/labels/{id}/refund
22215
+ -d '{ ... }'
22216
+ operationId: return_labels_refund
22217
+ security:
22218
+ - api_key: []
22219
+ bearer_auth: []
22220
+ description: |-
22221
+ Asks the carrier to refund a purchased return label the customer never used, such as when the return is canceled. An uploaded label has nothing to refund.
22222
+
22223
+ **Required scope:** `write_orders` (for API-key authentication).
22224
+ parameters:
22225
+ - name: x-spree-api-key
22226
+ in: header
22227
+ required: true
22228
+ schema:
22229
+ type: string
22230
+ - name: Authorization
22231
+ in: header
22232
+ required: true
22233
+ schema:
22234
+ type: string
22235
+ - name: order_id
22236
+ in: path
22237
+ required: true
22238
+ description: Order prefixed ID
22239
+ schema:
22240
+ type: string
22241
+ - name: return_id
22242
+ in: path
22243
+ required: true
22244
+ description: Return prefixed ID
22245
+ schema:
22246
+ type: string
22247
+ - name: id
22248
+ in: path
22249
+ required: true
22250
+ description: Shipping label prefixed ID
22251
+ schema:
22252
+ type: string
22253
+ responses:
22254
+ '200':
22255
+ description: refund filed
22256
+ content:
22257
+ application/json:
22258
+ example:
22259
+ id: lbl_UkLWZg9DAJ
22260
+ source: purchased
22261
+ status: refunded
22262
+ carrier: ups
22263
+ carrier_name: UPS
22264
+ service: Ground
22265
+ tracking_number: 1Z879E930346830007
22266
+ currency: USD
22267
+ format: pdf
22268
+ external_id: shp_4
22269
+ metadata: {}
22270
+ refunded_at: '2026-01-15T12:00:00.000Z'
22271
+ created_at: '2026-01-15T12:00:00.000Z'
22272
+ updated_at: '2026-01-15T12:00:00.000Z'
22273
+ owner_id: ret_UkLWZg9DAJ
22274
+ owner_type: return
22275
+ cost: '7.25'
22276
+ integration_id:
22277
+ file_pending: false
22278
+ download_url:
22279
+ schema:
22280
+ "$ref": "#/components/schemas/ShippingLabel"
22281
+ '422':
22282
+ description: uploaded labels cannot be refunded
22283
+ content:
22284
+ application/json:
22285
+ example:
22286
+ error:
22287
+ code: processing_error
22288
+ message: An uploaded label was not bought through Spree and cannot
22289
+ be refunded — delete it instead
22290
+ schema:
22291
+ "$ref": "#/components/schemas/ErrorResponse"
21561
22292
  "/api/v3/admin/payment_methods/{payment_method_id}/custom_fields":
21562
22293
  get:
21563
22294
  summary: List payment method custom fields
@@ -22319,6 +23050,8 @@ paths:
22319
23050
  updated_at: '2026-01-15T12:00:00.000Z'
22320
23051
  avs_risky: false
22321
23052
  cvv_risky: false
23053
+ can_void: true
23054
+ can_capture: false
22322
23055
  captured_amount: '0.00'
22323
23056
  order_id: or_UkLWZg9DAJ
22324
23057
  meta:
@@ -22403,6 +23136,8 @@ paths:
22403
23136
  updated_at: '2026-01-15T12:00:00.000Z'
22404
23137
  avs_risky: false
22405
23138
  cvv_risky: false
23139
+ can_void: true
23140
+ can_capture: true
22406
23141
  captured_amount: '0.00'
22407
23142
  order_id: or_gbHJdmfrXB
22408
23143
  requestBody:
@@ -22513,6 +23248,8 @@ paths:
22513
23248
  updated_at: '2026-01-15T12:00:00.000Z'
22514
23249
  avs_risky: false
22515
23250
  cvv_risky: false
23251
+ can_void: true
23252
+ can_capture: false
22516
23253
  captured_amount: '0.00'
22517
23254
  order_id: or_UkLWZg9DAJ
22518
23255
  "/api/v3/admin/orders/{order_id}/payments/{id}/capture":
@@ -22604,6 +23341,8 @@ paths:
22604
23341
  updated_at: '2026-01-15T12:00:00.000Z'
22605
23342
  avs_risky: false
22606
23343
  cvv_risky: false
23344
+ can_void: true
23345
+ can_capture: false
22607
23346
  captured_amount: '110.00'
22608
23347
  order_id: or_UkLWZg9DAJ
22609
23348
  '422':
@@ -22709,6 +23448,8 @@ paths:
22709
23448
  updated_at: '2026-01-15T12:00:00.000Z'
22710
23449
  avs_risky: false
22711
23450
  cvv_risky: false
23451
+ can_void: false
23452
+ can_capture: false
22712
23453
  captured_amount: '0.00'
22713
23454
  order_id: or_UkLWZg9DAJ
22714
23455
  "/api/v3/admin/price_lists":
@@ -23855,6 +24596,9 @@ paths:
23855
24596
  required: true
23856
24597
  "/api/v3/admin/prices/bulk_destroy":
23857
24598
  delete:
24599
+ x-spree-agent: false
24600
+ x-spree-agent-reason: Deletes many prices in one call behind a single confirmation;
24601
+ delete_resource removes them one at a time.
23858
24602
  summary: Bulk-delete prices
23859
24603
  tags:
23860
24604
  - Pricing
@@ -24993,6 +25737,7 @@ paths:
24993
25737
  seller_name:
24994
25738
  product_type_id:
24995
25739
  tax_category_id: taxcat_UkLWZg9DAJ
25740
+ total_on_hand: 0
24996
25741
  meta:
24997
25742
  page: 1
24998
25743
  limit: 25
@@ -25136,6 +25881,7 @@ paths:
25136
25881
  seller_name:
25137
25882
  product_type_id:
25138
25883
  tax_category_id:
25884
+ total_on_hand: 0
25139
25885
  schema:
25140
25886
  "$ref": "#/components/schemas/Product"
25141
25887
  '422':
@@ -25270,6 +26016,7 @@ paths:
25270
26016
  seller_name:
25271
26017
  product_type_id:
25272
26018
  tax_category_id: taxcat_UkLWZg9DAJ
26019
+ total_on_hand: 0
25273
26020
  schema:
25274
26021
  "$ref": "#/components/schemas/Product"
25275
26022
  '404':
@@ -25390,6 +26137,7 @@ paths:
25390
26137
  seller_name:
25391
26138
  product_type_id:
25392
26139
  tax_category_id: taxcat_UkLWZg9DAJ
26140
+ total_on_hand: 0
25393
26141
  schema:
25394
26142
  "$ref": "#/components/schemas/Product"
25395
26143
  '422':
@@ -25475,8 +26223,126 @@ paths:
25475
26223
  specific: false
25476
26224
  schema:
25477
26225
  "$ref": "#/components/schemas/ErrorResponse"
26226
+ "/api/v3/admin/products/{id}/clone":
26227
+ parameters:
26228
+ - name: id
26229
+ in: path
26230
+ required: true
26231
+ description: Product ID
26232
+ schema:
26233
+ type: string
26234
+ post:
26235
+ summary: Clone a product
26236
+ tags:
26237
+ - Products
26238
+ x-codeSamples:
26239
+ - lang: javascript
26240
+ label: Spree Admin SDK
26241
+ source: |-
26242
+ import { createAdminClient } from '@spree/admin-sdk'
26243
+
26244
+ const client = createAdminClient({
26245
+ baseUrl: 'https://your-store.com',
26246
+ secretKey: 'sk_xxx',
26247
+ })
26248
+
26249
+ const copy = await client.products.clone('prod_UkLWZg9DAJ')
26250
+ - lang: bash
26251
+ label: Spree CLI
26252
+ source: spree api post /products/{id}/clone -d '{ ... }'
26253
+ security:
26254
+ - api_key: []
26255
+ bearer_auth: []
26256
+ description: |-
26257
+ Creates a draft copy of a product, named "COPY OF …", with its variants,
26258
+ prices, stock locations, images, categories, channels and tags; stock on
26259
+ hand starts at zero. Use it to start a similar product from an existing
26260
+ one instead of building it from scratch.
26261
+
26262
+
26263
+ **Required scope:** `write_products` (for API-key authentication).
26264
+ parameters:
26265
+ - name: x-spree-api-key
26266
+ in: header
26267
+ required: true
26268
+ schema:
26269
+ type: string
26270
+ - name: Authorization
26271
+ in: header
26272
+ required: true
26273
+ schema:
26274
+ type: string
26275
+ responses:
26276
+ '201':
26277
+ description: product cloned
26278
+ content:
26279
+ application/json:
26280
+ example:
26281
+ id: prod_gbHJdmfrXB
26282
+ name: COPY OF Product 1462357
26283
+ slug: copy-of-product-1462357
26284
+ meta_title:
26285
+ meta_description:
26286
+ meta_keywords:
26287
+ variant_count: 1
26288
+ available_on:
26289
+ preorder_ships_at:
26290
+ purchasable: true
26291
+ preorder: false
26292
+ in_stock: false
26293
+ backorderable: true
26294
+ available: false
26295
+ description: Dolore facere hic laboriosam sapiente nobis. Doloribus
26296
+ deleniti quasi esse aliquid voluptatem. Rem voluptate omnis suscipit
26297
+ adipisci laudantium. Deleniti error dolorum ratione dolor assumenda
26298
+ iusto. Laborum non rem sapiente temporibus quam inventore. Voluptatum
26299
+ magnam hic molestias laudantium necessitatibus. Totam ducimus provident
26300
+ aliquam repellendus nam maxime error natus. Ex aspernatur nostrum
26301
+ deserunt maxime quis occaecati expedita dolore. Debitis est laboriosam
26302
+ modi aspernatur cumque. Sapiente ab corrupti quos doloremque eius.
26303
+ Laborum officiis culpa voluptate fuga sed. Nemo possimus vel architecto
26304
+ quo modi. Velit aut non iusto exercitationem nostrum nemo. Velit
26305
+ illo nisi quaerat perspiciatis facilis temporibus quae esse.
26306
+ description_html: |-
26307
+ Dolore facere hic laboriosam sapiente nobis. Doloribus deleniti quasi esse aliquid voluptatem. Rem voluptate omnis suscipit adipisci laudantium.
26308
+ Deleniti error dolorum ratione dolor assumenda iusto. Laborum non rem sapiente temporibus quam inventore. Voluptatum magnam hic molestias laudantium necessitatibus. Totam ducimus provident aliquam repellendus nam maxime error natus.
26309
+ Ex aspernatur nostrum deserunt maxime quis occaecati expedita dolore. Debitis est laboriosam modi aspernatur cumque. Sapiente ab corrupti quos doloremque eius.
26310
+ Laborum officiis culpa voluptate fuga sed. Nemo possimus vel architecto quo modi. Velit aut non iusto exercitationem nostrum nemo. Velit illo nisi quaerat perspiciatis facilis temporibus quae esse.
26311
+ default_variant_id: variant_gbHJdmfrXB
26312
+ buy_box_variant_id: variant_gbHJdmfrXB
26313
+ thumbnail_url:
26314
+ tags: []
26315
+ price:
26316
+ id: price_gbHJdmfrXB
26317
+ currency: USD
26318
+ amount: '19.99'
26319
+ compare_at_amount:
26320
+ price_list_id:
26321
+ min_quantity: 1
26322
+ variant_id: variant_gbHJdmfrXB
26323
+ created_at: '2026-01-15T12:00:00.000Z'
26324
+ updated_at: '2026-01-15T12:00:00.000Z'
26325
+ original_price:
26326
+ seller_id:
26327
+ external_references: {}
26328
+ status: draft
26329
+ metadata: {}
26330
+ deleted_at:
26331
+ created_at: '2026-01-15T12:00:00.000Z'
26332
+ updated_at: '2026-01-15T12:00:00.000Z'
26333
+ delivery_profile_id: fp_UkLWZg9DAJ
26334
+ seller_name:
26335
+ product_type_id:
26336
+ tax_category_id: taxcat_UkLWZg9DAJ
26337
+ total_on_hand: 0
26338
+ schema:
26339
+ "$ref": "#/components/schemas/Product"
25478
26340
  "/api/v3/admin/products/bulk_status_update":
25479
26341
  post:
26342
+ x-spree-agent: false
26343
+ x-spree-agent-reason: Writes the status column for many products at once, skipping
26344
+ the status workflows and their events; products_activate, products_archive and
26345
+ products_draft run them.
25480
26346
  summary: Bulk-update product status
25481
26347
  tags:
25482
26348
  - Products
@@ -26036,6 +26902,9 @@ paths:
26036
26902
  required: true
26037
26903
  "/api/v3/admin/products/bulk_destroy":
26038
26904
  delete:
26905
+ x-spree-agent: false
26906
+ x-spree-agent-reason: Deletes many products in one call behind a single confirmation;
26907
+ delete_resource removes them one at a time.
26039
26908
  summary: Bulk-delete products
26040
26909
  tags:
26041
26910
  - Products
@@ -26126,7 +26995,6 @@ paths:
26126
26995
  Puts a product a seller submitted for review on sale, and closes the
26127
26996
  submission. Only a product awaiting review can be approved.
26128
26997
 
26129
-
26130
26998
  **Required scope:** `write_products` (for API-key authentication).
26131
26999
  parameters:
26132
27000
  - name: x-spree-api-key
@@ -26198,6 +27066,7 @@ paths:
26198
27066
  seller_name:
26199
27067
  product_type_id:
26200
27068
  tax_category_id: taxcat_UkLWZg9DAJ
27069
+ total_on_hand: 0
26201
27070
  schema:
26202
27071
  "$ref": "#/components/schemas/Product"
26203
27072
  '422':
@@ -26325,6 +27194,7 @@ paths:
26325
27194
  seller_name:
26326
27195
  product_type_id:
26327
27196
  tax_category_id: taxcat_UkLWZg9DAJ
27197
+ total_on_hand: 0
26328
27198
  schema:
26329
27199
  "$ref": "#/components/schemas/Product"
26330
27200
  requestBody:
@@ -26333,6 +27203,383 @@ paths:
26333
27203
  schema:
26334
27204
  "$ref": "#/components/schemas/ProductRejectParams"
26335
27205
  required: true
27206
+ "/api/v3/admin/products/{id}/activate":
27207
+ parameters:
27208
+ - name: id
27209
+ in: path
27210
+ required: true
27211
+ description: Product ID
27212
+ schema:
27213
+ type: string
27214
+ patch:
27215
+ summary: Activate a product
27216
+ tags:
27217
+ - Products
27218
+ x-codeSamples:
27219
+ - lang: javascript
27220
+ label: Spree Admin SDK
27221
+ source: |-
27222
+ import { createAdminClient } from '@spree/admin-sdk'
27223
+
27224
+ const client = createAdminClient({
27225
+ baseUrl: 'https://your-store.com',
27226
+ secretKey: 'sk_xxx',
27227
+ })
27228
+
27229
+ const product = await client.products.activate('prod_UkLWZg9DAJ')
27230
+ - lang: bash
27231
+ label: Spree CLI
27232
+ source: spree api patch /products/{id}/activate -d '{ ... }'
27233
+ security:
27234
+ - api_key: []
27235
+ bearer_auth: []
27236
+ description: |-
27237
+ Puts one product on sale. Runs the activation workflow, so its hooks and the `product.activated` event fire, which `bulk_status_update` does not. A product awaiting review is refused: approve or reject it instead.
27238
+
27239
+
27240
+ **Required scope:** `write_products` (for API-key authentication).
27241
+ parameters:
27242
+ - name: x-spree-api-key
27243
+ in: header
27244
+ required: true
27245
+ schema:
27246
+ type: string
27247
+ - name: Authorization
27248
+ in: header
27249
+ required: true
27250
+ schema:
27251
+ type: string
27252
+ responses:
27253
+ '200':
27254
+ description: product active
27255
+ content:
27256
+ application/json:
27257
+ example:
27258
+ id: prod_gbHJdmfrXB
27259
+ name: Product 1604119
27260
+ slug: product-1604119
27261
+ meta_title:
27262
+ meta_description:
27263
+ meta_keywords:
27264
+ variant_count: 1
27265
+ available_on:
27266
+ preorder_ships_at:
27267
+ purchasable: true
27268
+ preorder: false
27269
+ in_stock: false
27270
+ backorderable: true
27271
+ available: true
27272
+ description: Tempora doloribus sit consectetur cumque omnis. Quod
27273
+ fugit dicta ullam omnis. Hic dolorem asperiores nemo est sed nihil
27274
+ quia deleniti. Saepe aperiam eos nulla quia porro minima officiis
27275
+ cum. Eius dignissimos laudantium sequi incidunt. Sed nihil voluptate
27276
+ aliquid nisi. Veritatis tenetur quos aspernatur modi perspiciatis
27277
+ quaerat. Voluptas harum neque labore fuga reprehenderit unde quasi.
27278
+ Omnis quam autem in ipsam aspernatur architecto alias recusandae.
27279
+ Repudiandae ratione vel expedita corporis et pariatur rem sapiente.
27280
+ Velit laboriosam nulla quibusdam fugit minus itaque ut repellat.
27281
+ Incidunt est fugiat totam ipsa quod deserunt. Natus sequi numquam
27282
+ laudantium non similique saepe ipsam quos. Ad impedit necessitatibus
27283
+ quo nesciunt blanditiis id similique recusandae. Ut occaecati debitis
27284
+ aliquam accusantium sed distinctio neque. Labore quos quam optio
27285
+ aperiam dolores aspernatur vitae odio. Eius nam adipisci corrupti
27286
+ incidunt quod sapiente tempora dicta.
27287
+ description_html: |-
27288
+ Tempora doloribus sit consectetur cumque omnis. Quod fugit dicta ullam omnis. Hic dolorem asperiores nemo est sed nihil quia deleniti.
27289
+ Saepe aperiam eos nulla quia porro minima officiis cum. Eius dignissimos laudantium sequi incidunt. Sed nihil voluptate aliquid nisi.
27290
+ Veritatis tenetur quos aspernatur modi perspiciatis quaerat. Voluptas harum neque labore fuga reprehenderit unde quasi. Omnis quam autem in ipsam aspernatur architecto alias recusandae. Repudiandae ratione vel expedita corporis et pariatur rem sapiente.
27291
+ Velit laboriosam nulla quibusdam fugit minus itaque ut repellat. Incidunt est fugiat totam ipsa quod deserunt. Natus sequi numquam laudantium non similique saepe ipsam quos. Ad impedit necessitatibus quo nesciunt blanditiis id similique recusandae.
27292
+ Ut occaecati debitis aliquam accusantium sed distinctio neque. Labore quos quam optio aperiam dolores aspernatur vitae odio. Eius nam adipisci corrupti incidunt quod sapiente tempora dicta.
27293
+ default_variant_id: variant_gbHJdmfrXB
27294
+ buy_box_variant_id: variant_gbHJdmfrXB
27295
+ thumbnail_url:
27296
+ tags: []
27297
+ price:
27298
+ id: price_gbHJdmfrXB
27299
+ currency: USD
27300
+ amount: '19.99'
27301
+ compare_at_amount:
27302
+ price_list_id:
27303
+ min_quantity: 1
27304
+ variant_id: variant_gbHJdmfrXB
27305
+ created_at: '2026-01-15T12:00:00.000Z'
27306
+ updated_at: '2026-01-15T12:00:00.000Z'
27307
+ original_price:
27308
+ seller_id:
27309
+ external_references: {}
27310
+ status: active
27311
+ metadata: {}
27312
+ deleted_at:
27313
+ created_at: '2026-01-15T12:00:00.000Z'
27314
+ updated_at: '2026-01-15T12:00:00.000Z'
27315
+ delivery_profile_id: fp_UkLWZg9DAJ
27316
+ seller_name:
27317
+ product_type_id:
27318
+ tax_category_id: taxcat_UkLWZg9DAJ
27319
+ total_on_hand: 0
27320
+ schema:
27321
+ "$ref": "#/components/schemas/Product"
27322
+ '422':
27323
+ description: the product is awaiting review
27324
+ content:
27325
+ application/json:
27326
+ example:
27327
+ error:
27328
+ code: product_in_review
27329
+ message: A product awaiting review is approved or rejected, not
27330
+ moved to another status
27331
+ schema:
27332
+ "$ref": "#/components/schemas/ErrorResponse"
27333
+ "/api/v3/admin/products/{id}/archive":
27334
+ parameters:
27335
+ - name: id
27336
+ in: path
27337
+ required: true
27338
+ description: Product ID
27339
+ schema:
27340
+ type: string
27341
+ patch:
27342
+ summary: Archive a product
27343
+ tags:
27344
+ - Products
27345
+ x-codeSamples:
27346
+ - lang: javascript
27347
+ label: Spree Admin SDK
27348
+ source: |-
27349
+ import { createAdminClient } from '@spree/admin-sdk'
27350
+
27351
+ const client = createAdminClient({
27352
+ baseUrl: 'https://your-store.com',
27353
+ secretKey: 'sk_xxx',
27354
+ })
27355
+
27356
+ const product = await client.products.archive('prod_UkLWZg9DAJ')
27357
+ - lang: bash
27358
+ label: Spree CLI
27359
+ source: spree api patch /products/{id}/archive -d '{ ... }'
27360
+ security:
27361
+ - api_key: []
27362
+ bearer_auth: []
27363
+ description: |-
27364
+ Takes one product off sale and archives it; activating it puts it back on sale. Runs the archive workflow, so its hooks and its event fire. A product awaiting review is refused: approve or reject it instead.
27365
+
27366
+
27367
+ **Required scope:** `write_products` (for API-key authentication).
27368
+ parameters:
27369
+ - name: x-spree-api-key
27370
+ in: header
27371
+ required: true
27372
+ schema:
27373
+ type: string
27374
+ - name: Authorization
27375
+ in: header
27376
+ required: true
27377
+ schema:
27378
+ type: string
27379
+ responses:
27380
+ '200':
27381
+ description: product archived
27382
+ content:
27383
+ application/json:
27384
+ example:
27385
+ id: prod_gbHJdmfrXB
27386
+ name: Product 1644768
27387
+ slug: product-1644768
27388
+ meta_title:
27389
+ meta_description:
27390
+ meta_keywords:
27391
+ variant_count: 1
27392
+ available_on:
27393
+ preorder_ships_at:
27394
+ purchasable: true
27395
+ preorder: false
27396
+ in_stock: false
27397
+ backorderable: true
27398
+ available: false
27399
+ description: In exercitationem nobis illo accusamus non quibusdam.
27400
+ Minus corporis commodi magni maxime cumque beatae. Exercitationem
27401
+ provident tempore est corrupti eius at dolor. Rerum delectus id
27402
+ aspernatur consequuntur quod enim. Quis omnis amet inventore alias
27403
+ minima praesentium. Quaerat reprehenderit deleniti atque inventore.
27404
+ Nemo quas nam qui architecto eligendi vel pariatur. Veritatis accusantium
27405
+ molestias deleniti omnis autem modi. Officiis optio quidem iste
27406
+ nihil delectus commodi. Aperiam amet omnis eum praesentium natus
27407
+ recusandae suscipit.
27408
+ description_html: |-
27409
+ In exercitationem nobis illo accusamus non quibusdam. Minus corporis commodi magni maxime cumque beatae. Exercitationem provident tempore est corrupti eius at dolor. Rerum delectus id aspernatur consequuntur quod enim.
27410
+ Quis omnis amet inventore alias minima praesentium. Quaerat reprehenderit deleniti atque inventore. Nemo quas nam qui architecto eligendi vel pariatur.
27411
+ Veritatis accusantium molestias deleniti omnis autem modi. Officiis optio quidem iste nihil delectus commodi. Aperiam amet omnis eum praesentium natus recusandae suscipit.
27412
+ default_variant_id: variant_gbHJdmfrXB
27413
+ buy_box_variant_id: variant_gbHJdmfrXB
27414
+ thumbnail_url:
27415
+ tags: []
27416
+ price:
27417
+ id: price_gbHJdmfrXB
27418
+ currency: USD
27419
+ amount: '19.99'
27420
+ compare_at_amount:
27421
+ price_list_id:
27422
+ min_quantity: 1
27423
+ variant_id: variant_gbHJdmfrXB
27424
+ created_at: '2026-01-15T12:00:00.000Z'
27425
+ updated_at: '2026-01-15T12:00:00.000Z'
27426
+ original_price:
27427
+ seller_id:
27428
+ external_references: {}
27429
+ status: archived
27430
+ metadata: {}
27431
+ deleted_at:
27432
+ created_at: '2026-01-15T12:00:00.000Z'
27433
+ updated_at: '2026-01-15T12:00:00.000Z'
27434
+ delivery_profile_id: fp_UkLWZg9DAJ
27435
+ seller_name:
27436
+ product_type_id:
27437
+ tax_category_id: taxcat_UkLWZg9DAJ
27438
+ total_on_hand: 0
27439
+ schema:
27440
+ "$ref": "#/components/schemas/Product"
27441
+ '422':
27442
+ description: the product is awaiting review
27443
+ content:
27444
+ application/json:
27445
+ example:
27446
+ error:
27447
+ code: product_in_review
27448
+ message: A product awaiting review is approved or rejected, not
27449
+ moved to another status
27450
+ schema:
27451
+ "$ref": "#/components/schemas/ErrorResponse"
27452
+ "/api/v3/admin/products/{id}/draft":
27453
+ parameters:
27454
+ - name: id
27455
+ in: path
27456
+ required: true
27457
+ description: Product ID
27458
+ schema:
27459
+ type: string
27460
+ patch:
27461
+ summary: Move a product back to draft
27462
+ tags:
27463
+ - Products
27464
+ x-codeSamples:
27465
+ - lang: javascript
27466
+ label: Spree Admin SDK
27467
+ source: |-
27468
+ import { createAdminClient } from '@spree/admin-sdk'
27469
+
27470
+ const client = createAdminClient({
27471
+ baseUrl: 'https://your-store.com',
27472
+ secretKey: 'sk_xxx',
27473
+ })
27474
+
27475
+ const product = await client.products.draft('prod_UkLWZg9DAJ')
27476
+ - lang: bash
27477
+ label: Spree CLI
27478
+ source: spree api patch /products/{id}/draft -d '{ ... }'
27479
+ security:
27480
+ - api_key: []
27481
+ bearer_auth: []
27482
+ description: |-
27483
+ Takes one product off sale, back to a draft. Runs the draft workflow, so its hooks and its event fire. A product awaiting review is refused: approve or reject it instead.
27484
+
27485
+
27486
+ **Required scope:** `write_products` (for API-key authentication).
27487
+ parameters:
27488
+ - name: x-spree-api-key
27489
+ in: header
27490
+ required: true
27491
+ schema:
27492
+ type: string
27493
+ - name: Authorization
27494
+ in: header
27495
+ required: true
27496
+ schema:
27497
+ type: string
27498
+ responses:
27499
+ '200':
27500
+ description: product draft
27501
+ content:
27502
+ application/json:
27503
+ example:
27504
+ id: prod_gbHJdmfrXB
27505
+ name: Product 1682527
27506
+ slug: product-1682527
27507
+ meta_title:
27508
+ meta_description:
27509
+ meta_keywords:
27510
+ variant_count: 1
27511
+ available_on:
27512
+ preorder_ships_at:
27513
+ purchasable: true
27514
+ preorder: false
27515
+ in_stock: false
27516
+ backorderable: true
27517
+ available: false
27518
+ description: Temporibus fugiat ducimus quae voluptas error. Iure repellat
27519
+ labore aperiam harum magni. Fuga ullam possimus ad repudiandae atque.
27520
+ Excepturi quidem est expedita molestiae delectus. Optio tempora
27521
+ sed minus voluptatum doloremque. Laborum esse voluptate nostrum
27522
+ nesciunt. Ipsum ducimus a dolor nostrum quis corrupti quae illum.
27523
+ Fuga provident deleniti minima ea vel. Cupiditate architecto omnis
27524
+ reprehenderit iusto suscipit corrupti quia cumque. Voluptatem nisi
27525
+ dignissimos aut nostrum distinctio quo explicabo fugiat. Unde minima
27526
+ ratione enim minus officia rerum odio reiciendis. Fugiat perferendis
27527
+ nulla voluptates voluptatum alias. Voluptatem cumque voluptatibus
27528
+ in sint assumenda ad neque. Inventore error consequuntur exercitationem
27529
+ officia consequatur earum iure autem. Odit iure porro reiciendis
27530
+ placeat. Animi minus vel asperiores maiores error tempora. Dolorum
27531
+ esse sapiente voluptatem iste culpa suscipit. Nulla sapiente sit
27532
+ deserunt iste totam dolores. Tempora magni eveniet natus nemo optio.
27533
+ Aliquid quis ullam illo minus. Atque distinctio sapiente voluptatibus
27534
+ adipisci consectetur repellendus culpa dolor. Dolor pariatur tempora
27535
+ ab repellat unde aliquam sequi. Necessitatibus aliquid fugit molestias
27536
+ facilis ratione.
27537
+ description_html: |-
27538
+ Temporibus fugiat ducimus quae voluptas error. Iure repellat labore aperiam harum magni. Fuga ullam possimus ad repudiandae atque. Excepturi quidem est expedita molestiae delectus. Optio tempora sed minus voluptatum doloremque.
27539
+ Laborum esse voluptate nostrum nesciunt. Ipsum ducimus a dolor nostrum quis corrupti quae illum. Fuga provident deleniti minima ea vel. Cupiditate architecto omnis reprehenderit iusto suscipit corrupti quia cumque. Voluptatem nisi dignissimos aut nostrum distinctio quo explicabo fugiat.
27540
+ Unde minima ratione enim minus officia rerum odio reiciendis. Fugiat perferendis nulla voluptates voluptatum alias. Voluptatem cumque voluptatibus in sint assumenda ad neque. Inventore error consequuntur exercitationem officia consequatur earum iure autem.
27541
+ Odit iure porro reiciendis placeat. Animi minus vel asperiores maiores error tempora. Dolorum esse sapiente voluptatem iste culpa suscipit. Nulla sapiente sit deserunt iste totam dolores.
27542
+ Tempora magni eveniet natus nemo optio. Aliquid quis ullam illo minus. Atque distinctio sapiente voluptatibus adipisci consectetur repellendus culpa dolor. Dolor pariatur tempora ab repellat unde aliquam sequi. Necessitatibus aliquid fugit molestias facilis ratione.
27543
+ default_variant_id: variant_gbHJdmfrXB
27544
+ buy_box_variant_id: variant_gbHJdmfrXB
27545
+ thumbnail_url:
27546
+ tags: []
27547
+ price:
27548
+ id: price_gbHJdmfrXB
27549
+ currency: USD
27550
+ amount: '19.99'
27551
+ compare_at_amount:
27552
+ price_list_id:
27553
+ min_quantity: 1
27554
+ variant_id: variant_gbHJdmfrXB
27555
+ created_at: '2026-01-15T12:00:00.000Z'
27556
+ updated_at: '2026-01-15T12:00:00.000Z'
27557
+ original_price:
27558
+ seller_id:
27559
+ external_references: {}
27560
+ status: draft
27561
+ metadata: {}
27562
+ deleted_at:
27563
+ created_at: '2026-01-15T12:00:00.000Z'
27564
+ updated_at: '2026-01-15T12:00:00.000Z'
27565
+ delivery_profile_id: fp_UkLWZg9DAJ
27566
+ seller_name:
27567
+ product_type_id:
27568
+ tax_category_id: taxcat_UkLWZg9DAJ
27569
+ total_on_hand: 0
27570
+ schema:
27571
+ "$ref": "#/components/schemas/Product"
27572
+ '422':
27573
+ description: the product is awaiting review
27574
+ content:
27575
+ application/json:
27576
+ example:
27577
+ error:
27578
+ code: product_in_review
27579
+ message: A product awaiting review is approved or rejected, not
27580
+ moved to another status
27581
+ schema:
27582
+ "$ref": "#/components/schemas/ErrorResponse"
26336
27583
  "/api/v3/admin/translations":
26337
27584
  get:
26338
27585
  summary: Translation coverage for a resource type
@@ -29886,6 +31133,13 @@ paths:
29886
31133
  required: true
29887
31134
  schema:
29888
31135
  type: string
31136
+ - name: expand
31137
+ in: query
31138
+ required: false
31139
+ description: 'Comma-separated associations to expand: `rules`, `actions` (each
31140
+ under the same shape the write accepts), `custom_fields`.'
31141
+ schema:
31142
+ type: string
29889
31143
  responses:
29890
31144
  '200':
29891
31145
  description: promotion found
@@ -39578,6 +40832,77 @@ paths:
39578
40832
  schema:
39579
40833
  "$ref": "#/components/schemas/CatalogAssignParams"
39580
40834
  required: true
40835
+ "/api/v3/admin/catalogs/{id}/import_products":
40836
+ parameters:
40837
+ - name: id
40838
+ in: path
40839
+ required: true
40840
+ schema:
40841
+ type: string
40842
+ post:
40843
+ summary: Import price list products into a catalog
40844
+ tags:
40845
+ - Catalogs
40846
+ x-codeSamples:
40847
+ - lang: javascript
40848
+ label: Spree Admin SDK
40849
+ source: |-
40850
+ import { createAdminClient } from '@spree/admin-sdk'
40851
+
40852
+ const client = createAdminClient({
40853
+ baseUrl: 'https://your-store.com',
40854
+ secretKey: 'sk_xxx',
40855
+ })
40856
+
40857
+ const { added_count } = await client.catalogs.importProducts('cat_86Rf07xd4z')
40858
+ - lang: bash
40859
+ label: Spree CLI
40860
+ source: spree api post /catalogs/{id}/import_products -d '{ ... }'
40861
+ security:
40862
+ - api_key: []
40863
+ bearer_auth: []
40864
+ description: |-
40865
+ Adds every product on the catalog's price list to its assortment. Products
40866
+ already in it stay, even ones the list does not price. Refused for a
40867
+ catalog without a price list; the count reports what was added.
40868
+
40869
+
40870
+ **Required scope:** `write_products` (for API-key authentication).
40871
+ parameters:
40872
+ - name: x-spree-api-key
40873
+ in: header
40874
+ required: true
40875
+ schema:
40876
+ type: string
40877
+ - name: Authorization
40878
+ in: header
40879
+ required: true
40880
+ schema:
40881
+ type: string
40882
+ responses:
40883
+ '200':
40884
+ description: products imported
40885
+ content:
40886
+ application/json:
40887
+ example:
40888
+ added_count: 1
40889
+ schema:
40890
+ type: object
40891
+ properties:
40892
+ added_count:
40893
+ type: integer
40894
+ required:
40895
+ - added_count
40896
+ '422':
40897
+ description: the catalog has no price list
40898
+ content:
40899
+ application/json:
40900
+ example:
40901
+ error:
40902
+ code: validation_error
40903
+ message: This catalog has no price list to import products from.
40904
+ schema:
40905
+ "$ref": "#/components/schemas/ErrorResponse"
39581
40906
  "/api/v3/admin/catalogs/{catalog_id}/products":
39582
40907
  get:
39583
40908
  summary: List catalog products
@@ -41294,6 +42619,7 @@ paths:
41294
42619
  summary: Reposition a collection product
41295
42620
  tags:
41296
42621
  - Collections
42622
+ operationId: collections_reposition_product
41297
42623
  security:
41298
42624
  - api_key: []
41299
42625
  bearer_auth: []
@@ -43678,6 +45004,7 @@ paths:
43678
45004
  summary: Re-check a company tax registration
43679
45005
  tags:
43680
45006
  - Companies
45007
+ operationId: company_tax_identifiers_validate
43681
45008
  security:
43682
45009
  - api_key: []
43683
45010
  bearer_auth: []
@@ -49258,6 +50585,7 @@ paths:
49258
50585
  summary: Buy or record a shipping label
49259
50586
  tags:
49260
50587
  - Shipping Labels
50588
+ operationId: shipping_labels_purchase
49261
50589
  security:
49262
50590
  - api_key: []
49263
50591
  bearer_auth: []
@@ -51701,6 +53029,7 @@ paths:
51701
53029
  summary: Book in a delivery
51702
53030
  tags:
51703
53031
  - Purchase Orders
53032
+ operationId: purchase_orders_receive
51704
53033
  security:
51705
53034
  - api_key: []
51706
53035
  bearer_auth: []
@@ -52332,6 +53661,9 @@ paths:
52332
53661
  required: true
52333
53662
  "/api/v3/admin/reporting/query":
52334
53663
  post:
53664
+ x-spree-agent: false
53665
+ x-spree-agent-reason: query_report runs this query, with describe_reporting
53666
+ to learn the vocabulary first.
52335
53667
  summary: Run a reporting query
52336
53668
  tags:
52337
53669
  - Reports
@@ -54247,6 +55579,93 @@ paths:
54247
55579
  schema:
54248
55580
  "$ref": "#/components/schemas/SellerInviteParams"
54249
55581
  required: true
55582
+ "/api/v3/admin/sellers/{seller_id}/invitations/{id}/resend":
55583
+ parameters:
55584
+ - name: seller_id
55585
+ in: path
55586
+ required: true
55587
+ description: Seller prefixed ID
55588
+ schema:
55589
+ type: string
55590
+ - name: id
55591
+ in: path
55592
+ required: true
55593
+ description: Invitation prefixed ID
55594
+ schema:
55595
+ type: string
55596
+ patch:
55597
+ summary: Resend a seller invitation
55598
+ tags:
55599
+ - Sellers
55600
+ x-codeSamples:
55601
+ - lang: javascript
55602
+ label: Spree Admin SDK
55603
+ source: |-
55604
+ import { createAdminClient } from '@spree/admin-sdk'
55605
+
55606
+ const client = createAdminClient({
55607
+ baseUrl: 'https://your-store.com',
55608
+ secretKey: 'sk_xxx',
55609
+ })
55610
+
55611
+ const invitation = await client.sellers.invitations.resend('seller_UkLWZg9DAJ', 'inv_UkLWZg9DAJ')
55612
+ - lang: bash
55613
+ label: Spree CLI
55614
+ source: spree api patch /sellers/{seller_id}/invitations/{id}/resend -d '{
55615
+ ... }'
55616
+ security:
55617
+ - api_key: []
55618
+ bearer_auth: []
55619
+ description: |-
55620
+ Sends a pending invitation to the seller's team again, with a fresh
55621
+ acceptance link. Use it when the email never arrived; an invitation that
55622
+ has expired is refused, so invite the person again instead.
55623
+
55624
+
55625
+ **Required scope:** `write_sellers` (for API-key authentication).
55626
+ parameters:
55627
+ - name: x-spree-api-key
55628
+ in: header
55629
+ required: true
55630
+ schema:
55631
+ type: string
55632
+ - name: Authorization
55633
+ in: header
55634
+ required: true
55635
+ schema:
55636
+ type: string
55637
+ responses:
55638
+ '200':
55639
+ description: invitation resent
55640
+ content:
55641
+ application/json:
55642
+ example:
55643
+ id: inv_UkLWZg9DAJ
55644
+ email: gaye@rutherfordmosciski.co.uk
55645
+ status: pending
55646
+ created_at: '2026-01-15T12:00:00.000Z'
55647
+ updated_at: '2026-01-15T12:00:00.000Z'
55648
+ expires_at: '2026-01-29T12:00:00.000Z'
55649
+ role_id: role_UkLWZg9DAJ
55650
+ role_name: admin
55651
+ inviter_email: carman@schambergernicolas.ca
55652
+ invitee_exists: false
55653
+ store:
55654
+ id: store_UkLWZg9DAJ
55655
+ name: Spree Test Store
55656
+ schema:
55657
+ "$ref": "#/components/schemas/Invitation"
55658
+ '422':
55659
+ description: the invitation has expired
55660
+ content:
55661
+ application/json:
55662
+ example:
55663
+ error:
55664
+ code: processing_error
55665
+ message: This invitation has expired. Invite them again to send
55666
+ a new one.
55667
+ schema:
55668
+ "$ref": "#/components/schemas/ErrorResponse"
54250
55669
  "/api/v3/admin/sellers/{id}/approve":
54251
55670
  parameters:
54252
55671
  - name: id
@@ -55189,6 +56608,9 @@ paths:
55189
56608
  schema:
55190
56609
  type: string
55191
56610
  patch:
56611
+ x-spree-agent: false
56612
+ x-spree-agent-reason: Settles a payout against the payment provider, reconciling
56613
+ against provider state an agent cannot see.
55192
56614
  summary: Mark a payout paid
55193
56615
  tags:
55194
56616
  - Sellers
@@ -55507,6 +56929,9 @@ paths:
55507
56929
  - meta
55508
56930
  "/api/v3/admin/stock_levels/bulk_upsert":
55509
56931
  post:
56932
+ x-spree-agent: false
56933
+ x-spree-agent-reason: set_stock calls this endpoint already, taking stock by
56934
+ SKU and location the way a merchant names them.
55510
56935
  summary: Bulk-upsert stock levels
55511
56936
  tags:
55512
56937
  - Stock
@@ -57041,6 +58466,7 @@ paths:
57041
58466
  summary: Count a delivery in
57042
58467
  tags:
57043
58468
  - Stock Transfers
58469
+ operationId: stock_transfers_receive
57044
58470
  security:
57045
58471
  - api_key: []
57046
58472
  bearer_auth: []
@@ -62312,6 +63738,24 @@ components:
62312
63738
  type: array
62313
63739
  items:
62314
63740
  type: object
63741
+ properties:
63742
+ id:
63743
+ type: string
63744
+ name:
63745
+ type: string
63746
+ nullable: true
63747
+ position:
63748
+ type: number
63749
+ nullable: true
63750
+ stock_location_ids:
63751
+ type: array
63752
+ items:
63753
+ type: string
63754
+ required:
63755
+ - id
63756
+ - name
63757
+ - position
63758
+ - stock_location_ids
62315
63759
  products_count:
62316
63760
  type: number
62317
63761
  delivery_methods_count:
@@ -63650,6 +65094,14 @@ components:
63650
65094
  type: array
63651
65095
  items:
63652
65096
  type: object
65097
+ properties:
65098
+ kind:
65099
+ type: string
65100
+ url:
65101
+ type: string
65102
+ required:
65103
+ - kind
65104
+ - url
63653
65105
  labels:
63654
65106
  type: array
63655
65107
  items:
@@ -64414,6 +65866,14 @@ components:
64414
65866
  type: boolean
64415
65867
  store:
64416
65868
  type: object
65869
+ properties:
65870
+ id:
65871
+ type: string
65872
+ name:
65873
+ type: string
65874
+ required:
65875
+ - id
65876
+ - name
64417
65877
  required:
64418
65878
  - id
64419
65879
  - email
@@ -67750,6 +69210,14 @@ components:
67750
69210
  type: boolean
67751
69211
  description: Whether the card issuer reported that the security code did
67752
69212
  not match.
69213
+ can_void:
69214
+ type: boolean
69215
+ description: Whether the payment can be voided now, as decided by its payment
69216
+ method.
69217
+ can_capture:
69218
+ type: boolean
69219
+ description: Whether the payment can be captured now, as decided by its
69220
+ payment method.
67753
69221
  captured_amount:
67754
69222
  type: string
67755
69223
  order_id:
@@ -67788,6 +69256,8 @@ components:
67788
69256
  - updated_at
67789
69257
  - avs_risky
67790
69258
  - cvv_risky
69259
+ - can_void
69260
+ - can_capture
67791
69261
  - captured_amount
67792
69262
  - order_id
67793
69263
  x-typelizer: true
@@ -68853,6 +70323,9 @@ components:
68853
70323
  tax_category_id:
68854
70324
  type: string
68855
70325
  nullable: true
70326
+ total_on_hand:
70327
+ type: number
70328
+ nullable: true
68856
70329
  digital_assets:
68857
70330
  type: array
68858
70331
  items:
@@ -68905,6 +70378,7 @@ components:
68905
70378
  - seller_name
68906
70379
  - product_type_id
68907
70380
  - tax_category_id
70381
+ - total_on_hand
68908
70382
  x-typelizer: true
68909
70383
  ProductSubmission:
68910
70384
  type: object
@@ -69214,6 +70688,14 @@ components:
69214
70688
  type: array
69215
70689
  items:
69216
70690
  type: string
70691
+ rules:
70692
+ type: array
70693
+ items:
70694
+ "$ref": "#/components/schemas/PromotionRule"
70695
+ actions:
70696
+ type: array
70697
+ items:
70698
+ "$ref": "#/components/schemas/PromotionAction"
69217
70699
  required:
69218
70700
  - id
69219
70701
  - name
@@ -70033,6 +71515,14 @@ components:
70033
71515
  type: array
70034
71516
  items:
70035
71517
  type: object
71518
+ properties:
71519
+ kind:
71520
+ type: string
71521
+ url:
71522
+ type: string
71523
+ required:
71524
+ - kind
71525
+ - url
70036
71526
  labels:
70037
71527
  type: array
70038
71528
  items:
@@ -70856,6 +72346,15 @@ components:
70856
72346
  nullable: true
70857
72347
  blocker:
70858
72348
  type: object
72349
+ properties:
72350
+ state:
72351
+ type: string
72352
+ message:
72353
+ type: string
72354
+ nullable: true
72355
+ required:
72356
+ - state
72357
+ - message
70859
72358
  nullable: true
70860
72359
  blocking:
70861
72360
  type: boolean
@@ -71034,6 +72533,14 @@ components:
71034
72533
  type: number
71035
72534
  onboarding_progress:
71036
72535
  type: object
72536
+ properties:
72537
+ done:
72538
+ type: number
72539
+ total:
72540
+ type: number
72541
+ required:
72542
+ - done
72543
+ - total
71037
72544
  onboarding_complete:
71038
72545
  type: boolean
71039
72546
  legal_name: