curl --request GET \
--url https://trade.predexon.com/api/accounts/{accountId}/router/quote \
--header 'x-api-key: <api-key>'import requests
url = "https://trade.predexon.com/api/accounts/{accountId}/router/quote"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://trade.predexon.com/api/accounts/{accountId}/router/quote', 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://trade.predexon.com/api/accounts/{accountId}/router/quote",
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-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://trade.predexon.com/api/accounts/{accountId}/router/quote"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-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://trade.predexon.com/api/accounts/{accountId}/router/quote")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://trade.predexon.com/api/accounts/{accountId}/router/quote")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"predexonId": "px-uvtpjis2k7bj",
"title": "Atlanta Hawks",
"outcome": "atl",
"side": "buy",
"requestedAmount": "10",
"requestedSize": null,
"venues": [
{
"venue": "polymarket",
"hasPosition": false,
"positionSize": null,
"bestPrice": "0.33",
"estimatedFillPrice": "0.331200",
"estimatedFillSize": "18.115000",
"availableLiquidity": "482.500000",
"feeBpsAtTop": 35
},
{
"venue": "predict",
"hasPosition": false,
"positionSize": null,
"bestPrice": "0.34",
"estimatedFillPrice": "0.342000",
"estimatedFillSize": "11.820000",
"availableLiquidity": "64.000000",
"feeBpsAtTop": 30
},
{
"venue": "opinion",
"hasPosition": false,
"positionSize": null,
"bestPrice": "0.35",
"estimatedFillPrice": null,
"estimatedFillSize": null,
"availableLiquidity": "6.000000",
"feeBpsAtTop": 20
}
],
"summary": {
"estimatedAvgPrice": "0.335070",
"estimatedTotalSize": "29.935000",
"fillLikelihood": "high",
"venueBreakdown": [
{
"venue": "polymarket",
"size": "18.115000",
"price": "0.331200"
},
{
"venue": "predict",
"size": "11.820000",
"price": "0.342000"
}
]
}
}Quote
Simulate a cross-venue fill for a predexon_id without placing an order
curl --request GET \
--url https://trade.predexon.com/api/accounts/{accountId}/router/quote \
--header 'x-api-key: <api-key>'import requests
url = "https://trade.predexon.com/api/accounts/{accountId}/router/quote"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://trade.predexon.com/api/accounts/{accountId}/router/quote', 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://trade.predexon.com/api/accounts/{accountId}/router/quote",
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-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://trade.predexon.com/api/accounts/{accountId}/router/quote"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-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://trade.predexon.com/api/accounts/{accountId}/router/quote")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://trade.predexon.com/api/accounts/{accountId}/router/quote")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"predexonId": "px-uvtpjis2k7bj",
"title": "Atlanta Hawks",
"outcome": "atl",
"side": "buy",
"requestedAmount": "10",
"requestedSize": null,
"venues": [
{
"venue": "polymarket",
"hasPosition": false,
"positionSize": null,
"bestPrice": "0.33",
"estimatedFillPrice": "0.331200",
"estimatedFillSize": "18.115000",
"availableLiquidity": "482.500000",
"feeBpsAtTop": 35
},
{
"venue": "predict",
"hasPosition": false,
"positionSize": null,
"bestPrice": "0.34",
"estimatedFillPrice": "0.342000",
"estimatedFillSize": "11.820000",
"availableLiquidity": "64.000000",
"feeBpsAtTop": 30
},
{
"venue": "opinion",
"hasPosition": false,
"positionSize": null,
"bestPrice": "0.35",
"estimatedFillPrice": null,
"estimatedFillSize": null,
"availableLiquidity": "6.000000",
"feeBpsAtTop": 20
}
],
"summary": {
"estimatedAvgPrice": "0.335070",
"estimatedTotalSize": "29.935000",
"fillLikelihood": "high",
"venueBreakdown": [
{
"venue": "polymarket",
"size": "18.115000",
"price": "0.331200"
},
{
"venue": "predict",
"size": "11.820000",
"price": "0.342000"
}
]
}
}Overview
Simulate filling a single logical order across every routed venue that lists the outcome identified bypredexonId. The router expands the supplied canonical predexon_id to every routed venue listing for that outcome, walks merged fee-inclusive order books, and returns the projected fill price, per-venue breakdown, and fill likelihood.
No order is placed. Quote uses the same routing engine as Place Market Order, so a quote taken immediately before an order is a reliable preview of what the order will do.
See the Order Router concept page for an end-to-end walkthrough of how the router decides which venues to route to.
Path Parameters
| Param | Type | Description |
|---|---|---|
accountId | string | Trading account ID. Must belong to the calling API key. See the Trading API accounts docs for how to create and fund one. |
Query Parameters
| Param | Type | Required | Description |
|---|---|---|---|
predexonId | string | Yes | Canonical predexon_id for the outcome. The router expands it to every routed venue listing for that outcome. |
side | string | Yes | buy or sell. |
amount | number | Required on buy | USD/stablecoin notional to spend. Must be finite and > 0. Must not be set on sell. |
size | number | Required on sell | Number of shares to sell. Must be finite and > 0. Must not be set on buy. |
Response Fields
Top level
| Field | Type | Description |
|---|---|---|
predexonId | string | Echoes the request predexonId. |
title | string | Human-readable outcome label. |
outcome | string | Canonical outcome code (e.g. "atl", "draw"). |
side | string | Echoes the request side. |
requestedAmount | string? | Echo of the request amount. Present on buy quotes; null on sell quotes. |
requestedSize | string? | Echo of the request size. Present on sell quotes; null on buy quotes. |
venues[] | array | One entry per actionable venue — venues the router could currently route to. Venues without a live streaming book are excluded from the array. |
summary | object? | Aggregate projected fill. null when no venue could host any portion of the order. |
Venue entry
| Field | Type | Description |
|---|---|---|
venue | string | polymarket, predict, opinion, or limitless. |
hasPosition | boolean | Sell quotes only — true when the account already holds a position on this venue that can be sold. |
positionSize | string? | Size of the existing position on this venue. null when hasPosition is false (or on buy quotes). |
bestPrice | string | Top-of-book price on the relevant side. |
estimatedFillPrice | string? | Projected volume-weighted average fill price on this venue. null when no fill is projected here. |
estimatedFillSize | string? | Projected shares filled on this venue. null when no fill is projected. |
availableLiquidity | string | Sum of depth on the relevant side, expressed in shares. |
feeBpsAtTop | number | Effective venue fee at top of book, in basis points. May be fractional (e.g. 24.6975). Price-aware — the same venue can return different fees at different price levels. |
Summary
| Field | Type | Description |
|---|---|---|
estimatedAvgPrice | string | Projected volume-weighted fill price across all venues. |
estimatedTotalSize | string | Projected total shares filled across all venues. |
fillLikelihood | string | high (liquidity > 2× requested), medium (> 1× and ≤ 2×), or low (≤ 1×). |
venueBreakdown[] | array | One entry per venue expected to receive allocation. |
venueBreakdown[].venue | string | |
venueBreakdown[].size | string | Projected shares on this venue. |
venueBreakdown[].price | string | Projected price on this venue. |
Errors
Every error response includes a machine-readableerrorCode alongside the human-readable error string.
| Status | errorCode | When |
|---|---|---|
400 | parse_error | Missing or invalid predexonId, side, amount, or size. |
404 | predexon_not_routable | No routed venue carries the supplied predexonId. |
503 | registry_unavailable | Routing registry is temporarily unavailable. Retry with exponential back-off. |
Example
GET /api/accounts/acc_8f2e/router/quote?predexonId=px-uvtpjis2k7bj&side=buy&amount=10
{
"predexonId": "px-uvtpjis2k7bj",
"title": "Atlanta Hawks",
"outcome": "atl",
"side": "buy",
"requestedAmount": "10",
"requestedSize": null,
"venues": [
{
"venue": "polymarket",
"hasPosition": false,
"positionSize": null,
"bestPrice": "0.33",
"estimatedFillPrice": "0.331200",
"estimatedFillSize": "18.115000",
"availableLiquidity": "482.500000",
"feeBpsAtTop": 35
},
{
"venue": "predict",
"hasPosition": false,
"positionSize": null,
"bestPrice": "0.34",
"estimatedFillPrice": "0.342000",
"estimatedFillSize": "11.820000",
"availableLiquidity": "64.000000",
"feeBpsAtTop": 30
},
{
"venue": "opinion",
"hasPosition": false,
"positionSize": null,
"bestPrice": "0.35",
"estimatedFillPrice": null,
"estimatedFillSize": null,
"availableLiquidity": "6.000000",
"feeBpsAtTop": 20
}
],
"summary": {
"estimatedAvgPrice": "0.335070",
"estimatedTotalSize": "29.935000",
"fillLikelihood": "high",
"venueBreakdown": [
{ "venue": "polymarket", "size": "18.115000", "price": "0.331200" },
{ "venue": "predict", "size": "11.820000", "price": "0.342000" }
]
}
}
bestPrice but a higher feeBpsAtTop can lose to a nominally worse venue with a thinner fee. feeBpsAtTop is price-aware, so different levels of the same book can surface different basis-point values.venues[] lists only venues the router can actionably route to right now. Venues without a streaming book (infrastructure dropouts) are excluded from the response. The number of entries is therefore the count of routable venues for this outcome, not the size of the cross-venue equivalence set.Authorizations
Trading key provided by Predexon. The data key used by the Sports Discovery API on api.predexon.com is a separate credential.
Path Parameters
Account ID. Must belong to the calling API key.
Query Parameters
Canonical predexon_id for the outcome. The router expands this to every routed venue listing for that canonical outcome.
Order side.
buy, sell USD/stablecoin notional to spend. Required when side=buy. Must not be set when side=sell.
Number of shares to sell. Required when side=sell. Must not be set when side=buy.
Response
Quote simulated successfully.
Echoes the request predexonId.
Human-readable outcome label (e.g. "Atlanta Hawks").
Canonical outcome code (e.g. "atl", "draw").
buy, sell Echo of the amount query parameter (stringified number). Present on buy quotes; null on sell quotes.
Echo of the size query parameter (stringified number). Present on sell quotes; null on buy quotes.
One entry per actionable venue — venues the router cannot currently route to (no book, or a disconnected feed) are excluded from the array entirely.
Show child attributes
Show child attributes
Aggregate projected fill. null when no venue could host any portion of the order.
Show child attributes
Show child attributes
