Channel API: returns
About this article
This article covers how to call GET /v2/returns/channel and POST /v2/returns/channel — which parameters to use, how to read the response, and how to handle the full returns flow.
Table of contents
Introduction
When a buyer sends a product back, your channel integration needs to both communicate that return to ChannelEngine and stay in sync with how merchants are processing it. The returns endpoints give you two complementary operations: retrieving returns that ChannelEngine already knows about, and submitting new returns that originate on your platform.
Overview
Refer to the flowchart below to visualize how returns travel between your channel, ChannelEngine, and the merchant.
Requirements
- Channel API key - pass it as a request header:
X-CE-KEY: {your-key}. Find it on a given channel at Setup, General, API key. - Existing orders - returns are always linked to an order. The order referenced in a return must already exist on ChannelEngine before you can submit or retrieve returns for it.
- Pagination handling - results are capped at 100 per page. Your integration needs to handle multi-page responses. See Pagination.
Available API endpoints
The returns resource supports two operations:
-
Retrieve returns:
GET /v2/returns/channel
Poll for all new and updated returns since a given date. -
Submit a return:
POST /v2/returns/channel
Notify ChannelEngine when a buyer initiates a return on your marketplace.
Endpoint: retrieve merchant returns
- Retrieve returns created by the merchant:
GET /v2/returns/channel
Use this endpoint to retrieve returns registered on ChannelEngine for your channel. Call it on a regular schedule — every 15 to 30 minutes is typical — to pick up new returns and merchant status updates, then reflect those changes on your platform.
Making the request
Send a GET request to the returns endpoint, passing your Channel API key in the request header. All query parameters are optional filters:
GET https://{tenant}.channelengine.net/api/v2/returns/channel
X-CE-KEY: {your-channel-api-key}A practical example using cURL — fetching all returns created since 1 January 2026:
curl -X GET \ "https://demo.channelengine.net/api/v2/returns/channel?createdSince=2026-01-01T00:00:00Z&page=1" \ -H "X-CE-KEY: your-channel-api-key" \ -H "Accept: application/json"
createdSince in production. Without it, the endpoint returns every return ever created for your channel. Pass the timestamp of your last successful sync on each run so you only retrieve what is new.
Query parameters
| Parameter | Type | Required | Purpose | Description |
createdSince |
ISO 8601 | Optional | Incremental polling | Return only returns created on or after this date and time. Strongly recommended in production as your polling cursor. |
channelOrderNos |
array[string] | Optional | Order lookup | Filter to specific orders by your channel's order reference numbers. |
merchantOrderNos |
array[string] | Optional | Order lookup | Filter to specific orders by the merchant's order reference numbers. |
channelReturnNos |
array[string] | Optional | Return lookup | Filter to specific returns by your channel's return reference numbers. |
statuses |
array[string] | Optional | Status filter | Filter by return status. Values: IN_PROGRESS, COMPLETE, EXPECTED. |
reasons |
array[string] | Optional | Reason filter | Filter by return reason. See the Reason field in Return fields for the full list. |
page |
integer | Optional | Pagination | The page to retrieve. Starts at 1. Use with TotalCount and ItemsPerPage to determine pages to fetch. |
Response structure
A successful call returns HTTP 200 with a JSON body. Returns are wrapped in the standard ChannelEngine response envelope.
Return response envelope
{
"Content": [ /* array of return objects */ ],
"Count": 2, // number of returns on this page
"TotalCount": 38, // total matching returns across all pages
"ItemsPerPage": 100, // maximum items per page
"StatusCode": 200,
"Success": true
}An example return object from the Content array:
{
"Id": 10042,
"ChannelReturnNo": "RETURN-98765",
"ChannelOrderNo": "ORDER-12345",
"MerchantOrderNo": "MERCH-ORD-001",
"CreatedAt": "2026-05-10T08:32:00Z",
"UpdatedAt": "2026-05-11T14:00:00Z",
"ReturnDate": "2026-05-13T00:00:00Z",
"Reason": "PRODUCT_DEFECT",
"CustomerComment": "Item arrived broken.",
"MerchantComment": null,
"Method": "PostNL",
"TrackTraceNo": "3SRETURN12345",
"TrackTraceUrl": "https://tracking.postnl.nl/track?barcode=3SRETURN12345",
"RefundInclVat": 29.99,
"RefundExclVat": 24.79,
"ExtraData": {},
"Lines": [ /* see return line fields below */ ]
}Return fields
| Field | Type | Description |
Id |
integer | ChannelEngine's internal identifier for this return. |
ChannelReturnNo |
string | Your channel's reference number for this return — the value you submitted as ChannelReference when creating it via POST. |
ChannelOrderNo |
string | Your channel's reference number for the original order this return is linked to. |
MerchantOrderNo |
string | The merchant's reference number for the original order. |
CreatedAt |
datetime | When the return was created on ChannelEngine. Use this as your createdSince cursor when polling for new returns. |
UpdatedAt |
datetime | When the return was last modified — for example, when a merchant adds a comment or updates the accepted quantity. |
ReturnDate |
datetime | The date the physical return was or is expected to be received by the merchant. |
Reason |
enum | The reason for the return. Values: PRODUCT_DEFECT, WRONG_PRODUCT, WRONG_SIZE, NOT_AS_DESCRIBED, BUYER_CHANGED_MIND, DAMAGED_DURING_SHIPPING, OTHER. |
CustomerComment |
string | Free-text comment provided by the buyer explaining the return. |
MerchantComment |
string | Free-text comment added by the merchant when processing the return. |
Method |
string | The return shipping method used by the buyer (e.g. a carrier name or return method identifier). |
TrackTraceNo |
string | Tracking number for the return shipment. |
TrackTraceUrl |
string | Direct link to the carrier's tracking page. Surface this to buyers so they can follow their return. |
RefundInclVat |
decimal | Total refund amount including VAT, in the order's currency. |
RefundExclVat |
decimal | Total refund amount excluding VAT, in the order's currency. |
Lines |
array | The individual product lines included in this return. See Return line fields. |
ExtraData |
object | Free-form key-value map for any channel-specific or custom data associated with this return. |
Return line fields
Each entry in Lines represents a single product line being returned. It includes product references, quantities, and a nested OrderLine object with the full detail of the original order line.
{
"ChannelProductNo": "CHAN-SKU-001",
"MerchantProductNo": "MERCH-SKU-001",
"Quantity": 1,
"AcceptedQuantity": 1,
"RejectedQuantity": 0,
"ShipmentStatus": "SHIPPED",
"ExtraData": {},
"OrderLine": {
"Status": "IN_PROGRESS",
"Quantity": 1,
"UnitPriceInclVat": 29.99,
"UnitVat": 5.20
}
}Top-level line fields
| Field | Type | Description |
ChannelProductNo |
string | Your channel's product identifier for the item being returned. |
MerchantProductNo |
string | The merchant's SKU for the item being returned. |
Quantity |
integer | Total quantity of this product included in the return. |
AcceptedQuantity |
integer | Quantity accepted by the merchant after inspection. Use this to trigger refunds on your side. |
RejectedQuantity |
integer | Quantity rejected by the merchant (e.g. due to damage or policy non-compliance). |
ShipmentStatus |
enum | Current shipment status of the returned item. Values: SHIPPED, IN_TRANSIT, DELIVERED. |
ExtraData |
object | Free-form key-value map for any additional line-level data. |
OrderLine |
object | Full detail of the original order line this return is linked to. See OrderLine fields below. |
OrderLine fields
| Field | Type | Description |
Status |
enum | Current status of the original order line (e.g. IN_PROGRESS, SHIPPED, CLOSED). |
IsFulfillmentByMarketplace |
boolean | true if fulfilled by the marketplace (e.g. FBA), false if fulfilled by the merchant. |
Gtin |
string | Global Trade Item Number — a barcode identifier such as an EAN or UPC. |
Description |
string | Product title or description as it appeared on the original order. |
Quantity |
integer | Total quantity ordered on the original order line. |
CancellationRequestedQuantity |
integer | Quantity for which a cancelation has been requested on this line. |
UnitPriceInclVat |
decimal | Unit price paid by the buyer, including VAT. |
UnitVat |
decimal | VAT amount per unit. |
LineTotalInclVat |
decimal | Total line value including VAT (unit price × quantity). |
LineVat |
decimal | Total VAT amount for the line. |
OriginalUnitPriceInclVat |
decimal | Original unit price before any discounts, including VAT. |
OriginalUnitVat |
decimal | VAT on the original unit price. |
OriginalLineTotalInclVat |
decimal | Original line total before discounts, including VAT. |
OriginalLineVat |
decimal | VAT on the original line total. |
FeeFixed |
decimal | Fixed marketplace commission fee applied to this line. |
FeeRate |
decimal | Percentage-based commission rate applied to this line. |
Condition |
enum | Product condition: NEW, NEW_REFURBISHED, USED_AS_NEW, USED_GOOD, USED_REASONABLE. |
ExactDeliveryDate |
datetime | Confirmed delivery date, if known. |
ExpectedDeliveryDate |
datetime | Estimated delivery date at time of ordering. |
LatestDeliveryDate |
datetime | Latest acceptable delivery date. |
ExactShipmentDate |
datetime | Confirmed shipment date, if known. |
ExpectedShipmentDate |
datetime | Estimated shipment date. |
LatestShipmentDate |
datetime | Latest acceptable shipment date. |
ShippingMethod |
string | Carrier or shipping method used to deliver the original order. |
ShippingServiceLevel |
string | Service level (e.g. STANDARD, EXPRESS). |
BundleProductMerchantProductNo |
string | Merchant product number of the parent bundle, if this line is part of a product bundle. |
ChannelProductNo |
string | Channel product reference, echoed from the original order line. |
MerchantProductNo |
string | Merchant product reference, echoed from the original order line. |
Response envelope fields
| Field | Type | Description |
Count |
integer | Number of returns on this page. |
TotalCount |
integer | Total number of returns matching your filters across all pages. |
ItemsPerPage |
integer | Maximum number of items returned per page (up to 100). |
StatusCode |
integer | HTTP-equivalent status code within the response body (normally 200). |
RequestId |
string | Unique identifier for this API call. Include this in any support request. |
LogId |
string | Internal ChannelEngine log reference. Useful when contacting support alongside RequestId. |
Success |
boolean | true when the request completed without errors. |
Message |
string | Human-readable message, usually empty on success. |
ExceptionType |
string | Machine-readable error classification when Success is false. |
ValidationErrors |
object | Field-level validation errors keyed by field name. Only populated when the request was malformed. |
Success field in your integration — not just the HTTP status code. In some cases the HTTP response may return 200 while Success is false, indicating a business-logic error. Read Message and ValidationErrors for details.
Pagination
The endpoint returns a maximum of 100 returns per page. If there are more results, request additional pages using the page parameter.
- Make your first request without a
pageparameter. Defaults to page 1. CheckTotalCountin the response. - Calculate the total number of pages. Divide
TotalCountbyItemsPerPage(100) and round up. Example: 250 total returns ÷ 100 = 3 pages. - Request each subsequent page. Increment the
pageparameter with each call until all pages are retrieved.
# Page 1 — also gives you TotalCount GET /v2/returns/channel?createdSince=2026-01-01T00:00:00Z&page=1 # Page 2 GET /v2/returns/channel?createdSince=2026-01-01T00:00:00Z&page=2
Endpoint: post buyer returns
- Send buyer returns to ChannelEngine:
POST /v2/returns/channel
Use this endpoint to submit a new return to ChannelEngine. Call it when a buyer initiates a return on your marketplace and you need to notify the merchant via ChannelEngine. You must identify both the original order and the specific product lines being returned.
Making the request
Send a POST request with a JSON body. Pass your Channel API key in the request header:
curl -X POST \
"https://demo.channelengine.net/api/v2/returns/channel" \
-H "X-CE-KEY: your-channel-api-key" \
-H "Content-Type: application/json" \
-d '{
"ChannelOrderNo": "ORDER-12345",
"ChannelReference": "RETURN-98765",
"Reason": "PRODUCT_DEFECT",
"CustomerComment": "Item arrived broken.",
"Lines": [
{
"ChannelProductNo": "CHAN-SKU-001",
"Quantity": 1
}
]
}'Request body fields
ChannelOrderNo or MerchantOrderNo to identify the order. If you use MerchantOrderNo, set KeyIsMerchantOrderNo to true so ChannelEngine looks up the order by the correct key.
| Field | Type | Required | Description |
ChannelOrderNo |
string | Required* | Your channel's order reference. Required unless MerchantOrderNo is provided instead. |
MerchantOrderNo |
string | Required* | The merchant's order reference. Use together with KeyIsMerchantOrderNo: true. |
ChannelReference |
string | Optional | Your channel's own reference number for this return. Stored as ChannelReturnNo and returned in GET responses. |
KeyIsMerchantOrderNo |
boolean | Optional | Set to true when identifying the order by MerchantOrderNo. Defaults to false. |
KeyIsMerchantProductNo |
boolean | Optional | Set to true when identifying products by MerchantProductNo. Defaults to false. |
Reason |
enum | Optional | The reason for the return. Values: PRODUCT_DEFECT, WRONG_PRODUCT, WRONG_SIZE, NOT_AS_DESCRIBED, BUYER_CHANGED_MIND, DAMAGED_DURING_SHIPPING, OTHER. |
CustomerComment |
string | Optional | Free-text comment from the buyer explaining the return. |
MerchantComment |
string | Optional | Internal comment for the merchant. Can be set at creation time if already known. |
Status |
enum | Optional | Initial status of the return. Values: IN_PROGRESS, COMPLETE, EXPECTED. Defaults to IN_PROGRESS. |
Method |
string | Optional | The return shipping method the buyer is using. |
TrackTraceNo |
string | Optional | Tracking number for the return shipment, if known at submission time. |
TrackTraceUrl |
string | Optional | Tracking URL for the return shipment. |
RefundInclVat |
decimal | Optional | Total refund amount including VAT, in the order's currency. |
RefundExclVat |
decimal | Optional | Total refund amount excluding VAT, in the order's currency. |
ReturnDate |
ISO 8601 | Optional | The date the return was or is expected to be received by the merchant. |
Lines |
array | Required | The product lines included in this return. At least one line is required. See Line fields. |
ExtraData |
object | Optional | Free-form key-value map for any channel-specific metadata to attach to this return. |
Line fields
Each object in the Lines array identifies a product line being returned and the quantity involved.
| Field | Type | Required | Description |
ChannelProductNo |
string | Required* | Your channel's product identifier. Required unless MerchantProductNo is used with KeyIsMerchantProductNo: true on the parent object. |
MerchantProductNo |
string | Required* | The merchant's product identifier (SKU). Use when KeyIsMerchantProductNo is true on the parent object. |
Quantity |
integer | Required | Number of units being returned. Must be greater than 0 and cannot exceed the originally ordered quantity. |
ExtraData |
object | Optional | Free-form key-value map for channel-specific metadata on this return line. |
Response
A successful submission returns HTTP 200 with Success: true in the response body. No Content array is returned — only the standard envelope fields. The return is now registered on ChannelEngine and the merchant will be notified.
200 OK HTTP status does not guarantee the return was accepted. Always check Success in the response body. If Success is false, read Message and ValidationErrors for the specific failure reason before retrying.
Common issues
| HTTP status / scenario | Likely cause | How to fix |
401 Unauthorized |
API key is missing, incorrect, or belongs to the Merchant API instead of the Channel API. | Check the X-CE-KEY header. Make sure you are using a Channel API key, not a Merchant API key. |
200, Success: false on POST |
The order or product referenced does not exist, or a required field is missing or invalid. | Check ValidationErrors in the response body. Verify that the order exists on ChannelEngine before submitting the return. |
200, empty Content on GET |
No returns match the applied filters, or no returns have been created for your channel yet. | Widen the createdSince range or remove filters. Confirm that returns exist at Orders, Returns. |
OrderLine null or empty |
The original order line has been archived or the order is in a terminal state. | Build your integration to handle null values on any OrderLine field. |
429 Too Many Requests |
Rate limit reached. | Read the X-Rate-Limit-Reset header and back off until that time before retrying. |
500 Server Error |
Unexpected error on ChannelEngine's side. | Wait and retry. If the issue persists, contact support with the full request URL, response body, and RequestId. |
Next steps
After returns handling is working, connect these related endpoints:
GET /v2/cancellations/channel— fetch channel-initiated cancelations and update order statuses on your platform accordingly.GET /v2/shipments— retrieve shipments so buyers receive accurate tracking information for outbound orders.GET /v2/orders/new— understand how the merchant picks up orders, giving context on the full order-to-return lifecycle.- ChannelEngine: pagination in the APIs — deeper guidance on handling large result sets efficiently across all Channel API endpoints.
Comments
0 comments
Article is closed for comments.