# 7 Dispute
# 1 Select the list of disputed products(GET)
# URL
https://developers.cjdropshipping.com/api2.0/v1/disputes/disputeProducts
# CURL
curl --location --request GET 'https://developers.cjdropshipping.com/api2.0/v1/disputes/disputeProducts?orderId=CJPKL7160102171YQ' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| orderId | CJ order id | string | Y | 100 |
# Return
success
{
"code": 200,
"result": true,
"message": "Success",
"data": {
"orderId": "75727832844206081",
"orderNumber": "1627572766607937536",
"productInfoList": [
{
"lineItemId": "27572784056172547",
"cjProductId": "70030020423733248",
"cjVariantId": "70030020612476928",
"canChoose": true,
"price": 23.00,
"quantity": 1,
"cjProductName": "Hellpoo",
"cjImage": "http://d847fcac-392f-4168-8b06-a580a8368dff.jpg",
"sku": "CJSJ1041743",
"supplierName": "banggood"
}
]
},
"requestId": "11edc6cc84254bb4b3ac74299d5db197",
"success": true
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| orderId | CJ order id | string | 200 | |
| orderNumber | customer order number | string | 200 | |
| productInfoList | Product information list | Object[] | ||
| lineItemId | lineItem id | string | 100 | |
| cjProductId | CJ product id | string | 100 | |
| cjVariantId | CJ variant id | string | 100 | |
| canChoose | Is it possible to check to open a dispute | boolean | true:yes, false:no | |
| price | product price | BigDecimal | (18,2) | Unit: $ (USD) |
| quantity | quantity | integer | 20 | |
| cjProductName | CJ product name | string | 200 | |
| cjImage | CJ product image | string | 100 | |
| sku | sku | string | 100 | |
| supplierName | supplier name | 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 |
# 2 Confirm the dispute(POST)
# URL
https://developers.cjdropshipping.com/api2.0/v1/disputes/disputeConfirmInfo
# CURL
curl --location --request POST 'https://developers.cjdropshipping.com/api2.0/v1/disputes/disputeConfirmInfo' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--data-raw '{
"orderId": "62650625018974208",
"productInfoList": [
{
"lineItemId": "1626506252349808640",
"quantity": "1"
}
]
}'
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| orderId | CJ order id | string | Y | 100 | |
| productInfoList | product information | object[] | Y | ||
| lineItemId | lineItem id | string | N | ||
| quantity | quantity | integer | Y | ||
| price | price | BigDecimal | Y | (18,2) | Unit: $ (USD) |
# Return
success
{
"code": 200,
"result": true,
"message": "Success",
"data": {
"orderId": "265062501897420801",
"orderNumber": "1626506237791440896",
"maxProductPrice": 23.00,
"maxPostage": 0.00,
"maxIossTaxAmount": 0,
"maxIossHandTaxAmount": 0,
"maxAmount": 23.00,
"expectResultOptionList": [
"1"
],
"productInfoList": [
{
"lineItemId": "1626506252349808640",
"cjProductId": "1570030020423733248",
"cjVariantId": "1570030020612476928",
"canChoose": false,
"price": 23.00,
"quantity": 1,
"cjProductName": "Hellpoo",
"cjImage": "https://d847fcac-392f-4168-8b06-a580a8368dff.jpg",
"sku": "CJSJ1041743-A",
"supplierName": "banggood"
}
],
"disputeReasonList": [
{
"disputeReasonId": 1,
"reasonName": "Unfulfilled Order Cancellation"
}
]
},
"requestId": "af336b7bdc364e6391b9d558690b1521",
"success": true
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| orderId | CJ order id | string | 200 | |
| orderNumber | customer order number | string | 200 | |
| expectResultOptionList | expected result | string[] | 1: Refund , 2:Reissue | |
| maxProductPrice | Product price | BigDecimal | (18,2) | Unit: $ (USD) |
| maxPostage | Postage | BigDecimal | (18,2) | Unit: $ (USD) |
| maxIossTaxAmount | ioss tax amount | BigDecimal | (18,2) | Unit: $ (USD) |
| maxIossHandTaxAmount | ioss tax fee amount | BigDecimal | (18,2) | Unit: $ (USD) |
| maxAmount | Apply for refund amount | BigDecimal | (18,2) | Unit: $ (USD) |
| productInfoList | product information | Object[] | ||
| canChoose | Whether to check open dispute | boolean | 2 | false or ture |
| price | price | BigDecimal | (18,2) | Unit: $ (USD) |
| quantity | quantity | integer | 20 | |
| lineItemId | lineItem id | string | 100 | |
| cjProductId | CJ product id | string | 100 | |
| cjVariantId | CJ variant id | string | 100 | |
| cjProductName | CJ product name | string | 200 | |
| cjImage | CJ product image | string | 100 | |
| sku | CJ sku | string | 100 | |
| supplierName | supplier name | string | 200 | |
| disputeReasonList | dispute reason | object [] | ||
| disputeReasonId | dispute reason id | integer | 20 | |
| reasonName | dispute reason name (EN) | 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 |
# 3 Create dispute(POST)
Note: Disputes can only be created via this API for orders that were created through the API. Orders that were not created through the API cannot have disputes created via this interface.
# URL
https://developers.cjdropshipping.com/api2.0/v1/disputes/create
# CURL
curl --location --request POST 'https://developers.cjdropshipping.com/api2.0/v1/disputes/create' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--data-raw '{
"orderId": "275727832844206081",
"businessDisputeId": "0000001266",
"disputeReasonId": 1,
"expectType": 1,
"refundType": 1,
"messageText": "gfhfghfghfgh",
"imageUrl": [],
"productInfoList": [
{
"lineItemId": "1627572784056172547",
"quantity": "1"
}
]
}'
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| businessDisputeId | customer business id, 唯一值 | string | Y | 100 | |
| orderId | CJ order id | string | Y | 100 | |
| disputeReasonId | dispute reason id | integer | Y | 10 | |
| expectType | expect type | integer | Y | 20 | 1: Refund , 2:Reissue |
| refundType | Refund type | integer | Y | 20 | 1:balance , 2:platform |
| messageText | text message | string | Y | 500 | |
| imageUrl | image url | string [] | N | 200 | if your links may expire, copy them to CJ via "9 Upload dispute attachment" first |
| videoUrl | video url | string [] | N | 200 | same as above |
| productInfoList | product information | object[] | |||
| price | price | BigDecimal | Y | (18,2) | Unit: $ (USD) |
| lineItemId | lineItem id | string | N | 100 | |
| quantity | quantity | integer | Y | 10 |
# Return
success
{
"code": 200,
"result": true,
"message": "Success",
"data": true,
"requestId": "0242ad78-eea2-481d-876a-7cf64398f07f",
"success": true
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| code | status code | int | 20 | 200 means the dispute was created successfully |
| result | whether the request is successful | boolean | 1 | |
| message | return message | string | 200 | |
| data | whether the dispute was created successfully | boolean | 1 | returns true on success |
| requestId | request id | string | 48 | used for troubleshooting |
| success | whether the call succeeded | boolean | 1 | true-success, false-failed |
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 |
# 4 Cancel dispute(POST)
# URL
https://developers.cjdropshipping.com/api2.0/v1/disputes/cancel
# CURL
curl --location --request POST 'https://developers.cjdropshipping.com/api2.0/v1/disputes/cancel' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--data-raw '{
"orderId": "J1623672949997490176",
"disputeId": "SH1623673863466725376"
}'
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| orderId | CJ order id | string | Y | 100 | |
| disputeId | CJ dispute id | string | Y | 100 |
# Return
success
{
"code": 200,
"result": true,
"message": "Success",
"data": true,
"requestId": "0242ad78-eea2-481d-876a-7cf64398f07f",
"success": true
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| code | status code | int | 20 | 200 means the dispute was canceled successfully |
| result | whether the request is successful | boolean | 1 | |
| message | return message | string | 200 | |
| data | whether the dispute was canceled successfully | boolean | 1 | returns true on success |
| requestId | request id | string | 48 | used for troubleshooting |
| success | whether the call succeeded | boolean | 1 | true-success, false-failed |
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 |
# 5 Query the list of disputes(GET)
# URL
https://developers.cjdropshipping.com/api2.0/v1/disputes/getDisputeList
# CURL
curl --location --request GET 'https://developers.cjdropshipping.com/api2.0/v1/disputes/getDisputeList' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| orderId | CJ order id | string | N | 100 | |
| disputeId | dispute id | integer | N | 10 | |
| orderNumber | customer order number | string | N | 100 | |
| pageNum | page number | integer | N | 10 | default: 1 |
| pageSize | page size | integer | N | 10 | default: 10 |
| startDate | Created-time lower bound | long | N | 20 | UTC milliseconds, exclusive; pair with endDate, maximum 90 days |
| endDate | Created-time upper bound | long | N | 20 | UTC milliseconds, exclusive; not earlier than startDate |
| status | V2 dispute status | string | N | Comma-separated codes, e.g. 100,200; omit for no status filter |
# Return
success
{
"code": 200,
"result": true,
"message": "Success",
"data": {
"pageNum": 1,
"pageSize": 10,
"total": 1,
"list": [
{
"id": "SH1623673863466725376",
"shopId": "1588478917529051136",
"shopName": "bo te_api",
"status": "Processing",
"disputeReason": "Item not received",
"replacementAmount": 0.00,
"resendOrderCode": "",
"money": 0.00,
"finallyDeal": null,
"createDate": "2025-01-15 10:30:00",
"productList": []
}
]
},
"requestId": "0242ad78-eea2-481d-876a-7cf64398f07f",
"success": true
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| pageNum | page number | int | 20 | |
| pageSize | page size | int | 20 | |
| total | total | int | 20 | |
| list | dispute list | List | ||
| - status | dispute status | string | 20 | |
| - id | dispute id | string | 100 | |
| - shopId | shop id | string | 100 | May be empty for archived orders |
| - shopName | shop name | string | 200 | May be empty for archived orders |
| - disputeReason | dispute reason | string | 200 | |
| - replacementAmount | Reissue amount | BigDecimal | (18,2) | Unit: $ (USD) |
| - resendOrderCode | Reissue order id | string | 100 | |
| - money | final refund amount | BigDecimal | (18,2) | Unit: $ (USD) |
| - finallyDeal | final negotiation result | integer | 10 | 1:Refund, 2: Reissue, 3: Reject |
| - createDate | create date | string | 50 | millisecond timestamp |
| - updateDate | last update time | long | 50 | millisecond timestamp. See "About updateDate" below |
| - productList | product information | Object[] | ||
| -- image | product image | string | 200 | |
| -- price | product price | BigDecimal | (18,2) | Unit: $ (USD) |
| -- lineItemId | lineItem id | string | 100 | |
| -- cjProductId | CJ product id | string | 100 | |
| -- cjVariantId | CJ variant id | string | 100 | |
| -- productName | product name | string | 200 | |
| -- supplierName | supplier name | 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 |
# About updateDate
updateDate is the last-modified time of the dispute record. Use it to detect that a dispute
has moved on (including a new reply from CJ support) without polling each dispute's detail.
Do not use updateDate as the only cursor for incremental sync
This field is the update time of the dispute record row, not the maximum timestamp across
every action in the dispute lifecycle. Records exist whose updateDate is earlier than their
final processing time, so pulling only updateDate > lastSyncTime will miss disputes.
Recommended usage: use updateDate for change detection, and additionally run a periodic
full re-pull by create-date range as a safety net.
# Date and status semantics
startDate/endDate filter creation time, not updateDate. Omitted filters retain previous behavior. Use overlapping reconciliation windows and deduplicate by dispute ID because both boundaries are exclusive. V2 status codes: 100=Pending processing, 200=Pending review, 300=Finance review, 400=On hold, 500=Customer confirmation, 510=Supplier refund finance review, 520=Awaiting payment, 530=Payment processing, 540=Arbitration reserved, 600=Completed, 700=Cancelled, 800=Arbitration cancelled. DISPUTE webhook types 1–5 are not these filter codes. updateDate is a nullable long in milliseconds and remains a change indicator, not a complete incremental cursor. Existing DISPUTE webhooks are unchanged.
# 6 Get dispute detail(GET)
# URL
https://developers.cjdropshipping.com/api2.0/v1/disputes/getDisputeDetail
# CURL
curl --location --request GET 'https://developers.cjdropshipping.com/api2.0/v1/disputes/getDisputeDetail?disputeId=12345' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| disputeId | dispute id | string | Y | 100 |
# Return
success
{
"code": 200,
"result": true,
"message": "Success",
"data": {
"id": "SH1623673863466725376",
"shopId": "1588478917529051136",
"shopName": "bo te_api",
"status": "Processing",
"disputeReason": "Item not received",
"replacementAmount": 0.00,
"resendOrderCode": "",
"money": 12.50,
"refundAmount": 12.50,
"finallyDeal": 1,
"createDate": 1736928600000,
"refundDetails": [
{
"type": "PRODUCT_COST",
"typeName": "Product Cost",
"amount": 10.00
},
{
"type": "SHIPPING_COST",
"typeName": "Shipping Cost",
"amount": 2.50
}
],
"productList": [
{
"image": "https://example.com/image.jpg",
"price": 10.00,
"productCode": "CJPROD001",
"productId": "pid001",
"productName": "Sample Product",
"standId": "vid001",
"supplierName": "Supplier A"
}
]
},
"requestId": "0242ad78-eea2-481d-876a-7cf64398f07f",
"success": true
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| id | dispute id | string | 100 | |
| shopId | shop id | string | 100 | May be empty for archived orders |
| shopName | shop name | string | 200 | May be empty for archived orders |
| status | dispute status | string | 20 | |
| disputeReason | dispute reason | string | 200 | |
| replacementAmount | reissue amount | BigDecimal | (18,2) | Unit: $ (USD) |
| resendOrderCode | reissue order id | string | 100 | |
| money | final refund amount | BigDecimal | (18,2) | Unit: $ (USD) |
| refundAmount | final refund amount | BigDecimal | (18,2) | Unit: $ (USD), same value as money |
| finallyDeal | final negotiation result | integer | 10 | 1:Refund, 2: Reissue, 3: Reject |
| createDate | create date (timestamp ms) | long | 20 | |
| refundDetails | refund cost breakdown | Object[] | ||
| - type | cost type | string | 50 | e.g. PRODUCT_COST / SHIPPING_COST / IOSS_TAX / IOSS_HANDLING_FEE |
| - typeName | cost type name | string | 50 | e.g. Product Cost / Shipping Cost / IOSS Tax / IOSS Handling Fee |
| - amount | amount | BigDecimal | (18,2) | Unit: $ (USD) |
| productList | product information | Object[] | ||
| - image | product image | string | 200 | |
| - price | product price | BigDecimal | (18,2) | Unit: $ (USD) |
| - productCode | product code | string | 100 | |
| - productId | product id | string | 100 | |
| - productName | product name | string | 200 | |
| - standId | variant id | string | 100 | |
| - supplierName | supplier name | 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 |
success
{
"code": 200,
"result": true,
"message": "Success",
"data": {
"id": "12345",
"status": "Processing",
"disputeReason": "Item not received",
"productList": []
},
"requestId": "0242ad78-eea2-481d-876a-7cf64398f07f",
"success": true
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| id | dispute id | string | 100 | |
| status | dispute status | string | 50 | |
| disputeReason | dispute reason | string | 200 | |
| replacementAmount | Reissue amount | BigDecimal | (18,2) | Unit: $ (USD) |
| resendOrderCode | Reissue order id | string | 100 | |
| money | final refund amount | BigDecimal | (18,2) | Unit: $ (USD) |
| finallyDeal | final negotiation result | integer | 10 | 1:Refund, 2: Reissue, 3: Reject |
| createDate | create date | string | 50 | |
| productList | product information | Object[] | ||
| - image | product image | string | 200 | |
| - price | product price | BigDecimal | (18,2) | Unit: $ (USD) |
| - productCode | product code | string | 100 | |
| - productId | product id | string | 100 | |
| - productName | product name | string | 200 | |
| - standId | variant id | string | 100 | |
| - supplierName | supplier name | 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 |
# 7 Query dispute messages(POST)
Retrieve the conversation between you and CJ support for a dispute, including text and attachments, so you can reproduce the full negotiation history in your own system without logging in to the CJ dashboard.
Coverage
This endpoint returns all disputes under your API account, not only those on orders created via API. Disputes on Excel-imported orders, dropshipping orders and manually created orders are all included. Access is decided by dispute ownership, not by the channel the order came from.
# URL
https://developers.cjdropshipping.com/api2.0/v1/disputes/getDisputeMessages
# CURL
curl --location 'https://developers.cjdropshipping.com/api2.0/v1/disputes/getDisputeMessages' \
--header 'Content-Type: application/json' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--data '{"disputeId":"SH2607291323371283500","pageNum":1,"pageSize":10}'
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| disputeId | dispute id | string | Y | 100 | |
| pageNum | page number | integer | N | 10 | default 1 |
| pageSize | items per page | integer | N | 10 | default 10, max 50 |
# Return
success
{
"code": 200,
"result": true,
"message": "Success",
"data": {
"pageNum": 1,
"pageSize": 10,
"total": 2,
"list": [
{
"messageId": "1770485313446354944",
"orderId": "SD2607290935060338700",
"userType": "1",
"createDate": 1785331419000,
"message": "package not received",
"imageUrl": ["https://your-domain.com/evidence-1.jpg"],
"videoUrl": []
},
{
"messageId": "1770485313446354945",
"orderId": "SD2607290935060338700",
"userType": "2",
"createDate": 1785331431000,
"message": "The order has been refunded.",
"imageUrl": [],
"videoUrl": []
}
]
},
"requestId": "0242ad78-eea2-481d-876a-7cf64398f07f",
"success": true
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| pageNum | current page | int | 20 | |
| pageSize | items per page | int | 20 | |
| total | total items | int | 20 | see "About pagination" below |
| list | message list | List | ordered by time ascending | |
| - messageId | message id | string | 100 | |
| - orderId | cj order id | string | 100 | |
| - userType | sender | string | 10 | 1 - buyer (you), 2 - CJ support |
| - createDate | message time | long | 20 | millisecond timestamp |
| - message | message body | string | 500 | may be empty when only files were sent |
| - imageUrl | image attachments | string[] | publicly accessible URLs, may be empty | |
| - videoUrl | video attachments | string[] | publicly accessible URLs, may be empty |
About pagination
In the current version total and list come from two different stores, so the pagination
parameters are not exact: the size of list may differ from pageSize, and paging may
return overlapping content.
Recommended usage: set pageSize to its maximum (50) and fetch everything in one call
instead of paging. Virtually all disputes have far fewer than 50 messages. If total is
greater than the number of items returned, trust list. This limitation will be fixed in a
future release.
error
{
"code": 1005,
"result": false,
"message": "Please check it carefully.",
"data": null,
"requestId": "323fda9d-3c94-41dc-a944-5cc1b8baf5b1"
}
| Code | Meaning |
|---|---|
| 1005 | The dispute does not exist, or it does not belong to your account. Both cases return the same code — check the dispute id first. |
# 8 Reply dispute(POST)
Append a message to an ongoing dispute, optionally with image/video evidence, so you can negotiate from your own system without logging in to the CJ dashboard.
# URL
https://developers.cjdropshipping.com/api2.0/v1/disputes/reply
# CURL
curl --location 'https://developers.cjdropshipping.com/api2.0/v1/disputes/reply' \
--header 'Content-Type: application/json' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--data '{
"disputeId": "SH2607291323371283500",
"messageText": "Here is the unboxing video.",
"imageUrl": ["https://your-domain.com/evidence-1.jpg"],
"videoUrl": []
}'
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| disputeId | dispute id | string | Y | 100 | |
| messageText | message body | string | Y | 500 | must not be blank; emojis are stripped |
| imageUrl | image attachments | string[] | N | see "About attachments" below | |
| videoUrl | video attachments | string[] | N | see "About attachments" below |
About attachments
Pass publicly accessible URLs in imageUrl / videoUrl, the same way as the "Create dispute"
endpoint, and make sure they stay reachable while the dispute is being processed. If your own links
expire, copy them to CJ with "9 Upload dispute attachment" first and use the returned URL — it does not
expire, and images open directly in the browser.
Dispute statuses that accept replies
Only disputes in the following statuses accept new messages. Any other status returns 9063:
| Status | Meaning |
|---|---|
| 100 | Pending processing |
| 200 | Pending review |
| 300 | Refund under finance review |
| 400 | On hold |
| 510 | Supplier self-ship refund under finance review |
| 530 | Paying |
| 600 | Completed |
Replies are accepted on completed disputes (600), but such messages are for communication only and do not change the settled outcome.
This endpoint is not idempotent
Do not blindly retry on timeout or network failure — doing so inserts a duplicate message into the dispute. Call "Query dispute messages" first to check whether your previous request was already recorded, then decide whether to resend.
# Return
success
{
"code": 200,
"result": true,
"message": "Success",
"data": true,
"requestId": "0242ad78-eea2-481d-876a-7cf64398f07f",
"success": true
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| data | whether it was sent | boolean | 1 | |
| requestId | requestId | string | 48 | for log lookup |
error
{
"code": 9063,
"result": false,
"message": "The dispute is in a status that does not accept new messages.",
"data": null,
"requestId": "323fda9d-3c94-41dc-a944-5cc1b8baf5b1"
}
| Code | Meaning |
|---|---|
| 9063 | The dispute's current status does not accept new messages — see the whitelist above |
| 1005 | The dispute does not exist, or it does not belong to your account (same code for both) |
# 9 Upload dispute attachment(POST)
Copy your image or video to CJ: give the attachment's URL, CJ downloads and stores it right away,
and returns a CJ-hosted URL to put in imageUrl / videoUrl of "Create dispute" and "Reply dispute".
If your own attachment links expire (for example helpdesk links that expire after 1 hour), copy the file
here first, so it stays reachable while the dispute is being processed.
# URL
https://developers.cjdropshipping.com/api2.0/v1/disputes/uploadFile
# CURL
curl --location --request POST 'https://developers.cjdropshipping.com/api2.0/v1/disputes/uploadFile' \
--header 'Content-Type: application/json' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--data '{"fileUrl": "https://your-helpdesk.com/attachments/8f3a?sig=xxx"}'
| Parameter | Definition | Type | Required | Length | Note |
|---|---|---|---|---|---|
| fileUrl | attachment's URL | string | Y | 2000 | see "URL requirements" and "File requirements" below |
One file per request; call it once per attachment.
URL requirements
- Must be a publicly accessible
http:///https://URL on the default port (80 / 443), without user:password; private-network addresses are rejected. - The URL must still be valid when you call: CJ downloads it synchronously within this call; once stored, the original URL is no longer needed.
- Redirects are followed up to 3 times; every redirect target must also be a public address.
- The source must start responding within 20 seconds, the whole download must finish within 120 seconds, and it must return HTTP 200.
- URLs without a file extension or with signature parameters are fine — CJ detects the type from the file content.
File requirements
| Type | Formats | Max per file | Max per account per day |
|---|---|---|---|
| Image | jpg / jpeg / png / webp / gif | 10MB | 50 |
| Video | mp4 / mov / webm | 10MB | 10 |
- Images and videos together are limited to 2GB per account per day. Days are counted in Beijing time (UTC+8).
- The format is detected from the file content, regardless of the extension in the URL; svg, html and similar content is rejected.
- Failed copies do not count toward the daily limits.
- Each call costs 20 points (see API points), charged per call, including calls rejected by validation.
About the returned URL
- The URL is on a CJ domain and is publicly accessible without login:
- Images open directly in the browser as a preview, not as a download;
- Videos play directly in the browser (mp4 and webm work in all major browsers; whether a mov plays depends on its codec, so prefer mp4).
- The URL does not expire; CJ does not delete it automatically, so it stays reachable during and after the dispute.
- Anyone with the URL can open it — do not copy files that contain personal data, passwords or other sensitive information.
- Put it in
imageUrlwhenfileTypeisIMAGE, and invideoUrlwhen it isVIDEO.
# Return
success
{
"code": 200,
"result": true,
"message": "Success",
"data": {
"url": "https://oss.cjdropshipping.com/cj-openapi-rest/dispute/2026/09/28/xxxx/3f2a9c1e0b7d4e5f8a6b2c1d0e9f8a7b.mp4",
"fileType": "VIDEO",
"size": 10485760
},
"requestId": "0242ad78-eea2-481d-876a-7cf64398f07f",
"success": true
}
| Field | Definition | Type | Length | Note |
|---|---|---|---|---|
| data.url | attachment URL | string | 300 | public URL on a CJ domain; images open directly in the browser. Put it in imageUrl or videoUrl |
| data.fileType | attachment type | string | 10 | IMAGE: use in imageUrl; VIDEO: use in videoUrl |
| data.size | file size | long | in bytes | |
| requestId | request ID | string | 48 | for troubleshooting |
error
{
"code": 1607024,
"result": false,
"message": "Failed to download fileUrl (HTTP 404)",
"data": null,
"requestId": "323fda9d-3c94-41dc-a944-5cc1b8baf5b1"
}
| Code | Meaning |
|---|---|
| 1600300 | fileUrl is empty or longer than 2000 characters |
| 1607023 | fileUrl (or a redirect target) is not a public http/https address on the default port |
| 1607024 | Download failed; the parentheses give the reason: an HTTP status such as HTTP 404 (often an expired link) / timeout / connection failed / unknown host / too many redirects |
| 1607017 | The file at the URL is empty |
| 1607018 | Unsupported format (detected from the content) |
| 1607019 | File exceeds the per-file limit (10MB for both images and videos) |
| 1607020 | Daily limit exceeded (count or the 2GB total); resets the next day, Beijing time |
| 1607021 | Too many video copies in progress, please retry later |
| 1607022 | Storing failed; the parentheses name the failed step: storage authorization failed / storage write failed / storage confirmation failed / temp file failed. Safe to retry; not counted toward the daily limits |
# Example: copy first, then create the dispute
- Copy the attachment and take
data.urlfrom the response:
curl --location --request POST 'https://developers.cjdropshipping.com/api2.0/v1/disputes/uploadFile' \
--header 'Content-Type: application/json' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--data '{"fileUrl": "https://your-helpdesk.com/attachments/broken-item.jpg"}'
- Put
data.urlinimageUrl/videoUrlof "3 Create dispute" (or "8 Reply dispute"):
curl --location --request POST 'https://developers.cjdropshipping.com/api2.0/v1/disputes/create' \
--header 'Content-Type: application/json' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--data '{
"businessDisputeId": "your-dispute-001",
"orderId": "SD2609280000000000000",
"disputeReasonId": 1,
"expectType": 1,
"refundType": 1,
"messageText": "The item arrived broken.",
"imageUrl": ["<image url returned in step 1>"],
"videoUrl": ["<url returned when copying the video>"],
"productInfoList": [{"lineItemId": "xxx", "quantity": 1, "price": 9.9}]
}'
← 6 Logistic 8 Webhook →