{"openapi":"3.1.0","info":{"title":"Hyperliquid over Airnode","version":"1.0.0","description":"Hyperliquid is a perpetuals and spot exchange running on its own L1. This Airnode wraps its read API: perp and spot market metadata, mid prices, order books, candles, funding, recent trades, validator and vault state, borrow and lend reserves, and per-address account state. It wraps none of the write side, so no operation here can place, cancel or transfer anything.\n\nHyperliquid serves all of this on one path and routes on a type field in the request body. This document declares one operation per type and sends that field itself, so a caller names the operation and never the type. An operation this document does not declare is refused before Hyperliquid is called.\n\nPrices, books and account state are what Hyperliquid published at the moment they were read, so an attestation over one is provenance. A closed range of candles, funding or fills answers the same every time, so an attestation over one is reproducible as well. Documentation: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api\n\nEvery response carries an EIP-191 signature from the Airnode that served it, so the data can be attributed back to its source rather than trusted on reputation."},"servers":[{"url":"https://airnode-hyperliquid.fly.dev"}],"paths":{"/":{"get":{"operationId":"getDocumentation","summary":"This document.","description":"Describes the operations this Airnode serves and how to verify what it returns. Free.","responses":{"200":{"description":"An OpenAPI document describing this Airnode.","content":{"application/json":{"schema":{"type":"object"}}}}}},"post":{"operationId":"performRequest","summary":"Perform an operation and attest to the response.","requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"title":"exchangeStatus","description":"Whether the exchange is running normally, and the time it says it is.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"exchangeStatus","description":"The cheapest call there is, and the one to reach for to tell a stale Airnode from a stale exchange. specialStatuses is null while nothing is unusual.","x-airnode-returns":{"time":"integer","specialStatuses":"object | null"}},"parameters":{"type":"object","additionalProperties":false,"required":[],"properties":{}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"allMids","description":"The mid price of every market, perpetual and spot, in one call.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"allMids","description":"The whole board at one moment, keyed by market name. A spot pair that is not canonical appears as an at sign and its index, which spotMeta.universe resolves. A market with no two-sided book has no entry rather than a null one. Prices move, so this attests to what Hyperliquid published then rather than to something reproducible.","x-airnode-price":"0.01 USD per call"},"parameters":{"type":"object","additionalProperties":false,"required":[],"properties":{"dex":{"type":"string","description":"The perp DEX to read, as a name from perpDexs. Omit it for Hyperliquid's own, which is what an empty string also means.","examples":["xyz"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"meta","description":"Every perpetual a DEX lists, with its size precision, leverage cap and margin tiers.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"meta","description":"The reference the rest of the perpetual operations are read against: universe gives the coin names they take, szDecimals says how a size may be written, and marginTableId points into marginTables for the leverage a position of a given size is allowed. A delisted perpetual stays in universe with isDelisted set, because its index is what asset ids elsewhere still count by.","x-airnode-returns":{"universe":"array","marginTables":"array","collateralToken":"integer"}},"parameters":{"type":"object","additionalProperties":false,"required":[],"properties":{"dex":{"type":"string","description":"The perp DEX to read, as a name from perpDexs. Omit it for Hyperliquid's own, which is what an empty string also means.","examples":["xyz"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"metaAndAssetCtxs","description":"Every perpetual and its live context: mark, oracle and mid price, funding, open interest and volume.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"metaAndAssetCtxs","description":"Two entries by position. The first is the same document meta returns. The second is a list of contexts in the same order as universe, so pair them by index rather than by name. This is the call the issue asked for and the one worth attesting for market data, since one signature then covers the whole board at one moment.","x-airnode-price":"0.01 USD per call"},"parameters":{"type":"object","additionalProperties":false,"required":[],"properties":{"dex":{"type":"string","description":"The perp DEX to read, as a name from perpDexs. Omit it for Hyperliquid's own, which is what an empty string also means.","examples":["xyz"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"perpDexs","description":"Every perp DEX built on Hyperliquid, with its deployer and per-asset caps.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"perpDexs","description":"The first entry is null and stands for Hyperliquid's own DEX, which every operation reads when dex is left out. The rest are HIP-3 deployments, and their name is what a dex parameter takes."},"parameters":{"type":"object","additionalProperties":false,"required":[],"properties":{}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"perpsAtOpenInterestCap","description":"Which perpetuals have hit their open interest cap, so a position cannot be opened.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"perpsAtOpenInterestCap","description":"A perpetual named here refuses an order that would grow open interest, while one that reduces it still works. The list moves, so it says what was capped at that moment.","x-airnode-price":"0.01 USD per call"},"parameters":{"type":"object","additionalProperties":false,"required":[],"properties":{"dex":{"type":"string","description":"The perp DEX to read, as a name from perpDexs. Omit it for Hyperliquid's own, which is what an empty string also means.","examples":["xyz"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"predictedFundings","description":"What Hyperliquid and other venues are about to charge in funding, per perpetual.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"predictedFundings","description":"One entry per coin, holding a list of venue and prediction pairs. Venues include HlPerp for Hyperliquid itself and BinPerp and others for the exchanges it compares against, which is what makes the spread between them readable.","x-airnode-price":"0.01 USD per call"},"parameters":{"type":"object","additionalProperties":false,"required":[],"properties":{}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"fundingHistory","description":"The funding a perpetual actually charged over a time range.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"fundingHistory","description":"Settled history rather than a prediction, so the same range asked for twice answers the same, which is what makes this worth attesting. Hyperliquid returns 500 entries at a time, so narrow the range to page through a long one.","x-airnode-price":"0.01 USD per call","x-airnode-returns":{"coin":"string","fundingRate":"string","premium":"string","time":"integer"}},"parameters":{"type":"object","additionalProperties":false,"required":["coin","startTime"],"properties":{"coin":{"type":"string","description":"The perpetual to read, as a name from meta.universe. A perp on another DEX is prefixed with that DEX and a colon.","examples":["BTC","ETH","xyz:XYZ100"]},"startTime":{"type":"integer","description":"Where to start, in unix milliseconds.","examples":[1735689600000]},"endTime":{"type":"integer","description":"Where to stop, in unix milliseconds. Now, where it is left out.","examples":[1735689600000]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"perpDeployAuctionStatus","description":"The Dutch auction for the right to deploy the next perpetual.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"perpDeployAuctionStatus","description":"The price falls from startGas over durationSeconds until somebody takes it. currentGas is null between auctions, and endGas is null while the price is still falling.","x-airnode-price":"0.01 USD per call","x-airnode-returns":{"startTimeSeconds":"integer","durationSeconds":"integer","startGas":"string","currentGas":"string | null","endGas":"string | null"}},"parameters":{"type":"object","additionalProperties":false,"required":[],"properties":{}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"activeAssetData","description":"What one account can do in one perpetual: its leverage, and how much it could still trade.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"activeAssetData","description":"The account's own limits rather than the market's, so it answers what this address may open here now. maxTradeSzs and availableToTrade each hold the buy side then the sell side.","x-airnode-price":"0.01 USD per call","x-airnode-returns":{"user":"string","coin":"string","leverage":"object","maxTradeSzs":"array","availableToTrade":"array","markPx":"string"}},"parameters":{"type":"object","additionalProperties":false,"required":["user","coin"],"properties":{"user":{"type":"string","description":"The account to ask about, as its 42 character hex address. Send the account itself, never an agent wallet approved for it.","examples":["0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"]},"coin":{"type":"string","description":"The perpetual to read, as a name from meta.universe. A perp on another DEX is prefixed with that DEX and a colon.","examples":["BTC","ETH","xyz:XYZ100"]},"dex":{"type":"string","description":"The perp DEX to read, as a name from perpDexs. Omit it for Hyperliquid's own, which is what an empty string also means.","examples":["xyz"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"spotMeta","description":"Every spot token and tradable pair, with the ids the rest of the spot operations take.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"spotMeta","description":"tokens gives the tokenId that tokenDetails takes and the index that a pair refers to. universe gives the pair name that l2Book and candleSnapshot take, and a non-canonical pair is named with an at sign and its index rather than with its symbols. Large: about 135 KB, because it lists every token ever deployed.","x-airnode-returns":{"tokens":"array","universe":"array"}},"parameters":{"type":"object","additionalProperties":false,"required":[],"properties":{}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"spotMetaAndAssetCtxs","description":"Every spot pair and its live context: mark and mid price, volume and supply. Use l2Book for one pair.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"spotMetaAndAssetCtxs","description":"The spot counterpart of metaAndAssetCtxs, and read the same way: the metadata first, then a list of contexts in the order universe lists its pairs. The largest response this Airnode serves at about 270 KB, so a caller after the board is better off projecting.","x-airnode-price":"0.01 USD per call"},"parameters":{"type":"object","additionalProperties":false,"required":[],"properties":{}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"spotPairDeployAuctionStatus","description":"The Dutch auction for the right to deploy the next spot pair.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"spotPairDeployAuctionStatus","description":"The same shape and the same falling price as perpDeployAuctionStatus, for spot rather than perpetuals.","x-airnode-price":"0.01 USD per call","x-airnode-returns":{"startTimeSeconds":"integer","durationSeconds":"integer","startGas":"string","currentGas":"string | null","endGas":"string | null"}},"parameters":{"type":"object","additionalProperties":false,"required":[],"properties":{}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"tokenDetails","description":"One spot token in full: supply, prices, who deployed it and what it was seeded with.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"tokenDetails","description":"Takes the tokenId from spotMeta.tokens rather than a symbol, because symbols repeat and ids do not. Read the size note in the README before calling it on a widely held token: genesis and nonCirculatingUserBalances carry one entry per holder, which took HYPE to over 5 MB, and a responseProjection is the way to ask for the supply figures alone.","x-airnode-price":"0.01 USD per call","x-airnode-returns":{"name":"string","maxSupply":"string","totalSupply":"string","circulatingSupply":"string","szDecimals":"integer","weiDecimals":"integer","midPx":"string | null","markPx":"string | null","prevDayPx":"string | null","deployer":"string | null","deployGas":"string | null","deployTime":"string | null","seededUsdc":"string","futureEmissions":"string","genesis":"object | null","nonCirculatingUserBalances":"array"}},"parameters":{"type":"object","additionalProperties":false,"required":["tokenId"],"properties":{"tokenId":{"type":"string","description":"The token's 32 byte id, as spotMeta.tokens publishes it.","examples":["0xc1fb593aeffbeb02f85e0308e9956a90"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"spotDeployState","description":"How far one deployer has got through deploying a spot token, and what the gas auction costs.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"spotDeployState","description":"states is empty for an address with nothing in flight, which is every address but a deployer's.","x-airnode-price":"0.01 USD per call","x-airnode-returns":{"states":"array","gasAuction":"object"}},"parameters":{"type":"object","additionalProperties":false,"required":["user"],"properties":{"user":{"type":"string","description":"The deployer to ask about, as its 42 character hex address. Send the account itself, never an agent wallet approved for it.","examples":["0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"l2Book","description":"The order book of one market, its bids and asks.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"l2Book","description":"Bids first then asks, up to twenty levels each, ordered away from the mid. Levels can be coarsened with nSigFigs to see further into the book for the same twenty entries. Works for a perpetual and for a spot pair, so coin takes a name from either universe.","x-airnode-price":"0.01 USD per call","x-airnode-returns":{"coin":"string","time":"integer","levels":"array"}},"parameters":{"type":"object","additionalProperties":false,"required":["coin"],"properties":{"coin":{"type":"string","description":"The market to read. A perpetual is its name from meta.universe. A spot pair is its name from spotMeta.universe, which for a non-canonical pair is an at sign and its index.","examples":["BTC","PURR/USDC","@1"]},"nSigFigs":{"type":"integer","description":"Round prices to this many significant figures, which merges levels and reaches further into the book. Full precision where it is left out.","enum":[2,3,4,5]},"mantissa":{"type":"integer","description":"Coarsen further within nSigFigs of 5. Only 2 and 5 are accepted, and only alongside nSigFigs.","enum":[2,5]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"candleSnapshot","description":"Open, high, low, close and volume candles for one market over a time range, within the latest 5000 candles of the interval, about 3.5 days at one minute.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"candleSnapshot","description":"The one operation whose input is nested, because Hyperliquid nests it: send req as an object holding coin, interval and startTime, and endTime where you want one. A range of closed candles answers the same every time, which is what makes this the reproducible price history to attest to. A range outside the latest 5000 candles returns nothing rather than an error.","x-airnode-price":"0.01 USD per call","x-airnode-returns":{"t":"integer","T":"integer","s":"string","i":"string","o":"string","c":"string","h":"string","l":"string","v":"string","n":"integer"}},"parameters":{"type":"object","additionalProperties":false,"required":["req"],"properties":{"req":{"type":"object","description":"The request itself. coin is a market name, interval is one of 1m, 3m, 5m, 15m, 30m, 1h, 2h, 4h, 8h, 12h, 1d, 3d, 1w or 1M, startTime is unix milliseconds and endTime is unix milliseconds and optional.","examples":[{"coin":"BTC","interval":"1h","startTime":1735689600000,"endTime":1735776000000}]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"recentTrades","description":"The trades that just printed in one market.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"recentTrades","description":"Newest first, and each entry names both sides. The window moves, so this attests to what had printed then.","x-airnode-price":"0.01 USD per call","x-airnode-returns":{"coin":"string","px":"string","sz":"string","side":"string","time":"integer","hash":"string","tid":"integer","users":"array"}},"parameters":{"type":"object","additionalProperties":false,"required":["coin"],"properties":{"coin":{"type":"string","description":"The market to read. A perpetual is its name from meta.universe. A spot pair is its name from spotMeta.universe, which for a non-canonical pair is an at sign and its index.","examples":["BTC","PURR/USDC","@1"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"clearinghouseState","description":"One account's perpetual positions and margin, as the clearinghouse holds them.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"clearinghouseState","description":"The account's whole perpetual side at one moment: what it is worth, what margin the positions hold, what it could withdraw, and one entry per open position with its entry price, liquidation price and unrealised profit. An account with nothing open still answers, with an empty assetPositions.","x-airnode-price":"0.01 USD per call","x-airnode-returns":{"marginSummary":"object","crossMarginSummary":"object","crossMaintenanceMarginUsed":"string","withdrawable":"string","assetPositions":"array","time":"integer"}},"parameters":{"type":"object","additionalProperties":false,"required":["user"],"properties":{"user":{"type":"string","description":"The account to ask about, as its 42 character hex address. Send the account itself, never an agent wallet approved for it.","examples":["0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"]},"dex":{"type":"string","description":"The perp DEX to read, as a name from perpDexs. Omit it for Hyperliquid's own, which is what an empty string also means.","examples":["xyz"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"spotClearinghouseState","description":"One account's spot balances, per token.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"spotClearinghouseState","description":"total is everything held and hold is the part of it committed to resting orders, so what is free to spend is the difference. An account holding nothing answers with an empty balances.","x-airnode-price":"0.01 USD per call","x-airnode-returns":{"balances":"array"}},"parameters":{"type":"object","additionalProperties":false,"required":["user"],"properties":{"user":{"type":"string","description":"The account to ask about, as its 42 character hex address. Send the account itself, never an agent wallet approved for it.","examples":["0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"portfolio","description":"How one account's value and profit moved, over several windows at once.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"portfolio","description":"Pairs of a window name and its series. The windows are day, week, month and allTime, each also given as a perp-only variant. Both series are lists of time and value pairs.","x-airnode-price":"0.01 USD per call"},"parameters":{"type":"object","additionalProperties":false,"required":["user"],"properties":{"user":{"type":"string","description":"The account to ask about, as its 42 character hex address. Send the account itself, never an agent wallet approved for it.","examples":["0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"userFees","description":"What one account pays to trade, and the whole schedule its rate came from.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"userFees","description":"The four rates the account actually pays, then the schedule behind them: the base fees, the VIP and market maker tiers, the referral discount and the staking discount tiers. So it answers both what this account pays and what it would pay a tier up.","x-airnode-price":"0.01 USD per call","x-airnode-returns":{"userCrossRate":"string","userAddRate":"string","userSpotCrossRate":"string","userSpotAddRate":"string","dailyUserVlm":"array","feeSchedule":"object","activeReferralDiscount":"string","activeStakingDiscount":"object","trial":"object | null","feeTrialEscrow":"string","nextTrialAvailableTimestamp":"integer | null","stakingLink":"object | null"}},"parameters":{"type":"object","additionalProperties":false,"required":["user"],"properties":{"user":{"type":"string","description":"The account to ask about, as its 42 character hex address. Send the account itself, never an agent wallet approved for it.","examples":["0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"userRateLimit","description":"How much of its request allowance one account has spent, a Hyperliquid trading limit rather than this Airnode's own.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"userRateLimit","description":"Hyperliquid gives an address one request per USDC of lifetime volume, on top of an opening buffer. This says where an address stands against that.","x-airnode-price":"0.01 USD per call","x-airnode-returns":{"cumVlm":"string","nRequestsUsed":"integer","nRequestsCap":"integer","nRequestsSurplus":"integer"}},"parameters":{"type":"object","additionalProperties":false,"required":["user"],"properties":{"user":{"type":"string","description":"The account to ask about, as its 42 character hex address. Send the account itself, never an agent wallet approved for it.","examples":["0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"userRole","description":"What kind of account an address is: a user, a vault, a sub-account or an agent.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"userRole","description":"Worth asking before reading anything else about an address, because a vault and a sub-account answer the account operations differently from a plain user. This is Hyperliquid's most expensive info request by weight, so it is not one to poll.","x-airnode-price":"0.01 USD per call","x-airnode-returns":{"role":"string","data":"object"}},"parameters":{"type":"object","additionalProperties":false,"required":["user"],"properties":{"user":{"type":"string","description":"The address to classify, as its 42 character hex address. Send the account itself, never an agent wallet approved for it.","examples":["0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"isVip","description":"Whether one account is on a VIP fee tier.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"isVip","description":"A bare boolean rather than an object, which is how Hyperliquid answers it. userFees gives the rates behind it.","x-airnode-price":"0.01 USD per call"},"parameters":{"type":"object","additionalProperties":false,"required":["user"],"properties":{"user":{"type":"string","description":"The account to ask about, as its 42 character hex address. Send the account itself, never an agent wallet approved for it.","examples":["0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"userAbstraction","description":"Whether one account runs a unified account or the default one.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"userAbstraction","description":"A bare string rather than an object. unifiedAccount means perpetual and spot balances back each other.","x-airnode-price":"0.01 USD per call"},"parameters":{"type":"object","additionalProperties":false,"required":["user"],"properties":{"user":{"type":"string","description":"The account to ask about, as its 42 character hex address. Send the account itself, never an agent wallet approved for it.","examples":["0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"userDexAbstraction","description":"Whether one account has margin abstraction on across HIP-3 DEXs.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"userDexAbstraction","description":"The HIP-3 counterpart of userAbstraction. Null for an account that has never taken a position on another DEX.","x-airnode-price":"0.01 USD per call"},"parameters":{"type":"object","additionalProperties":false,"required":["user"],"properties":{"user":{"type":"string","description":"The account to ask about, as its 42 character hex address. Send the account itself, never an agent wallet approved for it.","examples":["0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"openOrders","description":"Every order one account has resting, in the smaller of the two shapes.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"openOrders","description":"The fields an order is identified and priced by. frontendOpenOrders adds the order type, the time in force and the trigger, at roughly twice the bytes. An active maker can rest thousands of orders, so this response reaches hundreds of kilobytes.","x-airnode-price":"0.01 USD per call","x-airnode-returns":{"coin":"string","side":"string","limitPx":"string","sz":"string","origSz":"string","oid":"integer","timestamp":"integer"}},"parameters":{"type":"object","additionalProperties":false,"required":["user"],"properties":{"user":{"type":"string","description":"The account to ask about, as its 42 character hex address. Send the account itself, never an agent wallet approved for it.","examples":["0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"]},"dex":{"type":"string","description":"The perp DEX to read, as a name from perpDexs. Omit it for Hyperliquid's own, which is what an empty string also means.","examples":["xyz"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"frontendOpenOrders","description":"Every order one account has resting, with its type, time in force and trigger.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"frontendOpenOrders","description":"openOrders plus what the order actually is: whether it is a market or a limit, how long it rests, whether a price has to be reached first, and which orders it brings to life when it fills.","x-airnode-price":"0.01 USD per call","x-airnode-returns":{"coin":"string","side":"string","limitPx":"string","sz":"string","origSz":"string","oid":"integer","timestamp":"integer","orderType":"string","tif":"string | null","reduceOnly":"boolean","isTrigger":"boolean","triggerPx":"string","triggerCondition":"string","isPositionTpsl":"boolean","cloid":"string | null","children":"array"}},"parameters":{"type":"object","additionalProperties":false,"required":["user"],"properties":{"user":{"type":"string","description":"The account to ask about, as its 42 character hex address. Send the account itself, never an agent wallet approved for it.","examples":["0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"]},"dex":{"type":"string","description":"The perp DEX to read, as a name from perpDexs. Omit it for Hyperliquid's own, which is what an empty string also means.","examples":["xyz"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"userFills","description":"One account's most recent trades. Use userFillsByTime to page further back.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"userFills","description":"Newest first, and capped at two thousand however much the account has traded, so a busy address gets a window rather than a history. A maker's two thousand fills is over 600 KB, so project the fields you need.","x-airnode-price":"0.01 USD per call","x-airnode-returns":{"coin":"string","px":"string","sz":"string","side":"string","time":"integer","startPosition":"string","dir":"string","closedPnl":"string","hash":"string","oid":"integer","crossed":"boolean","fee":"string","feeToken":"string","tid":"integer","twapId":"integer | null","builderFee":"string","liquidation":"object"}},"parameters":{"type":"object","additionalProperties":false,"required":["user"],"properties":{"user":{"type":"string","description":"The account to ask about, as its 42 character hex address. Send the account itself, never an agent wallet approved for it.","examples":["0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"]},"aggregateByTime":{"type":"boolean","description":"Merge the partial fills of one order that happened at the same time into one entry."}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"userFillsByTime","description":"One account's trades within a time range.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"userFillsByTime","description":"The way to page back through a history that userFills only shows the front of: ask for a range, then move the range. Answers up to two thousand fills at a time. A closed range answers the same every time, which userFills cannot.","x-airnode-price":"0.01 USD per call","x-airnode-returns":{"coin":"string","px":"string","sz":"string","side":"string","time":"integer","startPosition":"string","dir":"string","closedPnl":"string","hash":"string","oid":"integer","crossed":"boolean","fee":"string","feeToken":"string","tid":"integer","twapId":"integer | null","builderFee":"string","liquidation":"object"}},"parameters":{"type":"object","additionalProperties":false,"required":["user","startTime"],"properties":{"user":{"type":"string","description":"The account to ask about, as its 42 character hex address. Send the account itself, never an agent wallet approved for it.","examples":["0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"]},"startTime":{"type":"integer","description":"Where to start, in unix milliseconds.","examples":[1735689600000]},"endTime":{"type":"integer","description":"Where to stop, in unix milliseconds. Now, where it is left out.","examples":[1735689600000]},"aggregateByTime":{"type":"boolean","description":"Merge the partial fills of one order that happened at the same time into one entry."}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"historicalOrders","description":"One account's most recent orders, and how each of them ended.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"historicalOrders","description":"The counterpart to openOrders for orders that are no longer resting, with the status that closed each one: filled, canceled, rejected, triggered or one of the reasons Hyperliquid pulled it. Capped at two thousand.","x-airnode-price":"0.01 USD per call","x-airnode-returns":{"order":"object","status":"string","statusTimestamp":"integer"}},"parameters":{"type":"object","additionalProperties":false,"required":["user"],"properties":{"user":{"type":"string","description":"The account to ask about, as its 42 character hex address. Send the account itself, never an agent wallet approved for it.","examples":["0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"orderStatus","description":"One order by its id, and what became of it.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"orderStatus","description":"An id this account never placed answers 200 with a status of unknownOid rather than an error, so read status before reading order. Hyperliquid also accepts a client order id in the same oid field, as a hex string rather than a number. This operation declares the number, because a parameter here carries one type and the numeric id is the one every other operation publishes.","x-airnode-price":"0.01 USD per call","x-airnode-returns":{"status":"string","order":"object"}},"parameters":{"type":"object","additionalProperties":false,"required":["user","oid"],"properties":{"user":{"type":"string","description":"The account that placed the order, as its 42 character hex address. Send the account itself, never an agent wallet approved for it.","examples":["0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"]},"oid":{"type":"integer","description":"The order id, as openOrders, historicalOrders and userFills publish it.","examples":[91490942]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"userTwapSliceFills","description":"The individual slices one account's TWAP orders filled in.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"userTwapSliceFills","description":"A TWAP fills in slices, and each entry pairs one slice's fill with the TWAP it belongs to. Empty for an account that has never run one.","x-airnode-price":"0.01 USD per call","x-airnode-returns":{"fill":"object","twapId":"integer"}},"parameters":{"type":"object","additionalProperties":false,"required":["user"],"properties":{"user":{"type":"string","description":"The account to ask about, as its 42 character hex address. Send the account itself, never an agent wallet approved for it.","examples":["0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"twapHistory","description":"The TWAP orders one account has run, and the state each reached.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"twapHistory","description":"The order rather than its slices, which userTwapSliceFills covers. Empty for an account that has never run one.","x-airnode-price":"0.01 USD per call"},"parameters":{"type":"object","additionalProperties":false,"required":["user"],"properties":{"user":{"type":"string","description":"The account to ask about, as its 42 character hex address. Send the account itself, never an agent wallet approved for it.","examples":["0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"userFunding","description":"The funding one account paid or received, entry by entry.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"userFunding","description":"Only funding, which is what separates it from userNonFundingLedgerUpdates. usdc is negative where the account paid. Leaving startTime out returns the whole history, which reached over 100 KB on an active address, so send a range.","x-airnode-price":"0.01 USD per call","x-airnode-returns":{"time":"integer","hash":"string","delta":"object"}},"parameters":{"type":"object","additionalProperties":false,"required":["user"],"properties":{"user":{"type":"string","description":"The account to ask about, as its 42 character hex address. Send the account itself, never an agent wallet approved for it.","examples":["0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"]},"startTime":{"type":"integer","description":"Where to start, in unix milliseconds. The account's first entry, where it is left out. The whole history reached over 100 KB on an active address, so send a range.","examples":[1735689600000]},"endTime":{"type":"integer","description":"Where to stop, in unix milliseconds. Now, where it is left out.","examples":[1735689600000]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"userNonFundingLedgerUpdates","description":"Everything that moved one account's balance except funding.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"userNonFundingLedgerUpdates","description":"Deposits, withdrawals, transfers between accounts and between the spot and perpetual sides, vault deposits and withdrawals, liquidations and rewards. delta is a union discriminated by its type field, and this document declares that field rather than every branch, because Hyperliquid adds branches. Leaving startTime out returns the whole history, which reached over 500 KB on an active address.","x-airnode-price":"0.01 USD per call","x-airnode-returns":{"time":"integer","hash":"string","delta":"object"}},"parameters":{"type":"object","additionalProperties":false,"required":["user"],"properties":{"user":{"type":"string","description":"The account to ask about, as its 42 character hex address. Send the account itself, never an agent wallet approved for it.","examples":["0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"]},"startTime":{"type":"integer","description":"Where to start, in unix milliseconds. The account's first entry, where it is left out. The whole history reached over 500 KB on an active address.","examples":[1735689600000]},"endTime":{"type":"integer","description":"Where to stop, in unix milliseconds. Now, where it is left out.","examples":[1735689600000]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"delegations","description":"What HYPE one account has staked, and with which validators.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"delegations","description":"One entry per validator the account delegates to. lockedUntilTimestamp is when that stake can be undelegated, which is what makes a delegation different from a balance.","x-airnode-price":"0.01 USD per call","x-airnode-returns":{"validator":"string","amount":"string","lockedUntilTimestamp":"integer"}},"parameters":{"type":"object","additionalProperties":false,"required":["user"],"properties":{"user":{"type":"string","description":"The account to ask about, as its 42 character hex address. Send the account itself, never an agent wallet approved for it.","examples":["0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"delegatorSummary","description":"One account's staking totals: delegated, undelegated and pending withdrawal.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"delegatorSummary","description":"The four figures behind delegations, without the per-validator breakdown.","x-airnode-price":"0.01 USD per call","x-airnode-returns":{"delegated":"string","undelegated":"string","totalPendingWithdrawal":"string","nPendingWithdrawals":"integer"}},"parameters":{"type":"object","additionalProperties":false,"required":["user"],"properties":{"user":{"type":"string","description":"The account to ask about, as its 42 character hex address. Send the account itself, never an agent wallet approved for it.","examples":["0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"delegatorHistory","description":"Every staking action one account has taken.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"delegatorHistory","description":"delta is one of three shapes and exactly one is present: delegate for a delegation or an undelegation, withdrawal for HYPE leaving staking, and cDeposit for HYPE arriving. Reaches tens of kilobytes on a validator's own address.","x-airnode-price":"0.01 USD per call","x-airnode-returns":{"time":"integer","hash":"string","delta":"object"}},"parameters":{"type":"object","additionalProperties":false,"required":["user"],"properties":{"user":{"type":"string","description":"The account to ask about, as its 42 character hex address. Send the account itself, never an agent wallet approved for it.","examples":["0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"delegatorRewards","description":"The staking rewards one account has earned, entry by entry.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"delegatorRewards","description":"source separates a delegator's own reward from a validator's commission, so a validator's address shows both. Reaches tens of kilobytes, since rewards accrue daily.","x-airnode-price":"0.01 USD per call","x-airnode-returns":{"time":"integer","source":"string","totalAmount":"string"}},"parameters":{"type":"object","additionalProperties":false,"required":["user"],"properties":{"user":{"type":"string","description":"The account to ask about, as its 42 character hex address. Send the account itself, never an agent wallet approved for it.","examples":["0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"validatorSummaries","description":"Every validator, with its stake, commission, uptime and predicted return.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"validatorSummaries","description":"What a delegation is chosen on: whether the validator is active, whether it is jailed, how much is already staked with it, what it keeps, and its uptime and predicted APR over several windows.","x-airnode-price":"0.01 USD per call","x-airnode-returns":{"validator":"string","signer":"string","name":"string","description":"string","commission":"string","stake":"integer","isJailed":"boolean","unjailableAfter":"integer | null","isActive":"boolean","nRecentBlocks":"integer","stats":"array"}},"parameters":{"type":"object","additionalProperties":false,"required":[],"properties":{}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"validatorL1Votes","description":"The validator votes currently open on the L1, and which validators have voted.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"validatorL1Votes","description":"Governance in flight rather than settled: each entry holds the action being voted on, who has voted for it, when it expires and whether quorum is reached.","x-airnode-price":"0.01 USD per call","x-airnode-returns":{"action":"object","votes":"array","expireTime":"integer","quorumReached":"boolean"}},"parameters":{"type":"object","additionalProperties":false,"required":[],"properties":{}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"vaultDetails","description":"One vault in full: its leader, its return, its history and everyone in it.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"vaultDetails","description":"The whole vault at one moment, including a followers list with each depositor's address, equity and profit, which is what takes this to around 60 KB on a large vault. Pass user to have the answer also carry that address's own position in the vault.","x-airnode-price":"0.01 USD per call","x-airnode-returns":{"name":"string","vaultAddress":"string","leader":"string","description":"string","apr":"number","portfolio":"array","followerState":"object | null","leaderFraction":"number","leaderCommission":"number","followers":"array","maxDistributable":"number","maxWithdrawable":"number","isClosed":"boolean","allowDeposits":"boolean","alwaysCloseOnWithdraw":"boolean","relationship":"object"}},"parameters":{"type":"object","additionalProperties":false,"required":["vaultAddress"],"properties":{"vaultAddress":{"type":"string","description":"The vault to read, as its 42 character hex address.","examples":["0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"]},"user":{"type":"string","description":"An account whose own position in the vault to include, as its 42 character hex address. Send the account itself, never an agent wallet approved for it.","examples":["0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"userVaultEquities","description":"What one account has in each vault it deposited into.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"userVaultEquities","description":"The depositor's side of vaultDetails.followers, and the way to find which vaults an address is in at all. Empty for an address that has deposited into none.","x-airnode-price":"0.01 USD per call","x-airnode-returns":{"vaultAddress":"string","equity":"string","lockedUntilTimestamp":"integer"}},"parameters":{"type":"object","additionalProperties":false,"required":["user"],"properties":{"user":{"type":"string","description":"The account to ask about, as its 42 character hex address. Send the account itself, never an agent wallet approved for it.","examples":["0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"leadingVaults","description":"The vaults one account runs.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"leadingVaults","description":"The other side of vaultDetails.leader. Empty for an address that runs none.","x-airnode-price":"0.01 USD per call","x-airnode-returns":{"address":"string","name":"string"}},"parameters":{"type":"object","additionalProperties":false,"required":["user"],"properties":{"user":{"type":"string","description":"The leader to ask about, as its 42 character hex address. Send the account itself, never an agent wallet approved for it.","examples":["0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"subAccounts","description":"The sub-accounts one account holds, each with its own balances and positions.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"subAccounts","description":"Answers a bare null rather than an empty list for an account with no sub-accounts, which is most of them. Each entry embeds the sub-account's whole clearinghouse and spot state, so an account with several is a large response.","x-airnode-price":"0.01 USD per call"},"parameters":{"type":"object","additionalProperties":false,"required":["user"],"properties":{"user":{"type":"string","description":"The master account to ask about, as its 42 character hex address. Send the account itself, never an agent wallet approved for it.","examples":["0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"referral","description":"One account's referral standing: who referred it, what it has earned and who it referred.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"referral","description":"Both sides of referral in one answer. referredBy is null for an account nobody referred, and referrerState says whether this account may refer others yet and who it already has.","x-airnode-price":"0.01 USD per call","x-airnode-returns":{"referredBy":"object | null","cumVlm":"string","unclaimedRewards":"string","claimedRewards":"string","builderRewards":"string","referrerState":"object","rewardHistory":"array","tokenToState":"array"}},"parameters":{"type":"object","additionalProperties":false,"required":["user"],"properties":{"user":{"type":"string","description":"The account to ask about, as its 42 character hex address. Send the account itself, never an agent wallet approved for it.","examples":["0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"approvedBuilders","description":"Which builders one account has approved to charge it a fee.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"approvedBuilders","description":"A builder can only add its fee to an order for an account that approved it. Empty for an address that has approved none, which is most of them. maxBuilderFee gives what one approval allows.","x-airnode-price":"0.01 USD per call"},"parameters":{"type":"object","additionalProperties":false,"required":["user"],"properties":{"user":{"type":"string","description":"The account to ask about, as its 42 character hex address. Send the account itself, never an agent wallet approved for it.","examples":["0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"maxBuilderFee","description":"The most one builder may charge one account.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"maxBuilderFee","description":"A bare integer rather than an object, in tenths of a basis point. Zero means the account has not approved that builder, which is the answer for almost every pair of addresses.","x-airnode-price":"0.01 USD per call"},"parameters":{"type":"object","additionalProperties":false,"required":["user","builder"],"properties":{"user":{"type":"string","description":"The account that would pay the fee, as its 42 character hex address. Send the account itself, never an agent wallet approved for it.","examples":["0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"]},"builder":{"type":"string","description":"The builder to ask about, as its 42 character hex address.","examples":["0x476fa87b4d3818f437f38f1263bee508d7672d82"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"borrowLendUserState","description":"One account's borrow and lend positions, and how healthy they are.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"borrowLendUserState","description":"health and healthFactor say how close the account is to being liquidated on its borrows. tokenToState is empty for an account that has neither borrowed nor supplied.","x-airnode-price":"0.01 USD per call","x-airnode-returns":{"tokenToState":"array","health":"string","healthFactor":"string | null"}},"parameters":{"type":"object","additionalProperties":false,"required":["user"],"properties":{"user":{"type":"string","description":"The account to ask about, as its 42 character hex address. Send the account itself, never an agent wallet approved for it.","examples":["0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"borrowLendReserveState","description":"One borrow and lend reserve: its rates, its utilisation and what is in it.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"borrowLendReserveState","description":"Takes the token index from spotMeta.tokens rather than a symbol. borrowYearlyRate and supplyYearlyRate move with utilization, so all three belong together.","x-airnode-price":"0.01 USD per call","x-airnode-returns":{"borrowYearlyRate":"string","supplyYearlyRate":"string","balance":"string","utilization":"string","oraclePx":"string","ltv":"string","totalSupplied":"string","totalBorrowed":"string"}},"parameters":{"type":"object","additionalProperties":false,"required":["token"],"properties":{"token":{"type":"integer","description":"The token's index, as spotMeta.tokens publishes it. 0 is USDC.","examples":[0]}}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}},{"title":"allBorrowLendReserveStates","description":"Every borrow and lend reserve, in one call.","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"allBorrowLendReserveStates","description":"The whole market at one moment, as pairs of a token index and that reserve's state. Small enough that it is the cheaper way to read more than one reserve.","x-airnode-price":"0.01 USD per call"},"parameters":{"type":"object","additionalProperties":false,"required":[],"properties":{}},"responseProjection":{"type":"object","additionalProperties":{"type":"string","pattern":"^/"},"maxProperties":20,"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data is then the text of a JSON object of those names in Unicode code point order, each value as the upstream wrote it, instead of the whole body, and the projection is part of the signed request identity. No two names take the same pointer, and no pointer is inside another's value. A pointer the response does not have is a 400."}}}]}}}},"responses":{"200":{"description":"The upstream response and the attestation over it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Attestation"}}}},"400":{"description":"The operation exists but the parameters or the projection are missing, unknown or malformed, a path parameter is empty, . or .. or has such a part between slashes, or the projection names too many fields, an empty or repeated pointer, or a path the response does not have. Also a PAYMENT-SIGNATURE header that does not decode to a payment payload."},"402":{"description":"The operation is paid and no valid payment was supplied. The PAYMENT-REQUIRED header carries the x402 payment requirements to retry against."},"404":{"description":"No such operation."},"502":{"description":"The upstream API could not be reached or refused the request."}}}}},"components":{"schemas":{"Attestation":{"type":"object","required":["airnode","requestHash","timestamp","data","signature"],"properties":{"airnode":{"type":"string","description":"The address whose signature attests to this response."},"requestHash":{"type":"string","description":"Identifies the request this response answers."},"timestamp":{"type":"string","description":"Unix seconds at which the response was signed."},"data":{"type":"string","description":"The upstream response body exactly as received, less a leading byte order mark. With a projection, the text of a JSON object keyed by the names it asked for in Unicode code point order, each value as the upstream wrote it."},"signature":{"type":"string","description":"The attestation itself."}}}}},"x-airnode":{"address":"0x509F4275Cbe2E2201cc5444bAc8948E3cc7c665B","version":"0.2.0","attestation":{"scheme":"eip191-secp256k1","digest":"keccak256(abi.encodePacked(bytes32 requestHash, uint256 timestamp, bytes dataBytes))","dataBytes":"UTF-8 of data","requestHash":"keccak256(utf8(JSON.stringify([operation, parameterEntriesSortedByName]))), where an object value is itself entries sorted by name, at any depth, and an array keeps its order. Names are compared by Unicode code point. A request that carries a projection appends its entries, sorted the same way, as a third element","verify":"Recover the signer of the signature over the digest and check it equals the address above."},"passthrough":{"url":"https://airnode-hyperliquid.fly.dev/api","routes":{"exchangeStatus":{"method":"POST","path":"/info","body":{"type":"exchangeStatus"},"parameters":{}},"allMids":{"method":"POST","path":"/info","body":{"type":"allMids"},"parameters":{"dex":"body"}},"meta":{"method":"POST","path":"/info","body":{"type":"meta"},"parameters":{"dex":"body"}},"metaAndAssetCtxs":{"method":"POST","path":"/info","body":{"type":"metaAndAssetCtxs"},"parameters":{"dex":"body"}},"perpDexs":{"method":"POST","path":"/info","body":{"type":"perpDexs"},"parameters":{}},"perpsAtOpenInterestCap":{"method":"POST","path":"/info","body":{"type":"perpsAtOpenInterestCap"},"parameters":{"dex":"body"}},"predictedFundings":{"method":"POST","path":"/info","body":{"type":"predictedFundings"},"parameters":{}},"fundingHistory":{"method":"POST","path":"/info","body":{"type":"fundingHistory"},"parameters":{"coin":"body","startTime":"body","endTime":"body"}},"perpDeployAuctionStatus":{"method":"POST","path":"/info","body":{"type":"perpDeployAuctionStatus"},"parameters":{}},"activeAssetData":{"method":"POST","path":"/info","body":{"type":"activeAssetData"},"parameters":{"user":"body","coin":"body","dex":"body"}},"spotMeta":{"method":"POST","path":"/info","body":{"type":"spotMeta"},"parameters":{}},"spotMetaAndAssetCtxs":{"method":"POST","path":"/info","body":{"type":"spotMetaAndAssetCtxs"},"parameters":{}},"spotPairDeployAuctionStatus":{"method":"POST","path":"/info","body":{"type":"spotPairDeployAuctionStatus"},"parameters":{}},"tokenDetails":{"method":"POST","path":"/info","body":{"type":"tokenDetails"},"parameters":{"tokenId":"body"}},"spotDeployState":{"method":"POST","path":"/info","body":{"type":"spotDeployState"},"parameters":{"user":"body"}},"l2Book":{"method":"POST","path":"/info","body":{"type":"l2Book"},"parameters":{"coin":"body","nSigFigs":"body","mantissa":"body"}},"candleSnapshot":{"method":"POST","path":"/info","body":{"type":"candleSnapshot"},"parameters":{"req":"body"}},"recentTrades":{"method":"POST","path":"/info","body":{"type":"recentTrades"},"parameters":{"coin":"body"}},"clearinghouseState":{"method":"POST","path":"/info","body":{"type":"clearinghouseState"},"parameters":{"user":"body","dex":"body"}},"spotClearinghouseState":{"method":"POST","path":"/info","body":{"type":"spotClearinghouseState"},"parameters":{"user":"body"}},"portfolio":{"method":"POST","path":"/info","body":{"type":"portfolio"},"parameters":{"user":"body"}},"userFees":{"method":"POST","path":"/info","body":{"type":"userFees"},"parameters":{"user":"body"}},"userRateLimit":{"method":"POST","path":"/info","body":{"type":"userRateLimit"},"parameters":{"user":"body"}},"userRole":{"method":"POST","path":"/info","body":{"type":"userRole"},"parameters":{"user":"body"}},"isVip":{"method":"POST","path":"/info","body":{"type":"isVip"},"parameters":{"user":"body"}},"userAbstraction":{"method":"POST","path":"/info","body":{"type":"userAbstraction"},"parameters":{"user":"body"}},"userDexAbstraction":{"method":"POST","path":"/info","body":{"type":"userDexAbstraction"},"parameters":{"user":"body"}},"openOrders":{"method":"POST","path":"/info","body":{"type":"openOrders"},"parameters":{"user":"body","dex":"body"}},"frontendOpenOrders":{"method":"POST","path":"/info","body":{"type":"frontendOpenOrders"},"parameters":{"user":"body","dex":"body"}},"userFills":{"method":"POST","path":"/info","body":{"type":"userFills"},"parameters":{"user":"body","aggregateByTime":"body"}},"userFillsByTime":{"method":"POST","path":"/info","body":{"type":"userFillsByTime"},"parameters":{"user":"body","startTime":"body","endTime":"body","aggregateByTime":"body"}},"historicalOrders":{"method":"POST","path":"/info","body":{"type":"historicalOrders"},"parameters":{"user":"body"}},"orderStatus":{"method":"POST","path":"/info","body":{"type":"orderStatus"},"parameters":{"user":"body","oid":"body"}},"userTwapSliceFills":{"method":"POST","path":"/info","body":{"type":"userTwapSliceFills"},"parameters":{"user":"body"}},"twapHistory":{"method":"POST","path":"/info","body":{"type":"twapHistory"},"parameters":{"user":"body"}},"userFunding":{"method":"POST","path":"/info","body":{"type":"userFunding"},"parameters":{"user":"body","startTime":"body","endTime":"body"}},"userNonFundingLedgerUpdates":{"method":"POST","path":"/info","body":{"type":"userNonFundingLedgerUpdates"},"parameters":{"user":"body","startTime":"body","endTime":"body"}},"delegations":{"method":"POST","path":"/info","body":{"type":"delegations"},"parameters":{"user":"body"}},"delegatorSummary":{"method":"POST","path":"/info","body":{"type":"delegatorSummary"},"parameters":{"user":"body"}},"delegatorHistory":{"method":"POST","path":"/info","body":{"type":"delegatorHistory"},"parameters":{"user":"body"}},"delegatorRewards":{"method":"POST","path":"/info","body":{"type":"delegatorRewards"},"parameters":{"user":"body"}},"validatorSummaries":{"method":"POST","path":"/info","body":{"type":"validatorSummaries"},"parameters":{}},"validatorL1Votes":{"method":"POST","path":"/info","body":{"type":"validatorL1Votes"},"parameters":{}},"vaultDetails":{"method":"POST","path":"/info","body":{"type":"vaultDetails"},"parameters":{"vaultAddress":"body","user":"body"}},"userVaultEquities":{"method":"POST","path":"/info","body":{"type":"userVaultEquities"},"parameters":{"user":"body"}},"leadingVaults":{"method":"POST","path":"/info","body":{"type":"leadingVaults"},"parameters":{"user":"body"}},"subAccounts":{"method":"POST","path":"/info","body":{"type":"subAccounts"},"parameters":{"user":"body"}},"referral":{"method":"POST","path":"/info","body":{"type":"referral"},"parameters":{"user":"body"}},"approvedBuilders":{"method":"POST","path":"/info","body":{"type":"approvedBuilders"},"parameters":{"user":"body"}},"maxBuilderFee":{"method":"POST","path":"/info","body":{"type":"maxBuilderFee"},"parameters":{"user":"body","builder":"body"}},"borrowLendUserState":{"method":"POST","path":"/info","body":{"type":"borrowLendUserState"},"parameters":{"user":"body"}},"borrowLendReserveState":{"method":"POST","path":"/info","body":{"type":"borrowLendReserveState"},"parameters":{"token":"body"}},"allBorrowLendReserveStates":{"method":"POST","path":"/info","body":{"type":"allBorrowLendReserveStates"},"parameters":{}}},"parameters":{"x-airnode-sign":"false skips the signature: no attestation headers, and the body streamed through with no size cap.","x-airnode-project":"alias:pointer, once per field to keep and at most 20 times, each pointer an RFC 6901 JSON Pointer into the upstream response that starts with /, is not repeated and is not inside another's value. The body becomes an object of those aliases in Unicode code point order, the signature covers it, and a pointer the response does not have is a 400."},"flow":"Send the request the provider documents, method, path, query and body as they are, to url followed by the route's path. The body comes back as the upstream sent it, with the upstream's status, and on success the attestation is in the X-Airnode-Address, X-Airnode-Request-Hash, X-Airnode-Timestamp and X-Airnode-Signature headers, with the operation served in X-Airnode-Operation. Every query parameter starting with x-airnode- is this Airnode's own, listed under parameters, and never reaches the upstream.","requestHash":"keccak256(utf8(JSON.stringify([\"passthrough\", method, path, queryEntries, headerEntries, body]))), where method is upper case, path is what was sent after url as a URL parser resolves it, the query entries are what was sent with the Airnode's own parameters removed, in the order sent, headerEntries are the headers that the routes declare as parameters and the request sent, each name in lower case and sorted by Unicode code point, with the values of a header sent more than once joined with \", \" in the order sent and the result trimmed of spaces and tabs, and body is the request body as sent, or an empty string. A request that carries a projection appends its entries, sorted by name in Unicode code point order, as a seventh element","dataBytes":"UTF-8 of the response body exactly as received, less a leading byte order mark, or of the projected object"},"payment":{"x402Version":2,"scheme":"exact","accepts":[{"network":"eip155:84532","asset":"0xbeA34973e5f67F18F656A2C6070C64326C791808","symbol":"aUSD","decimals":6}],"payTo":"0x1505FD562AC2Fb4307B85BC6c672FfeafB4d57A7","facilitator":"https://facilitator.xpay.sh","prices":{"allMids":"0.01","metaAndAssetCtxs":"0.01","perpsAtOpenInterestCap":"0.01","predictedFundings":"0.01","fundingHistory":"0.01","perpDeployAuctionStatus":"0.01","activeAssetData":"0.01","spotMetaAndAssetCtxs":"0.01","spotPairDeployAuctionStatus":"0.01","tokenDetails":"0.01","spotDeployState":"0.01","l2Book":"0.01","candleSnapshot":"0.01","recentTrades":"0.01","clearinghouseState":"0.01","spotClearinghouseState":"0.01","portfolio":"0.01","userFees":"0.01","userRateLimit":"0.01","userRole":"0.01","isVip":"0.01","userAbstraction":"0.01","userDexAbstraction":"0.01","openOrders":"0.01","frontendOpenOrders":"0.01","userFills":"0.01","userFillsByTime":"0.01","historicalOrders":"0.01","orderStatus":"0.01","userTwapSliceFills":"0.01","twapHistory":"0.01","userFunding":"0.01","userNonFundingLedgerUpdates":"0.01","delegations":"0.01","delegatorSummary":"0.01","delegatorHistory":"0.01","delegatorRewards":"0.01","validatorSummaries":"0.01","validatorL1Votes":"0.01","vaultDetails":"0.01","userVaultEquities":"0.01","leadingVaults":"0.01","subAccounts":"0.01","referral":"0.01","approvedBuilders":"0.01","maxBuilderFee":"0.01","borrowLendUserState":"0.01","borrowLendReserveState":"0.01","allBorrowLendReserveStates":"0.01"},"flow":"An unpaid call to a priced operation returns 402 with the x402 payment requirements, base64-encoded, in the PAYMENT-REQUIRED header. Sign an EIP-3009 authorization matching one entry and retry the call with the payment payload, base64-encoded, in the PAYMENT-SIGNATURE header. The settlement receipt comes back in the PAYMENT-RESPONSE header."}}}