Cryptocurrency trading involves risk. Prices may be volatile. Trade responsibly. Read our security notes
Integration

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
Integration status. These endpoints are public and ready to be consumed. Lovely Legends is not currently listed on, approved by or partnered with any market data aggregator, and nothing on this page should be read as saying otherwise. If you are evaluating the venue for integration, this is the reference — the listing kit has the rest.

Base URL

https://llapi.lflabs.fund

All 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.

Market pairspublic · no credential
curl -s "https://llapi.lflabs.fund/exchange/pairs"
Example responsecaptured — figures are illustrative
[
  {
    "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
  }
]
Every market on the exchange, with the precisions the engine enforces and whether it is currently open for trading. This is the discovery endpoint — poll it to find out what exists before requesting anything else.
Tickerpublic · no credential
curl -s "https://llapi.lflabs.fund/exchange/ticker?pair=USDC%2FUSDT"
Example responsecaptured — figures are illustrative
{
  "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
}
24-hour rolling statistics for one market. `volumeBase24h` and `volumeQuote24h` are the two volume figures an aggregator normally wants; `change24h` is a fraction, not a percentage.
Order bookpublic · no credential
curl -s "https://llapi.lflabs.fund/exchange/orderbook?pair=USDC%2FUSDT"
Example responsecaptured — figures are illustrative
{
  "asks": [
    ["1.001",   "342.9"],
    ["1.0011",  "1000"],
    ["1.0012",  "3000"]
  ],
  "bids": [
    ["1",       "3000"],
    ["0.9999",  "990"],
    ["0.99968", "361.94"]
  ]
}
Aggregated depth, best price first on both sides. Each level is a two-element array of strings: price, then total quantity resting at that price.
Recent tradespublic · no credential
curl -s "https://llapi.lflabs.fund/exchange/market-trades?pair=USDC%2FUSDT&limit=3"
Example responsecaptured — figures are illustrative
[
  { "id": "18721", "price": "1.000470000000000000",
    "quantity": "38.750000000000000000",
    "ts": 1785834964, "side": "sell" },
  { "id": "18716", "price": "1.000470000000000000",
    "quantity": "30.540000000000000000",
    "ts": 1785834890, "side": "sell" }
]
The public tape, most recent first. `side` is the aggressor's side — the taker that crossed the spread. `ts` is a Unix timestamp in SECONDS, unlike `epoch` on the ticker, which is milliseconds.
Candlespublic · no credential
curl -s "https://llapi.lflabs.fund/exchange/candles?pair=USDC%2FUSDT&tf=1h&limit=2"
Example responsecaptured — figures are illustrative
{
  "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
    }
  ]
}
OHLCV for one market and timeframe. `filled: false` marks the candle still forming — the last element of a live series. An interval in which nothing traded is still returned, carrying the previous close, so the series has no gaps.

Field definitions

The fields whose meaning is not obvious from the name. These are the ones that cost an integrator a day.

FieldMeaning
Numeric stringsPrices, 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.
pairAlways BASE/QUOTE with a forward slash. URL-encode it as %2F in a query string.
change24hA signed FRACTION over the 24-hour open — 0.0029… is +0.29%, not +0.0029%. Multiply by 100 to display.
ts / openTime / closeTimeUnix SECONDS.
epochUnix 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 / tradeStartAtA 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.
sideOn the trade tape, the AGGRESSOR's side — the order that removed liquidity.
filledOn 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.

Connectpublic · no credential
wss://llapi.lflabs.fund/ws
Example responsethe welcome frame, on connect
{
  "type": "welcome",
  "channels": [
    "depth:<pair>",
    "trade:<pair>",
    "ticker:<pair>",
    "kline:<pair>:<timeframe>",
    "fills(auth)",
    "orders(auth)"
  ]
}
The first four channels are public and are the streaming equivalents of the REST endpoints above. 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

EndpointLimitNotes
Ticker, order book, recent trades, candles120 / minutePer IP address, per endpoint, on a rolling 60-second window. Two requests a second to each is within budget.
Market pairs600 / minutePer IP address. The registry changes rarely — poll it on the order of minutes, not seconds.
WebSocketNo per-message limitOne 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 available

Listed 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.

CapabilityStatus
Aggregator-standard summary endpointsThe 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.