{"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":"http://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","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"exchangeStatus","description":"Whether the exchange is running normally, and the time it says it is.","x-airnode-returns":{"time":"integer","specialStatuses":"object"}},"parameters":{"type":"object","additionalProperties":false,"required":[],"properties":{}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"allMids","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"allMids","description":"The mid price of every market, perpetual and spot, in one 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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"meta","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"meta","description":"Every perpetual a DEX lists, with its size precision, leverage cap and margin tiers.","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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"metaAndAssetCtxs","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"metaAndAssetCtxs","description":"Every perpetual and its live context: mark, oracle and mid price, funding, open interest and volume."},"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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"perpDexs","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"perpDexs","description":"Every perp DEX built on Hyperliquid, with its deployer and per-asset caps."},"parameters":{"type":"object","additionalProperties":false,"required":[],"properties":{}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"perpsAtOpenInterestCap","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"perpsAtOpenInterestCap","description":"Which perpetuals have hit their open interest cap, so a position cannot be opened."},"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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"predictedFundings","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"predictedFundings","description":"What Hyperliquid and other venues are about to charge in funding, per perpetual."},"parameters":{"type":"object","additionalProperties":false,"required":[],"properties":{}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"fundingHistory","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"fundingHistory","description":"The funding a perpetual actually charged over a time range.","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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"perpDeployAuctionStatus","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"perpDeployAuctionStatus","description":"The Dutch auction for the right to deploy the next perpetual.","x-airnode-returns":{"startTimeSeconds":"integer","durationSeconds":"integer","startGas":"string","currentGas":"string","endGas":"string"}},"parameters":{"type":"object","additionalProperties":false,"required":[],"properties":{}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"activeAssetData","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"activeAssetData","description":"What one account can do in one perpetual: its leverage, and how much it could still trade.","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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"spotMeta","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"spotMeta","description":"Every spot token and tradable pair, with the ids the rest of the spot operations take.","x-airnode-returns":{"tokens":"array","universe":"array"}},"parameters":{"type":"object","additionalProperties":false,"required":[],"properties":{}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"spotMetaAndAssetCtxs","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"spotMetaAndAssetCtxs","description":"Every spot pair and its live context: mark and mid price, volume and supply."},"parameters":{"type":"object","additionalProperties":false,"required":[],"properties":{}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"spotPairDeployAuctionStatus","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"spotPairDeployAuctionStatus","description":"The Dutch auction for the right to deploy the next spot pair.","x-airnode-returns":{"startTimeSeconds":"integer","durationSeconds":"integer","startGas":"string","currentGas":"string","endGas":"string"}},"parameters":{"type":"object","additionalProperties":false,"required":[],"properties":{}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"tokenDetails","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"tokenDetails","description":"One spot token in full: supply, prices, who deployed it and what it was seeded with.","x-airnode-returns":{"name":"string","maxSupply":"string","totalSupply":"string","circulatingSupply":"string","szDecimals":"integer","weiDecimals":"integer","midPx":"string","markPx":"string","prevDayPx":"string","deployer":"string","deployGas":"string","deployTime":"string","seededUsdc":"string","futureEmissions":"string","genesis":"object","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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"spotDeployState","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"spotDeployState","description":"How far one deployer has got through deploying a spot token, and what the gas auction costs.","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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"l2Book","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"l2Book","description":"The order book of one market, both sides, up to twenty levels each.","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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"candleSnapshot","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"candleSnapshot","description":"Open, high, low, close and volume candles for one market over a time range.","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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"recentTrades","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"recentTrades","description":"The trades that just printed in one market.","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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"clearinghouseState","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"clearinghouseState","description":"One account's perpetual positions and margin, as the clearinghouse holds them.","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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"spotClearinghouseState","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"spotClearinghouseState","description":"One account's spot balances, per token.","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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"portfolio","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"portfolio","description":"How one account's value and profit moved, over several windows at once."},"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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"userFees","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"userFees","description":"What one account pays to trade, and the whole schedule its rate came from.","x-airnode-returns":{"userCrossRate":"string","userAddRate":"string","userSpotCrossRate":"string","userSpotAddRate":"string","dailyUserVlm":"array","feeSchedule":"object","activeReferralDiscount":"string","activeStakingDiscount":"object","trial":"object","feeTrialEscrow":"string","nextTrialAvailableTimestamp":"integer","stakingLink":"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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"userRateLimit","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"userRateLimit","description":"How much of its request allowance one account has spent.","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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"userRole","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"userRole","description":"What kind of account an address is: a user, a vault, a sub-account or an agent.","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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"isVip","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"isVip","description":"Whether one account is on a VIP fee tier."},"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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"userAbstraction","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"userAbstraction","description":"Whether one account runs a unified account or the default one."},"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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"userDexAbstraction","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"userDexAbstraction","description":"Whether one account has margin abstraction on across HIP-3 DEXs."},"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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"openOrders","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"openOrders","description":"Every order one account has resting, in the smaller of the two shapes.","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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"frontendOpenOrders","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"frontendOpenOrders","description":"Every order one account has resting, with its type, time in force and trigger.","x-airnode-returns":{"coin":"string","side":"string","limitPx":"string","sz":"string","origSz":"string","oid":"integer","timestamp":"integer","orderType":"string","tif":"string","reduceOnly":"boolean","isTrigger":"boolean","triggerPx":"string","triggerCondition":"string","isPositionTpsl":"boolean","cloid":"string","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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"userFills","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"userFills","description":"One account's most recent trades, up to two thousand of them.","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","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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"userFillsByTime","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"userFillsByTime","description":"One account's trades within a time range, up to two thousand at a time.","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","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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"historicalOrders","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"historicalOrders","description":"One account's most recent orders and how each of them ended.","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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"orderStatus","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"orderStatus","description":"One order by its id, and what became of it.","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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"userTwapSliceFills","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"userTwapSliceFills","description":"The individual slices one account's TWAP orders filled in.","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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"twapHistory","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"twapHistory","description":"The TWAP orders one account has run, and the state each reached."},"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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"userFunding","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"userFunding","description":"The funding one account paid or received, entry by entry.","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.","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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"userNonFundingLedgerUpdates","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"userNonFundingLedgerUpdates","description":"Everything that moved one account's balance except funding.","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.","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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"delegations","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"delegations","description":"What HYPE one account has staked, and with which validators.","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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"delegatorSummary","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"delegatorSummary","description":"One account's staking totals: delegated, undelegated and pending withdrawal.","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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"delegatorHistory","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"delegatorHistory","description":"Every staking action one account has taken.","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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"delegatorRewards","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"delegatorRewards","description":"The staking rewards one account has earned, entry by entry.","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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"validatorSummaries","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"validatorSummaries","description":"Every validator, with its stake, commission, uptime and predicted return.","x-airnode-returns":{"validator":"string","signer":"string","name":"string","description":"string","commission":"string","stake":"integer","isJailed":"boolean","unjailableAfter":"integer","isActive":"boolean","nRecentBlocks":"integer","stats":"array"}},"parameters":{"type":"object","additionalProperties":false,"required":[],"properties":{}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"validatorL1Votes","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"validatorL1Votes","description":"The validator votes currently open on the L1, and which validators have voted.","x-airnode-returns":{"action":"object","votes":"array","expireTime":"integer","quorumReached":"boolean"}},"parameters":{"type":"object","additionalProperties":false,"required":[],"properties":{}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"vaultDetails","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"vaultDetails","description":"One vault in full: its leader, its return, its history and everyone in it.","x-airnode-returns":{"name":"string","vaultAddress":"string","leader":"string","description":"string","apr":"number","portfolio":"array","followerState":"object","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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"userVaultEquities","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"userVaultEquities","description":"What one account has in each vault it deposited into.","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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"leadingVaults","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"leadingVaults","description":"The vaults one account runs.","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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"subAccounts","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"subAccounts","description":"The sub-accounts one account holds, each with its own balances and positions."},"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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"referral","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"referral","description":"One account's referral standing: who referred it, what it has earned and who it referred.","x-airnode-returns":{"referredBy":"object","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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"approvedBuilders","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"approvedBuilders","description":"Which builders one account has approved to charge it a fee."},"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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"maxBuilderFee","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"maxBuilderFee","description":"The most one builder may charge one account, in tenths of a basis point."},"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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"borrowLendUserState","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"borrowLendUserState","description":"One account's borrow and lend positions, and how healthy they are.","x-airnode-returns":{"tokenToState":"array","health":"string","healthFactor":"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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"borrowLendReserveState","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"borrowLendReserveState","description":"One borrow and lend reserve: its rates, its utilisation and what is in it.","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"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. A pointer the response does not have is a 400."}}},{"title":"allBorrowLendReserveStates","type":"object","required":["operation","parameters"],"additionalProperties":false,"properties":{"operation":{"const":"allBorrowLendReserveStates","description":"Every borrow and lend reserve, in one call."},"parameters":{"type":"object","additionalProperties":false,"required":[],"properties":{}},"responseProjection":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional. Maps a name of your choosing to an RFC 6901 JSON Pointer into the upstream response, such as {\"price\": \"/ethereum/usd\"}. data then carries those names instead of the whole body, and the projection is part of the signed request identity. 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, or the projection names a path the response does not have."},"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":{"description":"The upstream response body: the JSON value when it parses as JSON, the text as received otherwise. With a projection, an object keyed by the names it asked for."},"signature":{"type":"string","description":"The attestation itself."}}}}},"x-airnode":{"address":"0x509F4275Cbe2E2201cc5444bAc8948E3cc7c665B","version":"0.1.0","attestation":{"scheme":"eip191-secp256k1","digest":"keccak256(abi.encodePacked(bytes32 requestHash, uint256 timestamp, bytes dataBytes))","dataBytes":"UTF-8 of data, or of its compact JSON when data is not a string","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. 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."}}}