How to Query AFL Odds and Player Props
The requests that get AFL and AFLW prices into your code, and the filters that keep them small.
This guide walks through the requests you need for AFL prices in SockOdds API v1: the next games with their prices, one game in full, and player markets. Everything here works the same way for the AFL (league=afl) and the AFL Women's (league=aflw): both are Australian football and share one market catalogue. The examples use the AFLW, so they show prices outside the AFL season; swap the league key for the AFL in season. The AFL is on the free Developer plan, and the AFLW needs Rookie or Pro.
Every request sends your key in the Authorization: Bearer header. Keep the key on your server and read it from an environment variable, as every sample here does (authentication).
The next games and their prices
GET /v1/odds with a league returns that league's games, each with the prices of every bookmaker your plan includes, grouped by market. starts_after set to now starts the list at the next game rather than two days ago, and markets= keeps it to the markets you show:
curl -sS "https://api.sockodds.com/v1/odds?league=aflw&markets=winner&limit=1&starts_after=$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
-H "Authorization: Bearer $SOCKODDS_API_KEY"const response = await fetch(`https://api.sockodds.com/v1/odds?league=aflw&markets=winner&limit=1&starts_after=${new Date().toISOString().slice(0, 19)}Z`, {
headers: { Authorization: `Bearer ${process.env.SOCKODDS_API_KEY}` },
});
console.log(JSON.stringify(await response.json(), null, 2));import json, os, urllib.request
from datetime import datetime, timezone
request = urllib.request.Request(
f"https://api.sockodds.com/v1/odds?league=aflw&markets=winner&limit=1&starts_after={datetime.now(timezone.utc):%Y-%m-%dT%H:%M:%SZ}",
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": "ev_000ckk0f7k5n",
"name": "Adelaide Crows v Brisbane Lions",
"league": {
"key": "aflw",
"name": "AFL Women's"
},
"scheduled_start": "2026-10-16T08:00:00.000Z",
"status": "scheduled",
"participants": [
{
"role": "away",
"identity": {
"key": "brisbane_lions_women",
"name": "Brisbane Lions"
}
},
{
"role": "home",
"identity": {
"key": "adelaide_crows_women",
"name": "Adelaide Crows"
}
}
],
"markets": [
{
"id": "mk_w5x85hf2bz3c1aa9",
"key": "winner",
"name": "Winner",
"period": "full",
"subject": null,
"alternate": false,
"outcomes": [
{
"id": "oc_d1bt3t69ppdhkrnf",
"name": "Adelaide Crows",
"side": "home",
"line": null,
"prices": [
{
"bookmaker": "mintbet",
"decimal_odds": 1.77,
"implied_probability": 0.564972,
"available": true,
"observed_at": "2026-10-15T07:58:00.000Z"
},
{
"bookmaker": "cashcage",
"decimal_odds": 1.72,
"implied_probability": 0.581395,
"available": true,
"observed_at": "2026-10-15T07:58:00.000Z"
},
{
"bookmaker": "topbet",
"decimal_odds": 1.69,
"implied_probability": 0.591716,
"available": true,
"observed_at": "2026-10-15T07:58:00.000Z"
}
]
},
{
"id": "oc_zp31e95ffj4cjwwt",
"name": "Brisbane Lions",
"side": "away",
"line": null,
"prices": [
{
"bookmaker": "mintbet",
"decimal_odds": 2.18,
"implied_probability": 0.458716,
"available": true,
"observed_at": "2026-10-15T07:58:00.000Z"
},
{
"bookmaker": "cashcage",
"decimal_odds": 2.12,
"implied_probability": 0.471698,
"available": true,
"observed_at": "2026-10-15T07:58:00.000Z"
},
{
"bookmaker": "topbet",
"decimal_odds": 2.08,
"implied_probability": 0.480769,
"available": true,
"observed_at": "2026-10-15T07:58:00.000Z"
}
]
}
]
}
]
}
],
"meta": {
"count": 1,
"cursor": null
},
"links": {
"next": null
}
}The prices shown come from a local copy of the API with invented numbers. Each outcome lists one price per bookmaker, best first, and each price carries the bookmaker's key, decimal_odds exactly as the bookmaker showed it and observed_at, the moment we saw that price. A price we have not seen again for ten minutes is left out rather than shown as current.
For a whole round, raise limit (up to 100) or follow links.next page by page (pagination).
One game, every market
When you already have the event id, GET /v1/events/{event_id}/odds returns that game alone. Without markets= it returns every market each bookmaker quotes, which is the call for a game page:
GET /v1/events/{event_id}/odds
GET /v1/events/{event_id}/odds?markets=winner,handicap,total_points&bookmakers=sportsbet,tab
The second form is the one to use on a summary card: three markets at two bookmakers is a fraction of the objects the full game costs.
Player markets
AFL player markets are ordinary market types with a player as their subject. The keys follow one pattern:
| You want | Market key | Sides |
|---|---|---|
| Anytime goal kicker | player_goals_anytime | yes |
| First goal kicker | player_goals_first | One outcome per player |
| Last goal kicker | player_goals_last | One outcome per player |
| Goals over/under | player_goals_over_under | over, under |
| Disposals over/under | player_disposals_over_under | over, under |
| Kicks, handballs, marks, hitouts, tackles | player_kicks_over_under and so on | over, under |
Ask for one or more of them with markets=, on one game or a round:
GET /v1/odds?league=afl&markets=player_disposals_over_under,player_goals_anytime
On a single-player market, such as disposals or anytime goal kicker, the market's subject holds the player's id (pl_ and twelve characters) and name. On first and last goal kicker, each outcome is a player, and its side is that player's id. The same player keeps the same id across bookmakers and games, so one player's disposals line comes back as one market with every bookmaker's prices under its outcomes, and you can follow a player across the season by the player id. "N or more" markets, such as 20 or more disposals, arrive as over/under lines: the over at 19.5 is 20 or more. Player props has the details.
Alternate lines are left out unless you add alternates=true. Add it only if you show them: every extra line is another market, and every bookmaker price on it counts towards your monthly objects.
A few habits that pay off
- Read the catalogue once.
GET /v1/markets?league=afllists every market type with its sides and periods. It changes rarely, so cache it. The full list is in every AFL betting market. - Store ids, not names. Keep the event id with anything you save, and the outcome id with a bet: results use the same outcome ids.
- Check the period. A market on
quarter_1is a different bet from the same type onfull. - Handle gaps. Not every bookmaker prices every market every week, and out of season the AFL has no prices at all. Treat a missing price as "no current price", never as zero.
The AFL is on the free Developer plan, which reads Sportsbet, TAB and Ladbrokes at 10 requests a minute. The AFLW is on Rookie and Pro. See pricing.
Next
- Every AFL betting market
- AFL league page and AFLW league page
- Reading prices
- Postman collection for trying the requests without code
SockOdds provides data only. It does not offer tips or predictions on any game.