2026-04
2026-04 Release Notes
Fulfillments
New Features
- Source Breakdown for Fulfill and Pack: The
POST /fulfillments/{fulfillment_id}/fulfillandPOST /fulfillments/{fulfillment_id}/packendpoints now accept an optionalsource_breakdownon each line item, allowing callers to specify exactly how quantities should be sourced from different fulfillment states.
Fulfill (POST /fulfillments/{fulfillment_id}/fulfill)
POST /fulfillments/{fulfillment_id}/fulfill)Each line item may include an optional source_breakdown object with three fields:
| Field | Type | Description |
|---|---|---|
quantity_from_picked | number (double) | Quantity to source from the picked state. |
quantity_from_packed | number (double) | Quantity to source from the packed state. |
quantity_from_not_started | number (double) | Quantity to source from the not-started state. |
When provided, all three fields are required and must sum to the parent quantity.
Pack (POST /fulfillments/{fulfillment_id}/pack)
POST /fulfillments/{fulfillment_id}/pack)Each line item may include an optional source_breakdown object with two fields:
| Field | Type | Description |
|---|---|---|
quantity_from_picked | number (double) | Quantity to source from the picked state. |
quantity_from_not_started | number (double) | Quantity to source from the not-started state. |
When provided, both fields are required and must sum to the parent quantity. Source breakdown is not allowed when the quantity is negative (unpacking).
Schema Corrections
- Fulfill response structure: The
POST /fulfillments/{fulfillment_id}/fulfillresponse schema now correctly wrapsidandversioninside adataobject, matching the actual API behavior and consistent with the pack and pick endpoint response schemas. Clients generated from the previous (incorrect) schema may need to update to read from thedatawrapper.
Inventory
We have redesigned the inventory endpoints to use POST request bodies instead of query parameters, added new response fields, and improved consistency across the API.
Breaking Changes
- POST /inventory (was GET): Now accepts a JSON request body (
InventoryRequest) instead of query parameters. The response returns a flat array ofInventoryobjects instead of a{ data: [...] }wrapper. - POST /inventory_levels (was GET): Now accepts a JSON request body (
InventoryLevelsRequest) instead of a JSON-encodedoptionsquery parameter. The response returns a flat array ofInventoryLevelobjects instead of a{ data: [...] }wrapper. - GET /inventory_levels/{product_id}: The
inactiveparameter (integer0/1) has been renamed toinclude_inactive(boolean). Thetotalsobject has been removed from the response. - Quantity field changes:
inventory_levelandquantityhave been split intocurrent_inventory_levelandquantity_to_procure. In older APIs, stock required for fulfillments and services was represented as negativequantityvalues. In the 2026-04 API, this is now represented as positivequantity_to_procurevalues. This is not a straight renaming — consumers relying on negative values inquantityorinventory_levelmust update their logic.
Updated Endpoints
- POST /inventory: List inventory records. Supports filtering by
product_id,variants,after,before,include_deleted, pagination viasize(max 5000), andsort_direction. - GET /inventory/{product_id}: List inventory records for a single product. Improved
product_idandvariantsparameter descriptions to clarify variant matching behavior. - POST /inventory_levels: List inventory levels. Now supports
group_variantsandto_be_procured_onlyfilters. Theout_of_stock_onlyandgroup_byparameters have been removed.product_idsandroot_product_idsare now documented as mutually exclusive.sizenow has an explicit maximum of 10,000. - GET /inventory_levels/{product_id}: List inventory levels for a single product.
Schema Changes
Inventory
inventory_levelhas been renamed tocurrent_inventory_level.- New fields:
quantity_to_procure,average_cost,deleted_at,version,reorder_target,reorder_method.
InventoryLevel
quantityhas been renamed tocurrent_inventory_level.- New fields:
root_product_id,quantity_to_procure. - Removed:
levelsobject (containingproducibleandon_hand).
Deprecations
- GET /inventory: Deprecated. Please use
POST /inventoryinstead. - GET /inventory_levels: Deprecated. Please use
POST /inventory_levelsinstead.
Gift Cards
New 2026-04 Gift Card and Gift Card Transaction endpoints are now available. These endpoints follow the 2026-04 API conventions while delegating to the same underlying gift card business logic.
New Endpoints
Gift Card Resource
| Method | Path | Scope | Notes |
|---|---|---|---|
POST | /api/2026-04/gift_cards | 🔒 gift_cards:write:issue | Create and activate |
GET | /api/2026-04/gift_cards | 🔒 gift_cards:read | List gift cards |
GET | /api/2026-04/gift_cards/by_number/{card_number} | 🔒 gift_cards:read | Get by number |
GET | /api/2026-04/gift_cards/by_id/{id} | 🔒 gift_cards:read | Get by ID |
DELETE | /api/2026-04/gift_cards/by_number/{card_number} | 🔒 gift_cards:write:issue | Void by number |
DELETE | /api/2026-04/gift_cards/by_id/{id} | 🔒 gift_cards:write:issue | Void by ID |
Gift Card Transaction Resource
| Method | Path | Scope | Notes |
|---|---|---|---|
POST | /api/2026-04/gift_cards/{card_number}/transactions | 🔒 gift_cards:write:redeem | Create transaction |
DELETE | /api/2026-04/gift_cards/transactions/{transaction_id} | 🔒 gift_cards:write:redeem | Reverse redemption |
GET | /api/2026-04/gift_cards/transactions/{transaction_id} | 🔒 gift_cards:read | Supports system_id query param |
Key Changes
- Response structure: All responses return the resource inside a top-level
datakey in the response object. - Monetary values as strings: Fields such as
balance,total_sold,total_redeemed, andamountare now returned as strings for precision. - POST returns 201: Create endpoints now return
201 Createdinstead of200 OK. system_idsupport: The GET gift card by transaction ID endpoint accepts an optionalsystem_idquery parameter (defaults tox-series, also supportse-series).
Updated 7 days ago
