curl --request POST \
--url https://api.arcus.xyz/v1/cancelOrder \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--header 'X-Signature: <api-key>' \
--header 'X-Timestamp: <api-key>' \
--data '
{
"address": "<string>",
"marketId": 32767,
"accountIndex": 4,
"kind": "orderId",
"orderId": "<string>",
"validUntil": 123,
"signature": "<string>",
"timestamp": 4611686018427388000
}
'import requests
url = "https://api.arcus.xyz/v1/cancelOrder"
payload = {
"address": "<string>",
"marketId": 32767,
"accountIndex": 4,
"kind": "orderId",
"orderId": "<string>",
"validUntil": 123,
"signature": "<string>",
"timestamp": 4611686018427388000
}
headers = {
"X-API-Key": "<api-key>",
"X-Timestamp": "<api-key>",
"X-Signature": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-API-Key': '<api-key>',
'X-Timestamp': '<api-key>',
'X-Signature': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
address: '<string>',
marketId: 32767,
accountIndex: 4,
kind: 'orderId',
orderId: '<string>',
validUntil: 123,
signature: '<string>',
timestamp: 4611686018427388000
})
};
fetch('https://api.arcus.xyz/v1/cancelOrder', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.arcus.xyz/v1/cancelOrder",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'address' => '<string>',
'marketId' => 32767,
'accountIndex' => 4,
'kind' => 'orderId',
'orderId' => '<string>',
'validUntil' => 123,
'signature' => '<string>',
'timestamp' => 4611686018427388000
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>",
"X-Signature: <api-key>",
"X-Timestamp: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.arcus.xyz/v1/cancelOrder"
payload := strings.NewReader("{\n \"address\": \"<string>\",\n \"marketId\": 32767,\n \"accountIndex\": 4,\n \"kind\": \"orderId\",\n \"orderId\": \"<string>\",\n \"validUntil\": 123,\n \"signature\": \"<string>\",\n \"timestamp\": 4611686018427388000\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("X-Timestamp", "<api-key>")
req.Header.Add("X-Signature", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.arcus.xyz/v1/cancelOrder")
.header("X-API-Key", "<api-key>")
.header("X-Timestamp", "<api-key>")
.header("X-Signature", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"address\": \"<string>\",\n \"marketId\": 32767,\n \"accountIndex\": 4,\n \"kind\": \"orderId\",\n \"orderId\": \"<string>\",\n \"validUntil\": 123,\n \"signature\": \"<string>\",\n \"timestamp\": 4611686018427388000\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcus.xyz/v1/cancelOrder")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["X-Timestamp"] = '<api-key>'
request["X-Signature"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"address\": \"<string>\",\n \"marketId\": 32767,\n \"accountIndex\": 4,\n \"kind\": \"orderId\",\n \"orderId\": \"<string>\",\n \"validUntil\": 123,\n \"signature\": \"<string>\",\n \"timestamp\": 4611686018427388000\n}"
response = http.request(request)
puts response.read_body{
"address": "0x1234567890abcdef1234567890abcdef12345678",
"accountIndex": 4,
"marketId": 32767,
"marketDisplayName": "BTC-USD",
"status": "CANCEL_ACKNOWLEDGED",
"updateTime": 123,
"orderId": "<string>",
"clientId": "<string>",
"remainingSize": "<string>",
"filledSize": "<string>",
"rejectionReason": "POST_ONLY_WOULD_CROSS",
"rateLimit": {
"pool": "order",
"remaining": 9958
}
}{
"address": "0x1234567890abcdef1234567890abcdef12345678",
"accountIndex": 4,
"marketId": 32767,
"marketDisplayName": "BTC-USD",
"status": "CANCEL_ACKNOWLEDGED",
"updateTime": 123,
"orderId": "<string>",
"clientId": "<string>",
"remainingSize": "<string>",
"filledSize": "<string>",
"rejectionReason": "POST_ONLY_WOULD_CROSS",
"rateLimit": {
"pool": "order",
"remaining": 9958
}
}{
"error": "Invalid request body",
"code": "GEO_RESTRICTED",
"errorSource": "Order",
"errorType": "Tick",
"rejectionReason": "POST_ONLY_WOULD_CROSS"
}{
"error": "Invalid request body",
"code": "GEO_RESTRICTED",
"errorSource": "Order",
"errorType": "Tick",
"rejectionReason": "POST_ONLY_WOULD_CROSS"
}{
"error": "Invalid request body",
"code": "GEO_RESTRICTED",
"errorSource": "Order",
"errorType": "Tick",
"rejectionReason": "POST_ONLY_WOULD_CROSS"
}{
"error": "rate limited",
"reason": "account_empty",
"retryAfterMs": 850,
"clientId": "my-order-42"
}{
"error": "Invalid request body",
"code": "GEO_RESTRICTED",
"errorSource": "Order",
"errorType": "Tick",
"rejectionReason": "POST_ONLY_WOULD_CROSS"
}{
"error": "Invalid request body",
"code": "GEO_RESTRICTED",
"errorSource": "Order",
"errorType": "Tick",
"rejectionReason": "POST_ONLY_WOULD_CROSS"
}{
"error": "Invalid request body",
"code": "GEO_RESTRICTED",
"errorSource": "Order",
"errorType": "Tick",
"rejectionReason": "POST_ONLY_WOULD_CROSS"
}Cancel order
Cancel an open order by ID.
curl --request POST \
--url https://api.arcus.xyz/v1/cancelOrder \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--header 'X-Signature: <api-key>' \
--header 'X-Timestamp: <api-key>' \
--data '
{
"address": "<string>",
"marketId": 32767,
"accountIndex": 4,
"kind": "orderId",
"orderId": "<string>",
"validUntil": 123,
"signature": "<string>",
"timestamp": 4611686018427388000
}
'import requests
url = "https://api.arcus.xyz/v1/cancelOrder"
payload = {
"address": "<string>",
"marketId": 32767,
"accountIndex": 4,
"kind": "orderId",
"orderId": "<string>",
"validUntil": 123,
"signature": "<string>",
"timestamp": 4611686018427388000
}
headers = {
"X-API-Key": "<api-key>",
"X-Timestamp": "<api-key>",
"X-Signature": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-API-Key': '<api-key>',
'X-Timestamp': '<api-key>',
'X-Signature': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
address: '<string>',
marketId: 32767,
accountIndex: 4,
kind: 'orderId',
orderId: '<string>',
validUntil: 123,
signature: '<string>',
timestamp: 4611686018427388000
})
};
fetch('https://api.arcus.xyz/v1/cancelOrder', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.arcus.xyz/v1/cancelOrder",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'address' => '<string>',
'marketId' => 32767,
'accountIndex' => 4,
'kind' => 'orderId',
'orderId' => '<string>',
'validUntil' => 123,
'signature' => '<string>',
'timestamp' => 4611686018427388000
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>",
"X-Signature: <api-key>",
"X-Timestamp: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.arcus.xyz/v1/cancelOrder"
payload := strings.NewReader("{\n \"address\": \"<string>\",\n \"marketId\": 32767,\n \"accountIndex\": 4,\n \"kind\": \"orderId\",\n \"orderId\": \"<string>\",\n \"validUntil\": 123,\n \"signature\": \"<string>\",\n \"timestamp\": 4611686018427388000\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("X-Timestamp", "<api-key>")
req.Header.Add("X-Signature", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.arcus.xyz/v1/cancelOrder")
.header("X-API-Key", "<api-key>")
.header("X-Timestamp", "<api-key>")
.header("X-Signature", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"address\": \"<string>\",\n \"marketId\": 32767,\n \"accountIndex\": 4,\n \"kind\": \"orderId\",\n \"orderId\": \"<string>\",\n \"validUntil\": 123,\n \"signature\": \"<string>\",\n \"timestamp\": 4611686018427388000\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcus.xyz/v1/cancelOrder")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["X-Timestamp"] = '<api-key>'
request["X-Signature"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"address\": \"<string>\",\n \"marketId\": 32767,\n \"accountIndex\": 4,\n \"kind\": \"orderId\",\n \"orderId\": \"<string>\",\n \"validUntil\": 123,\n \"signature\": \"<string>\",\n \"timestamp\": 4611686018427388000\n}"
response = http.request(request)
puts response.read_body{
"address": "0x1234567890abcdef1234567890abcdef12345678",
"accountIndex": 4,
"marketId": 32767,
"marketDisplayName": "BTC-USD",
"status": "CANCEL_ACKNOWLEDGED",
"updateTime": 123,
"orderId": "<string>",
"clientId": "<string>",
"remainingSize": "<string>",
"filledSize": "<string>",
"rejectionReason": "POST_ONLY_WOULD_CROSS",
"rateLimit": {
"pool": "order",
"remaining": 9958
}
}{
"address": "0x1234567890abcdef1234567890abcdef12345678",
"accountIndex": 4,
"marketId": 32767,
"marketDisplayName": "BTC-USD",
"status": "CANCEL_ACKNOWLEDGED",
"updateTime": 123,
"orderId": "<string>",
"clientId": "<string>",
"remainingSize": "<string>",
"filledSize": "<string>",
"rejectionReason": "POST_ONLY_WOULD_CROSS",
"rateLimit": {
"pool": "order",
"remaining": 9958
}
}{
"error": "Invalid request body",
"code": "GEO_RESTRICTED",
"errorSource": "Order",
"errorType": "Tick",
"rejectionReason": "POST_ONLY_WOULD_CROSS"
}{
"error": "Invalid request body",
"code": "GEO_RESTRICTED",
"errorSource": "Order",
"errorType": "Tick",
"rejectionReason": "POST_ONLY_WOULD_CROSS"
}{
"error": "Invalid request body",
"code": "GEO_RESTRICTED",
"errorSource": "Order",
"errorType": "Tick",
"rejectionReason": "POST_ONLY_WOULD_CROSS"
}{
"error": "rate limited",
"reason": "account_empty",
"retryAfterMs": 850,
"clientId": "my-order-42"
}{
"error": "Invalid request body",
"code": "GEO_RESTRICTED",
"errorSource": "Order",
"errorType": "Tick",
"rejectionReason": "POST_ONLY_WOULD_CROSS"
}{
"error": "Invalid request body",
"code": "GEO_RESTRICTED",
"errorSource": "Order",
"errorType": "Tick",
"rejectionReason": "POST_ONLY_WOULD_CROSS"
}{
"error": "Invalid request body",
"code": "GEO_RESTRICTED",
"errorSource": "Order",
"errorType": "Tick",
"rejectionReason": "POST_ONLY_WOULD_CROSS"
}address query parameter matching the master Ethereum address for X-API-Key.
Response behavior
Asynchronous. The endpoint returns either202 Accepted (the common case — the signed cancel was forwarded to the matching engine and the body does not carry terminal state) or 200 OK (the gateway already had definitive state for the cancel by the time it responded; status reflects that state). In both cases the body echoes the targeted orderId / clientId so subscribers can correlate WebSocket events with the request. To observe the resulting state (CANCELED, or FILLED if the order completed before cancel was processed) clients must subscribe to the orders WebSocket channel.Authorizations
Unix time in nanoseconds as a decimal string (e.g. "1713825891591000000"). Millisecond or second epochs are rejected with 401 Unauthorized. Must be within ±30,000 ms of server wall-clock, or the request is rejected with 401 Unauthorized. Required on all mutating / credential-creating endpoints. This same value must appear as the ct field in the ordersign typed canonical payload (single-order endpoints) or in each element's ct field (batch endpoints).
Lowercase hex-encoded Ed25519 signature (128 chars).
Single-order endpoints (placeOrder, cancelOrder, modifyOrder, and other non-batch mutating routes) sign over the ordersign typed canonical payload — a compact, key-sorted JSON object built from parsed request fields using engine-native integer values:
placeOrder: {"ad":"0x…","ai":N,[,"c":"…"],"ct":N,"g":N,"m":N,"op":1,"p":N,"q":N,"r":0|1,"s":N,"t":N,"v":1}
cancelOrder: {"ad":"0x…","ai":N,[,"c":"…"],"ct":N,[,"id":"…"],"m":N,"op":2,"v":1}
modifyOrder: {"ad":"0x…","ai":N,[,"c":"…"],"ct":N,"g":N,[,"id":"…"],"m":N,"op":3,"p":N,"q":N,"r":0|1,"s":N,"t":N,"v":1} (exactly one of id / c)
ct must equal the X-Timestamp header value. Keys in brackets are conditional (omitted when empty). op values: 1=place, 2=cancel, 3=modify. See the ordersign package for field definitions and reference signing code.
Other signed routes (e.g. createApiKey) still use the legacy scheme: signing_message = X-Timestamp + ACTION + canonicalJSON(body), where ACTION is the camelCase final path segment.
Batch endpoints (batchPlaceOrders, batchCancelOrders, batchModifyOrders) do NOT use this header. They authenticate with per-element typed ordersign signatures embedded in the request body (see the global auth description and the per-field signature descriptions on OrderRequest / CancelOrderRequest / ModifyOrderRequest).
Read endpoints are authenticated by ?address= (and optionally X-API-Key) only — no signature is required, except for the signed affiliate reads (see the Referral tag), which require the full header triple; with no body their signing message is X-Timestamp + ACTION. canonicalJSON(body) is the JSON body with object keys sorted lexicographically at every level and no whitespace; the server canonicalizes the received body before verifying, so only the bytes signed over must be canonical. Required on all mutating / credential-creating endpoints.
Query Parameters
Master Ethereum address for this API key (must match address from POST /createApiKey for the same key). Required on REST for account-scoped reads and for place/cancel. Invalid hex → 400; mismatch with key → 403.
20-byte EVM address as hex: optional 0x or 0X prefix and exactly 40 hexadecimal digits. API responses normalize to lowercase a–f after 0x.
^(0x|0X)?[0-9a-fA-F]{40}$Body
- Option 1
- Option 2
Cancel target is exactly one of orderId (server-generated, CancelByOrderId) or clientId (from place order, CancelByClientId). Sending both is rejected by the server with HTTP 400.
Per-cancel Ed25519 signature (128 hex). REQUIRED when this cancel is an element of a POST /batchCancelOrders cancels array; omitted for single POST /cancelOrder (which uses X-Signature in the HTTP header instead).
Covers the ordersign typed canonical payload for this cancel (op=2): {"ad":"0x…","ai":N,[,"c":"…"],"ct":N,[,"id":"…"],"m":N,"op":2,"v":1}
ct must equal the shared X-Timestamp header value. Keys in brackets are conditional (omitted when empty — exactly one of id or c must be present).
Response
Cancel processed and the gateway already has definitive state. status reflects that state (CANCELED / FILLED / REJECTED). Treat as best-effort enrichment of the 202 path; the orders WebSocket channel is still the source of truth.
Cancel response. The HTTP call is asynchronous and may return either:
202 Accepted— common case.statusisCANCEL_ACKNOWLEDGEDand the body carries no terminal state; theordersWebSocket channel delivers the resulting state.200 OK— the gateway already had definitive state for the cancel by the time it responded.statusreflects that state (CANCELEDon success,FILLEDif the order completed before the cancel landed,REJECTEDif the matching engine refused the cancel) and enrichment fields may be populated. Clients should treat this as best-effort and not rely on it.
In both cases the body echoes exactly one of orderId (cancel targeted server id) or clientId (cancel targeted client id), so subscribers can correlate WebSocket events with the request. To observe the full lifecycle clients must subscribe to the orders WebSocket channel.
CANCEL_ACKNOWLEDGED on the 202 path. On the 200 path, the definitive state (CANCELED / FILLED / REJECTED). Subscribe to the orders WebSocket channel for the full lifecycle.
PENDING, OPEN, PARTIALLY_FILLED, FILLED, CANCELED, MARGIN_CANCELED, REJECTED, UNTRIGGERED, TPSL_PLACED, TPSL_TRIGGERED, TPSL_CANCELED, LIQUIDATED, ADL, ACK, CANCEL_ACKNOWLEDGED, CANCEL_ALL_ACKNOWLEDGED, CANCEL_PENDING, ERROR "CANCEL_ACKNOWLEDGED"
Machine-readable reason when the matching engine rejected the cancel on the 200 path. Otherwise rejection reasons are delivered via the orders WebSocket channel.
POST_ONLY_WOULD_CROSS, SELF_TRADE, UNDERCOLLATERALIZED, COULD_NOT_FILL, IOC_CANCELED, FOK_FAILED, REDUCE_ONLY_WOULD_INCREASE, TOO_MANY_CLIENT_IDS, DUPLICATE_CLIENT_ID, POSITION_TPSL_ALREADY_EXISTS, ENTRY_TPSL_CANNOT_BE_POSITION_TPSL, ORDER_WILL_TAKE_LIQUIDITY_DURING_MARKET_HALT, ORDER_NOT_FOUND_FOR_MODIFY, MODIFY_CHANGED_IMMUTABLE_FIELD, MODIFY_ZERO_SIZE, PRICE_WILL_EXCEED_MAXIMUM_OUTSIDE_RTH_TRADING_BOUND, MODIFY_WOULD_CROSS_OUTSIDE_RTH_TRADING_BOUNDARY, FILL_WILL_EXCEED_TRADING_BOUND, OPEN_INTEREST_CAP_EXCEEDED, POSITION_SIZE_CAP_EXCEEDED, MODIFY_TPSL_NOT_SUPPORTED, MODIFY_SUPERSEDED_BY_CANCEL, MODIFY_SIZE_ALREADY_FILLED, ORDER_NOT_FOUND, OPEN_ORDER_CAP_EXCEEDED, EXPIRED Was this page helpful?