Access real-time football statistics, betting odds, and match data through our unified API platform.
Football statistics, league standings, fixtures, player data, and match information from FotMob.
Real-time betting odds, markets, and live match data from Hard Rock Sportsbook.
Prediction markets, event contracts, and real-time pricing from Kalshi exchange.
Select an endpoint from the list to configure and send a request.
Datarium provides a unified API platform for accessing sports data from multiple sources. Our APIs offer real-time football statistics, betting odds, and match information.
FotMob API: /api/fotmob
Hard Rock API: /api/hardrock
Kalshi API: /api/kalshi
All API responses are returned in JSON format with consistent structure:
{
"success": true,
"data": { ... },
"metadata": {
"cache_hit": true,
"cache_age_seconds": 120
}
}
FotMob API requires an API key passed in the header:
X-API-Key: your_api_key_here
Hard Rock Bet API does not require authentication for read operations.
Rate limits are enforced per API key:
| Tier | Requests/Minute | Burst |
|---|---|---|
| Free | 60 | 10 |
| Premium | 300 | 20 |
| Partner | 1000 | 50 |
/api/v1/countries
Get all countries with their leagues. Recommended starting point for discovery.
{
"success": true,
"data": {
"popular_leagues": [
{ "id": 47, "name": "Premier League", "country": "England" }
],
"countries": [
{ "name": "England", "leagues": [...] }
]
}
}
/api/v1/countries/{country_name}
Get all leagues for a specific country.
| Name | Type | Description |
|---|---|---|
| country_namerequired | string | Country name (e.g., "England", "Spain") |
/api/v1/countries/popular/leagues
Get top 20 popular leagues worldwide.
/api/v1/countries/search
Search for countries by name.
| Name | Type | Description |
|---|---|---|
| qrequired | string | Search query |
/api/v1/leagues/all
Get all available leagues.
Cache: 7 days
/api/v1/leagues/{league_id}
Get detailed league information.
| Name | Type | Description |
|---|---|---|
| league_idrequired | integer | League ID (e.g., 47 for Premier League) |
| taboptional | string | Tab to fetch: overview, table, matches, stats, transfers |
| League | ID |
|---|---|
| Premier League | 47 |
| La Liga | 87 |
| Serie A | 55 |
| Bundesliga | 54 |
| Ligue 1 | 53 |
| Champions League | 42 |
/api/v1/leagues/{league_id}/standings
Get league standings/table.
Cache: 30 minutes
{
"data": {
"tables": [{
"table": [{
"name": "Arsenal",
"played": 38,
"wins": 28,
"points": 91
}]
}]
}
}
/api/v1/leagues/{league_id}/fixtures
Get league fixtures/schedule.
Cache: 1 hour
/api/v1/matches/{match_id}
Get complete match details including lineups, statistics, and events.
| Name | Type | Description |
|---|---|---|
| match_idrequired | integer | Match ID |
/sports
Get all available sports (filtered to soccer).
{
"sports": [{
"id": "28",
"code": "SOCCER",
"name": "Soccer",
"numEvents": 1209,
"numEventsInplay": 38
}]
}
/competitions
Get all competitions for a sport.
| Name | Type | Description |
|---|---|---|
| sportoptional | string | Sport code (default: "SOCCER") |
{
"sport": "SOCCER",
"competitions": [{
"id": "8214517063054262534",
"name": "EPL",
"numEvents": 21,
"categoryName": "England",
"playerPropsAvailable": true
}]
}
/competitions/{competition_id}/events
Get all events (matches) for a specific competition.
| Name | Type | Description |
|---|---|---|
| competition_idrequired | string | Competition ID from /competitions endpoint |
| include_outrightsoptional | boolean | Include outright markets (default: false) |
{
"events": [{
"id": "2438727459822895355",
"name": "Arsenal vs Chelsea",
"eventTime": 1760796000000,
"inplay": false,
"numMarkets": 56
}]
}
/ws/events?event_ids={id1,id2,id3}
Subscribe to real-time event data including odds, markets, and live match state.
| Name | Type | Description |
|---|---|---|
| event_idsrequired | string | Comma-separated list of event IDs |
import asyncio
import websockets
import json
async def subscribe():
event_ids = "2438727459822895355"
uri = f"ws://datarium.top:8002/ws/events?event_ids={event_ids}"
async with websockets.connect(uri) as ws:
while True:
message = await ws.recv()
data = json.loads(message)
print(data)
asyncio.run(subscribe())
{
"SubscriptionUpdate": {
"EventId": "2438727459822895355",
"EventUpdates": [{
"name": "Arsenal vs Chelsea",
"markets": [{
"type": "SOCCER:FT:AXB",
"name": "Match Result (FT)",
"selections": [{
"name": "Arsenal",
"odds": 2.50
}]
}],
"simpleMatchState": {
"homeGoals": 0,
"awayGoals": 0,
"period": "NOT_STARTED"
}
}]
}
}
| Type | Description |
|---|---|
SOCCER:FT:AXB | Match Result (Full Time) |
SOCCER:FT:OU | Over/Under Goals |
SOCCER:FT:BTS | Both Teams To Score |
SOCCER:FT:DC | Double Chance |
SOCCER:FT:CS | Correct Score |
SOCCER:FT:HT_AXB | Half Time Result |
Kalshi is a regulated prediction market exchange. Events group related markets together (e.g., "2024 Presidential Election").
/events
Get all events with optional filtering. Returns events with their nested markets.
| Name | Type | Description |
|---|---|---|
| limitoptional | integer | Max results (default: 100, max: 1000) |
| statusoptional | string | Filter by status: open, closed, settled |
| series_tickeroptional | string | Filter by series ticker |
| with_nested_marketsoptional | boolean | Include markets in response |
{
"events": [{
"event_ticker": "PRES-2024",
"title": "2024 Presidential Election",
"category": "Politics",
"markets": [...]
}],
"cursor": "abc123"
}
/events/{event_ticker}
Get a specific event by ticker.
| Name | Type | Description |
|---|---|---|
| event_tickerrequired | string | Event ticker (e.g., "PRES-2024") |
Markets are individual binary contracts within an event. Each market has Yes/No outcomes with prices in cents (0-100).
/markets
Get all markets with optional filtering.
| Name | Type | Description |
|---|---|---|
| limitoptional | integer | Max results (default: 100) |
| event_tickeroptional | string | Filter by event |
| statusoptional | string | open, closed, settled |
{
"markets": [{
"ticker": "PRES-2024-DEM",
"title": "Democratic candidate wins?",
"yes_bid": 52,
"yes_ask": 54,
"no_bid": 46,
"no_ask": 48,
"last_price": 53,
"volume": 125000,
"open_interest": 50000
}]
}
Prices are in cents. A yes_bid of 52 means you can sell Yes at $0.52 per contract. The implied probability is approximately 52%.
/markets/{ticker}
Get a specific market by ticker.
| Name | Type | Description |
|---|---|---|
| tickerrequired | string | Market ticker |
/markets/{ticker}/orderbook
Get the full orderbook for a market showing all resting orders at each price level.
| Name | Type | Description |
|---|---|---|
| tickerrequired | string | Market ticker |
| depthoptional | integer | Number of price levels |
{
"orderbook": {
"yes": [
[52, 1500], // [price, quantity]
[51, 3200]
],
"no": [
[48, 2100],
[47, 1800]
]
}
}
Series group related events together (e.g., all Presidential elections).
/series/{series_ticker}
Get details about a series including all its events.
| Name | Type | Description |
|---|---|---|
| series_tickerrequired | string | Series ticker (e.g., "KXPRES") |
| Series | Description |
|---|---|
KXPRES | Presidential Elections |
KXFED | Federal Reserve Decisions |
KXINFLATION | Inflation Data |
KXECON | Economic Indicators |