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.
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.
Send your API key in the Authorization header with every request. Keys are issued to early-access users by email.
curl https://api.oddmind.app/v1/teams/arsenal/form?last=5 \ -H "Authorization: Bearer $ODDMIND_KEY"
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();
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"])
| Method | Path | Description |
|---|---|---|
| GET | /v1/leagues | List of covered leagues with IDs, countries and seasons |
| GET | /v1/leagues/{league}/table | League standings with form · details |
| GET | /v1/leagues/{league}/fixtures | Upcoming matches of a league |
| GET | /v1/teams/{team}/form | Recent form, home/away splits and streaks · details |
| GET | /v1/h2h/{team}/{opponent} | Head-to-head meetings and summary · details |
| GET | /v1/matches/{match}/probabilities | Margin-free probabilities, fair odds, expected goals · details |
| GET | /v1/predictions/archive | Settled predictions with accuracy and calibration |
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.
| Plan | Requests / day | Price |
|---|---|---|
| Free | 100 | $0 |
| Pro | 10,000 | $19/month |
| Business | 100,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 use standard HTTP status codes and a JSON body:
{ "error": { "code": "rate_limited", "message": "Daily limit reached" } }| HTTP | Code | Meaning |
|---|---|---|
| 400 | invalid_parameter | A parameter is missing or has a wrong value |
| 401 | unauthorized | API key is missing or invalid |
| 404 | not_found | Unknown league, team or match ID |
| 429 | rate_limited | Daily request limit reached — see Retry-After |
| 5xx | server_error | Temporary problem on our side — retry with backoff |
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.
Free plan for small projects. Early-access users get 50% off for the first year.