Player Prop Odds API Guide for Australian Sports
How player markets are keyed, how each player is named, and how to ask for them.
Player markets are where Australian bookmakers differ most: anytime try scorer, disposals, tackles, run metres. SockOdds API v1 keys them all the same way, so one piece of code reads a try scorer market in rugby league and a disposals line in Australian football.
The market key
Every player market key starts with player_, then the stat, then the bet:
player_tries_anytime: the player scores at least one try. One side,yes.player_tries_firstandplayer_tries_last: first or last try scorer. Each outcome is a player.player_tries_over_under: a line on the player's tries, withoverandundersides.player_tackles_over_underandplayer_run_metres_over_under: lines on other rugby league stats.
The pattern is player_<stat>_<bet>. Game markets have no prefix and team markets start with team_. Markets explains the whole scheme.
Which player markets a league offers
GET /v1/markets?league=rlwc returns the markets the catalogue offers in that league's sport. Each market has a subject of event, team or player, so filtering on subject gives the player markets. This program follows links.next until the list ends:
let url = "https://api.sockodds.com/v1/markets?league=rlwc&limit=100";
while (url) {
const response = await fetch(url, {
headers: { Authorization: `Bearer ${process.env.SOCKODDS_API_KEY}` },
});
const body = await response.json();
for (const market of body.data) {
if (market.subject === "player") console.log(`${market.key}: ${market.name}`);
}
url = body.links.next;
}import json, os, urllib.request
url = "https://api.sockodds.com/v1/markets?league=rlwc&limit=100"
while url:
request = urllib.request.Request(url, headers={"Authorization": "Bearer " + os.environ["SOCKODDS_API_KEY"]})
with urllib.request.urlopen(request) as response:
body = json.load(response)
for market in body["data"]:
if market["subject"] == "player":
print(f"{market['key']}: {market['name']}")
url = body["links"]["next"]Output from a local copy of the API with invented test prices
player_tries_anytime: Anytime try scorer
player_tries_first: First try scorer
player_tries_last: Last try scorer
player_tries_over_under: Player tries over/under
player_tackles_over_under: Player tackles over/under
player_run_metres_over_under: Player run metres over/underThe catalogue says which markets can exist. Which ones are priced on a given game depends on the bookmakers, so read the odds response rather than assuming a market is there.
Who the market is about
In an odds response, a player market names its player in subject, as { "id": "pl_...", "name": "..." }. Team markets carry the team's key and name there, and game markets carry null. On first and last scorer markets, where each outcome is a player, the outcome's side is that player's id.
The pl_ id is the same whichever bookmaker priced the market, so it is the field to join on. GET /v1/players lists players by league and team:
curl -sS "https://api.sockodds.com/v1/players?league=rlwc&team=australia_rugby_league&limit=2" \
-H "Authorization: Bearer $SOCKODDS_API_KEY"const response = await fetch("https://api.sockodds.com/v1/players?league=rlwc&team=australia_rugby_league&limit=2", {
headers: { Authorization: `Bearer ${process.env.SOCKODDS_API_KEY}` },
});
console.log(JSON.stringify(await response.json(), null, 2));import json, os, urllib.request
request = urllib.request.Request(
"https://api.sockodds.com/v1/players?league=rlwc&team=australia_rugby_league&limit=2",
headers={"Authorization": "Bearer " + os.environ["SOCKODDS_API_KEY"]},
)
with urllib.request.urlopen(request) as response:
print(json.dumps(json.load(response), indent=2))Response from a local copy of the API with invented test prices
{
"data": [
{
"id": "pl_000ckk0qrcd5",
"name": "Blayke Brailey",
"sport": "rugby_league",
"team": {
"key": "australia_rugby_league",
"name": "Australia"
}
},
{
"id": "pl_000ckk0v7atp",
"name": "Bradman Best",
"sport": "rugby_league",
"team": {
"key": "australia_rugby_league",
"name": "Australia"
}
}
],
"meta": {
"count": 2,
"cursor": null
},
"links": {
"next": null
}
}"N or more" bets
Bookmakers often sell milestones: two or more tries, 25 or more disposals. v1 has no separate milestone market. An "N or more" bet is the over side of the matching _over_under market at a line of N minus 0.5. Two or more tries is player_tries_over_under, side over, line 1.5. 25 or more disposals is player_disposals_over_under, side over, line 24.5.
That means one bookmaker's milestone and another's over/under line on the same player land on the same market and outcome, so you can compare them directly.
Asking for player prices
Name the market keys you want with markets= on GET /v1/odds or GET /v1/events/{event_id}/odds, up to 20 at a time, and add bookmakers= to keep the response small. A player market that no bookmaker is pricing is simply absent: that is never evidence the player cannot score.
Player markets settle from official results through GET /v1/results, with a verdict on each outcome. An outcome that official evidence cannot settle is left out, never guessed. See results and the player props API page for the markets by sport.