curl --request POST \
--url https://softmax.com/api/observatory/v2/divisions/{division_id}/tournament-sim \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{}'import requests
url = "https://softmax.com/api/observatory/v2/divisions/{division_id}/tournament-sim"
payload = {}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({})
};
fetch('https://softmax.com/api/observatory/v2/divisions/{division_id}/tournament-sim', 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://softmax.com/api/observatory/v2/divisions/{division_id}/tournament-sim",
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([
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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://softmax.com/api/observatory/v2/divisions/{division_id}/tournament-sim"
payload := strings.NewReader("{}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://softmax.com/api/observatory/v2/divisions/{division_id}/tournament-sim")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{}")
.asString();require 'uri'
require 'net/http'
url = URI("https://softmax.com/api/observatory/v2/divisions/{division_id}/tournament-sim")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{}"
response = http.request(request)
puts response.read_body{
"division_id": "<string>",
"league_id": "<string>",
"matrix": {},
"roster": [
{}
],
"note_prefix": "",
"missing_data_pairs": [],
"data_requests": [],
"access": {},
"coworld_versions": [],
"win_model": {},
"config": {},
"showcase": {},
"monte_carlo": {},
"sufficiency": {}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Run tournament simulation
Simulate tournament placements from a division’s recorded pairwise results.
curl --request POST \
--url https://softmax.com/api/observatory/v2/divisions/{division_id}/tournament-sim \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{}'import requests
url = "https://softmax.com/api/observatory/v2/divisions/{division_id}/tournament-sim"
payload = {}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({})
};
fetch('https://softmax.com/api/observatory/v2/divisions/{division_id}/tournament-sim', 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://softmax.com/api/observatory/v2/divisions/{division_id}/tournament-sim",
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([
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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://softmax.com/api/observatory/v2/divisions/{division_id}/tournament-sim"
payload := strings.NewReader("{}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://softmax.com/api/observatory/v2/divisions/{division_id}/tournament-sim")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{}")
.asString();require 'uri'
require 'net/http'
url = URI("https://softmax.com/api/observatory/v2/divisions/{division_id}/tournament-sim")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{}"
response = http.request(request)
puts response.read_body{
"division_id": "<string>",
"league_id": "<string>",
"matrix": {},
"roster": [
{}
],
"note_prefix": "",
"missing_data_pairs": [],
"data_requests": [],
"access": {},
"coworld_versions": [],
"win_model": {},
"config": {},
"showcase": {},
"monte_carlo": {},
"sufficiency": {}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Authorizations
Bearer token issued by Softmax
Path Parameters
Division whose recorded results should be simulated.
^div_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$Body
Tournament structure to simulate.
single_elim, double_elim, round_robin, elimination_rounds, evolutionary Recent completed rounds used when no explicit time window is set.
1 <= x <= 200Earliest round creation time to include. Overrides rounds_window and retains at most 200 rounds.
Latest round creation time to include.
Oldest Coworld version to include; latest selects the newest version and null removes the bound.
Newest Coworld version to include; latest selects the newest version in the window.
Monte Carlo tournament runs to sample.
1 <= x <= 2000Random seed for deterministic simulation results.
Odd number of games in each matchup series.
1 <= x <= 15How entrants are assigned bracket seeds.
record, random How recorded mutual-loss outcomes are resolved.
coinflip, redraw, loss_both Additive smoothing applied to pairwise win rates.
0 <= x <= 10Round-robin passes over every entrant pairing.
1 <= x <= 20Lowest-ranked entrants removed after each elimination round.
1 <= x <= 8Play a reset final when the losers-bracket winner wins the first grand final.
Population size for evolutionary tournaments.
2 <= x <= 500Generations run for evolutionary tournaments.
1 <= x <= 500Roster selection rule when policy_version_ids is omitted.
window, champions, top_n, top_percent Entrants selected by top_n roster mode.
2 <= x <= 32Percent of entrants selected by top_percent roster mode.
x <= 100Return the roster and win model without running simulations.
Estimate whether the recorded pairwise data is sufficient for stable placements.
Posterior win-model samples for sufficiency analysis.
1 <= x <= 100Tournament runs evaluated for each sufficiency sample.
10 <= x <= 500Explicit policy-version roster; takes precedence over roster_mode.
Policy versions removed after roster selection.
Exclude later submissions and resolve each player's champion as of this time.
Response
Successful Response
Division whose recorded results were simulated.
League containing the division.
Pairwise result counts and estimated win rates.
Policies selected for the simulation with their window records.
Prefix used to identify data requests scheduled for this simulator.
Roster policy pairs with no recorded result in the selected window.
Existing experience requests scheduled to fill simulator data gaps.
Caller access and league visibility details.
Recent Coworld versions available for scheduling more episodes.
Smoothed pairwise probabilities used by the simulator.
Normalized tournament configuration used for this run.
One deterministic example tournament run.
Placement distributions across sampled runs.
Stability analysis for the recorded pairwise data.