ADDR=0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb
curl "https://api.arcus.xyz/v1/orders?address=${ADDR}&limit=100"
# Everything that ended without filling, in one market.
curl "https://api.arcus.xyz/v1/orders?address=${ADDR}&market=BTC-USD&status=CANCELED,REJECTED"import requests
r = requests.get(
"https://api.arcus.xyz/v1/orders",
params={
"address": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb",
"limit": 100,
# "market": "BTC-USD",
# requests encodes a list as repeated params, which the
# endpoint accepts alongside the comma-separated form.
# "status": ["CANCELED", "REJECTED"],
# "from": 1712345678000,
# "to": 1712349278000,
},
)
print(r.json())
const url = new URL("https://api.arcus.xyz/v1/orders");
url.searchParams.set("address", "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb");
url.searchParams.set("limit", "100");
// Either spelling works: one comma-separated value, or append once
// per status.
url.searchParams.set("status", "CANCELED,REJECTED");
const res = await fetch(url);
console.log(await res.json());
const options = {method: 'GET'};
fetch('https://api.arcus.xyz/v1/orders', 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/orders",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.arcus.xyz/v1/orders"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.arcus.xyz/v1/orders")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcus.xyz/v1/orders")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"orders": [
{
"orderId": "<string>",
"marketId": 32767,
"marketDisplayName": "BTC-USD",
"side": "BUY",
"status": "PENDING",
"price": "<string>",
"originalSize": "<string>",
"remainingSize": "<string>",
"updatedAt": 123,
"clientId": "<string>",
"address": "<string>",
"accountIndex": 4,
"type": "LIMIT",
"filledSize": "<string>",
"avgFillPrice": "<string>",
"timeInForce": "GTC",
"goodTilTime": "<string>",
"reduceOnly": true,
"triggerPrice": "<string>",
"tpslType": "STOP_LOSS",
"isPositionTPSL": true,
"parentOrderId": "<string>",
"rejectionReason": "POST_ONLY_WOULD_CROSS",
"cancelReason": "MODIFY_CANCELED",
"state": "OPEN",
"positionEffect": "OPEN_LONG",
"createdAt": 123,
"sequenceNumber": 123
}
],
"total": 123
}{
"error": "Invalid request body",
"code": "GEO_RESTRICTED"
}{
"error": "rate limited",
"reason": "account_empty",
"retryAfterMs": 850,
"clientId": "my-order-42"
}Get order history
Returns the order history (open, filled, canceled, rejected) for the requested account address, newest-first by event time. Optional from/to (epoch microseconds, the unit of the updatedAt field in the response) bound the time window for follow-on pagination. Optional market, side, and status narrow the results; status takes one or more values and matches each order’s current status. No authentication header is required.
ADDR=0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb
curl "https://api.arcus.xyz/v1/orders?address=${ADDR}&limit=100"
# Everything that ended without filling, in one market.
curl "https://api.arcus.xyz/v1/orders?address=${ADDR}&market=BTC-USD&status=CANCELED,REJECTED"import requests
r = requests.get(
"https://api.arcus.xyz/v1/orders",
params={
"address": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb",
"limit": 100,
# "market": "BTC-USD",
# requests encodes a list as repeated params, which the
# endpoint accepts alongside the comma-separated form.
# "status": ["CANCELED", "REJECTED"],
# "from": 1712345678000,
# "to": 1712349278000,
},
)
print(r.json())
const url = new URL("https://api.arcus.xyz/v1/orders");
url.searchParams.set("address", "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb");
url.searchParams.set("limit", "100");
// Either spelling works: one comma-separated value, or append once
// per status.
url.searchParams.set("status", "CANCELED,REJECTED");
const res = await fetch(url);
console.log(await res.json());
const options = {method: 'GET'};
fetch('https://api.arcus.xyz/v1/orders', 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/orders",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.arcus.xyz/v1/orders"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.arcus.xyz/v1/orders")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcus.xyz/v1/orders")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"orders": [
{
"orderId": "<string>",
"marketId": 32767,
"marketDisplayName": "BTC-USD",
"side": "BUY",
"status": "PENDING",
"price": "<string>",
"originalSize": "<string>",
"remainingSize": "<string>",
"updatedAt": 123,
"clientId": "<string>",
"address": "<string>",
"accountIndex": 4,
"type": "LIMIT",
"filledSize": "<string>",
"avgFillPrice": "<string>",
"timeInForce": "GTC",
"goodTilTime": "<string>",
"reduceOnly": true,
"triggerPrice": "<string>",
"tpslType": "STOP_LOSS",
"isPositionTPSL": true,
"parentOrderId": "<string>",
"rejectionReason": "POST_ONLY_WOULD_CROSS",
"cancelReason": "MODIFY_CANCELED",
"state": "OPEN",
"positionEffect": "OPEN_LONG",
"createdAt": 123,
"sequenceNumber": 123
}
],
"total": 123
}{
"error": "Invalid request body",
"code": "GEO_RESTRICTED"
}{
"error": "rate limited",
"reason": "account_empty",
"retryAfterMs": 850,
"clientId": "my-order-42"
}from/to (epoch microseconds, the unit of the updatedAt field in the response) bound the time window for follow-on pagination. Optional market, side, and status narrow the results; status takes one or more values and matches each order’s current status. No authentication header is required.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}$Restrict results to one or more order statuses. Case-insensitive. Accepts repeated params (?status=CANCELED&status=REJECTED) or a comma-separated list (?status=CANCELED,REJECTED); the two are equivalent. Multiple values are a union. An unrecognised value → 400, so a misspelling surfaces as an error rather than as an empty page that looks like a real result.
Matches each order's current status — the one reported in the status field of the response — not any status it held earlier in its life. An order that was placed and later canceled matches CANCELED only.
Values:
OPEN— resting on the matching book.UNTRIGGERED— a TPSL parked on the untriggered book.FILLED— fully filled.CANCELED— canceled, including margin cancels and expiries.REJECTED— rejected by the engine.LIQUIDATED/ADL— closed by a forced-closure flow.
MARGIN_CANCELED and the TPSL cancel variants are recorded as CANCELED, so there is no separate filter value for them.
OPEN, UNTRIGGERED, FILLED, CANCELED, REJECTED, LIQUIDATED, ADL ["CANCELED", "REJECTED"]
Maximum number of orders to return. Default and maximum are both 1000; requests above the maximum are silently clamped. Pass an explicit smaller value when you want fewer rows.
Filters are applied before this cap, so a filtered page still carries up to limit matching orders.
1 <= x <= 1000Start of the time window, filtering on updatedAt (epoch microseconds, inclusive) — the same unit and field the response reports, so a updatedAt read from one page is a valid bound for the next with no conversion.
Second- and millisecond-scale values are rejected with a 400 (the server requires at least 1e14). A millisecond bound read as microseconds would land in 1970 and quietly return nothing.
When omitted, defaults to 30 days before to (or before now when to is omitted too), so an unbounded request returns at most the last month of orders. A status filter of only OPEN / UNTRIGGERED bypasses the time window, so long-resting open orders are always returned.
x >= 1000000000000001785801600123456
End of the time window, filtering on updatedAt (epoch microseconds, inclusive) — the same unit and field the response reports, so a updatedAt read from one page is a valid bound for the next with no conversion.
The bound closes over the whole microsecond it names, so page boundaries overlap by design — deduplicate by id when paging.
Second- and millisecond-scale values are rejected with a 400 (the server requires at least 1e14). A millisecond bound read as microseconds would land in 1970 and quietly return nothing.
x >= 1000000000000001785801699001200
Was this page helpful?