use xo_orderbook_client::orderbook::{Client, Config};
use xo_orderbook_client::orderbook::types::request::OrderBookSummaryRequest;
use xo_orderbook_client::types::U256;
let client = Client::new("https://orderbooks.xo.market", Config::default())?;
let yes = U256::from_str_radix("26516164265702901957933644848127860370782874751279270726689263951695181556943", 10)?;
let no = U256::from_str_radix("13730057904096984444199595880113152612639388204530324084054099203558669491245", 10)?;
let reqs = [
OrderBookSummaryRequest { token_id: yes },
OrderBookSummaryRequest { token_id: no },
];
let books = client.order_books(&reqs).await?;
// Response array is parallel to the request (same length, same order).
curl --request POST \
--url https://orderbooks.xo.market/books \
--header 'Content-Type: application/json' \
--data '
[
{
"token_id": "26516164265702901957933644848127860370782874751279270726689263951695181556943"
},
{
"token_id": "13730057904096984444199595880113152612639388204530324084054099203558669491245"
}
]
'import requests
url = "https://orderbooks.xo.market/books"
payload = [{ "token_id": "26516164265702901957933644848127860370782874751279270726689263951695181556943" }, { "token_id": "13730057904096984444199595880113152612639388204530324084054099203558669491245" }]
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify([
{
token_id: '26516164265702901957933644848127860370782874751279270726689263951695181556943'
},
{
token_id: '13730057904096984444199595880113152612639388204530324084054099203558669491245'
}
])
};
fetch('https://orderbooks.xo.market/books', 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://orderbooks.xo.market/books",
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([
[
'token_id' => '26516164265702901957933644848127860370782874751279270726689263951695181556943'
],
[
'token_id' => '13730057904096984444199595880113152612639388204530324084054099203558669491245'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$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://orderbooks.xo.market/books"
payload := strings.NewReader("[\n {\n \"token_id\": \"26516164265702901957933644848127860370782874751279270726689263951695181556943\"\n },\n {\n \"token_id\": \"13730057904096984444199595880113152612639388204530324084054099203558669491245\"\n }\n]")
req, _ := http.NewRequest("POST", url, payload)
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://orderbooks.xo.market/books")
.header("Content-Type", "application/json")
.body("[\n {\n \"token_id\": \"26516164265702901957933644848127860370782874751279270726689263951695181556943\"\n },\n {\n \"token_id\": \"13730057904096984444199595880113152612639388204530324084054099203558669491245\"\n }\n]")
.asString();require 'uri'
require 'net/http'
url = URI("https://orderbooks.xo.market/books")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "[\n {\n \"token_id\": \"26516164265702901957933644848127860370782874751279270726689263951695181556943\"\n },\n {\n \"token_id\": \"13730057904096984444199595880113152612639388204530324084054099203558669491245\"\n }\n]"
response = http.request(request)
puts response.read_body[
{
"market": "0x39a12d52b63969654926e095ddd96f5c459112714da03edca769aa58173c78fb",
"asset_id": "26516164265702901957933644848127860370782874751279270726689263951695181556943",
"timestamp": "1779355812367",
"hash": "86abb2eec0fed47888ef100977aa363345a032f35a53976d88e951c28bb57ab9",
"bids": [
{
"price": "0.547",
"size": "120"
}
],
"asks": [
{
"price": "0.553",
"size": "95"
}
],
"min_order_size": "5",
"tick_size": "0.001",
"neg_risk": false,
"last_trade_price": "0.550"
},
{
"market": "0x39a12d52b63969654926e095ddd96f5c459112714da03edca769aa58173c78fb",
"asset_id": "13730057904096984444199595880113152612639388204530324084054099203558669491245",
"timestamp": "1779355812367",
"hash": "1a2b3c4d5e6f0011223344556677889900aabbccddeeff00112233445566778899",
"bids": [
{
"price": "0.447",
"size": "95"
}
],
"asks": [
{
"price": "0.453",
"size": "120"
}
],
"min_order_size": "5",
"tick_size": "0.001",
"neg_risk": false,
"last_trade_price": "0.450"
}
]Get order books
Batch order books. The response array is parallel to the request body — same length, same order. Unknown token ids return an empty book shape rather than 404 (batch endpoints don’t per-element error).
use xo_orderbook_client::orderbook::{Client, Config};
use xo_orderbook_client::orderbook::types::request::OrderBookSummaryRequest;
use xo_orderbook_client::types::U256;
let client = Client::new("https://orderbooks.xo.market", Config::default())?;
let yes = U256::from_str_radix("26516164265702901957933644848127860370782874751279270726689263951695181556943", 10)?;
let no = U256::from_str_radix("13730057904096984444199595880113152612639388204530324084054099203558669491245", 10)?;
let reqs = [
OrderBookSummaryRequest { token_id: yes },
OrderBookSummaryRequest { token_id: no },
];
let books = client.order_books(&reqs).await?;
// Response array is parallel to the request (same length, same order).
curl --request POST \
--url https://orderbooks.xo.market/books \
--header 'Content-Type: application/json' \
--data '
[
{
"token_id": "26516164265702901957933644848127860370782874751279270726689263951695181556943"
},
{
"token_id": "13730057904096984444199595880113152612639388204530324084054099203558669491245"
}
]
'import requests
url = "https://orderbooks.xo.market/books"
payload = [{ "token_id": "26516164265702901957933644848127860370782874751279270726689263951695181556943" }, { "token_id": "13730057904096984444199595880113152612639388204530324084054099203558669491245" }]
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify([
{
token_id: '26516164265702901957933644848127860370782874751279270726689263951695181556943'
},
{
token_id: '13730057904096984444199595880113152612639388204530324084054099203558669491245'
}
])
};
fetch('https://orderbooks.xo.market/books', 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://orderbooks.xo.market/books",
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([
[
'token_id' => '26516164265702901957933644848127860370782874751279270726689263951695181556943'
],
[
'token_id' => '13730057904096984444199595880113152612639388204530324084054099203558669491245'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$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://orderbooks.xo.market/books"
payload := strings.NewReader("[\n {\n \"token_id\": \"26516164265702901957933644848127860370782874751279270726689263951695181556943\"\n },\n {\n \"token_id\": \"13730057904096984444199595880113152612639388204530324084054099203558669491245\"\n }\n]")
req, _ := http.NewRequest("POST", url, payload)
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://orderbooks.xo.market/books")
.header("Content-Type", "application/json")
.body("[\n {\n \"token_id\": \"26516164265702901957933644848127860370782874751279270726689263951695181556943\"\n },\n {\n \"token_id\": \"13730057904096984444199595880113152612639388204530324084054099203558669491245\"\n }\n]")
.asString();require 'uri'
require 'net/http'
url = URI("https://orderbooks.xo.market/books")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "[\n {\n \"token_id\": \"26516164265702901957933644848127860370782874751279270726689263951695181556943\"\n },\n {\n \"token_id\": \"13730057904096984444199595880113152612639388204530324084054099203558669491245\"\n }\n]"
response = http.request(request)
puts response.read_body[
{
"market": "0x39a12d52b63969654926e095ddd96f5c459112714da03edca769aa58173c78fb",
"asset_id": "26516164265702901957933644848127860370782874751279270726689263951695181556943",
"timestamp": "1779355812367",
"hash": "86abb2eec0fed47888ef100977aa363345a032f35a53976d88e951c28bb57ab9",
"bids": [
{
"price": "0.547",
"size": "120"
}
],
"asks": [
{
"price": "0.553",
"size": "95"
}
],
"min_order_size": "5",
"tick_size": "0.001",
"neg_risk": false,
"last_trade_price": "0.550"
},
{
"market": "0x39a12d52b63969654926e095ddd96f5c459112714da03edca769aa58173c78fb",
"asset_id": "13730057904096984444199595880113152612639388204530324084054099203558669491245",
"timestamp": "1779355812367",
"hash": "1a2b3c4d5e6f0011223344556677889900aabbccddeeff00112233445566778899",
"bids": [
{
"price": "0.447",
"size": "95"
}
],
"asks": [
{
"price": "0.453",
"size": "120"
}
],
"min_order_size": "5",
"tick_size": "0.001",
"neg_risk": false,
"last_trade_price": "0.450"
}
]Body
Response
OK
conditionId
Decimal U256 token id
Sorted ascending by price (best ask first).
Show child attributes
Show child attributes
Sorted descending by price (best bid first).
Show child attributes
Show child attributes
keccak256 of {bids ++ asks ++ timestamp}; bumps on every book change.
Unix milliseconds, stringified (TimestampMilliSeconds)
"0.001"
Minimum order size in human shares (decimal-string integer).
Returns "0" when the gateway has no MarketInfo for the
token yet (e.g. very fresh markets) — populated once
engine MarketInfo arrives.
Always false on XO.
Trimmed decimal; "0.000" if no trades have ever printed on this token.