One wallet's LP record
const url = 'https://api.getchord.xyz/v1/lp/wallet/example?chain=5042&unit=usd';const options = {method: 'GET'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'https://api.getchord.xyz/v1/lp/wallet/example?chain=5042&unit=usd'Everything the wallet board knows about one wallet, whether it is ranked or not: win rate, fees, profit, expected value per position, average invested / age / monthly profit and the 7-day / 30-day / all-time windows (summary); one row per UTC day on which a position ended, with the profit and the fees that landed on it (history; an open position counts its fees on the day it was last touched); the pools it provided to (pools, up to 60, by number of positions).
The figures use the board’s row rules, so a wallet opened from /lp/leaderboard shows the same numbers: unscored says how many ledger positions were left out and why (each under the first reason that fits), and ledger counts every position, scored or not. operator: true = 500 or more scored positions, an account the board does not rank. truncated: true = the wallet holds more than 20,000 positions and the figures cover the newest 20,000.
Use it for: a wallet page, “is this LP worth following”, a PnL calendar.
Parameters
Section titled “ Parameters ”Path Parameters
Section titled “Path Parameters”EVM address, hex, case-insensitive.
Not a 0x address is 400 BAD_WALLET.
Query Parameters
Section titled “Query Parameters”Chain id: 5042 Arc · 4663 Robinhood Chain · 143 Monad.
native = every money field of the answer in the chain’s own coin (ETH on Robinhood Chain, MON on Monad; Arc’s coin is USDC), each deposit, withdrawal and fee converted at the coin’s price of its own hour, and live values at the price now. The fields keep their …Usd names; unit and unitSymbol in the answer say what they carry. The row rules (the $20 floor, the 20x bound) stay in dollars, so both units score the same positions. 503 UNIT_NOT_READY while a chain’s ledger is being rebuilt with these figures; another value is 400 BAD_UNIT.
Responses
Section titled “ Responses ”object
EVM address, hex, case-insensitive.
usd or native: the unit of every money field in this answer.
USD, or the chain’s coin (ETH, MON, USDC).
object
Scored positions.
Expected value per position.
Profit to date over the months since the first position, never less than one week.
object
object
object
object
Unix time, seconds, UTC.
Unix time, seconds, UTC.
Oldest first; days with nothing are absent.
object
YYYY-MM-DD, UTC
Positions that ended (or, open, were last touched) on the day.
object
A pool: a 20-byte contract address (V2 / V3) or a 32-byte Uniswap V4 pool id.
EVM address, hex, case-insensitive.
EVM address, hex, case-insensitive.
Every position the ledger holds for the wallet.
object
object
Under minIn dollars.
Opened and closed inside a minute.
Far more dollars out than the index saw go in.
Opened before the index started.
On a pool the pool list hides as thin or suspect.
Unix time, milliseconds — when the server built this answer.
Example
{ "chain": 5042, "wallet": "0x5db28691cbfc2ceeca1d919f0749b64013c25432", "summary": { "positions": 2, "open": 0, "closed": 2, "wins": 1, "winRatePct": 50, "pools": 1, "feesUsd": 1473.5195824012221, "profitUsd": 898.4072651256388, "evUsd": 449.2036325628194, "avgAgeHours": 85.54625, "avgInvestedUsd": 2485.7135485602826, "avgMonthlyProfitUsd": 1220.1586855458952, "windows": { "d7": { "positions": 0, "profitUsd": 0, "feesUsd": 0 }, "d30": { "positions": 2, "profitUsd": 898.4072651256388, "feesUsd": 1473.5195824012221 }, "all": { "positions": 2, "profitUsd": 898.4072651256388, "feesUsd": 1473.5195824012221 } }, "firstTs": 1789922677, "lastTs": 1790521219 }, "history": [ { "day": "2026-09-22", "profitUsd": 1767.3683024312918, "feesUsd": 556.5679612124811, "positions": 1 }, { "day": "2026-09-27", "profitUsd": -868.961037305653, "feesUsd": 916.9516211887411, "positions": 1 } ], "pools": [ { "pool": "0xf53f02d9041d00bbd92235b4c902b9f350c554a8ed2dc64fa0a4585aac413f09", "token": "0x8faae5592b9acc27a79fca745c6b872adf514a5d", "anchor": "0x3600000000000000000000000000000000000000", "positions": 2, "open": 0, "inUsd": 4971.427097120565, "profitUsd": 898.4072651256388, "feesUsd": 1473.5195824012221, "symbol": "MURMUR", "anchorSymbol": "USDC", "logo": "https://cdn.dexscreener.com/cms/images/QUq-IqT1GLQNkxMx?width=800&height=800&quality=95&format=auto" } ], "ledger": { "positions": 2, "open": 0, "closed": 2 }, "unscored": { "small": 0, "jit": 0, "unreconciled": 0, "partial": 0, "unlistedPool": 0, "cluster": 0 }, "minIn": 20, "truncated": false, "operator": false, "updatedAt": 1791831176348}Invalid parameters — error names the check that failed (INVALID_PARAMS, BAD_ADDRESS, BAD_LIMIT, BAD_HOURS, …).
Every non-2xx body.
object
Stable machine code, e.g. INVALID_PARAMS, NOT_READY, RATE_LIMIT_EXCEEDED.
For humans.
HTTP status, when included.
Example
{ "error": "INVALID_PARAMS", "message": "amount must be an integer string in the token's smallest unit"}