Data Provider API
Everything a market data aggregator or listing platform needs to track Lovely Legends: five public REST endpoints, no key, no allowlist, documented field semantics and a stated rate limit.
- Public — no API key
- REST + WebSocket
- JSON over HTTPS
- 120 req/min per market-data endpoint
Base URL
https://llapi.lflabs.fundAll five endpoints below are GET, take no credential, and return application/json. There is no sandbox host — this is production data.
Public endpoints
Verified serving on production. Every JSON block below is a real response that has been captured and trimmed — it is an example of the SHAPE, not a live quote, and the figures in it are already out of date.
curl -s "https://llapi.lflabs.fund/exchange/pairs"[
{
"pair": "USDC/USDT",
"base": "USDC",
"quote": "USDT",
"pricePrecision": 5,
"quantityPrecision": 2,
"amountPrecision": 5,
"tradeStartAt": null,
"tradingOpen": true,
"listingPrice": 1,
"name": "USD Coin",
"logoUrl": null,
"contractAddress": "0xA0b8...eB48",
"depositOpen": true,
"withdrawOpen": true
}
]curl -s "https://llapi.lflabs.fund/exchange/ticker?pair=USDC%2FUSDT"{
"pair": "USDC/USDT",
"epoch": "1785395407102",
"lastPrice": "1.000470000000000000",
"open24h": "1.000440000000000000",
"change24h": 0.002998680580542011,
"high24h": "1.000760000000000000",
"low24h": "1.000220000000000000",
"volumeBase24h": "33033.770000000000000000",
"volumeQuote24h": "33050.284112500000000000",
"trades24h": 516
}curl -s "https://llapi.lflabs.fund/exchange/orderbook?pair=USDC%2FUSDT"{
"asks": [
["1.001", "342.9"],
["1.0011", "1000"],
["1.0012", "3000"]
],
"bids": [
["1", "3000"],
["0.9999", "990"],
["0.99968", "361.94"]
]
}curl -s "https://llapi.lflabs.fund/exchange/market-trades?pair=USDC%2FUSDT&limit=3"[
{ "id": "18721", "price": "1.000470000000000000",
"quantity": "38.750000000000000000",
"ts": 1785834964, "side": "sell" },
{ "id": "18716", "price": "1.000470000000000000",
"quantity": "30.540000000000000000",
"ts": 1785834890, "side": "sell" }
]curl -s "https://llapi.lflabs.fund/exchange/candles?pair=USDC%2FUSDT&tf=1h&limit=2"{
"pair": "USDC/USDT",
"timeframe": "1h",
"candles": [
{
"openTime": 1785826800,
"closeTime": 1785830400,
"open": "1.000440000000000000",
"high": "1.000590000000000000",
"low": "1.000440000000000000",
"close": "1.000590000000000000",
"volumeBase": "2254.410000000000000000",
"volumeQuote": "2255.583208100000000000",
"trades": 30,
"filled": false
}
]
}Field definitions
The fields whose meaning is not obvious from the name. These are the ones that cost an integrator a day.
| Field | Meaning |
|---|---|
Numeric strings | Prices, quantities and volumes are JSON STRINGS at 18 decimal places, not numbers. They are ledger values and parsing them as IEEE doubles loses precision on the tail. Parse with a decimal type. |
pair | Always BASE/QUOTE with a forward slash. URL-encode it as %2F in a query string. |
change24h | A signed FRACTION over the 24-hour open — 0.0029… is +0.29%, not +0.0029%. Multiply by 100 to display. |
ts / openTime / closeTime | Unix SECONDS. |
epoch | Unix MILLISECONDS, and an engine-run identifier rather than a clock reading. It changes when the matching engine restarts; a change means any depth you have cached should be discarded and refetched. |
tradingOpen / tradeStartAt | A market can be listed and not yet open. `tradingOpen: false` with a future `tradeStartAt` is a scheduled launch, and the ticker for it returns nulls with zero volume rather than an error. |
side | On the trade tape, the AGGRESSOR's side — the order that removed liquidity. |
filled | On a candle, false means the interval is still open. Treat the last element of a series as provisional. |
Streaming
If you would rather not poll, the same market data streams over a public WebSocket — no key, no account. Verified connecting and serving its channel list on production, 2026-08-04.
wss://llapi.lflabs.fund/ws{
"type": "welcome",
"channels": [
"depth:<pair>",
"trade:<pair>",
"ticker:<pair>",
"kline:<pair>:<timeframe>",
"fills(auth)",
"orders(auth)"
]
}fills and orders are account-scoped and require authentication — they are not part of this integration surface. Channel names and the subscribe frame are documented on the API page.Rate limits
| Endpoint | Limit | Notes |
|---|---|---|
| Ticker, order book, recent trades, candles | 120 / minute | Per IP address, per endpoint, on a rolling 60-second window. Two requests a second to each is within budget. |
| Market pairs | 600 / minute | Per IP address. The registry changes rarely — poll it on the order of minutes, not seconds. |
| WebSocket | No per-message limit | One socket instead of repeated polling is the intended way to follow a market continuously. |
Over the limit
Returns 429 rather than dropping the connection. Back off and retry.
Need more?
If an integration needs a higher ceiling or a fixed source IP allowlisted, ask before you raise your poll rate — a limit raise is a configuration change, and we would rather make it than throttle a data provider mid-backfill.
In preparation
Not yet availableListed so an integrator can plan around what is missing rather than discover it. None of the following is available today, and none should be wired up.
| Capability | Status |
|---|---|
| Aggregator-standard summary endpoints | The conventional single-call /summary and /assets shapes some aggregators prefer are not implemented. The five endpoints above carry the same information in a different arrangement, and we will add the standard shapes on request. |
| Historical trade backfill beyond the tape | /exchange/market-trades returns the recent tape. There is no paginated historical trade export. Candles go back further and are the route to history today. |
What is not public
Account-scoped endpoints — balances, open orders, order history, fee rates, placement, cancellation and funding — sit behind authentication and are not part of this integration surface. They are available to market makers and partners under IP-bound API keys; see the market maker programme. Requests to them without a credential return 401.
Integration support
If you are integrating Lovely Legends as a data source and something here is wrong, missing or returns a shape you did not expect, write to support@lflabs.fund with the request you sent and the response you got. Requests for a higher rate limit, a standard summary shape or a source-IP allowlist go to the same address.
