curl --request GET \
--url https://api.rivermarkets.com/v1/prices/{river_id} \
--header 'X-River-Key-Id: <api-key>' \
--header 'X-River-Signature: <api-key>' \
--header 'X-River-Timestamp: <api-key>'import requests
url = "https://api.rivermarkets.com/v1/prices/{river_id}"
headers = {
"X-River-Key-Id": "<api-key>",
"X-River-Timestamp": "<api-key>",
"X-River-Signature": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {
'X-River-Key-Id': '<api-key>',
'X-River-Timestamp': '<api-key>',
'X-River-Signature': '<api-key>'
}
};
fetch('https://api.rivermarkets.com/v1/prices/{river_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://api.rivermarkets.com/v1/prices/{river_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-River-Key-Id: <api-key>",
"X-River-Signature: <api-key>",
"X-River-Timestamp: <api-key>"
],
]);
$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.rivermarkets.com/v1/prices/{river_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-River-Key-Id", "<api-key>")
req.Header.Add("X-River-Timestamp", "<api-key>")
req.Header.Add("X-River-Signature", "<api-key>")
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.rivermarkets.com/v1/prices/{river_id}")
.header("X-River-Key-Id", "<api-key>")
.header("X-River-Timestamp", "<api-key>")
.header("X-River-Signature", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.rivermarkets.com/v1/prices/{river_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-River-Key-Id"] = '<api-key>'
request["X-River-Timestamp"] = '<api-key>'
request["X-River-Signature"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"river_id": 123,
"exchange": "<string>",
"type": "candlesticks",
"has_ohlc": false,
"candlesticks": [
{
"timestamp": 123,
"open": 123,
"high": 123,
"low": 123,
"close": 123,
"volume": 123
}
],
"history": [
{
"timestamp": 123,
"price": 123
}
]
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Get Prices
Get price data for a market.
Returns either candlestick OHLC data or simple price history based on the type parameter.
The endpoint automatically determines the exchange and fetches data accordingly.
- Kalshi: Returns real OHLC candlestick data with volume
- Polymarket: Returns price history (candlesticks will have synthetic OHLC where all values equal the price)
Kalshi and Polymarket markets whose trade history River has fully captured are served from River’s own data (real OHLC for both); the rest come from the exchange while a backfill of their history is queued.
All prices are normalized to 0-1 range.
curl --request GET \
--url https://api.rivermarkets.com/v1/prices/{river_id} \
--header 'X-River-Key-Id: <api-key>' \
--header 'X-River-Signature: <api-key>' \
--header 'X-River-Timestamp: <api-key>'import requests
url = "https://api.rivermarkets.com/v1/prices/{river_id}"
headers = {
"X-River-Key-Id": "<api-key>",
"X-River-Timestamp": "<api-key>",
"X-River-Signature": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {
'X-River-Key-Id': '<api-key>',
'X-River-Timestamp': '<api-key>',
'X-River-Signature': '<api-key>'
}
};
fetch('https://api.rivermarkets.com/v1/prices/{river_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://api.rivermarkets.com/v1/prices/{river_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-River-Key-Id: <api-key>",
"X-River-Signature: <api-key>",
"X-River-Timestamp: <api-key>"
],
]);
$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.rivermarkets.com/v1/prices/{river_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-River-Key-Id", "<api-key>")
req.Header.Add("X-River-Timestamp", "<api-key>")
req.Header.Add("X-River-Signature", "<api-key>")
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.rivermarkets.com/v1/prices/{river_id}")
.header("X-River-Key-Id", "<api-key>")
.header("X-River-Timestamp", "<api-key>")
.header("X-River-Signature", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.rivermarkets.com/v1/prices/{river_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-River-Key-Id"] = '<api-key>'
request["X-River-Timestamp"] = '<api-key>'
request["X-River-Signature"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"river_id": 123,
"exchange": "<string>",
"type": "candlesticks",
"has_ohlc": false,
"candlesticks": [
{
"timestamp": 123,
"open": 123,
"high": 123,
"low": 123,
"close": 123,
"volume": 123
}
],
"history": [
{
"timestamp": 123,
"price": 123
}
]
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Authorizations
UUID of your API key (from Settings → API Keys).
Current unix milliseconds (unix seconds also accepted). Must be within 30s of server time.
Base64 Ed25519 signature over the canonical request: METHOD\nPATH\nSORTED_QUERY\nTIMESTAMP\nSHA256(body) hex. See /api-reference/authentication for the full recipe.
Path Parameters
River market ID
Query Parameters
Response type
candlesticks, history Time range
1d, 1w, 1m, max Minutes per data point (for Polymarket history)
1 <= x <= 120Response
Successful Response

