Submit Order
/channel/api/v1/order/submitAuth: request-token (channel_partner)
Submit an order on behalf of the authenticated channel partner. The shop_id must belong to a shop bound to the partner; out-of-scope shops are rejected and no order is created.
On the first submission of a product / variant (identified by shop_sku), the platform creates the product catalog entry from the fields you send here, so provide product and variant details as completely as possible.
Field boundaries
This endpoint has an explicit boundary in both directions:
- Request boundary (what you may send). Only the fields documented on this page are accepted. Any other field — especially internal identifiers or platform-managed values — is ignored. Do not send platform ids (
id,sku_id,product_id,shop_sku_id,catalog_id,order_id), order status, settlement / billing fields, or internal cost fields (cost,cost_price,employee_price). Cost and internal-margin data is never accepted from a channel partner. - Response boundary (what you get back). The submit response returns only
code,msg, anddata.order_id. It never returns internal cost, margin, settlement, staff, or catalog-internal fields. Prices you see back on any read API are limited to what the partner is allowed to see.
Sending a disallowed field is not an error; it is silently dropped. Never rely on a field that is not documented here.
Request Headers
| Header | Required | Description |
|---|---|---|
request-token | yes | Channel partner app token |
Content-Type | yes | application/json |
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
shop_id | integer | yes | Bound shop id |
shop_order_no | string | yes | Unique order number within the shop. Together with shop_id it is the idempotency key |
shipping_standard | string | yes | Shipping standard / service code agreed with e2c-energy |
payment_method | string | yes | Payment method label (e.g. bank_transfer) |
purchase_time | string | yes | Purchase datetime YYYY-MM-DD HH:mm:ss (shop local time) |
billing_address | object | yes | Billing address — see Address object |
shipping_address | object | yes | Shipping address — see Address object |
order_item | array<object> | yes | Order line items — see Order item object |
order_amount | array<object> | yes | Fee / amount lines — see Order amount object |
Address object
Used by both billing_address and shipping_address.
| Field | Type | Required | Description |
|---|---|---|---|
full_name | string | yes | Recipient / payer full name |
country_code | string | yes | ISO 3166-1 alpha-2 country code (e.g. DE, NL, FR) |
province | string | yes | Province / state / region |
city | string | yes | City |
address1 | string | yes | Street address line 1 |
address2 | string | no | Street address line 2 |
address3 | string | no | Street address line 3 |
suburbs | string | no | Suburb / district |
postcode | string | no | Postal / ZIP code |
tel | string | no | Contact phone number |
email | string | no | Contact email |
company | string | no | Company name |
tax_id | string | no | Tax / VAT number (recommended for B2B billing) |
kvk_number | string | no | Chamber of Commerce number (NL KvK), if applicable |
Order item object
Each entry in the order_item array.
| Field | Type | Required | Description |
|---|---|---|---|
quantity | integer | yes | Ordered quantity |
price | number | yes | Unit price actually charged for this line, in the order currency |
shop_order_item_primary_key | string | no | Your own line id, echoed back for reconciliation |
item | object | yes | Product detail — see Product object |
Product object
The item field of each order item. On first sync (by shop_id + shop_sku) these fields create the product; on later syncs the existing product is reused.
| Field | Type | Required | Description |
|---|---|---|---|
title | string | yes | Product title |
shop_sku | string | yes | Product-level SKU in your shop (product identity) |
sale_price | number | yes | Product sale price (decimal, 2 places) |
weight | number | yes | Product weight (decimal, 2 places) |
weight_unit | string | yes | Weight unit, e.g. kg (default) or g |
images | object | yes | Image groups keyed by option value — see Product images & variant options |
primary_image_key | string | yes | The standard option name that selects the image group — see Product images & variant options |
variant | object | yes | Variant detail — see Variant object |
description | string | no | Product description |
mpn | string | no | Manufacturer Part Number |
ean | string | no | EAN / barcode |
condition | string | no | Item condition, default new |
price | number | no | List price before discount |
suggest_price | number | no | Suggested retail price |
length | number | no | Length (decimal) |
width | number | no | Width (decimal) |
height | number | no | Height (decimal) |
length_unit | string | no | Length unit, default cm |
mqq | integer | no | Minimum order quantity, default 1 |
step | integer | no | Order quantity step, default 1 |
highlights | string | no | Selling points / highlights |
video | string | no | Product video key or URL |
Variant object
The variant field of the product object. Identity is shop_sku (variant-level).
| Field | Type | Required | Description |
|---|---|---|---|
shop_sku | string | yes | Variant-level SKU in your shop (variant identity) |
standard | object | yes | Variant options as a key/value map — see Product images & variant options |
sale_price | number | yes | Variant sale price (decimal, 2 places) |
weight | number | yes | Variant weight (decimal, 2 places) |
weight_unit | string | yes | Variant weight unit, e.g. kg (default) or g |
sku | string | no | Your internal SKU; used to match the primary catalog when present |
ean | string | no | EAN / barcode |
price | number | no | Variant list price before discount |
suggest_price | number | no | Variant suggested price |
length | number | no | Length (decimal) |
width | number | no | Width (decimal) |
height | number | no | Height (decimal) |
length_unit | string | no | Length unit, default cm |
unit | string | no | Selling unit label |
hs_code | string | no | HS customs code (recommended for cross-border) |
mqq | integer | no | Minimum order quantity, default 1 |
step | integer | no | Order quantity step, default 1 |
dg | boolean | no | Dangerous goods flag, default false |
dg_standard | string | no | Dangerous goods standard, if dg is true |
Product images & variant options
standard, primary_image_key and images work together to describe variant options and map each variant to its images. They are structured JSON, not flat strings.
standard (variant object) — a key/value map of option name → option value. Keys are your option dimensions, values are that variant's choice:
{ "color": "black", "size": "500W" }A product with no real options may use a single synthetic option, e.g. { "id": "3241" }.
primary_image_key (product object) — the name of the option in standard that selects the image group. It is an option name, not an image key. It is usually color (each color has its own photos) or id for single-variant products.
images (product object) — a JSON object whose keys are the possible values of the primary_image_key option, and whose values are arrays of image URLs for that option value:
{
"black": ["https://cdn.example.com/pps500-black-1.jpg", "https://cdn.example.com/pps500-black-2.jpg"],
"white": ["https://cdn.example.com/pps500-white-1.jpg"]
}How they resolve. For a given variant, the platform reads images[ standard[primary_image_key] ] to get that variant's photos. In the example above, if primary_image_key = "color" and a variant's standard.color = "black", its images are the black array. If a variant's option value is missing from images, the first image group is used as a fallback.
Rules
- Every distinct value of the
primary_image_keyoption that appears across your variants should have a matching key inimages. - Image entries must be full, publicly reachable URLs.
- For a single-variant product, use
primary_image_key: "id", setstandard: { "id": "<any stable value>" }, and keyimagesby that same value, e.g.{ "<value>": ["https://.../main.jpg"] }.
Order amount object
Each entry in the order_amount array. Represents one fee / charge line of the order. Provide the lines that make up the order total; fee_code identifies the line type and is used to de-duplicate lines within one order.
| Field | Type | Required | Description |
|---|---|---|---|
subject | string | yes | Human-readable description of the fee line |
amount | number | yes | Amount, decimal (2 places), must be >= 0.01 |
currency | string | yes | ISO 4217 currency code, e.g. EUR |
fee_code | string | recommended | Fee line type — see codes below |
Recognized fee_code values (as used by the platform):
fee_code | Meaning | Example subject |
|---|---|---|
sub_total | Product subtotal (sum of line prices) | Product Total |
discount_fee | Order-level discount (as a positive amount on a discount line) | Discount |
actual_shipping | Actual shipping fee charged | Actual Shipping Fee |
adjust_shipping | Shipping adjustment | Adjust Shipping Fee |
tax | Tax / VAT | Tax |
pay_commission | Payment / settlement commission | Settlement Fee |
return_fee | Return-related fee | Return Fee |
At minimum, send sub_total, tax, and a shipping line (actual_shipping) when applicable; other codes are optional.
cURL
curl -X POST 'https://apigate.e2c-energy.com/channel/api/v1/order/submit' \
-H 'request-token: YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"shop_id": 123,
"shop_order_no": "SO-1001",
"shipping_standard": "STD",
"payment_method": "bank_transfer",
"purchase_time": "2026-07-22 10:00:00",
"billing_address": {
"full_name": "John Doe",
"company": "Doe GmbH",
"tax_id": "DE123456789",
"country_code": "DE",
"province": "Bavaria",
"city": "Munich",
"address1": "Marienplatz 1",
"postcode": "80331",
"tel": "+49 89 000000",
"email": "john@doe.example"
},
"shipping_address": {
"full_name": "John Doe",
"country_code": "DE",
"province": "Bavaria",
"city": "Munich",
"address1": "Marienplatz 1",
"postcode": "80331",
"tel": "+49 89 000000"
},
"order_item": [
{
"quantity": 2,
"price": 49.9,
"shop_order_item_primary_key": "LINE-1",
"item": {
"title": "Portable Power Station",
"shop_sku": "PPS-500",
"sale_price": 49.9,
"weight": 5.2,
"weight_unit": "kg",
"images": {
"black": [
"https://cdn.example.com/pps500-black-1.jpg",
"https://cdn.example.com/pps500-black-2.jpg"
]
},
"primary_image_key": "color",
"mpn": "PPS500",
"ean": "4006381333931",
"variant": {
"shop_sku": "PPS-500-BLK",
"sku": "PPS-500-BLK",
"standard": {
"color": "black",
"size": "500W"
},
"sale_price": 49.9,
"weight": 5.2,
"weight_unit": "kg",
"hs_code": "8507600000"
}
}
}
],
"order_amount": [
{
"subject": "Product Total",
"amount": 99.8,
"currency": "EUR",
"fee_code": "sub_total"
},
{
"subject": "Actual Shipping Fee",
"amount": 9.9,
"currency": "EUR",
"fee_code": "actual_shipping"
},
{
"subject": "Tax",
"amount": 20.94,
"currency": "EUR",
"fee_code": "tax"
}
]
}'Response
{ "code": 200, "msg": "order submit succeed", "data": { "order_id": 456 } }Error Codes
| code | Meaning |
|---|---|
| 909 | Missing/invalid token, disabled app, or non-channel_partner type |
| 400 | Shop not bound to this channel partner, or request validation failed |
Idempotency
Submitting the same shop_id + shop_order_no again within a short window is de-duplicated: the existing order is returned rather than creating a duplicate.