API documentation

Everything you need to make your first request. The API is in early access: endpoint names below are a preview and may change based on feedback.

Overview

oddmind API is a REST API that returns JSON over HTTPS. All endpoints are read-only (GET) and share the same conventions: UTC timestamps in ISO 8601, decimal probabilities from 0 to 1 and normalised team and league IDs.

BASEhttps://api.oddmind.app/v1

Authentication

Send your API key in the Authorization header with every request. Keys are issued to early-access users by email.

cURL/v1/teams/arsenal/form
curl https://api.oddmind.app/v1/teams/arsenal/form?last=5 \
  -H "Authorization: Bearer $ODDMIND_KEY"
JSfetch
const res = await fetch('https://api.oddmind.app/v1/leagues/premier-league/table', {
  headers: { Authorization: `Bearer ${process.env.ODDMIND_KEY}` }
});
const table = await res.json();
Pythonrequests
import os, requests

r = requests.get(
    "https://api.oddmind.app/v1/h2h/liverpool/manchester-city",
    headers={"Authorization": f"Bearer {os.environ['ODDMIND_KEY']}"},
    params={"last": 6},
)
print(r.json()["summary"])

Endpoints

MethodPathDescription
GET/v1/leaguesList of covered leagues with IDs, countries and seasons
GET/v1/leagues/{league}/tableLeague standings with form · details
GET/v1/leagues/{league}/fixturesUpcoming matches of a league
GET/v1/teams/{team}/formRecent form, home/away splits and streaks · details
GET/v1/h2h/{team}/{opponent}Head-to-head meetings and summary · details
GET/v1/matches/{match}/probabilitiesMargin-free probabilities, fair odds, expected goals · details
GET/v1/predictions/archiveSettled predictions with accuracy and calibration

IDs

Leagues, teams and matches use readable, stable IDs: premier-league, manchester-city, ipswich-town-vs-nottingham-forest. Team names are normalised across sources, so one club always has one ID. Get the full list from /v1/leagues.

Rate limits

PlanRequests / dayPrice
Free100$0
Pro10,000$19/month
Business100,000$49/month

Every response includes X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset headers. Responses are cached, so repeating the same request within a minute is cheap for both sides.

Errors

Errors use standard HTTP status codes and a JSON body:

{ "error": { "code": "rate_limited", "message": "Daily limit reached" } }
HTTPCodeMeaning
400invalid_parameterA parameter is missing or has a wrong value
401unauthorizedAPI key is missing or invalid
404not_foundUnknown league, team or match ID
429rate_limitedDaily request limit reached — see Retry-After
5xxserver_errorTemporary problem on our side — retry with backoff

Attribution

Historical results come from football-data.co.uk; every response carries a source field. If you display the data publicly, please keep a visible credit to the source. Probabilities, tables, form summaries and the prediction archive are calculated by oddmind.app.

Early access

Get your API key first

Free plan for small projects. Early-access users get 50% off for the first year.

Request early access