# 05. Shopping
# About platform logistics order process, please refer to the Documentation
# 1 Order
# 1.1 Create Order V2(POST)
- Create order
payType=1or omitted: page payment (default), andcjPayUrlwill be returnedpayType=2: balance payment, and the order will continue through add-to-cart, order confirmation, and balance deductionpayType=3: create the order only without initiating payment, add-to-cart, or order confirmation- Add param platformToken to header, The way to obtain platformToken is the same as the way to obtain CJ Access Token. If not required, the value can be empty. (2025-01-08 update)
# URL
https://developers.cjdropshipping.com/api2.0/v1/shopping/order/createOrderV2
# CURL
curl --location --request POST 'https://developers.cjdropshipping.com/api2.0/v1/shopping/order/createOrderV2' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'platformToken: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data-raw '{
"orderNumber": "1234",
"shippingZip": "123",
"shippingCountry": "123",
"shippingCountryCode": "US",
"shippingProvince": "123",
"shippingCity": "132",
"shippingCounty": "",
"shippingPhone": "111",
"shippingCustomerName": "123213",
"shippingAddress": "123213",
"shippingAddress2": "123213",
"taxId": "123",
"remark": "note",
"email": "",
"consigneeID": "",
"payType": "",
"shopAmount": "",
"logisticName": "PostNL",
"fromCountryCode": "CN",
"houseNumber": "123",
"platform": "shopify",
"iossType": "",
"iossNumber": "",
"orderFlow": 1,
"products": [
{
"vid": "92511400-C758-4474-93CA-66D442F5F787",
"quantity": 1,
"storeLineItemId": "test-lineItemId-1111"
}
]
}'
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| orderNumber | Order number | string | Y | 50 | |
| shippingZip | Zip of destination | string | N | 20 | |
| shippingCountryCode | Destination country code | string | Y | 20 | Use a two-letter country code |
| shippingCountry | Destination country | string | Y | 50 | |
| shippingProvince | Destination province/state | string | Y | 50 | |
| shippingCity | Destination city | string | Y | 50 | |
| shippingCounty | Destination county | string | N | 50 | |
| shippingPhone | Recipient phone number | string | N | 20 | |
| shippingCustomerName | Recipient name | string | Y | 50 | |
| shippingAddress | Recipient address line 1 | string | Y | 200 | |
| shippingAddress2 | Recipient address line 2 | string | N | 200 | |
| houseNumber | House number | string | N | 20 | |
| string | N | 50 | |||
| taxId | Tax ID | string | N | 20 | |
| remark | Order remark | string | N | 500 | |
| consigneeID | Consignee ID | string | N | 20 | |
| payType | Payment type | int | N | 10 | 1=page payment, 2=balance payment, 3=create order only |
| isSandbox | Sandbox order flag | integer | N | 1 | 0=normal order, 1=sandbox order |
| shopAmount | Order amount | BigDecimal | N | 20 | |
| logisticName | Logistics name | string | Y | 50 | |
| fromCountryCode | Shipping country | string | Y | 20 | Use a two-letter country code |
| platform | Platform type, default Api | string | N | 20 | Refer to Platforms |
| shopLogisticsType | Shipping mode | int | N | 20 | 1=platform logistics, 2=merchant logistics, 3=platform logistics with CJ-assigned warehouse |
| storageId | CJ warehouse ID | string | N | 40 | Used when shopLogisticsType=1 |
| iossType | IOSS type | int | N | 20 | 1=no IOSS, 2=use your IOSS, 3=use CJ IOSS |
| iossNumber | IOSS number | string | N | 10 | |
| storeName | Store name | String | N | 50 | If provided, the system will validate that the store name matches an API store in CJ system. If not provided, the order will be assigned to the default API store |
| storeOrderTime | Store order time | Long | N | 20 | Timestamp in seconds. Represents the actual order creation time in the customer's store. If the time is later than the current system time, an error will be returned |
| orderFlow | Order flow type, default value: 1 | int | N | 10 | Order flow type. Options: 1=Manual order flow (create order using CJ variants, default), 2=Store order flow (supports creating orders using store SKUs, requires Store Product linked to CJ products in My CJ). Launched on 2025-05-19 |
| products | List | Y | 20 | ||
| - vid | CJ variant id | string | N | 50 | vid and sku cannot both be null. When vid is missing, sku will be used to query the CJ variant. If both are provided, they must refer to the same variant and will be validated accordingly. If the customer account has been granted permission to submit non-CJ SKUs, then the vid field is required |
| - sku | CJ variant sku | string | N | 50 | vid and sku cannot both be null. When vid is missing, sku will be used to query the CJ variant. If both are provided, they must refer to the same variant and will be validated accordingly. |
| - storeProductId | Store product id | String | N | 64 | used as the store product's platform product id, saved to the store product table and passed to the order center; Launched on 2026-06-02 |
| - storeProductImg | Store product image | String | N | 500 | used as the store product's platform product image, saved to the store product table and passed to the order center; Launched on 2026-06-02 |
| - quantity | quantity | int | Y | 50 | |
| - unitPrice | item pricing | BigDecimal | N | 20 | |
| - storeLineItemId | lineItemId of your store order | string | N | 125 | |
| - podProperties | POD customization information | String | N | 500 | podProperties is a string,1:Pod2.0 Example: [{"areaName":"LogoArea","links":["https://cc-west-usa.oss-us-west-1.aliyuncs.com/9f0b99e6-17ec-4dcd-8916-fc5d644be993_LOGO_NavyBlue.png"],"type":"1"}] 2:Pod3.0 Example:[{"links": ["Production image URL (multiple allowed)"],"effectImgs": ["Rendering image URL (exactly one required)"]}] |
# Return
success
{
"code": 200,
"result": true,
"message": "Success",
"data": {
"orderNumber": "",
"orderId": "123434",
"shipmentOrderId": "",
"iossAmount": "",
"iossTaxHandlingFee": "",
"postageAmount": "",
"productAmount": "",
"productOriginalAmount": "",
"productDiscountAmount": "",
"postageDiscountAmount": "",
"postageOriginalAmount": "",
"totalDiscountAmount": "",
"actualPayment": "",
"orderOriginalAmount": "",
"cjPayUrl": "",
"orderAmount": "",
"logisticsMiss": "",
"productInfoList": [
{
"storeLineItemId": "test-lineItemId-1111",
"lineItemId": "",
"variantId": "",
"isGroup": true,
"quantity":10,
"subOrderProducts": [
{
"lineItemId": "",
"variantId": "",
"quantity": 1
}
]
}
],
"orderStatus": "",
"interceptOrderReasons": [
{
"code": 1001,
"message": ""
}
]
},
"requestId": "9eddf3f5-bd3d-4fae-a4f2-028cbb90db97",
"success": true
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| code | error code | int | 20 | Reference error code |
| result | Whether or not the return is normal | boolean | 1 | |
| message | return message | string | 200 | |
| data | return data | object | interface data return | |
| requestId | requestId | string | 48 | Flag request for logging errors |
data information
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| orderId | CJ order id | string | 200 | If the provided product VID is not a CJ SKU, the order id will change, and thus the CJ order id will not be returned. You can monitor the webhook to obtain the latest CJ order id |
| orderNumber | orderNumber | string | 200 | |
| shipmentOrderId | shipment order id | string | 200 | |
| iossAmount | ioss amount | BigDecimal | (18,2) | Unit: $ (USD) |
| iossTaxHandlingFee | ioss tax | BigDecimal | (18,2) | Unit: $ (USD) |
| postageAmount | postage amount | BigDecimal | (18,2) | Unit: $ (USD) |
| productAmount | product amount | BigDecimal | (18,2) | Unit: $ (USD) |
| productOriginalAmount | total amount of products (before discount) | BigDecimal | (18,2) | Unit: $ (USD) |
| productDiscountAmount | product discount amount | BigDecimal | (18,2) | Unit: $ (USD) |
| postageDiscountAmount | postage discount amount | BigDecimal | (18,2) | Unit: $ (USD) |
| postageOriginalAmount | postage amount (before discount) | BigDecimal | (18,2) | Unit: $ (USD) |
| totalDiscountAmount | the total amount of the order after discount | BigDecimal | (18,2) | Unit: $ (USD) |
| actualPayment | the amount actually paid | BigDecimal | (18,2) | Unit: $ (USD) |
| orderOriginalAmount | original order amount | BigDecimal | (18,2) | Unit: $ (USD) |
| cjPayUrl | CJ pay url | string | 200 | |
| orderAmount | order amount | BigDecimal | 200 | |
| logisticsMiss | logistics missing mark | Boolean | 10 | |
| orderStatus | Order status | string | 10 | Referer Order Status |
| productInfoList | product information | list | ||
| interceptOrderReasons | order interception information | list |
product information
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| storeLineItemId | lineItemId of your store order | string | 125 | |
| lineItemId | lineItemId of CJ order | string | 50 | |
| variantId | variant id | string | 50 | |
| quantity | quantity | int | 20 | |
| isGroup | Main product label | boolean | 10 | |
| subOrderProducts | combination product | list | 10 | |
| - lineItemId | Unique ID of the order item in CJ | string | 50 | |
| - variantId | variant id | string | 50 | |
| - quantity | quantity | int | 20 |
Order interception information
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| code | code | int | 50 | |
| message | message | string | 200 |
error
{
"code": 1600100,
"result": false,
"message": "Param error",
"data": null,
"requestId": "323fda9d-3c94-41dc-a944-5cc1b8baf5b1"
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| code | error code | int | 20 | Reference error code |
| result | Whether or not the return is normal | boolean | 1 | |
| message | return message | string | 200 | |
| data | return data | object | interface data return | |
| requestId | requestId | string | 48 | Flag request for logging errors |
# 1.2 Create Order V3(POST)
- Create order
- Add param platformToken to header, The way to obtain platformToken is the same as the way to obtain CJ Access Token. If not required, the value can be empty. (2025-01-08 update)
# URL
https://developers.cjdropshipping.com/api2.0/v1/shopping/order/createOrderV3
# CURL
curl --location --request POST 'https://developers.cjdropshipping.com/api2.0/v1/shopping/order/createOrderV3' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'platformToken: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data-raw '{
"orderNumber": "1234",
"shippingZip": "123",
"shippingCountry": "123",
"shippingCountryCode": "US",
"shippingProvince": "123",
"shippingCity": "132",
"shippingCounty": "",
"shippingPhone": "111",
"shippingCustomerName": "123213",
"shippingAddress": "123213",
"shippingAddress2": "123213",
"taxId": "123",
"remark": "note",
"email": "",
"consigneeID": "",
"shopAmount": "",
"logisticName": "PostNL",
"fromCountryCode": "CN",
"houseNumber": "123",
"iossType": "",
"platform": "shopify",
"iossNumber": ""
"shopLogisticsType": 1,
"storageId": "201e67f6ba4644c0a36d63bf4989dd70",
"orderFlow": 1,
"products": [
{
"vid": "92511400-C758-4474-93CA-66D442F5F787",
"quantity": 1,
"storeLineItemId": "test-lineItemId-1111"
}
]
}'
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| orderNumber | A unique identifier for the order from CJ partner. | string | Y | 50 | |
| shippingZip | Zip of destination | string | N | 20 | |
| shippingCountryCode | Country code of destination | string | Y | 20 | Referer:Country Code, Please use The two-letter code |
| shippingCountry | Country of destination | string | Y | 50 | |
| shippingProvince | Province of destination | string | Y | 50 | |
| shippingCity | City of destination | string | Y | 50 | |
| shippingCounty | County of destination | String | N | 50 | |
| shippingPhone | Phone number of destination | string | N | 20 | |
| shippingCustomerName | Customer name | string | Y | 50 | |
| shippingAddress | Shipping address of destination | string | Y | 200 | |
| shippingAddress2 | Shipping address 2 of destination | string | N | 200 | |
| houseNumber | House Number | String | N | 20 | |
| String | N | 50 | |||
| taxId | Tax Id | string | N | 20 | |
| remark | Order remark | string | N | 500 | |
| consigneeID | consignee id | string | N | 20 | |
| shopAmount | Order Amount | BigDecimal | N | 20 | |
| logisticName | logistic name | string | Y | 50 | Referer Freight Calculation |
| fromCountryCode | Country code of the shipment from | string | Y | 20 | Referer:Country Code, Please use The two-letter code |
| platform | Platform, Default: Api | String | N | 20 | If this parameter is not passed, the default platform Api will be used. Referer Platforms |
| iossType | IOSS Type | int | N | 20 | IOSS Type, Options: 1=No IOSS(The recipient will be required to pay VAT and other related fees when the order is declared without IOSS.), 2=Declare with my own IOSS(Please ensure that the IOSS provided is valid and is linked to the destination country in the EU. The declaration will proceed without IOSS if the destination country is not linked to a correct IOSS.), 3=Declare with CJ’s IOSS(Declaration with your store order amount is recommended. You will be responsible for the relevant risks if you choose to declare with CJ order amount. CJ’s IOSS is not applicable for orders valued above €150, and the recipient will be required to pay VAT.), Config Page (opens new window) |
| iossNumber | IOSS Number | String | N | 10 | If iossType=3, the value is fixed to CJ-IOSS |
| shopLogisticsType | Shipping mode, default value: 2 | int | N | 20 | Shipping type, Options: 1=Platform Logistics (storageId specified by you, required. When choosing platform logistics mode, the warehouse will start operation after uploading the shipping label. Please upload the shipping label in a timely manner, Upload Shipping and Shipping Label), 2=Seller Logistics (storageId will not be used), 3=Platform Logistics (storageId specified by CJ). If no requirement, please use 2=merchant logistics. Launched on 2025-11-18 |
| storageId | CJ warehouse ID | String | N | 40 | This value is valid when shopLogisticsType=1, Added on 2025-11-18 |
| storeName | Store name | String | N | 50 | If provided, the system will validate that the store name matches an API store in CJ system. If not provided, the order will be assigned to the default API store |
| storeOrderTime | Store order time | Long | N | 20 | Timestamp in seconds. Represents the actual order creation time in the customer's store. If the time is later than the current system time, an error will be returned |
| orderFlow | Order flow type, default value: 1 | int | N | 10 | Order flow type. Options: 1=Manual order flow (create order using CJ variants, default), 2=Store order flow (supports creating orders using store SKUs, requires Store Product linked to CJ products in My CJ). Launched on 2025-05-19 |
| isSandbox | Is sandbox order | integer | N | 1 | Default 0. 0-normal order; 1-sandbox order. Regardless of payType value, sandbox orders will automatically use fake/simulated payment and will not generate real charges, real logistics, or fulfillment |
| products | List | Y | 20 | ||
| - vid | CJ variant ID | string | N | 50 | vid and sku cannot both be null. When vid is missing, sku will be used to query the CJ variant. If both are provided, they must refer to the same variant and will be validated accordingly. If the customer account has been granted permission to submit non-CJ SKUs, then the vid field is required |
| - sku | CJ variant sku | string | N | 50 | vid and sku cannot both be null. When vid is missing, sku will be used to query the CJ variant. If both are provided, they must refer to the same variant and will be validated accordingly. |
| - storeProductId | Store product id | String | N | 64 | used as the store product's platform product id, saved to the store product table and passed to the order center; Launched on 2026-06-02 |
| - storeProductImg | Store product image | String | N | 500 | used as the store product's platform product image, saved to the store product table and passed to the order center; Launched on 2026-06-02 |
| - quantity | quantity | int | Y | 50 | |
| - unitPrice | item pricing | BigDecimal | N | 20 | |
| - storeLineItemId | lineItemId of your store order | string | N | 125 | |
| - podProperties | POD customization information | String | N | 500 | podProperties is a string,1:Pod2.0 Example: [{"areaName":"LogoArea","links":["https://cc-west-usa.oss-us-west-1.aliyuncs.com/9f0b99e6-17ec-4dcd-8916-fc5d644be993_LOGO_NavyBlue.png"],"type":"1"}] 2:Pod3.0 Example:[{"links": ["Production image URL (multiple allowed)"],"effectImgs": ["Rendering image URL (exactly one required)"]}] |
# Return
success
{
"code": 200,
"result": true,
"message": "Success",
"data": {
"orderNumber": "",
"orderId": "123434',
"shipmentOrderId": "",
"iossAmount": ,
"iossTaxHandlingFee": ,
"iossAmount": ,
"postageAmount": ,
"productAmount": "",
"productOriginalAmount": "",
"productDiscountAmount": "",
"postageDiscountAmount": "",
"postageOriginalAmount": "",
"totalDiscountAmount": "",
"actualPayment": "",
"orderOriginalAmount": "",
"cjPayUrl": "",
"orderAmount": "",
"logisticsMiss": "",
"productInfoList": [
{
"storeLineItemId": "test-lineItemId-1111",
"lineItemId": "",
"variantId": "",
"isGroup": true,
"quantity":10,
"subOrderProducts": [
{
"lineItemId": "",
"variantId": "",
"quantity": ""
}
]
}
],
"orderStatus": "",
"interceptOrderReasons": [
{
"code": 1001,
"message": ""
}
]
},
"requestId": "9eddf3f5-bd3d-4fae-a4f2-028cbb90db97"
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| code | error code | int | 20 | Reference error code |
| result | Whether or not the return is normal | boolean | 1 | |
| message | return message | string | 200 | |
| data | return data | object | interface data return | |
| requestId | requestId | string | 48 | Flag request for logging errors |
data information
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| orderId | CJ order id | string | 200 | If the provided product VID is not a CJ SKU, the order id will change, and thus the CJ order id will not be returned. You can monitor the webhook to obtain the latest CJ order id |
| orderNumber | customer order number | string | 200 | |
| shipmentOrderId | shipment order id | string | 200 | |
| iossAmount | ioss amount | BigDecimal | (18,2) | Unit: $ (USD) |
| iossTaxHandlingFee | ioss tax | BigDecimal | (18,2) | Unit: $ (USD) |
| postageAmount | postage amount | BigDecimal | (18,2) | Unit: $ (USD) |
| productAmount | product amount | BigDecimal | (18,2) | Unit: $ (USD) |
| productOriginalAmount | total amount of products (before discount) | BigDecimal | (18,2) | Unit: $ (USD) |
| productDiscountAmount | product discount amount | BigDecimal | (18,2) | Unit: $ (USD) |
| postageDiscountAmount | postage discount amount | BigDecimal | (18,2) | Unit: $ (USD) |
| postageOriginalAmount | postage amount (before discount) | BigDecimal | (18,2) | Unit: $ (USD) |
| totalDiscountAmount | the total amount of the order after discount | BigDecimal | (18,2) | Unit: $ (USD) |
| actualPayment | the amount actually paid | BigDecimal | (18,2) | Unit: $ (USD) |
| orderOriginalAmount | original order amount | BigDecimal | (18,2) | Unit: $ (USD) |
| cjPayUrl | CJ pay url | string | 200 | |
| orderAmount | order amount | BigDecimal | 200 | |
| logisticsMiss | logistics missing mark | Boolean | 10 | |
| orderStatus | order status | string | 10 | Referer Order Status |
| productInfoList | product information | list | ||
| interceptOrderReasons | order interception information | list |
product information
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| storeLineItemId | lineItemId of your store order | String | 125 | |
| lineItemId | Unique ID of the order item in CJ | string | 50 | |
| variantId | variant id | string | 50 | |
| quantity | quantity | int | 20 | |
| isGroup | Main product label | boolean | 10 | |
| subOrderProducts | combination product | list | 10 | |
| - lineItemId | Unique ID of the order item in CJ | string | 50 | |
| - variantId | CJ variant id | string | 50 | |
| - quantity | quantity | int | 20 |
Order interception information
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| code | code | int | 50 | |
| message | message | string | 200 |
error
{
"code": 1600100,
"result": false,
"message": "Param error",
"data": null,
"requestId": "323fda9d-3c94-41dc-a944-5cc1b8baf5b1"
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| code | error code | int | 20 | Reference error code |
| result | Whether or not the return is normal | boolean | 1 | |
| message | return message | string | 200 | |
| data | return data | object | interface data return | |
| requestId | requestId | string | 48 | Flag request for logging errors |
# 1.3 Add Cart
# URL
https://developers.cjdropshipping.com/api2.0/v1/shopping/order/addCart
# CURL
curl --location --request POST 'https://developers.cjdropshipping.com/api2.0/v1/shopping/order/addCart' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data-raw '{
"cjOrderIdList": ["SD25080109282603297001"]
}'
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| cjOrderIdList | CJ order id | List | Y | 200 | Query |
# Return
success
{
"success": true,
"code": 200,
"message": "Congratulation! Well done!",
"data": {
"successCount": 1,
"addSuccessOrders": [
"SD25080109282603297001"
],
"unInterceptAddressCount": 0,
"interceptOrders": []
}
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| code | error code | int | 20 | Reference error code |
| result | Whether or not the return is normal | boolean | 1 | |
| message | return message | string | 200 | |
| data | return data | object | interface data return | |
| requestId | requestId | string | 48 | Flag request for logging errors |
error
{
"code": 1603001,
"result": false,
"message": "order confirm fail",
"data": null,
"requestId": "7dc61955-c0e8-4731-bb9b-393b4fffeaaf"
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| code | error code | int | 20 | Reference error code |
| result | Whether or not the return is normal | boolean | 1 | |
| message | return message | string | 200 | |
| data | return data | object | interface data return | |
| requestId | requestId | string | 48 | Flag request for logging errors |
# 1.4 Add Cart Confirm (POST)
# URL
https://developers.cjdropshipping.com/api2.0/v1/shopping/order/addCartConfirm
# CURL
curl --location --request POST 'https://developers.cjdropshipping.com/api2.0/v1/shopping/order/addCartConfirm' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data-raw '{
"cjOrderIdList": ["SD25080109282603297001"]
}'
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| cjOrderIdList | CJ order id | List | Y | 200 | Query |
# Return
success
{
"success": true,
"code": 200,
"message": "Congratulation! Well done!",
"data": {
"successCount": 1,
"submitSuccess": true,
"shipmentsId": "",
"result": 0,
"interceptOrders": []
}
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| code | error code | int | 20 | Reference error code |
| result | Whether or not the return is normal | boolean | 1 | |
| message | return message | string | 200 | |
| data | return data | object | interface data return | |
| - successCount | Success Count | |||
| - submitSuccess | Is the submission successful | |||
| - shipmentsId | Shipment Order Id | |||
| - result | ||||
| - interceptOrders | Intercepted order ID List | List | ||
| requestId | requestId | string | 48 | Flag request for logging errors |
error
{
"code": 1603001,
"result": false,
"message": "order confirm fail",
"data": null,
"requestId": "7dc61955-c0e8-4731-bb9b-393b4fffeaaf"
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| code | error code | int | 20 | Reference error code |
| result | Whether or not the return is normal | boolean | 1 | |
| message | return message | string | 200 | |
| data | return data | object | interface data return | |
| requestId | requestId | string | 48 | Flag request for logging errors |
# 1.5 Save Generate Parent Order(POST)
# URL
https://developers.cjdropshipping.com/api2.0/v1/shopping/order/saveGenerateParentOrder
# CURL
curl --location --request POST 'https://developers.cjdropshipping.com/api2.0/v1/shopping/order/saveGenerateParentOrder' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data-raw '{
"shipmentOrderId": "SD25080109282603297001"
}'
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| shipmentOrderId | Shipment Order Id | string | Y | 200 | Query |
# Return
success
{
"success": true,
"message": "",
"data": {
"orderMoney": 99.99,
"payExpireTime": "2024-12-31 23:59:59",
"payId": "PAY123456789",
"result": 0,
"submitSuccess": true,
"unMatchOrderCodes": ["ORDER001", "ORDER002"],
"successOrders": ["ORDER003", "ORDER004"],
"unMatchProductCodes": ["PROD001", "PROD002"],
"paymentInformation": {
"actualPayment": 89.99,
"balanceDeduction": 10.00,
"billAmount": 12.50,
"canDeduct": true,
"commodityDiscount": 5.00,
"commodityTotalAmount": 94.99,
"couponAmount": 15.00,
"freight": 5.00,
"iossAmount": 2.50,
"iossNumber": "IOSS123456",
"iossTaxHandlingFee": 0.50,
"iossTaxes": 2.00,
"iossType": 3,
"orderOriginalAmount": 104.99,
"orderProductAmount": 94.99,
"payableAmount": 89.99,
"postageDiscount": 0.00,
"serviceFee": 1.00
},
"interceptOrders": [
]
}
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| code | error code | int | 20 | Reference error code |
| result | Whether or not the return is normal | boolean | 1 | |
| message | return message | string | 200 | |
| data | return data | object | interface data return | |
| requestId | requestId | string | 48 | Flag request for logging errors |
error
{
"code": 1603001,
"result": false,
"message": "order confirm fail",
"data": null,
"requestId": "7dc61955-c0e8-4731-bb9b-393b4fffeaaf"
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| code | error code | int | 20 | Reference error code |
| result | Whether or not the return is normal | boolean | 1 | |
| message | return message | string | 200 | |
| data | return data | object | interface data return | |
| requestId | requestId | string | 48 | Flag request for logging errors |
# 1.6 List Order(GET)
# URL
https://developers.cjdropshipping.com/api2.0/v1/shopping/order/list?pageNum=1&pageSize=10
# CURL
curl --location --request GET 'https://developers.cjdropshipping.com/api2.0/v1/shopping/order/list?pageNum=1&pageSize=10' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| pageNum | Page number | int | N | 20 | Default 1 |
| pageSize | Quantity of results on each page | int | N | 20 | Default 20 |
| orderIds | order id | string[] | N | 100 | |
| shipmentOrderId | Shipment Order Id | string | N | 100 | |
| status | order status | string | N | 200 | default: CANCELLED, values: CREATED,IN_CART,UNPAID,UNSHIPPED,SHIPPED,DELIVERED,CANCELLED,OTHER |
# Return
success
{
"code": 200,
"result": true,
"message": "Success",
"data": {
"pageNum": 1,
"pageSize": 10,
"total": 6859,
"list": [
{
"orderId": "1377085655003308032",
"orderNum": "50166125936666",
"cjOrderId": null,
"shippingCountryCode": "SG",
"shippingProvince": "Singapore",
"shippingCity": "Singapore",
"shippingPhone": "6587997352",
"shippingAddress": "Singapore,07 Anson Tanjong Pagar,79 ANSON ROAD,79 Anson Road #01-01, Phoenix Tower",
"shippingCustomerName": "KUDO KANJI ",
"remark": "",
"orderWeight": 0,
"orderStatus": "CREATED",
"orderAmount": null,
"productAmount": 0,
"postageAmount": null,
"logisticName": null,
"trackNumber": null,
"createDate": "2021-03-31 00:46:39",
"paymentDate": null,
"productList": null,
"storageId": "201e67f6ba4644c0a36d63bf4989dd70",
"storageName": "Cranbury Warehouse"
}...
]
}
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| orderId | order id | string | 200 | |
| orderNum | order name | string | 200 | |
| cjOrderId | CJ order id | string | 200 | |
| shippingCountryCode | country code | string | 200 | |
| shippingProvince | province | string | 200 | |
| shippingCity | city | string | 200 | |
| shippingAddress | shipping address | string | 200 | |
| shippingCustomerName | shipping name | string | Y | 200 |
| shippingPhone | phone number | string | 200 | |
| remark | order remark | string | 500 | |
| logisticName | logistic name | string | 200 | |
| trackNumber | track number | string | 200 | |
| trackingUrl | tracking URL | string | N | 200 |
| orderWeight | order weight | int | 20 | |
| orderAmount | order amount | BigDecimal | (18,2) | Unit: $ (USD) |
| orderStatus | order status | string | 200 | Referer Order Status |
| createDate | create time | string | 200 | |
| paymentDate | pay time | string | 200 | |
| storeCreateDate | Store order creation time | DateTime | 1 | UTC Time, eg: 2025-03-14 13:21:07 |
| isSandbox | Is sandbox order | integer | 1 | 0-no, 1-yes |
| privateOutboundOrder | Whether a private inventory outbound order | boolean | true=private inventory outbound order, false=regular order. Consistent with the webhook order message | |
| productAmount | product amount | BigDecimal | (18,2) | Unit: $ (USD) |
| postageAmount | postage amount | BigDecimal | (18,2) | Unit: $ (USD) |
| storageId | storage id | string | 200 | Added on 2025-11-18 |
| storageName | storage name | string | 200 | Added on 2025-11-18 |
error
{
"code": 1600100,
"result": false,
"message": "Param error",
"data": null,
"requestId": "323fda9d-3c94-41dc-a944-5cc1b8baf5b1"
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| code | error code | int | 20 | Reference error code |
| result | Whether or not the return is normal | boolean | 1 | |
| message | return message | string | 200 | |
| data | return data | object | interface data return | |
| requestId | requestId | string | 48 | Flag request for logging errors |
# 1.7 Query Order(GET)
# URL
https://developers.cjdropshipping.com/api2.0/v1/shopping/order/getOrderDetail?orderId=210711100018043276
# CURL
curl --location --request GET 'https://developers.cjdropshipping.com/api2.0/v1/shopping/order/getOrderDetail?orderId=210711100018043276&features=f1&features=f2' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
# Request Parameters
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| orderId | order id | string | Y | 200 | support: Custom order id, CJ order id |
| features | features | List<String> | false | 20 | If a feature is passed in, the relevant function will be enabled. If multiple features are required, pass multiple feature parameters |
# Feature enumeration
| Enumeration | Description |
|---|---|
| LOGISTICS_TIMELINESS | Enable querying logistics timeliness. After passing in this feature enumeration, logisticTimelines will be returned in the results |
# Response
success
{
"code": 200,
"result": true,
"message": "Success",
"data": {
"orderId": "210823100016290555",
"orderNum": "api_52f268d40b8d460e82c0683955e63cc9",
"platformOrderId": "6387689586969",
"cjOrderId": null,
"shippingCountryCode": "US",
"shippingProvince": "Connecticut",
"shippingCity": "ftdsr",
"shippingPhone": "43514123",
"shippingAddress": "rfdxf rfdesr",
"shippingCustomerName": "Xu Old",
"remark": null,
"orderWeight": 20,
"orderStatus": "CREATED",
"orderAmount": 4.25,
"productAmount": 0.57,
"postageAmount": 3.68,
"logisticName": "CJPacket Ordinary",
"trackNumber": null,
"createDate": "2021-08-23 11:31:45",
"paymentDate": null,
"isComplete":1,
"fromCountryCode":"CN",
"storageId": "201e67f6ba4644c0a36d63bf4989dd70",
"storageName": "Cranbury Warehouse",
"productList": [
{
"vid": "1392053744945991680",
"quantity": 1,
"sellPrice": 0.57,
"podPropertiesInfo": null,
"lineItemId": "2505170958390976500",
"storeLineItemId": "16045188153625",
"productionOrderStatus": 1,
"abnormalType": [
6,
9
]
}
]
},
"requestId": "3adccdcb-d41b-4808-996b-c7c5c833d77d"
}
POD order return information
{
"code": 200,
"result": true,
"message": "Success",
"data": {
"orderId": "210823100016290555",
"orderNum": "api_52f268d40b8d460e82c0683955e63cc9",
"cjOrderId": null,
"platformOrderId": "6387689586969",
"shippingCountryCode": "US",
"shippingProvince": "Connecticut",
"shippingCity": "ftdsr",
"shippingPhone": "43514123",
"shippingAddress": "rfdxf rfdesr",
"shippingCustomerName": "Xu Old",
"remark": null,
"orderWeight": 20,
"orderStatus": "CREATED",
"orderAmount": 4.25,
"productAmount": 0.57,
"postageAmount": 3.68,
"logisticName": "CJPacket Ordinary",
"trackNumber": null,
"createDate": "2021-08-23 11:31:45",
"paymentDate": null,
"isComplete": 1,
"fromCountryCode": "CN",
"storageId": "201e67f6ba4644c0a36d63bf4989dd70",
"storageName": "Cranbury Warehouse",
"productList": [
{
"vid": "1392053744945991680",
"quantity": 1,
"sellPrice": 0.57,
"lineItemId": "2505170958390976500",
"storeLineItemId": "16045188153625",
"productionOrderStatus": 1,
"abnormalType": [
6,
9
]
"podPropertiesInfo": {
"image": "https://pod-picture.oss-cn.aliyuncs.com/LX/PO-211-12729261699191806-1.jpg",
"isFixedCustom": false,
"podVersion": 3,
"failedList": [],
"effectImgList": [
"https://pod-picture.oss-cn.aliyuncs.com/LX/PO-211-1.jpg?podThumbnailUrl=https%3A%2F%2Fpod-picture.oss-cn.aliyuncs.com%2Fpod%2F250428%2Fpod-picture_oss-cn-211-12729261699191806-1_jpg.1440x1440.webp&podOriginSize=638820&podOriginPxUrl=https%3A%2F%2Fpod-picture.oss-cn-hangzhou.aliyuncs.com%2Fpod_infinity%2F250428%2Fpod-picture_oss-cn-hangzhou_aliyuncs_com_LX_PO-211-12729261699191806-1_jpg.InfinityxInfinity.webp&podOriginPx=1936_1854&podOriginOss=https%3A%2F%2Fpod-picture.oss-cn-hangzhou.aliyuncs.com%2Fpod_origin%2F250428%2Fpod-picture_oss-cn-hangzhou_aliyuncs_com_LX_PO-211-1_jpg.InfinityxInfinity.jpg"
],
"finish": 1,
"customResources": [],
"type": 5,
"customMessgae": {
"podType": 1,
"color": {},
"zone": {
"back": {},
"front": {}
}
},
"productionImgList": [
"https://pod-picture.oss-cn.aliyuncs.com/LX/PO-211-1.jpg?podThumbnailUrl=https%3A%2F%2Fpod-picture.oss.aliyuncs.com%2Fpod%2F250428%2Fpod-picture_oss-cn-hangzhou_aliyuncs_com_LX_PO-211-12729261699191806-1_jpg.1440x1440.webp&podOriginSize=638820&podOriginPxUrl=https%3A%2F%2Fpod-picture.oss-cn-hangzhou.aliyuncs.com%2Fpod_infinity%2F250428%2Fpod-picture_oss-cn-hangzhou_aliyuncs_com_LX_PO-211-12729261699191806-1_jpg.InfinityxInfinity.webp&podOriginPx=1936_1854&podOriginOss=https%3A%2F%2Fpod-picture.oss-cn-hangzhou.aliyuncs.com%2Fpod_origin%2F250428%2Fpod-picture_oss-cn-hangzhou_aliyuncs_com_LX_PO-211-12729261699191806-1_jpg.InfinityxInfinity.jpg"
],
"customDesign": [
{
"img": "https://oss-cf.cjdropshipping.com/product/2025/04/22/01/180af06e-7b7-4662-b975-070203989480.jpg",
"areaNameEn": "",
"printWidth": "50",
"typeName": "",
"type": "1",
"scaleX": "1",
"backImgList": [
{
"color": "1pcs",
"imgSrc": "https://oss-cf.cjdropshipping.com/product/2025/04/22/01/00e2483-b3b2-4873-80ac-e71f4d760e1f.jpg"
},
{
"color": "4pcs",
"imgSrc": "https://oss-cf.cjdropshipping.com/product/2025/04/22/01/0c42181-d63f-49f9-b6d5-d55574027fcb.jpg"
},
{
"color": "10pcs",
"imgSrc": "https://oss-cf.cjdropshipping.com/product/2025/04/22/01/1ae2f95-5484-4d30-a93f-64bc740832d2.jpg"
},
{
"color": "16pcs",
"imgSrc": "https://oss-cf.cjdropshipping.com/product/2025/04/22/01/53ce421-33db-4249-8862-f36ad20083b5.jpg"
},
{
"color": "18pcs",
"imgSrc": "https://oss-cf.cjdropshipping.com/product/2025/04/22/01/245e348-a87b-4196-a3a4-056f6b391301.jpg"
}
],
"printHeight": "50",
"scaleY": "1",
"podType": "4",
"top": "297.99999928474426",
"areaName": "DIY",
"left": "253.99999994039536",
"areaType": "1",
"imgicon": "",
"angle": "0",
"fontSize": 12,
"fontSpace": 0,
"sku": ""
}
]
}
}
]
},
"requestId": "3adccdcb-d41b-4808-996b-c7c5c833d77d"
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| orderId | order id | string | 200 | |
| orderNum | order name | string | 200 | |
| platformOrderId | Shop order ID | string | 200 | |
| cjOrderId | CJ order id | string | 200 | |
| cjOrderCode | CJ order code | string | 200 | |
| fromCountryCode | shipment country code | string | 200 | |
| shippingCountryCode | Recipient country code | string | 200 | |
| shippingProvince | Recipient province | string | 200 | |
| shippingCity | Recipient city | string | 200 | |
| shippingAddress | Recipient address | string | 200 | |
| shippingCustomerName | Recipient name | string | 200 | |
| shippingPhone | Recipient phone number | string | 200 | |
| remark | order remark | string | 500 | |
| logisticName | logistic name | string | 200 | |
| trackNumber | track number | string | 200 | |
| trackingUrl | tracking URL | string | 200 | |
| disputeId | CJ dispute ID | string | 50 | |
| orderWeight | order weight | int | 20 | |
| orderAmount | Order amount | BigDecimal | (18,2) | Unit: $ (USD) |
| orderStatus | Order status | string | 200 | Referer Order Status |
| createDate | Create time | string | 200 | UTC Time |
| paymentDate | Pay time | string | 200 | UTC Time |
| outWarehouseTime | Delivery time | DateTime | 1 | UTC Time, eg: 2025-03-14 13:21:07 |
| storeCreateDate | Store order creation time | DateTime | 1 | UTC Time, eg: 2025-03-14 13:21:07 |
| productAmount | product amount | BigDecimal | (18,2) | Unit: $ (USD) |
| isComplete | Is the order complete? 1: Complete 0: Incomplete | Number | 1 | |
| isSandbox | Is sandbox order | integer | 1 | 0-no, 1-yes |
| storageId | storage id | string | 200 | Added on 2025-11-18 |
| storageName | storage name | string | 200 | Added on 2025-11-18 |
| privateOutboundOrder | Whether a private inventory outbound order | boolean | true=private inventory outbound order, false=regular order. Consistent with the webhook order message | |
| productList | Product List | list | 200 | |
| - vid | Variant Id | string | 200 | |
| - quantity | quantity | int | 20 | |
| - sellPrice | Sell Price | BigDecimal | (18,2) | unit:$(USA) |
| - storeLineItemId | The lineItemId of your store order | string | 125 | |
| - lineItemId | Unique ID of the order item in CJ | string | 50 | |
| - productionOrderStatus | Production Status | Number | 1 | 1=Pending Order, 2=Pending Production, 3=In Production, 4=Production Completed, 5=Production Abnormality |
| - abnormalType | Abnormal Reason | int[] | 6= Image link error, 9= Production drawings don't match the renderings, 10= Missing hanging ring, 11= Mismatch between die-cutting diagram and printing diagram, 12= uneven edges, 13= letters not connected, 14= Missing order images | |
| - podPropertiesInfo | pod product order return information | Object | ||
| -- effectImgList | Product renderings | List | 200 | |
| -- customResources | Finished product information | List | 200 | |
| -- productionImgList | Production diagram | List | 200 | |
| logisticsTimeliness | Logistics Timeliness | Object | ||
| - logisticsModes | Logistics List | List | ||
| -- logisticsName | Logistics Name | string | DHL Official | |
| -- arrivalTime | Arrival Time (Day) | string | 3-7 Days |
Order Status
| Order Status | Status | remark |
|---|---|---|
| CREATED | order create | create order, wait confirm |
| IN_CART | in cart | wait confirm, api merge this state |
| UNPAID | unpaid | confirm order, CJ order number create |
| UNSHIPPED | unshipped | paid, wait for sending |
| SHIPPED | shipped | in transit, get tracking number |
| DELIVERED | delivered | clients receving |
| CANCELLED | cancelled |
error
{
"code": 1600100,
"result": false,
"message": "Param error",
"data": null,
"requestId": "323fda9d-3c94-41dc-a944-5cc1b8baf5b1"
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| code | error code | int | 20 | Reference error code |
| result | Whether or not the return is normal | boolean | 1 | |
| message | return message | string | 200 | |
| data | return data | object | interface data return | |
| requestId | requestId | string | 48 | Flag request for logging errors |
# Error code and Message
| Error Code | Message |
|---|---|
| 1600300 | order not found |
| 1600300 | orderId must be not empty |
| 1600300 | The maximum number of features is 20 |
# 1.8 Order Delete(DEL)
Only orders whose status is CREATED (created, not yet added to cart) or IN_CART (in cart) can be deleted. Once an order has been confirmed or moved to a later state (UNPAID, UNSHIPPED, SHIPPED, DELIVERED, CANCELLED, etc.), it cannot be deleted via this endpoint.
# URL
https://developers.cjdropshipping.com/api2.0/v1/shopping/order/deleteOrder?orderId=210711100018655344
# CURL
curl --location --request DELETE 'https://developers.cjdropshipping.com/api2.0/v1/shopping/order/deleteOrder?orderId=210711100018655344' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| orderId | order id | string | Y | 200 | Query |
# Return
success
{
"code": 200,
"result": true,
"message": "Success",
"data": "210711100018655344",
"requestId": "721341bf-abf8-4d8c-b400-1fbdaef79039"
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| code | error code | int | 20 | Reference error code |
| result | Whether or not the return is normal | boolean | 1 | |
| message | return message | string | 200 | |
| data | return data | object | interface data return | |
| requestId | requestId | string | 48 | Flag request for logging errors |
error
{
"code": 1600100,
"result": false,
"message": "Param error",
"data": null,
"requestId": "323fda9d-3c94-41dc-a944-5cc1b8baf5b1"
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| code | error code | int | 20 | Reference error code |
| result | Whether or not the return is normal | boolean | 1 | |
| message | return message | string | 200 | |
| data | return data | object | interface data return | |
| requestId | requestId | string | 48 | Flag request for logging errors |
# 1.9 Confirm Order(PATCH)
# URL
https://developers.cjdropshipping.com/api2.0/v1/shopping/order/confirmOrder
# CURL
curl --location --request PATCH 'https://developers.cjdropshipping.com/api2.0/v1/shopping/order/confirmOrder' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data-raw '{
"orderId": "210711100018655344"
}'
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| orderId | order id | string | Y | 200 | Query |
# Return
success
{
"code": 200,
"result": true,
"message": "Success",
"data": "210711100018655344",
"requestId": "721341bf-abf8-4d8c-b400-1fbdaef79039"
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| code | error code | int | 20 | Reference error code |
| result | Whether or not the return is normal | boolean | 1 | |
| message | return message | string | 200 | |
| data | return data | object | interface data return | |
| requestId | requestId | string | 48 | Flag request for logging errors |
error
{
"code": 1603001,
"result": false,
"message": "order confirm fail",
"data": null,
"requestId": "7dc61955-c0e8-4731-bb9b-393b4fffeaaf"
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| code | error code | int | 20 | Reference error code |
| result | Whether or not the return is normal | boolean | 1 | |
| message | return message | string | 200 | |
| data | return data | object | interface data return | |
| requestId | requestId | string | 48 | Flag request for logging errors |
# 1.10 Change Order Warehouse
- The warehouse of the orders of the platform logistics can be modified through this interface.
# URL
https://developers.cjdropshipping.com/api2.0/v1/shopping/order/changeWarehouse
# CURL
curl --location 'http://localhost:8081/api2.0/v1/shopping/order/changeWarehouse' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data '{
"orderCode": "123",
"storageId": "1234"
}'
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| orderCode | order code | string | Y | 200 | Query |
| storageId | storage id | string | Y | 200 | Query |
# Return
success
{
"code": 200,
"result": true,
"message": "Congratulation! Well done!",
"data": true,
"requestId": "c627424a858444ef861484ba8d1bee48",
"success": true
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| code | error code | int | 20 | Reference error code |
| result | Whether or not the return is normal | boolean | 1 | |
| message | return message | string | 200 | |
| data | return data | object | interface data return | |
| requestId | requestId | string | 48 | Flag request for logging errors |
error
{
"code": 1603001,
"result": false,
"message": "order query fail",
"data": false,
"requestId": "7dc61955-c0e8-4731-bb9b-393b4fffeaaf"
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| code | error code | int | 20 | Reference error code |
| result | Whether or not the return is normal | boolean | 1 | |
| message | return message | string | 200 | |
| data | return data | object | interface data return | |
| requestId | requestId | string | 48 | Flag request for logging errors |
# 1.11 Sandbox Simulate Pay(POST)
# URL
https://developers.cjdropshipping.com/api2.0/v1/shopping/sandbox/simulatePay
# CURL
curl --location --request POST 'https://developers.cjdropshipping.com/api2.0/v1/shopping/sandbox/simulatePay' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data-raw '{
"orderId": "210711100018655344"
}'
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| orderId | CJ order id | string | N | 200 | CJ order id of the sandbox order, either this or shipmentOrderId |
| shipmentOrderId | Parent order id | string | N | 200 | Batch simulate pay for all sandbox sub-orders, either this or orderId |
Parameter Note: At least one of
orderIdorshipmentOrderIdis required. PassorderIdto simulate pay for a single sub-order; passshipmentOrderIdto batch simulate pay for all sandbox sub-orders under the parent order.Note: When a parent order contains multiple sub-orders, you cannot use
orderIdto simulate pay for a single sub-order. Please useshipmentOrderIdto batch simulate pay for all sub-orders.Scope: Only supports sandbox orders created with
isSandbox=1. This API only simulates payment success and will not generate real charges, real logistics, or fulfillment.
# Return
success
{
"code": 200,
"result": true,
"message": "Success",
"data": true,
"requestId": "9eddf3f5-bd3d-4fae-a4f2-028cbb90db97"
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| code | error code | int | 20 | Reference error code |
| result | Whether or not the return is normal | boolean | 1 | |
| message | return message | string | 200 | |
| data | simulate pay result | boolean | true-success | |
| requestId | requestId | string | 48 | Flag request for logging errors |
# 1.12 Sandbox Update Status(POST)
# URL
https://developers.cjdropshipping.com/api2.0/v1/shopping/sandbox/updateStatus
# CURL
curl --location --request POST 'https://developers.cjdropshipping.com/api2.0/v1/shopping/sandbox/updateStatus' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data-raw '{
"orderId": "210711100018655344",
"targetStatus": 400
}'
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| orderId | CJ order id | string | Y | 200 | The CJ order id of the sandbox order |
| targetStatus | Target status code | integer | Y | 20 | Optional: 400(unshipped), 500(shipped), 600(completed), 700(closed) |
Scope: Only supports sandbox orders created with
isSandbox=1. Status update only simulates sandbox order status flow and will not trigger real logistics or fulfillment.
Status Flow Rule: Status can only flow in order: 300→400→500→600→700. Cannot skip or revert.
# Return
success
{
"code": 200,
"result": true,
"message": "Success",
"data": true,
"requestId": "9eddf3f5-bd3d-4fae-a4f2-028cbb90db97"
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| code | error code | int | 20 | Reference error code |
| result | Whether or not the return is normal | boolean | 1 | |
| message | return message | string | 200 | |
| data | update status result | boolean | true-success | |
| requestId | requestId | string | 48 | Flag request for logging errors |
# Order Status
| Order Status | remark |
|---|---|
| CREATED | Order Created |
| IN_CART | Order in cart |
| UNPAID | Order unpaid |
| UNSHIPPED | Order has been paid and is currently pending shipment |
| SHIPPED | Order Shipped and in transit |
| DELIVERED | Package delivered |
| CANCELLED | Order cancelled |
# 2 Payment
# 2.1 Get Balance(GET)
# URL
https://developers.cjdropshipping.com/api2.0/v1/shopping/pay/getBalance
# CURL
curl --location --request GET 'https://developers.cjdropshipping.com/api2.0/v1/shopping/pay/getBalance' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
# Return
success
{
"code": 200,
"result": true,
"message": "Success",
"data": {
"amount": 87247.32,
"noWithdrawalAmount": null,
"freezeAmount": null
},
"requestId": "36fc030a-a110-4318-bc83-f39f9d3e5484"
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| noWithdrawalAmount | Bonus amount | BigDecimal | (18,2) | Unit: $ (USD) |
| freezeAmount | Frozen amount | BigDecimal | (18,2) | Unit: $ (USD) |
| amount | Amount | BigDecimal | (18,2) | Unit: $ (USD) |
error
{
"code": 1600100,
"result": false,
"message": "Param error",
"data": null,
"requestId": "323fda9d-3c94-41dc-a944-5cc1b8baf5b1"
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| code | error code | int | 20 | Reference error code |
| result | Whether or not the return is normal | boolean | 1 | |
| message | return message | string | 200 | |
| data | return data | object | interface data return | |
| requestId | requestId | string | 48 | Flag request for logging errors |
# 2.2 Pay Balance(POST)
# URL
https://developers.cjdropshipping.com/api2.0/v1/shopping/pay/payBalance
# CURL
curl --location --request POST 'https://developers.cjdropshipping.com/api2.0/v1/shopping/pay/payBalance' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data-raw '{
"orderId": "12"
}'
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| orderId | Order id | string | Y | 200 |
Sandbox Note: If the order is a sandbox order (isSandbox=1), balance payment will use fake/simulated payment without real charges.
Note: When a parent order contains multiple sub-orders, you cannot use this API to pay by a single
orderId. Please use the "Pay Balance V2" API withshipmentOrderIdinstead.
# Return
success
{
"code": 200,
"result": true,
"message": "Success",
"data": null,
"requestId": "7dbe69b9-dd82-4ee3-907c-a6fca833e3ce"
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| code | error code | int | 20 | Reference error code |
| result | Whether or not the return is normal | boolean | 1 | |
| message | return message | string | 200 | |
| data | return data | object | interface data return | |
| requestId | requestId | string | 48 | Flag request for logging errors |
error
{
"code": 1600100,
"result": false,
"message": "Param error",
"data": null,
"requestId": "323fda9d-3c94-41dc-a944-5cc1b8baf5b1"
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| code | error code | int | 20 | Reference error code |
| result | Whether or not the return is normal | boolean | 1 | |
| message | return message | string | 200 | |
| data | return data | object | interface data return | |
| requestId | requestId | string | 48 | Flag request for logging errors |
# 2.3 Pay Balance V2(POST)
# URL
https://developers.cjdropshipping.com/api2.0/v1/shopping/pay/payBalanceV2
# CURL
curl --location --request POST 'https://developers.cjdropshipping.com/api2.0/v1/shopping/pay/payBalanceV2' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data-raw '{
"shipmentOrderId": "12",
"payId": "12"
}'
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| shipmentOrderId | Shipment order Id | string | Y | 200 | |
| payId | PayId | String | N | 200 | Optional, system will auto-generate if not provided |
Sandbox Note: If all sub-orders under the parent order are sandbox orders (isSandbox=1), payBalanceV2 will automatically use sandbox simulated payment without real charges. Sandbox orders and normal orders are not allowed to be in the same parent order.
# Return
success
{
"code": 200,
"result": true,
"message": "Success",
"data": null,
"requestId": "7dbe69b9-dd82-4ee3-907c-a6fca833e3ce"
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| code | error code | int | 20 | Reference error code |
| result | Whether or not the return is normal | boolean | 1 | |
| message | return message | string | 200 | |
| data | return data | object | interface data return | |
| requestId | requestId | string | 48 | Flag request for logging errors |
error
{
"code": 1600100,
"result": false,
"message": "Param error",
"data": null,
"requestId": "323fda9d-3c94-41dc-a944-5cc1b8baf5b1"
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| code | error code | int | 20 | Reference error code |
| result | Whether or not the return is normal | boolean | 1 | |
| message | return message | string | 200 | |
| data | return data | object | interface data return | |
| requestId | requestId | string | 48 | Flag request for logging errors |
# 3 Shipping Info
# 3.1 Upload Shipping Info(POST)
# URL
https://developers.cjdropshipping.com/api2.0/v1/shopping/order/uploadWaybillInfo
Tips:
- When uploading the waybill file, please submit the request in multipart/form data format.
- This interface can only be called after CJ order payment.
# CURL
curl --location 'https://developers.cjdropshipping.com/api2.0/v1/shopping/order/uploadWaybillInfo' \
--header 'CJ-Access-Token:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ' \
--form 'orderId="2511111146000642900"' \
--form 'waybillFile=@"/C:/Users/Desktop/abcd.pdf"' \
--form 'cjOrderId="DP2511111145580643400"' \
--form 'cjShippingCompanyName="USPS"' \
--form 'trackNumber="123123"'
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| orderId | Order Id | string | Y | 200 | |
| cjOrderId | CJ Order Id | string | Y | 200 | |
| cjShippingCompanyName | CJ Shipping Company Name | string | Y | 200 | Referer:Get Storage Info, Get:logisticsBrandList |
| trackNumber | Track Number | string | Y | 200 | |
| waybillFile | waybill document | MultipartFile | Y | 200 |
# Return
success
{
"success": true,
"message": "",
"result": true,
"data": true,
"requestId": "52f1888a3b4f451d889a84218f2b50dc"
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| code | error code | int | 20 | Reference error code |
| result | Whether or not the return is normal | boolean | 1 | |
| message | return message | string | 200 | |
| data | return data | Boolean | interface data return | |
| requestId | requestId | string | 48 | Flag request for logging errors |
error
{
"code": 806,
"result": false,
"message": "Warehouse “null” does not support logistics carrier “USPS”.",
"data": null,
"requestId": "309ad9d884ff4994b34f0da17853b970",
"success": false
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| code | error code | int | 20 | Reference error code |
| result | Whether or not the return is normal | boolean | 1 | |
| message | return message | string | 200 | |
| data | return data | object | interface data return | |
| requestId | requestId | string | 48 | Flag request for logging errors |
# 3.2 Update Shipping Info(POST)
# URL
https://developers.cjdropshipping.com/api2.0/v1/shopping/order/updateWaybillInfo
# CURL
curl --location 'https://developers.cjdropshipping.com/api2.0/v1/shopping/order/updateWaybillInfo' \
--header 'CJ-Access-Token:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ' \
--form 'orderId="2511111146000642900"' \
--form 'waybillFile=@"/C:/Users/Desktop/abcd.pdf"' \
--form 'cjOrderId="DP2511111145580643400"' \
--form 'cjShippingCompanyName="USPS"' \
--form 'trackNumber="123123"'
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| orderId | Order Id | string | Y | 200 | |
| cjOrderId | CJ Order Id | string | Y | 200 | |
| cjShippingCompanyName | CJ Shipping Company Name | string | Y | 200 | Referer:Get Storage Info, Get:logisticsBrandList |
| trackNumber | Track Number | string | Y | 200 | |
| waybillFile | waybill document | MultipartFile | Y | 200 |
# Return
success
{
"success": true,
"message": "",
"result": true,
"data": true,
"requestId": "52f1888a3b4f451d889a84218f2b50dc"
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| code | error code | int | 20 | Reference error code |
| result | Whether or not the return is normal | boolean | 1 | |
| message | return message | string | 200 | |
| data | return data | Boolean | interface data return | |
| requestId | requestId | string | 48 | Flag request for logging errors |
error
{
"code": 804,
"result": false,
"message": "This order does not use store platform logistics. Label upload not supported.",
"data": null,
"requestId": "715937dad5844ec49d51be43541eeb00",
"success": false
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| code | error code | int | 20 | Reference error code |
| result | Whether or not the return is normal | boolean | 1 | |
| message | return message | string | 200 | |
| data | return data | object | interface data return | |
| requestId | requestId | string | 48 | Flag request for logging errors |
# 3.3 UPDATE POD Pictures(POST)
# URL
https://developers.cjdropshipping.com/api2.0/v1/shopping/order/podProductCustomPicturesEdit
# CURL
curl --location --request POST 'https://developers.cjdropshipping.com/api2.0/v1/shopping/order/podProductCustomPicturesEdit' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'platformToken: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data-raw '{
"podPicturesEditParams": [
{
"orderCode": "123",
"lineItemId": "111",
"effectImgList": [
"https://oss-cf.cjdropshipping.com/product/2025/04/22/01/245e348-a87b-4196-a3a4-056f6b391301.jpg"
],
"productionImgList": [
"https://oss-cf.cjdropshipping.com/product/2025/04/22/01/245e348-a87b-4196-a3a4-056f6b391301.jpg"
]
}
]
}'
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| podPicturesEditParams | List | Y | |||
| -orderCode | CJ order id | string | Y | 200 | |
| -lineItemId | Unique ID of the order item in CJ | string | Y | 200 | |
| -effectImgList | Product renderings | List | Y | 200 | |
| -productionImgList | Production diagram | List | Y | 200 |
# Return
success
{
"code": 200,
"result": true,
"message": "Congratulation! Well done!",
"data": {
"list": [
{
"orderCode": "123",
"lineItemId": "111",
"result": 2,
"failedMessage": null
},
{
"orderCode": "456",
"lineItemId": "666",
"result": 0,
"failedMessage": "No matching order number found"
}
]
},
"requestId": "fa65ceae2f5740459c3e8dc8cf32124c",
"success": true
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| code | error code | int | 20 | Reference error code |
| result | Whether or not the return is normal | boolean | 1 | |
| message | return message | string | 200 | |
| data | return data | Object | interface data return | |
| requestId | requestId | string | 48 | Flag request for logging errors |
data information
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| list | List | Y | ||
| -orderCode | CJ order id | string | 200 | |
| -lineItemId | Unique ID of the order item in CJ | string | 200 | |
| -result | update result 0:fail, 1: Processing, 2: success | int | 20 | |
| -failedMessage | fail reason | string | 200 |
Error
{
"code": 804,
"result": false,
"message": "Param error",
"data": null,
"requestId": "715937dad5844ec49d51be43541eeb00",
"success": false
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| code | error code | int | 20 | Reference error code |
| result | Whether or not the return is normal | boolean | 1 | |
| message | return message | string | 200 | |
| data | return data | Object | interface data return | |
| requestId | requestId | string | 48 | Flag request for logging errors |
# 4 COGS
# 4.1 Query COGS Basic Data Order Info (POST)
Query basic data order information list based on provided order codes.
# URL
https://developers.cjdropshipping.com/api2.0/v1/shopping/order/queryCogsBasicDataOrderInfoList
# CURL
curl --location 'https://developers.cjdropshipping.com/api2.0/v1/shopping/order/queryCogsBasicDataOrderInfoList' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data '{
"orderCodesList": ["DP2506140734320969300"]
}'
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| orderCodesList | List of CJ order codes | List<String> | Y | - | CJ order number list |
# Return
success
{
"code": 200,
"data": [
{
"cogsBasicDataOrderInfoJson": {
"a": "CJ2506144290356158893",
"c": null,
"d": 1,
"e": 6,
"f": 0.74,
"g": 6.58,
"h": 5.84,
"i": null,
"ii": "38",
"j": "2025-06-14T07:44:31"
},
"orderCode": "DP2506140734320969300",
"originalOrderCode": "",
"paymentDate": "2025-06-14T07:44:31",
"userId": "e11a3d3e3230401ab3984c59949be6a9"
}
],
"message": "",
"success": true
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| orderCode | Order code | string | 200 | |
| originalOrderCode | Original order code | string | 200 | For split orders: original code; for merged orders: pre-merge code |
| paymentDate | Payment time | LocalDateTime | - | |
| userId | User ID | string | 200 | |
| cogsBasicDataOrderInfoJson | Basic data details | object | - | See CogsBasicDataOrderInfoJson below |
# CogsBasicDataOrderInfoJson
| Attribute | Type | JSON Field | Definition |
|---|---|---|---|
| shipmentsOrderId | String | a | Parent order ID |
| merchantNumber | String | s | Customer ID |
| payFlag | Integer | d | Payment flag (1: paid) |
| postage | BigDecimal | f | Total postage after discount |
| totalAmount | BigDecimal | g | Total order amount |
| orderProductAmount | BigDecimal | h | Total product amount |
| paymentDate | LocalDateTime | j | Payment time |
| taxesInfo | Object | k | Tax information |
| productInfoMap | Map | z | Product data (productCode → ProductInfo) |
| disputeInfoMap | Map | x | Dispute data (disputeId → DisputeInfo) |
| diffAmountInfoMap | Map | c | Supplementary payment info (diffCode → DiffAmountInfo) |
| storeOrderInfo | Object | n | Store order information |
| isOutOfStockSplit | Integer | m | Out-of-stock split flag |
| isReissue | Integer | Reissue order flag (0: no, 1: yes) | |
| outStockFee | BigDecimal | rr | Out-stock fee |
| storeCostFee | BigDecimal | tt | Storage cost fee |
| resendParcelFeeMap | Map | yy | Re-dispatch fee for problematic parcels |
| isReOrder | Integer | uu | Re-order flag |
| store | String | ii | Warehouse number |
| storeSkuProcessFlag | Integer | oo | Store SKU processing flag |
| countryCode | String | pp | Receiving country code |
# ProductInfo
| Attribute | Type | JSON Field | Definition |
|---|---|---|---|
| productCode | String | pc | Product code |
| groupProductCode | String | q | Group product code (for combined products) |
| sku | String | w | SKU |
| isGroupMain | Integer | e | Main product of combination (0: no, 1: yes) |
| grams | BigDecimal | r | Weight in grams |
| price | BigDecimal | t | Actual paid unit price |
| quantity | Integer | y | Product quantity |
| productType | String | u | Product type (0: normal, 1: service, 3: packaging, 4: supplier, 5: supplier-shipped, 6: virtual) |
| img | String | z | Product image |
| isGift | Integer | h | Is gift (0: no, 1: yes) |
| couponOrderProductAmount | BigDecimal | j | Coupon amount |
| headPostage | BigDecimal | n | Head-postage per private inventory item |
# DisputeInfo
| Attribute | Type | JSON Field | Definition |
|---|---|---|---|
| productPriceFinal | BigDecimal | q | Final product refund amount |
| iossTaxesFinal | BigDecimal | e | Final IOSS tax |
| iossTaxHandlingFeeFinal | BigDecimal | r | Final IOSS handling fee |
| ddpHandlingFee | BigDecimal | t | Final DDP handling fee |
| dutyTaxesFinal | BigDecimal | y | Final duty tax |
| icmsTaxesFinal | BigDecimal | u | Final circulation tax |
| postageFinal | BigDecimal | p | Final refunded shipping fee |
| outboundCostFinal | BigDecimal | s | Final refunded outbound cost |
| storageCostFinal | BigDecimal | d | Final refunded storage cost |
error
{
"code": 1600100,
"result": false,
"message": "Param error",
"data": null,
"requestId": "323fda9d-3c94-41dc-a944-5cc1b8baf5b1"
}
# 5 Merge Order
# 5.1 Auto Match Merge Order List (POST)
Get list of automatically matched mergeable orders.
# URL
https://developers.cjdropshipping.com/api2.0/v1/shopping/mergeOrder/autoMatchMergeOrderListV3
# CURL
curl --location 'https://developers.cjdropshipping.com/api2.0/v1/shopping/mergeOrder/autoMatchMergeOrderListV3' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data '{
"filterOrder": true,
"orderStatus": 100
}'
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| filterOrder | Filter manually removed orders | boolean | Y | 1 | |
| orderStatus | Order status | int | Y | 10 | 100: Complete order page, 101: Shopping cart page |
# Return
success
{
"code": 200,
"data": [
{
"haveMoreShopOrder": true,
"mergeShopOrderVOList": [
{
"city": "Shanghai",
"country": "China",
"countryCode": "CN",
"customerName": "John",
"logisticsInfoList": [
{
"logisticsName": "PostNL",
"postage": 18.00,
"arrivalTime": "2023-11-20",
"isChecked": true
}
]
}
]
}
],
"message": "success",
"success": true
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| haveMoreShopOrder | Has multiple store orders | boolean | 1 | false: no, true: yes |
| mergeShopOrderVOList | Store order list | Array | - | |
| - city | City | string | 200 | |
| - country | Country | string | 200 | |
| - countryCode | Country code | string | 20 | |
| - customerName | Customer name | string | 200 | |
| - logisticsInfoList | Logistics options list | Array | - | |
| -- logisticsName | Logistics name | string | 200 | |
| -- postage | Postage | decimal | - | |
| -- arrivalTime | Estimated arrival time | string | 200 | |
| -- isChecked | Currently selected logistics | boolean | 1 | |
| -- basePostage | Base postage | decimal | - | |
| -- packPrice | Packaging postage | decimal | - | |
| -- remoteAmount | Remote area fee | decimal | - |
# 5.2 Auto Merge Query Progress (POST)
Query the asynchronous processing progress of auto match merge order list.
# URL
https://developers.cjdropshipping.com/api2.0/v1/shopping/mergeOrder/autoMergeQueryProgress
# CURL
curl --location 'https://developers.cjdropshipping.com/api2.0/v1/shopping/mergeOrder/autoMergeQueryProgress' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json'
# Return
success
{
"code": 200,
"data": {
"noTask": false,
"step": 2,
"stepCount": [10, 20, 30, 10, 30],
"stepPercent": 5000
},
"message": "success",
"success": true
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| noTask | No submitted tasks to process | boolean | 1 | |
| step | Current step | int | 10 | |
| stepCount | Step ratio array | Array | - | Array length = step count, elements = step weight |
| stepPercent | Current step progress | int | 10 | Max 10000 |
# 5.3 Auto Merge Query Result (POST)
Query asynchronous results of automatically matched merged orders, returning store order information and logistics options.
# URL
https://developers.cjdropshipping.com/api2.0/v1/shopping/mergeOrder/autoMergeQueryResult
# CURL
curl --location 'https://developers.cjdropshipping.com/api2.0/v1/shopping/mergeOrder/autoMergeQueryResult' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json'
# Return
success
{
"code": 200,
"data": [
{
"haveMoreShopOrder": true,
"mergeShopOrderVOList": [
{
"city": "Shanghai",
"country": "China",
"countryCode": "CN",
"customerName": "John",
"logisticsInfoList": [
{
"logisticsName": "PostNL",
"postage": 18.00,
"arrivalTime": "2023-11-20"
}
],
"mergeOrderInfoList": [
{
"orderCode": "CJ123456789",
"orderNumber": "ORD987654",
"platform": "shopify",
"shopName": "My Store"
}
],
"phone": "13800138000",
"shippingAddress": "123 Main St"
}
]
}
],
"message": "success",
"success": true
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| haveMoreShopOrder | Has multiple store orders | boolean | 1 | false: no, true: yes |
| mergeShopOrderVOList | Store order list | Array | - | |
| - mergeOrderInfoList | Merge order info list | Array | - | |
| -- orderCode | CJ order code | string | 200 | |
| -- orderNumber | Customer order number | string | 200 | |
| -- platform | Platform | string | 50 | |
| -- shopName | Shop name | string | 200 |
# 5.4 Submit Merge Order Batch (POST)
Submit merged orders with auto-matched groups, combining multiple eligible orders into one.
# URL
https://developers.cjdropshipping.com/api2.0/v1/shopping/mergeOrder/submitMergeOrderBatchV3
# CURL
curl --location 'https://developers.cjdropshipping.com/api2.0/v1/shopping/mergeOrder/submitMergeOrderBatchV3' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data '[
{
"logisticName": "PostNL",
"orderCodeList": ["CJ123456789", "CJ987654321"],
"orderNumber": "ORD123456",
"orderStatus": 100,
"packType": 0
}
]'
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| logisticName | Logistics name | string | Y | 50 | |
| orderCodeList | CJ order codes to merge | List<String> | Y | - | |
| orderNumber | Customer store order number | string | Y | 50 | |
| orderStatus | Order status | int | Y | 10 | 100: Complete order page, 101: Shopping cart |
| packType | Packaging type | int | Y | 1 | 0: SKU, 1: Store |
# Return
success
{
"code": 200,
"data": {
"failGroupCount": 0,
"failOrderCount": 0,
"mergeFailOrderGroupList": [],
"newOrderCodeList": ["CJ999888777"],
"successGroupCount": 1,
"successOrderCount": 2
},
"message": "success",
"success": true
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| failGroupCount | Number of failed groups | int | 10 | |
| failOrderCount | Number of failed orders | int | 10 | |
| mergeFailOrderGroupList | Failed order list with reasons | Array | - | |
| - errorCode | Error code | int | 10 | 200: success, 11001-11007: various errors, 11100: other |
| - orderCodes | Order codes | Array | - | |
| newOrderCodeList | Successfully merged order codes | Array | - | |
| successGroupCount | Number of successful groups | int | 10 | |
| successOrderCount | Number of successful orders | int | 10 |
# 5.5 Submit Merge Progress (POST)
Query the asynchronous processing progress of submitted merged orders.
# URL
https://developers.cjdropshipping.com/api2.0/v1/shopping/mergeOrder/submitProgress
# CURL
curl --location 'https://developers.cjdropshipping.com/api2.0/v1/shopping/mergeOrder/submitProgress' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json'
# Return
success
{
"code": 200,
"data": {
"noTask": false,
"step": 1,
"stepCount": [10, 20, 30, 10, 30],
"stepPercent": 8000
},
"message": "success",
"success": true
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| noTask | No submission tasks to process | boolean | 1 | |
| step | Current step | int | 10 | |
| stepCount | Step ratio array | Array | - | Array length = step count |
| stepPercent | Current step progress | int | 10 | Max 10000 |
# 5.6 Submit Merge Result (POST)
Get asynchronous processing results of submitted merged orders, returning information about successfully merged and failed orders.
# URL
https://developers.cjdropshipping.com/api2.0/v1/shopping/mergeOrder/submitResult
# CURL
curl --location 'https://developers.cjdropshipping.com/api2.0/v1/shopping/mergeOrder/submitResult' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json'
# Return
success
{
"code": 200,
"data": {
"failGroupCount": 0,
"failOrderCount": 0,
"mergeFailOrderGroupList": [],
"newOrderCodeList": ["CJ999888777"],
"successGroupCount": 1,
"successOrderCount": 2
},
"message": "success",
"success": true
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| failGroupCount | Number of failed groups | int | 10 | |
| failOrderCount | Number of failed orders | int | 10 | |
| mergeFailOrderGroupList | Failed order list with reasons | Array | - | |
| - errorCode | Error code | int | 10 | 200: success, 11001: only 1 order selected, 11002: order exception, 11003: empty order, 11004: address mismatch, 11005: no available logistics, 11006: supplier self-shipped order, 11007: order status changed, 11100: other error |
| - orderCodes | Order codes | Array | - | |
| newOrderCodeList | Successfully merged order codes | Array | - | |
| successGroupCount | Number of successful groups | int | 10 | |
| successOrderCount | Number of successful orders | int | 10 |
# 6 Address Management
Address Management APIs maintain the address book for the current account. This is an account-level address-book capability, not a create-order element for any specific ordering flow. The server fills the user context from the current CJ-Access-Token; do not pass userId or token in the request body.
# 6.1 List Addresses (POST)
URL: https://developers.cjdropshipping.com/api2.0/v1/shopping/privateInventory/address/list
curl --location --request POST 'https://developers.cjdropshipping.com/api2.0/v1/shopping/privateInventory/address/list' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data-raw '{}'
data[].id is the address-book record ID. Private-inventory SY order creation itself does not use this field.
# 6.2 Create Address (POST)
URL: https://developers.cjdropshipping.com/api2.0/v1/shopping/privateInventory/address/create
curl --location --request POST 'https://developers.cjdropshipping.com/api2.0/v1/shopping/privateInventory/address/create' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data-raw '{
"firstName": "Gilbert",
"lastName": "Soria",
"country": "United States",
"countryCode": "US",
"province": "OH",
"city": "HUBER HEIGHTS",
"address": "3419 BROADMOOR BLVD1",
"addressNew": "Apt 123",
"zip": "222260",
"phone": "9322331159",
"mail": "test@example.com",
"isDefault": "0"
}'
# 6.3 Update Address (POST)
URL: https://developers.cjdropshipping.com/api2.0/v1/shopping/privateInventory/address/update
All create-address fields can be updated. The id field is additionally required. If only the zip code changes, still use this endpoint: first get the full address fields from the address list, then submit id, all mandatory address fields, and the new zip.
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| id | Address ID | string | Required for update | 100 | From the address list response |
| firstName | First name | string | Required for create/update | 100 | |
| lastName | Last name | string | Required for create/update | 100 | |
| country | Country name | string | Required for create/update | 100 | |
| countryCode | Two-letter country code | string | Required for create/update | 10 | Refer to country standards |
| province | Province/state | string | Required for create/update | 100 | |
| city | City | string | Required for create/update | 100 | |
| address | Address line 1 | string | Required for create/update | 200 | |
| addressNew | Address line 2 | string | N | 200 | |
| zip | Zip code | string | N | 30 | Address data field. To change the zip code, submit it through the Update Address endpoint. |
| phone | Phone | string | N | 30 | |
| string | N | 100 | |||
| isDefault | Default address flag | string | N | 1 | 0-no, 1-yes |
| countyTown | County/town | string | N | 100 | |
| consigneeId | Consignee ID | string | N | 100 |
# 6.4 Address API response fields
| Field | Definition | Type | Note |
|---|---|---|---|
| data | Address API business data | object/list/boolean | The list API returns an array; create/update returns the address operation result |
| data[].id | Address ID | string | Address-book record ID; not a private-inventory create-order field |
| data[].firstName / data[].lastName | Name | string | Contact name fields |
| data[].country / data[].countryCode | Country | string | Country name and two-letter code |
| data[].province / data[].city | Province/state and city | string | Address region fields |
| data[].address / data[].addressNew | Address | string | Address line 1 and line 2 |
| data[].zip | Zip code | string | Address zip code |
| data[].phone / data[].mail | Phone/email | string | Contact fields |
| data[].isDefault | Default address flag | string/integer | 0-no, 1-yes |
# 7 Private Inventory Orders
The Private Inventory order APIs provide an OpenAPI flow for preorder/private inventory purchasing. The recommended flow is direct selected-product ordering: query private inventory products → pass multiple variants to get confirmation → get warehouses, logistics, and costs → submit multiple productList items to create the SY order. Cart APIs are optional helpers for temporary storage and review, not prerequisites for ordering.
All APIs operate on the account bound to the current
CJ-Access-Token. If token or account validation fails, the API returns the validation error.
# Private Inventory OpenAPI Sequence Diagrams
Start by calling the product list API to get available products and SKU information. Select product ID, variant ID/SKU, and quantity from /product/listV2, then use either direct mode or cart mode to confirm warehouse, logistics, cost, create the order, and query the order.
Use one of these two integration modes:
- Direct mode: do not use the cart. Build
variantsdirectly from product ID, SKU/variant ID, and quantity, then confirm warehouse, logistics, and cost before creating the order. - Cart mode: add products to the private-inventory cart first, read the cart items, convert the selected cart SKU rows into
variants, and then continue with the same confirmation and creation steps as direct mode.
| Integration step | Purpose | What to call in OpenAPI |
|---|---|---|
| Get product information | Query available products and get product ID, variant ID/SKU, and other order inputs | Call /product/listV2, then select the product rows for this order |
| Choose an integration mode | Decide whether to save items in the cart first | Direct mode: build variants directly. Cart mode: call /shopping/privateInventory/addToCart, then call /shopping/privateInventory/getCart to read the items |
| Confirm warehouse, logistics, and cost | Get candidate warehouses, logistics, and final amount | Call /shopping/privateInventory/getConfirmationWithCost in three passes: variants only → add storageId → add logisticName |
| Create the private-inventory order | Submit final products, warehouse, logistics, and payment option | Call /shopping/privateInventory/createOrder; page payment returns a payment page URL |
| Private-inventory balance payment | Pay the private-inventory order with account balance | Call /shopping/pay/payBalanceV2 with the returned order number/payment ID and orderType=9 |
| Query order status | Get creation result and later status | Call /shopping/privateInventory/order/list |
# Where to view the data on the website
These website links require the same CJ account to be signed in. If the user is not signed in, the website redirects to sign-in first and then returns to the target page.
| Result | Website page | Notes |
|---|---|---|
| After adding items to the private-inventory cart | Private-inventory cart (opens new window) | View the private-inventory products just added to the cart; you can also call /shopping/privateInventory/getCart to read the same data |
| After creating a private-inventory order | Private-inventory order list (opens new window) | View created private-inventory orders; to locate one order, search the order number on the page or append &orderNumber=SY1234567890 to the link |
orderType=2in the order-list link is only the website filter for private-inventory orders. For the balance-payment API, still passorderType=9as described above.
Endpoint paths in the diagrams are clickable and jump to the matching API section.
# Direct mode: order selected products directly
sequenceDiagram
participant You as Your System
participant Product as Product List API
participant Cost as Confirmation/Warehouse/Cost API
participant CreateApi as Create Order API
participant BalancePay as Balance Payment API
participant Orders as Order List API
Note over You,Orders: Direct mode: order by product ID, SKU/variant ID, and quantity without using the cart
You->>Product: GET /product/listV2
Product-->>You: Return product ID, variant ID/SKU, and product information
You->>Cost: POST /shopping/privateInventory/getConfirmationWithCost(variants)
Cost-->>You: Return confirmed products and available warehouses
You->>Cost: POST /shopping/privateInventory/getConfirmationWithCost(variants, storageId)
Cost-->>You: Return logistics and cost for the selected warehouse
You->>Cost: POST /shopping/privateInventory/getConfirmationWithCost(variants, storageId, logisticName)
Cost-->>You: Return final amount
You->>CreateApi: POST /shopping/privateInventory/createOrder(productList, storageId, logisticName, payType)
alt Page payment
CreateApi-->>You: Return order number, payment ID, and payment page URL
else Balance payment
CreateApi-->>You: Return order number and payment ID
You->>BalancePay: POST /shopping/pay/payBalanceV2(shipmentOrderId, payId, orderType)
BalancePay-->>You: Return balance-payment result
end
You->>Orders: POST /shopping/privateInventory/order/list
Orders-->>You: Return private-inventory order status
# Cart mode: save items before ordering
sequenceDiagram
participant You as Your System
participant Product as Product List API
participant AddCart as Add-to-cart API
participant Cart as Cart API
participant Cost as Confirmation/Warehouse/Cost API
participant CreateApi as Create Order API
participant BalancePay as Balance Payment API
participant Orders as Order List API
Note over You,Orders: Cart mode: save items first, then convert cart SKU rows into order input
You->>Product: GET /product/listV2
Product-->>You: Return product ID, variant ID/SKU, and product information
You->>AddCart: POST /shopping/privateInventory/addToCart(productId, variants)
AddCart-->>You: Return add-to-cart result
You->>Cart: POST /shopping/privateInventory/getCart
Cart-->>You: Return cart products, SKUs, and quantities
Note over You,Cart: Convert selected cart SKU rows into variants
You->>Cost: POST /shopping/privateInventory/getConfirmationWithCost(variants)
Cost-->>You: Return confirmed products and available warehouses
You->>Cost: POST /shopping/privateInventory/getConfirmationWithCost(variants, storageId)
Cost-->>You: Return logistics and cost for the selected warehouse
You->>Cost: POST /shopping/privateInventory/getConfirmationWithCost(variants, storageId, logisticName)
Cost-->>You: Return final amount
You->>CreateApi: POST /shopping/privateInventory/createOrder(productList, storageId, logisticName, payType)
alt Page payment
CreateApi-->>You: Return order number, payment ID, and payment page URL
else Balance payment
CreateApi-->>You: Return order number and payment ID
You->>BalancePay: POST /shopping/pay/payBalanceV2(shipmentOrderId, payId, orderType)
BalancePay-->>You: Return balance-payment result
end
You->>Orders: POST /shopping/privateInventory/order/list
Orders-->>You: Return private-inventory order status
# 7.0 Order Element Sources
Before creating an order, let the user confirm the products, quantities, warehouse, logistics option, and payment option. Products can come from the product list, cart, or confirmation response; warehouse, logistics, and amounts should follow the options returned by the APIs.
| Create field / helper item | Source | Used by | Note |
|---|---|---|---|
| Product ID, variant ID, SKU | Product list API /product/listV2, cart, or confirmation response | productList[].productId, productList[].variantId, productList[].sku | Required for final creation. Use the product list API to identify the product and SKU before confirming or creating the order. |
| Quantity | Client selection, cart quantity, confirmation response | productList[].quantity | Required for final creation. Use the quantity selected for each SKU. |
| Storage ID | availableStorehouseList[].storageId returned by getConfirmation / getConfirmationWithCost | getCostInfo.storageId, logistics/list.storageId, createOrder.storageId | Required for final creation. Select from the private-inventory warehouse candidate list. Do not use fixed sample values. |
| Logistics name | availableLogisticList[].logisticName returned by logistics/list or the freight rows returned by getCostInfo | createOrder.logisticName, getConfirmationWithCost.logisticName | Required for final creation. Select a logistics option available for the current warehouse and products. |
| Product unit price | Final stock-up unit price | API calculation | Do not submit price when creating the order. Use the amount returned by the API. |
| Cost details | getCostInfo or getConfirmationWithCost response | Display and pre-order confirmation | Not a create request field. |
| Payment option | User selection | createOrder.payType | Optional. 1=page payment, returns a payment page URL; 2=balance payment, which can continue with the balance payment API. |
# 7.1 Add To Private Inventory Cart (POST)
# URL
https://developers.cjdropshipping.com/api2.0/v1/shopping/privateInventory/addToCart
# CURL
curl --location --request POST 'https://developers.cjdropshipping.com/api2.0/v1/shopping/privateInventory/addToCart' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data-raw '{
"productId": "422C91F3-B7D0-47F3-BC66-5E1FE3208BBA",
"variants": [
{"variantId": "V001-SKU-A", "quantity": 100}
]
}'
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| productId | Product ID | string | Y | 200 | From private inventory product query APIs |
| variants | Variant list | list | Y | SKU rows to add to the private-inventory cart | |
| variants[].variantId | Variant ID | string | Y | 200 | |
| variants[].quantity | Quantity | integer | Y | 20 | 1-100000 |
# Response fields
| Field | Definition | Type | Note |
|---|---|---|---|
| data | Add-to-cart result | object/boolean | Some environments may return a boolean directly. |
| data.success | Add succeeded | boolean | Returned when available |
| data.addedCount | Added SKU-line count | integer | Returned when available |
After a successful add-to-cart call, open the private-inventory cart (opens new window) to view the products; on the API side, call
/shopping/privateInventory/getCartto read the cart data.
# 7.2 Get Private Inventory Cart (POST)
# URL
https://developers.cjdropshipping.com/api2.0/v1/shopping/privateInventory/getCart
The request body can be omitted. If no body is sent, the server treats it as an empty object and queries all private-inventory cart items by default. Pagination parameters are still supported. pageSize is capped at 100 by OpenAPI.
# CURL (omit request body and use defaults)
curl --location --request POST 'https://developers.cjdropshipping.com/api2.0/v1/shopping/privateInventory/getCart' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
# CURL (paginated query)
curl --location --request POST 'https://developers.cjdropshipping.com/api2.0/v1/shopping/privateInventory/getCart' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data-raw '{"pageNum":1,"pageSize":20,"isAll":0}'
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| pageNum | Page number | integer | N | 20 | Uses service default when omitted |
| pageSize | Page size | integer | N | 20 | Uses service default when omitted. Maximum 100; values greater than 100 are capped at 100. |
| isAll | Query all items | integer | N | 1 | 0-no, 1-yes; default 1 |
# Response fields
| Field | Definition | Type | Note |
|---|---|---|---|
| data.productList | Cart product list | list | Valid cart products grouped by product |
| data.productList[].productId | Product ID | string | Product ID |
| data.productList[].productName | Product name | string | Display field |
| data.productList[].productImage | Product image | string | Display field |
| data.productList[].variants | SKU rows | list | Cart SKU/variant rows under the product |
| data.productList[].variants[].id | Cart SKU-row ID | string | Cart SKU-row identifier |
| data.productList[].variants[].variantId | Variant ID | string | SKU/variant ID |
| data.productList[].variants[].sku | SKU | string | SKU |
| data.productList[].variants[].quantity/count | Quantity | integer | SKU quantity |
| data.productList[].variants[].price | Final stock-up unit price | number | USD. Display/reference only. Price is not required in create-order requests. |
| data.invalidProductList | Invalid product list | list | Returned when available |
| data.totalAmount | Cart product amount | number | USD, display only. Do not pass order total to create-order. |
| data.selectVariantCount | SKU count | integer | Statistics only. Public create flow does not depend on cart selection state. |
| data.currencyInfo | Currency info | object | Usually contains currencyCode and currencySymbol |
# 7.3 Remove Private Inventory Cart Items (POST)
# URL
https://developers.cjdropshipping.com/api2.0/v1/shopping/privateInventory/removeFromCart
# CURL
curl --location --request POST 'https://developers.cjdropshipping.com/api2.0/v1/shopping/privateInventory/removeFromCart' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data-raw '{"variantIds":["V001-SKU-A"]}'
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| variantIds | Variant ID list | list | Y | SKU variant IDs to remove |
Deletion identifier note: get variantIds from the SKU row id or variantId returned by getCart.
# Response fields
| Field | Definition | Type | Note |
|---|---|---|---|
| data | Delete result | boolean/object | Usually returns a boolean. If an object is returned, the API passes it through. |
# 7.4 Get Private Inventory Order Confirmation (POST)
# URL
https://developers.cjdropshipping.com/api2.0/v1/shopping/privateInventory/getConfirmation
# Direct Selected-product Confirmation CURL
curl --location --request POST 'https://developers.cjdropshipping.com/api2.0/v1/shopping/privateInventory/getConfirmation' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data-raw '{
"variants": [
{"variantId": "V001-SKU-A", "productId": "422C91F3-B7D0-47F3-BC66-5E1FE3208BBA", "quantity": 100}
]
}'
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| variants | Variant list | list | N | Pass it for direct selected-product confirmation. Explicit input is recommended and multiple product lines are supported. | |
| variants[].variantId | Variant ID | string | Required in direct selected-product mode | 200 | |
| variants[].productId | Product ID | string | Required in direct selected-product mode | 200 | |
| variants[].quantity | Quantity | integer | Required in direct selected-product mode | 20 | Quantity to confirm for this SKU |
# Response fields
| Field | Definition | Type | Note |
|---|---|---|---|
| data.orders | Confirmation order groups | list | Product, logistics, and amount information grouped for the confirmation page |
| data.availableStorehouseList | Private-inventory warehouse candidates | list | Select warehouses from this field. Use storageId from this list for logistics, cost, and create-order requests. |
| data.availableStorehouseList[].storageId | Warehouse ID | string | Pass it as logistics/list.storageId, getCostInfo.storageId, and createOrder.storageId |
| data.availableStorehouseList[].displayName | Warehouse name | string | Warehouse name |
| data.availableStorehouseList[].countryCode | Warehouse country/region code | string | Display or region field |
| data.availableStorehouseList[].areaId | Warehouse area ID | integer | Display or region field |
| data.availableStorehouseList[].addresses | Warehouse address | string | Returned when available |
| data.availableStorehouseList[].address | Warehouse address alias | string | Same address value for direct client display |
| data.availableStorehouseList[].zipCode | Warehouse zip code | string | Returned when available |
| data.availableStorehouseList[].selected | Selected flag | boolean | Whether this row matches the request storageId |
| data.selectedStorageId | Selected storage ID | string | The matched warehouse ID; empty when omitted or unavailable |
| data.selectedStorehouse | Selected warehouse object | object | Same fields as availableStorehouseList[]; empty when omitted or unavailable |
| data.orders[].logisticList | Confirmation logistics candidates | list | Confirmation-page logistics candidates. Use logistics/list.availableLogisticList when selecting the final create-order logistics. |
| data.orders[].logisticList[].logisticName / enName | Logistics name | string | Candidate logistics display/name fields when returned |
| data.orders[].logisticList[].shippingCost / freightAmount | Logistics fee | number | USD, returned when available |
| data.orders[].logisticList[].estimateDays / minDeliveryDay / maxDeliveryDay | Estimated delivery time | string/number | Returned when available |
| data.orders[].logisticList[].selected | Selected flag | boolean | Confirmation-page selected status when returned |
| data.orders[].products | Confirmed product lines | list | Product lines may be returned directly under orders[] |
| data.orders[].confirmGroupOrderVOList | Confirmation product groups | list | Product lines may also be returned under group objects |
| data.orders[].confirmGroupOrderVOList[].products | Group product lines | list | Use together with orders[].products when building final createOrder.productList |
| data.orders[].products[].id / variantId | Variant ID | string | Use as productList[].variantId for creation |
| data.orders[].products[].productId | Product ID | string | Use as productList[].productId for creation |
| data.orders[].products[].sku | SKU | string | Use as productList[].sku for creation |
| data.orders[].products[].productName | Product name | string | Display field returned when available |
| data.orders[].products[].productImage | Product image | string | Display field returned when available |
| data.orders[].products[].quantity / count / itemCount | Quantity | integer | Use as productList[].quantity for creation |
| data.orders[].products[].price / nowPrice | Final stock-up unit price | number | USD. Display/reference only. Price is not required in create-order requests; the final price is calculated in real time by the API. |
| data.orders[].products[].weight | Weight | number | SKU weight returned when available |
| data.totalProductPrice | Product amount total | number | USD, display only. Do not pass order total to create-order. |
| data.currencyInfo | Currency info | object | Usually contains currencyCode and currencySymbol |
# 7.5 Get Private Inventory Available Logistics (POST)
# URL
https://developers.cjdropshipping.com/api2.0/v1/shopping/privateInventory/logistics/list
Use this API to get available logistics for the selected warehouse. Call it after the user selects products, quantities, and warehouse, then choose the logistics name for create order from the returned list.
# CURL
curl --location --request POST 'https://developers.cjdropshipping.com/api2.0/v1/shopping/privateInventory/logistics/list' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data-raw '{
"storageId": "WAREHOUSE-HZ-001",
"variantInfoList": [
{"id": "V001-SKU-A", "quantity": 100}
]
}'
| Parameter | Description | Type | Required | Length | Remark |
|---|---|---|---|---|---|
| storageId | Storage ID | string | Y | 200 | Select from availableStorehouseList[].storageId returned by getConfirmation or getConfirmationWithCost |
| variantInfoList | Variant info list | list | Y | Product details | |
| variantInfoList[].id | Variant ID | string | Y | 200 | |
| variantInfoList[].quantity | Quantity | integer | Y | 20 |
# Response fields
| Field | Type | Description |
|---|---|---|
| storageId | string | Warehouse ID used for this logistics query |
| availableLogisticList | list | Available logistics list for the selected warehouse and products |
| availableLogisticList[].logisticName | string | Logistics name used by create order and cost matching |
| availableLogisticList[].displayName | string | Logistics display name |
| availableLogisticList[].logisticCode | string | Logistics code, returned when available |
| availableLogisticList[].shippingCost | number | Logistics fee in USD with 2 decimal places |
| availableLogisticList[].estimateDays | string | Estimated delivery time, returned when available |
| availableLogisticList[].freightIndex | integer | Logistics fee row index, starting from 0 |
| availableLogisticList[].selected | boolean | Selected status in the logistics result; final creation uses the logisticName selected by the caller |
| selectedLogisticName | string | Selected logistics name; empty when no logistics is selected |
| logisticInfoMessage | string | Message returned when storageId is missing or no logistics are returned; normally empty when logistics are available |
# 7.6 Get Private Inventory Cost Details (POST)
# URL
https://developers.cjdropshipping.com/api2.0/v1/shopping/privateInventory/getCostInfo
# CURL
curl --location --request POST 'https://developers.cjdropshipping.com/api2.0/v1/shopping/privateInventory/getCostInfo' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data-raw '{
"storageId": "WAREHOUSE-HZ-001",
"variantInfoList": [
{"id": "V001-SKU-A", "quantity": 100}
]
}'
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| storageId | Storage ID | string | Y | 200 | Select from availableStorehouseList[].storageId returned by confirmation |
| variantInfoList | Variant info list | list | Y | Product details | |
| variantInfoList[].id | Variant ID | string | Y | 200 | |
| variantInfoList[].quantity | Quantity | integer | Y | 20 | |
| logisticName | Selected logistics name | string | N | 200 | Optional; used to match a selected freight row for cost/integrated amount calculation. Omit it when only querying logistics candidates. |
# Response fields
| Field | Definition | Type | Note |
|---|---|---|---|
| data.freightAmount / data.logisticsCost / data.shippingCost | Logistics fee | number | Field name depends on the cost result |
| data.warehouseFee / data.storehouseCost | Warehouse/outbound fee | number | Field name depends on the cost result |
| data.serviceFee | Service fee | number | USD |
| data.freightTrialList | Available logistics freight rows | list | Source of logistics/list.availableLogisticList |
| data.freightTrialList[].logisticName / enName | Logistics name | string | Candidate value for createOrder.logisticName |
| data.freightTrialList[].shippingCost | Shipping fee | number | USD |
| data.freightTrialList[].selected | Selected flag | boolean | If client-passed logisticName does not match, OpenAPI does not fall back to this default selected value. |
| data.costDetails | Cost details | list | Returned when available |
| data.errorEnList / data.errorSuggestionList | Errors and suggestions | list | Returned when available |
# 7.7 Get Confirmation with Cost Details (POST)
# URL
https://developers.cjdropshipping.com/api2.0/v1/shopping/privateInventory/getConfirmationWithCost
This API returns confirmation data, warehouse options, and cost details in one response. Call it without storageId to get warehouse options; pass the selected storageId to get cost details; pass the selected logisticName to get the final amount.
# CURL
curl --location --request POST 'https://developers.cjdropshipping.com/api2.0/v1/shopping/privateInventory/getConfirmationWithCost' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data-raw '{
"storageId": "WAREHOUSE-HZ-001",
"logisticName": "CJ Packet Ordinary",
"variants": [
{"variantId": "V001-SKU-A", "productId": "422C91F3-B7D0-47F3-BC66-5E1FE3208BBA", "quantity": 100}
]
}'
# Request parameters
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| storageId | Selected warehouse ID | string | N | 200 | Select from availableStorehouseList[].storageId. Required when cost details are needed. |
| logisticName | Selected logistics name | string | N | 200 | Select from logistics/list.availableLogisticList[].logisticName when amountDetail.totalAmount is needed. |
| variants | Variant list | list | N | Recommended for direct selected-product confirmation. Multiple product lines are supported. | |
| variants[].variantId | Variant ID | string | Required when using variants | 200 | |
| variants[].productId | Product ID | string | Required when using variants | 200 | |
| variants[].quantity | Quantity | integer | Required when using variants | 20 | Quantity to confirm for this SKU. |
First call this API without storageId; pass storageId after the warehouse is selected; pass logisticName after the logistics option is selected to get the final amount.
# Candidate warehouse fields
availableStorehouseList is the warehouse selection list for both getConfirmation and getConfirmationWithCost. Fields are:
| Field | Type | Description |
|---|---|---|
| availableStorehouseList[].storageId | string | Warehouse ID that can be passed as storageId in logistics, cost, confirmation-with-cost, or create-order requests. |
| availableStorehouseList[].displayName | string | Warehouse name. |
| availableStorehouseList[].countryCode | string | Warehouse country/region code |
| availableStorehouseList[].areaId | integer | Warehouse area ID |
| availableStorehouseList[].addresses | string | Warehouse address |
| availableStorehouseList[].address | string | Warehouse address alias for direct client use |
| availableStorehouseList[].zipCode | string | Warehouse zip code when returned |
| availableStorehouseList[].selected | boolean | Whether this warehouse was passed in this request and is used for cost calculation. It is false when storageId is omitted or does not match |
# Response data structure
| Field | Type | Description |
|---|---|---|
| confirmation | object | Confirmation data. Warehouse candidates are returned at top-level availableStorehouseList. |
| confirmation.orders | list | Confirmation order groups with product, logistics, and amount information. |
| confirmation.orders[].products | list | Confirmed product lines returned directly under an order group when available. |
| confirmation.orders[].confirmGroupOrderVOList[].products | list | Confirmed product lines returned under group objects when available. |
| confirmation.orders[].logisticList | list | Confirmation-page logistics candidates. Use logistics/list.availableLogisticList for final create-order logistics selection. |
| availableStorehouseList | list | Candidate warehouse list, including warehouse ID, warehouse name, country/region, address, zip code, and selected status. |
| selectedStorageId | string | Warehouse ID passed in this request and found in candidates; empty when omitted or unavailable |
| selectedStorehouse | object | Matched warehouse object with the same fields as availableStorehouseList[], with selected=true; empty when omitted or unavailable |
| costInfo | object | Cost details for the selected warehouse, same as getCostInfo.data; returned only when a valid storageId is passed. |
| amountDetail | object | Amount summary. All amounts are in USD with 2 decimal places. It includes product line amounts, service fee, and the selected shipping fee. totalAmount is returned only when warehouse and logistics are selected and all key amounts exist |
| amountDetail.productAmountList | list | Product line amount details, including variantId, productId, sku, quantity, final stock-up unit price unitPrice, and line subtotal productAmount; wholesale price or other price types are not returned |
| amountDetail.productAmountList[].unitPrice | number | Final stock-up unit price, USD, 2 decimal places |
| amountDetail.productAmountList[].productAmount | number | Product line subtotal, USD, 2 decimal places |
| amountDetail.productAmount | number | Product total amount in USD with 2 decimal places; empty if any product amount is missing |
| amountDetail.serviceFee | number | Service fee in USD with 2 decimal places from costInfo.serviceFee |
| amountDetail.requestedLogisticName | string | Logistics name passed in this request and used to match a freight row; empty if not passed |
| amountDetail.selectedFreight | object | Freight row used for the total. If logisticName is passed but not matched, this field is empty and total amount is not calculated. |
| amountDetail.shippingCost | number | Selected shipping fee in USD with 2 decimal places from amountDetail.selectedFreight.shippingCost |
| amountDetail.totalAmount | number | Product amount + service fee + shipping fee in USD with 2 decimal places; returned only when warehouse and logistics are selected and all key amounts exist |
| amountDetail.totalAmountCalculated | boolean | Whether the total amount is calculated successfully. If false, check missingAmountItems. |
| amountDetail.missingAmountItems | list | Missing amount items. When logistics is not selected, it usually contains selectedFreight; the total amount is not forced when any key item is missing |
| costInfoMessage | string | Explanation returned when storageId is missing, unavailable, no warehouse is available, or variant info is unavailable for cost calculation; normally empty when costInfo exists |
# 7.8 Create Private Inventory Order (POST)
# URL
https://developers.cjdropshipping.com/api2.0/v1/shopping/privateInventory/createOrder
Before creating a private-inventory order, make sure the products, warehouse, logistics option, and payment option are selected. Page payment returns a payment page URL; for balance payment, use the create result to continue with the private-inventory balance payment API.
# CURL
curl --location --request POST 'https://developers.cjdropshipping.com/api2.0/v1/shopping/privateInventory/createOrder' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data-raw '{
"productList": [
{"variantId": "V001-SKU-A", "productId": "422C91F3-B7D0-47F3-BC66-5E1FE3208BBA", "sku": "CJJJJTJT00873-Black", "quantity": 100},
{"variantId": "V002-SKU-B", "productId": "D9B2A2E0-88A1-44A6-9F7D-PRIVATE-B", "sku": "CJJJJTJT00873-White", "quantity": 50}
],
"logisticName": "CJ Packet Ordinary",
"storageId": "WAREHOUSE-HZ-001",
"payType": 1
}'
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| productList | Final product list | list | Y | Cannot be empty and may contain multiple product lines. | |
| productList[].variantId | Variant ID | string | Y | 200 | SKU/variant ID |
| productList[].productId | Product ID | string | Y | 200 | |
| productList[].sku | SKU | string | Y | 200 | |
| productList[].quantity | Quantity | integer | Y | 20 | Final order quantity for this SKU |
| productList[].price | Final stock-up unit price | BigDecimal | N | (18,2) | Optional and not required. It is not used for order billing; use the price returned by the API. |
| logisticName | Logistics name | string | Y | 200 | Select from availableLogisticList[].logisticName returned by logistics/list |
| storageId | Storage ID | string | Y | 200 | Select from availableStorehouseList[].storageId returned by getConfirmation or getConfirmationWithCost |
| payType | Payment option | integer | N | 10 | 1=page payment, returns a payment page URL after order creation; 2=balance payment |
For page payment, a payment page URL is returned after the order is created. For balance payment, call the private-inventory balance payment API with the order number and payment ID from the create result.
# Response fields
| Field | Definition | Type | Note |
|---|---|---|---|
| data.orderId / data.orderCode | SY order number | string | Private-inventory order number after successful creation. The field name depends on the create result. |
| data.payId | Payment order ID | string | Returned when available |
| data.cjPayUrl | Payment page URL | string | Returned for page payment |
| data.price | Created order amount | number | USD, returned when available |
| data.riskInterceptOrderList | Risk-intercepted orders | list | May be returned when risk control blocks the order |
| data.checkPlaceOrderInfo | Orderability check details | object | Returned when orderability validation fails |
| data.checkPlaceOrderInfo.confirmStatus | Orderable flag | boolean | false means the submitted product, warehouse, logistics, inventory, price, or weight is not currently orderable |
| data.checkPlaceOrderInfo.productInfoVOList | Unavailable products | list | Contains variant ID, SKU, and unavailable reason |
| data.availableLogisticList | Current available logistics | list | Returned when logisticName is unavailable; fields are the same as logistics/list.availableLogisticList |
| data.requestedLogisticName | Requested logistics name | string | Logistics name submitted but not matched |
After the order is created, open the private-inventory order list (opens new window) to view it; to locate one order directly, search the order number on the page or append
&orderNumber=ORDER_NUMBERto the link.
# 7.9 Balance Payment V2 (POST)
# URL
https://developers.cjdropshipping.com/api2.0/v1/shopping/pay/payBalanceV2
This API supports balance payment for multiple order types, distinguished by orderType:
- Private-inventory order (orderType=9): Pay after creating a private-inventory order. Use
data.orderIdordata.orderCodefromcreateOrderasshipmentOrderId;payIdis optional. - Makeup bill (orderType=24): Pay a makeup payment order created by
makeup/createPayOrderusing account balance. Use thedata.payOrderCodefromcreatePayOrderasshipmentOrderId;payIdis required (usecreatePayOrder→data.payId). - Default (no orderType): Normal dropshipping-order balance payment.
# CURL - Private-inventory order example
curl --location --request POST 'https://developers.cjdropshipping.com/api2.0/v1/shopping/pay/payBalanceV2' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data-raw '{
"shipmentOrderId": "SY1234567890",
"orderType": 9,
"payId": "PAY1234567890"
}'
# CURL - Makeup bill example
curl --location --request POST 'https://developers.cjdropshipping.com/api2.0/v1/shopping/pay/payBalanceV2' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data-raw '{
"shipmentOrderId": "2605260000000001",
"orderType": 24,
"payId": "PAY260526000001"
}'
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| shipmentOrderId | Order number | string | Y | 100 | Private-inventory: use createOrder → orderId; Makeup: use createPayOrder → payOrderCode |
| orderType | Order type | integer | N | 20 | 9=private-inventory; 24=makeup bill (MD_BK parent-order makeup); omit for normal dropshipping |
| payId | Payment ID | string | N/required | 100 | Optional for private-inventory; required for makeup bill — use createPayOrder → data.payId |
# Response fields
| Field | Definition | Type | Note |
|---|---|---|---|
| code | Error code | int | See the error code standard table |
| result | Success flag | boolean | true means the API was processed successfully |
| message | Response message | string | Processing result message |
| data | Payment result identifier | string | Usually the order number for this payment; use the actual response value |
| requestId | Request ID | string | For troubleshooting |
# 7.10 Query Private Inventory Order List (POST)
# URL
https://developers.cjdropshipping.com/api2.0/v1/shopping/privateInventory/order/list
# CURL
curl --location --request POST 'https://developers.cjdropshipping.com/api2.0/v1/shopping/privateInventory/order/list' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data-raw '{
"pageNum": 1,
"pageSize": 10,
"orderContent": "SY1234567890",
"createOrderDateStart": 1717200000000,
"createOrderDateEnd": 1719791999000
}'
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| pageNum | Page number | integer | N | 20 | Default 1, minimum 1. Specifies which page to return |
| pageSize | Page size | integer | N | 20 | Default 10, maximum 200. A larger value returns a parameter error |
| orderContent | Search keyword | string | N | 100 | Pass one keyword at a time. Supports private-inventory order number starting with SY, payment order number, SKU, product name, and other searchable order-list content |
| orderStatus | Order status | string | N | 50 | Common values: 3=Awaiting Payment, 11=Payment Incoming, 10=Pending, 6=Awaiting Dispatch, 12=Dispatched, 7=Completed, 13=Closed, 8=Canceled. If omitted, orders in viewable statuses are returned |
| payStatus | Unpaid sub-status | integer | N | 1 | Only works when orderStatus=3. Empty=Awaiting Payment and Payment Incoming, 0=Awaiting Payment only, 1=Payment Incoming only |
| createOrderDateStart | Created time start | long | N | 20 | Millisecond timestamp. Returns orders created after this timestamp |
| createOrderDateEnd | Created time end | long | N | 20 | Millisecond timestamp. Returns orders created before this timestamp |
| isAmountDifference | Amount difference flag | integer | N | 1 | Empty=no filter, 1=orders with amount differences only, 0=orders without amount differences only |
# Response fields
| Field | Definition | Type | Note |
|---|---|---|---|
| data.pageSize | Page size | number | Page size of this response |
| data.pageNumber | Page number | number | Page number of this response |
| data.totalRecords | Total records | number | Total orders matching the filters |
| data.totalPages | Total pages | number | Total pages calculated by pageSize |
| data.content | Order list | list | Private-inventory order details on the current page |
data.content[] order fields:
| Field | Definition | Type | Note |
|---|---|---|---|
| orderCode | SY order number | string | Unique private-inventory order number |
| status | Order status code | string | Examples: 3, 11, 10, 6, 12, 7, 13, 8 |
| statusDesc | Order status description | string | Display text such as Awaiting Payment, Pending, or Dispatched |
| disputeStatus | Dispute-related order status | string | Returned when dispute records exist |
| storageId | Warehouse ID | string | Private-inventory warehouse ID used by the order |
| storageNo2Name | Warehouse name | string | Warehouse English name or display name |
| stockout | Stockout flag | boolean | true means the order has stockout information |
| logisticName | Logistics name | string | Logistics route selected when the order was created |
| logisticsMode | Logistics mode | string | Logistics method or route type |
| postage | Postage | number | Amount in USD |
| showPostage | Display postage | number | Amount converted to the account display currency |
| trackingNumber | Tracking number | string | Carrier tracking number, returned when available |
| cjTrackingNumber | CJ tracking number | string | CJ-side tracking number, returned when available |
| paymentExpirationTime | Payment expiration time | number | Millisecond timestamp for unpaid orders |
| inventoryReserved | Inventory reserved flag | boolean | Usually true when the order is unpaid and not expired |
| createDate | Created time | string | Example: 2021-10-12 01:33 |
| createDateTime | Created timestamp | number | Millisecond timestamp |
| paymentDate | Paid time | string | Returned after payment, same format as createDate |
| paymentDateTime | Paid timestamp | number | Millisecond timestamp, returned after payment |
| orderAmount | Product subtotal | number | Product amount in USD |
| showOrderAmount | Display product subtotal | number | Product amount converted to the account display currency |
| amount | Order total | number | Total amount in USD, usually including products, postage, service fee, and taxes |
| showAmount | Display order total | number | Total amount converted to the account display currency |
| payableAmount | Payable strikethrough amount | number | Original or payable display amount when available |
| showPayableAmount | Display payable strikethrough amount | number | Converted amount in the account display currency |
| discountMoney | Platform discount amount | number | Discount amount in USD |
| productDiscountMoney | Product discount amount | number | Product discount in USD |
| postageDiscountMoney | Postage discount amount | number | Postage discount in USD |
| serviceFee | Service fee | number | Service fee in USD |
| showServiceFee | Display service fee | number | Service fee converted to the account display currency |
| iossNumber | IOSS number | string | Returned when IOSS declaration is used |
| iossType | IOSS declaration type | integer | 1=do not use IOSS, 2=use my IOSS, 3=use CJ IOSS |
| iossTaxes | IOSS taxes | number | Tax amount in USD |
| taxesFlag | Tax payment-on-behalf flag | integer | 0=no, 1=yes |
| taxesType | Tax type | integer | 0=none, 1=EU IOSS, 2=Brazil Duty tax |
| orderQuantity | Total item quantity | integer | Sum of all item quantities in the order |
| stockoutRefundStatus | Stockout refund status | string | 0=pending refund, 1=refunded, 2=rejected |
| impStorageFlag | Inventory-order flag | string | Private-inventory related flag |
| isContainPack | Contains packaging products | integer | 0=no, 1=yes |
| orderSourceType | Order source type | string | For example Excel upload or store synchronization |
| paymentSign | Payment-in-progress prompt flag | string | 0=no prompt, 1=bank card payment in progress prompt |
| handlerResult | Stockout handling result | string | Split shipment, replacement, stockout refund, etc. |
| refundAmount | Refund amount | number | Returned when a refund exists |
| refundStatus | Refund status | integer | 1=pending refund, 2=refunded |
| refundTime | Refund time | string | Returned when a refund exists |
| orderType | Order type | integer | Private-inventory orders are usually 2 |
| orderCategory | Order category | string | Private-inventory orders are usually SY |
| paymentType | Payment type | string | Stripe, PayPal, Checkout, etc.; may be returned after payment |
| variantTypeSum | Variant type count | integer | Number of SKU/variant types in the order |
| diffType | Difference source type | integer | 1=manual creation, 2=order review, 3=postage supplement |
| diffAmount | Difference amount | number | Difference amount in USD |
| showDiffAmount | Display difference amount | number | Difference amount converted to the account display currency |
| openDispute | Can open dispute | boolean | true means the current status allows opening a dispute |
| abnormalPerformanceType | Fulfillment exception type | integer | 0=none, 1=exception, 2=completed |
| paymentOrderCodeList | Payment order numbers | list | Payment order numbers associated with this order |
| isRepeatPayment | Repeat payment flag | integer | 0=no, 1=yes |
| isShowInventoryRecord | Show inventory record flag | integer | 0=do not show, 1=show |
| canPayPostage | Can pay postage flag | integer | Returned when postage supplement payment may be needed |
| postagePayStatus | Postage payment status | integer | 1=waiting for logistics info, 2=to be paid, 3=payment in progress, 4=paid |
| postagePayStatusDesc | Postage payment status description | string | Display text for postage payment status |
| postagePayStatusRemark | Postage payment remark | string | Extra description for the postage payment status |
| selfPickAddressInfo | Self-pickup address information | object | Returned for self-pickup orders |
| selfPickCode | Self-pickup code | string | Returned for self-pickup orders |
| currencyInfo | Currency information | object | Display currency, exchange rate, and related information |
| isReceipt | Receipt flag | integer | 0=no, 1=yes |
| canViewWarehouseVideo | Can view warehouse operation video | boolean | true means the video can be viewed |
| noViewWarehouseVideoReason | Reason video cannot be viewed | integer | Reason code returned when video cannot be viewed |
data.content[].supplierList[] and product fields:
| Field | Definition | Type | Note |
|---|---|---|---|
| supplierId | Supplier ID | string | Supplier ID of the products |
| supplierName | Supplier name | string | Supplier display name |
| productList | SPU list | list | Products grouped by supplier |
| productList[].productId | Product ID | string | CJ product SPU ID |
| productList[].productVariantListList | Variant list | list | SKU/variant list under the product |
| productVariantListList[].productCode | Order product ID | string | Order product line ID |
| productVariantListList[].orderCode | Order number | string | Same as orderCode |
| productVariantListList[].stanProductId | Variant ID | string | CJ product variant ID |
| productVariantListList[].sku | SKU | string | Product SKU |
| productVariantListList[].cjProductId | Product ID | string | CJ product SPU ID |
| productVariantListList[].cjProductName | Product name | string | CJ product English name |
| productVariantListList[].cjImage | Product image | string | Product image URL |
| productVariantListList[].property | Property | string | Product property |
| productVariantListList[].variantKey | Variant key | string | Variant specification value |
| productVariantListList[].quantity | Quantity | integer | Purchased quantity |
| productVariantListList[].allocateNum | Allocated quantity | integer | Quantity stocked in or allocated from inventory |
| productVariantListList[].originalPrice | Original price | number | Original price in USD |
| productVariantListList[].showOriginalPrice | Display original price | number | Original price converted to the account display currency |
| productVariantListList[].price | Unit price | number | Unit price in USD |
| productVariantListList[].showPrice | Display unit price | number | Unit price converted to the account display currency |
| productVariantListList[].discount | Discount rate | number | Returned when a discount exists |
| productVariantListList[].weight | Weight | number | Product weight, usually in grams |
| productVariantListList[].refundStatus | Product refund status | integer | 1=pending refund, 2=refunded |
| productVariantListList[].productType | Product type | string | Product type identifier |
| productVariantListList[].stockout | Stockout flag | boolean | true means this product is out of stock |
| productVariantListList[].handlerResult | Product handling result | string | Stockout or exception handling result |
| productVariantListList[].originalSku | Original SKU | string | Returned when the SKU has changed |
| productVariantListList[].groupProduct | Group product flag | boolean | true means this is a bundle/group product |
| productVariantListList[].isPod | POD product flag | integer | POD product identifier |
| productVariantListList[].unCertified | Missing product information flag | integer | 1=product information missing; other values mean complete |
| productVariantListList[].productGroupChildList | Child products | list | Returned for bundle/group products |
| productGroupChildList[].id | Child variant ID | string | Child product variant ID |
| productGroupChildList[].sku | Child SKU | string | Child product SKU |
| productGroupChildList[].nameEn | Child product name | string | Child product English name |
| productGroupChildList[].image | Child product image | string | Child product image URL |
| productGroupChildList[].itemCount | Child quantity | integer | Child product quantity |
| productGroupChildList[].allocateNum | Child allocated quantity | integer | Quantity stocked in or allocated for the child product |
| productGroupChildList[].variantKey | Child variant key | string | Child product specification value |
| productGroupChildList[].packWeight | Child package weight | number | Single package weight |
| productGroupChildList[].totalPackWeight | Child total package weight | number | Quantity multiplied by package weight |
| productGroupChildList[].price | Child product price | number | Price in USD |
The response may include more order display fields. Use the fields above as the main reference; unlisted extension fields should be interpreted according to the actual returned value.
# Common Return
success
{
"code": 200,
"result": true,
"message": "Success",
"data": {},
"requestId": "2b97f15603384fe4832e85617cf07d9c"
}
error
{
"code": 1600100,
"result": false,
"message": "Param error",
"data": null,
"requestId": "2b97f15603384fe4832e85617cf07d9c"
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| code | Error code | int | 20 | Reference error code |
| result | Whether the return is normal | boolean | 1 | |
| message | Return message | string | 200 | Parameter or business error message when the query fails |
| data | Return data | object | Order-list pagination data on success, or null on failure | |
| requestId | Request ID | string | 48 | Used for log troubleshooting |
# 8 Private Inventory Outbound Orders
Private inventory outbound APIs let an OpenAPI client create an OMS private inventory outbound order, poll inventory-lock progress, submit the outbound order, and check payment/parent-order status. All APIs use the account resolved from CJ-Access-Token. Do not pass customer identity or OMS internal fields such as userNum, userId, merchantId, permissionCode, systemInvoke, createUserId, createUserName, thirdStorage, or deliveryType.
The private inventory used for outbound can be reviewed by signing in to MyCJ and opening the “Warehouse → Private Inventory” module to view the corresponding private order and inventory information.
# 8.1 API list
| API | Method | Description |
|---|---|---|
/api2.0/v1/shopping/privateInventory/outbound/address/list | POST | Query address candidates for the current token user |
/api2.0/v1/shopping/privateInventory/outbound/product/query | POST | Query outboundable products by warehouse, SKU/SPU, or privateOrderId |
/api2.0/v1/shopping/privateInventory/outbound/product/batch-refresh | POST | Refresh selected products before creation |
/api2.0/v1/shopping/privateInventory/outbound/create | POST | Create or update an outbound order; submit=true can submit after creation |
/api2.0/v1/shopping/privateInventory/outbound/progress | POST | Query creation progress, lock failures, submit/payment status |
/api2.0/v1/shopping/privateInventory/outbound/submit | POST | Submit an outbound order |
/api2.0/v1/shopping/privateInventory/outbound/detail | POST | Query outbound order detail |
/api2.0/v1/shopping/privateInventory/outbound/cancel | POST | Cancel an unfinished outbound order |
Recommended flow: address/list → product/query → product/batch-refresh → create → poll progress; after creation completes, call submit or create with submit=true, then keep polling progress for payment/parent-order status. If submit returns insufficient inventory or lock failure, do not retry the same request. Query detail, reduce quantities or remove failed product lines, call create again with the same orderId, and submit again after progress becomes submit-ready.
# 8.1.1 Sequence Diagram and Integration Notes
Endpoint labels using outbound/... become clickable after the page renders; click the blue underlined endpoint text inside the diagram to jump to the matching API section.
sequenceDiagram
autonumber
participant Client as OpenAPI Client
participant API as CJ OpenAPI
Client->>API: outbound/address/list query address candidates
API-->>Client: address candidates
Client->>API: outbound/product/query(storageId, skuOrSpu/privateOrderId)
API-->>Client: product candidates
Client->>API: outbound/product/batch-refresh(products)
API-->>Client: latest outboundable quantity
Client->>API: outbound/create(form, address, productList, submit)
API-->>Client: orderId + nextAction=POLL_CREATE_PROGRESS
loop Poll creation progress
Client->>API: outbound/progress(orderId)
API-->>Client: createProgress/createStatus/lockFails/nextAction
end
alt lockFails not empty or nextAction=ADJUST_LOCK_FAIL_PRODUCTS
Client->>API: outbound/detail(orderId)
API-->>Client: outbound order and product-line echo data
Client->>API: outbound/create(orderId + adjusted product lines)
API-->>Client: orderId + nextAction
else lockFails empty and nextAction=SUBMIT_ORDER
Client->>API: outbound/submit(orderId)
API-->>Client: submitAccepted + nextAction
end
Client->>API: outbound/progress(orderId)
API-->>Client: submitStatus/paymentStatus/shipmentOrderId/paymentOrderId
opt Query detail or cancel an unfinished outbound order
Client->>API: outbound/detail(orderId)
API-->>Client: outbound order detail
Client->>API: outbound/cancel(orderId, reason)
API-->>Client: cancel result
end
Integration note: OpenAPI customers do not use OMS page login and should not pass internal identity fields such as userId, userNum, or customerNo. Customer identity is resolved from CJ-Access-Token and injected server side. Clients should follow /progress and /submit responses to decide the next action.
# 8.1.2 Address Module and Outbound Address Reuse Sequence
The Address Management module maintains the address book for the current account. Prepare address data through List Addresses, Create Address, and Update Address, then call the private-inventory outbound address/list to get address candidates for the current token and fill the address object in create. The current public Address Management docs expose list, create, and update only; no public delete-address endpoint was found, so the sequence diagram does not include a delete flow.
Endpoint labels using Address module address/... and outbound/... become clickable after the page renders.
sequenceDiagram
autonumber
participant Client as OpenAPI Client
participant API as CJ OpenAPI
Client->>API: Address module address/list query address book
API-->>Client: Address book list
opt Need to create address
Client->>API: Address module address/create submit full address fields
API-->>Client: Operation result
end
opt Need to update address
Client->>API: Address module address/update(id + full address fields)
API-->>Client: Operation result
end
Client->>API: outbound/address/list get outbound address candidates
API-->>Client: Fields for create.address
Client->>API: outbound/create(address + productList)
API-->>Client: Return orderId and next action
# 8.2 Address List (POST)
URL: https://developers.cjdropshipping.com/api2.0/v1/shopping/privateInventory/outbound/address/list
The request body can be empty. Use the response fields to fill the address object in the create API.
Request example:
{}
Response example:
{
"code": 200,
"result": true,
"message": "Success",
"data": [
{
"id": "ADDR001",
"name": "Gilbert Soria",
"countryCode": "US",
"province": "OH",
"city": "HUBER HEIGHTS",
"address": "3419 BROADMOOR BLVD1",
"addressNew": "Apt 123",
"zip": "222260",
"phone": "9322331159",
"mail": "test@example.com"
}
]
}
| Response field | Type | Description |
|---|---|---|
| data[].id | string | Address record ID for address-book display only. |
| data[].name | string | Full recipient name; can fill address.customerName. |
| data[].firstName / data[].lastName | string | Recipient first name / last name. |
| data[].country / data[].countryCode | string | Country name / two-letter country code. |
| data[].province / data[].city / data[].countyTown | string | Province/state, city, county/town; countyTown can fill address.town. |
| data[].address / data[].addressNew | string | Address line 1 / address line 2. |
| data[].zip / data[].phone / data[].mail | string | ZIP code, phone, email. |
| data[].consigneeId | string | Consignee ID; can fill address.consigneeId. |
# 8.3 Query Outboundable Products (POST)
URL: https://developers.cjdropshipping.com/api2.0/v1/shopping/privateInventory/outbound/product/query
| Parameter | Definition | Type | Required | Note |
|---|---|---|---|---|
| storageId | Warehouse ID | string | Y | Selected outbound warehouse. |
| skuOrSpu | SKU/SPU keyword | string | N | Pass at least one of skuOrSpu and privateOrderId. |
| privateOrderId | Private inventory order number | string | N | Mapped to downstream privateOrderCode. |
| orderId | Outbound order number | string | N | Pass when updating an outbound order; mapped to downstream orderCode. |
| Response field | Type | Description |
|---|---|---|
| data[].id | string | Product-line ID; used when updating an existing outbound product line. |
| data[].uid | string | Row unique key, usually privateOrderId + stanProductId. |
| data[].productId / data[].spu / data[].sku | string | Product ID, SPU, SKU. |
| data[].stanProductId | string | Standard variant ID; required by the create API. |
| data[].productName / data[].productImg | string | Product name and image. |
| data[].value1 / data[].value2 / data[].value3 | string | SKU option values. |
| data[].price | number | Current display unit price from Product Center; OMS fetches the latest price again during creation. |
| data[].privateOrderId | string | Private inventory order number. |
| data[].availableQuantity | integer | Current outboundable quantity. |
| data[].lockQuantity | integer | Quantity already locked by the current outbound order when editing. |
# 8.4 Batch Refresh Selected Inventory (POST)
URL: https://developers.cjdropshipping.com/api2.0/v1/shopping/privateInventory/outbound/product/batch-refresh
| Parameter | Definition | Type | Required | Note |
|---|---|---|---|---|
| storageId | Warehouse ID | string | Y | Selected outbound warehouse. |
| orderId | Outbound order number | string | N | Used to exclude quantities already locked by the current order when editing. |
| products | Selected products | list | Y | Must not be empty. |
| products[].privateOrderId | Private inventory order number | string | Y | Mapped to downstream privateOrderCode. |
| products[].stanProductId | Standard variant ID | string | Y | Variant whose inventory needs refreshing. |
| products[].price | Display price | number | N | Inventory refresh does not rely on this field. |
Response example:
{
"code": 200,
"result": true,
"message": "Success",
"data": [
{
"privateOrderId": "PO26050001",
"stanProductId": "CJVAR001",
"uid": "PO26050001-CJVAR001",
"availableQuantity": 118
}
]
}
| Response field | Type | Description |
|---|---|---|
| data[].privateOrderId | string | Private inventory order number. |
| data[].stanProductId | string | Standard variant ID. |
| data[].uid | string | Row unique key. |
| data[].availableQuantity | integer | Current outboundable quantity. |
The current response mainly returns privateOrderId, stanProductId, uid, and availableQuantity. Use /product/query or /detail for full display fields such as name, image, SKU, and price.
# 8.5 Create Private Inventory Outbound Order (POST)
URL: https://developers.cjdropshipping.com/api2.0/v1/shopping/privateInventory/outbound/create
curl --location --request POST 'https://developers.cjdropshipping.com/api2.0/v1/shopping/privateInventory/outbound/create' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data-raw '{
"orderNumber": "OUTBOUND-API-001",
"storageId": "08898c4735bf43068d5d677c1d217ab0",
"platform": "API",
"storeName": "API Store",
"postagePayNode": 4,
"address": {
"customerName": "Gilbert Soria",
"shippingAddress": "3419 BROADMOOR BLVD1",
"shippingAddress2": "Apt 123",
"city": "HUBER HEIGHTS",
"country": "United States",
"countryCode": "US",
"province": "OH",
"zipCode": "222260",
"phone": "9322331159",
"email": "test@example.com"
},
"productList": [
{
"sku": "CJJJJTJT00873-Black",
"stanProductId": "CJVAR001",
"privateOrderId": "PO26050001",
"quantity": 2
}
],
"submit": false
}'
| Parameter | Definition | Type | Required | Note |
|---|---|---|---|---|
| orderId | Outbound order number | string | Required for update | Omit when creating; mapped to downstream orderCode. |
| orderNumber | Custom order number | string | Y | OMS custom order number. |
| storageId | Warehouse ID | string | Y | Shipping warehouse. |
| platform | Store platform | string | N | Defaults on the server if omitted. |
| storeName | Store name | string | N | Client display field. |
| postagePayNode | Postage payment node | integer | Y | 4=pay before outbound, 5=pay after outbound, 6=no payment required. |
| reason | Application reason | string | Required when postagePayNode=6 | Application reason. |
| reasonEn | English application reason | string | N | English application reason. |
| address.customerName | Recipient | string | Y | Can be filled from address-list name. |
| address.shippingAddress / address.shippingAddress2 | Address line 1 / line 2 | string | Line 1 required | Shipping address. |
| address.city / address.province / address.town | City / province / town | string | City required | town can be filled from address-list countyTown. |
| address.countryCode / address.country | Country code / country name | string | countryCode required | Two-letter country code is used by OMS validation. |
| address.zipCode / address.phone / address.email | ZIP / phone / email | string | N | Shipping contact fields. |
| address.taxId / address.consigneeId | Tax ID / consignee ID | string | N | Optional. |
| productList | Product lines | list | Y | Must not be empty. |
| productList[].id | Existing product-line ID | string | Required when updating a line | Omit when creating a new outbound order. |
| productList[].uid | Row unique key | string | N | Recommended for troubleshooting; current creation logic does not depend on it. |
| productList[].sku | SKU | string | Y | Product SKU. |
| productList[].stanProductId | Standard variant ID | string | Y | From /product/query. |
| productList[].price | Display price | number | N | Not a trusted input; OMS writes the latest Product Center price during creation. |
| productList[].privateOrderId | Private inventory order number | string | Y | Mapped to downstream privateOrderCode. |
| productList[].quantity | Outbound quantity | integer | Y | Must be greater than 0 and not exceed available inventory. |
| submit | Auto submit | boolean | N | Default false. |
Success response:
| Response field | Type | Description |
|---|---|---|
| data.orderId | string | Outbound order number; downstream field is orderCode. |
| data.createTaskStarted | boolean | Whether the async creation task has started. |
| data.submitRequested | boolean | Whether auto-submit was requested. |
| data.nextAction | string | Next action, usually POLL_CREATE_PROGRESS. |
# 8.6 Query Progress (POST)
URL: https://developers.cjdropshipping.com/api2.0/v1/shopping/privateInventory/outbound/progress
Request body:
{
"orderId": "SD260526000001"
}
Response example:
{
"code": 200,
"result": true,
"message": "Success",
"data": {
"orderId": "SD260526000001",
"createProgress": 60,
"createStatus": "CREATE_SUB_ORDER_SUCCESS",
"nextAction": "WAIT_LOCK_ARRIVE",
"lockFails": []
}
}
| Response field | Type | Description |
|---|---|---|
| data.orderId | string | Outbound order number. |
| data.progress / data.createProgress | number | Creation progress, currently mainly 0/60/100. |
| data.createStatus | string | PROCESSING, CREATE_SUB_ORDER_SUCCESS, TASK_COMPLETE, or LOCK_FAIL. |
| data.lockFails | list | Products that failed to lock inventory; adjust quantities if present. |
| data.lockFails[].sku / data.lockFails[].privateOrderId | string | Failed SKU / private inventory order number. |
| data.lockFails[].quantity / data.lockFails[].lockQuantity | integer | Requested outbound quantity / actual locked quantity. |
| data.nextAction | string | WAIT_CREATE, WAIT_LOCK_ARRIVE, ADJUST_LOCK_FAIL_PRODUCTS, SUBMIT_ORDER, etc. |
| data.submitStatus / data.paymentStatus | string | UNKNOWN when submit/payment aggregation is not returned by the current version. |
Lock-failure handling: when createStatus=LOCK_FAIL, nextAction=ADJUST_LOCK_FAIL_PRODUCTS, or lockFails is not empty, do not call /submit directly and do not keep relying on create.submit=true auto-submit. First call /detail to get the current outbound order and product-line echo data. Then delete failed product lines or reduce productList[].quantity according to lockFails[].lockQuantity / availableQuantity, call /create again with orderId to update the outbound order, and continue polling /progress until createProgress=100, createStatus=TASK_COMPLETE, lockFails is empty, and nextAction=SUBMIT_ORDER. Partial lock success does not mean the whole order can be submitted; submit only after every updated product line can be locked.
# 8.7 Submit Outbound Order (POST)
URL: https://developers.cjdropshipping.com/api2.0/v1/shopping/privateInventory/outbound/submit
| Parameter | Definition | Type | Required | Note |
|---|---|---|---|---|
| orderId | Outbound order number | string | Y | data.orderId returned by the create API. |
Response fields:
| Response field | Type | Description |
|---|---|---|
| data.orderId | string | Outbound order number. |
| data.submitAccepted | boolean | OMS has accepted the submit request. |
| data.nextAction | string | Next action, usually POLL_SUBMIT_PROGRESS, WAIT_APPROVAL, PAY, or FINISHED; ADJUST_LOCK_FAIL_PRODUCTS means inventory is insufficient or product lines failed to lock. |
Insufficient inventory / lock-failure response example:
{
"code": 1603001,
"result": false,
"message": "Private inventory is insufficient. Please call /shopping/privateInventory/outbound/detail, reduce productList.quantity or remove failed product lines, call /shopping/privateInventory/outbound/create again with the same orderId, then submit again.",
"data": {
"orderId": "SD260526000001",
"createStatus": "LOCK_FAIL",
"submitAccepted": false,
"nextAction": "ADJUST_LOCK_FAIL_PRODUCTS",
"actionRequired": "ADJUST_QUANTITY_AND_RESUBMIT",
"lockFails": [
{
"sku": "CJNSXZXX001-Black-S",
"privateOrderId": "SY260526000001",
"quantity": 10,
"lockQuantity": 6
}
],
"suggestedSteps": [
"Call /shopping/privateInventory/outbound/detail with orderId to review product lines.",
"Reduce productList.quantity or remove failed product lines according to lockFails/availableQuantity.",
"Call /shopping/privateInventory/outbound/create again with the same orderId to update the outbound order.",
"Poll /shopping/privateInventory/outbound/progress until lockFails is empty and nextAction is SUBMIT_ORDER, then submit again."
]
}
}
Before submitting, confirm that /progress returns a submit-ready status: lockFails must be empty, and nextAction must not be ADJUST_LOCK_FAIL_PRODUCTS. If /submit returns the insufficient-inventory / lock-failure business error above, this is not a system service exception. Adjust product quantities or remove failed product lines according to data.lockFails / availableQuantity, call /create again with the same orderId, keep polling /progress, and call /submit again only after the order becomes submit-ready.
After the outbound order is submitted successfully, the customer can sign in to MyCJ and view it on the https://www.cjdropshipping.com/mine/dropshipping/orderList?orderType=7 (opens new window) page.
# 8.8 Query Outbound Order Detail (POST)
URL: https://developers.cjdropshipping.com/api2.0/v1/shopping/privateInventory/outbound/detail
| Parameter | Definition | Type | Required | Note |
|---|---|---|---|---|
| orderId | Outbound order number | string | Y | Used for edit display, retry after lock failure, or detail view. |
Main response fields:
| Response field | Type | Description |
|---|---|---|
| data.orderId / data.orderNumber | string | Outbound order number / custom order number. |
| data.storageId / data.platform / data.storeName | string | Warehouse, store platform, and store name. |
| data.postagePayNode | integer | Postage payment node. |
| data.address | object | Shipping information, same fields as the create API address. |
| data.productList | list | Product lines, same fields as the create API plus display fields such as availableQuantity, lockQuantity, and price. |
| data.orderStatus / data.submitStatus | string | OMS order status / API aggregated submit status. |
# 8.9 Cancel Outbound Order (POST)
URL: https://developers.cjdropshipping.com/api2.0/v1/shopping/privateInventory/outbound/cancel
| Parameter | Definition | Type | Required | Note |
|---|---|---|---|---|
| orderId | Outbound order number | string | Y | Outbound order to cancel. |
| reason | Cancel reason | string | N | Client-side remark. |
Response fields:
| Response field | Type | Description |
|---|---|---|
| data.orderId | string | Cancelled outbound order number. Some OMS versions may return a boolean or raw downstream object. |
| data.cancelled | boolean | Whether cancellation succeeded. |
Submit, detail, and cancel APIs all verify that the outbound order belongs to the current
CJ-Access-Tokencustomer. If the OMS status does not allow the operation, the OMS error is returned.
# 9 Makeup / Supplement Payments
Makeup bill API path prefix: /api2.0/v1/shopping/makeup/*. Use it to list unpaid makeup bills, create a makeup payment order (returns payId and cjPayUrl), and pay by balance using the payId. type: 0=Make-up Orders / 1=Other Make-up; diffUseType subdivides Other Make-up usage.
# 9.1 Sequence Diagram
sequenceDiagram
autonumber
participant Client as OpenAPI Client
participant API as CJ OpenAPI
participant Browser as Browser/Payment Page
Client->>API: POST /shopping/makeup/list(pageNum, pageSize, type, diffUseType)
API-->>Client: Return makeup page data, unpaid counts, and unpaid total amount
Client->>API: POST /shopping/makeup/createPayOrder(orderCodes, type, diffUseType)
API-->>Client: Return payOrderCode, payId, amount, cjPayUrl, and paymentPagePath
alt Redirect to payment page
Client->>Browser: Redirect to cjPayUrl https://www.cjdropshipping.com/mine/payment?pid={payId}
Browser-->>Client: User completes payment on the payment page
else Direct balance payment
Client->>API: POST /shopping/pay/payBalanceV2(shipmentOrderId=payOrderCode, payId, orderType=24)
API-->>Client: Return balance payment result
end
Note over Client,API: After payId is created, the client either redirects to the payment page or calls POST /shopping/pay/payBalanceV2(orderType=24) to pay directly by balance
Client->>API: POST /shopping/makeup/list(pageNum, pageSize, type)
API-->>Client: Return refreshed makeup status
# 9.2 Get Makeup List (POST)
URL: https://developers.cjdropshipping.com/api2.0/v1/shopping/makeup/list
Request example:
{
"pageNum": 1,
"pageSize": 20,
"type": 0
}
| Parameter | Definition | Type | Required | Note |
|---|---|---|---|---|
| pageNum | Page number | integer | N | Default 1. |
| pageSize | Page size | integer | N | Default 10, maximum 200. |
| type | Supplement payment type | integer | N | 0=Make-up Orders, 1=Other Make-up. If empty, the API returns the first type that has unpaid records. |
| diffUseType | Supplement usage type | integer | N | Filter for type=1: 1=Balance Top-up, 2=Repayment, 3=Transfer Shipping Fee. For type=0, omit it or pass 0. |
Response example:
{
"code": 200,
"result": true,
"message": "Success",
"data": {
"type": 0,
"totalAmount": 12.35,
"unPaymentCountList": [
{ "type": 0, "count": 2 },
{ "type": 1, "count": 0 }
],
"pageData": {
"pageSize": 20,
"pageNumber": 1,
"totalRecords": 2,
"totalPages": 1,
"content": [
{
"orderCode": "BK260526000001",
"cjOrderCode": "ZF260526000001",
"status": 0,
"amount": 12.35,
"reason": "Postage difference",
"orderType": 1,
"diffUseType": 0,
"createAt": 1779763200000
}
]
}
},
"requestId": "2b97f15603384fe4832e85617cf07d9c"
}
| Response field | Type | Description |
|---|---|---|
| data.type | integer | Current supplement payment type. |
| data.totalAmount | number | Total unpaid amount under the current filter, in USD. |
| data.unPaymentCountList[].type / count | integer | Unpaid count by supplement payment type. |
| data.pageData.content[].orderCode | string | Makeup bill number; pass it in orderCodes when paying by balance. |
| data.pageData.content[].cjOrderCode | string | Related CJ order number. |
| data.pageData.content[].status | integer | Status: 0=to submit, 1=processing, 2=failed, 3=cancelled, 4=completed, 5=paying. |
| data.pageData.content[].amount | number | Makeup amount, in USD. |
| data.pageData.content[].reason | string | English makeup reason. |
| data.pageData.content[].orderType | integer | Related order type for page display. |
| data.pageData.content[].diffUseType | integer | Usage type: 0=order supplement payment, 1=Balance Top-up, 2=Repayment, 3=Transfer Shipping Fee. |
| data.pageData.content[].createAt | long | Created time, Unix timestamp in milliseconds. |
# 9.3 Create Makeup Payment Order (POST)
URL: https://developers.cjdropshipping.com/api2.0/v1/shopping/makeup/createPayOrder
This API matches the MyCJ page flow “select makeup bills → Pay”: take orderCode values from the makeup list, call this API, and receive a generated makeup payment order and payId. The page redirects to https://www.cjdropshipping.com/mine/payment?pid={payId} after receiving payId; OpenAPI returns the same-format cjPayUrl and the relative paymentPagePath for integration. This API only creates a payment order and does not pay by balance.
Request example:
{
"orderCodes": ["BK260526000001"],
"type": 0
}
| Parameter | Definition | Type | Required | Note |
|---|---|---|---|---|
| orderCodes | Makeup bill numbers | array<string> | Y | Values from the makeup list orderCode; at least one value is required. |
| type | Supplement payment type | integer | N | Default 0; 0=Make-up Orders, 1=Other Make-up. |
| diffUseType | Supplement usage type | integer | Required when type=1 | For type=0, omit it or pass 0. For type=1, pass 1=Balance Top-up, 2=Repayment, or 3=Transfer Shipping Fee. |
Response example:
{
"code": 200,
"result": true,
"message": "Success",
"data": {
"payOrderCode": "2605260000000001",
"payId": "PAY260526000001",
"amount": 12.35,
"cjPayUrl": "https://www.cjdropshipping.com/mine/payment?pid=PAY260526000001",
"paymentPagePath": "/mine/payment?pid=PAY260526000001"
},
"requestId": "2b97f15603384fe4832e85617cf07d9c"
}
| Response field | Type | Description |
|---|---|---|
| data.payOrderCode | string | Payment order number generated for this makeup payment. |
| data.payId | string | Payment center pay ID; the MyCJ page uses it to open the payment page. |
| data.amount | number | Amount to pay, in USD. |
| data.cjPayUrl | string | Full CJ payment page URL, formatted as https://www.cjdropshipping.com/mine/payment?pid={payId}. |
| data.paymentPagePath | string | MyCJ payment page path, formatted as /mine/payment?pid={payId}. |
Makeup payment: after obtaining
payIdfromcreatePayOrder, the client can either redirect to thecjPayUrlpayment page, or call/shopping/pay/payBalanceV2(distinguished byorderType) to pay with the current account balance.
← 4 Storage 6 Logistic →