{"openapi":"3.1.0","info":{"title":"Hookline API","version":"1.0.0","description":"Best-price swaps on Robinhood Chain (chain id 4663) across every Uniswap v3 / v4 pool and every Uniswap Aggregator Hook pool. Non-custodial: the API returns quotes and ready-to-sign Uniswap Universal Router transactions; your wallet signs and sends. Default limits: 60 quote / build calls and 240 reads per minute per IP; an X-Api-Key raises them. Builders can add their own fee (partnerFeeBps, up to the key's cap) paid on-chain to their payout address: apply at /build.","contact":{"name":"Hookline","url":"https://hookline.trade/build"},"license":{"name":"Proprietary: free to use for building on Hookline, see the docs"}},"servers":[{"url":"https://hookline.trade"}],"security":[{},{"ApiKey":[]}],"components":{"securitySchemes":{"ApiKey":{"type":"apiKey","in":"header","name":"X-Api-Key"}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}},"Leg":{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"},"venue":{"type":"string"},"pool":{"type":"string"},"feeLabel":{"type":"string"}}},"Part":{"type":"object","properties":{"shareBps":{"type":"integer"},"amountIn":{"type":"string"},"amountOut":{"type":"string"},"legs":{"type":"array","items":{"$ref":"#/components/schemas/Leg"}}}},"RouteOption":{"type":"object","properties":{"legs":{"type":"array","items":{"$ref":"#/components/schemas/Leg"}},"venues":{"type":"array","items":{"type":"string"}},"viaHooks":{"type":"boolean"},"amountOut":{"anyOf":[{"type":"string"},{"type":"null"}]},"vsBestBps":{"anyOf":[{"type":"integer"},{"type":"null"}]},"usedShareBps":{"type":"integer"},"rank":{"anyOf":[{"type":"integer"},{"type":"null"}]}}},"TokenAmount":{"type":"object","properties":{"token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"symbol":{"type":"string"},"decimals":{"type":"integer"},"amount":{"type":"string"},"amountAtomic":{"type":"string"},"usd":{"anyOf":[{"type":"number"},{"type":"null"}]}}},"ApprovalStep":{"oneOf":[{"type":"object","properties":{"kind":{"const":"approve"},"token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"spender":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"tx":{"type":"object","properties":{"to":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"data":{"type":"string"},"value":{"const":"0"}}}}},{"type":"object","properties":{"kind":{"const":"permit"},"token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"typedData":{"type":"object","description":"EIP-712 PermitSingle for Permit2 (includes EIP712Domain), sign with eth_signTypedData_v4"}}}]},"Quote":{"type":"object","properties":{"id":{"type":"string"},"taker":{"anyOf":[{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},{"type":"null"}]},"sell":{"$ref":"#/components/schemas/TokenAmount"},"buy":{"$ref":"#/components/schemas/TokenAmount"},"minReceived":{"type":"object","properties":{"amountAtomic":{"type":"string"},"amount":{"type":"string"}}},"slippageBps":{"type":"integer"},"priceImpactBps":{"type":"integer"},"fee":{"type":"object","properties":{"bps":{"type":"integer"},"amountAtomic":{"type":"string"},"amount":{"type":"string"},"partner":{"anyOf":[{"type":"object","properties":{"bps":{"type":"integer"},"amountAtomic":{"type":"string"},"amount":{"type":"string"},"recipient":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"}}},{"type":"null"}]}}},"parts":{"type":"array","items":{"$ref":"#/components/schemas/Part"}},"sources":{"type":"array","items":{"type":"string"}},"vsUniswapOnly":{"anyOf":[{"type":"object","properties":{"amountAtomic":{"type":"string"},"amount":{"type":"string"},"gainBps":{"type":"integer"}}},{"type":"null"}]},"vsSinglePath":{"anyOf":[{"type":"object","properties":{"amountAtomic":{"type":"string"},"amount":{"type":"string"},"gainBps":{"type":"integer"}}},{"type":"null"}]},"savings":{"anyOf":[{"type":"object","properties":{"baselineAtomic":{"type":"string"},"baseline":{"type":"string"},"savedAtomic":{"type":"string"},"saved":{"type":"string"},"savedUsd":{"anyOf":[{"type":"number"},{"type":"null"}]},"savedBps":{"type":"integer"}}},{"type":"null"}]},"routes":{"type":"array","items":{"$ref":"#/components/schemas/RouteOption"}},"search":{"type":"object","properties":{"routesEvaluated":{"type":"integer"},"routesQuotable":{"type":"integer"},"routesViaHooks":{"type":"integer"},"poolsConsidered":{"type":"integer"},"hookPoolsConsidered":{"type":"integer"},"hookPoolsOnChain":{"type":"integer"}}},"gas":{"type":"object","properties":{"units":{"type":"string"},"usd":{"anyOf":[{"type":"number"},{"type":"null"}]}}},"steps":{"type":"array","items":{"$ref":"#/components/schemas/ApprovalStep"}},"warnings":{"type":"array","items":{"type":"string"}},"expiresAt":{"type":"integer","description":"Unix seconds"}}},"SwapBuild":{"type":"object","properties":{"quoteId":{"type":"string"},"tx":{"type":"object","properties":{"to":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"data":{"type":"string"},"value":{"type":"string"},"chainId":{"const":4663},"gas":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"simulated":{"type":"boolean"},"expiresAt":{"type":"integer"}}},"Track":{"type":"object","properties":{"hash":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"status":{"enum":["pending","confirmed","failed","unknown"]},"amountOut":{"anyOf":[{"type":"string","description":"Atomic units"},{"type":"null"}]},"blockNumber":{"anyOf":[{"type":"integer"},{"type":"null"}]}}},"TokenRef":{"type":"object","properties":{"address":{"type":"string"},"symbol":{"type":"string"},"decimals":{"type":"integer","description":"-1 when unreadable"},"listed":{"type":"boolean"}}},"Coverage":{"type":"object","description":"Indexed Aggregator Hook swaps since `since`; windowed numbers are null while `fresh` is false (indexer more than an hour behind).","properties":{"since":{"anyOf":[{"type":"integer"},{"type":"null"}]},"indexedAt":{"anyOf":[{"type":"integer"},{"type":"null"}]},"fresh":{"type":"boolean"}}},"ChartPoint":{"type":"object","properties":{"t":{"type":"integer","description":"Bucket start, unix seconds (UTC aligned)"},"price":{"anyOf":[{"type":"number","description":"Volume-weighted average price of base in quote"},{"type":"null"}]},"volumeUsd":{"type":"number"},"swaps":{"type":"integer"}}},"MarketChart":{"type":"object","properties":{"price":{"anyOf":[{"type":"object","properties":{"poolId":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"venue":{"type":"string"},"base":{"$ref":"#/components/schemas/TokenRef"},"quote":{"$ref":"#/components/schemas/TokenRef"}}},{"type":"null"}]},"bucketSeconds":{"type":"integer"},"from":{"type":"integer"},"to":{"type":"integer"},"points":{"type":"array","items":{"$ref":"#/components/schemas/ChartPoint"}}}},"MarketSwap":{"type":"object","properties":{"ts":{"type":"integer"},"tx":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"poolId":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"venue":{"type":"string"},"side":{"enum":["buy","sell"]},"token":{"$ref":"#/components/schemas/TokenRef"},"amount":{"anyOf":[{"type":"string"},{"type":"null"}]},"counter":{"$ref":"#/components/schemas/TokenRef"},"counterAmount":{"anyOf":[{"type":"string"},{"type":"null"}]},"usd":{"anyOf":[{"type":"number"},{"type":"null"}]}}},"TokenOverviewRow":{"type":"object","properties":{"address":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"symbol":{"type":"string"},"name":{"type":"string"},"kind":{"enum":["base","pons","listed"]},"priceUsd":{"anyOf":[{"type":"number"},{"type":"null"}]},"change24h":{"anyOf":[{"type":"number","description":"Fraction, 0.034 = +3.4%"},{"type":"null"}]},"spark":{"type":"array","items":{"anyOf":[{"type":"number"},{"type":"null"}]}},"liquidityUsd":{"anyOf":[{"type":"number"},{"type":"null"}]},"volume24hUsd":{"anyOf":[{"type":"number"},{"type":"null"}]},"swaps24h":{"anyOf":[{"type":"integer"},{"type":"null"}]},"hookPools":{"type":"integer"},"uniswapPools":{"type":"integer"}}},"TokenPoolRow":{"type":"object","properties":{"id":{"type":"string"},"kind":{"enum":["hook","uniswap"]},"venue":{"type":"string"},"token0":{"$ref":"#/components/schemas/TokenRef"},"token1":{"$ref":"#/components/schemas/TokenRef"},"feeLabel":{"type":"string"},"liquidityUsd":{"anyOf":[{"type":"number"},{"type":"null"}]},"volume24hUsd":{"anyOf":[{"type":"number"},{"type":"null"}]},"swaps24h":{"anyOf":[{"type":"integer"},{"type":"null"}]},"routable":{"type":"boolean"}}},"Proof":{"type":"object","properties":{"hash":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"status":{"type":"string"},"taker":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"sell":{"type":"object"},"buy":{"type":"object"},"baseline":{"anyOf":[{"type":"string"},{"type":"null"}]},"saved":{"anyOf":[{"type":"object","properties":{"amount":{"type":"string"},"usd":{"anyOf":[{"type":"number"},{"type":"null"}]},"bps":{"type":"integer"}}},{"type":"null"}]},"route":{"type":"array"},"viaHooks":{"type":"boolean"},"blockNumber":{"anyOf":[{"type":"integer"},{"type":"null"}]},"createdAt":{"type":"integer"},"explorerUrl":{"type":"string"}}}}},"paths":{"/api/quote":{"get":{"summary":"Best exact-input quote (query parameters)","parameters":[{"name":"sell","in":"query","required":true,"schema":{"type":"string"},"description":"Symbol or 0x address"},{"name":"buy","in":"query","required":true,"schema":{"type":"string"}},{"name":"amount","in":"query","required":true,"schema":{"type":"string"},"description":"Human decimal, e.g. \"0.5\""},{"name":"taker","in":"query","schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"description":"Your wallet; needed to build and to get approval steps"},{"name":"slippageBps","in":"query","schema":{"type":"integer"}},{"name":"partnerFeeBps","in":"query","schema":{"type":"integer"},"description":"Builder fee (needs a builder X-Api-Key)"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Chain or swaps temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getQuote"},"post":{"summary":"Best exact-input quote (JSON body)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["sell","buy","amount"],"properties":{"sell":{"type":"string"},"buy":{"type":"string"},"amount":{"type":"string"},"taker":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"slippageBps":{"type":"integer"},"partnerFeeBps":{"type":"integer"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Chain or swaps temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postQuote"}},"/api/swap":{"post":{"summary":"Build the simulated Universal Router transaction for a quote made with a taker","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["quoteId"],"properties":{"quoteId":{"type":"string"},"permitSignature":{"type":"string","pattern":"^0x[0-9a-fA-F]{130}$"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwapBuild"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"Quote expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Simulation failed (readable reason)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Chain or swaps temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postSwap"}},"/api/swaps/track":{"post":{"summary":"Register the transaction hash of a built quote","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["quoteId","txHash"],"properties":{"quoteId":{"type":"string"},"txHash":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Track"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Chain or swaps temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postSwapsTrack"}},"/api/swaps/{hash}":{"get":{"summary":"Status of a tracked swap","parameters":[{"name":"hash","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Track"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Chain or swaps temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getSwapsByHash"}},"/api/swaps":{"get":{"summary":"A wallet's swaps through Hookline","parameters":[{"name":"taker","in":"query","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Chain or swaps temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getSwaps"}},"/api/proof/{hash}":{"get":{"summary":"Proof of Savings of a swap","parameters":[{"name":"hash","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Proof"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Chain or swaps temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getProofByHash"}},"/api/tx/{hash}":{"get":{"summary":"Receipt status of any Robinhood Chain transaction","parameters":[{"name":"hash","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"hash":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"status":{"enum":["pending","success","reverted"]},"blockNumber":{"anyOf":[{"type":"integer"},{"type":"null"}]}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Chain or swaps temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getTxByHash"}},"/api/tokens":{"get":{"summary":"Tradable tokens with USD prices","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"tokens":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"symbol":{"type":"string"},"name":{"type":"string"},"decimals":{"type":"integer"},"kind":{"type":"string"},"priceUsd":{"anyOf":[{"type":"number"},{"type":"null"}]},"viaHooks":{"type":"boolean"}}}},"updatedAt":{"type":"integer"}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Chain or swaps temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getTokens"}},"/api/balances":{"get":{"summary":"A wallet's balances of every listed token (atomic)","parameters":[{"name":"address","in":"query","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Chain or swaps temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getBalances"}},"/api/hooks":{"get":{"summary":"Every Aggregator Hook pool on Robinhood Chain","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Chain or swaps temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getHooks"}},"/api/stats":{"get":{"summary":"Live numbers","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Chain or swaps temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getStats"}},"/api/analytics/tokens":{"get":{"summary":"Every listed token with price, 24 h change, sparkline, hook liquidity and volume","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"tokens":{"type":"array","items":{"$ref":"#/components/schemas/TokenOverviewRow"}},"coverage":{"$ref":"#/components/schemas/Coverage"},"updatedAt":{"type":"integer"}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Chain or swaps temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getAnalyticsTokens"}},"/api/analytics/tokens/{token}":{"get":{"summary":"One token's market analytics (chart, buys and sells, pools, recent hook swaps)","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string"},"description":"Listed symbol or 0x address"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"object"},"change24h":{"anyOf":[{"type":"number"},{"type":"null"}]},"chart":{"anyOf":[{"$ref":"#/components/schemas/MarketChart"},{"type":"null"}]},"stats":{"type":"object"},"pools":{"type":"array","items":{"$ref":"#/components/schemas/TokenPoolRow"}},"recent":{"type":"array","items":{"$ref":"#/components/schemas/MarketSwap"}},"coverage":{"$ref":"#/components/schemas/Coverage"},"updatedAt":{"type":"integer"}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Token not listed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Chain or swaps temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getAnalyticsTokensByToken"}},"/api/analytics/pools/{id}":{"get":{"summary":"One Aggregator Hook pool's market analytics","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"description":"Aggregator Hook pool id (bytes32)"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"pool":{"type":"object"},"price":{"anyOf":[{"type":"number","description":"token0 in token1"},{"type":"null"}]},"change24h":{"anyOf":[{"type":"number"},{"type":"null"}]},"chart":{"anyOf":[{"$ref":"#/components/schemas/MarketChart"},{"type":"null"}]},"stats":{"type":"object"},"recent":{"type":"array","items":{"$ref":"#/components/schemas/MarketSwap"}},"coverage":{"$ref":"#/components/schemas/Coverage"},"updatedAt":{"type":"integer"}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown pool","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Chain or swaps temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getAnalyticsPoolsById"}},"/api/builder/me":{"get":{"summary":"Your builder key, project and usage","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Chain or swaps temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getBuilderMe"}},"/api/build/projects":{"get":{"summary":"Built on Hookline showcase","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Chain or swaps temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getBuildProjects"}},"/api/health":{"get":{"summary":"Liveness probe","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"block":{"type":"integer"},"registryAge":{"type":"integer"},"swapsOpen":{"type":"boolean"}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Chain or swaps temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getHealth"}},"/api/mcp":{"post":{"summary":"Remote MCP server (Streamable HTTP, stateless JSON-RPC)","description":"Tools: list_tokens, get_quote, build_swap, track_swap, swap_status, wallet_balances, hook_pools, hookline_stats, proof_of_savings.","responses":{"200":{"description":"JSON-RPC response"},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Chain or swaps temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postMcp"}}}}