Channel API: retrieve product offers
About this article
This article explains how the GET /v2/products/offers endpoint works via the Channel API, what each field in the response means, how to handle pagination, and how to acknowledge retrieved offers.
Table of contents
Introduction
When building a channel integration, you need a reliable way to fetch the current operational data — pricing, stock, and fulfilment attributes — for every product a merchant has made available to your channel. The GET /v2/products/offers endpoint provides exactly that: a paginated list of product offers containing the transactional values your channel needs to display and enforce at any given moment.
A product offer contains the transactional attributes of a listing: price, stock level, shipping time, discount pricing, and similar fulfilment-related data. This is distinct from product content (titles, descriptions, images, and other catalogue attributes), which is handled by the GET /v2/products/data endpoint.
After retrieving offers, your integration must acknowledge them. This tells ChannelEngine that your channel has successfully processed the batch. Until offers are acknowledged, ChannelEngine will continue to return them on subsequent GET calls.
Overview
Refer to the flowchart below to visualise how product offer data travels between your channel, ChannelEngine, and the merchant.
Requirements
Before calling this endpoint, make sure you have the following in place:
- A valid Channel API key issued for your ChannelEngine integration.
- Your integration registered as a channel on ChannelEngine. A Merchant API key will not work with this endpoint.
- At least one merchant connected to your channel with products in Active status.
- Offer fields configured for your channel via the Channel Management API. These determine which transactional attributes appear in
MappedFields.
Available API endpoints
The product offers workflow uses two endpoints: one to retrieve current offer data and one to acknowledge that your channel has processed it.
-
Retrieve product offers:
GET /v2/products/offers
Returns a paginated list of product offers for your channel, including price, stock, and any additional transactional attributes defined in your channel configuration. -
Acknowledge product offers:
POST /v2/products/offers
Call this endpoint after successfully processing a batch of offers. Pass theChannelProductNovalues of all processed offers in the request body.
Endpoint: retrieve product offers
Use this endpoint to retrieve all current product offers available to your channel.
GET /v2/products/offers
Authenticate by passing your Channel API key in the request header:
X-CE-KEY: your-channel-api-key
apikey query parameter for convenience during testing, but this is not recommended in production. Use the X-CE-KEY header to prevent the key from appearing in server logs or browser history.
Query parameters
All parameters are optional. When none are provided, the first page of all available offers is returned.
| Parameter | Type | Default | Description |
page |
integer | 1 | The page number to return. Use together with ItemsPerPage and TotalCount in the response to paginate through all available offers. |
apikey |
string | — | Your Channel API key. Accepted as a query parameter for convenience, but passing it via the X-CE-KEY header is preferred in production. |
Making the request
- Open your HTTP client - create a new GET request in Postman, curl, or your preferred tool.
-
Set the request URL - use your tenant's base URL followed by the endpoint path:
https://<your-tenant>.channelengine.net/api/v2/products/offers
Replace<your-tenant>with your ChannelEngine tenant name, e.g.demo. - Add the authentication header -
X-CE-KEY: <your-channel-api-key> -
Optionally specify a page - append
?page=1to request a specific page of results.
If omitted, the first page is returned by default. - Send the request - a successful call returns HTTP 200 with a JSON body.
- Acknowledge the offers - after processing the returned offers, call POST /v2/products/offers to confirm receipt. See the section on acknowledging offers below.
Example request
curl -X GET \ "https://demo.channelengine.net/api/v2/products/offers?page=1" \ -H "X-CE-KEY: your-channel-api-key" \ -H "Accept: application/json"
Response structure
A successful request returns HTTP 200 with a JSON body. The response contains a Content array of product offer objects, plus a set of envelope fields for pagination, status, and diagnostics.
{
"Content": [
{
"ChannelProductNo": "CH-98765",
"MerchantProductNo": "SKU-00123",
"Price": 29.99,
"Stock": 142,
"MappedFields": {
"ShippingTime": "2-3 business days", // system name → seller's value
"DiscountPrice": "24.99",
"ShippingCost": "3.95"
}
}
],
"Count": 1,
"TotalCount": 543,
"ItemsPerPage": 100,
"StatusCode": 200,
"RequestId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"LogId": "log-abc123",
"Success": true,
"Message": null,
"ExceptionType": null,
"ValidationErrors": {}
}Offer fields
Each object in the Content array represents a single product offer.
| Field | Type | Description |
ChannelProductNo |
string | Your channel's unique identifier for this product. Use this to match offers back to your existing listings. |
MerchantProductNo |
string | The merchant's own product reference, typically their internal SKU. Useful for cross-referencing with merchant communications. |
Price |
number | The current selling price set by the merchant for this channel. Currency is determined by the channel's configuration on ChannelEngine. |
Stock |
integer | The number of units currently available. A value of 0 means the product is out of stock. |
MappedFields |
object | Additional transactional attributes defined for your channel, such as shipping time, discount price, or shipping cost. See MappedFields below. |
MappedFields
MappedFields contains the offer fields you have defined for your channel via the Channel Management API. These are transactional attributes that go beyond the standard Price and Stock fields — typical examples include shipping time, discount price, shipping cost, or fulfilment method.
Each key is the system name of an offer field as configured in your channel definition. Each value is the corresponding data supplied by the seller for that product.
"MappedFields": {
"ShippingTime": "2-3 business days", // system name: "ShippingTime"
"DiscountPrice": "24.99", // system name: "DiscountPrice"
"ShippingCost": "3.95" // system name: "ShippingCost"
}The system name you define in the Channel Management API is the exact string that appears as the key in MappedFields. Choose system names that are stable and machine-readable (e.g.: ShippingTime, DiscountPrice, ShippingCost), since your integration will reference them directly.
MappedFields contains offer data only — transactional attributes such as pricing, stock conditions, and shipping information. Product content such as titles, descriptions, and images is not part of this endpoint. Retrieve that data via GET /v2/products/data instead.
How MappedFields are populated
- You define offer fields in the Channel Management API - each field has a system name (e.g.
ShippingTime,DiscountPrice) that becomes the key inMappedFields. - Merchants map their product attributes to your fields - from their ChannelEngine account, merchants map values from their catalogue to each of your defined offer fields.
- The merchant's values are returned in MappedFields - when you call
GET /v2/products/offers, each offer includes the merchant's mapped values keyed by your system names.
MappedFields is empty or a specific key is missing for a product, the seller has not yet provided a value for that offer field. Flag affected products for review rather than silently ignoring the gap. Refer to the Channel Management API documentation for guidance on defining and managing offer fields.
Response envelope
Every response includes a set of top-level fields for pagination, status, and diagnostics.
| Field | Type | Description |
Count |
integer | Number of offers returned in this page of results. |
TotalCount |
integer | Total number of offers available across all pages. Use this with ItemsPerPage to calculate how many pages to request. |
ItemsPerPage |
integer | Maximum number of offers returned per page. |
StatusCode |
integer | HTTP status code of the response (e.g. 200 for success). |
RequestId |
string | A unique identifier for this specific API request. Include this in any support tickets so ChannelEngine can trace the call. |
LogId |
string | An internal log reference. Also useful when raising support issues alongside RequestId. |
Success |
boolean | true if the request was processed successfully; false if an error occurred. |
Message |
string | A human-readable message, typically populated when Success is false. null on success. |
ExceptionType |
string | The type of exception thrown, if any. null on success. |
ValidationErrors |
object | A map of field-level validation errors. Each key is a field name; the value is an array of error messages for that field. Empty on success. |
Success field in your integration logic — not just the HTTP status code. In some cases the HTTP response may be 200 while Success is false, indicating a business-logic error. Read Message and ValidationErrors for details.
Pagination
Results are returned in pages. Use the envelope metadata to navigate through all available offers without missing any.
- Make your first request. Call the endpoint without a
pageparameter, or withpage=1. Note theTotalCountandItemsPerPagevalues in the response. For example:TotalCount: 543andItemsPerPage: 100means six pages of results. - Calculate the total page count. Divide
TotalCountbyItemsPerPageand round up:ceil(TotalCount / ItemsPerPage). - Increment through pages. Repeat the request with
page=2,page=3, and so on until all pages have been retrieved. - Stop when complete. Stop when
Countis0or the current page number exceeds the total page count calculated in step 2. -
Acknowledge all retrieved offers. Once you have processed all pages, call
POST /v2/products/offersto acknowledge the batch. See Endpoint: acknowledge product offers below.
Endpoint: acknowledge product offers
After retrieving and processing a batch of offers, your integration must acknowledge them. This tells ChannelEngine that your channel has successfully received the data. Until offers are acknowledged, ChannelEngine will continue to return them on subsequent GET calls.
POST /v2/products/offers
Send the ChannelProductNo values of all processed offers as a JSON array in the request body:
POST /v2/products/offers X-CE-KEY: your-channel-api-key Content-Type: application/json [ "CH-98765", "CH-98766", "CH-98767" ]
GET call, allowing you to retry safely without data loss.
You can acknowledge offers per page rather than waiting until all pages are complete. Acknowledging each page immediately after processing it keeps the queue clear and reduces the risk of reprocessing large batches on failure.
Common issues
| Symptom | Likely cause | Fix |
| 401 Unauthorized | Missing or invalid API key. | Check that the X-CE-KEY header is present and contains a valid Channel API key — not a Merchant API key. |
| 403 Forbidden | The API key does not have access to this channel. | Verify the API key is issued for the correct channel. Contact ChannelEngine Support if the key was recently regenerated. |
200 but Success: false |
A business-logic error occurred. | Read the Message and ValidationErrors fields. Common causes include an inactive channel or misconfigured offer fields. |
Empty Content array |
No offers are available for your channel, or the requested page is beyond the last page. | Confirm at least one merchant has activated products for your channel. Verify the page parameter does not exceed the total page count. |
Same offers reappear on every GET call |
Offers are not being acknowledged after processing. | Call POST /v2/products/offers with the processed ChannelProductNo values after each batch. |
MappedFields is empty or a key is missing |
The seller has not provided a value for that offer field, or the field is not defined in your channel configuration. | Check your offer field definitions in the Channel Management API. If the field is defined, ask the seller to complete their attribute mapping for your channel. |
| 429 Too Many Requests | Rate limit exceeded during bulk retrieval. | Add a minimum delay of 500 ms between paginated requests to stay within ChannelEngine's rate limits. |
Unexpected null values for optional fields |
The seller has not configured those fields for their products. | Handle null gracefully in your mapping logic. Do not treat missing optional fields as errors. |
If you receive an unexpected error, note the RequestId and LogId values from the response and include them when contacting ChannelEngine Support. These references allow the support team to trace your exact request in the system.
Next steps
- Review the Channel Management API documentation to learn how to define and manage offer fields — these control which transactional attributes appear in
MappedFields. - Use
GET /v2/products/datato retrieve product content — titles, descriptions, and images — for creating and updating listings on your channel. - Include the
RequestIdandLogIdvalues from any response when contacting ChannelEngine Support about a specific API call. - You can test API calls against the ChannelEngine demo environment at
demo.channelengine.netbefore pointing your integration at a production tenant.
Comments
0 comments
Article is closed for comments.