跳到主要内容

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​

FieldTypeDescription
marketsstring[]Markets whose activity earns Trading Points: spot (order-book fills), swap (confirmed wallet swaps), perp (perpetual fills)
tradingobjectTrading Points rules (see below)
holdingobjectHolding Points rules (see below)
referralobjectReferral Points rules (see below)
calendarobjectEpoch / season calendar (see below)
earn_levelsarrayEarn Levels, same shape as GET /v1/points/earn-level-config
redeemableboolWhether season points can be redeemed for tokens; currently false (see Claim)

trading​

FieldTypeDescription
tiers[].tierstringT1 / T2 / T3
tiers[].min_volume_14dstringTrailing 14-day USD volume (all markets) at or above which the tier applies
tiers[].maker_points_per_1000_usdstringTP per $1,000 of notional as maker
tiers[].taker_points_per_1000_usdstringTP per $1,000 of notional as taker
daily_capintMax Trading Points per user per UTC day
weekly_capintMax Trading Points per user per ISO week (Monday–Sunday, UTC)
swap_counts_asstringRole a confirmed wallet swap is priced at: taker
self_trades_countboolfalse — fills against your own account earn nothing

holding​

FieldTypeDescription
points_per_1000_usd_per_dayintHolding Points per $1,000 of exchange balance per day
sample_intervalstringhourly — each sample credits 1/24 of the daily rate; missed hours are not back-filled
min_value_usdintBalances worth less than this earn nothing
value_cap_usdintBalance value above this counts as this value

referral​

FieldTypeDescription
award_pointsintPoints the referrer receives, once per referee
trigger_volume_usdintTrading volume the referee must reach
window_daysintDays after binding within which the volume must be reached

calendar​

FieldTypeDescription
epoch_daysintLength of an epoch in days
epochs_per_seasonintEpochs per season
timezonestringUTC — 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']}")