{"openapi":"3.0.0","paths":{"/v2/tokens":{"get":{"operationId":"SupportedController_getSupportedTokensV2","summary":"Get a list of supported tokens with optional filters","description":"Returns a list of supported tokens by platform, including contextual information such as decimals, name, network, underlying tokens, price, TVL, etc. `Each filter type is concatenated with logical AND. Filter inputs that are arrays are logical OR.`","parameters":[{"name":"search","required":false,"in":"query","description":"Optional search string that searches the contents for matches with token name (e.g. \"balancer usdc usdt dai\")","schema":{"type":"string"}},{"name":"ids","required":false,"in":"query","description":"Optional comma-separated ids to filter. Ids must be in \"[network]:[address]\" format. e.g. `ethereum:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48`","schema":{"type":"string"}},{"name":"platforms","required":false,"in":"query","description":"Optional platforms to filter from","schema":{"type":"array","items":{"type":"string","enum":["native","basic","aavev2","aavev2wrapped","aavev3","aavev3-stata-token","aavev3-umbrella","aarna-protocol","accountable","aerodrome","aerodrome-slipstream","alienbase","amphor","ample","ankr","anzen","apyx","apeswap","apeswap-lending","arcadia-v2","arche","angle","aegis","aera","altura","apollo-diversified-credit","asymmetry","hamilton-lane","securitize-aaa-clo","arbitrumexchange","aster","aura","avant","avantis","babydogeswap","balancerv2","balancer-v3","balancerv2boosted","bankerjoe","baseswap","bedrock","beets","beetsboosted","beets-v3","beefy","biswap","bifrost","benqi","benqi-staked","binance-staked-eth","blackhole-v3","blackrock-buidl","camelotv2","camelot-v3","cap","cian","coinbase","compound","compound-v3","concrete","convex","crypto-liquid","csigma-finance","curve","curve-savings","curve-llamalend","curve-gauges","d2-finance","dfynv1","dinero","dtrinity","ethena","etherfi","equalizer","ern","euler","eva-markets","extra-finance-xlend","falcon-finance","felix-usdhl","firelight","fluid","40-acres","frax-finance","fraxswap","fluxfinance","flaunch","fx-saving","gaib","goat","hastra","harvest-finance","hypha","gamma-thena","gamma-quickswap","gamma-camelot","gains-network","gearbox","glif","gyroscope","hyperswap-v2","hyperswap-v3","hypurrfi","infinifi","inverse","ipor-fusion","kelp","kinetiq","lagoon","landx-finance","lazy-summer-protocol","ledgity","level","lido","lift-dollar","liquid-collective","liquity","lista","lombard","lorenzo-protocol","machfi","mainstreet","mantle-restaking","matrixdock","mdex","mellow-core","mellow-lrt","meta-pool-eth","midas","mmfinance","monstrodefi","morpho","moonwell","mystic-finance","neutrl","node-dao","noon","nomiswap","ondo","oku-trade","openeden","opentrade","hashnote","origin","overnight-finance","pancakeswap","pancakeswap-v3","pangolin","parallel-protocol","pareto","pendle","peapods-metavault","pendle-pt","pendle-sy","pendle-yt","pharaoh-v2","prime-staked","project-x","pooltogether","pooltogether-v5","puffer","quickswap","quickswap-v3","radiantv2","radpie","ramses-v2","re","rebind","renzo","resupply","resolv","reservoir","revert-finance","rocketswap","rocket-pool","royco-dawn","saturn","savings-gho","scream","seamless-protocol","shadow-liquid","shadow-v3","shibaswap","sierra","sky-money-lending","sky-money-savings","soswap","spark","spark-savings","sparkdex-v3","sparkdex-v4","spiritswap","spookyswap","stablecomp","stakedao","stader","stafi","stakedao-vaults","stakedao-gauges","stake-link","staked-aave","stakewise","staking-polygon","stargate","spectra-metavaults","steakhouse-financial","strata","sturdy","stusdt","superform","superstate","sushiswap","sushiswap-v3","swapbased","synthswap","syrup-finance","swapx-algebra","swell","taler-finance","term-finance","thegranary","theo","travessia-credit","3jane","trevee-earn","treehouse","autofinance","traderjoe","turtle-club","uniswapv2","uniswap-v3","uniswap-v4","uwulend","usual","usd-ai","usdx-money","usdd","valantis-staked-hype","vaultcraft","veda","velodrome-v2","velodrome-slipstream","venus","verse","vesper","wasabi","xstocks","yearn","yearn-v3","yearncrv","yield-basis","yield-basis-gauge","yield-point","yieldfi","yieldyak","yieldnest","yo-protocol","yuzu-money","unitas","upshift","zircuit-finance","zora-v4","custom"]}}},{"name":"networks","required":false,"in":"query","description":"Optional networks to search from (ethereum, avalanche, etc.) (Default: all)","schema":{"type":"array","items":{"type":"string","enum":["ethereum","optimism","arbitrum","polygon","avalanche","bsc","base","sonic","hyperevm","plasma","flare"]}}},{"name":"minLiquidity","required":false,"in":"query","description":"Optional minimum liquidity/TVL (in USD) available if asset is a pool","schema":{"type":"number"}},{"name":"maxLiquidity","required":false,"in":"query","description":"Optional maximum liquidity/TVL (in USD) available if asset is a pool","schema":{"type":"number"}},{"name":"sortBy","required":false,"in":"query","description":"Optional field to sort items by (Default: sorted by internal id)","schema":{"enum":["key","decimals","name","symbol","updatedAt","price","liquidity","platform","network","apy","volumeUsd1d","volumeUsd7d","createdAt","verifiedAt"],"type":"string"}},{"name":"sortDirection","required":false,"in":"query","description":"Optional sort direction (Default: asc)","schema":{"default":"asc","enum":["asc","desc"],"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Optional number of items to return `(Max: 250)`","schema":{"default":25,"type":"number"}},{"name":"page","required":false,"in":"query","description":"Optional page number for batch of items to return. Must also provide limit if page provided. `(Default: 0)`","schema":{"default":0,"type":"number"}},{"name":"tags","required":false,"in":"query","description":"Optional comma-separated tags to filter","schema":{"type":"string"}},{"name":"minApy","required":false,"in":"query","description":"Optional minimum APY (percentage) available if asset is a pool","schema":{"type":"number"}},{"name":"maxApy","required":false,"in":"query","description":"Optional maximum APY (percentage) available if asset is a pool. Defaults to 1e6 if not provided.","schema":{"type":"number"}},{"name":"isPortable","required":false,"in":"query","description":"If an asset is portable","schema":{"type":"boolean"}},{"name":"isVerified","required":false,"in":"query","description":"If an asset is verified","schema":{"type":"boolean"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportedTokenResponseV2"}}}}},"security":[{"authorization":[]}],"tags":["Supported"]}},"/v1/networks":{"get":{"operationId":"SupportedController_getSupportedNetworks","summary":"Get a list of supported networks","description":"Returns a list of supported networks","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"}}}}}},"security":[{"authorization":[]}],"tags":["Supported"]}},"/v2/platforms":{"get":{"operationId":"SupportedController_getSupportedPlatformsV2","summary":"Get a list of enabled platforms","description":"Returns a list of enabled platforms","parameters":[{"name":"type","required":false,"in":"query","description":"Filter by platform type","example":"yields","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SupportedPlatformsV2Response"}}}}}},"security":[{"authorization":[]}],"tags":["Supported"]}},"/v2/tokens/history":{"get":{"operationId":"SupportedController_getTokenHistory","summary":"Get historical data for a token with optional filters","description":"Returns a list of historical data for a supported tokens including historical price, liquidity, totalSupply, reserves, apy, etc. over a specific `resolution`","parameters":[{"name":"id","required":true,"in":"query","description":"Id to filter. Id must be in \"[network]:[address]\" format. e.g. `ethereum:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48`","schema":{"type":"string"}},{"name":"from","required":false,"in":"query","description":"The start date. Must be a valid unix timestamp newer or equal to one year ago.","schema":{"default":1783330319,"type":"number"}},{"name":"page","required":false,"in":"query","description":"Optional page number of items to return. `(Default: 0)`","schema":{"default":0,"type":"number"}},{"name":"resolution","required":false,"in":"query","description":"The resolution for each entry in the historical data. For example 15m will return 15 minute \"candles\". `(Default: 1d)`","schema":{"enum":["15m","1h","4h","1d"],"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenHistoryResponse"}}}}},"security":[{"authorization":[]}],"tags":["Supported"]}},"/v3/tokens/transactions":{"get":{"operationId":"SupportedController_getTokenTransactionsPaginated","summary":"Get a list of token transactions in the last 24h","description":"Returns a list of withdraws, deposits, and swaps of a token over the last 24h","parameters":[{"name":"id","required":true,"in":"query","description":"Id to filter. Id must be in \"[network]:[address]\" format. e.g. `ethereum:0x4d5f47fa6a74757f35c14fd3a6ef8e3c9bc514e8`","schema":{"type":"string"}},{"name":"cursor","required":false,"in":"query","description":"Cursor for next page of transactions. This is an opaque string returned in the response of this endpoint to fetch the next batch of transactions.","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Optional number of items to return `(Max: 50)`","schema":{"default":25,"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenTransactionsPaginatedResponse"}}}}},"security":[{"authorization":[]}],"tags":["Supported"]}},"/v3/tokens/metrics":{"get":{"operationId":"SupportedController_getTokensMetrics","summary":"Get metrics of a token in the last 48h","description":"Returns aggregated metrics of a token deposits, withdraws, and swaps over the last 48h","parameters":[{"name":"id","required":true,"in":"query","description":"Id to filter. Id must be in \"[network]:[address]\" format. e.g. `ethereum:0x4d5f47fa6a74757f35c14fd3a6ef8e3c9bc514e8`","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlatformVolumeMetricsResponse"}}}}},"security":[{"authorization":[]}],"tags":["Supported"]}},"/v2/tokens/holders":{"get":{"operationId":"SupportedController_getTokenHolders","summary":"Get token holders list [BETA]","description":"Returns a paginated list of token holders with their balances and percentages, sorted by balance in descending order. Beta version, may be unstable.","parameters":[{"name":"id","required":true,"in":"query","description":"Token ID in format \"network:address\" (e.g. \"ethereum:0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee\")","example":"ethereum:0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Optional number of items to return (Default: 100, Max: 1000)","schema":{"minimum":100,"maximum":1000,"default":100,"type":"number"}},{"name":"page","required":false,"in":"query","description":"Optional page number for batch of items to return. Must also provide limit if page provided. (Default: 0)","schema":{"minimum":0,"default":0,"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenHoldersResponseDto"}}}}},"security":[{"authorization":[]}],"tags":["Supported"]}},"/v2/portal":{"get":{"operationId":"PortalController_portalV2","summary":"Create a zap or swap (Portal) order","description":"Returns a validated, unsigned portal transaction that can be submitted to a node via ethers/web3.","parameters":[{"name":"sender","required":true,"in":"query","description":"The address of the owner of the `inputToken`.","schema":{"type":"string"}},{"name":"inputToken","required":true,"in":"query","description":"The ERC20 token address to spend (e.g. DAI, USDC, etc.). Use address(0) for the native token. Address must be prepended with the network name. (e.g `ethereum:0x6B175474E89094C44Da98b954EedeAC495271d0F` for DAI)","schema":{"type":"string"}},{"name":"inputAmount","required":true,"in":"query","description":"The quantity of `inputToken` to spend in `inputToken` base units","schema":{"type":"string"}},{"name":"outputToken","required":true,"in":"query","description":"The ERC20 token address to buy (e.g. a Curve or Sushiswap pool, or a basic token like DAI). Use address(0) for the native token. Address must be prepended with the network name. (e.g. `ethereum:0x0000000000000000000000000000000000000000` for the native token)","schema":{"type":"string"}},{"name":"slippageTolerancePercentage","required":false,"in":"query","description":"The maximum acceptable slippage for the portal. Must be a number between 0.1 and 10 (e.g. 0.25 for 0.25%, 2 for 2%). If not set, auto slippage will be used instead (requires that `validate` is set to true)","schema":{"type":"number"}},{"name":"partner","required":false,"in":"query","description":"The referral address for fee sharing and analytics","schema":{"type":"string"}},{"name":"feePercentage","required":false,"in":"query","description":"The fee to charge for the portal. Must be a percentage between 0 and 1 (e.g. 0.45 for 0.45%). If a fee is used, a partner address must also be provided. Default fee is 0.3%","schema":{"type":"number"}},{"name":"permitSignature","required":false,"in":"query","description":"A valid secp256k1 signature of Permit by `sender`","schema":{"type":"string"}},{"name":"permitDeadline","required":false,"in":"query","description":"The optional deadline to use for the permit transaction. If not provided, a default, large value will be used instead. Must be a valid uint256 value. Not used if `permitSignature` is not provided","schema":{"type":"string"}},{"name":"validate","required":false,"in":"query","description":"When true, gas will be estimated and the portal transaction will be validated for success.","schema":{"default":true,"type":"boolean"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortalResponseV2"}}}}},"security":[{"authorization":[]}],"tags":["Portal"]},"post":{"operationId":"PortalController_portalV2Submit","summary":"Submit a signed portal transaction onchain and pays the gas fee on behalf of the user","description":"Returns a transaction hash that can be used to track the status of the transaction. Also returns transaction data for debugging purposes.","parameters":[{"name":"orderId","required":true,"in":"query","description":"The order ID received in the PortalV2 response context","schema":{"type":"string"}},{"name":"signature","required":true,"in":"query","description":"The signed portal order","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortalResponseV2"}}}}},"security":[{"authorization":[]}],"tags":["Portal"]}},"/v2/portal/status":{"get":{"operationId":"PortalController_status","summary":"Retrieve portal order","description":"Retrieves previously generated Portal Order","parameters":[{"name":"orderId","required":true,"in":"query","description":"The order ID received in the PortalV2 response context","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortalResponseV2"}}}}},"security":[{"authorization":[]}],"tags":["Portal"]}},"/v2/portal/estimate":{"get":{"operationId":"PortalController_estimatePortalV2","summary":"Estimate the output of a portal via our simulation engine","description":"Returns the output amount (accounting for slippage, price impact, and fees) for a portal transaction via our simulation engine.","parameters":[{"name":"inputToken","required":true,"in":"query","description":"The token to spend, in the format \"network:address\" (e.g. `ethereum:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48` for USDC). For native tokens (ETH, MATIC etc), use address(0) (e.g. `ethereum:0x0000000000000000000000000000000000000000`)","example":"ethereum:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48","schema":{"type":"string"}},{"name":"inputAmount","required":true,"in":"query","description":"The amount of inputToken to spend, in the token's smallest unit (e.g. Wei for ETH, atomic units for other tokens)","example":"1000000000","schema":{"type":"string"}},{"name":"outputToken","required":true,"in":"query","description":"The ERC20 token address to buy (e.g. a Curve or Sushiswap pool, or a basic token like DAI). Use address(0) for the native token. Address must be prepended with the network name. (e.g. `ethereum:0x0000000000000000000000000000000000000000` for the native token)","example":"ethereum:0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EstimatePortalV2Response"}}}}},"security":[{"authorization":[]}],"tags":["Portal"]}},"/v3/portal/status":{"get":{"operationId":"PortalController_statusV2CrossChain","summary":"Retrieve cross-chain portal order status","description":"Retrieve status and details about a cross-chain portal order.","parameters":[{"name":"orderId","required":true,"in":"query","description":"The order ID received in the PortalV2 response context","schema":{"type":"string"}},{"name":"txHash","required":true,"in":"query","description":"The transaction hash of the submitted portal transaction","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortalResponseV2"}}}}},"security":[{"authorization":[]}],"tags":["Portal"]}},"/v2/account":{"get":{"operationId":"AccountController_getAccountV2","summary":"Get token balances","description":"Returns the current balance for ERC20 or network tokens for the `owner` if the balance is greater than 0","parameters":[{"name":"owner","required":true,"in":"query","description":"Required address of the owner of the tokens whose balance is being queried","schema":{"type":"string"}},{"name":"networks","required":true,"in":"query","description":"Required list of networks to search from (ethereum, avalanche, etc.)","schema":{"type":"array","items":{"type":"string","enum":["ethereum","optimism","arbitrum","polygon","avalanche","bsc","base","sonic","hyperevm","plasma","flare"]}}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountResponseDto"}}}}},"security":[{"authorization":[]}],"tags":["Account"]}},"/v2/approval":{"get":{"operationId":"ApprovalController_approveV2","summary":"Check allowances for Portals router and approve if needed","description":"Returns the current allowance for the Portals router based on `inputToken`, in addition to an unsigned approval transaction for use by `sender` if the returned property `shouldApprove` is true. Also returns a Permit object if applicable for gasless approvals (See https://build.portals.fi/docs for more)","parameters":[{"name":"sender","required":true,"in":"query","description":"The address of the owner.","schema":{"type":"string"}},{"name":"inputToken","required":true,"in":"query","description":"The token key to spend. Not to be used for Native tokens (e.g. ETH, MATIC) as these do not require approval. Address must be prepended with the network name. (e.g `ethereum:0x6B175474E89094C44Da98b954EedeAC495271d0F` for DAI)","schema":{"type":"string"}},{"name":"inputAmount","required":true,"in":"query","description":"The quantity of `inputToken` to spend","schema":{"type":"string"}},{"name":"permitDeadline","required":false,"in":"query","description":"The optional deadline to use for the permit transaction. If not provided, a default, large value will be used instead. Must be a valid uint256 value.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalResponseV2"}}}}},"tags":["Portal"]}},"/v2/approval/cross-chain":{"get":{"operationId":"ApprovalController_approveCrossChainV2","summary":"Check allowances for Squid router and approve if needed","description":"Returns the current allowance for the Squid router based on `inputToken`, in addition to an unsigned approval transaction for use by `sender` if the returned property `shouldApprove` is true. Also returns a Permit object if applicable for gasless approvals (See https://build.portals.fi/docs for more)","parameters":[{"name":"sender","required":true,"in":"query","description":"The address of the owner.","schema":{"type":"string"}},{"name":"inputToken","required":true,"in":"query","description":"The token key to spend. Not to be used for Native tokens (e.g. ETH, MATIC) as these do not require approval. Address must be prepended with the network name. (e.g `ethereum:0x6B175474E89094C44Da98b954EedeAC495271d0F` for DAI)","schema":{"type":"string"}},{"name":"inputAmount","required":true,"in":"query","description":"The quantity of `inputToken` to spend","schema":{"type":"string"}},{"name":"permitDeadline","required":false,"in":"query","description":"The optional deadline to use for the permit transaction. If not provided, a default, large value will be used instead. Must be a valid uint256 value.","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalResponseV2"}}}}},"tags":["Portal"]}},"/health":{"get":{"operationId":"HealthController_ping","summary":"Check API Health Status","description":"Verifies that the API service is running and responsive.","parameters":[],"responses":{"200":{"description":"The service is healthy and responsive.","content":{"application/json":{"schema":{"example":{"status":"ok","timestamp":"2025-10-30T12:30:00.000Z"}}}}}},"tags":["Health"]}}},"info":{"title":"Portals","description":"","version":"3.0","contact":{}},"tags":[],"servers":[],"components":{"securitySchemes":{"authorization":{"type":"apiKey","in":"header","name":"authorization"}},"schemas":{"TokenMetricResponseDto":{"type":"object","properties":{"apy":{"type":"string","readOnly":true},"baseApy":{"type":"string","readOnly":true},"rewardApy":{"type":"string","readOnly":true},"borrowApy":{"type":"string","readOnly":true},"baseBorrowApy":{"type":"string","readOnly":true},"volumeUsd1d":{"type":"string","readOnly":true},"volumeUsd7d":{"type":"string","readOnly":true},"price1d":{"type":"string","readOnly":true,"description":"Visible to paid tier only"},"price7d":{"type":"string","readOnly":true,"description":"Visible to paid tier only"},"liquidity1d":{"type":"string","readOnly":true,"description":"Visible to paid tier only"},"liquidity7d":{"type":"string","readOnly":true,"description":"Visible to paid tier only"},"apy1d":{"type":"string","readOnly":true,"description":"Visible to paid tier only"},"apy7d":{"type":"string","readOnly":true,"description":"Visible to paid tier only"},"borrowApy1d":{"type":"string","readOnly":true,"description":"Visible to paid tier only"},"borrowApy7d":{"type":"string","readOnly":true,"description":"Visible to paid tier only"},"liquidityDelta1d":{"type":"string","readOnly":true,"description":"Visible to paid tier only"},"liquidityDelta7d":{"type":"string","readOnly":true,"description":"Visible to paid tier only"},"priceDelta1d":{"type":"string","readOnly":true,"description":"Visible to paid tier only"},"priceDelta7d":{"type":"string","readOnly":true,"description":"Visible to paid tier only"},"apyDelta1d":{"type":"string","readOnly":true,"description":"Visible to paid tier only"},"apyDelta7d":{"type":"string","readOnly":true,"description":"Visible to paid tier only"},"borrowApyDelta1d":{"type":"string","readOnly":true,"description":"Visible to paid tier only"},"borrowApyDelta7d":{"type":"string","readOnly":true,"description":"Visible to paid tier only"}},"required":["apy","baseApy","rewardApy","borrowApy","baseBorrowApy","volumeUsd1d","volumeUsd7d","price1d","price7d","liquidity1d","liquidity7d","apy1d","apy7d","borrowApy1d","borrowApy7d","liquidityDelta1d","liquidityDelta7d","priceDelta1d","priceDelta7d","apyDelta1d","apyDelta7d","borrowApyDelta1d","borrowApyDelta7d"]},"TokenResponseDto":{"type":"object","properties":{"key":{"type":"string","readOnly":true},"name":{"type":"string","readOnly":true},"decimals":{"type":"number","readOnly":true},"symbol":{"type":"string","readOnly":true},"address":{"type":"string","readOnly":true},"addresses":{"type":"object","readOnly":true},"platform":{"type":"string","readOnly":true},"network":{"type":"string","readOnly":true},"price":{"type":"number","readOnly":true},"images":{"readOnly":true,"type":"array","items":{"type":"string"}},"updatedAt":{"format":"date-time","type":"string","readOnly":true},"createdAt":{"format":"date-time","type":"string","readOnly":true},"verifiedAt":{"format":"date-time","type":"string","readOnly":true},"tokens":{"readOnly":true,"type":"array","items":{"type":"string"}},"poolAddress":{"type":"string","readOnly":true},"liquidity":{"type":"number","readOnly":true},"metrics":{"readOnly":true,"allOf":[{"$ref":"#/components/schemas/TokenMetricResponseDto"}]},"metadata":{"type":"object","readOnly":true},"image":{"type":"string","readOnly":true},"banner":{"type":"string","readOnly":true},"totalSupply":{"type":"string","readOnly":true},"totalBorrow":{"type":"string","readOnly":true},"circulatingSupply":{"type":"string","readOnly":true},"reserves":{"readOnly":true,"type":"array","items":{"type":"string"}},"pricePerShare":{"type":"string","readOnly":true},"isClaimed":{"type":"boolean","readOnly":true},"isPortable":{"type":"boolean","readOnly":true}},"required":["key","name","decimals","symbol","address","addresses","platform","network","price","images","updatedAt","createdAt","verifiedAt","tokens","poolAddress","liquidity","metrics","metadata","image","banner","totalSupply","totalBorrow","circulatingSupply","reserves","pricePerShare","isClaimed","isPortable"]},"SupportedTokenResponseV2":{"type":"object","properties":{"totalItems":{"type":"number","readOnly":true},"pageItems":{"type":"number","readOnly":true},"more":{"type":"boolean","readOnly":true},"page":{"type":"number","readOnly":true},"tokens":{"readOnly":true,"type":"array","items":{"$ref":"#/components/schemas/TokenResponseDto"}}},"required":["totalItems","pageItems","more","page","tokens"]},"SupportedPlatformsV2Response":{"type":"object","properties":{"platform":{"type":"string","readOnly":true},"name":{"type":"string","readOnly":true},"image":{"type":"string","readOnly":true},"network":{"type":"string","readOnly":true}},"required":["platform","name","image","network"]},"HistoryResponse":{"type":"object","properties":{"time":{"format":"date-time","type":"string","readOnly":true},"highPrice":{"type":"string","readOnly":true},"lowPrice":{"type":"string","readOnly":true},"openPrice":{"type":"string","readOnly":true},"closePrice":{"type":"string","readOnly":true},"liquidity":{"type":"string","readOnly":true},"reserves":{"readOnly":true,"type":"array","items":{"type":"string"}},"totalSupply":{"type":"string","readOnly":true},"totalBorrow":{"type":"string","readOnly":true},"circulatingSupply":{"type":"string","readOnly":true},"pricePerShare":{"type":"string","readOnly":true},"volume1dUsd":{"type":"string","readOnly":true},"apy":{"type":"string","readOnly":true},"baseApy":{"type":"string","readOnly":true},"rewardApy":{"type":"string","readOnly":true},"borrowApy":{"type":"string","readOnly":true},"baseBorrowApy":{"type":"string","readOnly":true}},"required":["time","highPrice","lowPrice","openPrice","closePrice","liquidity","reserves","totalSupply","totalBorrow","circulatingSupply","pricePerShare","volume1dUsd","apy","baseApy","rewardApy","borrowApy","baseBorrowApy"]},"TokenHistoryResponse":{"type":"object","properties":{"totalItems":{"type":"number","readOnly":true},"pageItems":{"type":"number","readOnly":true},"more":{"type":"boolean","readOnly":true},"page":{"type":"number","readOnly":true},"history":{"readOnly":true,"type":"array","items":{"$ref":"#/components/schemas/HistoryResponse"}}},"required":["totalItems","pageItems","more","page","history"]},"TokenSwapActivityResponse":{"type":"object","properties":{"inputAmount":{"type":"string"},"inputToken":{"type":"string"},"inputTokenAmountUsd":{"type":"string"},"outputAmount":{"type":"string"},"outputToken":{"type":"string"},"outputTokenAmountUsd":{"type":"string"},"transactionHash":{"type":"string"},"time":{"type":"string"},"direction":{"type":"number"},"type":{"type":"string","enum":["swap"]}},"required":["inputAmount","inputToken","inputTokenAmountUsd","outputAmount","outputToken","outputTokenAmountUsd","transactionHash","time","direction","type"]},"TokenFlowAmountResponse":{"type":"object","properties":{"key":{"type":"string"},"symbol":{"type":"string"},"amount":{"type":"string"},"amountUsd":{"type":"string"}},"required":["key","symbol","amount","amountUsd"]},"TokenFlowActivityResponse":{"type":"object","properties":{"amounts":{"type":"array","items":{"$ref":"#/components/schemas/TokenFlowAmountResponse"}},"transactionHash":{"type":"string"},"time":{"type":"string"},"type":{"type":"string","enum":["withdraw","deposit"]}},"required":["amounts","transactionHash","time","type"]},"TokenPositionAmountResponse":{"type":"object","properties":{"key":{"type":"string"},"symbol":{"type":"string"},"amount":{"type":"string"},"amountUsd":{"type":"string"},"account":{"type":"string"}},"required":["key","symbol","amount","amountUsd","account"]},"TokenPositionActivityResponse":{"type":"object","properties":{"amounts":{"type":"array","items":{"$ref":"#/components/schemas/TokenPositionAmountResponse"}},"transactionHash":{"type":"string"},"time":{"type":"string"},"type":{"type":"string","enum":["borrow","repay"]}},"required":["amounts","transactionHash","time","type"]},"TokenTransactionsPaginatedCursorsResponse":{"type":"object","properties":{"hasNextPage":{"type":"boolean","description":"Indicates if there is a next page available","example":true,"readOnly":true},"endCursor":{"type":"string","readOnly":true,"description":"Cursor to fetch the next page of results. Format is base64 encoded string of the last transaction of the current page.","example":"eyJ3aXRoZHJhdyI6IjE3NjEyMzI1MTE6MHhhMjA4MDlmOGY1ZmMzMmEzYmU0NDk0ZTJiNTZmYzYzZjE5NjU3ZTBmYzMxNWI0YmQxMmYyNjMxMzdjOGNkMjg4LTIwNCIsImRlcG9zaXQiOiIxNzYxMjMyNTExOjB4YWVhZDQ5Y2VkZTM0OGNlMWQ4NmU4ZjkyNDNlMDg3ODdkYjEwNWE3ZDA4NjE5YTEyZDg1NDEyODlhMGFlYzZmYi0xODQiLCJzd2FwIjoiMTc3Mzc2NjI0NzoweDFiYjYwMDQzNzFlZGY5ZDY0NTQxYzFkZGU4NTgxYzdlNmIzMDI4ZDQ5ZjIzOGVlMjMzMjlkYmM0NWRjMTQ5MzYtMjkifQ=="}},"required":["hasNextPage"]},"TokenTransactionsPaginatedResponse":{"type":"object","properties":{"pageInfo":{"description":"Pagination info for fetching the next page of transactions. If hasNextPage is false, endCursor will be null and frontend should stop paginating.","readOnly":true,"allOf":[{"$ref":"#/components/schemas/TokenTransactionsPaginatedCursorsResponse"}]},"activities":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/TokenSwapActivityResponse"},{"$ref":"#/components/schemas/TokenFlowActivityResponse"},{"$ref":"#/components/schemas/TokenPositionActivityResponse"}]},"readOnly":true},"dailyVolumes":{"type":"object","description":"Aggregated daily stats keyed by UTC date (YYYY-MM-DD)","readOnly":true,"additionalProperties":{"type":"object","properties":{"grossVolumeRaw":{"type":"string","example":"1500000000000000000"},"grossVolumeUsd":{"type":"string","example":"2500.50"},"eventCount":{"type":"number","example":42}}}},"dailyDebtFlow":{"type":"object","description":"Aggregated daily debt flow stats keyed by UTC date (YYYY-MM-DD) for lending markets","readOnly":true,"additionalProperties":{"type":"object","properties":{"grossDebtFlowRaw":{"type":"string","example":"1500000000000000000"},"grossDebtFlowUsd":{"type":"string","example":"2500.50"},"debtEventCount":{"type":"number","example":42}}}}},"required":["pageInfo","activities"]},"PlatformVolumeIntervalMetricsResponse":{"type":"object","properties":{"netVolumeUsd":{"type":"string","readOnly":true},"grossVolumeUsd":{"type":"string","readOnly":true},"grossVolumeUsdChange":{"type":"number","readOnly":true},"swapVolumeUsdChange":{"type":"number","readOnly":true},"depositVolumeUsd":{"type":"string","readOnly":true},"withdrawVolumeUsd":{"type":"string","readOnly":true},"swapVolumeUsd":{"type":"string","readOnly":true},"swapBuyVolumeUsd":{"type":"string","readOnly":true},"eventCount":{"type":"number","readOnly":true},"swapCount":{"type":"number","readOnly":true},"swapBuyCount":{"type":"number","readOnly":true},"swapSellCount":{"type":"number","readOnly":true},"depositCount":{"type":"number","readOnly":true},"withdrawCount":{"type":"number","readOnly":true}},"required":["netVolumeUsd","grossVolumeUsd","grossVolumeUsdChange","swapVolumeUsdChange","depositVolumeUsd","withdrawVolumeUsd","swapVolumeUsd","swapBuyVolumeUsd","eventCount","swapCount","swapBuyCount","swapSellCount","depositCount","withdrawCount"]},"PlatformVolumeMetricsResponse":{"type":"object","properties":{"15m":{"readOnly":true,"allOf":[{"$ref":"#/components/schemas/PlatformVolumeIntervalMetricsResponse"}]},"30m":{"readOnly":true,"allOf":[{"$ref":"#/components/schemas/PlatformVolumeIntervalMetricsResponse"}]},"1h":{"readOnly":true,"allOf":[{"$ref":"#/components/schemas/PlatformVolumeIntervalMetricsResponse"}]},"2h":{"readOnly":true,"allOf":[{"$ref":"#/components/schemas/PlatformVolumeIntervalMetricsResponse"}]},"4h":{"readOnly":true,"allOf":[{"$ref":"#/components/schemas/PlatformVolumeIntervalMetricsResponse"}]},"8h":{"readOnly":true,"allOf":[{"$ref":"#/components/schemas/PlatformVolumeIntervalMetricsResponse"}]},"1d":{"readOnly":true,"allOf":[{"$ref":"#/components/schemas/PlatformVolumeIntervalMetricsResponse"}]},"2d":{"readOnly":true,"allOf":[{"$ref":"#/components/schemas/PlatformVolumeIntervalMetricsResponse"}]}},"required":["15m","30m","1h","2h","4h","8h","1d","2d"]},"TokenHoldersResponseDto":{"type":"object","properties":{"totalItems":{"type":"number","description":"Total number of holders for this token"},"pageItems":{"type":"number","description":"Number of holders returned in this page"},"more":{"type":"boolean","description":"Whether there are more pages of holders available"},"page":{"type":"number","description":"Current page number"},"totalSupply":{"type":"number","description":"Total supply of the token"},"holders":{"description":"List of token holders with their balances","example":[{"address":"0x123...abc","balance":1000.5,"rawBalance":"1005000000000000000000","balanceUsd":152.5,"percentage":0.01}],"type":"array","items":{"type":"object"}}},"required":["totalItems","pageItems","more","page","totalSupply","holders"]},"PortalContextV2":{"type":"object","properties":{"orderId":{"type":"string","description":"The order ID"},"inputToken":{"type":"string","description":"The address of the `inputToken`"},"inputAmount":{"type":"string","description":"The amount of `inputToken` to be sent in inputToken units"},"inputAmountUsd":{"type":"number","description":"The USD amount of inputToken to be sent"},"outputToken":{"type":"string","description":"The address of outputToken"},"outputAmount":{"type":"string","description":"The amount of `outputToken`received if executed now in outputToken units."},"outputAmountUsd":{"type":"number","description":"The USD Amount of `outputToken` received if executed now."},"outputAmountSignedOrder":{"type":"string","description":"The amount of `outputToken` received if executed as a signed order."},"outputAmountUsdSignedOrder":{"type":"number","description":"The USD Amount of `outputToken` received if executed as a signed order."},"minOutputAmount":{"type":"string","description":"The minimum acceptable amount of `outputToken` received assuming worst-case slippage in outputToken units"},"minOutputAmountUsd":{"type":"number","description":"The minimum USD amount of `outputToken`received, assuming worst-case slippage"},"minOutputAmountSignedOrder":{"type":"string","description":"The minimum amount of `outputToken` received assuming worst-case slippage when executing a signed order"},"minOutputAmountUsdSignedOrder":{"type":"number","description":"The minimum USD amount received of `outputToken` assuming worst-case slippage when executing signed order"},"slippageTolerancePercentage":{"type":"number","description":"The maximum acceptable global slippage percentage for the portal"},"target":{"type":"string","description":"The address of the Portals.fi router where the transaction will be executed. The target is on the same network as the `inputToken`"},"partner":{"type":"string","description":"The Partner address that will receive commission from this transaction"},"sender":{"type":"string","description":"The address that will send the `inputToken` - must be on the same network as `inputToken`"},"recipient":{"type":"string","description":"The address that will receive the `outputToken` - must be on the same network as `outputToken`"},"value":{"type":"string","description":"The native network token value that will be sent with the transaction. This value may be 0 if an ERC20 token is sent."},"route":{"description":"The route the Portal will take","type":"array","items":{"type":"string"}},"routeHash":{"type":"string","description":"The keccak256 hash of the raw encoded calls"},"steps":{"description":"The step descriptions for the route the Portal will take","type":"array","items":{"type":"string"}},"stepsSignedOrder":{"description":"The step descriptions for the route the Portal will take when using signature order","type":"array","items":{"type":"string"}},"isPermit":{"type":"boolean","description":"If this order is using a Permit signature or regular approvals"},"residualTokens":{"description":"Address of tokens which may return as residuals during execution","type":"array","items":{"type":"string"}},"expiry":{"type":"string","description":"The expiry time of the transaction quoter"},"gasLimit":{"type":"string","description":"The predicted gas limit (with buffer) for the transaction"},"feeToken":{"type":"string","description":"The token the Portals fee will be taken in"},"feeAmount":{"type":"string","description":"The token amount of the Portals fee in token decimals"},"feeAmountUsd":{"type":"number","description":"The USD amount of the Portals fee"},"feeAmountSignedOrder":{"type":"string","description":"The token amount of the Portals fee in token decimals if using a signed order. The gas fee is included in this value."},"feeAmountUsdSignedOrder":{"type":"number","description":"The USD amount of the Portals fee if using a signed order. The gas fee is included in this value."},"rawParams":{"type":"object","description":"The decoded raw parameters of the tx."}},"required":["orderId","inputToken","inputAmount","inputAmountUsd","outputToken","outputAmount","outputAmountUsd","outputAmountSignedOrder","outputAmountUsdSignedOrder","minOutputAmount","minOutputAmountUsd","minOutputAmountSignedOrder","minOutputAmountUsdSignedOrder","slippageTolerancePercentage","target","partner","sender","recipient","value","route","routeHash","steps","stepsSignedOrder","isPermit"]},"PopulatedPortalTransactionV2":{"type":"object","properties":{"to":{"type":"string","readOnly":true},"from":{"type":"string"},"data":{"type":"string","readOnly":true},"value":{"type":"string"},"gasLimit":{"type":"string"}},"required":["to","data"]},"TypedMessageResponse":{"type":"object","properties":{"types":{"type":"object","readOnly":true},"domain":{"type":"object","readOnly":true},"value":{"type":"object","readOnly":true}},"required":["types","domain","value"]},"PortalResponseV2":{"type":"object","properties":{"context":{"description":"Contextual information about the transaction","allOf":[{"$ref":"#/components/schemas/PortalContextV2"}]},"tx":{"description":"Transaction object to be signed","allOf":[{"$ref":"#/components/schemas/PopulatedPortalTransactionV2"}]},"signedOrder":{"description":"Signature-based Order message to be signed for a gasless transaction","allOf":[{"$ref":"#/components/schemas/TypedMessageResponse"}]}},"required":["context","tx","signedOrder"]},"EstimateContextV2":{"type":"object","properties":{"inputToken":{"type":"string","description":"The address of the `inputToken`"},"inputAmount":{"type":"string","description":"The amount of `inputToken` to be sent in inputToken units"},"inputAmountUsd":{"type":"number","description":"The USD amount of inputToken to be sent"},"outputToken":{"type":"string","description":"The address of outputToken"},"outputAmount":{"type":"string","description":"The amount of `outputToken`received"},"outputAmountUsd":{"type":"number","description":"The USD Amount of `outputToken` received"},"minOutputAmountUsd":{"type":"number","description":"The minimum USD amount of `outputToken`received, assuming worst-case slippage"},"slippageTolerancePercentage":{"type":"number","description":"The maximum acceptable global slippage percentage for the portal"},"simulated":{"type":"boolean","description":"True if the estimate was simulated on-chain. False if it was estimated off-chain."},"gasLimit":{"type":"string","description":"The quantity of gas consumed by the transaction, buffered slightly"}},"required":["inputToken","inputAmount","inputAmountUsd","outputToken","outputAmount","outputAmountUsd","minOutputAmountUsd","slippageTolerancePercentage","simulated","gasLimit"]},"EstimatePortalV2Response":{"type":"object","properties":{"outputToken":{"type":"string","description":"outputToken address"},"outputAmount":{"type":"string","description":"Optimistic amount received assuming no slippage"},"minOutputAmount":{"type":"string","description":"Minimum amount received assuming worst-case slippage"},"outputTokenDecimals":{"type":"number","description":"Number of decimals for outputToken"},"context":{"description":"Contextual information about the estimate","allOf":[{"$ref":"#/components/schemas/EstimateContextV2"}]}},"required":["outputToken","outputAmount","minOutputAmount","outputTokenDecimals","context"]},"BalanceResponseDto":{"type":"object","properties":{"key":{"type":"string","readOnly":true},"name":{"type":"string","readOnly":true},"decimals":{"type":"number","readOnly":true},"symbol":{"type":"string","readOnly":true},"address":{"type":"string","readOnly":true},"addresses":{"type":"object","readOnly":true},"platform":{"type":"string","readOnly":true},"network":{"type":"string","readOnly":true},"price":{"type":"number","readOnly":true},"images":{"readOnly":true,"type":"array","items":{"type":"string"}},"updatedAt":{"format":"date-time","type":"string","readOnly":true},"createdAt":{"format":"date-time","type":"string","readOnly":true},"verifiedAt":{"format":"date-time","type":"string","readOnly":true},"tokens":{"readOnly":true,"type":"array","items":{"type":"string"}},"poolAddress":{"type":"string","readOnly":true},"liquidity":{"type":"number","readOnly":true},"metrics":{"readOnly":true,"allOf":[{"$ref":"#/components/schemas/TokenMetricResponseDto"}]},"metadata":{"type":"object","readOnly":true},"image":{"type":"string","readOnly":true},"banner":{"type":"string","readOnly":true},"totalSupply":{"type":"string","readOnly":true},"totalBorrow":{"type":"string","readOnly":true},"circulatingSupply":{"type":"string","readOnly":true},"reserves":{"readOnly":true,"type":"array","items":{"type":"string"}},"pricePerShare":{"type":"string","readOnly":true},"isClaimed":{"type":"boolean","readOnly":true},"isPortable":{"type":"boolean","readOnly":true},"balance":{"type":"number"},"balanceUSD":{"type":"number"},"rawBalance":{"type":"string"}},"required":["key","name","decimals","symbol","address","addresses","platform","network","price","images","updatedAt","createdAt","verifiedAt","tokens","poolAddress","liquidity","metrics","metadata","image","banner","totalSupply","totalBorrow","circulatingSupply","reserves","pricePerShare","isClaimed","isPortable","balance","balanceUSD","rawBalance"]},"AccountResponseDto":{"type":"object","properties":{"totalQueried":{"type":"number"},"balances":{"readOnly":true,"type":"array","items":{"$ref":"#/components/schemas/BalanceResponseDto"}}},"required":["balances"]},"ApprovalContext":{"type":"object","properties":{"network":{"type":"string","readOnly":true},"allowance":{"type":"string"},"approvalAmount":{"type":"string"},"shouldApprove":{"type":"boolean","readOnly":true},"canPermit":{"type":"boolean","readOnly":true},"spender":{"type":"string","readOnly":true},"gasLimit":{"type":"string"}},"required":["network","shouldApprove","canPermit","spender"]},"ApprovalResponseV2":{"type":"object","properties":{"context":{"readOnly":true,"allOf":[{"$ref":"#/components/schemas/ApprovalContext"}]},"approve":{"$ref":"#/components/schemas/PopulatedPortalTransactionV2"},"permit":{"$ref":"#/components/schemas/TypedMessageResponse"}},"required":["context"]}}}}