# API Changelog

Track breaking changes, new endpoints, and removed endpoints between Shoplazza OpenAPI versions. Versions follow the `vYYYYMM` naming convention.

**Subscribe via RSS**

[Get version updates as they ship.](/changelog/rss.xml)

## v202701

### Version info

| Field | Value |
| --- | --- |
| Released | 2026-10-10 |
| Status | **Current** |
| API prefix | `/openapi/2027-01/` |
| Previous | `/openapi/2026-07/` |
| Sunset | TBD |
| API reference | [v202701 API Reference](/api/202701/openapi) |

### Summary

*   Increments the API prefix from 2026-07 to 2027-01.
*   Aligns with internal services: removes deprecated or never-returned fields, normalizes the casing of several field names, and corrects field types to match the internal APIs.
*   Adds an `extra_info` field to the refund record list endpoints.

### Breaking changes

#### Removed fields

| Field | Endpoints | Notes |
| --- | --- | --- |
| `variants[].whole_prices` | `GET /products`, `POST /products`, `GET /products/{product_id}`, `PUT /products/{product_id}`, `GET /products/{product_id}/variants`, `POST /products/{product_id}/variants`, `GET /products/sku/{sku}/variants`, `GET /variants/{variant_id}`, `PUT /variants/{variant_id}`, `PUT /variants/sku/{sku}` | Deprecated alias of `wholesale_price`; use `wholesale_price` instead |
| `order.refund_status` | `GET /orders`, `GET /orders/{order_id}`, `GET /orders/number/{number}`, `POST /orders`, `PUT /orders/{order_id}`, `POST /orders/{order_id}/cancel`, `POST /orders/{order_id}/payment/success` | Never returned since 2026-01; read refund status from `financial_status` |

#### Renamed fields

| Endpoint | Before (v2026-07) | After (v2027-01) |
| --- | --- | --- |
| `GET /products/{product_id}/inventory` | `data.Stock` | `data.stock` |
| `POST /procurements`, `PATCH /procurements/{procurement_id}/cancel` | `data.Procurement` | `data.procurement` |
| `GET /collections/count` | `data.Count` | `data.count` |
| `GET /metafields/{owner_resource}/{owner_id}/count` | `data.total_count` | `data.count` |
| `POST /blogs`, `PUT /blogs/{id}` | Request body `blog.Title` | Request body `blog.title` |

Blog request binding is case-insensitive, so both `Title` and `title` are accepted; this is a documentation fix only.

#### Type changes

| Field | Endpoints | Before | After |
| --- | --- | --- | --- |
| `stock` | `POST /inventory_levels/set` (request), `GET /products/{product_id}/inventory` (`stock`, `variants[].location_items[].stock`) | `int32` | `int64` |
| `stock_adjustment` | `PUT /inventory_levels` (request) | `int32` | `int64` |
| `price` | `POST /recurring_application_charges`, `POST /recurring_application_charges/{charge_id}/usage_charge` (request) | `float` | `string` |
| `capped_amount` | `PUT /recurring_application_charges/{charge_id}/customize` (request) | `float` | `string` |
| `price`, `usage_price`, `commission_price`, `commission_rate` | `GET /transactions/{transaction_id}` | `float` | `string` |
| `tags` | `GET /orders`, `GET /orders/{order_id}`, `GET /orders/number/{number}`, `POST /orders`, `PUT /orders/{order_id}`, `POST /orders/{order_id}/cancel`, `POST /orders/{order_id}/payment/success` | `string` | `string[]` |

Monetary values are passed as decimal strings (for example `"9.99"`) to avoid floating-point precision loss.

### Changed (non-breaking)

*   `GET /orders/refund_records`, `GET /orders/{order_id}/refund`: refund records now include an `extra_info` object (with `pos`: additional POS information), returning the extra information stored on the refund record as-is.

### Migration guide

1.  **Wholesale prices**: use `wholesale_price` when reading or writing variant wholesale prices.
2.  **Order refund status**: stop reading `refund_status`; use `financial_status` instead.
3.  **Field casing**: change `Stock`, `Procurement`, and `Count` to lowercase as listed above; read metafield counts from `count`.
4.  **Amount and quantity types**: send billing amounts as strings, treat stock quantities as 64-bit integers, and parse order `tags` as an array of strings.

## v202607

### Version info

| Field | Value |
| --- | --- |
| Released | TBD |
| Status | **Supported** |
| API prefix | `/openapi/2026-07/` |
| Previous | `/openapi/2026-01/` |
| Sunset | TBD |
| API reference | [v202607 API Reference](/api/openapi) |

### Summary

*   This version is a routine release that increments the API prefix from 2026-01 to 2026-07.
*   Existing integrations using the previous prefix will continue to work with the same functional behavior under the new prefix.
*   Updating your API base path to `/openapi/2026-07/` is required to access this version; no other migration steps are needed.

## v202601

### Version info

| Field | Value |
| --- | --- |
| Released | TBD |
| Status | **Supported** |
| API prefix | /openapi/2026-01/ |
| Previous | /openapi/2025-06/ |
| Sunset | TBD |
| API reference | [v202601 API Reference](/api/202601/openapi) |

### Summary

*   Price rules and discount codes endpoints are fully replaced by a new unified **Discounts API**.
*   New discounts endpoints support automatic and non‑automatic discounts, code lookup, combine configurations, batch operations, and cancellation.
*   Asynchronous smart collection creation is introduced for better performance on large rules.
*   Several legacy endpoints (flash sales, rebates, popups, sales pop config) are removed without replacement.
*   Coupons API changes: listing (`GET /coupons`) is removed; a new `POST /coupons` endpoint is added.

### Breaking changes

#### Discounts & Price Rules

The existing `/price_rules` and `/discount_codes` endpoints are replaced by the new `/discounts` endpoints. Use the following mapping to migrate your code.

| Before (v2025-06) | After (v2026-01) |
| --- | --- |
| `GET /price_rules` | `GET /discounts` |
| `POST /price_rules` | `POST /discounts/automatic` or `POST /discounts/non-automatic` |
| `GET /price_rules/{price_rule_id}` | `GET /discounts/{id}` |
| `PUT /price_rules/{price_rule_id}` | `PUT /discounts/automatic/{id}` or `PUT /discounts/non-automatic/{id}` |
| `DELETE /price_rules/{price_rule_id}` | `DELETE /discounts/{id}` |
| `GET /price_rules/{price_rule_id}/discount_codes` | `GET /discounts` (filter by code) or `GET /discounts/by-code/{discount_code}` |
| `POST /price_rules/{price_rule_id}/discount_codes` | `POST /discounts/non-automatic` (creates a discount with a code) |
| `GET /price_rules/{price_rule_id}/discount_codes/{discount_code_id}` | `GET /discounts/{id}` or `GET /discounts/by-code/{discount_code}` |
| `PUT /price_rules/{price_rule_id}/discount_codes/{discount_code_id}` | `PUT /discounts/non-automatic/{id}` |
| `DELETE /price_rules/{price_rule_id}/discount_codes/{discount_code_id}` | `DELETE /discounts/{id}` |
| `GET /discount_codes` | `GET /discounts` |
| `GET /discount_codes/lookup` | `GET /discounts/by-code/{discount_code}` |

#### Coupons

*   `GET /coupons` (list coupons) has been removed. There is no direct replacement.
*   `POST /coupons` is added (see Additions).

### Additions

The following new endpoints are introduced:

*   **Coupons**
    *   `POST /coupons` — Create coupon
    *   `GET /coupons/{id}` — Get coupon
    *   `PUT /coupons/{id}` — Update coupon
*   **Discounts**
    *   `GET /discounts` — List discounts
    *   `POST /discounts/automatic` — Create automatic discount
    *   `PUT /discounts/automatic/{id}` — Update automatic discount
    *   `POST /discounts/batch-delete` — Batch delete discounts
    *   `GET /discounts/by-code/{discount_code}` — Get discount by code
    *   `POST /discounts/cancel` — Cancel discounts
    *   `PUT /discounts/combine` — Configure which discount types can be combined
    *   `POST /discounts/non-automatic` — Create non‑automatic discount
    *   `PUT /discounts/non-automatic/{id}` — Update non‑automatic discount
    *   `POST /discounts/restart` — Restart discount
    *   `GET /discounts/{id}` — Get discount
    *   `DELETE /discounts/{id}` — Delete discount
*   **Collections**
    *   `POST /collections/async` — Asynchronously create a smart collection
    *   `GET /collections/async-task/{id}` — Get collection async task
    *   `PATCH /collections/{id}/smart-rule` — Update smart collection rules
    *   `PATCH /collections/{id}/smart-rule/async` — Asynchronously update smart collection rules

### Changes (non‑breaking)

*   `DELETE /products` — Delete product (new method on existing path).

### Removed without replacement

The following endpoints have been removed and have no direct replacement:

*   `POST /coupons/receive` — Receive coupon
*   `GET /discount_flash_sales` — List discount flash sales
*   `GET /discount_rebates` — List discount rebates
*   `GET /popups` — List popups
*   `GET /price_rules/count` — Get price rule count
*   `POST /price_rules/{price_rule_id}/discount_codes/batch` — Batch create discount codes
*   `GET /salespops/config` — Get sales pop config

### Migration

1.  **Price rules to discounts**: Replace all calls to `/price_rules` and `/discount_codes` with the corresponding `/discounts` endpoints listed in the Breaking changes table. Note that the new API requires distinguishing between automatic and non‑automatic discounts.
2.  **Coupon listing**: If your application relied on `GET /coupons` to list coupons, use the new `GET /discounts` endpoint (which includes all discount types) or adopt the individual coupon retrieval via `GET /coupons/{id}`.
3.  **Batch discount code creation**: The batch endpoint is removed. Create discounts individually using `POST /discounts/non-automatic`.
4.  **Count endpoint**: Use pagination (page/limit) on `GET /discounts` instead of the removed `/price_rules/count`.

### Schema & behavior

Field-level changes are not listed in this changelog. For detailed request/response schemas and behavior changes, refer to the [API reference](/api/openapi).

## v202506

### Version info

| Field | Value |
| --- | --- |
| Released | TBD |
| Status | **Supported** |
| API prefix | `/openapi/2025-06/` |
| Previous | `202201` |
| Sunset | TBD |
| API reference | [v202506 API Reference](/api/202506/openapi) |

### Summary

*   **Consolidated data analysis** – Legacy data endpoints are replaced with a unified `/data-analysis` API offering granular insights by SKU, SPU, landing page, and UTM.
*   **Modern inventory management** – Full CRUD for inventory items and levels, plus location management with priority and deactivation support.
*   **Simplified payment & settlement** – All `shoplazza-payment` endpoints are now version‑prefixed, providing consistent access to balances, disputes, payouts, refunds, and settlements.
*   **Streamlined resource paths** – Key resources (`orders`, `customers`, `procurements`, `script_tags`, `metafields`) adopt cleaner, parameter‑consistent paths.
*   **New capabilities** – App proxies, articles & blogs, gift card batch creation, theme file versioning, and advanced shipping schema management are now available.

### Breaking changes

#### Carrier Services

*   The `POST /carrier_services/` (with trailing slash) endpoint is removed. Use the new `POST /carrier_services` without trailing slash.

| Before | After |
| --- | --- |
| `POST /{ver}/carrier_services/` | `POST /{ver}/carrier_services` |

#### Data Analysis

*   The legacy `GET /data/analysis`, `GET /data/count`, `GET /data/query`, `GET /data/task`, and `GET /data/tasks` endpoints are removed without direct replacement. Use the new Data Analysis API instead.

| Before | After |
| --- | --- |
| `GET /{ver}/data/analysis` | `POST /{ver}/data-analysis` (and related sub‑endpoints) |
| `GET /{ver}/data/query` | `POST /{ver}/data-analysis` (and sub‑endpoints) |
| `GET /{ver}/data/task` | `POST /{ver}/data-analysis` (and sub‑endpoints) |
| `GET /{ver}/data/tasks` | `POST /{ver}/data-analysis` (and sub‑endpoints) |
| `GET /{ver}/data/count` | (no replacement) |

#### Files

*   The `GET` method on `/{ver}/file/{file_uri}` is removed.

| Before | After |
| --- | --- |
| `GET /{ver}/file/{file_uri}` | Use `GET /{ver}/file/detail/{file_uri}` |

#### Inventory & Locations

*   The `GET /{ver}/statistics/inventory/cost_price` and `GET /{ver}/statistics/inventory/loss_quantity` endpoints are removed. Use the new Inventory Items and Inventory Levels endpoints.

| Before | After |
| --- | --- |
| `GET /{ver}/statistics/inventory/cost_price` | `GET /{ver}/inventory_items` (and related) |
| `GET /{ver}/statistics/inventory/loss_quantity` | `GET /{ver}/inventory_items` (and related) |

#### Orders & Customers

*   All order and customer sub‑endpoints now use `{order_id}` and `{customer_id}` instead of `{id}`.

| Before | After |
| --- | --- |
| `GET/PUT/DELETE /{ver}/orders/{id}` | `GET/PUT/DELETE /{ver}/orders/{order_id}` |
| `POST /{ver}/orders/{id}/cancel` | `POST /{ver}/orders/{order_id}/cancel` |
| `POST /{ver}/orders/{id}/payment/success` | `POST /{ver}/orders/{order_id}/payment/success` |
| `GET/POST /{ver}/orders/{id}/refund` | `GET/POST /{ver}/orders/{order_id}/refund` |
| `GET/POST /{ver}/orders/{id}/transactions` | `GET /{ver}/orders/{order_id}/transactions` |
| `GET /{ver}/orders/{id}/risks` | Now `GET /{ver}/orders/{order_id}/risks` (no change in path) |
| `GET/PUT /{ver}/customers/{id}` | `GET/PUT /{ver}/customers/{customer_id}` |

#### Payment App Callbacks

*   The `POST /payments_apps/complete_callbacks` and `POST /payments_apps/notify_callbacks` endpoints are removed. Use the new `POST /payments_apps/configure` for configuration; callback handling may be replaced by webhooks.

| Before | After |
| --- | --- |
| `POST /{ver}/payments_apps/complete_callbacks` | (no direct replacement) |
| `POST /{ver}/payments_apps/notify_callbacks` | (no direct replacement) |

#### Price Rules

*   The `DELETE` method on `/{ver}/price_rules/{price_rule_id}/discount_codes` is removed. Use `DELETE /{ver}/price_rules/{price_rule_id}/discount_codes/{discount_code_id}` to delete a single discount code.

| Before | After |
| --- | --- |
| `DELETE /{ver}/price_rules/{price_rule_id}/discount_codes` | `DELETE /{ver}/price_rules/{price_rule_id}/discount_codes/{discount_code_id}` |

#### Procurements & Stock Management

*   All procurement endpoints are moved from `/center/procurements` and direct `/procurements` to a unified `/procurements/{procurement_id}` pattern.

| Before | After |
| --- | --- |
| `GET /{ver}/center/procurements` | `GET /{ver}/procurements/{procurement_id}` (and list via search) |
| `GET /{ver}/center/procurements/{procurement_id}` | `GET /{ver}/procurements/{procurement_id}` |
| `GET /{ver}/center/procurements/{procurement_id}/items` | `GET /{ver}/procurements/{procurement_id}/items` |
| `GET /{ver}/procurements/{id}` | `GET /{ver}/procurements/{procurement_id}` |
| `PUT /{ver}/procurements/{id}` | `PUT /{ver}/procurements/{procurement_id}` |
| `PATCH /{ver}/procurements/{id}/cancel` | `PATCH /{ver}/procurements/{procurement_id}/cancel` |
| `GET/POST/DELETE /{ver}/procurements/{id}/items` | `GET/PUT/POST/DELETE /{ver}/procurements/{procurement_id}/items` |
| `PUT /{ver}/procurments/{id}/items` (note typo) | `PUT /{ver}/procurements/{procurement_id}/items` |
| `PATCH /{ver}/procurements/{id}/receive` | `PATCH /{ver}/procurements/{procurement_id}/receive` |
| `GET /{ver}/center/stock_adjust_orders` | (use Inventory Levels) |
| `GET /{ver}/center/stock_adjust_orders/{id}` | (use Inventory Levels) |
| `GET /{ver}/center/stock_adjust_orders/{id}/items` | (use Inventory Levels) |
| `GET /{ver}/center/transfer_orders` | (use Inventory Levels) |
| `GET /{ver}/center/transfer_orders/{id}` | (use Inventory Levels) |
| `GET /{ver}/center/transfer_orders/{id}/items` | (use Inventory Levels) |

#### Recurring Application Charges

*   The path now uses `{charge_id}` instead of `{recurring_charge_id}`.

| Before | After |
| --- | --- |
| `PUT /{ver}/recurring_application_charges/{recurring_charge_id}/customize` | `PUT /{ver}/recurring_application_charges/{charge_id}/customize` |
| `GET/POST /{ver}/recurring_application_charges/{recurring_charge_id}/usage_charge` | `GET/POST /{ver}/recurring_application_charges/{charge_id}/usage_charge` |
| `GET /{ver}/recurring_application_charges/{recurring_charge_id}/usage_charge/{usage_charge_id}` | `GET /{ver}/recurring_application_charges/{charge_id}/usage_charge/{usage_charge_id}` |

#### Script Tags

*   The old `script_tags_new` endpoints are removed. Use the new `/script_tags` endpoints (without `_new`).

| Before | After |
| --- | --- |
| `GET/POST /{ver}/script_tags_new` | `GET/POST /{ver}/script_tags` |
| `GET /{ver}/script_tags_new/count` | `GET /{ver}/script_tags/count` |
| `GET/PUT/DELETE /{ver}/script_tags_new/{id}` | `GET/PUT/DELETE /{ver}/script_tags/{script_tag_id}` |

#### Metafields

*   Metafield paths are restructured under `/metafields/{owner_resource}/{owner_id}`. Shop‑level metafields are now under `/metafields-shop`.

| Before | After |
| --- | --- |
| `GET/POST /{ver}/{resource}/{resource_id}/metafields` | `GET/POST /{ver}/metafields/{owner_resource}/{owner_id}` |
| `GET /{ver}/{resource}/{resource_id}/metafields/count` | `GET /{ver}/metafields/{owner_resource}/{owner_id}/count` |
| `GET/PATCH/DELETE /{ver}/{resource}/{resource_id}/metafields/{id}` | `GET/PATCH/DELETE /{ver}/metafields/{owner_resource}/{owner_id}/{id}` |
| (no shop metafields in old version) | `GET/POST /{ver}/metafields-shop` (new) |

#### Areas

*   The area endpoint now uses `{country}` instead of `{country_code}` and adds POST/DELETE support.

| Before | After |
| --- | --- |
| `GET /{ver}/areas/country/{country_code}/province` | `GET /{ver}/areas/country/{country}/province` |

#### Discount Flash Sales

*   Endpoint renamed from `discount_flashsales` to `discount_flash_sales`.

| Before | After |
| --- | --- |
| `GET /{ver}/discount_flashsales` | `GET /{ver}/discount_flash_sales` |

#### Themes

*   Several theme endpoints are removed. Use the new theme versioning and file management endpoints.

| Before | After |
| --- | --- |
| `POST /{ver}/themes/upload` | `POST /{ver}/themes/{theme_id}/upgrade` (for upgrades) |
| `POST /{ver}/themes/{theme_id}/doc-asset` | `PUT /{ver}/themes/{theme_id}/doc-rename` (for file management) |
| `GET /{ver}/themes/{theme_id}/download` | `GET /{ver}/themes/task/{task_id}` (for theme task status) |

#### Tracking

*   `GET /{ver}/tracking-codes` is removed. Use the new `/tracking/carriers` endpoints.

| Before | After |
| --- | --- |
| `GET /{ver}/tracking-codes` | `GET /{ver}/tracking/carriers` (and `/detect`) |

#### Other Removals

*   `GET /{ver}/salespops/datagraph` is removed without replacement.
*   `GET /{ver}/orders/after_sales_list` is removed. Use `GET /{ver}/orders/post_sales`.

### Additions

*   **App Proxies** – `GET/POST /{ver}/app-proxies`, `GET /{ver}/app-proxies/count`, `GET/DELETE /{ver}/app-proxies/{id}`
*   **Application Charges** – `GET /{ver}/application_charges/{charge_id}/transactions`
*   **Areas** – `POST/DELETE /{ver}/areas/country/{country}/province`, `GET /{ver}/areas/{code}/children`
*   **Articles & Blogs** – Full CRUD for `/articles` and `/blogs` (list, create, get, update, delete, count, authors)
*   **Categories** – `GET /{ver}/categories`
*   **Collects** – `POST /{ver}/collects/batch`
*   **Data Analysis** – `POST /{ver}/data-analysis`, `/data-analysis/land-page`, `/data-analysis/sku`, `/data-analysis/spu`, `/data-analysis/utm`
*   **Discount Flash Sales** – `GET /{ver}/discount_flash_sales`
*   **Files** – `GET /{ver}/file/detail/{file_uri}`
*   **Gift Cards** – `POST /{ver}/gift_cards/batch`
*   **Inventory** – Full CRUD for `/inventory_items` and `/inventory_levels`, plus `/inventory_items/variant`, `/inventory_items/{inventory_item_id}`, `/inventory_levels/set`
*   **Locations** – Management endpoints: list, count, deactivate, default, priority, get by ID, list inventory levels per location
*   **Metafields** – Shop‑level (`/metafields-shop`) and resource‑level (`/metafields/{owner_resource}/{owner_id}`) with CRUD and count
*   **OAuth** – `GET /{ver}/oauth/access_scopes`
*   **Orders** – `GET /{ver}/orders/post_sales`
*   **Pages** – `POST /{ver}/pages/details`, `DELETE /{ver}/pages/store-pages/batch`, `GET /{ver}/pages/store-pages/info`
*   **Payment** – `GET /{ver}/payment/channels`
*   **Payment Apps** – `POST /{ver}/payments_apps/configure`
*   **Price Rules** – `POST /{ver}/price_rules/{price_rule_id}/discount_codes/batch`
*   **Procurements** – Added methods `PUT` and merge of `/items` (now includes batch update)
*   **Recurring Application Charges** – `GET /{ver}/recurring_application_charges/{charge_id}/transactions`
*   **Script Tags** – Replaced `script_tags_new` with `/script_tags`
*   **Shipping** – `POST /{ver}/shipping-lines/available-lines`, `GET/POST /{ver}/shipping-schemas/general`, `POST /{ver}/shipping-schemas/shipping-zone`, `PUT/DELETE /{ver}/shipping-schemas/shipping-zone/{id}`
*   **Shoplazza Payment** – Added `GET /{ver}/shoplazza-payment/balance` and `GET /{ver}/shoplazza-payment/balance/details`
*   **Themes** – `GET /{ver}/themes/task/{task_id}`, `PUT /{ver}/themes/{theme_id}/doc-rename`, multiple version‑related endpoints
*   **Tracking** – `GET /{ver}/tracking/carriers`, `GET /{ver}/tracking/carriers/detect`
*   **Transactions** – `GET /{ver}/transactions/{transaction_id}`

### Changes

The following endpoints have new methods added without breaking existing calls:

*   `POST /{ver}/carrier_services` – New endpoint for creating a carrier service.
*   `GET /{ver}/orders/{order_id}/risks` – New method to retrieve order risk information.
*   `DELETE /{ver}/pages/{id}` – New method to delete a page.
*   `DELETE /{ver}/price_rules/{price_rule_id}/discount_codes/{discount_code_id}` – New method to delete a single discount code.

### Removed without replacement

The following endpoints have been removed and no direct replacement is provided:

*   `GET /{ver}/data/count`
*   `GET /{ver}/orders/after_sales_list`
*   `GET /{ver}/salespops/datagraph`
*   `GET /{ver}/statistics/inventory/cost_price`
*   `GET /{ver}/statistics/inventory/loss_quantity`
*   `POST /{ver}/themes/upload`
*   `POST /{ver}/themes/{theme_id}/doc-asset`
*   `GET /{ver}/themes/{theme_id}/download`
*   `POST /{ver}/payments_apps/complete_callbacks`
*   `POST /{ver}/payments_apps/notify_callbacks`

### Migration

1.  **Path & parameter updates** – Update all requests to use the new parameter names (`{order_id}`, `{customer_id}`, `{procurement_id}`, `{charge_id}`, `{script_tag_id}`, etc.) and the new paths as shown in the Breaking changes tables. Remove the old `/center/` prefix from procurement and stock endpoints.

2.  **Data analysis** – Replace calls to the removed `GET /data/*` endpoints with the new `POST /data-analysis` endpoints. Use the appropriate sub‑endpoint for your analysis type (SPU, SKU, landing page, UTM). The old `GET /data/count` has no replacement.

3.  **Inventory statistics** – The `statistics/inventory` endpoints are gone. Query inventory data using `/inventory_items`, `/inventory_levels`, and `/locations`.

4.  **Payment app callbacks** – If you used `complete_callbacks` or `notify_callbacks`, migrate to the `POST /payments_apps/configure` endpoint and consider using webhooks for callback handling.

5.  **Theme uploads & downloads** – Theme upload/download are removed. Use `/themes/{theme_id}/upgrade` to upgrade a theme and the new file management endpoints for asset operations.

6.  **Discount codes** – Batch deletion of discount codes is no longer supported via `DELETE /discount_codes`. Delete individual codes using `DELETE /discount_codes/{discount_code_id}` or use the new `POST /discount_codes/batch`.

7.  **Metafields** – Migrate from the dynamic `/{resource}/{resource_id}/metafields` pattern to the dedicated `/metafields/{owner_resource}/{owner_id}` paths. Shop metafields now have their own endpoints under `/metafields-shop`.

### Schema & behavior

Field‑level changes are not listed in this changelog. For details on request/response schemas, refer to the [API reference](/api/202506/openapi).

## v202201

### Version info

| Released | Status | API prefix | Previous | Sunset | API reference |
| --- | --- | --- | --- | --- | --- |
| TBD | **Supported** | `/openapi/2022-01/` | — | TBD | [/api/202201/openapi](/api/202201/openapi) |

### Summary

*   This version establishes the initial changelog baseline for the 2022‑01 API.
*   The API prefix is `/openapi/2022-01/`, covering a total of 150 endpoints.
*   All existing endpoints in this version remain unchanged; no prior version is available for comparison.
*   This baseline serves as the reference point for all future breaking changes, additions, and removals.
*   No client‑affecting changes exist in this version; it is provided solely to anchor the changelog history.
