curl --request GET \
--url https://core.api.dev.predictstreet.sde.adifoundation.ai/api/events/{slug}import requests
url = "https://core.api.dev.predictstreet.sde.adifoundation.ai/api/events/{slug}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://core.api.dev.predictstreet.sde.adifoundation.ai/api/events/{slug}', 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/{slug}",
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/{slug}"
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/{slug}")
.asString();require 'uri'
require 'net/http'
url = URI("https://core.api.dev.predictstreet.sde.adifoundation.ai/api/events/{slug}")
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{
"id": "5cc08926-c0c6-43c4-885d-f7eaa86c9f85",
"slug": "lula-participates-in-debate-before-first-round",
"title": "Lula participates in debate before first round?",
"metaTitle": null,
"imageUrl": null,
"homeCountry": null,
"awayCountry": null,
"sport": "politics",
"vertical": "politics",
"match": null,
"teamA": null,
"teamB": null,
"competition": null,
"tags": [
{
"slug": "politics",
"name": "Politics"
}
],
"scheduledAt": "2026-10-03T23:59:00.000Z",
"endedAt": null,
"scheduleStatus": "SCHEDULED",
"scheduleReason": null,
"settlesByAt": null,
"volume24h": "0",
"totalVolume": "7641.23527",
"openMarketCount": 1,
"totalMarketCount": 1,
"createdAt": "2026-08-25T12:36:08.393Z",
"updatedAt": "2026-08-25T12:36:08.393Z",
"saved": false,
"markets": [
{
"id": "e5d13707-63c1-43fa-8d07-d8fdc906e405",
"eventId": "5cc08926-c0c6-43c4-885d-f7eaa86c9f85",
"eventSlug": "lula-participates-in-debate-before-first-round",
"homeCountry": null,
"awayCountry": null,
"tags": [
{
"slug": "politics",
"name": "Politics"
}
],
"symbol": "LULA-PARTICIPATES-IN-DEBATE-BEFORE-FIRST-19838666",
"slug": "lula-participates-in-debate-before-first-round",
"title": "Lula participates in debate before first round?",
"question": "Lula participates in debate before first round?",
"groupItemTitle": null,
"groupItemSubtitle": null,
"groupItemImageUrl": null,
"conditionId": "0x895efaa1bf69dba4b3be31184ad8cc6d077139062d143e75138fa2283de25293",
"questionId": "0xe8bd100c7f8db1accb62c99b6ceb08e33a4ca7c5ac538b66c8087619c4f3ba15",
"yesTokenId": "69774830757241944332031024355686314641795603675990763578292357453968296704950",
"noTokenId": "55033404926999163162452043496432946222771140431114106881962498002067653861509",
"outcomes": [
{
"label": "YES",
"tokenId": "69774830757241944332031024355686314641795603675990763578292357453968296704950",
"noTokenId": null,
"conditionId": "0x895efaa1bf69dba4b3be31184ad8cc6d077139062d143e75138fa2283de25293",
"outcomeIndex": 0
},
{
"label": "NO",
"tokenId": "55033404926999163162452043496432946222771140431114106881962498002067653861509",
"noTokenId": null,
"conditionId": "0x895efaa1bf69dba4b3be31184ad8cc6d077139062d143e75138fa2283de25293",
"outcomeIndex": 1
}
],
"sourceSelections": [],
"line": null,
"lineGroup": null,
"outcomeCount": 2,
"outcomeLabels": [
"YES",
"NO"
],
"outcomePrices": [
"0.680000",
"0.320000"
],
"chances": [
"0.680000",
"0.320000"
],
"status": "OPEN",
"currentReviewRound": 1,
"feeTakerBps": 600,
"executionDelayMs": 0,
"liveTick": null,
"kickoff": null,
"tradingWindow": {
"preMarketStartsAt": "2026-08-27T16:40:03.505Z",
"opensAt": "2026-08-27T20:40:48.163Z",
"closesAt": "2026-10-03T23:59:00.000Z"
},
"resolutionWindowHours": 2,
"payoutNumerators": null,
"officialDataSource": "lsports",
"sourceMatchId": "19838666",
"additionalSources": [],
"resolutionCriteria": "This market will resolve to Yes if Luiz Inácio Lula da Silva participates in a televised Brazilian presidential debate by October 3, 2026, 11:59 PM Brasilia time. Otherwise, it will resolve to No.",
"cryptoWindow": null,
"negRiskEligible": false,
"negRiskMarketId": null,
"negRiskQuestionIndex": null,
"isNewMarketType": false,
"marketType": null,
"sport": "politics",
"vertical": "politics",
"volume24h": "0",
"totalVolume": "7641.235270000000000000",
"createdAt": "2026-08-25T12:38:10.240Z",
"updatedAt": "2026-08-27T20:40:48.163Z",
"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": {
"version": 1,
"provider": "lsports",
"questionId": "19838666",
"question": "Lula participates in debate before first round?",
"kind": "binary",
"line": null,
"rulesText": "This market will resolve to Yes if Luiz Inácio Lula da Silva participates in a televised Brazilian presidential debate by October 3, 2026, 11:59 PM Brasilia time. Otherwise, it will resolve to No.",
"threshold": null,
"endsAt": "2026-10-03T23:59:00Z",
"capturedAt": "2026-08-25T12:38:10.228Z"
},
"live": null,
"tradable": true,
"tradingMode": "open",
"notTradableReason": null,
"probabilityChange": {
"window": "24h",
"unit": "percentage_points",
"asOf": "2026-09-30T11:21:45.199Z",
"outcomes": [
{
"outcomeIndex": 0,
"change": 0,
"baselineAt": "2026-09-28T17:00:00.000Z"
},
{
"outcomeIndex": 1,
"change": 0,
"baselineAt": "2026-09-28T17:00:00.000Z"
}
]
}
}
],
"category": {
"key": "OTHER",
"label": "Other"
},
"live": null,
"inPlay": false,
"cryptoSeries": null,
"cryptoLongSeries": null
}{
"status": 404,
"error": {
"code": "<string>",
"message": "<string>",
"trace_id": "<string>",
"retryAfterSec": 123,
"retryable": true,
"details": {}
}
}Fetch a single event by slug
Public event detail, resolved by the canonical event slug (exact match; UUIDs are not accepted). Returns the full EventSummaryDto with full MarketSummaryDto markets — every visible market in any public status, closed and settled ones included (short-crypto Up/Down windows that are RESOLVED or VOIDED are capped at 3 per event; totalMarketCount still counts them all). This is where the fields left out of GET /api/events rows live (eventSlug, tags, tradingMode, notTradableReason, resolutionCriteria outside long-dated crypto, the full prediction, probabilityChange.asOf, …). 404 event_not_found (details.slug) when the slug does not exist, has no public market, or belongs to an unpublished match. saved is personalised as on the list. Not cached server-side.
curl --request GET \
--url https://core.api.dev.predictstreet.sde.adifoundation.ai/api/events/{slug}import requests
url = "https://core.api.dev.predictstreet.sde.adifoundation.ai/api/events/{slug}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://core.api.dev.predictstreet.sde.adifoundation.ai/api/events/{slug}', 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/{slug}",
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/{slug}"
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/{slug}")
.asString();require 'uri'
require 'net/http'
url = URI("https://core.api.dev.predictstreet.sde.adifoundation.ai/api/events/{slug}")
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{
"id": "5cc08926-c0c6-43c4-885d-f7eaa86c9f85",
"slug": "lula-participates-in-debate-before-first-round",
"title": "Lula participates in debate before first round?",
"metaTitle": null,
"imageUrl": null,
"homeCountry": null,
"awayCountry": null,
"sport": "politics",
"vertical": "politics",
"match": null,
"teamA": null,
"teamB": null,
"competition": null,
"tags": [
{
"slug": "politics",
"name": "Politics"
}
],
"scheduledAt": "2026-10-03T23:59:00.000Z",
"endedAt": null,
"scheduleStatus": "SCHEDULED",
"scheduleReason": null,
"settlesByAt": null,
"volume24h": "0",
"totalVolume": "7641.23527",
"openMarketCount": 1,
"totalMarketCount": 1,
"createdAt": "2026-08-25T12:36:08.393Z",
"updatedAt": "2026-08-25T12:36:08.393Z",
"saved": false,
"markets": [
{
"id": "e5d13707-63c1-43fa-8d07-d8fdc906e405",
"eventId": "5cc08926-c0c6-43c4-885d-f7eaa86c9f85",
"eventSlug": "lula-participates-in-debate-before-first-round",
"homeCountry": null,
"awayCountry": null,
"tags": [
{
"slug": "politics",
"name": "Politics"
}
],
"symbol": "LULA-PARTICIPATES-IN-DEBATE-BEFORE-FIRST-19838666",
"slug": "lula-participates-in-debate-before-first-round",
"title": "Lula participates in debate before first round?",
"question": "Lula participates in debate before first round?",
"groupItemTitle": null,
"groupItemSubtitle": null,
"groupItemImageUrl": null,
"conditionId": "0x895efaa1bf69dba4b3be31184ad8cc6d077139062d143e75138fa2283de25293",
"questionId": "0xe8bd100c7f8db1accb62c99b6ceb08e33a4ca7c5ac538b66c8087619c4f3ba15",
"yesTokenId": "69774830757241944332031024355686314641795603675990763578292357453968296704950",
"noTokenId": "55033404926999163162452043496432946222771140431114106881962498002067653861509",
"outcomes": [
{
"label": "YES",
"tokenId": "69774830757241944332031024355686314641795603675990763578292357453968296704950",
"noTokenId": null,
"conditionId": "0x895efaa1bf69dba4b3be31184ad8cc6d077139062d143e75138fa2283de25293",
"outcomeIndex": 0
},
{
"label": "NO",
"tokenId": "55033404926999163162452043496432946222771140431114106881962498002067653861509",
"noTokenId": null,
"conditionId": "0x895efaa1bf69dba4b3be31184ad8cc6d077139062d143e75138fa2283de25293",
"outcomeIndex": 1
}
],
"sourceSelections": [],
"line": null,
"lineGroup": null,
"outcomeCount": 2,
"outcomeLabels": [
"YES",
"NO"
],
"outcomePrices": [
"0.680000",
"0.320000"
],
"chances": [
"0.680000",
"0.320000"
],
"status": "OPEN",
"currentReviewRound": 1,
"feeTakerBps": 600,
"executionDelayMs": 0,
"liveTick": null,
"kickoff": null,
"tradingWindow": {
"preMarketStartsAt": "2026-08-27T16:40:03.505Z",
"opensAt": "2026-08-27T20:40:48.163Z",
"closesAt": "2026-10-03T23:59:00.000Z"
},
"resolutionWindowHours": 2,
"payoutNumerators": null,
"officialDataSource": "lsports",
"sourceMatchId": "19838666",
"additionalSources": [],
"resolutionCriteria": "This market will resolve to Yes if Luiz Inácio Lula da Silva participates in a televised Brazilian presidential debate by October 3, 2026, 11:59 PM Brasilia time. Otherwise, it will resolve to No.",
"cryptoWindow": null,
"negRiskEligible": false,
"negRiskMarketId": null,
"negRiskQuestionIndex": null,
"isNewMarketType": false,
"marketType": null,
"sport": "politics",
"vertical": "politics",
"volume24h": "0",
"totalVolume": "7641.235270000000000000",
"createdAt": "2026-08-25T12:38:10.240Z",
"updatedAt": "2026-08-27T20:40:48.163Z",
"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": {
"version": 1,
"provider": "lsports",
"questionId": "19838666",
"question": "Lula participates in debate before first round?",
"kind": "binary",
"line": null,
"rulesText": "This market will resolve to Yes if Luiz Inácio Lula da Silva participates in a televised Brazilian presidential debate by October 3, 2026, 11:59 PM Brasilia time. Otherwise, it will resolve to No.",
"threshold": null,
"endsAt": "2026-10-03T23:59:00Z",
"capturedAt": "2026-08-25T12:38:10.228Z"
},
"live": null,
"tradable": true,
"tradingMode": "open",
"notTradableReason": null,
"probabilityChange": {
"window": "24h",
"unit": "percentage_points",
"asOf": "2026-09-30T11:21:45.199Z",
"outcomes": [
{
"outcomeIndex": 0,
"change": 0,
"baselineAt": "2026-09-28T17:00:00.000Z"
},
{
"outcomeIndex": 1,
"change": 0,
"baselineAt": "2026-09-28T17:00:00.000Z"
}
]
}
}
],
"category": {
"key": "OTHER",
"label": "Other"
},
"live": null,
"inPlay": false,
"cryptoSeries": null,
"cryptoLongSeries": null
}{
"status": 404,
"error": {
"code": "<string>",
"message": "<string>",
"trace_id": "<string>",
"retryAfterSec": 123,
"retryable": true,
"details": {}
}
}Path Parameters
Canonical event slug, e.g. fifa-world-cup-2026-winner.
Response
OK
Full event shape, returned by GET /api/events/{slug} and GET /api/events/featured: the same event-level fields as a GET /api/events row, with full MarketSummaryDto markets.
Event UUID.
Canonical event slug — the key for GET /api/events/{slug}.
"lithuania-vs-andorra"
Display title.
SEO title set by operators; null ⇒ use title.
Competition or tournament logo URL. Display-only; null ⇒ use a placeholder.
Home participant's country, ISO-3166-1 alpha-2 (tennis: the player's flag). Null when unknown — normal for events without participants and for uneven feed coverage.
Away participant's country, ISO-3166-1 alpha-2 — see homeCountry.
Sport in the live-score vocabulary (soccer, tennis, baseball, politics, …) — the same word live.sport carries. For navigation use vertical (football is soccer here and football there). Null on legacy events.
"soccer"
Navigation vertical (football, tennis, crypto, politics, …) — the value ?vertical= filters on and GET /api/verticals counts. Null on legacy events.
"football"
Parent match (id, slug, title, group, stage, competition, teams, kickoffAt, state). Null for events not bound to a match: outrights, politics, and match-less fixtures such as most tennis events.
Show child attributes
Show child attributes
Tournament stage: a match-less football fixture's own, or the parent match's (then equal to match.stage). Set on match-less fixtures too, so read this rather than match.stage. A value from the match can be a competition tag (fifa_friendlies, ucl, uefa_europa_conference_league). The value ?stage= filters on.
group, r32, r16, quarter_finals, semi_finals, third_place, final, fifa_friendlies, ucl, uefa_europa_conference_league "group"
Group letter (A to L), from the same source as stage; a match-less fixture has one only on the group stage. The value ?group= filters on.
A, B, C, D, E, F, G, H, I, J, K, L "A"
Home participant — the participant field for head-to-head events, whether or not they are bound to a match. On a match-less event code may be empty and logo null — render label first. Null on outrights, tournament events and legacy rows.
Show child attributes
Show child attributes
Away participant; same semantics as teamA.
Show child attributes
Show child attributes
Effective competition (the match's, else the event's own) — set on match-less events too. Its slug is what ?competition= accepts. Null when the event has none.
Show child attributes
Show child attributes
Active tags (slug, name). Always an array; empty when the event has none.
Show child attributes
Show child attributes
Category-tab bucket folded from the markets' types (GAME_LINES, TEAM_TO_ADVANCE, EXACT_SCORE, OTHER).
Show child attributes
Show child attributes
Scheduled start time of the event. For an event bound to a match this usually equals match.kickoffAt, but may differ for partial-game props. The ISO-8601 from / to filters compare against the event's start time.
When the event's outcome was determined (full time, race end, half time for partial-game props). Null until known; unlike live, it persists after the game.
Schedule state. POSTPONED keeps markets open and sets settlesByAt; CANCELLED settles positions at fair value. Read this for the badge rather than deriving it from times.
SCHEDULED, POSTPONED, CANCELLED, PLAYED "SCHEDULED"
Reason when scheduleStatus is not SCHEDULED.
POSTPONED only: if the event is not played by this time, positions settle at fair value.
Matched notional across the event's markets over the last 24 h (USDC, decimal string).
"578.207202"
All-time matched notional across the event's markets (USDC, decimal string).
"1084.507287"
How many of the event's markets are on the open view (visible, launched PRE_MARKET / OPEN / PAUSED …). Not the tradeable count — a PAUSED market is counted and rejects orders. markets[] is view-filtered, so render counters from this field, never from markets.length.
2
How many of the event's markets the public may know exist: visible, in an open-view or closed status, and past their launch time. openMarketCount <= totalMarketCount. On GET /api/events/{slug} it equals markets.length, except on short-crypto Up/Down events, whose settled windows are capped at 3 there.
5
Creation time.
Last update time.
True when the event is in the signed-in web-app user's saved list. Always false on anonymous and API-key requests. Always present.
Live clock + score, rolled up from the markets while the fixture is in play. After the game a finished event can keep its final-score frame (provider: "final", inPlay: false). Null when there is no frame (pre-match, no live feed) and always null for POSTPONED and CANCELLED events.
Show child attributes
Show child attributes
True while the event is in play: kickoff passed, not ended, within a 4-hour window (a live frame's inPlay overrides this when one exists). Always false for abstract events such as "World Cup Winner". Use it instead of recomputing from market status or kickoff.
Short-crypto Up/Down series this event's windows belong to; null on every other event. One event holds one UTC day of windows (~96 at a 15-minute cadence) — navigate them with GET /api/crypto-series/{id}/windows rather than markets[].
Show child attributes
Show child attributes
Long-dated crypto series this event is one period of; null on every other event. periods lists sibling periods for period tabs (at most 24); GET /api/crypto-long-series/{id}/periods returns them all.
Show child attributes
Show child attributes
The event's markets in the full MarketSummaryDto shape. GET /api/events/{slug}: every visible market in any public status, closed and settled ones included (RESOLVED / VOIDED short-crypto Up/Down windows are capped at 3 per event). GET /api/events/featured: filtered like the list's open view (closed view for the finished-event fallback with team).
Show child attributes
Show child attributes