Get an event orderbook snapshot
curl --request GET \
--url https://api.sx.bet/orderbook-v3/snapshot/event \
--header 'x-sx-api-key: <api-key>'import requests
url = "https://api.sx.bet/orderbook-v3/snapshot/event"
headers = {"x-sx-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-sx-api-key': '<api-key>'}};
fetch('https://api.sx.bet/orderbook-v3/snapshot/event', 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.sx.bet/orderbook-v3/snapshot/event",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-sx-api-key: <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"
"net/http"
"io"
)
func main() {
url := "https://api.sx.bet/orderbook-v3/snapshot/event"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-sx-api-key", "<api-key>")
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.sx.bet/orderbook-v3/snapshot/event")
.header("x-sx-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sx.bet/orderbook-v3/snapshot/event")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-sx-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"status": "success",
"data": {
"eventId": "L13058397",
"nextKey": "eyJtYXJrZXRIYXNoIjoiMHhiZjA2YzYzNzljOTIyZDgxMTg2MTJkMWQ3NDkzYjIwZjZkZjY5Mjk0MzdmYmY2MDIyOTA0MzI3Zjk1MTZhMmViIn0=",
"markets": [
{
"marketHash": "0xbf06c6379c922d8118612d1d7493b20f6df6929437fbf6022904327f9516a2eb",
"outcomeOne": [
{
"percentageOdds": "50000000000000000000",
"size": "1000000"
}
],
"outcomeTwo": [],
"version": "00100000000000008914000"
}
]
}
}{
"message": [
"eventId must be longer than or equal to 2 characters"
],
"error": "Bad Request",
"statusCode": 400
}{
"message": "BAD_AUTH",
"error": "Unauthorized",
"statusCode": 401
}{
"message": "Service Unavailable",
"statusCode": 503
}Order Book
Get event orderbook snapshot
Get a snapshot of the order book for markets on an event.
GET
/
orderbook-v3
/
snapshot
/
event
Get an event orderbook snapshot
curl --request GET \
--url https://api.sx.bet/orderbook-v3/snapshot/event \
--header 'x-sx-api-key: <api-key>'import requests
url = "https://api.sx.bet/orderbook-v3/snapshot/event"
headers = {"x-sx-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-sx-api-key': '<api-key>'}};
fetch('https://api.sx.bet/orderbook-v3/snapshot/event', 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.sx.bet/orderbook-v3/snapshot/event",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-sx-api-key: <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"
"net/http"
"io"
)
func main() {
url := "https://api.sx.bet/orderbook-v3/snapshot/event"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-sx-api-key", "<api-key>")
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.sx.bet/orderbook-v3/snapshot/event")
.header("x-sx-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sx.bet/orderbook-v3/snapshot/event")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-sx-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"status": "success",
"data": {
"eventId": "L13058397",
"nextKey": "eyJtYXJrZXRIYXNoIjoiMHhiZjA2YzYzNzljOTIyZDgxMTg2MTJkMWQ3NDkzYjIwZjZkZjY5Mjk0MzdmYmY2MDIyOTA0MzI3Zjk1MTZhMmViIn0=",
"markets": [
{
"marketHash": "0xbf06c6379c922d8118612d1d7493b20f6df6929437fbf6022904327f9516a2eb",
"outcomeOne": [
{
"percentageOdds": "50000000000000000000",
"size": "1000000"
}
],
"outcomeTwo": [],
"version": "00100000000000008914000"
}
]
}
}{
"message": [
"eventId must be longer than or equal to 2 characters"
],
"error": "Bad Request",
"statusCode": 400
}{
"message": "BAD_AUTH",
"error": "Unauthorized",
"statusCode": 401
}{
"message": "Service Unavailable",
"statusCode": 503
}GET /orderbook-v3/snapshot/event returns the aggregated book for markets on a single event. It requires an API key.
Use this to re-seed state for the realtime
orderbook_v3_event:{eventId} channel after a
recovered: false publication — page until nextKey is omitted, instead of hitting the
single-market snapshot once per market.Use
showTakerPerspective for display only. percentageOdds is from the perspective of the maker. Read the order
book walks the conversion through.Authorizations
API key, sent as the x-sx-api-key header. Generate one from the API keys section of your account page on sx.bet.
Query Parameters
The event to fetch market books for — the same identifier markets report as sportXeventId.
Cursor from the previous response to continue pagination.
Applied to every market in the response. Return each book from the perspective of someone wanting each outcome, instead of the makers' own: each side's odds are inverted, the sides are swapped, and each size is restated as the taker stake that fully consumes that level. Accepts true/false/1/0, case-insensitively — TRUE and True work. yes, on and an empty value are a 400.
Last modified on August 21, 2026
⌘I