curl --request PATCH \
--url https://api.rivermarkets.com/v1/generic-assets/{generic_asset_id} \
--header 'Content-Type: application/json' \
--header 'X-River-Key-Id: <api-key>' \
--header 'X-River-Org-Id: <api-key>' \
--header 'X-River-Signature: <api-key>' \
--header 'X-River-Timestamp: <api-key>' \
--data '
{
"name": "<string>",
"description": "<string>"
}
'import requests
url = "https://api.rivermarkets.com/v1/generic-assets/{generic_asset_id}"
payload = {
"name": "<string>",
"description": "<string>"
}
headers = {
"X-River-Key-Id": "<api-key>",
"X-River-Timestamp": "<api-key>",
"X-River-Signature": "<api-key>",
"X-River-Org-Id": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {
'X-River-Key-Id': '<api-key>',
'X-River-Timestamp': '<api-key>',
'X-River-Signature': '<api-key>',
'X-River-Org-Id': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({name: '<string>', description: '<string>'})
};
fetch('https://api.rivermarkets.com/v1/generic-assets/{generic_asset_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/generic-assets/{generic_asset_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'description' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-River-Key-Id: <api-key>",
"X-River-Org-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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.rivermarkets.com/v1/generic-assets/{generic_asset_id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"description\": \"<string>\"\n}")
req, _ := http.NewRequest("PATCH", url, payload)
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>")
req.Header.Add("X-River-Org-Id", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://api.rivermarkets.com/v1/generic-assets/{generic_asset_id}")
.header("X-River-Key-Id", "<api-key>")
.header("X-River-Timestamp", "<api-key>")
.header("X-River-Signature", "<api-key>")
.header("X-River-Org-Id", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"description\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.rivermarkets.com/v1/generic-assets/{generic_asset_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["X-River-Key-Id"] = '<api-key>'
request["X-River-Timestamp"] = '<api-key>'
request["X-River-Signature"] = '<api-key>'
request["X-River-Org-Id"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"description\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"generic_asset_id": "<string>",
"name": "<string>",
"river_ids": [
123
],
"inserted_at": "<string>",
"asset_type": "<string>",
"period": "<string>",
"metric": "<string>",
"entity_id": "<string>",
"side": "<string>",
"strike": 123,
"description": "<string>",
"category": "<string>",
"subcategory": "<string>",
"resolves_at": "<string>",
"start_datetime": "<string>",
"owner_subaccount_id": "<string>",
"status": "<string>",
"match_type": "<string>",
"event": {
"event_id": "<string>",
"series": "<string>",
"start": "<string>",
"title": "<string>",
"participants": [
{
"entity": {
"entity_id": "<string>",
"name": "<string>",
"abbreviation": "<string>"
},
"role": "<string>"
}
]
},
"member_count": 0,
"exchanges": [
"<string>"
],
"volume": 123,
"volume_24h": 123,
"members": [
{
"river_id": 123,
"exchange_value": 123,
"exchange_name": "<string>",
"tick_size_price": 123,
"tick_size_qty": 123,
"minimum_order_size": 123,
"neg_risk": true,
"name": "<string>",
"status": "active",
"ticker": "<string>",
"token_id_yes": "<string>",
"token_id_no": "<string>",
"slug": "<string>",
"tick_structure": "uniform",
"expiration_datetime": "<string>",
"start_datetime": "<string>",
"neg_risk_id": "<string>",
"condition_id": "<string>",
"subtitle": "<string>",
"description": "<string>",
"category": "Other",
"subcategory": "<string>",
"rank": 123,
"event_ticker": "<string>",
"event_title": "<string>",
"event_subtitle": "<string>",
"is_combo": false,
"flip": true,
"volume": 123,
"volume_24h": 123,
"series_ticker": "<string>",
"image": "<string>",
"last_price": 123,
"primary_entity_name": "<string>",
"event_market_count": 123
}
]
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Update Generic Asset
Update a user-owned generic asset’s name or description. Platform-curated assets cannot be edited via this route.
curl --request PATCH \
--url https://api.rivermarkets.com/v1/generic-assets/{generic_asset_id} \
--header 'Content-Type: application/json' \
--header 'X-River-Key-Id: <api-key>' \
--header 'X-River-Org-Id: <api-key>' \
--header 'X-River-Signature: <api-key>' \
--header 'X-River-Timestamp: <api-key>' \
--data '
{
"name": "<string>",
"description": "<string>"
}
'import requests
url = "https://api.rivermarkets.com/v1/generic-assets/{generic_asset_id}"
payload = {
"name": "<string>",
"description": "<string>"
}
headers = {
"X-River-Key-Id": "<api-key>",
"X-River-Timestamp": "<api-key>",
"X-River-Signature": "<api-key>",
"X-River-Org-Id": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {
'X-River-Key-Id': '<api-key>',
'X-River-Timestamp': '<api-key>',
'X-River-Signature': '<api-key>',
'X-River-Org-Id': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({name: '<string>', description: '<string>'})
};
fetch('https://api.rivermarkets.com/v1/generic-assets/{generic_asset_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/generic-assets/{generic_asset_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'description' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-River-Key-Id: <api-key>",
"X-River-Org-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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.rivermarkets.com/v1/generic-assets/{generic_asset_id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"description\": \"<string>\"\n}")
req, _ := http.NewRequest("PATCH", url, payload)
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>")
req.Header.Add("X-River-Org-Id", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://api.rivermarkets.com/v1/generic-assets/{generic_asset_id}")
.header("X-River-Key-Id", "<api-key>")
.header("X-River-Timestamp", "<api-key>")
.header("X-River-Signature", "<api-key>")
.header("X-River-Org-Id", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"description\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.rivermarkets.com/v1/generic-assets/{generic_asset_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["X-River-Key-Id"] = '<api-key>'
request["X-River-Timestamp"] = '<api-key>'
request["X-River-Signature"] = '<api-key>'
request["X-River-Org-Id"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"description\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"generic_asset_id": "<string>",
"name": "<string>",
"river_ids": [
123
],
"inserted_at": "<string>",
"asset_type": "<string>",
"period": "<string>",
"metric": "<string>",
"entity_id": "<string>",
"side": "<string>",
"strike": 123,
"description": "<string>",
"category": "<string>",
"subcategory": "<string>",
"resolves_at": "<string>",
"start_datetime": "<string>",
"owner_subaccount_id": "<string>",
"status": "<string>",
"match_type": "<string>",
"event": {
"event_id": "<string>",
"series": "<string>",
"start": "<string>",
"title": "<string>",
"participants": [
{
"entity": {
"entity_id": "<string>",
"name": "<string>",
"abbreviation": "<string>"
},
"role": "<string>"
}
]
},
"member_count": 0,
"exchanges": [
"<string>"
],
"volume": 123,
"volume_24h": 123,
"members": [
{
"river_id": 123,
"exchange_value": 123,
"exchange_name": "<string>",
"tick_size_price": 123,
"tick_size_qty": 123,
"minimum_order_size": 123,
"neg_risk": true,
"name": "<string>",
"status": "active",
"ticker": "<string>",
"token_id_yes": "<string>",
"token_id_no": "<string>",
"slug": "<string>",
"tick_structure": "uniform",
"expiration_datetime": "<string>",
"start_datetime": "<string>",
"neg_risk_id": "<string>",
"condition_id": "<string>",
"subtitle": "<string>",
"description": "<string>",
"category": "Other",
"subcategory": "<string>",
"rank": 123,
"event_ticker": "<string>",
"event_title": "<string>",
"event_subtitle": "<string>",
"is_combo": false,
"flip": true,
"volume": 123,
"volume_24h": 123,
"series_ticker": "<string>",
"image": "<string>",
"last_price": 123,
"primary_entity_name": "<string>",
"event_market_count": 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.
Your organization id (from GET /v1/rate-limit). Signed requests are rate limited per organization on this header; a missing or wrong value is refused with 403.
Path Parameters
Body
Response
Successful Response
A tradeable generic asset (platform-curated or user-owned) with its member river_ids.
Creation timestamp (UTC)
moneyline | spread | threshold
NULL = full game; h1, q1, f5_innings, inning_1, ...
runs | points for thresholds
The entity the YES is about: the first participant for a two-outcome moneyline or a spread, the leg's own side where a tie is listed as its own contract, the team for team totals
over for thresholds
First participant's line for spreads, over line for totals
Underlying event start (e.g. first pitch), for calendar views
'manual' | 'owner' | 'auto_*' — auto-matched assets group by game in the UI
The generic event (normalization.events) an auto-matched asset settles on.
Show child attributes
Show child attributes
Exchanges the members trade on
Summed member volume
Member markets with flip; populated on event-paginated requests
Show child attributes
Show child attributes

