curl --request GET \
--url https://hip4-api.totalis.trade/v1/markets/{outcome_id}import requests
url = "https://hip4-api.totalis.trade/v1/markets/{outcome_id}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://hip4-api.totalis.trade/v1/markets/{outcome_id}', 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://hip4-api.totalis.trade/v1/markets/{outcome_id}",
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://hip4-api.totalis.trade/v1/markets/{outcome_id}"
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://hip4-api.totalis.trade/v1/markets/{outcome_id}")
.asString();require 'uri'
require 'net/http'
url = URI("https://hip4-api.totalis.trade/v1/markets/{outcome_id}")
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{
"catalog_generation": "6100",
"market": {
"outcome_id": "1209",
"native_question_id": null,
"title": "HYPE touches 100 by 20261001-0000",
"state": "ACTIVE",
"result": {
"availability": "AVAILABLE",
"result_state": "UNRESOLVED"
},
"metadata_revision": "6100",
"eligibility": {
"state": "ENABLED"
},
"category": "Crypto",
"subcategory": "other",
"sides": [
{
"side": "YES",
"coin": "#12090",
"reference": {
"availability": "AVAILABLE",
"quality": "BOOK_MID",
"value": "240800000000000000",
"best_bid": "238600000000000000",
"best_ask": "243000000000000000",
"scale": "1000000000000000000",
"freshness": "FRESH",
"received_at": "2026-09-26T19:59:25.086007173Z"
}
},
{
"side": "NO",
"coin": "#12091",
"reference": {
"availability": "AVAILABLE",
"quality": "BOOK_MID",
"value": "759200000000000000",
"best_bid": "757000000000000000",
"best_ask": "761400000000000000",
"scale": "1000000000000000000",
"freshness": "FRESH",
"received_at": "2026-09-26T19:59:25.086007173Z"
}
}
],
"dates": {
"event": null,
"result_by": null,
"resolves_after": null,
"scheduled_event_at": null,
"observation_ends_at": "1790812800",
"market_class": "PRICE_TOUCH"
}
},
"question": null,
"series_id": "f373fade6a46dc0e",
"metadata": {
"content": {
"title": "HYPE touches 100 by 20261001-0000",
"rules": "The market resolves to Yes if the HYPE price touches 100 at or before 20261001-0000, and otherwise resolves to No. The price counts as touched once the 1-second TWAP of HYPE-USDC perp mark price equals or crosses 100 at any time after this market is deployed and at or before 20261001-0000; the market can settle as soon as a touch occurs. If HYPE is delisted before this market settles, the HYPE settlement price at delisting counts as the final price for the touch determination, and the market can settle at delisting if the price has not touched 100 by then. metadata=category:price|subCategory:N/A|semanticRestriction:This market must refer to the price of a Hyperliquid perp."
},
"parent": null,
"sides": [
{
"side": "YES",
"label": "Yes"
},
{
"side": "NO",
"label": "No"
}
]
},
"recurring_round": null,
"stats": {
"volume_24h": "18240500000",
"open_interest": "52000000000"
},
"updated_at": "2026-09-26T19:59:25.086007173Z"
}{
"error": {
"code": "INVALID_REQUEST",
"field_violations": [
{
"code": "REQUIRED",
"field": "<string>"
}
],
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry": "NEVER"
}
}{
"error": {
"code": "INVALID_REQUEST",
"field_violations": [
{
"code": "REQUIRED",
"field": "<string>"
}
],
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry": "NEVER"
}
}{
"error": {
"code": "INVALID_REQUEST",
"field_violations": [
{
"code": "REQUIRED",
"field": "<string>"
}
],
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry": "NEVER"
}
}Get market
Get one market with its YES and NO sides, product details, current round and 24-hour stats.
No API key required.
curl --request GET \
--url https://hip4-api.totalis.trade/v1/markets/{outcome_id}import requests
url = "https://hip4-api.totalis.trade/v1/markets/{outcome_id}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://hip4-api.totalis.trade/v1/markets/{outcome_id}', 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://hip4-api.totalis.trade/v1/markets/{outcome_id}",
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://hip4-api.totalis.trade/v1/markets/{outcome_id}"
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://hip4-api.totalis.trade/v1/markets/{outcome_id}")
.asString();require 'uri'
require 'net/http'
url = URI("https://hip4-api.totalis.trade/v1/markets/{outcome_id}")
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{
"catalog_generation": "6100",
"market": {
"outcome_id": "1209",
"native_question_id": null,
"title": "HYPE touches 100 by 20261001-0000",
"state": "ACTIVE",
"result": {
"availability": "AVAILABLE",
"result_state": "UNRESOLVED"
},
"metadata_revision": "6100",
"eligibility": {
"state": "ENABLED"
},
"category": "Crypto",
"subcategory": "other",
"sides": [
{
"side": "YES",
"coin": "#12090",
"reference": {
"availability": "AVAILABLE",
"quality": "BOOK_MID",
"value": "240800000000000000",
"best_bid": "238600000000000000",
"best_ask": "243000000000000000",
"scale": "1000000000000000000",
"freshness": "FRESH",
"received_at": "2026-09-26T19:59:25.086007173Z"
}
},
{
"side": "NO",
"coin": "#12091",
"reference": {
"availability": "AVAILABLE",
"quality": "BOOK_MID",
"value": "759200000000000000",
"best_bid": "757000000000000000",
"best_ask": "761400000000000000",
"scale": "1000000000000000000",
"freshness": "FRESH",
"received_at": "2026-09-26T19:59:25.086007173Z"
}
}
],
"dates": {
"event": null,
"result_by": null,
"resolves_after": null,
"scheduled_event_at": null,
"observation_ends_at": "1790812800",
"market_class": "PRICE_TOUCH"
}
},
"question": null,
"series_id": "f373fade6a46dc0e",
"metadata": {
"content": {
"title": "HYPE touches 100 by 20261001-0000",
"rules": "The market resolves to Yes if the HYPE price touches 100 at or before 20261001-0000, and otherwise resolves to No. The price counts as touched once the 1-second TWAP of HYPE-USDC perp mark price equals or crosses 100 at any time after this market is deployed and at or before 20261001-0000; the market can settle as soon as a touch occurs. If HYPE is delisted before this market settles, the HYPE settlement price at delisting counts as the final price for the touch determination, and the market can settle at delisting if the price has not touched 100 by then. metadata=category:price|subCategory:N/A|semanticRestriction:This market must refer to the price of a Hyperliquid perp."
},
"parent": null,
"sides": [
{
"side": "YES",
"label": "Yes"
},
{
"side": "NO",
"label": "No"
}
]
},
"recurring_round": null,
"stats": {
"volume_24h": "18240500000",
"open_interest": "52000000000"
},
"updated_at": "2026-09-26T19:59:25.086007173Z"
}{
"error": {
"code": "INVALID_REQUEST",
"field_violations": [
{
"code": "REQUIRED",
"field": "<string>"
}
],
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry": "NEVER"
}
}{
"error": {
"code": "INVALID_REQUEST",
"field_violations": [
{
"code": "REQUIRED",
"field": "<string>"
}
],
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry": "NEVER"
}
}{
"error": {
"code": "INVALID_REQUEST",
"field_violations": [
{
"code": "REQUIRED",
"field": "<string>"
}
],
"message": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry": "NEVER"
}
}Path Parameters
HIP-4 outcome ID of the market, as a decimal string.
10^(0|[1-9][0-9]{0,8}|[1-3][0-9]{9}|4[01][0-9]{8}|42[0-8][0-9]{7}|429[0-3][0-9]{6}|4294[0-8][0-9]{5}|42949[0-5][0-9]{4}|429496[0-6][0-9]{3}|4294967[0-1][0-9]{2}|42949672[0-8][0-9]|429496729[0-5])$Query Parameters
Browse contract of the detail. 4 adds game, the market's game with up to 256 current members, and series_id for IPO ladder members; 2, 3 or omitted return the earlier detail. Only this query parameter selects it, so a browser read needs no CORS preflight; the X-Totalis-Browse-Contract header is ignored on this route. Repeated, malformed or other values return 400 UNSUPPORTED_BROWSE_CONTRACT.
2, 3, 4 Response
The market with its YES and NO sides, product details, current round and 24-hour stats.
Catalog generation the market, question and metadata were read from.
19^[1-9][0-9]*$The market with its current references, eligibility and result.
Show child attributes
Show child attributes
Parent question with all of its markets; null for a standalone market.
Show child attributes
Show child attributes
Key of the series this standalone market belongs to, the series_id of the series read; set even while it is the only listed member. A binaryPrice or priceTouch market always carries it; a companyIpoFirstDayMarketCap market only when the contract=4 query parameter selects browse contract 4. Null for every other market.
^[0-9a-f]{16}$Display title and rules of the market, its sides and its parent question, read at the same catalog generation as market.
Show child attributes
Show child attributes
The recurring round the market belongs to, with its recorded neighbours; null for a market outside a recurring series or a round whose recorded definition is withheld.
Show child attributes
Show child attributes
This market's 24h volume and open interest; null until a current stats snapshot has a row for it.
Show child attributes
Show child attributes
Latest change to the market's catalog record, native result or reference prices, RFC 3339 UTC.
30^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}([.][0-9]{1,9})?Z$Present only when the contract=4 query parameter selects browse contract 4: the game this standalone market belongs to with up to 256 current members, or null when it has none, is its only current member or has more active members than 256. Absent otherwise.
Show child attributes
Show child attributes
Was this page helpful?

