Merchant API: notifications
About this article
This article explains how to retrieve your ChannelEngine notifications via the Merchant API with GET /v2/notifications, how to filter and paginate the results, and how to interpret each notification type.
Table of contents
Introduction
An order fails to import, a stock update is rejected, or a marketplace connection is about to expire. ChannelEngine raises a notification for each of these events, so you know what needs your attention.
The notifications endpoint lets you pull those notifications into your own systems. You can poll for new failures, check what happened to a specific order, return, or shipment, and route alerts to the right team without logging in to ChannelEngine.
Overview
Refer to the diagram below to visualize how notifications travel between the channel, ChannelEngine, and your system.
You can narrow the results in three ways:
- By date: return only notifications created within a time window.
- By type: return only the kinds of notifications you care about, e.g.: failed order imports.
- By reference: return notifications for specific orders, returns, or shipments, using your own numbers or the channel numbers.
Read field only shows whether someone has already read the notification on ChannelEngine.
Requirements
-
Your tenant URL: the base URL is
https://{tenant}.channelengine.net/api. -
A Merchant API key: a unique code that identifies your account to ChannelEngine. Send it in the
X-CE-KEYheader. A Channel API key does not work here.
X-CE-KEY: your-merchant-api-key
Available API endpoints
-
Retrieve notifications:
GET /v2/notifications
Use this endpoint to retrieve your ChannelEngine notifications. Without filters, the endpoint returns your notifications page by page.
Parameters
All parameters are optional and go in the query string.
| Parameter | Type | Description |
FromDate |
date-time | Only return notifications created on or after this moment. The date is inclusive. |
ToDate |
date-time | Only return notifications created before this moment. The date is exclusive. |
Types |
array of strings | One or more notification types. Repeat the parameter for each type. Refer to Notification types for the values. |
MerchantOrderNos |
array of strings | Your own order references. Repeat the parameter for each order. |
ChannelOrderNos |
array of strings | The order references used by the channel. |
MerchantReturnNos |
array of strings | Your own return references. |
ChannelReturnNos |
array of strings | The return references used by the channel. |
MerchantShipmentNos |
array of strings | Your own shipment references. |
Page |
integer | The page to retrieve. The first page is 1. |
2026-10-01T00:00:00Z. Add the Z or a UTC offset so there is no doubt about the intended time.
Step by step
- Choose what you want to see. Decide on a time window, one or more notification types, or the order, return, or shipment numbers you are investigating. If you are not sure yet, start with a short time window and no other filters.
-
Send the request to
GET /v2/notificationswith your key in theX-CE-KEYheader and your filters in the query string. You receive HTTP 200 withSuccess: true. -
Read the notifications in
Content. UseTypeto decide what to do, andSubjectandMessagefor the details. IfTotalCountis higher thanCount, request the next page.
Reading the response
The response is a paginated collection. Each item in Content is one notification.
Response fields
Response content
| Field | Description |
Id |
The unique ID of the notification on ChannelEngine. |
Type |
The kind of notification. Refer to Notification types. |
Subject |
A short title for the notification. Can be null. |
Message |
The full text of the notification. Can contain HTML markup. Can be null. |
Count |
A number that ChannelEngine sets on the notification. Do not use it to count the items a notification mentions, because the details are in Message. |
CreatedAt |
The date and time ChannelEngine created the notification. |
Read |
true if the notification has already been read on ChannelEngine. |
Around the items, the response contains the standard collection fields.
Collection fields in the response
| Field | Description |
Count |
Number of items on this page. |
TotalCount |
Number of notifications that match your filters, across all pages. |
ItemsPerPage |
Maximum number of items per page. |
StatusCode |
The HTTP status code. |
Success |
true if the request succeeded. Check this field as well as the HTTP status. |
Message, ExceptionType, ValidationErrors
|
Details about a failed request. Empty when Success is true. |
RequestId, LogId
|
Reference IDs for the request. Include them when you contact your ChannelEngine contact. |
Response example
{
"Content": [
{
"Id": 145018,
"Read": false,
"CreatedAt": "2026-10-02T07:29:05.6408797+00:00",
"Message": "\n\n\n\n\n <div style=\"white-space: pre-line\" class=\"alert alert-warning\">Some Shipments (4) with ids [76,77,78,91] are still on a PENDING status</div>\n\n",
"Subject": "Shipment still on PENDING",
"Count": 1,
"Type": "CHANNEL_SHIPMENT_TOO_LONG_ON_PENDING"
}
],
"Count": 1,
"TotalCount": 1,
"ItemsPerPage": 1,
"StatusCode": 200,
"RequestId": null,
"LogId": null,
"Success": true,
"Message": null,
"ExceptionType": null,
"ValidationErrors": null
}Message can contain HTML markup and extra line breaks, as in this example. Strip the tags and trim the whitespace before you show the text in your own system or send it in an email or chat message. Subject and Message can also be null. When they are, use Type to understand what the notification is about.
Notification types
Every notification has a Type. Use these values in the Types filter. Most names tell you what happened. Types that end in _FAILED usually mean something needs your attention, while types such as _NEW or _SUCCEEDED are informational.
Notification types
| Area | What it covers | Type values |
| Orders | New orders, cancelations, and anything that goes wrong while orders move between the channel and your system. |
CHANNEL_ORDER_NEWCHANNEL_ORDER_IMPORT_FAILEDCHANNEL_ORDER_CORRECTION_NEEDEDCHANNEL_ORDER_DUPLICATE_LINECHANNEL_ORDER_TOO_LONG_ON_NEWCHANNEL_ORDER_OVERDUECHANNEL_ORDER_CANCELLATION_REQUEST_NEWCHANNEL_ORDER_INVOICE_SEND_FAILEDCHANNEL_ORDER_ANONYMIZED_BY_REQUESTCHANNEL_ORDER_ANONYMIZED_AUTOMATICALLYMERCHANT_ORDER_EXPORT_FAILEDMERCHANT_ORDER_EXPORT_LINES_CANCELLEDCHANNEL_CANCELLATION_EXPORT_FAILEDMERCHANT_CANCELLATION_IMPORT_FAILEDORDER_FALLBACK_TO_DEFAULT_STOCKLOCATIONORDER_WITH_BACKORDER_STATUSORDER_WITH_BACKORDER_STATUS_FULFILLEDORDERS_GOT_REJECTED_BY_MCFLATE_UNSHIPPED_ORDERSLATE_UNSHIPPED_ORDERS_IN_DAY_TIME
|
| Shipments | Problems importing or exporting shipments, and shipments that stay pending too long. |
CHANNEL_SHIPMENT_IMPORT_FAILEDCHANNEL_SHIPMENT_IMPORT_STATUS_FAILEDCHANNEL_SHIPMENT_IMPORT_MISSING_LINE_FAILEDCHANNEL_SHIPMENT_EXPORT_FAILEDCHANNEL_SHIPMENT_EXPORT_INVALID_MERCHANTSHIPMENTNOCHANNEL_SHIPMENT_TOO_LONG_ON_PENDINGCHANNEL_SHIPMENTS_UPDATE_FAILEDSHIPMENT_DELIVERY_EXPORT_FAILED
|
| Fulfillment by channel | Shipment updates for orders that the marketplace fulfills. |
CHANNEL_FULFILLMENT_SHIPMENT_IMPORT_STATUS_FAILEDCHANNEL_FULFILLMENT_SHIPMENT_EXPORT_FAILEDCHANNEL_FULFILLMENT_SHIPMENT_EXPORT_SUCCEEDEDCHANNEL_FULFILLMENT_SHIPMENT_LINE_FOR_CLOSED_ORDERCHANNEL_FULFILLMENT_SHIPMENT_RECEIVED
|
| Returns and refunds | New and overdue returns, and failed return or refund transfers. |
CHANNEL_RETURN_NEWCHANNEL_RETURN_OVERDUECHANNEL_RETURN_REQUIRED_ATTENTIONCHANNEL_RETURN_DELETEDCHANNEL_RETURN_IMPORT_FAILEDCHANNEL_RETURN_EXPORT_FAILEDCHANNEL_REFUND_EXPORT_FAILEDCHANNEL_REFUND_LINE_ITEMS_ERROR
|
| Products, offers, and stock | Failed product, offer, and stock transfers, skipped products, and stock location setup. |
CHANNEL_PRODUCT_DATA_EXPORT_FAILEDCHANNEL_PRODUCT_DATA_IMPORT_FAILEDCHANNEL_PRODUCT_OFFER_EXPORT_FAILEDPRODUCT_BUNDLE_IMPORT_FAILEDMERCHANT_STOCK_UPDATE_FAILEDMERCHANT_PRODUCT_STOCKS_IMPORT_FAILEDINVALID_PRODUCTS_SKIPPEDDROPPED_PRODUCTS_THRESHOLD_EXCEEDEDPRODUCT_MEDIA_DOWNLOAD_REPORTCOMPUTED_EXTRA_DATA_RECALCULATION_COMPLETEDMAPPINGS_IMPORT_TASKSTOCK_LOCATION_NOT_FOUNDSTOCK_LOCATION_SUCCESSFULLY_CONNECTEDSTOCK_LOCATION_FAILED_TO_CONNECTWAREHOUSE_FAILED_TO_CREATEUPDATE_STOCK_SWITCHED_OFF_FOR_PLUGIN
|
| Product feeds | Feed imports that failed, came back empty, contained invalid products, or were switched on or off. |
FEED_IMPORT_FAILEDFEED_NO_PRODUCTS_FAILEDFEED_INVALID_PRODUCTS_OCCUREDFEED_ENABLEDFEED_DISABLEDPRODUCT_IMPORT_FEEDS_SUCCESSFEED_BUILDER_EMPTY_EXPORT_NOTIFICATIONADVANCED_PARSER_USAGE_NOTIFICATION
|
| Connections and plugins | Settings, authorization, and status of your channel and platform connections. |
PLUGIN_INVALID_SETTINGPLUGIN_VALIDATION_FAILEDPLUGIN_UNAUTHORIZEDPLUGIN_DEACTIVATEDPLUGIN_SALES_CHANNEL_DEACTIVATEDPLUGIN_CATEGORIES_CHANGEDPLUGIN_ATTRIBUTES_CHANGEDPLUGIN_DSA_INFOOAUTH_REFRESH_TOKEN_ABOUT_TO_EXPIRE
|
| Purchase orders | New purchase orders, changes to them, and failed acknowledgements, shipments, or invoices. |
CHANNEL_PURCHASE_ORDER_NEWCHANNEL_PURCHASE_ORDER_LINE_CHANGEDCHANNEL_PURCHASE_ORDER_LINE_CANCELLEDCHANNEL_PURCHASE_ORDER_ADDRESS_CHANGEDCHANNEL_PURCHASE_ORDER_ACKNOWLEDGEMENT_FAILEDCHANNEL_PURCHASE_ORDER_SHIPMENT_EXPORT_FAILEDCHANNEL_PURCHASE_ORDER_INVOICE_CREATION_FAILED
|
| Translations | Automatic translation results and broken image tags in translated content. |
TRANSLATION_FAILEDTRANSLATION_RETRYTRANSLATION_IMAGE_TAGS_BROKEN
|
| Tax and settlements | Tax provider and VAT rate problems, and settlement transfers. |
TAX_PROVIDER_NOT_ACTIVATEDTAX_PROVIDER_COMPANIES_IMPORT_RESULTCUSTOM_VAT_RATE_OVERLAPPING_RATESSETTLEMENT_EXPORT_FAILEDSETTLEMENT_IMPORT_FAILED
|
| Insights and platform | Reports, recommendations, KPI targets, webhook failures, and messages from ChannelEngine. |
CHANNEL_KPI_TARGET_MISSEDRECOMMENDATION_GENERATION_TASKCHANNEL_INSIGHTS_REPORT_GENERATION_SUCCEEDEDCHANNEL_INSIGHTS_REPORT_GENERATION_FAILEDCHANNELENGINE_WEBHOOK_RQUEST_FAILEDCHANNELENGINE_SUPPORT_NOTIFICATIONGLOBAL_MESSAGE
|
CHANNELENGINE_WEBHOOK_RQUEST_FAILED and FEED_INVALID_PRODUCTS_OCCURED. Copy them from the table above instead of typing them from memory.
Common workflows
Poll for new failures
Run a scheduled job that checks for notifications created since the last run.
- Set
FromDateto the time of your previous run andToDateto the current time. - Add the failure types you want to monitor in
Types, and request every page. - Store the
ToDateof this run and use it asFromDatein the next run.
FromDate is inclusive and ToDate is exclusive, so consecutive windows never overlap. Still store the Id of each notification you process, so a retry never creates a duplicate alert.
Find out what happened to an order, return, or shipment
Pass the reference in MerchantOrderNos, ChannelOrderNos, MerchantReturnNos, ChannelReturnNos, or MerchantShipmentNos. This is the quickest way to see why a specific order did not reach your system or why a shipment update failed.
Testing the endpoint
Test in your development environment before you go live.
-
Call the endpoint without filters. Expect HTTP 200 and
Success: true. If your account has notifications, they appear inContent. -
Add a
Typesfilter for a type you know occurred, e.g.:CHANNEL_ORDER_NEW. Expect every item inContentto have thatType. -
Add a date window that contains one known notification. Expect
TotalCountto drop, and everyCreatedAtto fall inside your window. - Compare the result with the notifications on ChannelEngine. Expect the subject, message, and creation time to match what you see in the interface.
Example requests
Filter by date and type (cURL)
curl -X GET "https://{tenant}.channelengine.net/api/v2/notifications?FromDate=2026-10-01T00:00:00Z&ToDate=2026-10-02T00:00:00Z&Types=CHANNEL_ORDER_IMPORT_FAILED&Types=MERCHANT_STOCK_UPDATE_FAILED&Page=1" \
-H "Accept: application/json" \
-H "X-CE-KEY: YOUR_MERCHANT_API_KEY"Filter by order reference (cURL)
curl -X GET "https://{tenant}.channelengine.net/api/v2/notifications?MerchantOrderNos=ORDER-1001&MerchantOrderNos=ORDER-1002" \
-H "Accept: application/json" \
-H "X-CE-KEY: YOUR_MERCHANT_API_KEY"Retrieve all pages (Python)
import requests
BASE = "https://your-tenant.channelengine.net/api"
HEADERS = {"X-CE-KEY": "YOUR_MERCHANT_API_KEY", "Accept": "application/json"}
def get_notifications(from_date, to_date, types=None):
page = 1
while True:
params = {"FromDate": from_date, "ToDate": to_date, "Page": page}
if types:
params["Types"] = types # requests repeats the parameter for each value
response = requests.get(f"{BASE}/v2/notifications", headers=HEADERS, params=params)
response.raise_for_status()
data = response.json()
if not data["Success"]:
raise RuntimeError(data.get("Message"))
yield from (data["Content"] or [])
if page * data["ItemsPerPage"] >= data["TotalCount"]:
break
page += 1
failures = list(get_notifications(
"2026-10-01T00:00:00Z",
"2026-10-02T00:00:00Z",
["CHANNEL_ORDER_IMPORT_FAILED", "MERCHANT_STOCK_UPDATE_FAILED"],
))Common errors
| What you see | Likely cause and fix |
HTTP 401 or Success: false
|
The API key is missing, wrong, or a Channel API key. Use a Merchant API key in the X-CE-KEY header. |
Request rejected with ValidationErrors
|
A parameter value is not valid. Check the spelling of each Types value and the format of FromDate and ToDate. |
Empty Content
|
No notification matches your filters. Widen the date window, remove the Types filter, or check that your order, return, or shipment numbers are correct. |
| Notifications you already handled appear again | Your date windows overlap, or you request without dates on every run. Use FromDate and ToDate as described in Common workflows, and skip Id values you have already processed. |
Read is false for notifications you handled |
The API cannot mark notifications as read. Read only changes when someone reads the notification on ChannelEngine. |
Subject or Message is null
|
Not every notification carries a subject or message. Fall back to Type to decide what to do. |
Message shows HTML tags or blank lines |
The message is stored as HTML. Strip the tags and trim the whitespace before you display it. |
| Items are missing from the first page | The results are paginated. Compare Count with TotalCount and request the next pages. |
If you are still stuck, contact your ChannelEngine contact and include the RequestId and LogId from the response.
Next steps
- Managing orders via the Merchant API: fetch, acknowledge, and ship your orders.
- Authentication and rate limits: Merchant API key setup and request throttling.
Comments
0 comments
Article is closed for comments.