Merchant API: shipments
About this article
This article explains how to create, retrieve, and update shipments via the Merchant API, and how to confirm delivery. It covers the full shipment lifecycle after an order has been acknowledged. To learn how to request and download marketplace-generated shipping labels, check out Merchant API: shipping labels (last-mile delivery).
Table of contents
Introduction
Once an order is acknowledged, the next step is to record its shipment on ChannelEngine. Shipment data tells the marketplace that the order is on its way and, where applicable, triggers label generation, tracking updates, and delivery confirmation.
Before creating a shipment, make sure you retrieved and acknowledged the order. The MerchantOrderNo used in that process is the order reference (or identifier) throughout this flow.
Which flow you follow depends on who provides the carrier and the label. You either ship with your own carrier and tracking details, or the marketplace generates the label for you. For marketplace-generated labels, see Merchant API: shipping labels (last-mile delivery).
Overview
Refer to the diagram below to visualize how a shipment travels between your system, ChannelEngine, and the channel.
Requirements
- A Merchant API key, available at Settings, Merchant API keys on ChannelEngine.
- An order that you retrieved and acknowledged.
- A unique
MerchantShipmentNofor each shipment, which you generate in your own system. - For marketplace-generated labels where the marketplace controls the carrier (Pattern B), completed carrier mappings on the channel. See Pattern B: delivery by marketplace.
Available API endpoints
The following endpoints cover the shipment lifecycle. To submit an order invoice that is exported with your shipment, see the article on managing orders via the Merchant API.
-
Create a shipment:
POST /v2/shipments -
Create a shipment and request a label (Pattern A):
POST /v2/shipments/channelmethod -
Retrieve available carrier services (Pattern A):
POST /v2/carriers/{merchantOrderNo} -
Retrieve shipments:
GET /v2/shipments/merchant -
Update a shipment:
PUT /v2/shipments/{merchantShipmentNo} -
Download a shipping label:
GET /v2/orders/{merchantShipmentNo}/shippinglabel -
Retrieve the Air Waybill (AWB) number:
GET /v2/orders/{merchantShipmentNo}/airwaybillno -
Submit delivery state:
PUT /v2/shipments/{merchantShipmentNo}/delivery-state -
Upload proof of delivery:
POST /v2/shipments/{merchantShipmentNo}/proof-of-delivery
Post a shipment
-
Create a shipment:
POST /v2/shipments
Use this endpoint when you are shipping an order yourself and already have, or will provide, your own carrier and tracking details. ChannelEngine records the shipment and forwards it to the marketplace. Each call creates one shipment. This endpoint does not accept an array of multiple shipments in a single request. Each shipment needs its own unique MerchantShipmentNo, which you define yourself at creation.
Request body
The API reference documents every field. The notes below explain when and why you would use each one.
| Field | Type | Required | Notes |
MerchantShipmentNo |
string | Yes | Your own unique reference for this shipment. You define it, ChannelEngine does not generate it, and it cannot be reused on another shipment. If your system does not generate shipment numbers, use the order number or any other unique value. Partial shipments of the same order each need their own. Store it: you need it to retrieve labels, update tracking, and submit delivery state. |
MerchantOrderNo |
string | Yes | The order reference you stored when you retrieved and acknowledged the order. ChannelEngine uses it to link the shipment to the right order. |
Lines |
array | Yes | The items in this parcel. Include only the lines and quantities that are in this shipment. For a partial shipment, send the remaining lines in a later shipment. |
Lines[].MerchantProductNo |
string | Yes | Your product SKU, as used in your product data. ChannelEngine uses it to match the shipped item to an order line. |
Lines[].Quantity |
integer | Yes | The number of units of this product in the shipment. For a partial shipment, this is lower than the ordered quantity. |
Lines[].OrderLineId |
integer | No | The ChannelEngine order line ID, returned when you retrieve the order. Use it instead of MerchantProductNo to identify the line, for example when the same product appears on more than one line of an order and the SKU alone is not enough to match it. |
Lines[].ExtraData |
object | No | Additional key-value data for this line, for channel-specific requirements. For example, Back Market requires an IMEI number for smartphones, which you send as an ExtraData key on the line. Each key must be unique. |
TrackTraceNo |
string | No | The carrier tracking number. Most marketplaces need a tracking code before they accept an order as shipped, so provide it at creation if you have it. If you do not have it yet, omit it and add it later via PUT. Until then, the shipment is incomplete and may not be exported to channels that require tracking. Maximum 50 characters. |
TrackTraceUrl |
string | No | A link to the carrier's tracking page, shown to the customer. If you omit it, ChannelEngine can build the link from the tracking code link configured on your shipment method (Settings, Shipment methods), which supports replacement tags such as {TrackTraceNo}. The final URL that is exported to the marketplace has a maximum of 1,024 characters. |
Method |
string | No | The carrier or shipping method name, e.g.: DHL or PostNL. To automatically apply the tracking code and shipping time, use the Name of a shipment method configured in Settings, Shipment methods. Marketplaces generally need the carrier name together with the tracking code to mark an order as shipped. For marketplace-generated labels (Pattern B), use the name of the marketplace as your Method. |
ShippedFromCountryCode |
string | No | The country the parcel is dispatched from, as a two-letter ISO 3166-1 alpha-2 code (e.g.: NL). Provide it when you ship from a different country than your registered one, for example from a warehouse abroad or via a logistics partner, so the channel receives the correct dispatch origin. If you use stock locations, ShippedFromStockLocationId covers this. |
ShippedFromStockLocationId |
integer | Conditional | The ID of the ChannelEngine stock location the parcel ships from. Required if you use multiple stock locations, so the shipment is attributed to the right location. Retrieve the IDs via GET /v2/stocklocations. |
ShipmentDate |
string (ISO 8601) | No | The date and time the shipment was created in your source system. Set it when you export shipments to ChannelEngine later than they happened, for example in batches, so the dates reflect reality. You can filter on it with FromShipmentDate and ToShipmentDate in GET /v2/shipments/merchant. |
ReturnTrackTraceNo |
string | No | The tracking number of the return label you include in the parcel. Applicable when the buyer receives a prepaid return label with the order. Some marketplaces, such as Zalando, OTTO Market, and About You, require it together with the shipment, so provide it at creation on these channels. |
ReturnMethod |
string | No | The carrier of the return label, e.g.: PostNL. Provide it together with ReturnTrackTraceNo. |
AirWaybillNo |
string | No | The air waybill number for shipments transported by air freight, typically cross-border shipments. Applicable only if the marketplace asks for it. If indicated in the marketplace's guide, ChannelEngine generates the air waybill number for you: retrieve it via GET /v2/orders/{merchantShipmentNo}/airwaybillno and use it as your tracking code. See Retrieve the Air Waybill number. |
IsMerchantCreator |
boolean | No | Indicates whether you (true) or a third party (false) created the shipment. Leave the default (true) when your own system creates it. Set it to false when a third party, such as a fulfillment or logistics partner, creates the shipment on your behalf. |
ExtraData |
object | No | Additional key-value data on the shipment, for channel-specific requirements that have no dedicated field. Each key must be unique. Check the specific marketplace guide to see if you need to submit extra data with your shipment. |
For request examples, see Example requests.
Partial shipments
To partially ship an order, only include the lines and quantities shipped in the call. You can create additional shipments for the remaining lines using the same MerchantOrderNo but a different MerchantShipmentNo.
ChannelOrderSupport field on the order. Not all channels accept multiple shipments per order. For guidance on inspecting the channel order support, check out Merchant API: retrieve orders.
TrackTraceNo and Method. Once the carrier provides a tracking number, add it using PUT /v2/shipments/{merchantShipmentNo}. See Update tracking information.
Get shipments
-
Retrieve shipments:
GET /v2/shipments/merchant
Use this endpoint to retrieve shipments you previously created on ChannelEngine, oldest to newest. Use it to verify data, check export status, or reconcile records with your own system.
Query parameters
| Parameter | Type | Description |
MerchantShipmentNos |
array | Filter by one or more of your shipment references. |
MerchantOrderNos |
array | Filter by one or more of your order references. |
ChannelOrderNos |
array | Filter by marketplace order references. |
ChannelShipmentNos |
array | Filter by marketplace shipment references. |
ChannelId |
integer | Filter by channel, so you only retrieve shipments for one of your connected marketplaces. Useful when you handle the shipment flow per channel, e.g.: when channels have different label or delivery state requirements. |
Method |
string | Filter by carrier name. |
FromShipmentDate and ToShipmentDate
|
string (ISO 8601) | Date range on the shipment date. The start is inclusive and the end is exclusive. |
FromCreateDate and ToCreateDate
|
string (ISO 8601) | Date range on when the shipment was created on ChannelEngine. |
FromUpdateDate and ToUpdateDate
|
string (ISO 8601) | Date range on when the shipment was last updated. |
FromDeliveredAt and ToDeliveredAt
|
string (ISO 8601) | Date range on the delivery date. |
ChannelExportStatus |
string | Filter by the current export status to the marketplace. |
FulfillmentType |
string | Filter by fulfillment type. |
Page |
integer | The page number for pagination. Results are returned chronologically, oldest first. |
FromUpdateDate with the Page parameter to poll for recently changed shipments without fetching your entire history on each call. Store the timestamp of your last successful poll and use it as the next FromUpdateDate.
Shipping labels
When your channel manages the shipping method, e.g.: Amazon, bol, or Kaufland, ChannelEngine can request a shipping label from the marketplace on your behalf. Depending on the channel, you either select the carrier service yourself (Pattern A) or the marketplace assigns it automatically (Pattern B). To learn how to request, download, and troubleshoot marketplace-generated shipping labels, and how to retrieve Air Waybill numbers, check out Merchant API: shipping labels (last-mile delivery).
Updating a shipment
Shipment details like tracking number or carrier can be added or updated after a shipment has been created. Some channels also require you to confirm the delivery status or upload a proof of delivery document.
Update tracking information
-
Update a shipment:
PUT /v2/shipments/{merchantShipmentNo}
Use this endpoint to add a tracking number after shipment creation or to correct carrier and tracking details already on file. Replace {merchantShipmentNo} with the shipment reference you assigned at creation.
Request body when updating a shipment
| Field | Type | Required | Notes |
Method |
string | Yes | The carrier name, e.g.: DHL or PostNL. |
TrackTraceNo |
string | Yes | The carrier tracking number. |
TrackTraceUrl |
string | No | The URL to the carrier's tracking page, shown to the customer. |
ReturnTrackTraceNo |
string | No | The tracking number of the return label. Required by some marketplaces. See the field notes under Post a shipment. |
ReturnMethod |
string | No | The carrier of the return label. Provide it together with ReturnTrackTraceNo. |
ShippedFromCountryCode |
string | No | The country the parcel is dispatched from, as a two-letter ISO 3166-1 alpha-2 code. See the field notes in Post a shipment. |
Submit delivery state
-
Submit delivery state:
PUT /v2/shipments/{merchantShipmentNo}/delivery-state
Use this endpoint to report the final delivery outcome. This is required by channels that need explicit merchant confirmation of delivery, typically channels that do not receive automatic tracking updates from the carrier. Check the specific marketplace guide to determine if you need to submit the delivery state.
Delivery state request body fields
| Field | Type | Notes |
Status |
string | Either DELIVERED or UNDELIVERED. |
DeliveredAt |
string (ISO 8601) | The date and time of delivery. If the exact time is unknown, use the current date and time. Always required, even when Status is UNDELIVERED. |
Upload proof of delivery
-
Upload proof of delivery:
POST /v2/shipments/{merchantShipmentNo}/proof-of-delivery
If your channel or internal process requires a proof of delivery document, upload it with this endpoint. This is a multipart/form-data request. Check the specific marketplace guide to determine if you need to submit a proof of delivery.
Proof of delivery request body fields
| Field | Type | Notes |
ProofOfDeliveryFile |
file (PDF) | The proof of delivery document. |
ProofOfDeliveryNumber |
string | Your proof of delivery reference number. Maximum 50 characters. |
Recommended sequence
- Hand the parcel to the carrier and obtain a tracking number.
- Call
PUT /v2/shipments/{merchantShipmentNo}with the carrier name and tracking number, if not already included at creation time. Expect HTTP 200. - If required, once your tracking system or carrier confirms delivery, call
PUT /v2/shipments/{merchantShipmentNo}/delivery-statewithStatusandDeliveredAt. Expect HTTP 201. - If required, upload the proof of delivery PDF via
POST /v2/shipments/{merchantShipmentNo}/proof-of-delivery. Expect HTTP 201.
Example requests
For examples of marketplace-generated label requests (Pattern A and Pattern B) and Air Waybill retrieval, see Merchant API: shipping labels (last-mile delivery).
Full shipment with tracking
POST /v2/shipments
{
"MerchantShipmentNo": "SHIP-20260817-001",
"MerchantOrderNo": "ORD-98765",
"Lines": [
{
"MerchantProductNo": "SKU-001",
"Quantity": 2
}
],
"TrackTraceNo": "3SDESK123456789",
"TrackTraceUrl": "https://tracking.postnl.nl/3SDESK123456789",
"Method": "PostNL",
"ShippedFromCountryCode": "NL",
"IsMerchantCreator": true
}Minimal shipment (tracking added later)
POST /v2/shipments
{
"MerchantShipmentNo": "SHIP-20260817-002",
"MerchantOrderNo": "ORD-98766",
"Lines": [
{
"MerchantProductNo": "SKU-002",
"Quantity": 1
}
]
}Add tracking to an existing shipment
PUT /v2/shipments/SHIP-20260817-002
{
"Method": "DHL",
"TrackTraceNo": "1Z999AA10123456784",
"TrackTraceUrl": "https://www.dhl.com/en/tracking/1Z999AA10123456784"
}Submit delivery state
PUT /v2/shipments/SHIP-20260817-001/delivery-state
{
"Status": "DELIVERED",
"DeliveredAt": "2026-08-19T14:32:00Z"
}Common issues
For label-related issues, such as 404 and 410 responses, see Merchant API: shipping labels (last-mile delivery).
| Issue | Cause | Solution |
| Shipment is not exported to the channel | The carrier or tracking number is missing for a channel that requires them. | Add them via PUT /v2/shipments/{merchantShipmentNo}. |
| Splitting an order into multiple shipments fails | The channel does not support multiple shipments per order. | Check the ChannelOrderSupport field on the order before splitting. |
| Shipment cannot be created | The MerchantShipmentNo was already used for another shipment. |
Generate a unique MerchantShipmentNo for every shipment. Never reuse one. |
| Delivery state is not accepted |
DeliveredAt is missing. It is also required when Status is UNDELIVERED. |
Always send DeliveredAt. If the exact time is unknown, use the current date and time. |
FAQs
Why is my shipment not processed correctly on the marketplace?
The main reason for this is that the provided shipment information is missing or incorrect. Review the instructions in the section Create a shipment above.
Does the marketplace accept partial shipments?
Make sure to check the ChannelOrderSupport field in the response body of the retrieve orders API call, as not all marketplaces support partial shipments.
Channel order support assumes one of the following values:
- NONE - the channel does not support any orders or order follow-up actions. E.g.: Beslist does not support automated shipments or returns; therefore, it is not possible to perform any partial order actions.
- NO_SPLIT/ORDERS - the channel supports orders and follow-up actions, but these cannot be split. If an order has two order lines, both must be included in a single shipment.
- SPLIT_ORDERS - the channel supports orders and follow-up actions, but they can only be split into individual order lines. An order containing two order lines, each for one product, can be shipped in two shipments, with each shipment containing one product. However, an order line cannot be split into separate shipments. E.g.: if a buyer buys a quantity of three of the same item, all three items must be shipped at once/canceled at once.
- SPLIT_ORDER_LINES - the channel supports orders and follow-up actions, and their order lines can be split into separate shipments or further follow-up actions. E.g.: if a buyer buys a quantity of three of the same item, it is possible to ship two of the order quantities and cancel one of the quantities.
For more details on retrieving the order support level via the orders endpoint, check out Merchant API: orders.
Next steps
- Merchant API: testing shipments in your sandbox - verify your shipment integration before going live.
- Managing orders via the Merchant API - retrieve, acknowledge, and cancel orders, and submit invoices.
- Merchant API: shipping labels (last-mile delivery) - request and download marketplace-generated labels, and set up fulfillment settings on your channels.
- Managing offers via the Merchant API - keep stock and price up to date across your channels.
- Authentication and rate limits - Merchant API key setup and request throttling.
Comments
0 comments
Article is closed for comments.