List bookmakers
using System.Net.Http.Headers;var client = new HttpClient();var request = new HttpRequestMessage{ Method = HttpMethod.Get, RequestUri = new Uri("https://oddslink.app/v1/bookmakers"), Headers = { { "X-API-Key", "<X-API-Key>" }, },};using (var response = await client.SendAsync(request)){ response.EnsureSuccessStatusCode(); var body = await response.Content.ReadAsStringAsync(); Console.WriteLine(body);}package main
import ( "fmt" "net/http" "io")
func main() {
url := "https://oddslink.app/v1/bookmakers"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<X-API-Key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close() body, _ := io.ReadAll(res.Body)
fmt.Println(res) fmt.Println(string(body))
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder() .url("https://oddslink.app/v1/bookmakers") .get() .addHeader("X-API-Key", "<X-API-Key>") .build();
Response response = client.newCall(request).execute();const url = 'https://oddslink.app/v1/bookmakers';const options = {method: 'GET', headers: {'X-API-Key': '<X-API-Key>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url https://oddslink.app/v1/bookmakers \ --header 'X-API-Key: <X-API-Key>'Every book we cover: its key, its display title, its kind (sportsbook, exchange or prediction market), the sports it has been seen pricing, whether it has a player-props integration, and what a size from it means. A retired book, or one we no longer serve, does not appear here.
Authorizations
Section titled “Authorizations”Responses
Section titled “ Responses ”Every book we carry.
object
sportsbook, exchange or prediction_market today. More kinds may be added.
Sport keys we have observed this book pricing, at the coarse group level (nfl, soccer, tennis, …) rather than a per-league breakdown for soccer. This is what we have measured, not a schedule: a sport currently out of season can be missing here even though the book carries it, until it is observed pricing that sport again. Its absence is not a claim the book will never carry it.
Whether this book has a player-props integration at all, not in every sport.
Source-verified sport groups supported by this integration when known. Omitted where a sport-specific capability has not been verified. BetUS supports MLB/NHL, Circa MLB, SBOBET NBA/WNBA, SportBet NBA/WNBA, and Shuffle NFL/NCAAF/MLB/NHL/NBA/WNBA. Omission is not an empty capability list. For bet365 this is nfl and nhl. NFL coverage currently includes full-game N+ passing, rushing and receiving ladders plus first, last, anytime and multiple-touchdown selections. It does not promise Under, period or in-play props. Availability still depends on the fixture and current source prices.
What a size from this book means, matching outcomes[].size.kind (see Size below). null when this book has never been seen publishing a size.
Examples
A sportsbook and a prediction market
[ { "key": "draftkings", "title": "DraftKings", "kind": "sportsbook", "sports": [ "mlb", "mma", "nba", "ncaab", "ncaaf", "nfl", "nhl", "soccer", "tennis", "wnba" ], "has_player_props": true, "size_kind": null }, { "key": "kalshi", "title": "Kalshi", "kind": "prediction_market", "sports": [ "mlb", "mma", "nba", "ncaab", "ncaaf", "nfl", "nhl", "soccer", "tennis", "wnba" ], "has_player_props": true, "size_kind": "resting_depth" }]Headers
Section titled “Headers”Requests used this billing period.
Requests remaining this billing period.
What this one call cost against the allowance (0 for a free call).
This plan’s speed limit, in requests per second.
Requests left in the current one-second window.
Seconds until the speed-limit window resets.
This request’s id, for support and for matching against error.request_id.
A parameter was malformed.
object
object
Stored Unix-second choices on AMBIGUOUS_EVENT or INVALID_STORED_COMMENCE_TIME; independent of dateFormat.
Valid case-sensitive book keys on INVALID_BOOKMAKER.
403 only: the plan on the presented key.
403 only: the lowest plan that includes this request. For history, that depends on how long ago the fixture started as well as on the endpoint.
Example
{ "error": { "code": "BAD_REQUEST", "message": "commenceTimeFrom is not a valid ISO-8601 timestamp.", "docs_url": "https://oddslink.app/docs/errors/#bad-request", "request_id": "req_01hz8k3z9e2v6w1x" }}Headers
Section titled “Headers”Requests used this billing period.
Requests remaining this billing period.
What this one call cost against the allowance (0 for a free call).
This plan’s speed limit, in requests per second.
Requests left in the current one-second window.
Seconds until the speed-limit window resets.
This request’s id, for support and for matching against error.request_id.
The X-API-Key header is missing or invalid.
object
object
Stored Unix-second choices on AMBIGUOUS_EVENT or INVALID_STORED_COMMENCE_TIME; independent of dateFormat.
Valid case-sensitive book keys on INVALID_BOOKMAKER.
403 only: the plan on the presented key.
403 only: the lowest plan that includes this request. For history, that depends on how long ago the fixture started as well as on the endpoint.
Examples
No X-API-Key header sent
{ "error": { "code": "MISSING_KEY", "message": "X-API-Key header is missing.", "docs_url": "https://oddslink.app/docs/errors/#missing-key", "request_id": "req_01hz8k4a1f3w7x2y" }}Key does not exist or was revoked
{ "error": { "code": "INVALID_KEY", "message": "API key is not valid.", "docs_url": "https://oddslink.app/docs/errors/#invalid-key", "request_id": "req_01hz8k4b2g4x8y3z" }}Headers
Section titled “Headers”Requests used this billing period.
Requests remaining this billing period.
What this one call cost against the allowance (0 for a free call).
This plan’s speed limit, in requests per second.
Requests left in the current one-second window.
Seconds until the speed-limit window resets.
This request’s id, for support and for matching against error.request_id.
The plan’s speed limit was exceeded; wait Retry-After seconds. A call that does not count against the allowance is never refused for a spent allowance.
object
object
Stored Unix-second choices on AMBIGUOUS_EVENT or INVALID_STORED_COMMENCE_TIME; independent of dateFormat.
Valid case-sensitive book keys on INVALID_BOOKMAKER.
403 only: the plan on the presented key.
403 only: the lowest plan that includes this request. For history, that depends on how long ago the fixture started as well as on the endpoint.
Example
{ "error": { "code": "SPEED_LIMIT", "message": "Speed limit exceeded: 10 requests/second on the Growth plan.", "docs_url": "https://oddslink.app/docs/errors/#speed-limit", "request_id": "req_01hz8k4f7m9c3d8f" }}Headers
Section titled “Headers”Requests used this billing period.
Requests remaining this billing period.
What this one call cost against the allowance (0 for a free call).
This plan’s speed limit, in requests per second.
Requests left in the current one-second window.
Seconds until the speed-limit window resets.
This request’s id, for support and for matching against error.request_id.
Seconds to wait before retrying on 429 SPEED_LIMIT or 503 ODDS_UNAVAILABLE.
Something failed on our side.
object
object
Stored Unix-second choices on AMBIGUOUS_EVENT or INVALID_STORED_COMMENCE_TIME; independent of dateFormat.
Valid case-sensitive book keys on INVALID_BOOKMAKER.
403 only: the plan on the presented key.
403 only: the lowest plan that includes this request. For history, that depends on how long ago the fixture started as well as on the endpoint.
Example
{ "error": { "code": "INTERNAL_ERROR", "message": "Something went wrong on our side. It has been logged.", "docs_url": "https://oddslink.app/docs/errors/#internal-error", "request_id": "req_01hz8k4h8n0d4e9f" }}Headers
Section titled “Headers”Requests used this billing period.
Requests remaining this billing period.
What this one call cost against the allowance (0 for a free call).
This plan’s speed limit, in requests per second.
Requests left in the current one-second window.
Seconds until the speed-limit window resets.
This request’s id, for support and for matching against error.request_id.