curl --request GET \
--url https://magicmarkets.com/v2/events/ \
--header 'X-Api-Key: <api-key>'import requests
url = "https://magicmarkets.com/v2/events/"
headers = {"X-Api-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-Api-Key': '<api-key>'}};
fetch('https://magicmarkets.com/v2/events/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://magicmarkets.com/v2/events/"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Api-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"status": "ok",
"data": [
{
"event_type": "normal",
"sport": "fb",
"event_id": "2026-06-15,1001,2002",
"competition_id": 1,
"competition_name": "England Premier League",
"competition_country": "XE",
"home": "Arsenal",
"away": "Chelsea",
"event_name": "Arsenal vs. Chelsea",
"ir_status": "pre_event",
"start_time": "2026-06-15T15:00:00Z"
}
]
}List events
Lists the events that currently have prices. Each entry is the object the stream sends as ["event", {...}].
For price-sensitive work, use the streaming API: it pushes each change as it happens.
ir_status keeps the events in running (in_running) or not yet started (pre_event), the same values each event carries.
event_type gives the shape. A normal (match) event has home and away. A multirunner (outright) event has teams and end_time.
Page with limit and after: pass the previous page’s last "{sport},{event_id}" as after. A page shorter than limit is the last one. The response has no total count.
event_id and competition_id filters need sport; a request without it gets a 400. Every entry has its sport, so a follow-up call can always supply it. Paging without filters needs no sport.
A filter that matches no event returns an empty data. This includes a sport, competition or event that has no prices at the moment. Each event_id must have the form an event carries, such as 2026-06-15,1001,2002; any other form gets a 400.
curl --request GET \
--url https://magicmarkets.com/v2/events/ \
--header 'X-Api-Key: <api-key>'import requests
url = "https://magicmarkets.com/v2/events/"
headers = {"X-Api-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-Api-Key': '<api-key>'}};
fetch('https://magicmarkets.com/v2/events/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://magicmarkets.com/v2/events/"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Api-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"status": "ok",
"data": [
{
"event_type": "normal",
"sport": "fb",
"event_id": "2026-06-15,1001,2002",
"competition_id": 1,
"competition_name": "England Premier League",
"competition_country": "XE",
"home": "Arsenal",
"away": "Chelsea",
"event_name": "Arsenal vs. Chelsea",
"ir_status": "pre_event",
"start_time": "2026-06-15T15:00:00Z"
}
]
}Authorizations
API key created from the magic-markets website
Query Parameters
Sport codes to keep. Repeatable, up to 100 values; omit for every sport. Required alongside event_id or competition_id. See "Sports & bet types" in the introduction.
100Competitions to keep. Repeatable, up to 100 values; omit for every competition. Requires sport.
1000 <= x <= 2147483647Events to keep. Repeatable, up to 100 values; omit for every event. Requires sport. Each value is an event's event_id, such as 2026-06-15,1001,2002; any other form gets a 400.
100^\d{4}-\d{2}-\d{2},[^,]+,[^,]+$Language for competition and team names.
en, zh-hans, ko Events per page.
1 <= x <= 5000Cursor - the previous page's last "{sport},{event_id}".
Keep events starting at or after this instant, 1970 or later. An event whose start time is unknown is never inside a window.
Keep events starting before this instant, 1970 or later. The window is half-open, so an event starting exactly at this instant is excluded.
Keep events with this ir_status. Omit for both.
pre_event, in_running 
