curl --request GET \
--url https://core.api.dev.predictstreet.sde.adifoundation.ai/api/eventsimport requests
url = "https://core.api.dev.predictstreet.sde.adifoundation.ai/api/events"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://core.api.dev.predictstreet.sde.adifoundation.ai/api/events', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://core.api.dev.predictstreet.sde.adifoundation.ai/api/events",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://core.api.dev.predictstreet.sde.adifoundation.ai/api/events"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://core.api.dev.predictstreet.sde.adifoundation.ai/api/events")
.asString();require 'uri'
require 'net/http'
url = URI("https://core.api.dev.predictstreet.sde.adifoundation.ai/api/events")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"events": [
{
"id": "fa3450ad-11c0-4fb0-9a8b-c8d3bd8d4657",
"slug": "lithuania-vs-andorra",
"title": "Lithuania vs Andorra",
"metaTitle": null,
"imageUrl": "https://adipsadminreportsprod.blob.core.windows.net/images/fc5fe0c43bedb40a861a1fac96a38bd2fd42bdf6d0e242bc853cb5a45d4c3a05.png",
"homeCountry": null,
"awayCountry": null,
"sport": "soccer",
"vertical": "football",
"match": {
"id": "bed88311-cf1c-4dc6-b26c-a59e61e76148",
"slug": "friendlies-lit-and-2026-09-30",
"title": "Lithuania vs Andorra",
"group": null,
"stage": null,
"competition": {
"name": "Friendlies",
"slug": "friendlies",
"logo": "https://media.api-sports.io/football/leagues/10.png"
},
"teamA": {
"code": "LIT",
"label": "Lithuania",
"logo": "https://media.api-sports.io/football/teams/1097.png"
},
"teamB": {
"code": "AND",
"label": "Andorra",
"logo": "https://media.api-sports.io/football/teams/1110.png"
},
"kickoffAt": "2026-09-30T16:00:00.000Z",
"state": "LIVE"
},
"teamA": {
"code": "LIT",
"label": "Lithuania",
"logo": "https://media.api-sports.io/football/teams/1097.png"
},
"teamB": {
"code": "AND",
"label": "Andorra",
"logo": "https://media.api-sports.io/football/teams/1110.png"
},
"competition": {
"name": "Friendlies",
"slug": "friendlies",
"logo": "https://media.api-sports.io/football/leagues/10.png"
},
"tags": [
{
"slug": "football",
"name": "Football"
}
],
"scheduledAt": "2026-09-30T16:00:00.000Z",
"endedAt": null,
"scheduleStatus": "SCHEDULED",
"scheduleReason": null,
"settlesByAt": null,
"volume24h": "578.207202",
"totalVolume": "1084.507287",
"openMarketCount": 2,
"totalMarketCount": 2,
"createdAt": "2026-09-28T16:01:45.598Z",
"updatedAt": "2026-09-28T16:01:45.598Z",
"saved": false,
"markets": [
{
"id": "d8e3455a-4718-42ab-835b-140d3d19fc90",
"eventId": "fa3450ad-11c0-4fb0-9a8b-c8d3bd8d4657",
"symbol": "FRIENDLI-LIT-AND-MW-20260930-LIT",
"slug": "friendli-lithuania-andorra-2026-09-30-lit",
"title": "Lithuania vs Andorra",
"question": "Will Lithuania win on 2026-09-30?",
"groupItemTitle": "Lithuania",
"groupItemSubtitle": null,
"groupItemImageUrl": "https://media.api-sports.io/football/teams/1097.png",
"conditionId": "0x8dd569f481e59fc09ab4a8505ba47f2274be0e46fe3634782293736078bdedf1",
"questionId": "0xf1a3d10c822dafc3ef0ed87f414d53ae5de05257ee5dcd93772be9a5bed3e6ac",
"yesTokenId": "80165004934803191397580503835090157935937355906282867775303972121044178093586",
"noTokenId": "63450570942061807146633736252282598892118593663088571046836796600062060112037",
"outcomes": [
{
"label": "YES",
"tokenId": "80165004934803191397580503835090157935937355906282867775303972121044178093586",
"noTokenId": null,
"conditionId": "0x8dd569f481e59fc09ab4a8505ba47f2274be0e46fe3634782293736078bdedf1",
"outcomeIndex": 0
},
{
"label": "NO",
"tokenId": "63450570942061807146633736252282598892118593663088571046836796600062060112037",
"noTokenId": null,
"conditionId": "0x8dd569f481e59fc09ab4a8505ba47f2274be0e46fe3634782293736078bdedf1",
"outcomeIndex": 1
}
],
"sourceSelections": [
{
"outcomeLabel": "YES",
"outcomeIndex": 0,
"providerOutcomeId": "MATCH_WINNER:side=home",
"providerOutcomeName": null,
"marketType": "MATCH_WINNER",
"selector": {
"side": "home"
}
}
],
"line": null,
"lineGroup": null,
"outcomeCount": 2,
"outcomeLabels": [
"YES",
"NO"
],
"outcomePrices": [
"0.610000",
"0.420000"
],
"chances": [
"0.595000",
"0.405000"
],
"status": "OPEN",
"currentReviewRound": 1,
"feeTakerBps": 600,
"executionDelayMs": 0,
"liveTick": null,
"kickoff": "2026-09-30T16:00:00.000Z",
"tradingWindow": {
"preMarketStartsAt": "2026-09-28T17:03:53.885Z",
"opensAt": "2026-09-28T18:04:02.599Z",
"closesAt": "2026-10-01T16:00:00.000Z"
},
"resolutionWindowHours": 2,
"payoutNumerators": null,
"officialDataSource": "lsports",
"sourceMatchId": "19742064",
"additionalSources": [],
"cryptoWindow": null,
"negRiskEligible": true,
"negRiskMarketId": "0xf1a3d10c822dafc3ef0ed87f414d53ae5de05257ee5dcd93772be9a5bed3e6ac",
"negRiskQuestionIndex": 0,
"isNewMarketType": false,
"marketType": "MATCH_WINNER",
"vertical": "football",
"volume24h": "8.196721000000000000",
"totalVolume": "123.058138000000000000",
"createdAt": "2026-09-28T16:01:46.456Z",
"updatedAt": "2026-09-28T18:04:02.600Z",
"lifecycle": {
"closedAt": null,
"pausedAt": null,
"resolvedAt": null,
"voidedAt": null
},
"resolution": {
"proposedAt": null,
"challengeWindowClosesAt": null,
"disputedAt": null,
"proposedOutcome": null,
"proposedOutcomeIndex": null,
"resolvedOutcome": null,
"resolvedOutcomeIndex": null,
"disputeBondUsdcRaw": null,
"disputeReason": null,
"resolutionKind": null,
"proposalKind": null,
"proposedFairPriceSplit": null
},
"crypto": null,
"prediction": null,
"live": null,
"tradable": true,
"probabilityChange": {
"window": "24h",
"unit": "percentage_points",
"outcomes": [
{
"outcomeIndex": 0,
"change": 4
},
{
"outcomeIndex": 1,
"change": -4
}
]
}
},
{
"id": "550128de-4e6c-433e-9641-72f7a4c5d7e4",
"eventId": "fa3450ad-11c0-4fb0-9a8b-c8d3bd8d4657",
"symbol": "FRIENDLI-LIT-AND-BTTS-20260930",
"slug": "friendli-lithuania-andorra-2026-09-30-both-teams-to-score",
"title": "Lithuania vs Andorra — Both Teams to Score",
"question": "Will both teams score in Lithuania vs Andorra?",
"groupItemTitle": null,
"groupItemSubtitle": null,
"groupItemImageUrl": null,
"conditionId": "0xb0b2b5fdaad588309da08a368e6c5c319188f0bd161350795758aa8c77ca32bc",
"questionId": "0x92a85bd967a771422d57e3172450ed68b0aaacce54a830629e296f0931765a71",
"yesTokenId": "102750190754240673859096217792928774056694746741774827251607970731692223476919",
"noTokenId": "22614115426494688294622613649990986606187822224268502860311292172902483170394",
"outcomes": [
{
"label": "Yes",
"tokenId": "102750190754240673859096217792928774056694746741774827251607970731692223476919",
"noTokenId": null,
"conditionId": "0xb0b2b5fdaad588309da08a368e6c5c319188f0bd161350795758aa8c77ca32bc",
"outcomeIndex": 0
},
{
"label": "No",
"tokenId": "22614115426494688294622613649990986606187822224268502860311292172902483170394",
"noTokenId": null,
"conditionId": "0xb0b2b5fdaad588309da08a368e6c5c319188f0bd161350795758aa8c77ca32bc",
"outcomeIndex": 1
}
],
"sourceSelections": [
{
"outcomeLabel": "NO",
"outcomeIndex": 1,
"providerOutcomeId": "BTTS:yes=false",
"providerOutcomeName": null,
"marketType": "BTTS",
"selector": {
"yes": false
}
},
{
"outcomeLabel": "YES",
"outcomeIndex": 0,
"providerOutcomeId": "BTTS:yes=true",
"providerOutcomeName": null,
"marketType": "BTTS",
"selector": {
"yes": true
}
}
],
"line": null,
"lineGroup": null,
"outcomeCount": 2,
"outcomeLabels": [
"YES",
"NO"
],
"outcomePrices": [
"0.170000",
"0.850000"
],
"chances": [
"0.160000",
"0.840000"
],
"status": "OPEN",
"currentReviewRound": 1,
"feeTakerBps": 600,
"executionDelayMs": 0,
"liveTick": null,
"kickoff": "2026-09-30T16:00:00.000Z",
"tradingWindow": {
"preMarketStartsAt": "2026-09-28T17:03:44.542Z",
"opensAt": "2026-09-28T18:04:02.749Z",
"closesAt": "2026-10-01T16:00:00.000Z"
},
"resolutionWindowHours": 2,
"payoutNumerators": null,
"officialDataSource": "lsports",
"sourceMatchId": "19742064",
"additionalSources": [],
"cryptoWindow": null,
"negRiskEligible": false,
"negRiskMarketId": null,
"negRiskQuestionIndex": null,
"isNewMarketType": false,
"marketType": "BTTS",
"vertical": "football",
"volume24h": "396.652780000000000000",
"totalVolume": "396.652780000000000000",
"createdAt": "2026-09-28T16:01:47.379Z",
"updatedAt": "2026-09-28T18:04:02.750Z",
"lifecycle": {
"closedAt": null,
"pausedAt": null,
"resolvedAt": null,
"voidedAt": null
},
"resolution": {
"proposedAt": null,
"challengeWindowClosesAt": null,
"disputedAt": null,
"proposedOutcome": null,
"proposedOutcomeIndex": null,
"resolvedOutcome": null,
"resolvedOutcomeIndex": null,
"disputeBondUsdcRaw": null,
"disputeReason": null,
"resolutionKind": null,
"proposalKind": null,
"proposedFairPriceSplit": null
},
"crypto": null,
"prediction": null,
"live": null,
"tradable": true,
"probabilityChange": {
"window": "24h",
"unit": "percentage_points",
"outcomes": [
{
"outcomeIndex": 0,
"change": -34
},
{
"outcomeIndex": 1,
"change": 34
}
]
}
}
],
"category": {
"key": "GAME_LINES",
"label": "Game Lines"
},
"live": null,
"inPlay": false,
"cryptoSeries": null,
"cryptoLongSeries": null
}
],
"total": 1874,
"openMarketCount": 15210,
"totalMarketCount": 15862
}List events
Public events with their markets attached, filtered and sorted.
Page size: at most 100 events per response (previously 500). A limit above 100 no longer returns more events: it is served as 100 — see Events list pages.
- With no
page,limitor numericto, the response holds the first 100 events of the sorted list. - A
limitabove 100 is not rejected: it is served as a page of 100, and pages then step by 100 (page=3&limit=500returns events 200–299). - A numeric
from/tospan wider than 100 returns the first 100 events fromfrom. - When a
limitabove 100 or a numeric span wider than 100 is cut to 100, or no window is given at all (nopage/limitand no numericto), the response carries the headerX-Events-Window-Capped: 100; alimitor numeric span of 100 or less never does. - To read everything, request
page=1, 2, 3, …until a page comes back empty ("events": []). A page shorter than thelimityou asked for is not a stop signal: with alimitabove 100 every page is shorter, and an event can drop out of a page while it is built, so a short page can appear mid-list. There is nohasMoreand no cursor, andtotal(below) is not a stop signal. - Pages are not a snapshot: each page is computed and cached on its own, so walking pages while the catalogue changes can repeat or skip an event.
Paging parameters. Use page/limit, or numeric from/to (0-based positions over the sorted list) — not both (400 ambiguous_pagination). ISO-8601 from/to dates that start YYYY-MM-DD (2026-10-01, 2026-10-01T00:00:00Z) are filters and do combine with page/limit; any other from/to beside page/limit is 400 ambiguous_pagination. offset, cursor, skip, start and pageSize are not supported: any non-empty value returns 400 (invalid_offset, invalid_cursor, invalid_skip, invalid_start, invalid_page_size, with error.details.param). Other unknown parameters are ignored.
List rows are slimmer than the detail. Each row has the same event-level fields as GET /api/events/{slug}, but its markets[] use the list shape EventListMarketDto: no eventSlug, tags, homeCountry, awayCountry, sport, tradingMode or notTradableReason; resolutionCriteria only on long-dated crypto markets (crypto set, not an Up/Down window, cryptoWindow null), absent from every other row; prediction keeps only version, kind, line, threshold and endsAt; probabilityChange has no asOf or outcomes[].baselineAt. For the full market row call GET /api/events/{slug} (or GET /api/markets/{slug}).
Which events and markets. Default (open) view: events with at least one visible PRE_MARKET (launched), OPEN, PAUSED or POSTPONED market, or currently in play, and still current — a future start, kickoff or closesAt, in play, or postponed (an ISO-8601 from replaces this time floor). closed=true / status=closed: the settled tab — events with no open-view market and at least one SUSPENDED, CLOSED, PENDING_RESOLUTION, DELAYED, DISPUTED, RESOLVED or VOIDED market, not in play and not postponed. The two views never overlap. Hidden markets never appear. markets[] is filtered to the view, so markets.length is not a market count — use openMarketCount / totalMarketCount. On the closed view, a crypto Up/Down day event nests its windows still awaiting settlement and at most the 3 latest-ending RESOLVED or VOIDED windows, as on GET /api/events/{slug} (one exception: a day whose windows were all VOIDED before they ended nests all of them, and its detail returns 404 event_not_found); read the whole day from GET /api/crypto-series/{id}/windows?state=all with from/to. On the open view, sibling periods of a long-dated crypto series collapse into one event row.
Filters. All optional; different fields AND together, values within one field OR together. Multi-value fields (stage, group, team, tag, vertical, competition, subcategory, scope, asset, cadence, frequency, predictionType) take repeated keys (?tag=a&tag=b), comma-separated values (?tag=a,b) or both; at most 20 distinct values per field (400 too_many_<field>, e.g. too_many_tag; predictionType → too_many_prediction_type). Repeating a single-value parameter (sort, closed, status, kind, preMarket, page, limit, q) returns 400. Never repeat from / to: a repeated value can be read as a date bound instead of being rejected.
Totals. The first page of every listing (page=1, from=0, or no page and no digits-only from) also carries total (the number of events matching every filter, independent of the page) and openMarketCount / totalMarketCount (market counts summed over those events); later pages carry none of them. Treat them as optional: when they cannot be computed in time, the first page is answered without them.
Search. With q, every page carries total, openMarketCount, totalMarketCount and facets.competition; a q request that cannot compute them fails rather than leaving them out. facets is never present without q.
Auth and freshness. Public: no API key is needed, and an X-Api-Key header is ignored, so API-key requests are anonymous. Only a signed-in web-app session personalises saved; an invalid session token is treated as anonymous, never 401. Which events a page holds, their order, volumes and market status / tradable come from a list slice shared by every caller that can be up to ~20 s old; prices, live scores and probabilityChange are read when the response is built. Anonymous responses are then cached on top: usually ~6 s, up to ~30 s for full 100-event pages of the open view, ~60 s for full pages of the closed view, and 2 min for closed pages whose markets are all settled. Do not use this list as a price feed — use the order book or the market WebSocket channel. Responses carry an ETag (If-None-Match → 304) and are compressed (br / gzip) when Accept-Encoding allows.
curl --request GET \
--url https://core.api.dev.predictstreet.sde.adifoundation.ai/api/eventsimport requests
url = "https://core.api.dev.predictstreet.sde.adifoundation.ai/api/events"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://core.api.dev.predictstreet.sde.adifoundation.ai/api/events', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://core.api.dev.predictstreet.sde.adifoundation.ai/api/events",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://core.api.dev.predictstreet.sde.adifoundation.ai/api/events"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://core.api.dev.predictstreet.sde.adifoundation.ai/api/events")
.asString();require 'uri'
require 'net/http'
url = URI("https://core.api.dev.predictstreet.sde.adifoundation.ai/api/events")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"events": [
{
"id": "fa3450ad-11c0-4fb0-9a8b-c8d3bd8d4657",
"slug": "lithuania-vs-andorra",
"title": "Lithuania vs Andorra",
"metaTitle": null,
"imageUrl": "https://adipsadminreportsprod.blob.core.windows.net/images/fc5fe0c43bedb40a861a1fac96a38bd2fd42bdf6d0e242bc853cb5a45d4c3a05.png",
"homeCountry": null,
"awayCountry": null,
"sport": "soccer",
"vertical": "football",
"match": {
"id": "bed88311-cf1c-4dc6-b26c-a59e61e76148",
"slug": "friendlies-lit-and-2026-09-30",
"title": "Lithuania vs Andorra",
"group": null,
"stage": null,
"competition": {
"name": "Friendlies",
"slug": "friendlies",
"logo": "https://media.api-sports.io/football/leagues/10.png"
},
"teamA": {
"code": "LIT",
"label": "Lithuania",
"logo": "https://media.api-sports.io/football/teams/1097.png"
},
"teamB": {
"code": "AND",
"label": "Andorra",
"logo": "https://media.api-sports.io/football/teams/1110.png"
},
"kickoffAt": "2026-09-30T16:00:00.000Z",
"state": "LIVE"
},
"teamA": {
"code": "LIT",
"label": "Lithuania",
"logo": "https://media.api-sports.io/football/teams/1097.png"
},
"teamB": {
"code": "AND",
"label": "Andorra",
"logo": "https://media.api-sports.io/football/teams/1110.png"
},
"competition": {
"name": "Friendlies",
"slug": "friendlies",
"logo": "https://media.api-sports.io/football/leagues/10.png"
},
"tags": [
{
"slug": "football",
"name": "Football"
}
],
"scheduledAt": "2026-09-30T16:00:00.000Z",
"endedAt": null,
"scheduleStatus": "SCHEDULED",
"scheduleReason": null,
"settlesByAt": null,
"volume24h": "578.207202",
"totalVolume": "1084.507287",
"openMarketCount": 2,
"totalMarketCount": 2,
"createdAt": "2026-09-28T16:01:45.598Z",
"updatedAt": "2026-09-28T16:01:45.598Z",
"saved": false,
"markets": [
{
"id": "d8e3455a-4718-42ab-835b-140d3d19fc90",
"eventId": "fa3450ad-11c0-4fb0-9a8b-c8d3bd8d4657",
"symbol": "FRIENDLI-LIT-AND-MW-20260930-LIT",
"slug": "friendli-lithuania-andorra-2026-09-30-lit",
"title": "Lithuania vs Andorra",
"question": "Will Lithuania win on 2026-09-30?",
"groupItemTitle": "Lithuania",
"groupItemSubtitle": null,
"groupItemImageUrl": "https://media.api-sports.io/football/teams/1097.png",
"conditionId": "0x8dd569f481e59fc09ab4a8505ba47f2274be0e46fe3634782293736078bdedf1",
"questionId": "0xf1a3d10c822dafc3ef0ed87f414d53ae5de05257ee5dcd93772be9a5bed3e6ac",
"yesTokenId": "80165004934803191397580503835090157935937355906282867775303972121044178093586",
"noTokenId": "63450570942061807146633736252282598892118593663088571046836796600062060112037",
"outcomes": [
{
"label": "YES",
"tokenId": "80165004934803191397580503835090157935937355906282867775303972121044178093586",
"noTokenId": null,
"conditionId": "0x8dd569f481e59fc09ab4a8505ba47f2274be0e46fe3634782293736078bdedf1",
"outcomeIndex": 0
},
{
"label": "NO",
"tokenId": "63450570942061807146633736252282598892118593663088571046836796600062060112037",
"noTokenId": null,
"conditionId": "0x8dd569f481e59fc09ab4a8505ba47f2274be0e46fe3634782293736078bdedf1",
"outcomeIndex": 1
}
],
"sourceSelections": [
{
"outcomeLabel": "YES",
"outcomeIndex": 0,
"providerOutcomeId": "MATCH_WINNER:side=home",
"providerOutcomeName": null,
"marketType": "MATCH_WINNER",
"selector": {
"side": "home"
}
}
],
"line": null,
"lineGroup": null,
"outcomeCount": 2,
"outcomeLabels": [
"YES",
"NO"
],
"outcomePrices": [
"0.610000",
"0.420000"
],
"chances": [
"0.595000",
"0.405000"
],
"status": "OPEN",
"currentReviewRound": 1,
"feeTakerBps": 600,
"executionDelayMs": 0,
"liveTick": null,
"kickoff": "2026-09-30T16:00:00.000Z",
"tradingWindow": {
"preMarketStartsAt": "2026-09-28T17:03:53.885Z",
"opensAt": "2026-09-28T18:04:02.599Z",
"closesAt": "2026-10-01T16:00:00.000Z"
},
"resolutionWindowHours": 2,
"payoutNumerators": null,
"officialDataSource": "lsports",
"sourceMatchId": "19742064",
"additionalSources": [],
"cryptoWindow": null,
"negRiskEligible": true,
"negRiskMarketId": "0xf1a3d10c822dafc3ef0ed87f414d53ae5de05257ee5dcd93772be9a5bed3e6ac",
"negRiskQuestionIndex": 0,
"isNewMarketType": false,
"marketType": "MATCH_WINNER",
"vertical": "football",
"volume24h": "8.196721000000000000",
"totalVolume": "123.058138000000000000",
"createdAt": "2026-09-28T16:01:46.456Z",
"updatedAt": "2026-09-28T18:04:02.600Z",
"lifecycle": {
"closedAt": null,
"pausedAt": null,
"resolvedAt": null,
"voidedAt": null
},
"resolution": {
"proposedAt": null,
"challengeWindowClosesAt": null,
"disputedAt": null,
"proposedOutcome": null,
"proposedOutcomeIndex": null,
"resolvedOutcome": null,
"resolvedOutcomeIndex": null,
"disputeBondUsdcRaw": null,
"disputeReason": null,
"resolutionKind": null,
"proposalKind": null,
"proposedFairPriceSplit": null
},
"crypto": null,
"prediction": null,
"live": null,
"tradable": true,
"probabilityChange": {
"window": "24h",
"unit": "percentage_points",
"outcomes": [
{
"outcomeIndex": 0,
"change": 4
},
{
"outcomeIndex": 1,
"change": -4
}
]
}
},
{
"id": "550128de-4e6c-433e-9641-72f7a4c5d7e4",
"eventId": "fa3450ad-11c0-4fb0-9a8b-c8d3bd8d4657",
"symbol": "FRIENDLI-LIT-AND-BTTS-20260930",
"slug": "friendli-lithuania-andorra-2026-09-30-both-teams-to-score",
"title": "Lithuania vs Andorra — Both Teams to Score",
"question": "Will both teams score in Lithuania vs Andorra?",
"groupItemTitle": null,
"groupItemSubtitle": null,
"groupItemImageUrl": null,
"conditionId": "0xb0b2b5fdaad588309da08a368e6c5c319188f0bd161350795758aa8c77ca32bc",
"questionId": "0x92a85bd967a771422d57e3172450ed68b0aaacce54a830629e296f0931765a71",
"yesTokenId": "102750190754240673859096217792928774056694746741774827251607970731692223476919",
"noTokenId": "22614115426494688294622613649990986606187822224268502860311292172902483170394",
"outcomes": [
{
"label": "Yes",
"tokenId": "102750190754240673859096217792928774056694746741774827251607970731692223476919",
"noTokenId": null,
"conditionId": "0xb0b2b5fdaad588309da08a368e6c5c319188f0bd161350795758aa8c77ca32bc",
"outcomeIndex": 0
},
{
"label": "No",
"tokenId": "22614115426494688294622613649990986606187822224268502860311292172902483170394",
"noTokenId": null,
"conditionId": "0xb0b2b5fdaad588309da08a368e6c5c319188f0bd161350795758aa8c77ca32bc",
"outcomeIndex": 1
}
],
"sourceSelections": [
{
"outcomeLabel": "NO",
"outcomeIndex": 1,
"providerOutcomeId": "BTTS:yes=false",
"providerOutcomeName": null,
"marketType": "BTTS",
"selector": {
"yes": false
}
},
{
"outcomeLabel": "YES",
"outcomeIndex": 0,
"providerOutcomeId": "BTTS:yes=true",
"providerOutcomeName": null,
"marketType": "BTTS",
"selector": {
"yes": true
}
}
],
"line": null,
"lineGroup": null,
"outcomeCount": 2,
"outcomeLabels": [
"YES",
"NO"
],
"outcomePrices": [
"0.170000",
"0.850000"
],
"chances": [
"0.160000",
"0.840000"
],
"status": "OPEN",
"currentReviewRound": 1,
"feeTakerBps": 600,
"executionDelayMs": 0,
"liveTick": null,
"kickoff": "2026-09-30T16:00:00.000Z",
"tradingWindow": {
"preMarketStartsAt": "2026-09-28T17:03:44.542Z",
"opensAt": "2026-09-28T18:04:02.749Z",
"closesAt": "2026-10-01T16:00:00.000Z"
},
"resolutionWindowHours": 2,
"payoutNumerators": null,
"officialDataSource": "lsports",
"sourceMatchId": "19742064",
"additionalSources": [],
"cryptoWindow": null,
"negRiskEligible": false,
"negRiskMarketId": null,
"negRiskQuestionIndex": null,
"isNewMarketType": false,
"marketType": "BTTS",
"vertical": "football",
"volume24h": "396.652780000000000000",
"totalVolume": "396.652780000000000000",
"createdAt": "2026-09-28T16:01:47.379Z",
"updatedAt": "2026-09-28T18:04:02.750Z",
"lifecycle": {
"closedAt": null,
"pausedAt": null,
"resolvedAt": null,
"voidedAt": null
},
"resolution": {
"proposedAt": null,
"challengeWindowClosesAt": null,
"disputedAt": null,
"proposedOutcome": null,
"proposedOutcomeIndex": null,
"resolvedOutcome": null,
"resolvedOutcomeIndex": null,
"disputeBondUsdcRaw": null,
"disputeReason": null,
"resolutionKind": null,
"proposalKind": null,
"proposedFairPriceSplit": null
},
"crypto": null,
"prediction": null,
"live": null,
"tradable": true,
"probabilityChange": {
"window": "24h",
"unit": "percentage_points",
"outcomes": [
{
"outcomeIndex": 0,
"change": -34
},
{
"outcomeIndex": 1,
"change": 34
}
]
}
}
],
"category": {
"key": "GAME_LINES",
"label": "Game Lines"
},
"live": null,
"inPlay": false,
"cryptoSeries": null,
"cryptoLongSeries": null
}
],
"total": 1874,
"openMarketCount": 15210,
"totalMarketCount": 15862
}Query Parameters
Event stage (exact, case-sensitive values), matched against the event's stage: a match-less fixture's own, or the parent match's. Multi-value: repeated keys or CSV, OR-ed. Unknown value → 400 invalid_stage.
group, r32, r16, quarter_finals, semi_finals, third_place, final, fifa_friendlies, ucl, uefa_europa_conference_league Group label, e.g. A (1–8 upper-case letters or digits, case-sensitive), matched against the event's group: a match-less fixture's own, or the parent match's. Multi-value: repeated keys or CSV. Malformed → 400 invalid_group.
^[A-Z0-9]{1,8}$Team code(s): 3 letters, case-insensitive (upper-cased by the server). Each value matches the parent match's teamA or teamB. Multi-value: repeated keys or CSV. Matches only events bound to a match — match-less head-to-head events (e.g. most tennis) are not matched even though they carry teamA / teamB. Malformed → 400 invalid_team.
^[A-Za-z]{3}$Tag slug(s), exact and case-sensitive (e.g. premier-league). An event matches when it carries at least one of the given active tags. Multi-value: repeated keys or CSV. Malformed (e.g. upper-case) → 400 invalid_tag.
^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$Dual mode, decided by the value's shape.
- Digits only (
0–1000000): 0-based start position in the sorted list.fromalone returns positions[from, from + 100), with the headerX-Events-Window-Capped: 100. Cannot be combined withpage/limit(400ambiguous_pagination). - Anything else: parsed as a date — inclusive lower bound on the event's start time (
scheduledAt). Send a full ISO-8601 timestamp withZor an explicit offset. It replaces the default "not already started" floor, so a past date also returns started events that still have open markets. Events with no start time never match a date bound. Combines withpage/limitwhen it startsYYYY-MM-DD(a date, optionally with a time); any other value besidepage/limitis 400ambiguous_pagination.
Beware: a 4-digit year such as 2026 is read as a position, and an epoch-milliseconds value is rejected. Unparseable or above 1000000 → 400 invalid_from.
Dual mode, like from.
- Digits only: exclusive end position. A
to − fromspan above 100 returns only the first 100 events fromfrom, with the headerX-Events-Window-Capped: 100;toalone returns[0, min(to, 100));toequal tofromreturns an empty list. Cannot be combined withpage/limit. - Anything else: parsed as a date — inclusive upper bound on the event's start time. Combines with
page/limitwhen it startsYYYY-MM-DD, likefrom.
to before from → 400 invalid_range. Unparseable or above 1000000 → 400 invalid_to.
Ordering (single value).
- absent: chronological — the earliest kickoff among the event's open markets (the event start when a market has none) first, then
title, thenid. Withq: relevance. On the closed view there is no kickoff anchor, so the default order is bytitle. trending: 24 h volume, highest first.coming_soon: only events with a market that has not opened yet; nextopensAtfirst.ending_soon: only events with a market still to close; nextclosesAtfirst.starting_soon: only events with a future kickoff; next kickoff first.live: only events currently in play; most recent kickoff first.
An explicit sort overrides relevance under q. Unknown value → 400 invalid_sort (error.details.allowed).
trending, coming_soon, ending_soon, starting_soon, live Vertical slug(s) — see GET /api/verticals. crypto selects crypto markets. Open set: an unknown slug matches nothing, a malformed one → 400 invalid_vertical; soccer is folded to football. Repeated keys or CSV, ≤20 values.
Crypto coin slug(s) — data-driven (btc, eth, …), plus the reserved others (crypto markets with no identifiable asset). A well-formed but unknown slug matches nothing (200, empty list); a MALFORMED slug returns 400 invalid_asset. Repeated keys or CSV, ≤20 values.
Crypto window cadence slug(s). CLOSED set — an unknown value returns 400 invalid_cadence. Matches events carrying at least one windowed market of that cadence. Repeated keys or CSV, ≤20 values. For calendar-month, annual or one-time products use frequency (monthly, annual, one-time) instead.
5-minute, 15-minute, 30-minute, hourly, 6-hour, daily, weekly true: the settled / finished tab — events with no open-view market and at least one SUSPENDED, CLOSED, PENDING_RESOLUTION, DELAYED, DISPUTED, RESOLVED or VOIDED market, not in play and not postponed; their markets[] carry those closed-status markets. false (default): the open view. Accepts true/false/1/0/yes/no/on/off (case-insensitive); an empty value is ignored; anything else → 400 invalid_closed. Cannot be combined with status (400 ambiguous_status).
match: events bound to a match. tournament: events with no parent match — outright questions and match-less fixtures (e.g. most tennis and baseball). Single value; unknown → 400 invalid_kind.
match, tournament 1-based page number. Returns positions [(page − 1) × L, page × L) where L = min(limit, 100); default 1 when only limit is given. Walk pages until one comes back empty. Digits only, ≥ 1, otherwise 400 invalid_page; an offset above 1000000 → 400 invalid_page. Combines with ISO-8601 from / to dates that start YYYY-MM-DD; any other from / to, numeric included, is 400 ambiguous_pagination.
x >= 1Page size. A response carries at most 100 events: a larger value is served as 100 — it is not rejected — pages then step by 100, and the response carries X-Events-Window-Capped: 100. Default 100. Digits only, ≥ 1; 0, negative or non-numeric values → 400 invalid_limit. Previously a response held up to 500 events and a limit above 500 was 400 invalid_limit.
x >= 1open (the default view: events with ≥1 tradeable market, or currently in play) or closed (the settled set: no tradeable market and ≥1 closed market). Omit it for the default view. Single value; unknown → 400 invalid_status; together with closed → 400 ambiguous_status. Combinations that cannot match — status=closed with sort=ending_soon, starting_soon, coming_soon or live, or with preMarket=true — return an empty list, not an error.
open, closed true: only events with ≥1 visible market in PRE_MARKET (orders accepted, matching deferred — a TRADEABLE state, not a read-only one). false: only events with none. Absent: no constraint. PLATFORM-WIDE, not crypto-only: PRE_MARKET means the same thing in every vertical, and the two values partition the whole catalogue. ?vertical=crypto&preMarket=true matches the crypto.preMarket count on GET /api/verticals. Only markets past their reveal time count, so a scheduled-but-unrevealed market never surfaces an event here. Accepts true/false/1/0/yes/no/on/off (case-insensitive); a bare ?preMarket with no value is ignored, like ?closed=. Anything else → 400 invalid_pre_market.
Shape of the price question. rise-fall = no operator-set level; the reference is derived from the market itself (a window's pinned open price, the previous month's close) and the outcome is a direction. above-below = the operator set a level and the question is whether the metric clears it. Multi-value (CSV or repeated keys, ≤20). STRICT: an unknown value → 400 invalid_prediction_type. CRYPTO events only (events in the crypto vertical; a crypto rule on an event filed under another vertical does not match). More than 20 values → 400 too_many_prediction_type.
rise-fall, above-below How often the market recurs. Multi-value (CSV or repeated keys, ≤20). STRICT: an unknown value → 400 invalid_frequency (closed set, like scope/cadence). Matches events carrying ≥1 visible market of one of the given frequencies. Not a rename of ?cadence=: it folds TWO mechanisms — the series grid step (5-minute…weekly) and the product's own declared window (monthly = a calendar month, midnight to midnight US Eastern time; one-time = a single deadline). ?cadence= sees only the first and stays available as the low-level knob. annual is a valid value, but no market uses it today, so it matches no events.
5-minute, 15-minute, 30-minute, hourly, 6-hour, daily, weekly, monthly, annual, one-time Market-scope filter: closed scope vocabulary (games, futures, totals, handicap, correct-score, player-props, team-props, awards, specials) — the slugs /api/verticals advertises per vertical/competition. Multi-value (CSV or repeated keys, ≤20). STRICT: an unknown value → 400 invalid_scope (closed set, unlike vertical). Matches events carrying ≥1 bettable market of the scope.
games, futures, totals, handicap, correct-score, player-props, team-props, awards, specials Sub-topic slug(s) — the values GET /api/verticals lists in each vertical's subcategories[]. A subcategory slug is globally unique and implies its vertical, so no ?vertical= is needed. Each event has at most one subcategory. Open set: an unknown slug matches nothing; a malformed one → 400 invalid_subcategory. Repeated keys or CSV, ≤20 values.
Competition slug(s) — see GET /api/verticals. Matches on the effective competition (the match's, else the event's own). Unknown slugs match nothing; a malformed slug → 400 invalid_competition. Repeated keys or CSV.
Free-text search. Matches event title (substring), team (code exact / name substring) and active tag name (substring) — the same arms as /api/search/events, so the page and the header dropdown agree. Composes with EVERY other filter (a sort mode's implicit time filter included: ?q=x&sort=live ranks the live subset). With q and no sort, ordering is RELEVANCE (exact > prefix > substring; direct hit > tag-only; similarity tiebreak); an explicit sort overrides. Adds total, openMarketCount, totalMarketCount and facets.competition to every page of the response. Trimmed; max 64 chars (400 query_too_long); empty = absent. A repeated q → 400 invalid_query.
64Response
OK — at most 100 events. total, openMarketCount and totalMarketCount on the first page of every listing and on every page with q; facets only with q.
Response of GET /api/events: at most 100 event rows. total, openMarketCount and totalMarketCount are present on the first page of every listing and on every page when q is supplied; facets only when q is supplied.
Event rows of the requested page — at most 100. An empty array means you are past the last page.
Show child attributes
Show child attributes
The number of events matching every filter of the request — q, ISO-8601 from / to date bounds and the implicit filter of sort=coming_soon / ending_soon / starting_soon / live included; sibling long-crypto periods counted once — independent of page / limit and of numeric from / to. Present on the first page of every listing (page=1, from=0, or no page and no digits-only from) and on every page when q is supplied; absent from later pages. Optional even there: when it cannot be computed in time, a first page is answered without it and without openMarketCount / totalMarketCount (a q request fails instead). Not a stop signal — keep paging until a page comes back empty.
3
Without scope: the sum of the rows' openMarketCount over the total events, so 0 on status=closed. With scope: the number of markets of the requested scopes that the scope filter admits on the requested view — not the sum of the rows' own counters. Present whenever total is.
7
Without scope: the sum of the rows' totalMarketCount over the total events — the count to show on status=closed, where openMarketCount is 0. With scope: the same number as openMarketCount. Present whenever total is.
9
Present only when q is supplied: per-competition counts of the matched set.
Show child attributes
Show child attributes