Docs
Markets
The live markets are isolated perps on Old School RuneScape items. Each one follows that item's latest wiki print. World of Warcraft items are planned next, on the same rules: a public price for the item, a saved market between real prints, and the fairness rules below.
| Item | Symbol | Typical range |
|---|---|---|
| Coal | COAL-PERP | 131–145 gp |
| Mahogany logs | MAHOGANY_LOGS-PERP | 110–154 gp |
| Rune 2h sword | RUNE_2H-PERP | 37,800–37,950 gp |
| Santa hat | SANTA_HAT-PERP | 19,000–30,600 gp |
| Blue partyhat | BLUE_PARTYHAT-PERP | 12,900–25,500 gp |
Typical range is the daily wiki high and low over about the last 30 days. Several of these items barely move. Coal stays near 140 gp. The rune 2h sword stays inside a few hundred gp. A long at the bottom of a band that narrow, or a short at the top, is close to a sure trade if the market is allowed to sit there.
Between wiki prints the saved price may sit up to 3.5% away from the last real print. On a tight item that band is wider than the item usually moves, so the bottom and the top are the trade.
Official OSRS price source
Mark prices are taken from the official Old School RuneScape Grand Exchange feed published by the OSRS Wiki. The live endpoint is:
https://prices.runescape.wiki/api/v1/osrs/latest
That JSON maps each wiki item id to the latest instant-buy and instant-sell prints. We poll it and use the newest of high / low (by highTime / lowTime) as the real game price for that market.
| Item | Symbol | Wiki item id | API fields |
|---|---|---|---|
| Coal | COAL-PERP | 453 | high, highTime, low, lowTime |
| Mahogany logs | MAHOGANY_LOGS-PERP | 6332 | high, highTime, low, lowTime |
| Rune 2h sword | RUNE_2H-PERP | 1319 | high, highTime, low, lowTime |
| Santa hat | SANTA_HAT-PERP | 1050 | high, highTime, low, lowTime |
| Blue partyhat | BLUE_PARTYHAT-PERP | 1042 | high, highTime, low, lowTime |
Example shape for coal (data["453"]):
{
"high": 139,
"highTime": 1792053922,
"low": 139,
"lowTime": 1792053956
}high is the latest instant-buy price. lowis the latest instant-sell price. Times are Unix seconds. This feed is the game's public GE data, not a made-up quote.
How the markets stay fair
Someone can watch that band, wait for the saved price to sit on the bottom or the top, and time the next wiki print. A long at the bottom gets paid if the next print is higher or flat. A short at the top works the same way. These rules exist so that camp is not free.
Opens and closes wait in separate queues. You cannot fill until the people ahead of you have filled. Each person already in that queue adds 1 second. If that queue is empty, you are placed behind a random 0–40 spots, one second each, so the click is not on a fixed band. The button counts that position down, one spot per second, while you wait. Liquidation does not wait.
Random jitter keeps the path from being a straight line to the band edge. While the wiki print is unchanged, each item steps at most 0.2% per second from its own last price, inside the 3.5% band. Items do not share a path. An order that opens or adds to a position checks the public wiki print after its queue wait. A long fills at the higher of the walk and that print. A short fills at the lower. Closing or reducing fills at the walk, after the close queue.
Random spikes are time-weighted. Each wait between official api prices rolls random spikes. The chance that the next second is a spike is the spikes still left divided by the seconds left in that minute, so a spike is more likely as the next wiki print gets close. A spike is a sudden 1% to 3.5% move, up or down, still inside the band. That is there to knock a camp off the lower or upper edge in the window where someone would otherwise click.
Funding is high on purpose. It is 0.0075% of position value per minute for each 1x of leverage, taken from the position's own margin. At the 25x minimum that is 0.1875% of notional per minute. Camping the band costs more than the quiet range pays.
New positions require at least 25x leverage, and at most 100x. A lower leverage would put the liquidation price outside the band, so a long at the bottom or a short at the top could not be liquidated by the item's own range. The higher minimum pulls liquidation in close enough that camping an edge is not a safe hold.
A newer wiki print replaces the saved price on that tick. The walk and the spikes only run while that print is unchanged. Every print is stored. The chart and the tape show those saved prices, including while the page is closed.
Trading rules
The order ticket size is notional GP. The API size is item units, so notional is quantity times the fill price. A new or increased position must be at least 100 gp notional. Leverage on a new or increased position is 25x to 100x. Closing or reducing can be smaller than 100 gp, and it is not held to the 25x minimum.
Orders fill at the latest saved price after the open or close queue. Margin is isolated on the position: notional divided by leverage is locked on the trade, not left as free balance. Adding to the same side adds margin. A partial close keeps the remaining fraction of the margin. The open fee is 0.1% of notional, taken from available balance.
Funding and liquidation
Funding is 0.0075% of position value per minute for each 1x of leverage. At 25x that is 0.1875% of notional per minute. At 100x it is 0.75%. The fee is taken from the position's isolated margin. It is not taken from free balance, and it cannot push that margin below zero.
A position is liquidated when its equity is at or below maintenance. Equity is remaining isolated margin plus unrealized PnL. Maintenance is 0.5% of notional at the mark. For a new trade the liquidation price is:
long: fill * (1 - 1 / leverage) / 0.995 short: fill * (1 + 1 / leverage) / 1.005
Funding lowers remaining margin, so the liquidation price moves toward the entry as fees accrue. Every saved print is checked. If one trades through the liquidation price and a later print recovers, the position is still closed at the print that crossed.
API
Send the session cookie on protected routes. Sign-in is Better Auth under /api/auth/*. A missing session returns 401.
Public
GET /api/health GET /api/markets GET /api/markets/:symbol?limit=200&after=ISO GET /api/leaderboard?limit=100 GET /api/public/leaderboard?limit=100
GET /api/markets returns each listed market plus minOrderLeverage and maxOrderLeverage. A single market returns the latest price and ticks. Without after, ticks are newest first. With after, ticks are newer than that time, oldest first. Limit is capped at 5,000. A symbol that is not a live market returns 404.
Leaderboard rows are ranked by realized PnL from closed trades. Limit defaults to 100 and caps at 500.
Signed in
GET /api/account GET /api/positions GET /api/risk GET /api/trades POST /api/orders
Place or change a position:
POST /api/orders
{
"symbol": "COAL-PERP",
"side": "LONG",
"quantity": 7.46,
"leverage": 100,
"idempotencyKey": "optional"
}side is LONG or SHORT. quantity is item units. The same idempotency key returns the original fill instead of opening a second trade.
Opens that break a rule return 400. A close during a stale price returns 409.
400 Minimum order is 100 gp 400 Min requirement is 25x leverage for now 409 Latest price is stale
Disclaimer: This is a parody game. Points have no inherent value, and withdrawals may be withheld for any reason. By depositing, you accept all terms and conditions.