Alarm when the price crosses.
Every mark is an exact decimal, so the level you set is the level your rule compares.
One call, every level.
One request carries a mark for every instrument your levels watch, in one quote.
price < level→ firingprice >= level→ clearlevel unset→ unarmedReading the feed. Nothing is evaluated until it lands.
GET /v1/prices/latest?assets=BTC,ETH,AAPL,TSLA,EUR,GBPOne number, four comparisons.
The desk above runs the first two. All four are the same subtraction over the same field — not one is a parameter you add or a plan you upgrade.
price < floorbelowthe mark under your floor
The stop: true for as long as the mark sits under the number you wrote.
one levelon the desk aboveprice > ceilingabovethe mark over your ceiling
The same subtraction the other way up: a target rather than a stop.
one levelon the desk aboveprice < low || price > highoutsidethe mark out of your band
Two levels and an or, for a range you want to hear about leaving either way.
two levelsabs(price - opening) > movechangethe mark away from a reference
Keep a mark from an earlier read and the subtraction becomes a move, not a level.
a mark you kept
Every one of them reads the field this call already answers with:
GET /v1/prices/latest?assets=ETHOne rule, every instrument.
const { data } = await latest('BTC,ETH') for (const mark of data) { const level = levels[mark.asset] if (!level) continue if (lessThan(mark.price, level)) page(mark.asset) }
One comparison, however many instruments you watch. Not a feature you switch on — your own if, over a field the mark already carried.
The rule polls.
Ask on your own timer, and keep the last mark you acted on so one crossing pages once.
The price is a string.
Compare it as a decimal, not a float, or the rule fires on the rounding.
The paging stays yours.
No webhook, no channel, no rule engine — LIAW publishes the mark, and the contract ends there.
Set the level.
Read the price reference, or start on the live board.