Merchant API: offers
About this article
This article explains how to manage offer data — stock and price — via the Merchant API, including how to submit offers with or without stock locations, how to retrieve current stock levels, and how to configure stock buffer and limit settings per channel.
Table of contents
Submitting an offer without stock locations
Submitting offers with multiple stock locations
Updating stock and price together
Retrieving stock from ChannelEngine
- Test 1 — Submit a basic offer
- Test 2 — Create stock locations
- Test 3 — Retrieve stock location IDs
- Test 4 — Submit stock per location
- Sign-off checklist
Introduction
Getting your products live on marketplaces requires two things: product content (name, description, images) and offer data (stock and price). While product content is submitted via the Products endpoints, stock and price are always managed through the Offers endpoints. This separation means you can update commercial data independently from content — and as frequently as your business requires.
This article covers two scenarios: submitting offers when you operate a single warehouse (no stock locations), and submitting offers across multiple warehouses using ChannelEngine's stock location feature.
Overview
Refer to the flowchart below to visualize how offer data travels between your system, ChannelEngine, and connected channels.
Requirements
To use the offers endpoints, you need the following:
- A valid Merchant API key, passed in every request as the
X-CE-KEYheader. - Products already created in ChannelEngine via
POST /v2/products— offer data can only be submitted for existing products. - If you use multiple warehouses: stock locations must be created via
POST /v2/stocklocationsbefore submitting per-location stock.
Available API endpoints
The following endpoints are covered in this article. All endpoints are prefixed with https://api.channelengine.net/api.
-
Update stock and/or price:
PUT /v2/offer
Update stock, price, or both for one or more products in a single call. Applies to the default stock location unless aStockLocationIdis specified. -
Update stock per stock location:
PUT /v2/offer/stock
Update stock across multiple stock locations for one or more products. Each product entry accepts aStockLocationsarray. Does not update price. -
Retrieve submitted stock levels:
GET /v2/offer/stock
Retrieve the stock values you have submitted to ChannelEngine, per product and per stock location. -
Retrieve marketplace fulfillment stock:
GET /v2/fulfillmentstock
Retrieve stock levels held at marketplace fulfillment warehouses (e.g.: Amazon FBA, Zalando ZFS), including a granular breakdown by quantity type. -
Create a stock location:
POST /v2/stocklocations
Register a warehouse, 3PL site, or virtual stock location in ChannelEngine. Required before submitting per-location stock. -
Retrieve stock locations:
GET /v2/stocklocations
Retrieve all stock locations and the IDs assigned to each one, including any marketplace fulfillment locations created automatically by ChannelEngine. -
Retrieve stock buffer and limit settings:
GET /v2/offer/{channelId}/product-level-stock-limitations
Retrieve the current stock buffer and limit settings configured for a specific channel. -
Set stock buffer and limit settings:
POST /v2/offer/{channelId}/product-level-stock-limitations
Create or update stock buffer or limit settings for one or more products on a channel. -
Remove stock buffer and limit settings:
DELETE /v2/offer/{channelId}/product-level-stock-limitations
Remove stock buffer or limit settings for specific products and stock locations on a channel.
Key concepts
Before submitting offers, it helps to understand how ChannelEngine handles stock and price data.
What is an offer?
An offer is the commercial representation of a product — its price and available stock. Offer data is separate from product content and is always submitted through the Offers endpoints, never through the Products endpoints.
What is a stock location?
A stock location is any logical unit of storage you want to track stock for separately in ChannelEngine. This does not have to be a physically different building or warehouse — a stock location can also represent a virtual shelf, a zone in your warehouse management system (WMS), a consignment area, or a bonded section of a single warehouse. If your WMS tracks stock in separate buckets (for example, "available", "quarantine", or "reserved"), each bucket can be modelled as its own stock location in ChannelEngine.
If you ship from a single pool of stock with no logical separation, you can submit offers without specifying a stock location at all — ChannelEngine applies it to the default location automatically.
GET /v2/stocklocations response may include stock locations for marketplace fulfillment programmes (such as Amazon FBA or Zalando ZFS). These are created automatically by ChannelEngine when you connect to those channels. You cannot submit merchant stock to these locations via PUT /v2/offer/stock — those stock levels are updated by the marketplace.
Choosing between endpoints
Use the table below to identify which endpoint fits your scenario.
| Scenario | Use |
| Update stock and price together | PUT /v2/offer |
| Update price only |
PUT /v2/offer (omit Stock) |
| Update stock only, single location |
PUT /v2/offer (omit Price) or PUT /v2/offer/stock
|
| Update stock across multiple locations for one product in one call |
PUT /v2/offer/stock (supports a StockLocations array per product) |
Submitting an offer without stock locations
If you operate a single warehouse, use PUT /v2/offer to update stock and price for one or more products. No stock location setup is required — ChannelEngine applies the values to your default stock location automatically.
You can update stock and price together in a single call, or independently. Send only the fields that have changed — if you send Stock without Price, the price remains unchanged, and vice versa.
Request body fields
| Field | Type | Notes |
MerchantProductNo (required) |
string | Your unique product identifier (SKU). Max 64 characters. |
Stock |
integer | Available quantity. Must not be negative. Omit to leave stock unchanged. |
Price |
decimal | Selling price. Must not be negative. Omit to leave price unchanged. |
StockLocationId |
integer | Optional. If omitted, the default stock location is updated. Only needed if you have multiple stock locations and want to target a specific one. |
Example requests
Update stock and price for a single product:
// PUT /v2/offer — update stock and price
[
{
"MerchantProductNo": "SKU-001",
"Stock": 42,
"Price": 79.99
}
]Update stock only for multiple products:
// PUT /v2/offer — stock update only, bulk
[
{
"MerchantProductNo": "SKU-001",
"Stock": 42
},
{
"MerchantProductNo": "SKU-002",
"Stock": 0
},
{
"MerchantProductNo": "SKU-003",
"Stock": 130
}
]Update price only for a single product:
// PUT /v2/offer — price update only
[
{
"MerchantProductNo": "SKU-001",
"Price": 74.99
}
]PUT /v2/offer call rather than one call per product. Batching reduces API load and ensures ChannelEngine processes your updates consistently. There is no strict limit on the number of products per call, but batches of up to 5,000 are recommended.
Submitting offers with multiple stock locations
If you ship from multiple warehouses, ChannelEngine can track stock per location and aggregate the totals per channel. To set this up, you first create each warehouse as a stock location in ChannelEngine, then submit stock using the stock location IDs.
The setup follows three steps:
- Create each warehouse as a stock location —
POST /v2/stocklocations - Retrieve the IDs assigned to each location —
GET /v2/stocklocations - Submit stock per location using those IDs —
PUT /v2/offer/stock
Step 1 — Create a stock location
Use POST /v2/stocklocations to register each stock location in ChannelEngine — whether it is a physical warehouse, a 3PL site, or a virtual shelf in your WMS. You only need to do this once per location. After creation, use the assigned ID for all future stock updates.
| Field | Type | Notes |
Name (required) |
string | A descriptive name for the warehouse, e.g.: "Warehouse NL" or "3PL Germany". |
IsDefault |
boolean | Set to true to make this the default stock location. Stock submitted without a StockLocationId will be applied here. |
FallBackToDefault |
boolean | When false, ChannelEngine only uses marketplace fulfillment for this location (e.g.: FBA). When true, merchant fulfillment is also used as a fallback. |
PhoneNumber |
string | Optional contact number for the warehouse. |
Address.CountryIso |
string | Two-letter ISO country code, e.g.: NL, DE, FR. |
Address.StreetName |
string | |
Address.ZipCode |
string | |
Address.HouseNr |
string | |
Address.HouseNrAddition |
string | Optional, e.g.: "B" or "Unit 3". |
Address.City |
string | |
Address.Region |
string | Optional province or state. |
Example request — create a warehouse:
// POST /v2/stocklocations
{
"Name": "Warehouse NL",
"IsDefault": true,
"PhoneNumber": "+31201234567",
"Address": {
"CountryIso": "NL",
"StreetName": "Keizersgracht",
"ZipCode": "1015 CJ",
"HouseNr": "424",
"City": "Amsterdam"
}
}IsDefault: true). If you have multiple locations, mark your primary warehouse as default. Stock submitted without a StockLocationId always goes to the default location.
Step 2 — Retrieve the stock location ID
After creating your stock locations, call GET /v2/stocklocations to retrieve the IDs that ChannelEngine has assigned to each one. These IDs are required when submitting stock per location in step 3.
// GET /v2/stocklocations — example response
{
"Content": [
{
"Id": 12,
"Name": "Warehouse NL",
"CountryIso": "NL"
},
{
"Id": 15,
"Name": "3PL Germany",
"CountryIso": "DE"
},
{
"Id": 21,
"Name": "Amazon FBA EU",
"CountryIso": "DE"
}
],
"Count": 3,
"TotalCount": 3,
"Success": true
}GET /v2/stocklocations on every stock update. Only call it again if you add new locations.
Step 3 — Submit the offer per stock location
Use PUT /v2/offer/stock to submit stock for one or more products across multiple locations. Each product entry contains a StockLocations array — one entry per warehouse. You can update all locations for a product in a single call.
| Field | Type | Notes |
MerchantProductNo (required) |
string | Your unique product identifier (SKU). |
StockLocations (required) |
array | Array of stock location entries. Include one entry per location you want to update. |
StockLocations[].StockLocationId |
integer | The ChannelEngine ID of the stock location. If omitted, the default stock location is used. |
StockLocations[].Stock |
integer | Available quantity at this location. Must not be negative. |
Update stock for a single product across two locations:
// PUT /v2/offer/stock — submit stock per location
[
{
"MerchantProductNo": "SKU-001",
"StockLocations": [
{
"StockLocationId": 12,
"Stock": 80
},
{
"StockLocationId": 15,
"Stock": 35
}
]
}
]Update stock for multiple products across multiple locations in one call:
// PUT /v2/offer/stock — bulk multi-location stock update
[
{
"MerchantProductNo": "SKU-001",
"StockLocations": [
{ "StockLocationId": 12, "Stock": 80 },
{ "StockLocationId": 15, "Stock": 35 }
]
},
{
"MerchantProductNo": "SKU-002",
"StockLocations": [
{ "StockLocationId": 12, "Stock": 20 },
{ "StockLocationId": 15, "Stock": 0 }
]
}
]PUT /v2/offer/stock updates stock only. Price is not part of this endpoint. To update price alongside a multi-location stock update, send a separate PUT /v2/offer call with the price change.
Updating stock and price together
PUT /v2/offer is the endpoint for updating both stock and price in a single call. It supports stock locations too — by including StockLocationId in the request, you can target a specific location while also setting a price. This makes it the most flexible offer endpoint: it covers single-warehouse sellers, multi-location sellers, and any combination of stock-only or price-only updates.
| Field | Type | Notes |
MerchantProductNo (required) |
string | Your unique product identifier (SKU). Max 64 characters. |
Stock |
integer | Available quantity. Must not be negative. Omit to leave stock unchanged. |
Price |
decimal | Selling price. Must not be negative. Omit to leave price unchanged. |
StockLocationId |
integer | The ChannelEngine ID of the stock location to update stock for. If omitted, the default stock location is used. Note: price is not tied to a stock location — it applies across all channels regardless of which location is specified. |
StockLocationId in a PUT /v2/offer call, the Stock value is applied to that specific location. However, Price is a global offer value — it is not tied to a stock location. If you update price and stock together in a call that targets location ID 15, the stock is updated at location 15 but the price update applies across the board.
Update stock at a specific location and price in one call:
// PUT /v2/offer — update stock at location 15 and set a new price
[
{
"MerchantProductNo": "SKU-001",
"Stock": 60,
"Price": 74.99,
"StockLocationId": 15
}
]Update stock at multiple locations and price for multiple products in one call:
// PUT /v2/offer — mixed bulk: different locations per product, plus price
[
{
"MerchantProductNo": "SKU-001",
"Stock": 80,
"Price": 74.99,
"StockLocationId": 12
},
{
"MerchantProductNo": "SKU-001",
"Stock": 35,
"StockLocationId": 15
},
{
"MerchantProductNo": "SKU-002",
"Stock": 20,
"Price": 39.99,
"StockLocationId": 12
}
]Retrieving stock from ChannelEngine
ChannelEngine provides two endpoints for reading stock data, depending on whether you want to check your own submitted stock levels or the stock held at a marketplace fulfillment warehouse.
GET /v2/offer/stock — your submitted stock levels
Use GET /v2/offer/stock to verify the stock values you have submitted to ChannelEngine — per product and per stock location. The response shows the stock value stored at each location along with the timestamp of the last update.
Query parameters
| Parameter | Type | Description |
Skus |
array | Filter by one or more of your product SKUs (MerchantProductNo). If omitted, all products are returned. |
StockLocationIds |
array | Filter by one or more stock location IDs. Use this to check stock at a specific warehouse or virtual shelf. |
PageIndex |
integer | Page number, starting from 0. |
PageSize |
integer | Number of items per page. Default is 100. |
Response fields
| Field | Description |
MerchantProductNo |
The product SKU. |
StockLocationId |
The ChannelEngine ID of the stock location. |
Stock |
The quantity stored at this location. |
UpdatedAt |
Timestamp of the last stock update for this location. |
// GET /v2/offer/stock?Skus=SKU-001,SKU-002&StockLocationIds=12,15
// Example response
{
"Content": [
{
"MerchantProductNo": "SKU-001",
"StockLocationId": 12,
"Stock": 80,
"UpdatedAt": "2026-08-07T09:14:00Z"
},
{
"MerchantProductNo": "SKU-001",
"StockLocationId": 15,
"Stock": 35,
"UpdatedAt": "2026-08-07T09:14:00Z"
}
],
"Success": true
}PUT /v2/offer or PUT /v2/offer/stock, check the response payload directly. A 200 response with Success: true confirms the update was processed correctly — you do not need to re-fetch the stock level to verify it. Use GET /v2/offer/stock for auditing, reconciliation, or troubleshooting, not as a routine step after every update.
GET /v2/fulfillmentstock — marketplace fulfillment warehouse stock
When you activate a Fulfillment by Channel programme — such as Amazon FBA or Zalando ZFS — ChannelEngine automatically creates a dedicated stock location for that marketplace warehouse. ChannelEngine then imports the stock levels from the marketplace's warehouse directly into this location. Use GET /v2/fulfillmentstock to read these imported stock levels, broken down into granular quantity types such as available, reserved, in transit, damaged, and more.
To find the stock location ID for a marketplace warehouse, call GET /v2/stocklocations and look for locations with names matching the marketplace (e.g.: "Amazon FBA EU"). The Id returned is what you pass to filter this endpoint.
UpdatedAt timestamp in the response to confirm how recent the data is before making replenishment decisions.
Query parameters
| Parameter | Type | Description |
MerchantProductNos |
array | Filter by one or more product SKUs. If omitted, all products are returned. |
PageIndex |
integer | Page number, starting from 0. |
PageSize |
integer | Number of items per page. Default is 100. |
Response fields — stock quantity breakdown
Unlike GET /v2/offer/stock, the fulfillment stock response returns a StockLocations array per product — one entry per marketplace warehouse — each containing a granular breakdown of how that stock is classified at the fulfillment centre.
| Field | Description |
MerchantProductNo |
The product SKU. |
StockLocations[].Id |
The ChannelEngine ID of the stock location (marketplace warehouse). |
StockLocations[].Name |
The ChannelEngine name of the stock location. |
StockLocations[].AvailableQuantity |
Units available for fulfillment orders. This is the primary value to use for replenishment decisions. |
StockLocations[].ReservedQuantity |
Units reserved for pending orders — not yet shipped but committed. |
StockLocations[].AllocatedQuantity |
Units allocated to a customer order but not yet fulfilled. |
StockLocations[].InTransitQuantity |
Units currently in transit to the fulfillment warehouse (e.g.: an active inbound shipment). |
StockLocations[].InboundQuantity |
Total units in an inbound shipment from you to the fulfillment warehouse. |
StockLocations[].FulfillmentCenterProcessingQuantity |
Units received at the warehouse but still being processed and not yet available. |
StockLocations[].DefectiveQuantity |
Units in defective disposition. |
StockLocations[].ExpiredQuantity |
Units in expired disposition. |
StockLocations[].WarehouseDamagedQuantity |
Units damaged at the fulfillment warehouse. |
StockLocations[].CustomerDamagedQuantity |
Units damaged by a customer (returned in damaged condition). |
StockLocations[].CarrierDamagedQuantity |
Units damaged in transit by a carrier. |
StockLocations[].PendingPickupQuantity |
Units awaiting pickup. |
StockLocations[].ReturnQuantity |
Units currently in an ongoing return process. |
StockLocations[].ResearchingQuantity |
Units under investigation (e.g.: lost units being researched by the marketplace). |
StockLocations[].UpdatedAt |
Timestamp of the last stock import from the marketplace. |
// GET /v2/fulfillmentstock?MerchantProductNos=SKU-001
// Example response — FBA stock breakdown for SKU-001
{
"Content": [
{
"MerchantProductNo": "SKU-001",
"StockLocations": [
{
"Id": 21,
"Name": "Amazon FBA EU",
"AvailableQuantity": 340,
"ReservedQuantity": 12,
"InTransitQuantity": 200,
"InboundQuantity": 200,
"FulfillmentCenterProcessingQuantity": 8,
"DefectiveQuantity": 2,
"ExpiredQuantity": 0,
"WarehouseDamagedQuantity": 1,
"CustomerDamagedQuantity": 3,
"CarrierDamagedQuantity": 0,
"ReturnQuantity": 5,
"ResearchingQuantity": 0,
"UpdatedAt": "2026-08-07T06:30:00Z"
}
]
}
],
"Success": true
}Replenishment workflow example
A common use case is to build a replenishment alert or automated trigger based on fulfillment stock data. The recommended approach is:
- Find the stock location ID for the marketplace warehouse by calling
GET /v2/stocklocationsand identifying the entry for your fulfillment programme (e.g.: "Amazon FBA EU"). Note itsId. - Call
GET /v2/fulfillmentstockon a schedule (daily or more frequently). Filter by the SKUs you want to monitor. - Read
AvailableQuantityfor the relevant stock location ID in each product'sStockLocationsarray. This is the sellable stock the marketplace currently holds for you. - Compare against your reorder threshold. If
AvailableQuantityplusInTransitQuantity(stock already on its way) falls below your threshold, flag the product for replenishment and initiate a new inbound shipment to the marketplace warehouse.
Stock buffer and stock limit
ChannelEngine lets you apply two types of stock controls at the product level per channel: a stock buffer and a stock limit. Both affect how much stock ChannelEngine exports to a channel — without changing the actual stock value in your system. These settings are channel-specific and product-level — they apply to a specific channel and can vary per stock location within that channel. They do not affect your actual stock values or what other channels see.
Stock buffer
A fixed number of units to subtract from the exported stock. ChannelEngine deducts the buffer from your available stock before sending it to the channel. For example: you have 50 units in stock and a buffer of 10 — the channel sees 40 units. Use this to protect against overselling by keeping a safety reserve that channels cannot deplete.
Stock limit
A maximum number of units that can ever be exported to a channel, regardless of how much stock you actually have. For example: you have 500 units in stock and a limit of 20 — the channel sees 20 units at most. Use this to control how much exposure a channel gets — for example, capping a new marketplace while you test performance.
StockBuffer or a StockLimit — not both at the same time. If you send both, the request will fail. The channelId path parameter is the ChannelEngine ID of the channel you want to configure. You can find it in the ChannelEngine UI under Channels → [Channel name] in the URL, or by calling the Channels API.
Setting a stock buffer or limit
Use POST /v2/offer/{channelId}/product-level-stock-limitations to create or update settings. The body accepts an array of products, each with one or more stock location entries.
| Field | Type | Notes |
ProductsStockLimitations[].MerchantProductNo (required) |
string | Your product SKU. |
ProductsStockLimitations[].ProductLocationsStockLimitations (required) |
array | At least one entry required. Each entry sets a buffer or limit for a specific stock location. |
ProductLocationsStockLimitations[].StockBuffer |
integer | Units to subtract from exported stock. Null or positive. Required if StockLimit is null. |
ProductLocationsStockLimitations[].StockLimit |
integer | Maximum units to export to the channel. Null or positive. Required if StockBuffer is null. |
ProductLocationsStockLimitations[].StockLocationId |
integer | The stock location this setting applies to. If omitted, the default stock location is used. |
Set a stock buffer of 5 units for two products on a channel:
// POST /v2/offer/42/product-level-stock-limitations
// Channel ID 42, default stock location, buffer of 5 units
{
"ProductsStockLimitations": [
{
"MerchantProductNo": "SKU-001",
"ProductLocationsStockLimitations": [
{
"StockBuffer": 5,
"StockLimit": null
}
]
},
{
"MerchantProductNo": "SKU-002",
"ProductLocationsStockLimitations": [
{
"StockBuffer": 5,
"StockLimit": null
}
]
}
]
}Set a stock limit per stock location for one product:
// POST /v2/offer/42/product-level-stock-limitations
// Limit of 20 units at location 12, limit of 10 at location 15
{
"ProductsStockLimitations": [
{
"MerchantProductNo": "SKU-001",
"ProductLocationsStockLimitations": [
{
"StockBuffer": null,
"StockLimit": 20,
"StockLocationId": 12
},
{
"StockBuffer": null,
"StockLimit": 10,
"StockLocationId": 15
}
]
}
]
}Retrieving current settings
Use GET /v2/offer/{channelId}/product-level-stock-limitations to see what buffer and limit settings are currently active for a channel. Use the Page query parameter to paginate through results. Each product in the response contains a ProductLocationsLimitations array showing the StockBuffer and StockLimit per stock location.
// GET /v2/offer/42/product-level-stock-limitations — example response
{
"Content": [
{
"MerchantProductNo": "SKU-001",
"ProductLocationsLimitations": [
{
"StockLocationId": 12,
"StockBuffer": null,
"StockLimit": 20
}
]
}
],
"Success": true
}Removing settings
Use DELETE /v2/offer/{channelId}/product-level-stock-limitations to remove stock buffer or limit settings for specific products and stock locations. Once removed, ChannelEngine exports the full stock value to the channel with no restriction applied.
// DELETE /v2/offer/42/product-level-stock-limitations
// Remove limitations for SKU-001 at locations 12 and 15
{
"ProductLocations": [
{
"MerchantProductNo": "SKU-001",
"StockLocationIds": [12, 15]
}
]
}Common issues
| Issue | Likely cause | Resolution |
Stock update returns Success: false
|
The MerchantProductNo does not match any product in ChannelEngine. |
Confirm the product exists by calling GET /v2/products. Create it via POST /v2/products if missing. |
| Stock not visible on channel after update | Stock submitted to a non-default location that is not mapped to the channel, or the channel's stock aggregation settings exclude that location. | Check channel stock location mapping in the ChannelEngine UI. Confirm the correct location ID is being used. |
| Stock buffer/limit POST fails |
StockBuffer and StockLimit are both set to a non-null value in the same entry. |
Set exactly one of StockBuffer or StockLimit per entry. Set the other to null. |
Marketplace fulfillment stock not appearing in GET /v2/fulfillmentstock
|
The fulfillment programme has not yet been activated, or ChannelEngine has not yet imported the stock from the marketplace. | Check the UpdatedAt field in the response. Confirm the channel is active and the fulfillment programme is enabled in the ChannelEngine UI. |
| Per-location stock update applies to the wrong location |
StockLocationId omitted — update defaults to the primary location. |
Call GET /v2/stocklocations to retrieve and confirm the correct ID for each warehouse, then include it in the request. |
Onboarding test script
Run through these tests before going live to confirm that your offer integration is working end-to-end. Work through them in order and share your results with your ChannelEngine implementation contact before sign-off.
Test 1 — Submit a basic offer (no stock locations)
Goal: confirm that stock and price can be submitted for a product using the default endpoint.
- Ensure a test product exists in ChannelEngine (created via
POST /v2/products). Note itsMerchantProductNo. - Call
PUT /v2/offerwith a stock and price value for your test product. Expected result: HTTP 200,Success: true. - Check the response payload. A
200response withSuccess: trueconfirms the update was processed. You do not need to re-fetch the stock level — the response is the source of truth for whether the update landed correctly. Expected result: HTTP 200,Success: true, no errors in the response body. - Submit a price-only update by calling
PUT /v2/offerwith onlyMerchantProductNoandPrice— noStockfield. Expected result: HTTP 200, stock is unchanged, only the price is updated.
Test 2 — Create stock locations
Goal: confirm that your warehouses can be created as stock locations in ChannelEngine.
- Call
POST /v2/stocklocationsfor your first warehouse. SetIsDefault: trueand include a clear name (e.g.: "Warehouse NL"). Expected result: HTTP 200,Success: true. - Repeat for any additional warehouses. Set
IsDefault: falsefor all non-primary locations. Expected result: HTTP 200 for each call.
Test 3 — Retrieve stock location IDs
Goal: confirm that you can retrieve the IDs assigned to your stock locations.
- Call
GET /v2/stocklocationsand inspect the response. Expected result: your warehouses appear in theContentarray with uniqueIdvalues. Any marketplace fulfilment locations (FBA, ZFS, etc.) also appear. - Note the
Idvalues for each of your merchant warehouses and store them in your integration configuration.
Test 4 — Submit stock per location
Goal: confirm that stock can be submitted per warehouse using the location IDs retrieved in Test 3.
- Call
PUT /v2/offer/stockfor one test product. Include aStockLocationsarray with an entry for each of your warehouses, using the IDs from Test 3. Expected result: HTTP 200,Success: true. - Verify using
GET /v2/offer/stock— filter by your test SKU and the stock location IDs. Expected result: stock at each location matches what you submitted, and the aggregated total across locations is correct. - Confirm on ChannelEngine — navigate to the product's offer details and verify the stock per warehouse is displayed correctly. Expected result: each warehouse shows the stock value you submitted.
Sign-off checklist
Before going live, confirm all of the following with your ChannelEngine implementation contact:
- Stock and price are submitted via
PUT /v2/offerorPUT /v2/offer/stock— not via the Products endpoints. - Offer updates are batched — multiple products are sent in a single call, not one call per product.
- A basic offer (stock and price) has been successfully submitted and verified via
GET /v2/offer/stock. - If applicable: all warehouses have been created as stock locations with unique names.
- If applicable: exactly one stock location is set as the default.
- If applicable: stock location IDs are stored in your integration — not fetched on every stock update.
- If applicable: per-location stock has been submitted and verified. The aggregated total across locations is correct.
- If applicable: price updates are sent separately via
PUT /v2/offerwhen usingPUT /v2/offer/stockfor stock.
Next steps
- Managing products via the Merchant API — submit product content, hierarchies, and bundles.
- Freezing a product — temporarily set stock to 0 across all channels using the freeze mechanism.
- Channel mapping and offer settings — configure how offer data maps to individual channel requirements.
- Authentication and rate limits — Merchant API key setup and request throttling.
Comments
0 comments
Article is closed for comments.