Feed catalog
curl --request GET \
--url https://api.oddpool.com/feeds/catalogimport requests
url = "https://api.oddpool.com/feeds/catalog"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.oddpool.com/feeds/catalog', 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://api.oddpool.com/feeds/catalog",
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://api.oddpool.com/feeds/catalog"
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://api.oddpool.com/feeds/catalog")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.oddpool.com/feeds/catalog")
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_bodyWebSocket feeds
Feed catalog
Discover available events and the exact channel names to subscribe to.
GET
/
feeds
/
catalog
Feed catalog
curl --request GET \
--url https://api.oddpool.com/feeds/catalogimport requests
url = "https://api.oddpool.com/feeds/catalog"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.oddpool.com/feeds/catalog', 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://api.oddpool.com/feeds/catalog",
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://api.oddpool.com/feeds/catalog"
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://api.oddpool.com/feeds/catalog")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.oddpool.com/feeds/catalog")
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_bodyList all available feed events, grouped by feed vertical. Returns event keys, venues, outcome counts, and pre-built channel names.
Response with
Adds
Use Response with
Replaces the integer
When
Get a single event with its full outcome list, ready-to-paste subscribe array, and per-outcome channel names.
Returns a stable dictionary mapping each
Parameters
string
default:"all"
Filter by feed vertical:
macro, crypto, or weather.string
default:"all"
Filter by event status:
active, upcoming, or resolved. Useful for crypto feeds where hundreds of short-lived events accumulate — use status=active to get only live events.string
default:""
Opt-in expansions, comma-separated. Supported values:
channels— adds a ready-to-pastesubscribe_allarray to each event listing every channel you’d subscribe to.outcomes— replaces the integeroutcomescount with the full outcome list (same shape as the single-event endpoint).*— all expansions.
expand=channels to skip the second API call.Example
# All active crypto events
curl -H "X-API-Key: oddpool_..." \
"https://api.oddpool.com/feeds/catalog?feed=crypto&status=active"
# Macro events with ready-to-paste subscribe arrays
curl -H "X-API-Key: oddpool_..." \
"https://api.oddpool.com/feeds/catalog?feed=macro&expand=channels"
Response (default)
{
"feeds": {
"macro": {
"description": "Cross-venue macro economic prediction markets",
"events": [
{
"event_key": "fomc-2026-06-17",
"title": "FOMC June 2026",
"type": "fomc",
"event_date": "2026-06-17",
"release_at": "2026-06-17T17:59:00+00:00",
"status": "active",
"venues": ["kalshi", "polymarket"],
"outcomes": 5,
"channels": {
"dist": "dist:fomc-2026-06-17",
"snapshot": "snapshot:fomc-2026-06-17",
"book": "book:fomc-2026-06-17:{outcome_key}",
"trade": "trade:fomc-2026-06-17:{outcome_key}"
}
}
]
}
}
}
| Field | Description |
|---|---|
event_key | Unique identifier for the event. Use this in channel subscriptions. |
event_date | Calendar date of the release (YYYY-MM-DD). |
release_at | Full ISO 8601 timestamp with timezone for the actual release moment. CPI is 8:30 ET (12:30 UTC), FOMC is 14:00 ET, etc. Use this for scheduling and timing logic. |
venues | Which prediction market venues have outcomes configured for this event. Caveat: this reflects “configured” not “currently quoting”. An event listing both venues may have one quiet venue with no live book. |
outcomes | Number of outcomes (default) OR full outcome array (with expand=outcomes). |
enrichment | External data source attached to every message. Only present for enriched feeds ("binance" for crypto). Macro events do not have this field. |
channels.dist | Event-level — subscribe to this single channel to get the joint cross-venue distribution for all outcomes. Free tier. |
channels.snapshot | Event-level — full state reset every 60s. Pro tier. |
channels.book / channels.trade | Templates with {outcome_key} placeholder. Per-outcome channels — replace the placeholder with a value from expand=outcomes or the single-event endpoint. Pro tier. |
Response with ?expand=channels
Adds subscribe_all to each event — a ready-to-paste array of every channel for that event:
{
"event_key": "fomc-2026-06-17",
"channels": {
"dist": "dist:fomc-2026-06-17",
"snapshot": "snapshot:fomc-2026-06-17",
"book": "book:fomc-2026-06-17:{outcome_key}",
"trade": "trade:fomc-2026-06-17:{outcome_key}",
"subscribe_all": [
"dist:fomc-2026-06-17",
"snapshot:fomc-2026-06-17",
"book:fomc-2026-06-17:cut_50",
"book:fomc-2026-06-17:cut_25",
"book:fomc-2026-06-17:hold",
"book:fomc-2026-06-17:hike_25",
"book:fomc-2026-06-17:hike_50",
"trade:fomc-2026-06-17:cut_50",
"trade:fomc-2026-06-17:cut_25",
"trade:fomc-2026-06-17:hold",
"trade:fomc-2026-06-17:hike_25",
"trade:fomc-2026-06-17:hike_50"
]
}
}
subscribe_all directly as the channels field of your WebSocket subscribe action. No more N+1 lookup for outcome keys.
Response with ?expand=outcomes
Replaces the integer outcomes count with the full outcome array (same shape as the single-event endpoint):
{
"event_key": "fomc-2026-06-17",
"outcome_count": 5,
"outcomes": [
{
"outcome_key": "hold",
"label": "Fed maintains rate",
"venues": ["kalshi", "polymarket"],
"channels": {
"book": "book:fomc-2026-06-17:hold",
"trade": "trade:fomc-2026-06-17:hold"
}
},
"..."
]
}
expand=outcomes is set, both outcomes (array) and outcome_count (number) are returned. Without expand, only outcomes (number) is returned.
Get single event
GET https://api.oddpool.com/feeds/catalog/{event_key}
Example
curl -H "X-API-Key: oddpool_..." \
"https://api.oddpool.com/feeds/catalog/fomc-2026-06-17"
Response
{
"event_key": "fomc-2026-06-17",
"title": "FOMC June 2026",
"type": "fomc",
"feed": "macro",
"event_date": "2026-06-17",
"release_at": "2026-06-17T17:59:00+00:00",
"status": "active",
"venues": ["kalshi", "polymarket"],
"outcome_count": 5,
"outcomes": [
{
"outcome_key": "hold",
"label": "Fed maintains rate",
"venues": ["kalshi", "polymarket"],
"channels": {
"book": "book:fomc-2026-06-17:hold",
"trade": "trade:fomc-2026-06-17:hold"
}
},
{
"outcome_key": "cut_25",
"label": "Cut 25bps",
"venues": ["kalshi", "polymarket"],
"channels": {
"book": "book:fomc-2026-06-17:cut_25",
"trade": "trade:fomc-2026-06-17:cut_25"
}
}
],
"channels": {
"dist": "dist:fomc-2026-06-17",
"snapshot": "snapshot:fomc-2026-06-17",
"book": "book:fomc-2026-06-17:{outcome_key}",
"trade": "trade:fomc-2026-06-17:{outcome_key}",
"subscribe_all": [
"dist:fomc-2026-06-17",
"snapshot:fomc-2026-06-17",
"book:fomc-2026-06-17:hold",
"...": "..."
]
}
}
Decode event types
GET https://api.oddpool.com/feeds/event-types
event_type token (e.g., cpi, fomc, nfp) to human-readable label, description, publishing agency, typical release time + timezone, source URL, and category. Use this to interpret event_type values without prior macro-economic knowledge.
Example
curl -H "X-API-Key: oddpool_..." "https://api.oddpool.com/feeds/event-types"
Response
{
"event_types": {
"cpi": {
"label": "Consumer Price Index",
"description": "US headline inflation. Measures the month-over-month or year-over-year change in a basket of consumer goods and services.",
"agency": "Bureau of Labor Statistics",
"release_local_time": "08:30",
"timezone": "America/New_York",
"release_url": "https://www.bls.gov/cpi/",
"category": "inflation",
"vertical": "macro"
},
"fomc": {
"label": "FOMC Rate Decision",
"description": "Federal Open Market Committee policy decision on the federal funds rate target range. Eight scheduled meetings per year.",
"agency": "Federal Reserve",
"release_local_time": "14:00",
"timezone": "America/New_York",
"release_url": "https://www.federalreserve.gov/monetarypolicy/fomccalendars.htm",
"category": "monetary_policy",
"vertical": "macro"
}
}
}
| Field | Description |
|---|---|
label | Human-readable name. Use in dashboards. |
description | One-paragraph plain-English explanation. |
agency | Who publishes the data. |
release_local_time | Time-of-day at which releases typically drop, in the named timezone. null for continuous markets (crypto). |
timezone | IANA timezone identifier for release_local_time. |
category | Higher-level grouping (inflation, employment, growth, monetary_policy, markets, crypto, weather). |
vertical | Which feed= filter this type belongs to. |