curl --request GET \
--url https://calibri.io/api/v2/pythia/public/eventsimport requests
url = "https://calibri.io/api/v2/pythia/public/events"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://calibri.io/api/v2/pythia/public/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://calibri.io/api/v2/pythia/public/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://calibri.io/api/v2/pythia/public/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://calibri.io/api/v2/pythia/public/events")
.asString();require 'uri'
require 'net/http'
url = URI("https://calibri.io/api/v2/pythia/public/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[
{
"category": "crypto",
"created_at": "2026-08-07T10:00:00Z",
"description": "Resolves from the final Coinbase BTC-USD trade price before the close date.",
"display_type": "probability",
"effective_taker_fee_rate_bps": 200,
"featured": false,
"id": 12345,
"image_url": "https://cdn.calibri.io/events/btc-70k.png",
"markets": [
{
"category": "crypto",
"close_at": "2026-07-22T18:00:00Z",
"ctf_no_token_id": "9876543210987654321098765432109876543210",
"ctf_yes_token_id": "1234567890123456789012345678901234567890",
"description": "Resolves YES if the Coinbase BTC-USD close on 31 Dec 2026 is above $70,000.",
"determination_at": "2026-07-23T10:00:00Z",
"event_id": 12345,
"event_rank": 1,
"event_slug": "btc-above-70k-december-2026",
"event_title": "Will BTC close above $70,000 on 31 Dec 2026?",
"group_item_title": "Above $70,000",
"id": 54321,
"image_url": "https://cdn.calibri.io/markets/btc-70k.png",
"market_id": "54321",
"open_at": "2026-07-21T10:00:00Z",
"outcome_labels": [
"<string>"
],
"price_settlement": {
"candle_start": "2026-07-22T18:00:00Z",
"close": 69200.5,
"granularity_seconds": 300,
"open": 68500.75,
"symbol": "BTC-USD",
"tie": false
},
"price_target": {
"cap_strike": 77500,
"comparator": "gte",
"floor_strike": 75000,
"threshold": 77000
},
"quote_currency": "usdc",
"resolution_source": "Coinbase BTC-USD",
"result": "yes",
"rules": "Settles on the final Coinbase BTC-USD trade price before 23:59:59 UTC.",
"settlement_panel": {
"description": "First consult these sources",
"entries": [
{
"name": "Coinbase",
"tier": "primary",
"url": "https://www.coinbase.com/price/bitcoin"
}
],
"id": 456,
"inherited_from_series": false,
"name": "Primary Sources",
"terms_url": "https://calibri.io/hub/terms-of-use"
},
"status": "active",
"terms": {
"cap_strike": 77500,
"floor_strike": 70000,
"kind": "threshold",
"measure": {
"at": "2026-09-17T00:00:00Z",
"basis": "close",
"granularity_seconds": 60,
"window_start": "2026-09-16T16:00:00Z"
},
"settles_on": "coinbase_spot",
"strike_type": "greater_equal",
"underlying": {
"source": "coinbase",
"symbol": "BTC-USD"
}
},
"title": "Will BTC close above $70,000 on 31 Dec 2026?"
}
],
"outcome_structure": "independent",
"price_feed": [
123
],
"series": {
"frequency": "daily",
"generated": true,
"id": 789,
"slug": "daily-btc-close",
"title": "Daily BTC Close"
},
"slug": "btc-above-70k-december-2026",
"status": "active",
"subcategory": {
"icon": "SportsSoccer",
"id": 15,
"label": "Soccer",
"parent": {
"icon": "SportsSoccer",
"id": 10,
"label": "Sports",
"slug": "sports"
},
"slug": "soccer"
},
"tags": [
{
"id": 111,
"label": "Wimbledon",
"slug": "wimbledon"
}
],
"taker_fee_rate_bps_override": 200,
"title": "Will BTC close above $70,000 on 31 Dec 2026?"
}
]List events
The catalogue of events, each with its child markets.
A generated or sub-daily series is COLLAPSED to a single entry — a
five-minute feed publishes 288 events a day and must not fill the feed.
Pass series to drill into one and get its individual windows; that is
the only way to see them.
curl --request GET \
--url https://calibri.io/api/v2/pythia/public/eventsimport requests
url = "https://calibri.io/api/v2/pythia/public/events"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://calibri.io/api/v2/pythia/public/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://calibri.io/api/v2/pythia/public/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://calibri.io/api/v2/pythia/public/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://calibri.io/api/v2/pythia/public/events")
.asString();require 'uri'
require 'net/http'
url = URI("https://calibri.io/api/v2/pythia/public/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[
{
"category": "crypto",
"created_at": "2026-08-07T10:00:00Z",
"description": "Resolves from the final Coinbase BTC-USD trade price before the close date.",
"display_type": "probability",
"effective_taker_fee_rate_bps": 200,
"featured": false,
"id": 12345,
"image_url": "https://cdn.calibri.io/events/btc-70k.png",
"markets": [
{
"category": "crypto",
"close_at": "2026-07-22T18:00:00Z",
"ctf_no_token_id": "9876543210987654321098765432109876543210",
"ctf_yes_token_id": "1234567890123456789012345678901234567890",
"description": "Resolves YES if the Coinbase BTC-USD close on 31 Dec 2026 is above $70,000.",
"determination_at": "2026-07-23T10:00:00Z",
"event_id": 12345,
"event_rank": 1,
"event_slug": "btc-above-70k-december-2026",
"event_title": "Will BTC close above $70,000 on 31 Dec 2026?",
"group_item_title": "Above $70,000",
"id": 54321,
"image_url": "https://cdn.calibri.io/markets/btc-70k.png",
"market_id": "54321",
"open_at": "2026-07-21T10:00:00Z",
"outcome_labels": [
"<string>"
],
"price_settlement": {
"candle_start": "2026-07-22T18:00:00Z",
"close": 69200.5,
"granularity_seconds": 300,
"open": 68500.75,
"symbol": "BTC-USD",
"tie": false
},
"price_target": {
"cap_strike": 77500,
"comparator": "gte",
"floor_strike": 75000,
"threshold": 77000
},
"quote_currency": "usdc",
"resolution_source": "Coinbase BTC-USD",
"result": "yes",
"rules": "Settles on the final Coinbase BTC-USD trade price before 23:59:59 UTC.",
"settlement_panel": {
"description": "First consult these sources",
"entries": [
{
"name": "Coinbase",
"tier": "primary",
"url": "https://www.coinbase.com/price/bitcoin"
}
],
"id": 456,
"inherited_from_series": false,
"name": "Primary Sources",
"terms_url": "https://calibri.io/hub/terms-of-use"
},
"status": "active",
"terms": {
"cap_strike": 77500,
"floor_strike": 70000,
"kind": "threshold",
"measure": {
"at": "2026-09-17T00:00:00Z",
"basis": "close",
"granularity_seconds": 60,
"window_start": "2026-09-16T16:00:00Z"
},
"settles_on": "coinbase_spot",
"strike_type": "greater_equal",
"underlying": {
"source": "coinbase",
"symbol": "BTC-USD"
}
},
"title": "Will BTC close above $70,000 on 31 Dec 2026?"
}
],
"outcome_structure": "independent",
"price_feed": [
123
],
"series": {
"frequency": "daily",
"generated": true,
"id": 789,
"slug": "daily-btc-close",
"title": "Daily BTC Close"
},
"slug": "btc-above-70k-december-2026",
"status": "active",
"subcategory": {
"icon": "SportsSoccer",
"id": 15,
"label": "Soccer",
"parent": {
"icon": "SportsSoccer",
"id": 10,
"label": "Sports",
"slug": "sports"
},
"slug": "soccer"
},
"tags": [
{
"id": 111,
"label": "Wimbledon",
"slug": "wimbledon"
}
],
"taker_fee_rate_bps_override": 200,
"title": "Will BTC close above $70,000 on 31 Dec 2026?"
}
]Query Parameters
Filter by category
Filter by status. resolved covers determined and settled
Filter to one tag slug
Filter to one series slug. Expands it rather than collapsing
Filter to one sub-category slug, e.g. tennis
Filter by series cadence, e.g. daily / weekly / monthly
Sort order, e.g. newest
Reverse the sort
Order of markets[] within each event
Page size, applied after collapsing
slim reduces each event and market to the card fields (see api.SlimEvent); anything else returns the full object
Response
OK
"crypto"
CreatedAt (RFC3339, from events.created_at) backs the "newest" list sort. Before it was surfaced, "newest" fell back to id DESC.
"2026-08-07T10:00:00Z"
"Resolves from the final Coinbase BTC-USD trade price before the close date."
DisplayType (events.display_type) picks the chart SOURCE, not the market shape: "probability" (default) plots the markets' own YES probability, "price_feed" plots an underlying feed with a reference line.
"probability"
EffectiveTakerFeeRateBps is the resolved fee rate the matching engine will charge for trades in any of this event's markets. Computed at load time as: COALESCE(override, category default). NULL/nil means UNRESOLVED — no override and no fee_categories row for the category — which order placement rejects (distinct from a resolved 0 = free). Read-only — not persisted as its own column.
200
false
12345
"https://cdn.calibri.io/events/btc-70k.png"
Show child attributes
Show child attributes
OutcomeStructure (events.outcome_structure) says how this event's markets relate to one another. It selects the frontend layout and is deliberately NOT derivable from len(Markets) — a contender race, a strike ladder and a fixture's derivative bundle can all carry a dozen markets and none of them renders like the others.
independent — one question, or several unrelated ones (the default) one_winner — at most one market resolves YES; ranked, sums to ~100% ladder — nested thresholds over one variable ("above $100k", "above $110k"). Several legs resolve YES together so it is not one_winner, but the legs are nested so it is not independent either: prices fall monotonically down the ladder, ordered by markets.event_rank.
Kalshi carries the same three as MECNET / DIRECNET / none.
Display + validation only. Neither Kalshi's collateral netting nor Polymarket's NegRiskAdapter is implemented on our side.
"independent"
PriceFeed (events.price_feed) carries {source, symbol, reference_price} for the price_feed layout. Passed through opaquely — pythia never interprets it. nil when unset.
Series is the FEED this event came from — Polymarket's atp / mls-2025,
Kalshi's series_ticker. Usually absent: a one-off competition has no feed
behind it, and Polymarket returns series: [] on every Wimbledon event
including the matches. Omitted from JSON when unset.
Show child attributes
Show child attributes
"btc-above-70k-december-2026"
"active"
Subcategory is the browse SUBJECT — the leaf of the two-level category tree, carrying its parent for a breadcrumb. Exactly one per event and often absent, because an event may sit directly under its top-level category.
Not a replacement for Category above: that stays the fee key. This is what the browse chips and the /categories drilldown are built from.
Show child attributes
Show child attributes
Tags are the editorial SHELVES this event sits on — what puts it on a hub page. Many-to-many and deliberately not taxonomic: "Wimbledon" collects the men's winner race, the women's winner race and every match, which share no series and no outcome structure. Always present (possibly empty) so the frontend need not nil-check.
Show child attributes
Show child attributes
TakerFeeRateBpsOverride mirrors events.taker_fee_rate_bps_override (NULL = inherit from category default, or global default if no category row). Persisted to the DB; included in JSON for admin consumers.
200
"Will BTC close above $70,000 on 31 Dec 2026?"