{"openapi":"3.1.0","info":{"title":"DLMM Quote Engine","description":"High-performance quote computation for Dynamic Liquidity Market Maker pools","version":"1.0.0"},"paths":{"/api/quotes/v1/quote":{"post":{"summary":"Get Single Route Quote","description":"Get the best quote for a token swap using AMM strategy parameters. Returns a single optimal route with execution details including strategy, bins traversed, and AMM type.","operationId":"get_quote_api_quotes_v1_quote_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteRequest"}}},"required":true},"responses":{"200":{"description":"Quote response with execution path and details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/quotes/v1/quote/multi":{"post":{"summary":"Get Multi-Route Quote","description":"Get all viable routes for a token swap, sorted by best to worst output. Supports AMM strategy parameters for fine-grained control over routing preferences.","operationId":"get_multi_route_quote_api_quotes_v1_quote_multi_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteRequest"}}},"required":true},"responses":{"200":{"description":"Multiple routes sorted by output amount","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiRouteQuoteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/quotes/v1/tokens":{"get":{"summary":"Get Tokens","description":"Get list of supported tokens from active pools only. Optionally filter by AMM type.","operationId":"get_tokens_api_quotes_v1_tokens_get","parameters":[{"name":"amm_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by AMM type (e.g., 'dlmm', 'xyk')","title":"Amm Type"},"description":"Filter by AMM type (e.g., 'dlmm', 'xyk')"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokensResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/quotes/v1/pools":{"get":{"summary":"Get Pools","description":"Get list of available pools with optional filtering","operationId":"get_pools_api_quotes_v1_pools_get","parameters":[{"name":"amm_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by AMM type (e.g., 'dlmm', 'xyk')","title":"Amm Type"},"description":"Filter by AMM type (e.g., 'dlmm', 'xyk')"},{"name":"suggested","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by suggested pools","title":"Suggested"},"description":"Filter by suggested pools"},{"name":"sbtc_incentives","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by sBTC incentives","title":"Sbtc Incentives"},"description":"Filter by sBTC incentives"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PoolsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/quotes/v1/pools/{pool_id}":{"get":{"summary":"Get Pool By ID","description":"Get a single pool's metadata by `pool_id`. Returns unsigned active_bin in responses.","operationId":"get_pool_by_id_api_quotes_v1_pools__pool_id__get","parameters":[{"name":"pool_id","in":"path","required":true,"schema":{"type":"string","title":"Pool Id"}}],"responses":{"200":{"description":"Pool information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PoolInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/quotes/v1/pairs":{"get":{"summary":"Get Available Pairs","description":"Get all reachable output tokens for a given input token. Shows available trading pairs with pool information and AMM types. If output_token is provided, only returns pairs with that specific output token.","operationId":"get_pairs_api_quotes_v1_pairs_get","parameters":[{"name":"input_token","in":"query","required":true,"schema":{"type":"string","title":"Input Token"}},{"name":"output_token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Token"}}],"responses":{"200":{"description":"List of available output tokens and their pools","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PairsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/quotes/v1/bins/{pool_id}":{"get":{"summary":"Get Pool Bins","description":"Get all bins for a specific pool with their reserves, prices, and liquidity information. Returns comprehensive bin data for pool analysis.","operationId":"get_pool_bins_api_quotes_v1_bins__pool_id__get","parameters":[{"name":"pool_id","in":"path","required":true,"schema":{"type":"string","title":"Pool Id"}},{"name":"around","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":1000,"minimum":0},{"type":"null"}],"description":"Unsigned bin id center for windowed reads (use with limit)","title":"Around"},"description":"Unsigned bin id center for windowed reads (use with limit)"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":1001,"minimum":1},{"type":"null"}],"description":"Max bins to return centered on around (windowed chart reads)","title":"Limit"},"description":"Max bins to return centered on around (windowed chart reads)"},{"name":"X-Allow-Fallback","in":"header","required":false,"schema":{"type":"boolean","description":"Enable on-chain data fallback when DB data is stale (default: Redis only)","default":false,"title":"X-Allow-Fallback"},"description":"Enable on-chain data fallback when DB data is stale (default: Redis only)"}],"responses":{"200":{"description":"List of all bins in the pool with detailed information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BinListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/quotes/v1/bins/{pool_id}/active":{"get":{"summary":"Get Active Bin","description":"Get detailed information for the currently active bin in a specific pool. Optimized endpoint for getting only the active bin data without loading all bins.","operationId":"get_active_bin_api_quotes_v1_bins__pool_id__active_get","parameters":[{"name":"pool_id","in":"path","required":true,"schema":{"type":"string","title":"Pool Id"}}],"responses":{"200":{"description":"Active bin information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BinDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/quotes/v1/bins/{pool_id}/{bin_id}":{"get":{"summary":"Get Bin Detail","description":"Get detailed information for a specific bin including reserves, price, liquidity, and active status. Useful for detailed pool analysis.","operationId":"get_bin_detail_api_quotes_v1_bins__pool_id___bin_id__get","parameters":[{"name":"pool_id","in":"path","required":true,"schema":{"type":"string","title":"Pool Id"}},{"name":"bin_id","in":"path","required":true,"schema":{"type":"integer","title":"Bin Id"}}],"responses":{"200":{"description":"Detailed bin information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BinDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/quotes/v1/swap":{"post":{"summary":"Generate Swap Parameters","description":"Convert quote execution path into swap parameters and post conditions for transaction execution. Takes quote data and returns contract call parameters.","operationId":"generate_swap_parameters_api_quotes_v1_swap_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwapRequest"}}},"required":true},"responses":{"200":{"description":"Swap parameters and post conditions for transaction execution","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwapResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/quotes/v1/users/{user_address}/positions/{pool_id}/bins":{"get":{"summary":"Get User Position Bins","description":"Get user bin positions for a specific pool from Redis. Returns the same data shape as the BFF endpoint for easy comparison. Response includes `meta` (dataSource, maxBinBlockHeight, binRowCount); `unprocessedLiquidityEventCount` is null here — use BFF for adapter backlog.","operationId":"get_user_position_bins_api_quotes_v1_users__user_address__positions__pool_id__bins_get","parameters":[{"name":"user_address","in":"path","required":true,"schema":{"type":"string","title":"User Address"}},{"name":"pool_id","in":"path","required":true,"schema":{"type":"string","title":"Pool Id"}}],"responses":{"200":{"description":"User bin positions with bin_id, price, and userLiquidity","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get User Position Bins Api Quotes V1 Users  User Address  Positions  Pool Id  Bins Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/quotes/v1/":{"get":{"summary":"API Root","description":"Root endpoint with API information and available endpoints","operationId":"root_api_quotes_v1__get","responses":{"200":{"description":"API information and endpoint list","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Root Api Quotes V1  Get"}}}}}}},"/api/quotes/internal/clear-graph-cache":{"post":{"summary":"Clear Cache","description":"Clear the graph cache to force rebuild on next request","operationId":"clear_cache_api_quotes_internal_clear_graph_cache_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Clear Cache Api Quotes Internal Clear Graph Cache Post"}}}}}}},"/api/quotes/internal/performance":{"get":{"summary":"Get Performance Metrics (Deprecated)","description":"DEPRECATED: This endpoint is deprecated. Performance metrics are now available in Datadog. Use Datadog UI to view metrics. This endpoint returns minimal information for backward compatibility.","operationId":"get_performance_metrics_api_quotes_internal_performance_get","responses":{"200":{"description":"Deprecated performance metrics response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Performance Metrics Api Quotes Internal Performance Get"}}}}},"deprecated":true}},"/api/quotes/internal/performance/clear":{"post":{"summary":"Clear Performance Metrics (Deprecated)","description":"DEPRECATED: This endpoint is deprecated. Metrics are now in Datadog and cannot be cleared via API.","operationId":"clear_performance_metrics_api_quotes_internal_performance_clear_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Clear Performance Metrics Api Quotes Internal Performance Clear Post"}}}}},"deprecated":true}},"/api/quotes/internal/token-graph":{"get":{"summary":"Get Token Graph","description":"Get the current token graph for analysis and troubleshooting.\n\nReturns:\n    Token graph data including nodes, edges, and pool information","operationId":"get_token_graph_api_quotes_internal_token_graph_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Token Graph Api Quotes Internal Token Graph Get"}}}}}}},"/api/quotes/internal/data/indexer-state":{"get":{"summary":"Get Indexer State","description":"Get current indexer state from PostgreSQL database including last processed block and health status for both DLMM and XYK indexers.","operationId":"get_indexer_state_api_quotes_internal_data_indexer_state_get","responses":{"200":{"description":"Indexer state information for DLMM and XYK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexerStateResponse"}}}}}}},"/api/quotes/internal/data/indexer-lag":{"get":{"summary":"Indexer lag vs Bitflow BFF chain tip","description":"Compare indexer last_processed_block to BFF /api/stacks/extended chain_tip.block_height. Logs and emits indexer.lag.blocks metric when behind. Use for alerting and frequency analysis.","operationId":"get_indexer_lag_api_quotes_internal_data_indexer_lag_get","parameters":[{"name":"network","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"When 'testnet', use Hiro testnet for canonical chain tip (for validation against testnet).","title":"Network"},"description":"When 'testnet', use Hiro testnet for canonical chain tip (for validation against testnet)."}],"responses":{"200":{"description":"Indexer lag vs Bitflow BFF chain tip","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexerLagResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/quotes/internal/data/block-processing-stats":{"get":{"summary":"Get Block Processing Statistics","description":"Get comprehensive block processing statistics including completion rates, event counts, and recent block data.","operationId":"get_block_processing_stats_api_quotes_internal_data_block_processing_stats_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Maximum number of recent blocks to analyze","default":100,"title":"Limit"},"description":"Maximum number of recent blocks to analyze"}],"responses":{"200":{"description":"Block processing statistics","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlockProcessingStatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/quotes/internal/data/processing-health":{"get":{"summary":"Get Processing Health Summary","description":"Get processing health summary including recent failures, performance metrics, and processing lag information.","operationId":"get_processing_health_api_quotes_internal_data_processing_health_get","responses":{"200":{"description":"Processing health summary","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingHealthResponse"}}}}}}},"/api/quotes/internal/data/database-info":{"get":{"summary":"Get Database Information","description":"Get database information and statistics including size, table sizes, and connection information.","operationId":"get_database_info_api_quotes_internal_data_database_info_get","responses":{"200":{"description":"Database information and statistics","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseInfoResponse"}}}}}}},"/api/quotes/live":{"get":{"summary":"Liveness","description":"Lightweight liveness probe — process is running (always 200).","operationId":"liveness_api_quotes_live_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Liveness Api Quotes Live Get"}}}}}}},"/api/quotes/ready":{"get":{"summary":"Readiness","description":"Readiness for operators/synthetics — Redis ping only (K8s uses TCP on :8000).","operationId":"readiness_api_quotes_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/quotes/health":{"get":{"summary":"Health Check","description":"Check the health status of the service, Redis, and PostgreSQL connections. Returns detailed information about system status and connectivity.","operationId":"health_check_api_quotes_health_get","responses":{"200":{"description":"Health status and connection information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/api/quotes/":{"get":{"summary":"Api Root","description":"API root endpoint with version information","operationId":"api_root_api_quotes__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/favicon.ico":{"get":{"summary":"Favicon","description":"Favicon endpoint - returns 204 No Content to prevent 404 errors","operationId":"favicon_favicon_ico_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"BinData":{"properties":{"pool_id":{"type":"string","title":"Pool Id","example":"dlmm_1"},"bin_id":{"type":"integer","title":"Bin Id","example":500},"reserve_x":{"type":"string","title":"Reserve X","example":"1000947397386"},"reserve_y":{"type":"string","title":"Reserve Y","example":"10001078963244"},"price":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Price","example":"1000000000.0"},"liquidity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Liquidity","example":"11002026360630"}},"type":"object","required":["pool_id","bin_id","reserve_x","reserve_y"],"title":"BinData","description":"Bin data model"},"BinDetailResponse":{"properties":{"success":{"type":"boolean","title":"Success","example":true},"pool_id":{"type":"string","title":"Pool Id","example":"dlmm_1"},"bin_id":{"type":"integer","title":"Bin Id","example":500},"reserve_x":{"type":"string","title":"Reserve X","example":"1000947397386"},"reserve_y":{"type":"string","title":"Reserve Y","example":"10001078963244"},"price":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Price","example":"1000000000.0"},"liquidity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Liquidity","example":"11002026360630"},"is_active":{"type":"boolean","title":"Is Active","default":false,"example":true},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if request failed"}},"type":"object","required":["success","pool_id","bin_id","reserve_x","reserve_y"],"title":"BinDetailResponse","description":"Response for bin detail endpoint"},"BinListResponse":{"properties":{"success":{"type":"boolean","title":"Success","example":true},"pool_id":{"type":"string","title":"Pool Id","example":"dlmm_1"},"bins":{"items":{"$ref":"#/components/schemas/BinData"},"type":"array","title":"Bins","description":"List of bin data"},"total_bins":{"type":"integer","title":"Total Bins","example":1001},"active_bin_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Active Bin Id","example":500},"applied_block_height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Applied Block Height","description":"DLMM indexer last_processed_block from indexer DB when this response was built; read cursor for aligning validation / clients with chain height (Redis bin payload may lag adapter PG)."},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if request failed"}},"type":"object","required":["success","pool_id","bins","total_bins"],"title":"BinListResponse","description":"Response for bin list endpoint"},"BlockProcessingStatsResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the request was successful","example":true},"stats":{"additionalProperties":true,"type":"object","title":"Stats","description":"Block processing statistics"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if request failed"}},"type":"object","required":["success","stats"],"title":"BlockProcessingStatsResponse","description":"Block processing statistics response model"},"DatabaseInfoResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the request was successful","example":true},"database_info":{"additionalProperties":true,"type":"object","title":"Database Info","description":"Database information and statistics"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if request failed"}},"type":"object","required":["success","database_info"],"title":"DatabaseInfoResponse","description":"Database information response model"},"ExecutionStep":{"properties":{"pool_trait":{"type":"string","maxLength":200,"minLength":1,"title":"Pool Trait","description":"Pool contract address/trait identifier","example":"SP1WA4CXFR54B1W42R7NSMXEQYQTTMB3CXQ3FVJE1.statutory-apricot-mule"},"pool_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pool Id","description":"Pool ID for Redis lookup","example":"dlmm_1"},"x_token_trait":{"type":"string","maxLength":200,"minLength":10,"title":"X Token Trait","description":"X token trait identifier","example":"SP1WA4CXFR54B1W42R7NSMXEQYQTTMB3CXQ3FVJE1.variable-copper-roundworm"},"y_token_trait":{"type":"string","maxLength":200,"minLength":10,"title":"Y Token Trait","description":"Y token trait identifier","example":"SP1WA4CXFR54B1W42R7NSMXEQYQTTMB3CXQ3FVJE1.golden-aquamarine-trout"},"expected_bin_id":{"type":"integer","maximum":999999.0,"minimum":-999999.0,"title":"Expected Bin Id","description":"Expected bin identifier","example":500},"function_name":{"type":"string","maxLength":20,"minLength":1,"title":"Function Name","description":"Function name (swap-x-for-y or swap-y-for-x)","example":"swap-x-for-y"},"x_in":{"anyOf":[{"type":"string","maxLength":50,"minLength":1},{"type":"null"}],"title":"X In","description":"X token input amount for this bin","example":"1000000"},"y_in":{"anyOf":[{"type":"string","maxLength":50,"minLength":1},{"type":"null"}],"title":"Y In","description":"Y token input amount for this bin","example":"1000000"},"x_out":{"anyOf":[{"type":"string","maxLength":50,"minLength":1},{"type":"null"}],"title":"X Out","description":"X token output amount from this bin","example":"9995000"},"y_out":{"anyOf":[{"type":"string","maxLength":50,"minLength":1},{"type":"null"}],"title":"Y Out","description":"Y token output amount from this bin","example":"9995000"},"is_empty_swap":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Empty Swap","description":"Flag indicating this is an empty swap (amount=1, min_received=0) used to move active bin","example":false}},"type":"object","required":["pool_trait","x_token_trait","y_token_trait","expected_bin_id","function_name"],"title":"ExecutionStep","description":"Execution step for router contract"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthResponse":{"properties":{"status":{"type":"string","title":"Status","description":"Service status","example":"healthy"},"redis_connected":{"type":"boolean","title":"Redis Connected","description":"Redis connection status","example":true},"redis_info":{"additionalProperties":true,"type":"object","title":"Redis Info","description":"Redis connection information","example":{"connected":true,"connected_clients":1,"environment":"local","redis_version":"7.0.0","used_memory_human":"2.1M"}},"version":{"type":"string","title":"Version","description":"API version","example":"1.0.0"}},"type":"object","required":["status","redis_connected","redis_info","version"],"title":"HealthResponse","description":"Health check response model"},"IndexerLagEntry":{"properties":{"last_processed_block":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Processed Block","description":"Last block processed by indexer"},"lag_blocks":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Lag Blocks","description":"Chain tip height minus last_processed_block"},"behind":{"type":"boolean","title":"Behind","description":"True if lag_blocks is above threshold","default":false}},"type":"object","title":"IndexerLagEntry","description":"Per-indexer lag vs Bitflow BFF chain tip"},"IndexerLagResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the check succeeded"},"hiro_block_height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Hiro Block Height","description":"Canonical chain tip from Hiro extended (api.hiro.so). behind=true if Bitflow or indexer >threshold behind this."},"bitflow_block_height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bitflow Block Height","description":"Chain tip block height from BFF /api/stacks/extended"},"dlmm":{"anyOf":[{"$ref":"#/components/schemas/IndexerLagEntry"},{"type":"null"}],"description":"DLMM indexer lag (last_processed_block, lag_blocks, behind)"},"xyk":{"anyOf":[{"$ref":"#/components/schemas/IndexerLagEntry"},{"type":"null"}],"description":"XYK indexer lag (not supported; always null)"},"behind":{"type":"boolean","title":"Behind","description":"True if DLMM indexer >threshold behind Bitflow, or Bitflow >threshold behind Hiro","default":false},"indexer_behind":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Indexer Behind","description":"True when DLMM indexer last_processed_block is >threshold behind Bitflow BFF tip"},"bitflow_behind_hiro":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Bitflow Behind Hiro","description":"True when Bitflow BFF chain tip is >threshold behind Hiro canonical tip"},"hiro_minus_bitflow_blocks":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Hiro Minus Bitflow Blocks","description":"Hiro tip minus Bitflow tip (positive means Bitflow behind Hiro); null if Hiro tip unknown"},"lag_threshold_blocks":{"type":"integer","title":"Lag Threshold Blocks","description":"Lag threshold used for behind flag","default":10},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if extended fetch or check failed"}},"type":"object","required":["success"],"title":"IndexerLagResponse","description":"Indexer lag vs Bitflow BFF /stacks/extended chain tip. For alerting and frequency analysis."},"IndexerStateResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the request was successful","example":true},"dlmm_state":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Dlmm State","description":"DLMM indexer state information"},"xyk_state":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Xyk State","description":"XYK indexer state information"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if request failed"}},"type":"object","required":["success"],"title":"IndexerStateResponse","description":"Indexer state response model"},"MultiRouteQuoteResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the quote was successful","example":true},"routes":{"items":{"$ref":"#/components/schemas/RouteInfo"},"type":"array","title":"Routes","description":"List of routes sorted by best to worst"},"best_route_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Best Route Index","description":"Index of the best route (1-based)","example":1},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if quote failed"}},"type":"object","required":["success","routes"],"title":"MultiRouteQuoteResponse","description":"Multi-route quote response model"},"PairInfo":{"properties":{"output_token":{"type":"string","title":"Output Token","description":"Output token contract address","example":"SP1WA4CXFR54B1W42R7NSMXEQYQTTMB3CXQ3FVJE1.golden-aquamarine-trout"},"output_token_symbol":{"type":"string","title":"Output Token Symbol","description":"Output token symbol","example":"testB"},"output_token_name":{"type":"string","title":"Output Token Name","description":"Output token name","example":"testB Token"},"output_token_decimals":{"type":"integer","title":"Output Token Decimals","description":"Number of decimal places for output token","example":8},"output_token_image":{"type":"string","title":"Output Token Image","description":"Output token image URL","example":"https://example.com/token-image.png"},"pools":{"items":{"type":"string"},"type":"array","title":"Pools","description":"List of pool contract addresses that support this pair","example":["SP1WA4CXFR54B1W42R7NSMXEQYQTTMB3CXQ3FVJE1.dlmm-pool-contract","SP1WA4CXFR54B1W42R7NSMXEQYQTTMB3CXQ3FVJE1.xyk-pool-contract"]},"pools_id":{"items":{"type":"string"},"type":"array","title":"Pools Id","description":"List of pool IDs that support this pair","example":["dlmm_1","xyk_2"]},"amm_types":{"items":{"type":"string"},"type":"array","title":"Amm Types","description":"List of AMM types available for this pair","example":["dlmm"]}},"type":"object","required":["output_token","output_token_symbol","output_token_name","output_token_decimals","output_token_image","pools","pools_id","amm_types"],"title":"PairInfo","description":"Pair information model"},"PairsResponse":{"properties":{"input_token":{"type":"string","title":"Input Token","description":"Input token contract address","example":"SP1WA4CXFR54B1W42R7NSMXEQYQTTMB3CXQ3FVJE1.variable-copper-roundworm"},"input_token_symbol":{"type":"string","title":"Input Token Symbol","description":"Input token symbol","example":"testA"},"input_token_name":{"type":"string","title":"Input Token Name","description":"Input token name","example":"testA Token"},"input_token_decimals":{"type":"integer","title":"Input Token Decimals","description":"Number of decimal places for input token","example":8},"input_token_image":{"type":"string","title":"Input Token Image","description":"Input token image URL","example":"https://example.com/token-image.png"},"pairs":{"items":{"$ref":"#/components/schemas/PairInfo"},"type":"array","title":"Pairs","description":"List of reachable output tokens"}},"type":"object","required":["input_token","input_token_symbol","input_token_name","input_token_decimals","input_token_image","pairs"],"title":"PairsResponse","description":"Pairs response model"},"PoolInfo":{"properties":{"pool_id":{"type":"string","title":"Pool Id","description":"Pool identifier","example":"dlmm_1"},"amm_type":{"type":"string","title":"Amm Type","description":"AMM type (e.g., 'dlmm', 'xyk')","example":"dlmm"},"token_x":{"type":"string","title":"Token X","description":"Token X contract address","example":"SP1WA4CXFR54B1W42R7NSMXEQYQTTMB3CXQ3FVJE1.variable-copper-roundworm"},"token_y":{"type":"string","title":"Token Y","description":"Token Y contract address","example":"SP1WA4CXFR54B1W42R7NSMXEQYQTTMB3CXQ3FVJE1.golden-aquamarine-trout"},"bin_step":{"type":"number","title":"Bin Step","description":"Bin step in basis points","example":100.0},"active_bin":{"type":"integer","title":"Active Bin","description":"Currently active bin ID","example":500},"active":{"type":"boolean","title":"Active","description":"Whether pool is active","example":true},"pool_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pool Status","description":"Pool status string","example":"true"},"x_protocol_fee":{"type":"integer","title":"X Protocol Fee","description":"Protocol fee for X→Y swaps (basis points)","example":2},"x_provider_fee":{"type":"integer","title":"X Provider Fee","description":"Provider fee for X→Y swaps (basis points)","example":3},"x_variable_fee":{"type":"integer","title":"X Variable Fee","description":"Variable fee for X→Y swaps (basis points)","example":0},"y_protocol_fee":{"type":"integer","title":"Y Protocol Fee","description":"Protocol fee for Y→X swaps (basis points)","example":2},"y_provider_fee":{"type":"integer","title":"Y Provider Fee","description":"Provider fee for Y→X swaps (basis points)","example":3},"y_variable_fee":{"type":"integer","title":"Y Variable Fee","description":"Variable fee for Y→X swaps (basis points)","example":0},"types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Types","description":"Pool types/categories","example":["STABLE","LST"]},"sbtc_incentives":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Sbtc Incentives","description":"Whether pool has sBTC incentives","example":true},"suggested":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Suggested","description":"Whether pool is suggested/recommended","example":false},"initial_price":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Initial Price","description":"Initial price","example":"1000000000"},"pool_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pool Name","description":"Pool name","example":"testA-testB-LP"},"pool_symbol":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pool Symbol","description":"Pool symbol","example":"testA-testB"},"pool_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pool Uri","description":"Pool URI","example":"tense-salmon-roundworm.com"},"creation_height":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creation Height","description":"Creation height","example":"914844"},"variable_fees_manager":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Variable Fees Manager","description":"Variable fees manager","example":"SP1WA4CXFR54B1W42R7NSMXEQYQTTMB3CXQ3FVJE1"},"fee_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fee Address","description":"Fee address","example":"SP1WA4CXFR54B1W42R7NSMXEQYQTTMB3CXQ3FVJE1.total-aquamarine-elephant"},"variable_fees_cooldown":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Variable Fees Cooldown","description":"Variable fees cooldown","example":"0"},"freeze_variable_fees_manager":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Freeze Variable Fees Manager","description":"Freeze variable fees manager","example":"false"},"core_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Core Address","description":"Core address","example":"SP1WA4CXFR54B1W42R7NSMXEQYQTTMB3CXQ3FVJE1.working-amaranth-clownfish"},"pool_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pool Token","description":"Pool token","example":"SP1WA4CXFR54B1W42R7NSMXEQYQTTMB3CXQ3FVJE1.experimental-maroon-silkworm"},"creator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creator","description":"Creator address","example":"SP1WA4CXFR54B1W42R7NSMXEQYQTTMB3CXQ3FVJE1"},"x_total_fee_bps":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X Total Fee Bps","description":"X total fee in basis points","example":"5"},"y_total_fee_bps":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Y Total Fee Bps","description":"Y total fee in basis points","example":"5"}},"type":"object","required":["pool_id","amm_type","token_x","token_y","bin_step","active_bin","active","x_protocol_fee","x_provider_fee","x_variable_fee","y_protocol_fee","y_provider_fee","y_variable_fee"],"title":"PoolInfo","description":"Pool information model"},"PoolsResponse":{"properties":{"pools":{"items":{"$ref":"#/components/schemas/PoolInfo"},"type":"array","title":"Pools","description":"List of available pools"}},"type":"object","required":["pools"],"title":"PoolsResponse","description":"Pools response model"},"PostCondition":{"properties":{"amount":{"type":"string","title":"Amount","description":"Amount in atomic units (uint format)","example":"1000000"},"sender_address":{"type":"string","title":"Sender Address","description":"Sender address (tx-sender or pool contract)","example":"tx-sender"},"condition_code":{"type":"string","title":"Condition Code","description":"Condition type","example":"less_than_or_equal_to"},"token_contract":{"type":"string","title":"Token Contract","description":"Token contract address","example":"SM1793C4R5PZ4NS4VQ4WMP7SKKYVH8JZEWSZ9HCCR.token-usdc-v-1-1::usdc"},"token_decimals":{"type":"integer","title":"Token Decimals","description":"Token decimals","example":6},"token_asset_name":{"type":"string","title":"Token Asset Name","description":"Token asset name/trait","example":"SP1WA4CXFR54B1W42R7NSMXEQYQTTMB3CXQ3FVJE1.variable-copper-roundworm"},"post_condition_type":{"type":"string","title":"Post Condition Type","description":"Post condition type based on sender and token type","example":"standard_fungible"}},"type":"object","required":["amount","sender_address","condition_code","token_contract","token_decimals","token_asset_name","post_condition_type"],"title":"PostCondition","description":"Post condition for swap execution"},"ProcessingHealthResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the request was successful","example":true},"health_summary":{"additionalProperties":true,"type":"object","title":"Health Summary","description":"Processing health summary"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if request failed"}},"type":"object","required":["success","health_summary"],"title":"ProcessingHealthResponse","description":"Processing health summary response model"},"QuoteRequest":{"properties":{"input_token":{"type":"string","maxLength":200,"minLength":10,"title":"Input Token","description":"Input token contract address","example":"SP1WA4CXFR54B1W42R7NSMXEQYQTTMB3CXQ3FVJE1.variable-copper-roundworm"},"output_token":{"type":"string","maxLength":200,"minLength":10,"title":"Output Token","description":"Output token contract address","example":"SP1WA4CXFR54B1W42R7NSMXEQYQTTMB3CXQ3FVJE1.golden-aquamarine-trout"},"amount_in":{"type":"string","maxLength":50,"minLength":1,"title":"Amount In","description":"Input amount as string (large integer in atomic units)","example":"1000000"},"amm_strategy":{"type":"string","title":"Amm Strategy","description":"AMM strategy: 'best', 'preferred', 'pure'","default":"best","example":"best"},"preferred_amm":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preferred Amm","description":"Preferred AMM type when using 'preferred' or 'pure' strategy","example":"dlmm"},"slippage_tolerance":{"anyOf":[{"type":"number","maximum":50.0,"minimum":0.0},{"type":"null"}],"title":"Slippage Tolerance","description":"Slippage tolerance percentage (0-50)","default":3.0,"example":3.0}},"type":"object","required":["input_token","output_token","amount_in"],"title":"QuoteRequest","description":"Quote request model for token swaps"},"QuoteResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the quote was successful","example":true},"amount_out":{"type":"string","title":"Amount Out","description":"Output amount as string","example":"2995802098.950524737631184408"},"min_amount_out":{"type":"string","title":"Min Amount Out","description":"Minimum amount out with slippage protection","example":"2905928035.980008995500248675"},"slippage_tolerance":{"type":"number","title":"Slippage Tolerance","description":"Slippage tolerance percentage used in calculation","example":3.0},"route_path":{"items":{"type":"string"},"type":"array","title":"Route Path","description":"List of tokens in the route","example":["SP1WA4CXFR54B1W42R7NSMXEQYQTTMB3CXQ3FVJE1.variable-copper-roundworm","SP1WA4CXFR54B1W42R7NSMXEQYQTTMB3CXQ3FVJE1.golden-aquamarine-trout"]},"execution_path":{"items":{"$ref":"#/components/schemas/ExecutionStep"},"type":"array","title":"Execution Path","description":"Flattened execution steps for router"},"fee":{"type":"string","title":"Fee","description":"Total fee as string","example":"900.0000"},"price_impact_bps":{"type":"integer","title":"Price Impact Bps","description":"Price impact in basis points","example":0},"price_impact_tokens":{"type":"string","title":"Price Impact Tokens","description":"Price impact in output token amount (negative means worse execution)","example":"0"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if quote failed"},"input_token_decimals":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Input Token Decimals","description":"Number of decimals for input token","example":8},"output_token_decimals":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Output Token Decimals","description":"Number of decimals for output token","example":8},"execution_details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Execution Details","description":"Detailed execution information including strategy, bins traversed, and AMM type","example":{"amm_type":"dlmm","bins_traversed":15,"strategy":"multi_bin","unique_bins_used":15}}},"type":"object","required":["success","amount_out","min_amount_out","slippage_tolerance","route_path","execution_path","fee","price_impact_bps","price_impact_tokens"],"title":"QuoteResponse","description":"Quote response model with execution details"},"RouteInfo":{"properties":{"route_index":{"type":"integer","title":"Route Index","description":"Route index (1-based)","example":1},"amount_out":{"type":"string","title":"Amount Out","description":"Output amount as string","example":"2995802098.950524737631184408"},"min_amount_out":{"type":"string","title":"Min Amount Out","description":"Minimum amount out with slippage protection","example":"2905928035.980008995500248675"},"slippage_tolerance":{"type":"number","title":"Slippage Tolerance","description":"Slippage tolerance percentage used in calculation","example":3.0},"route_path":{"items":{"type":"string"},"type":"array","title":"Route Path","description":"List of tokens in the route","example":["SP1WA4CXFR54B1W42R7NSMXEQYQTTMB3CXQ3FVJE1.variable-copper-roundworm","SP1WA4CXFR54B1W42R7NSMXEQYQTTMB3CXQ3FVJE1.golden-aquamarine-trout"]},"execution_path":{"items":{"$ref":"#/components/schemas/ExecutionStep"},"type":"array","title":"Execution Path","description":"Flattened execution steps for router"},"fee":{"type":"string","title":"Fee","description":"Total fee as string","example":"900.0000"},"price_impact_bps":{"type":"integer","title":"Price Impact Bps","description":"Price impact in basis points (aggregated across all hops)","example":0},"price_impact_tokens":{"type":"string","title":"Price Impact Tokens","description":"Price impact in output token amount (aggregated across all hops, negative means worse execution)","example":"0"},"total_hops":{"type":"integer","title":"Total Hops","description":"Number of hops in the route","example":1},"input_token_decimals":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Input Token Decimals","description":"Number of decimal places for input token","example":8},"output_token_decimals":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Output Token Decimals","description":"Number of decimal places for output token","example":8},"execution_details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Execution Details","description":"Detailed execution information including strategy, fees, and price impact"}},"type":"object","required":["route_index","amount_out","min_amount_out","slippage_tolerance","route_path","execution_path","fee","price_impact_bps","price_impact_tokens","total_hops"],"title":"RouteInfo","description":"Route information model"},"SwapParameter":{"properties":{"pool_trait":{"type":"string","title":"Pool Trait","description":"Pool trait identifier","example":".dlmm-pool-sbtc-usdc-v-1-1"},"x_token_trait":{"type":"string","title":"X Token Trait","description":"X token trait identifier","example":".token-sbtc"},"y_token_trait":{"type":"string","title":"Y Token Trait","description":"Y token trait identifier","example":".token-stx-v-1-1"},"expected_bin_id":{"type":"integer","title":"Expected Bin Id","description":"Expected bin ID for the swap","example":500},"amount":{"type":"string","title":"Amount","description":"Amount to swap in atomic units","example":"100000000"},"min_received":{"type":"string","title":"Min Received","description":"Minimum amount to receive (with slippage protection)","example":"95000000"},"x_for_y":{"type":"boolean","title":"X For Y","description":"True for X→Y swap, False for Y→X swap","example":true}},"type":"object","required":["pool_trait","x_token_trait","y_token_trait","expected_bin_id","amount","min_received","x_for_y"],"title":"SwapParameter","description":"Individual swap parameter for a bin"},"SwapParameterTyped":{"properties":{"type":{"type":"string","title":"Type","description":"Parameter type","example":"tuple"},"value":{"additionalProperties":true,"type":"object","title":"Value","description":"Tuple value containing all parameters. Can contain TypedParameterValue or nested SwapParameterTyped for nested tuples"}},"type":"object","required":["type","value"],"title":"SwapParameterTyped","description":"Individual swap parameter with typed tuple structure for easier integration"},"SwapRequest":{"properties":{"execution_path":{"items":{"$ref":"#/components/schemas/ExecutionStep"},"type":"array","title":"Execution Path","description":"Execution path from quote response"},"amount_in":{"type":"string","title":"Amount In","description":"Input amount in atomic units","example":"100000000"},"amount_out":{"type":"string","title":"Amount Out","description":"Expected output amount in atomic units","example":"998500000"},"input_token":{"type":"string","title":"Input Token","description":"Input token contract address"},"output_token":{"type":"string","title":"Output Token","description":"Output token contract address"},"input_token_decimals":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Input Token Decimals","description":"Input token decimals from quote response"},"output_token_decimals":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Output Token Decimals","description":"Output token decimals from quote response"},"slippage_tolerance":{"anyOf":[{"type":"number","maximum":50.0,"minimum":0.0},{"type":"null"}],"title":"Slippage Tolerance","description":"Slippage tolerance percentage (0-50)","default":3.0,"example":3.0},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider","description":"Optional aggregator fee provider principal address (for XYK swaps). If not provided, aggregator fees are not collected.","example":"SP1234567890123456789012345678901234567890"},"swap_parameters_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Swap Parameters Type","description":"Type of swap parameters to generate: 'simple' (grouped by pool and direction) or 'full' (individual bin parameters). Defaults to 'simple'.","default":"simple","example":"simple"}},"type":"object","required":["execution_path","amount_in","amount_out","input_token","output_token"],"title":"SwapRequest","description":"Request model for generating swap parameters and post conditions"},"SwapResponse":{"properties":{"success":{"type":"boolean","title":"Success","example":true},"slippage_tolerance":{"type":"number","title":"Slippage Tolerance","description":"Slippage tolerance percentage used in calculation","example":3.0},"swap_contract":{"type":"string","title":"Swap Contract","description":"Swap contract address","example":"SM3FSH09DJJKRVRPF187Q628R3W4C91EQ3YST6PMV.dlmm-swap-router-v-0-1"},"function_name":{"type":"string","title":"Function Name","description":"Function name to call","example":"swap-multi"},"swap_parameters":{"items":{"anyOf":[{"$ref":"#/components/schemas/SwapParameter"},{"$ref":"#/components/schemas/SwapSimpleParameter"}]},"type":"array","title":"Swap Parameters","description":"List of swap parameters (full or simple grouped)"},"swap_parameters_typed":{"items":{"anyOf":[{"$ref":"#/components/schemas/SwapParameterTyped"},{"$ref":"#/components/schemas/SwapSimpleParameterTyped"}]},"type":"array","title":"Swap Parameters Typed","description":"List of typed swap parameters (full or simple grouped)"},"post_conditions":{"items":{"$ref":"#/components/schemas/PostCondition"},"type":"array","title":"Post Conditions","description":"Post conditions for swap execution"},"total_hops":{"type":"integer","title":"Total Hops","description":"Number of pools/hops","example":1},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if request failed"}},"type":"object","required":["success","slippage_tolerance","swap_contract","function_name","swap_parameters","swap_parameters_typed","post_conditions","total_hops"],"title":"SwapResponse","description":"Response model for swap parameters and post conditions"},"SwapSimpleParameter":{"properties":{"pool_trait":{"type":"string","title":"Pool Trait","description":"Pool trait identifier","example":".dlmm-pool-sbtc-usdc-v-1-1"},"x_token_trait":{"type":"string","title":"X Token Trait","description":"X token trait identifier","example":".token-sbtc"},"y_token_trait":{"type":"string","title":"Y Token Trait","description":"Y token trait identifier","example":".token-stx-v-1-1"},"amount":{"type":"string","title":"Amount","description":"Total amount to swap in atomic units (sum of all bins in group)","example":"100000000"},"min_received":{"type":"string","title":"Min Received","description":"Total minimum amount to receive (sum of all bins in group, with slippage protection)","example":"95000000"},"x_for_y":{"type":"boolean","title":"X For Y","description":"True for X→Y swap, False for Y→X swap","example":true},"max_steps":{"type":"integer","minimum":1.0,"title":"Max Steps","description":"Maximum number of bins to traverse in this group","example":7}},"type":"object","required":["pool_trait","x_token_trait","y_token_trait","amount","min_received","x_for_y","max_steps"],"title":"SwapSimpleParameter","description":"Simple swap parameter for grouped bins (swap-simple-multi)"},"SwapSimpleParameterTyped":{"properties":{"type":{"type":"string","title":"Type","description":"Parameter type","example":"tuple"},"value":{"additionalProperties":true,"type":"object","title":"Value","description":"Tuple value containing all simple swap parameters. Can contain TypedParameterValue"}},"type":"object","required":["type","value"],"title":"SwapSimpleParameterTyped","description":"Simple swap parameter with typed tuple structure for swap-simple-multi"},"TokenInfo":{"properties":{"contract_address":{"type":"string","title":"Contract Address","description":"Token contract address","example":"SP1WA4CXFR54B1W42R7NSMXEQYQTTMB3CXQ3FVJE1.variable-copper-roundworm"},"symbol":{"type":"string","title":"Symbol","description":"Token symbol","example":"testA"},"name":{"type":"string","title":"Name","description":"Token name","example":"testA Token"},"decimals":{"type":"integer","maximum":18.0,"minimum":0.0,"title":"Decimals","description":"Number of decimal places","example":8},"asset_name":{"type":"string","title":"Asset Name","description":"Token asset name/trait","example":"variable-copper-roundworm"},"total_supply":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Supply","description":"Total token supply","example":1000000000},"image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image","description":"Token image URL","example":"https://example.com/token.png"}},"type":"object","required":["contract_address","symbol","name","decimals","asset_name"],"title":"TokenInfo","description":"Token information model"},"TokensResponse":{"properties":{"tokens":{"items":{"$ref":"#/components/schemas/TokenInfo"},"type":"array","title":"Tokens","description":"List of supported tokens"}},"type":"object","required":["tokens"],"title":"TokensResponse","description":"Tokens response model"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}