curl
curl "https://api.arcus.xyz/v1/trade/12345?market=BTC-USD"import requests
r = requests.get(
"https://api.arcus.xyz/v1/trade/12345",
params={"market": "BTC-USD"},
)
print(r.json())
const url = new URL("https://api.arcus.xyz/v1/trade/12345");
url.searchParams.set("market", "BTC-USD");
const res = await fetch(url);
console.log(await res.json());
const options = {method: 'GET'};
fetch('https://api.arcus.xyz/v1/trade/{tradeId}', 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/trade/{tradeId}",
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/trade/{tradeId}"
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/trade/{tradeId}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcus.xyz/v1/trade/{tradeId}")
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{
"marketId": 0,
"marketDisplayName": "BTC-USD",
"side": "BUY",
"price": "94500.00",
"size": "0.25",
"tradeId": "12345",
"timestamp": 1712345678000000,
"takerOrderId": "abc-123...",
"takerAddress": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
"makerOrderId": "def-456...",
"makerAddress": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8",
"sequenceNumber": 9991234
}{
"error": "Invalid request body",
"code": "GEO_RESTRICTED"
}{
"error": "Invalid request body",
"code": "GEO_RESTRICTED"
}{
"error": "rate limited",
"reason": "account_empty",
"retryAfterMs": 850,
"clientId": "my-order-42"
}Public
Get a single trade by ID
Returns one trade row. The market query parameter is required: trades_by_market is partitioned by market_id first, so without it the lookup would scan every market’s parts.
GET
/
v1
/
trade
/
{tradeId}
curl
curl "https://api.arcus.xyz/v1/trade/12345?market=BTC-USD"import requests
r = requests.get(
"https://api.arcus.xyz/v1/trade/12345",
params={"market": "BTC-USD"},
)
print(r.json())
const url = new URL("https://api.arcus.xyz/v1/trade/12345");
url.searchParams.set("market", "BTC-USD");
const res = await fetch(url);
console.log(await res.json());
const options = {method: 'GET'};
fetch('https://api.arcus.xyz/v1/trade/{tradeId}', 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/trade/{tradeId}",
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/trade/{tradeId}"
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/trade/{tradeId}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcus.xyz/v1/trade/{tradeId}")
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{
"marketId": 0,
"marketDisplayName": "BTC-USD",
"side": "BUY",
"price": "94500.00",
"size": "0.25",
"tradeId": "12345",
"timestamp": 1712345678000000,
"takerOrderId": "abc-123...",
"takerAddress": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
"makerOrderId": "def-456...",
"makerAddress": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8",
"sequenceNumber": 9991234
}{
"error": "Invalid request body",
"code": "GEO_RESTRICTED"
}{
"error": "Invalid request body",
"code": "GEO_RESTRICTED"
}{
"error": "rate limited",
"reason": "account_empty",
"retryAfterMs": 850,
"clientId": "my-order-42"
}The response body shown here is a static example, not live data. After you click Send, your live result appears in a separate panel headed 200 OK. The panel under the status-code tabs is a fixed sample from the spec — its field values (fees, prices, sizes, IDs, timestamps) are placeholders. Use Send, or call the endpoint, for current values.
market query parameter is required: trades_by_market is partitioned by market_id first, so without it the lookup would scan every market’s parts.Response
Trade.
One public-trades fill row — one row per maker/taker pairing. Returned by GET /v1/trades (newest-first array) and by the trades WebSocket channel (one frame per taker match, with one row per pairing inside).
On the WS trades channel the update payload is an array of these rows, all built from a single taker match; takerOrderId, takerAddress, timestamp, and sequenceNumber repeat on every row.
Was this page helpful?