# 10 Ticket
Note: These endpoints cover everything available on the CJ client "My CJ > Ticket" page. Typical flow: call Ticket Types to learn the question types and required form fields → Create Ticket → track it with Ticket List / Ticket Detail / Messages → Reply when CJ asks for more information → Complete to close it. If you need attachments, upload them through Upload Attachment first and put the returned URL into the create/reply request.
About
status(important): this group uses one set of semantic values only, and the same set is used for both request and response. Do not send numbers.
Value Meaning Usable as list filter AWAITING_CJ_REPLYWaiting for CJ to handle Yes AWAITING_YOUR_REPLYWaiting for you to reply/confirm Yes COMPLETEDCompleted Yes EXPIREDExpired Yes REVIEWEDReviewed Yes ON_HOLDOn hold No (response only) COLLABORATINGBeing handled collaboratively No (response only) Filtering by
ON_HOLD/COLLABORATING/ a number / any other value returns a parameter error. It is never silently treated as "no filter".
Rate limit (important): these endpoints are limited to 1 request per second. Calling them back-to-back returns
1600200 Too Many Requests, QPS limit is 1 time/1second. Call them serially with a gap between requests — do not design for concurrency. To pull data in bulk use pagination (pageSizeup to 100) instead of firing parallel requests.
# 1 Ticket List (POST)
# URL
https://developers.cjdropshipping.com/api2.0/v1/ticket/list
# CURL
curl --location --request POST 'https://developers.cjdropshipping.com/api2.0/v1/ticket/list' \
--header 'CJ-Access-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data '{"pageNum":1,"pageSize":20,"status":"AWAITING_YOUR_REPLY"}'
| Parameter | Meaning | Type | Required | Length | Remark |
|---|---|---|---|---|---|
| pageNum | Page number | integer | No | Starts at 1, default 1 | |
| pageSize | Page size | integer | No | Default 20, max 100; a larger value returns a parameter error | |
| searchType | Search dimension | string | No | TICKET_NO / CJ_ORDER_NO / YOUR_ORDER_NO, used together with search | |
| search | Search value | string | No | 100 | |
| ticketTypeId | Ticket type id | long | No | From the Ticket Types endpoint | |
| status | Ticket status | string | No | See the status table above | |
| shopIds | Shop id list | string[] | No | From /shop/getShops |
# Response
success
{
"code": 200,
"result": true,
"message": "Success",
"data": {
"pageNum": 1,
"pageSize": 20,
"total": 1,
"list": [
{
"ticketId": "9001",
"ticketNo": "T202609050001",
"ticketType": "Service Consultation",
"issueType": "Fulfillment Service Consultation",
"status": "AWAITING_YOUR_REPLY",
"createTime": 1788500000000,
"lastUpdateTime": 1788500100000,
"cjOrderNo": ["CJ2026090400001"],
"yourOrderNo": ["#1024"],
"shopName": ["my-shop"],
"canRemind": true,
"hasReminded": false,
"createdByCj": false,
"unread": true
}
]
},
"requestId": "0242ad78-eea2-481d-876a-7cf64398f07f",
"success": true
}
| Field | Meaning | Type | Remark |
|---|---|---|---|
| ticketId | Ticket id | string | Use it in the other endpoints |
| ticketNo | Ticket number | string | For display |
| ticketType | Ticket type name | string | |
| issueType | Question type name | string | |
| status | Ticket status | string | See status table; may be null for a few legacy states |
| createTime | Created at | long | UTC milliseconds |
| lastUpdateTime | Last updated at | long | UTC milliseconds |
| cjOrderNo | Related CJ order numbers | string[] | Empty array when none |
| yourOrderNo | Your order numbers | string[] | Empty array when none |
| shopName | Related shop names | string[] | Empty array when none |
| canRemind | Whether a reminder is allowed now | boolean | |
| hasReminded | Whether it has been reminded | boolean | A ticket can be reminded only once |
| createdByCj | Created by a CJ agent on your behalf | boolean | |
| unread | Has unread replies | boolean |
# 2 Ticket Detail (GET)
# URL
https://developers.cjdropshipping.com/api2.0/v1/ticket/detail?ticketId=9001
| Parameter | Meaning | Type | Required |
|---|---|---|---|
| ticketId | Ticket id | string | Yes |
# Additional fields (on top of the list fields)
| Field | Meaning | Type | Remark |
|---|---|---|---|
| message | First problem description | string | |
| expectResult | Expected result | string | |
| sku | Related SKU | string | |
| sourcingId | Related sourcing id | string | |
| canReply | Whether replying is allowed now | boolean | Check this before calling Reply |
| canComplete | Whether you can close it | boolean | Always false for logistics tickets |
| attachments | Attachments | Object[] | fileName / url |
| formList | Form values submitted | Object[] | fieldName / value |
| evaluation | Your review | Object | null when not reviewed; level / comment / evaluateTime |
Note: A ticket that does not exist and a ticket that belongs to another account both return
1609005 Ticket not found. The two cases are deliberately not distinguished.
# 3 Messages (GET)
# URL
https://developers.cjdropshipping.com/api2.0/v1/ticket/messages?ticketId=9001&pageNum=1&pageSize=20
| Parameter | Meaning | Type | Required | Remark |
|---|---|---|---|---|
| ticketId | Ticket id | string | Yes | |
| pageNum | Page number | integer | No | Default 1 |
| pageSize | Page size | integer | No | Default 20, max 100 |
| Field | Meaning | Type | Remark |
|---|---|---|---|
| messageId | Message id | string | |
| sender | Sender side | string | CJ or CUSTOMER |
| senderName | Display name | string | |
| messageTime | Sent at | long | UTC milliseconds |
| messageHtml | Body | string | HTML, render it as HTML |
| messageText | Body as plain text | string | Tags stripped, for non-HTML clients |
| action | Message action | string | e.g. Reply / Resubmit, may be empty |
| attachments | Attachments | Object[] | fileName / url |
# 4 Ticket Types (GET)
# URL
https://developers.cjdropshipping.com/api2.0/v1/ticket/types
No parameters. Returns three levels: ticket type → question type → form definition.
{
"code": 200,
"data": [
{
"ticketTypeId": "1001",
"ticketTypeName": "Order Issue",
"questionTypes": [
{
"questionTypeId": "2001",
"questionTypeName": "Logistics Issue",
"formFields": [
{"fieldName": "Order Number", "required": true}
]
}
]
}
],
"success": true
}
Call this before creating a ticket: fields with
required=trueare mandatory, andformListmay only containfieldNamevalues returned here — sending an undefined field returns a parameter error instead of being silently dropped.
# 5 Create Ticket (POST)
# URL
https://developers.cjdropshipping.com/api2.0/v1/ticket/create
| Parameter | Meaning | Type | Required | Length | Remark |
|---|---|---|---|---|---|
| ticketTypeId | Ticket type id | long | Yes | From Ticket Types | |
| questionTypeId | Question type id | long | Yes | From Ticket Types (second level) | |
| message | Problem description | string | Yes | 1000 | |
| expectResult | Expected result | string | Yes | 1000 | |
| formList | Form values | Object[] | Depends | fieldName / value, see Ticket Types | |
| cjOrderNo | Related CJ order number | string | No | 100 | |
| yourOrderNo | Your order number | string | No | 100 | |
| sku | Related SKU | string | No | 100 | |
| attachments | Attachments | Object[] | No | fileName / url, up to 10; url must come from Upload Attachment | |
| requestNo | Duplicate-submit guard | string | No | 64 | See below — it is NOT an idempotency key |
# Response
{
"code": 200,
"data": {"estimatedHandleTime": 1788600000000},
"success": true
}
| Field | Meaning | Type | Remark |
|---|---|---|---|
| estimatedHandleTime | Estimated completion time | long | UTC milliseconds; null when CJ does not provide one (normal) |
⚠️ What
requestNoactually protects (corrected on 2026-09-07 after production testing):It only blocks repeated submissions with the same
requestNowithin 5 seconds (returning1609006 Duplicate submit). It is a 5-second lock, not an idempotency key.After 5 seconds, the same
requestNowill create another ticket. Measured: two submissions 5.7 seconds apart produced two identical tickets.Therefore do not blindly retry after a network timeout. Instead, call
POST /ticket/list(newest first) to check whether the previous attempt already succeeded, then decide whether to resubmit.requestNoonly guards against double-clicks and similar bursts.
This endpoint does not return a ticketId. To locate the ticket you just created, call Ticket List afterwards and take the newest one.
# 6 Reply (POST)
# URL
https://developers.cjdropshipping.com/api2.0/v1/ticket/reply
| Parameter | Meaning | Type | Required | Length |
|---|---|---|---|---|
| ticketId | Ticket id | string | Yes | |
| message | Reply content | string | Yes | 5-1000 |
| attachments | Attachments | Object[] | No |
Check
canReplyfrom Ticket Detail first — not every status accepts a reply; otherwise you get1609009.No idempotency protection: retrying creates duplicate messages. After a timeout, check Messages before retrying.
# 7 Complete (POST)
# URL
https://developers.cjdropshipping.com/api2.0/v1/ticket/complete
| Parameter | Meaning | Type | Required |
|---|---|---|---|
| ticketId | Ticket id | string | Yes |
Logistics tickets cannot be closed by yourself and return
1609009. CheckcanCompletefrom Ticket Detail first.
# 8 Remind (POST)
# URL
https://developers.cjdropshipping.com/api2.0/v1/ticket/remind
| Parameter | Meaning | Type | Required |
|---|---|---|---|
| ticketId | Ticket id | string | Yes |
Two limits: a ticket can be reminded only once (
1609010afterwards), and reminding is not allowed until enough time has passed since creation (1609011, retry later). CheckcanRemind/hasRemindedfirst to avoid a call that is bound to fail.
# 9 Review (POST)
# URL
https://developers.cjdropshipping.com/api2.0/v1/ticket/evaluate
| Parameter | Meaning | Type | Required | Length | Remark |
|---|---|---|---|---|---|
| ticketId | Ticket id | string | Yes | ||
| level | Review level | string | Yes | GOOD / AVERAGE / POOR | |
| comment | Comment | string | No | 1000 |
# 10 Pending Count (GET)
# URL
https://developers.cjdropshipping.com/api2.0/v1/ticket/pendingCount
No parameters.
| Field | Meaning | Type | Remark |
|---|---|---|---|
| pendingCount | Tickets waiting for you | integer | 0 when none |
| updateTime | Counted at | long | UTC milliseconds |
# 11 Upload Attachment (POST)
# URL
https://developers.cjdropshipping.com/api2.0/v1/ticket/attachment/upload
| Parameter | Meaning | Type | Required | Remark |
|---|---|---|---|---|
| fileName | Target file name | string | Yes | Must include an extension; / \ .., angle brackets and quotes are rejected |
| sourceUrl | Source file URL | string | Yes | Must be a publicly downloadable http/https address |
| Field | Meaning | Type | Remark |
|---|---|---|---|
| fileName | File name | string | |
| url | CJ attachment URL | string | Put it into attachments of create/reply |
Limits: 5MB per file; extension must be one of
jpg / jpeg / png / bmp / gif / txt / rar / zip / doc / docx / xls / xlsx / pdf / ini / conf / eml;sourceUrlmust be public (private, loopback and metadata addresses are rejected).The returned
urllooks likehttps://cj-commodity.oss-accelerate.aliyuncs.com/cj-openapi-rest/<date path>/<uuid>.png(measured in production on 2026-09-07). Put it intoattachmentsas-is; do not rewrite or re-assemble it.
# 12 Order/Sourcing Question Types (GET)
# URL
https://developers.cjdropshipping.com/api2.0/v1/ticket/order/questionTypes?type=ORDER_ISSUE
| Parameter | Meaning | Type | Required | Remark |
|---|---|---|---|---|
| type | Business type | string | Yes | ORDER_ISSUE / PRODUCT_ISSUE |
| Field | Meaning | Type |
|---|---|---|
| questionTypeId | Question type id | string |
| questionTypeName | Question type name | string |
This is not the same data set as Ticket Types. When raising a ticket against a specific order or sourcing request, use the ids returned here.
# 13 Create Ticket for an Order/Sourcing (POST)
# URL
https://developers.cjdropshipping.com/api2.0/v1/ticket/order/create
| Parameter | Meaning | Type | Required | Length | Remark |
|---|---|---|---|---|---|
| businessNo | Order number or sourcing id | string | Yes | 100 | CJ order number for ORDER_ISSUE, sourcing id for PRODUCT_ISSUE |
| type | Business type | string | Yes | ORDER_ISSUE / PRODUCT_ISSUE | |
| questionTypeId | Question type id | long | Yes | From Order/Sourcing Question Types | |
| message | Problem description | string | Yes | 1000 | |
| expectResult | Expected result | string | Yes | 1000 | |
| yourOrderNo | Your order number | string | No | 100 | |
| attachments | Attachments | Object[] | No | Same as Create Ticket |
No idempotency protection — retrying creates duplicate tickets. After a timeout, check Ticket List by order number before retrying.
# Error codes
| Code | Meaning | Suggested action |
|---|---|---|
| 1609000 | Unsupported ticket status | Check the status value, see the table at the top |
| 1609001 | Status cannot be used as a filter | Use one of the five filterable statuses |
| 1609002 | pageSize exceeds the limit | Use a value ≤100 |
| 1609003 | Query failed | Retry later |
| 1609004 | Unsupported search type | Check the searchType value |
| 1609005 | Ticket not found | Not found, or not owned by this account |
| 1609006 | Duplicate submit | Same requestNo already submitted, do not retry |
| 1609007 | Ticket/question type does not exist | Refresh the question type list |
| 1609008 | Create ticket failed | Retry later |
| 1609009 | Operation not allowed in current status | Check canReply / canComplete first |
| 1609010 | Already reminded | Do not retry |
| 1609011 | Cannot remind yet | Retry later |
| 1609012 | Missing required form field / undefined field sent | Compare with formFields from Ticket Types |
| 1609013 | Unsupported review level | Use GOOD / AVERAGE / POOR |
| 1609014 | Operation failed | Retry later |
| 1609015 | Invalid attachment | Check file name, source and count |
| 1609016 | Attachment upload failed | Make sure the source is public and ≤5MB |
| 1600200 | Rate limit exceeded | Limited to 1 request/second; call serially with a gap |
← 9 Shop 11 AI Data →