curl --request GET \
--url https://market-uat.dimetrades.com/api/price-historyimport requests
url = "https://market-uat.dimetrades.com/api/price-history"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://market-uat.dimetrades.com/api/price-history', 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://market-uat.dimetrades.com/api/price-history",
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://market-uat.dimetrades.com/api/price-history"
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://market-uat.dimetrades.com/api/price-history")
.asString();require 'uri'
require 'net/http'
url = URI("https://market-uat.dimetrades.com/api/price-history")
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{
"symbol": "BTC",
"category": "crypto",
"history": [
{
"symbol": "BTC",
"provider": "PYTH",
"price": 63120.45,
"priceChange24h": -812.3,
"priceChangePercent24h": -1.27,
"high24h": 64500,
"low24h": 62780.1,
"volume24h": 41230.88,
"timestamp": 1753776000000
}
]
}Historical prices for an underlying symbol
Historical prices for a crypto, financial or commodity underlying —
the reference instrument a market resolves against (BTC), not the
prediction market itself. For a market’s own implied-probability curve use
GET /forecast/markets/{marketId}/forecast_history.
One endpoint, two response shapes
The presence of interval changes what you get back:
| Request | Response body | Element |
|---|---|---|
no interval | { symbol, category, history } | PriceTick |
interval set | { symbol, category, interval, candles } | Candle |
They are not interchangeable — ticks timestamp with timestamp, candles
with ts. Decide which you want up front rather than branching on the
response.
Ticks are silently downsampled by span
Without interval, the service thins the series based on how wide your
window is, keeping the last tick in each bucket:
| Requested span | Resolution returned |
|---|---|
| ≤ 30 minutes | every tick, unthinned |
| ≤ 6 hours | 1 minute |
| ≤ 24 hours | 5 minutes |
| ≤ 7 days | 1 hour |
| > 7 days | 1 day |
This is applied automatically and is not reported in the response, so a
week-long request returning ~168 points is expected, not truncated data.
Setting interval disables it — candles are aggregated at exactly the
interval you asked for, at whatever cost in points.
Storage tiers
The trailing 24 hours are served from Redis; anything older comes from
Postgres. The switch is decided by start alone — a start older than 24
hours sends the entire query to Postgres, including its recent portion.
Expect higher latency on long windows.
Timestamp units
start and end are in seconds. Every timestamp in the response body
is in milliseconds. This asymmetry is easy to trip over.
No authentication
Underlying price data is public. No bearer token is required.
curl --request GET \
--url https://market-uat.dimetrades.com/api/price-historyimport requests
url = "https://market-uat.dimetrades.com/api/price-history"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://market-uat.dimetrades.com/api/price-history', 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://market-uat.dimetrades.com/api/price-history",
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://market-uat.dimetrades.com/api/price-history"
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://market-uat.dimetrades.com/api/price-history")
.asString();require 'uri'
require 'net/http'
url = URI("https://market-uat.dimetrades.com/api/price-history")
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{
"symbol": "BTC",
"category": "crypto",
"history": [
{
"symbol": "BTC",
"provider": "PYTH",
"price": 63120.45,
"priceChange24h": -812.3,
"priceChangePercent24h": -1.27,
"high24h": 64500,
"low24h": 62780.1,
"volume24h": 41230.88,
"timestamp": 1753776000000
}
]
}Query Parameters
Instrument symbol; upper-cased server-side. Standard asset symbol (BTC, ETH, SOL). Both base symbols and legacy notation (BTCUSDT) are normalized server-side. An unknown symbol is not an error: it returns 200 with an empty series.
Which price feed to read. Lower-cased server-side. Must match the symbol's actual feed — asking for a crypto symbol under commodities returns an empty series rather than an error.
crypto, financials, commodities Window start, as either an ISO-8601 instant (2026-08-10T17:00:00Z) or bare unix seconds (1754845200). Defaults to 24 hours ago.
Window end, same formats as start. Defaults to now. Must be greater than or equal to start.
Aggregate into OHLCV candles of this width instead of returning ticks. Omit for raw (auto-downsampled) ticks. Note 1M is month and 1m is minute — the case is significant.
1m, 5m, 15m, 1h, 1d, 1w, 1M json (default) or csv. CSV returns text/csv as a file attachment named <SYMBOL>-<timestamp>.csv, or <SYMBOL>-<interval>-<timestamp>.csv for candles.
json, csv Response
Price history. Body shape depends on whether interval was supplied; format=csv returns text/csv instead.
