# 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_REPLY Waiting for CJ to handle Yes
AWAITING_YOUR_REPLY Waiting for you to reply/confirm Yes
COMPLETED Completed Yes
EXPIRED Expired Yes
REVIEWED Reviewed Yes
ON_HOLD On hold No (response only)
COLLABORATING Being 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 (pageSize up 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=true are mandatory, and formList may only contain fieldName values 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 requestNo actually protects (corrected on 2026-09-07 after production testing):

It only blocks repeated submissions with the same requestNo within 5 seconds (returning 1609006 Duplicate submit). It is a 5-second lock, not an idempotency key.

After 5 seconds, the same requestNo will 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. requestNo only 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 canReply from Ticket Detail first — not every status accepts a reply; otherwise you get 1609009.

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. Check canComplete from 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 (1609010 afterwards), and reminding is not allowed until enough time has passed since creation (1609011, retry later). Check canRemind / hasReminded first 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; sourceUrl must be public (private, loopback and metadata addresses are rejected).

The returned url looks like https://cj-commodity.oss-accelerate.aliyuncs.com/cj-openapi-rest/<date path>/<uuid>.png (measured in production on 2026-09-07). Put it into attachments as-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