Merchant API: interpreting order lines and extra data
About this article
This article explains the fields available on orders and order lines in the Merchant API order response, including product identifiers, pricing, shipment dates, fulfillment flags, and the ExtraData key-value store for channel-specific information.
Table of contents
Extra data on the order and order line
Introduction
When you retrieve orders via GET /v2/orders or GET /v2/orders/new, each order response contains one or more arrays carrying the detailed order content. The primary array is Lines, where each object represents a single product line and includes fields for product identification, quantity, pricing, VAT, shipment deadlines, fulfillment type, and product condition. Two additional arrays — BundleOrderLines and ServiceLines — appear only in specific scenarios: bundle orders and accounts enrolled in the Service Lines Closed Beta, respectively.
Pricing fields on order lines follow the same two-set pattern as order-level financial fields. Fields without the Original prefix — such as UnitPriceInclVat and LineTotalInclVat — are in your shop's base currency after ChannelEngine currency conversion, and should be used for accounting and reconciliation. Fields with the Original prefix — such as OriginalUnitPriceInclVat and OriginalLineTotalInclVat — are in the currency the customer actually paid in, and should be used for customer-facing documents such as order confirmations and invoices.
Each order line also carries up to six shipment and delivery date fields. The most operationally important of these is LatestShipmentDate, which represents the hard warehouse deadline for that line. This article describes all order line fields in full, and covers how to work with ExtraData — a flexible key-value store that channels use to pass information that does not fit the standard order model, such as gift messages, pickup point identifiers, and customization URLs.
Retrieve orders
In the order response, your orders and order lines come with relevant information that you can use. Inspect the details of these fields for dynamic information related to the order.
-
Retrieve orders:
GET /v2/orders
Returns a paginated list of orders matching your filters. Use this endpoint when you need fine-grained control — for example, filtering by status, date range, channel, or acknowledgement state. -
Retrieve new orders:
GET /v2/orders/new
Returns only orders with statusNEWthat have not yet been acknowledged. The recommended starting point for most polling-based integrations.
Order line fields
Three arrays carry the detailed order content. For most orders only Lines is populated; the other two appear in specific scenarios.
| Field | Type | Description |
Lines |
array | The product lines on the order. See order line fields below. |
BundleOrderLines |
array | Only present when the order contains bundle products. Each item contains the bundle line Id (integer) and Quantity (integer). The individual component lines appear in the Lines array with their BundleOrderLineId set to the corresponding bundle line ID. |
ServiceLines |
array | [Closed Beta] Order-level service adjustments such as discounts applied to the whole order. Only populated for accounts in the Service Lines Closed Beta. Check out Merchant API: orders (service lines) [beta]. |
Each object in the Lines array represents a single product line on the order.
| Field | Type | Description |
Id |
integer | ChannelEngine's internal identifier for this order line. |
ChannelOrderLineNo |
string | The order line reference used by the channel. |
ChannelProductNo |
string | The unique product reference used by the channel. Always populated — use this to look up the product in channel-specific systems. |
MerchantProductNo |
string | Your own product reference as stored in ChannelEngine. |
Gtin |
string | The GTIN (EAN, ISBN, UPC, etc.) provided by the channel, or the GTIN belonging to the MerchantProductNo in ChannelEngine. |
Description |
string | The product title as provided by the channel. This may differ from your own product title — channels sometimes normalize or truncate product names. Do not use this as the authoritative product description in your own system; use MerchantProductNo to look up the product in your own catalogue. |
Status |
enum | The status of this individual order line. |
Quantity |
integer | The number of units ordered. Always populated. |
CancellationRequestedQuantity |
integer | The number of units the customer has requested to cancel. Some channels allow customers to cancel an order or individual lines up until the point of shipment. If this value is greater than zero and you have not yet shipped, act on it promptly: submit a cancelation via POST /v2/cancellations rather than ignoring the request. Shipping a line the customer has already canceled will typically result in a return and a negative seller rating. |
IsFulfillmentByMarketplace |
boolean | true if this line is fulfilled by the marketplace (for example, Amazon FBA or bol LVB). |
Condition |
enum | The condition of the product — relevant for second-hand or refurbished listings. Values: NEW, NEW_REFURBISHED, USED_AS_NEW, USED_VERY_GOOD, USED_GOOD, USED_REASONABLE, USED_MEDIOCRE, UNKNOWN. |
StockLocation |
object |
The stock location assigned to this line, as configured in ChannelEngine. Contains Id (integer) and Name (string). Use this to route the pick to the correct warehouse. See Leveraging stock location data in Merchant API: retrieve orders.
|
UnitPriceInclVat |
number | Price of a single unit including VAT, in your shop's base currency (after ChannelEngine currency conversion). Always populated. Use this for your own accounting and payout reconciliation. |
UnitVat |
number | VAT amount charged on a single unit, in your shop's base currency. |
UnitPriceExclVat |
number | Price of a single unit excluding VAT, in your shop's base currency. |
LineTotalInclVat |
number | Total line value (quantity x unit price) including VAT, in your shop's base currency. |
LineVat |
number | Total VAT charged on the line (quantity x unit VAT), in your shop's base currency. Use for VAT reporting and accounting. |
LineTotalExclVat |
number | Total line value excluding VAT, in your shop's base currency. |
OriginalUnitPriceInclVat |
number | Price of a single unit including VAT, in the currency the customer actually paid in (see CurrencyCode on the order). Use this for customer-facing invoices and when the channel requires amounts in the original transaction currency. |
OriginalUnitVat |
number | VAT amount on a single unit, in the customer's payment currency. |
OriginalLineTotalInclVat |
number | Total line value including VAT, in the customer's payment currency. Use for customer-facing documents such as order confirmations and invoices. |
OriginalLineVat |
number | Total VAT on the line, in the customer's payment currency. |
VatRate |
number | The VAT rate applied to this order line, as a decimal (for example, 0.21 for 21%). |
FeeFixed |
number | A fixed channel fee charged on this line, in the channel's currency. Send 0 if not applicable. |
FeeRate |
number | A percentage channel fee charged on this line. Send 0 if not applicable. |
OriginalFeeFixed |
number | The fixed channel fee in the client's currency. |
JurisCode |
string | State-assigned code identifying the tax jurisdiction. |
JurisName |
string | Name of the tax jurisdiction. |
ExactShipmentDate |
string (ISO 8601) | The exact date the line must be shipped. Shipment cannot occur before or after this date. Empty if the channel does not provide this. |
ExpectedShipmentDate |
string (ISO 8601) | The expected shipment date for this line. Empty if the channel does not provide this. |
LatestShipmentDate |
string (ISO 8601) | The latest date the line may be shipped. Shipment after this date is not allowed. Empty if the channel does not enforce a deadline. |
ExactDeliveryDate |
string (ISO 8601) | The exact date the line must be delivered. Delivery cannot occur before or after this date. Empty if the channel does not provide this. |
ExpectedDeliveryDate |
string (ISO 8601) | The expected delivery date. If not set by the channel, defaults to the order date plus two days. |
LatestDeliveryDate |
string (ISO 8601) | The latest date the line may be delivered. Empty if the channel does not provide this. |
ShippingMethod |
string | The shipping carrier selected by the customer, if applicable (for example, PostNL or DHL). |
ShippingServiceLevel |
string | The service level selected by the customer, if applicable (for example, Standard or Express). |
BundleProductMerchantProductNo |
string | If this product was ordered as part of a bundle, this field contains the MerchantProductNo of the bundle product. |
BundleOrderLineId |
integer | The order line ID of the parent bundle line, if applicable. |
ExtraData |
array |
Channel-specific additional data on the line. Each item contains a Key (string) and Value (string). Keys and values are dynamic and differ per marketplace. See Extra data on the order and order line. |
ServiceLines |
array | [Closed Beta] Line-level service adjustments such as a discount applied to this specific line. Each item follows the same structure as order-level service lines. Only populated for accounts in the Service Lines Closed Beta. See Service lines. |
null before using these values. The single most important field for on-time delivery is LatestShipmentDate — treat this as your warehouse hard deadline. See Merchant API: managing on-time order delivery for a full guide on how to use all six date fields together.
Extra data on the order and order line
ExtraData is a flexible key-value store for channel-specific information that does not have a dedicated field in the standard order model. It appears in two places: at order level (as an object) and at line level (as an array of {"Key": "...", "Value": "..."} pairs).
The most important thing to understand about ExtraData is that its contents are entirely dynamic. The keys and values depend on the channel the order came from — they are not standardized across marketplaces, and ChannelEngine does not transform or validate them. What Amazon puts in ExtraData will be completely different from what bol.com or Zalando puts there. The field can also be null or empty on orders from channels that do not provide supplementary data.
Channels use ExtraData to pass information that matters for fulfilment or compliance but does not fit the standard fields. Common examples include:
| Channel | Example key | What it contains |
| Amazon | gift-message-text |
A gift message to include with the shipment. |
| Amazon | customized-url |
A URL to a customization file (for personalized products). |
| bol.com | pickup-point-id |
The identifier of the pickup point selected by the customer. |
| DHL (packstation) | postnummer |
The customer's DHL Postnummer required for packstation delivery. |
| Various | promotion-id |
A promotion or coupon code applied to the order. |
| Various | invoice-number |
A pre-assigned invoice number from the channel. |
How to handle ExtraData in your integration:
- Do not hardcode assumptions about its structure. An integration that works for bol.com orders will not necessarily have the same
ExtraDatakeys when the same merchant connects Amazon. Build your ExtraData handling to be channel-aware — checkGlobalChannelNameorGlobalChannelIdfirst, then look up the relevant keys for that channel. - Treat it as optional. If a key you expect is absent, handle
nullgracefully rather than throwing an error. Channels can add or remove keys over time. - Order-level vs. line-level. Order-level
ExtraData(on the order object) contains information about the order as a whole. Line-levelExtraData(inside eachLinesitem) contains information specific to that product line. A gift message is typically at order level; a customization URL is typically at line level. - Log unknown keys. If you encounter an
ExtraDatakey you do not recognize, log it rather than silently discarding it. New keys from a channel may contain data you need to act on — for example, a new regulatory compliance field.
ExtraData contents. This tells you exactly which keys that channel provides. Build your extraction logic against real data, not documentation assumptions.
Comments
0 comments
Article is closed for comments.