Points Rules
Returns every rule constant the points engine applies: trading tiers and caps, holding points, referral points, the epoch/season calendar and the Earn Levels. The values come from the same constants the engine uses, so this endpoint is the authoritative source for any points UI.
GET /v1/points/rules
No authentication required. No query parameters.
Response
{
"markets": ["spot", "swap", "perp"],
"trading": {
"tiers": [
{ "tier": "T1", "min_volume_14d": "0", "maker_points_per_1000_usd": "1.2", "taker_points_per_1000_usd": "0.8" },
{ "tier": "T2", "min_volume_14d": "5000000", "maker_points_per_1000_usd": "1.5", "taker_points_per_1000_usd": "1.0" },
{ "tier": "T3", "min_volume_14d": "100000000", "maker_points_per_1000_usd": "2.0", "taker_points_per_1000_usd": "1.3" }
],
"daily_cap": 5000,
"weekly_cap": 25000,
"swap_counts_as": "taker",
"self_trades_count": false
},
"holding": {
"points_per_1000_usd_per_day": 1,
"sample_interval": "hourly",
"min_value_usd": 10,
"value_cap_usd": 1000000
},
"referral": {
"award_points": 200,
"trigger_volume_usd": 1000,
"window_days": 7
},
"calendar": {
"epoch_days": 14,
"epochs_per_season": 4,
"timezone": "UTC"
},
"earn_levels": [
{ "level": 0, "points_min": 0, "points_max": 999, "weight": 4 },
{ "level": 1, "points_min": 1000, "points_max": 9999, "weight": 8 },
{ "level": 2, "points_min": 10000, "points_max": 49999, "weight": 12 },
{ "level": 3, "points_min": 50000, "points_max": 199999, "weight": 25 },
{ "level": 4, "points_min": 200000, "points_max": 499999, "weight": 60 },
{ "level": 5, "points_min": 500000, "points_max": null, "weight": 120 }
],
"redeemable": false
}
Object keys may be returned in a different (alphabetical) order; do not rely on key order.
Response Fields
| Field | Type | Description |
|---|---|---|
markets | string[] | Markets whose activity earns Trading Points: spot (order-book fills), swap (confirmed wallet swaps), perp (perpetual fills) |
trading | object | Trading Points rules (see below) |
holding | object | Holding Points rules (see below) |
referral | object | Referral Points rules (see below) |
calendar | object | Epoch / season calendar (see below) |
earn_levels | array | Earn Levels, same shape as GET /v1/points/earn-level-config |
redeemable | bool | Whether season points can be redeemed for tokens; currently false (see Claim) |
trading
| Field | Type | Description |
|---|---|---|
tiers[].tier | string | T1 / T2 / T3 |
tiers[].min_volume_14d | string | Trailing 14-day USD volume (all markets) at or above which the tier applies |
tiers[].maker_points_per_1000_usd | string | TP per $1,000 of notional as maker |
tiers[].taker_points_per_1000_usd | string | TP per $1,000 of notional as taker |
daily_cap | int | Max Trading Points per user per UTC day |
weekly_cap | int | Max Trading Points per user per ISO week (Monday–Sunday, UTC) |
swap_counts_as | string | Role a confirmed wallet swap is priced at: taker |
self_trades_count | bool | false — fills against your own account earn nothing |
holding
| Field | Type | Description |
|---|---|---|
points_per_1000_usd_per_day | int | Holding Points per $1,000 of exchange balance per day |
sample_interval | string | hourly — each sample credits 1/24 of the daily rate; missed hours are not back-filled |
min_value_usd | int | Balances worth less than this earn nothing |
value_cap_usd | int | Balance value above this counts as this value |
referral
| Field | Type | Description |
|---|---|---|
award_points | int | Points the referrer receives, once per referee |
trigger_volume_usd | int | Trading volume the referee must reach |
window_days | int | Days after binding within which the volume must be reached |
calendar
| Field | Type | Description |
|---|---|---|
epoch_days | int | Length of an epoch in days |
epochs_per_season | int | Epochs per season |
timezone | string | UTC — all day, week and epoch boundaries are UTC |
See Overview for how these rules are applied.
Code Examples
Python
import requests
BASE_URL = "https://api.rocky.exchange"
rules = requests.get(f"{BASE_URL}/v1/points/rules").json()
for t in rules["trading"]["tiers"]:
print(f"{t['tier']} (≥ ${int(t['min_volume_14d']):,} / 14d): "
f"maker {t['maker_points_per_1000_usd']}, taker {t['taker_points_per_1000_usd']} TP per $1,000")
print(f"Caps: {rules['trading']['daily_cap']:,}/day, {rules['trading']['weekly_cap']:,}/week")
print(f"Redeemable: {rules['redeemable']}")