curl --request GET \
--url https://calibri.io/api/v2/pythia/public/events/{slug}import requests
url = "https://calibri.io/api/v2/pythia/public/events/{slug}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://calibri.io/api/v2/pythia/public/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://calibri.io/api/v2/pythia/public/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://calibri.io/api/v2/pythia/public/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://calibri.io/api/v2/pythia/public/events/{slug}")
.asString();require 'uri'
require 'net/http'
url = URI("https://calibri.io/api/v2/pythia/public/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{
"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",
"kline": [
[
123
]
],
"last_price": "0.61",
"market_id": "54321",
"no_price": "0.38",
"open_at": "2026-07-21T10:00:00Z",
"order_book": {
"no_asks": [
{
"price": "0.62",
"side": "yes",
"volume": "100.50"
}
],
"no_bids": [
{
"price": "0.62",
"side": "yes",
"volume": "100.50"
}
],
"sequence": 8814,
"yes_asks": [
{
"price": "0.62",
"side": "yes",
"volume": "100.50"
}
],
"yes_bids": [
{
"price": "0.62",
"side": "yes",
"volume": "100.50"
}
]
},
"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",
"recent_contracts": [
{
"created_at": "2026-08-07T10:00:00Z",
"id": 1420,
"market_id": "12",
"price": "0.62",
"state": "active",
"taker_side": "yes",
"volume": "25.5"
}
],
"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?",
"volume_24h": "1500.25",
"yes_price": "0.62"
}
],
"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?"
}{
"errors": [
"order.not_found"
]
}{
"errors": [
"order.not_found"
]
}Event by slug
One event with its markets — the same object as a list element. Falls back to MySQL for older windows that have left the live cache, so bookmarked and historical links keep resolving.
include bundles the per-market live data the event page
otherwise fetches one call at a time. The first include_limit
markets (in response order) each gain order_book, kline and/or
recent_contracts, holding exactly what the standalone
/public/markets/{id}/order-book, /k-line and /contracts/recent
routes return (the book also carries its sequence). Markets past
the limit carry none of them. Without include the response is the
plain event.
curl --request GET \
--url https://calibri.io/api/v2/pythia/public/events/{slug}import requests
url = "https://calibri.io/api/v2/pythia/public/events/{slug}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://calibri.io/api/v2/pythia/public/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://calibri.io/api/v2/pythia/public/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://calibri.io/api/v2/pythia/public/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://calibri.io/api/v2/pythia/public/events/{slug}")
.asString();require 'uri'
require 'net/http'
url = URI("https://calibri.io/api/v2/pythia/public/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{
"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",
"kline": [
[
123
]
],
"last_price": "0.61",
"market_id": "54321",
"no_price": "0.38",
"open_at": "2026-07-21T10:00:00Z",
"order_book": {
"no_asks": [
{
"price": "0.62",
"side": "yes",
"volume": "100.50"
}
],
"no_bids": [
{
"price": "0.62",
"side": "yes",
"volume": "100.50"
}
],
"sequence": 8814,
"yes_asks": [
{
"price": "0.62",
"side": "yes",
"volume": "100.50"
}
],
"yes_bids": [
{
"price": "0.62",
"side": "yes",
"volume": "100.50"
}
]
},
"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",
"recent_contracts": [
{
"created_at": "2026-08-07T10:00:00Z",
"id": 1420,
"market_id": "12",
"price": "0.62",
"state": "active",
"taker_side": "yes",
"volume": "25.5"
}
],
"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?",
"volume_24h": "1500.25",
"yes_price": "0.62"
}
],
"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?"
}{
"errors": [
"order.not_found"
]
}{
"errors": [
"order.not_found"
]
}Path Parameters
Event slug
Query Parameters
Order of markets[]: default (operator rank, else probability desc), az or za
Comma list of books, recent, klines; unknown names are ignored
How many leading markets get the bundle, 1-12 (default 6)
k-line period in minutes, as /k-line takes it (default 1)
k-line rows, 1-10000 (default 30)
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?"