Cancel
Cancel an active contract by providing the contract ID. The loginid parameter has been removed and response fields are now guaranteed.
3 breaking changes - code updates required
Critical Change:
The loginid parameter has been removed and all response fields are now required.
Quick comparison
| Aspect | Legacy | New | Action required |
|---|---|---|---|
Endpoint ✅ Same | cancel | cancel | None |
Auth Required ✅ Same | Yes | Yes | None |
Scope ✅ Same | trade | trade | None |
loginid Parameter ❌ Removed | Optional | Removed | Remove from requests |
cancel Object in Response ⚠️ Changed | Optional | Required | Simplify error handling |
Response Fields ⚠️ Changed | All optional | All required | Remove null checks |
Breaking changes
1. Removal of loginid parameter
What Changed: The loginid parameter is no longer supported in New. In Legacy, this parameter was used to specify which account to cancel a contract from when multiple tokens were provided during authorization.
Migration: Remove the loginid field from your cancel requests. Account selection is now handled through the authorization token.
2. cancel object now required in response
What Changed: The cancel object is now a required field at the root level of the response. In Legacy, only echo_req andmsg_type were required.
Migration: You can now rely on the cancel object always being present in successful responses. Remove any conditional checks for its existence.
3. All response fields now required
What Changed: All fields within the cancel response object are now required: balance_after,contract_id,reference_id,sold_for, andtransaction_id. In Legacy, all these fields were optional.
Migration: You can simplify your response handling code by removing null/undefined checks for these fields. They are guaranteed to be present in successful responses.
Request structure
Legacy Request Example
1{
2 "cancel": 11542203588,
3 "loginid": "CR123456", // ❌ Removed in New
4 "passthrough": {
5 "user_action": "manual_cancel"
6 },
7 "req_id": 1
8}New Request Example
1{
2 "cancel": 11542203588,
3 "passthrough": {
4 "user_action": "manual_cancel"
5 },
6 "req_id": 1
7}Response structure
Legacy Response Example
1{
2 "cancel": {
3 "balance_after": 10450.50,
4 "contract_id": 11542203588,
5 "reference_id": 11542203587,
6 "sold_for": 23.45,
7 "transaction_id": 11542203589
8 },
9 "echo_req": {
10 "cancel": 11542203588,
11 "req_id": 1
12 },
13 "msg_type": "cancel",
14 "req_id": 1
15}New Response Example
1{
2 "cancel": {
3 "balance_after": 10450.50,
4 "contract_id": 11542203588,
5 "reference_id": 11542203587,
6 "sold_for": 23.45,
7 "transaction_id": 11542203589
8 },
9 "echo_req": {
10 "cancel": 11542203588,
11 "req_id": 1
12 },
13 "msg_type": "cancel",
14 "req_id": 1
15}Code examples
Legacy Implementation
1async function cancelContract(contractId, loginId = null) {
2 const request = {
3 cancel: contractId,
4 req_id: 1
5 };
6
7 // Add loginid if provided (for multi-account scenarios)
8 if (loginId) {
9 request.loginid = loginId;
10 }
11
12 ws.send(JSON.stringify(request));
13
14 // Handle response
15 ws.onmessage = (message) => {
16 const response = JSON.parse(message.data);
17 if (response.msg_type === 'cancel') {
18 // Fields may be undefined - need null checks
19 if (response.cancel) {
20 const soldFor = response.cancel.sold_for ?? 0;
21 const balance = response.cancel.balance_after ?? 0;
22 console.log(`Contract cancelled`);
23 console.log(`Sold for: ${soldFor}`);
24 console.log(`New balance: ${balance}`);
25 }
26 }
27 };
28}
29
30// Usage with loginid for multi-account
31cancelContract(11542203588, 'CR123456');New Implementation
1async function cancelContract(contractId) {
2 const request = {
3 cancel: contractId,
4 req_id: 1
5 };
6 // loginid removed - account selection via auth token
7
8 ws.send(JSON.stringify(request));
9
10 // Handle response
11 ws.onmessage = (message) => {
12 const response = JSON.parse(message.data);
13 if (response.msg_type === 'cancel') {
14 // All fields guaranteed - no null checks needed
15 console.log(`Contract ${response.cancel.contract_id} cancelled`);
16 console.log(`Sold for: ${response.cancel.sold_for}`);
17 console.log(`New balance: ${response.cancel.balance_after}`);
18 console.log(`Reference ID: ${response.cancel.reference_id}`);
19 console.log(`Transaction ID: ${response.cancel.transaction_id}`);
20 }
21 };
22}
23
24// Usage without loginid
25cancelContract(11542203588);Migration checklist
Remove loginid parameter
Remove the loginid field from all cancel requests
Simplify response handling
The cancel object is now guaranteed in successful responses - remove existence checks
Remove null/undefined checks for response fields
All fields (balance_after, contract_id, reference_id, sold_for, transaction_id) are now required