Yield farm screener
MasterChef-family staking pools keyed by (chain, address, pid), with total value locked, the reward token and both the yearly and daily APR decomposition. Every row carries the verification status of the farm contract, so an unverified pool is never read as a confirmed yield, and updated_at is the indexer's own observation time — treat a stale value as stale data, not as a fresh zero.
The farm indexer serves one chain per query, so naming several chains fans out one query per chain and merges the results here. A merged page is globally ordered by sort when it is set and grouped chain by chain in the order given when it is not; cursor round-trips as usual, but a merged page carries no prev_cursor because the indexer cannot page backwards from a position it never handed out. A single chain is unaffected in every respect.
Query Parameters
comma-separated chain slugs or ids; at most 8, one upstream query each
1 <= items <= 8farm ticker substring
length <= 128comma-separated factory addresses; only farms deployed by these
items <= 32sort key
"tvl"Value in
- "tvl"
- "apr"
- "updated_at"
sort direction
"desc"Value in
- "asc"
- "desc"
page size; plans above startup may raise the ceiling
int321 <= value <= 10010opaque cursor from next_cursor
length <= 512Header Parameters
payment methods the client can use, comma-separated, case-insensitive. With x402 in the list, a spent keyless budget answers 402 with the x402 challenge instead of 429.
base64 x402 v2 payment payload for this request. A paid request skips the keyless budget and is settled only when it answers 2xx. The v1 header X-PAYMENT is accepted too.
Response Body
application/json
application/problem+json
application/problem+json
application/json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
curl -X GET "https://example.com/farms?chains=hyperliquid"{ "items": [ { "network": { "slug": "hyperliquid", "chain_id": 0 }, "address": "string", "pid": 0, "ticker": "string", "tvl": "string", "reward_token": { "address": "string", "name": "string", "symbol": "string", "chain_id": 0 }, "apr_year": { "base_apr": "string", "lp_reward_apr": "string" }, "apr_daily": { "base_apr": "string", "lp_reward_apr": "string" }, "factory": { "address": "string", "name": "string" }, "updated_at": "string", "status": "unverified", "lifecycle_state": "string", "data_quality_flags": [ "string" ] } ], "next_cursor": "string", "prev_cursor": "string"}Wallets that traded a token, with their PNL on it GET
Every wallet with a position in the token, open or closed, ranked by realized PNL unless `sort` says otherwise. Figures are lifetime on this token; there is no time window yet.
One yield farm GET
The farm at one LP contract address, in the row shape the screener serves. `404` when the address is not a farm this API indexes on that chain — which is not the same as a farm with nothing staked, and is why watching one pool does not mean paging the screener.