{"data":{"service":"canix402","apiVersion":"0.1.0","discoveryVersion":"1.0.0","capabilities":["algorand-defi-opportunities","x402-paid-data","wallet-personalization","agent-discovery","openapi","execution-quotes","intent-plans","rebalance-delta-plans","policy-validate","swap-aware-compose","execution-simulate","prepaid-sessions","watch-retainers","haystack-swaps","multi-router-swaps","token-pricing","mcp-server"],"x402ProtocolVersion":2,"endpoints":[{"id":"root","method":"GET","path":"/","access":"free","summary":"API root branding and social metadata page","tags":["system","discovery"],"pathParams":[],"queryParams":[],"responseCodes":[200,500]},{"id":"health","method":"GET","path":"/health","access":"free","summary":"Service health check","tags":["system"],"pathParams":[],"queryParams":[],"responseCodes":[200,500]},{"id":"ready","method":"GET","path":"/ready","access":"free","summary":"Service readiness check (Algod required; Redis soft)","tags":["system"],"pathParams":[],"queryParams":[],"responseCodes":[200,500]},{"id":"metrics","method":"GET","path":"/metrics","access":"free","summary":"Prometheus metrics scrape endpoint (internal)","description":"Prometheus text exposition format. Intended for internal scrapes on the protocol component (:3000). Not exposed on the public Caddy gateway.","tags":["system","observability"],"pathParams":[],"queryParams":[],"responseCodes":[200,500]},{"id":"metadata","method":"GET","path":"/metadata","access":"free","summary":"Service metadata and policy surface","tags":["system","discovery"],"pathParams":[],"queryParams":[],"responseCodes":[200,500]},{"id":"discovery","method":"GET","path":"/discovery","access":"free","summary":"Machine-readable endpoint catalog for agents","tags":["discovery","agents"],"pathParams":[],"queryParams":[],"responseCodes":[200,500]},{"id":"openapi","method":"GET","path":"/openapi.json","access":"free","summary":"OpenAPI contract document","tags":["discovery","openapi"],"pathParams":[],"queryParams":[],"responseCodes":[200,500]},{"id":"faviconIco","method":"GET","path":"/favicon.ico","access":"free","summary":"API favicon for directory indexing","tags":["system","discovery"],"pathParams":[],"queryParams":[],"responseCodes":[200,500]},{"id":"faviconPng","method":"GET","path":"/favicon.png","access":"free","summary":"API favicon image","tags":["system","discovery"],"pathParams":[],"queryParams":[],"responseCodes":[200,500]},{"id":"logoPng","method":"GET","path":"/logo.png","access":"free","summary":"Service logo for directory and social indexing","tags":["system","discovery"],"pathParams":[],"queryParams":[],"responseCodes":[200,500]},{"id":"bannerPng","method":"GET","path":"/banner.png","access":"free","summary":"Service banner for directory and social indexing","tags":["system","discovery"],"pathParams":[],"queryParams":[],"responseCodes":[200,500]},{"id":"x402WellKnown","method":"GET","path":"/.well-known/x402","access":"free","summary":"x402 discovery fan-out document","tags":["discovery","agents","x402"],"pathParams":[],"queryParams":[],"responseCodes":[200,500]},{"id":"x402Manifest","method":"GET","path":"/.well-known/x402.json","access":"free","summary":"x402 discovery manifest for agent and directory indexing","tags":["discovery","agents","x402"],"pathParams":[],"queryParams":[],"responseCodes":[200,500]},{"id":"haystackSwapQuote","method":"POST","path":"/swaps/quote","access":"free","summary":"Fetch a walletless multi-router swap quote","description":"Quotes every enabled swap router in parallel, scores expected net out, and returns the winning route without signing or submitting. Pass optional router to force a single adapter. Amounts use asset base units. Quotes are short-lived and should be refreshed after completing prerequisite opt-ins.","tags":["defi","swaps","haystack","agents"],"pathParams":[],"queryParams":[],"responseCodes":[200,400,404,429,502]},{"id":"haystackSwapOptIn","method":"POST","path":"/swaps/optin","access":"free","summary":"Build prerequisite swap opt-ins for the winning quote","description":"Inspects the supplied account and winning quote, then returns any required output-asset and application opt-in transactions as an unsigned group. The caller signs and submits the group locally; canix402 never receives wallet keys or submits it.","tags":["defi","swaps","haystack","transactions","wallet"],"pathParams":[],"queryParams":[],"responseCodes":[200,400,502]},{"id":"tokenPricing","method":"POST","path":"/pricing","access":"free","summary":"Fetch USD token prices for Algorand asset IDs","description":"Returns CompX USD oracle prices for the requested Algorand asset IDs. A null price indicates that CompX has no current price for that asset.","tags":["defi","pricing","compx","agents"],"pathParams":[],"queryParams":[],"responseCodes":[200,400,502]},{"id":"opportunities","method":"GET","path":"/opportunities","access":"paid","summary":"Top 10 aggregated DeFi opportunities ranked by risk then APY","description":"Returns ranked DeFi yield opportunities across supported chains (Algorand and Base). Each row includes `chain`. Default list mixes Algorand venues with Morpho Vaults, Aave V3 reserves, and Aerodrome basic-pool farms on Base. Filter with protocol= or chain=algorand|base. Ranking applies designed risk constraints (confidence, utilization, volatility, reward runway, wallet health factor when address is in context) before raw APY. Use when an agent needs to compare APY/APR, TVL, asset pairs, opportunity type, protocol, chain, source freshness, risk, and caveats before presenting yield options. This endpoint provides normalized market data only; it does not build or submit transactions.","tags":["defi","opportunities","x402-global-challenge"],"pathParams":[],"queryParams":["protocol","chain","limit","offset","includeInactive","refresh"],"sessionAccess":"research","responseCodes":[200,402,500],"x402":{"protocolVersion":2,"requiredHeaders":["PAYMENT-REQUIRED","PAYMENT-SIGNATURE","PAYMENT-RESPONSE"],"facilitator":"https://facilitator.goplausible.xyz","requirementTemplate":{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.01"},"accepts":[{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.01"}],"amountUsdc":"0.01","amountMicro":"10000"}},{"id":"protocolOpportunities","method":"GET","path":"/protocols/:protocol/opportunities","access":"paid","summary":"Top 25 DeFi opportunities for a single protocol ranked by risk then APY","description":"Returns ranked DeFi opportunities for one protocol: tinyman, pact, folks-finance, compx, dorkfi, myth-finance, haystack, reti, alpha-arcade, stamm, morpho, aave, or aerodrome. Morpho rows are Base listed ERC-4626 vaults. Aave rows are Aave V3 Base reserves. Aerodrome rows are basic volatile and stable pools with a live gauge. Other slugs are Algorand. Ranking applies designed risk constraints before raw APY. Use when an agent already knows the target protocol and needs normalized APY/APR, TVL, asset pair, opportunity type, timestamps, risk, and caveats for that venue. This endpoint provides normalized market data only; it does not build or submit transactions.","tags":["defi","opportunities","protocol","x402-global-challenge"],"pathParams":["protocol"],"queryParams":["limit","offset","includeInactive","refresh"],"sessionAccess":"research","responseCodes":[200,402,500],"x402":{"protocolVersion":2,"requiredHeaders":["PAYMENT-REQUIRED","PAYMENT-SIGNATURE","PAYMENT-RESPONSE"],"facilitator":"https://facilitator.goplausible.xyz","requirementTemplate":{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.01"},"accepts":[{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.01"}],"amountUsdc":"0.01","amountMicro":"10000"}},{"id":"filteredOpportunities","method":"GET","path":"/opportunities/search","access":"paid","summary":"Caller-filtered opportunities across supported platforms","description":"Returns DeFi opportunities filtered by platform, chain (algorand|base), opportunity type, APY range, TVL threshold, and optional ASA assetIds across supported sources. Base Morpho, Aave, and Aerodrome rows use assetAddresses instead of assetIds. Use when an agent needs targeted discovery such as high-yield liquidity pools, lending markets, protocol-specific yield, minimum-liquidity opportunities, or yields for specific Algorand assets (assetIds=0 for ALGO). This endpoint provides normalized market data only; it does not build or submit transactions.","tags":["defi","opportunities","search","x402-global-challenge"],"pathParams":[],"queryParams":["platform","type","minApy","maxApy","minTvlUsd","assetIds","chain","limit","offset","includeInactive","refresh"],"sessionAccess":"research","responseCodes":[200,402,500],"x402":{"protocolVersion":2,"requiredHeaders":["PAYMENT-REQUIRED","PAYMENT-SIGNATURE","PAYMENT-RESPONSE"],"facilitator":"https://facilitator.goplausible.xyz","requirementTemplate":{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.01"},"accepts":[{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.01"}],"amountUsdc":"0.01","amountMicro":"10000"}},{"id":"personalizedOpportunities","method":"GET","path":"/opportunities/personalized","access":"paid","summary":"Top opportunities tuned to a wallet's held assets","description":"Returns Algorand DeFi opportunities whose underlying assets match a supplied wallet's holdings, including opted-in ASAs with positive balance and native ALGO when held. Matching applies POST /eligibility rules (min amount, ASA gates, capacity, unresolved NFD/creator gates) so full or gated venues are not recommended as enterable. Ranking prefers designed risk constraints (including wallet health factor from existing position snapshots) over raw APY. Each row includes canEnter, eligibilityFullyCheckable, and risk; quote-time on-chain checks remain authoritative. Use POST /eligibility for the diagnostic (missingAssets, gates, capacity, suggestedSwap). This endpoint provides normalized market data only; it does not build or submit transactions.","tags":["defi","opportunities","personalized","wallet","x402-global-challenge"],"pathParams":[],"queryParams":["address","limit","offset","includeInactive","refresh"],"sessionAccess":"research","responseCodes":[200,402,500],"x402":{"protocolVersion":2,"requiredHeaders":["PAYMENT-REQUIRED","PAYMENT-SIGNATURE","PAYMENT-RESPONSE"],"facilitator":"https://facilitator.goplausible.xyz","requirementTemplate":{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.05"},"accepts":[{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.05"}],"amountUsdc":"0.05","amountMicro":"50000"}},{"id":"opportunityHistory","method":"GET","path":"/opportunities/:opportunityId/history","access":"paid","summary":"Bounded APY/TVL history for one opportunity","description":"Returns a rolling APY and TVL series for one opportunity over a bounded window (1d, 7d, or 30d). Snapshots are stored as cheap hourly Redis buckets — not a warehouse and not backfilled from explorers. Empty points until the snapshot job has run. Includes a stability signal (APY stdev / sample count) so snapshot APY cannot dominate plan sizing. Market data only; Canix does not sign or submit transactions.","tags":["defi","opportunities","history","x402-global-challenge"],"pathParams":["opportunityId"],"queryParams":["window"],"sessionAccess":"research","responseCodes":[200,402,500],"x402":{"protocolVersion":2,"requiredHeaders":["PAYMENT-REQUIRED","PAYMENT-SIGNATURE","PAYMENT-RESPONSE"],"facilitator":"https://facilitator.goplausible.xyz","requirementTemplate":{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.01"},"accepts":[{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.01"}],"amountUsdc":"0.01","amountMicro":"10000"}},{"id":"eligibility","method":"POST","path":"/eligibility","access":"paid","summary":"Wallet eligibility and capacity for selected opportunities","description":"Checks whether a wallet can enter one or more opportunities before requesting an execution quote. Resolves Réti entryRequirements and capacity (min amount, ASA gates, staker slots, ALGO room). NFD and creator gates are published as unresolved — canEnter is never true until eligibilityFullyCheckable is true. Returns missingAssets, gates, capacity, an optional suggestedSwap hint (not a live quote), and wallet healthFactor for lending venues that already expose it on positions. Quote-time on-chain checks remain authoritative. Canix does not sign or submit transactions.","tags":["defi","opportunities","eligibility","wallet","x402-global-challenge"],"pathParams":[],"queryParams":[],"sessionAccess":"research","responseCodes":[200,400,402,500,503],"x402":{"protocolVersion":2,"requiredHeaders":["PAYMENT-REQUIRED","PAYMENT-SIGNATURE","PAYMENT-RESPONSE"],"facilitator":"https://facilitator.goplausible.xyz","requirementTemplate":{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.01"},"accepts":[{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.01"}],"amountUsdc":"0.01","amountMicro":"10000"}},{"id":"plans","method":"POST","path":"/plans","access":"paid","summary":"Compile an allocation intent into an ordered unsigned plan","description":"Agent states an allocation intent (address, budget/asset, constraints). Canix ranks enterable venues with designed risk constraints before raw APY, then returns ordered steps: eligibility, optional live multi-router swap compose (opt-in → swap → enter, driven by requiredAssetIds), protocol setup chains, and enter quotes as independent unsigned groups (never merged). Reuses quotes[] / order / prerequisiteShapeKeys. Includes expected position delta, a fail-closed simulation summary when compiled groups are available, x402 + network fee totals, and expiry. Quote-time on-chain checks remain authoritative. Canix does not sign or submit. Brownie and other agents should consume this SKU rather than forking a compiler.","tags":["defi","plans","execution","eligibility","wallet","x402","agents","x402-global-challenge"],"pathParams":[],"queryParams":[],"sessionAccess":"quotes","responseCodes":[200,400,402,500,503],"x402":{"protocolVersion":2,"requiredHeaders":["PAYMENT-REQUIRED","PAYMENT-SIGNATURE","PAYMENT-RESPONSE"],"facilitator":"https://facilitator.goplausible.xyz","requirementTemplate":{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.25"},"accepts":[{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.25"}],"amountUsdc":"0.25","amountMicro":"250000"}},{"id":"plansRebalance","method":"POST","path":"/plans/rebalance","access":"paid","summary":"Compile a delta rebalance plan of unsigned groups","description":"Positions are the book; opportunities are the menu. Pass address plus targetWeights (bps summing to 10000) and/or harvestIdle to claim worth-claiming rewards and redeploy idle ALGO. Returns ordered unsigned groups — claims, partial exits, optional multi-router swap compose, and enters — only the delta legs that change the book (not a full unwind-and-rebuild). Reuses claim desk, eligibility, compose, and position exit/manage shapeKeys. Groups are never merged. Attaches a fail-closed simulation summary when compiled groups are available. Canix does not sign or submit.","tags":["defi","plans","rebalance","execution","eligibility","wallet","x402","agents","x402-global-challenge"],"pathParams":[],"queryParams":[],"sessionAccess":"quotes","responseCodes":[200,400,402,500,503],"x402":{"protocolVersion":2,"requiredHeaders":["PAYMENT-REQUIRED","PAYMENT-SIGNATURE","PAYMENT-RESPONSE"],"facilitator":"https://facilitator.goplausible.xyz","requirementTemplate":{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.25"},"accepts":[{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.25"}],"amountUsdc":"0.25","amountMicro":"250000"}},{"id":"policyValidate","method":"POST","path":"/policy/validate","access":"paid","summary":"Validate a compiled plan or quotes[] against an operator policy document","description":"Operators bring policy; Canix evaluates a compiled plan (or proposed quotes[]) against a versioned policy document (max protocol weight, ALGO reserve floor, TVL/freshness floors, no-new-borrows, execution-ready only). Returns { pass, reasons[] }. Reuses plan/eligibility/risk fields already on the compiled object and fails closed when a required field is missing — it does not re-quote on-chain. Canix does not sign or submit. Brownie and a second agent can share the same schema (protocol/docs/policy-schema.md).","tags":["defi","policy","plans","execution","x402","agents","x402-global-challenge"],"pathParams":[],"queryParams":[],"sessionAccess":"quotes","responseCodes":[200,402,500],"x402":{"protocolVersion":2,"requiredHeaders":["PAYMENT-REQUIRED","PAYMENT-SIGNATURE","PAYMENT-RESPONSE"],"facilitator":"https://facilitator.goplausible.xyz","requirementTemplate":{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.25"},"accepts":[{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.25"}],"amountUsdc":"0.25","amountMicro":"250000"}},{"id":"positions","method":"GET","path":"/positions","access":"paid","summary":"DeFi positions held by an Algorand or Base wallet","description":"Returns normalized DeFi positions for a wallet. An Algorand address is read across Algorand protocols, including Mallow open perps (close with mainnet:mallow:v1:close:market) and resting orders (cancel with mainnet:mallow:v1:cancelOrder:resting, including an orphaned take-profit or stop-loss). LP tokens indexed by HOGSWAP (STAMM, AlgoFi, Humble) are valued via GET /lp/{asset_id}?amount= — proportional NAV, null rather than guessed. Tinyman and Pact LP collectors remain canonical for those venues (no double-count by LP ASA). A Base 0x address returns Aave V3 supply and variable debt plus staked Aerodrome basic-pool LP. Unclaimed AERO is omitted. This endpoint provides position data only; it does not build or submit transactions.","tags":["defi","positions","wallet","x402-global-challenge"],"pathParams":[],"queryParams":["address"],"sessionAccess":"research","responseCodes":[200,400,402,500,503],"x402":{"protocolVersion":2,"requiredHeaders":["PAYMENT-REQUIRED","PAYMENT-SIGNATURE","PAYMENT-RESPONSE"],"facilitator":"https://facilitator.goplausible.xyz","requirementTemplate":{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.005"},"accepts":[{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.005"}],"amountUsdc":"0.005","amountMicro":"5000"}},{"id":"positionsClaimable","method":"GET","path":"/positions/claimable","access":"paid","summary":"Claimable DeFi rewards across supported protocols","description":"Returns claimable reward rows for a wallet with USD value, network-fee / worth-claiming hints, compatible claim shapeKeys, and ready-to-POST quote inputs. Use claimAllQuotes (or selected per-row quotes) with POST /execution/quotes to compile unsigned claim groups — groups are never merged. Covers Tinyman farm, stALGO TINY claim, CompX staking, Pact farm, Haystack, and Alpha Arcade. This endpoint does not build or submit transactions.","tags":["defi","positions","rewards","wallet","execution","x402-global-challenge"],"pathParams":[],"queryParams":["address"],"sessionAccess":"research","responseCodes":[200,400,402,500,503],"x402":{"protocolVersion":2,"requiredHeaders":["PAYMENT-REQUIRED","PAYMENT-SIGNATURE","PAYMENT-RESPONSE"],"facilitator":"https://facilitator.goplausible.xyz","requirementTemplate":{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.001"},"accepts":[{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.001"}],"amountUsdc":"0.001","amountMicro":"1000"}},{"id":"publicBrowniePositions","method":"GET","path":"/public/agents/brownie/positions","access":"free","summary":"Public DeFi positions for the Brownie Bot showcase wallet","description":"Free showcase route that returns normalized DeFi positions for the Brownie Bot treasury wallet only. The wallet address is hardcoded server-side — this is not a general free /positions browser. Use GET /positions?address= for arbitrary wallets (paid).","tags":["defi","positions","agents","showcase"],"pathParams":[],"queryParams":[],"responseCodes":[200,500]},{"id":"haystackSwapTransactions","method":"POST","path":"/swaps/transactions","access":"paid","summary":"Build a walletless swap transaction group from the winning quote","description":"Returns an ordered Algorand swap group for a fresh multi-router quote, including signer indexes and any pre-signed members from the winning router. The caller signs only the designated transactions and submits the complete group locally. The 0.005 USDC x402 access charge is separate from Haystack's SDK-default 10 bps output fee, other router fees, DEX fees, price impact, and Algorand network fees.","tags":["defi","swaps","haystack","transactions","x402","agents","x402-global-challenge"],"pathParams":[],"queryParams":[],"sessionAccess":"quotes","responseCodes":[200,400,402,429,502],"x402":{"protocolVersion":2,"requiredHeaders":["PAYMENT-REQUIRED","PAYMENT-SIGNATURE","PAYMENT-RESPONSE"],"facilitator":"https://facilitator.goplausible.xyz","requirementTemplate":{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.005"},"accepts":[{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.005"}],"amountUsdc":"0.005","amountMicro":"5000"}},{"id":"executionShapes","method":"GET","path":"/execution/shapes","access":"free","summary":"List verified execution shape catalog metadata","description":"Returns the live catalog of verified transaction shapes (shapeKey, requiredInputs, opportunityRole, docsPath). meta.caveatsDocsPath points at protocol-specific construction caveats. Catalog metadata only — does not compile quotes or return unsigned transactions. Use POST /execution/quotes to compile executable groups. Do not guess pool discovery, opt-ins, min-balance, slippage, liquidity limits, or app upgrades. Read protocol/docs/execution-shapes/protocol-caveats.md (GET /execution/shapes meta.caveatsDocsPath) and each shape's docsPath.","tags":["execution","discovery","agents"],"pathParams":[],"queryParams":[],"responseCodes":[200,500]},{"id":"mallowMarkets","method":"GET","path":"/protocols/mallow/markets","access":"free","summary":"Mallow ALGO and BTC perpetual market snapshot","description":"Returns the live ALGO/USD and BTC/USD index, max leverage, USDC collateral asset, and Mallow's 3 bps builder fee. A missing pair fails that row only. Catalog data for mainnet:mallow:v1:openLimit:attached — compile the unsigned order with POST /execution/quotes. Positions settle on People's Exchange.","tags":["mallow","perps","discovery","agents"],"pathParams":[],"queryParams":[],"responseCodes":[200,500]},{"id":"mallowPositions","method":"GET","path":"/protocols/mallow/positions","access":"free","summary":"Mallow ALGO and BTC perpetual positions for one wallet","description":"Returns open ALGO/USD and BTC/USD positions that post USDC, including positionId for mainnet:mallow:v1:close:market. Other markets are omitted. An unknown address returns an empty list. Compile the unsigned close with POST /execution/quotes.","tags":["mallow","perps","discovery","agents"],"pathParams":[],"queryParams":["address"],"responseCodes":[200,500]},{"id":"haystackLaunches","method":"GET","path":"/protocols/haystack/launches","access":"paid","summary":"Haystack tokens still on the bonding curve","description":"Returns HayLaunch tokens with bondingOn = 0 inside a launch-date window. The default window is the last 60 days when launchedAfter is omitted. q is a case-insensitive name or ticker substring. minProgress and maxProgress are inclusive bonding percents from 0 to 100. order is asc or desc on bonding percent (default desc). Each row includes the buy shape key mainnet:haystack:v1:buy:bonding. Compile that buy, or mainnet:haystack:v1:launch:token, with POST /execution/quotes.","tags":["haystack","launch","discovery","x402","agents","x402-global-challenge"],"pathParams":[],"queryParams":["q","minProgress","maxProgress","order","launchedAfter","launchedBefore","limit","offset"],"sessionAccess":"research","responseCodes":[200,402,500],"x402":{"protocolVersion":2,"requiredHeaders":["PAYMENT-REQUIRED","PAYMENT-SIGNATURE","PAYMENT-RESPONSE"],"facilitator":"https://facilitator.goplausible.xyz","requirementTemplate":{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.01"},"accepts":[{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.01"}],"amountUsdc":"0.01","amountMicro":"10000"}},{"id":"haystackLaunch","method":"GET","path":"/protocols/haystack/launches/:tokenNum","access":"free","summary":"One Haystack launch bonding status","description":"Returns one HayLaunch token box: phase, progress, price, reserves, and pool ids after graduation. Pass tokenNum, or assetId once the asset map exists (after the first buy). Optional address adds that wallet's virtual userHoldings. A graduated token points at POST /swaps/quote instead of the bonding buy.","tags":["haystack","launch","discovery","agents"],"pathParams":[],"queryParams":["assetId","address"],"responseCodes":[200,500]},{"id":"executionQuote","method":"POST","path":"/execution/quotes","access":"paid","summary":"Compile verified transaction shapes into unsigned Algorand groups or Base calldata","description":"Accepts `{ quotes: [{ shapeKey, input }, ...] }` (min 1) and returns an array of fresh, validated, unsigned transaction groups in request order. Groups are never merged across quotes. On failure the whole request fails and error.details includes quoteIndex and shapeKey. Price is flat per request (not per quote item). Use when an agent has selected one or more DeFi actions and needs deterministic transaction bytes to sign locally. Currently supports all five Tinyman v2 LP shapes (flexible/initial/single-asset add; multiple-assets-out/single-asset-out remove), Tinyman v2 swap shapes (swap:fixedInput / swap:fixedOutput via Tinyman Swap Router, falling back to a single Tinyman pool when the router is not better; Tinyman-pool only, never a cross-DEX aggregator), Tinyman farm shapes (staking-v1 farm:commit / farm:uncommit / farm:claimRewards; v2 addLiquidityAndFarm flexible/single-asset that add liquidity and commit the new LP position in one atomic group, with LP tokens remaining in the wallet), Tinyman liquid-stake/restake shapes (liquid-stake-v1 mint/burn tALGO; restake-v1 increaseStake/decreaseStake/claimRewards stALGO), Folks Finance v2 lending escrow shapes (setup depositEscrow/optEscrowAsset; deposit:escrow; withdraw:escrow), Folks Finance v2 loan credit shapes (setup:loanEscrow; setup:addCollateral; collateral:sync / collateral:reduce; borrow:variable; repay:withTxn), Folks Finance xALGO liquid-stake shapes (xalgo-v1 stake/unstake immediate), Pact v1 LP add/remove shapes, Pact Smart Router unsigned swap (`mainnet:pact:smart-router:swap:fixed-input`; local graph + Pool.prepareSwap, not Haystack), CompX v1 lending shapes (deposit/withdraw ASA; borrow:asa; repay:asa) and CompX v1 staking shapes, Dork.fi v1 ASA lending shapes (deposit/withdraw; borrow:asa; repay:asa), Myth Finance dualSTAKE shapes (dualstake-v1 mint/redeem LST; farm yield accrues passively while holding the LST), Haystack v1 single-token HAY staking shapes (stake HAY; unstake HAY and claim USDC+HAY rewards; claim USDC+HAY rewards), Haystack Launch shapes (`mainnet:haystack:v1:launch:token` creates a bonding-curve ASA from an existing ipfs:// or https:// URL; `mainnet:haystack:v1:buy:bonding` buys a token still on the curve, directly in the bonding asset or through the Haystack router — list bonding tokens with paid GET /protocols/haystack/launches and read one token free at GET /protocols/haystack/launches/{tokenNum}), Réti v1 ALGO staking shapes (stake/unstake), Alpha Arcade v1 ALPHA staking shapes (stake/unstake/claim USDC), and STAMM v1 LP mint/redeem via HOGSWAP (unsigned groups; do not hardcode router app ids), and HOGSWAP v1 swap shapes (fixed-input / fixed-output; unsigned groups; routing fee already netted into expectedOut; do not hardcode router app ids), and Mallow v1 perps shapes (`mainnet:mallow:v1:openLimit:attached` for ALGO/USD or BTC/USD limit orders with leverage and attached take-profit and stop-loss; `mainnet:mallow:v1:close:market` to close an open ALGO or BTC position in full; `mainnet:mallow:v1:cancelOrder:resting` to cancel a resting order, including an orphaned take-profit or stop-loss; `mainnet:mallow:v1:optIn:usdc`). Read `GET /protocols/mallow/markets` for the live index and max leverage, `GET /protocols/mallow/positions` for a position id, and paid `GET /positions` for the wallet snapshot that includes Mallow perps and resting orders. Canix does not sign or submit transactions in this endpoint. Do not guess pool discovery, opt-ins, min-balance, slippage, liquidity limits, or app upgrades. Read protocol/docs/execution-shapes/protocol-caveats.md (GET /execution/shapes meta.caveatsDocsPath) and each shape's docsPath.","tags":["execution","transactions","x402","agents","x402-global-challenge"],"pathParams":[],"queryParams":[],"sessionAccess":"quotes","responseCodes":[200,402,500],"x402":{"protocolVersion":2,"requiredHeaders":["PAYMENT-REQUIRED","PAYMENT-SIGNATURE","PAYMENT-RESPONSE"],"facilitator":"https://facilitator.goplausible.xyz","requirementTemplate":{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.1"},"accepts":[{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.1"}],"amountUsdc":"0.1","amountMicro":"100000"}},{"id":"executionCompose","method":"POST","path":"/execution/compose","access":"paid","summary":"Compose opt-in → winning swap → enter as unmerged unsigned groups","description":"Compiles “I hold asset A, I want this opportunity” into sequenced groups: optional ASA/app opt-in, multi-router swap (signer indexes and pre-signed members preserved), then enter — driven by requiredAssetIds. Groups are never merged. Failure modes (stale quote, missing opt-in, slippage) are listed on step warnings. Canix does not sign or submit. Caller signs user legs and submits locally in order.","tags":["execution","swaps","plans","x402","agents","x402-global-challenge"],"pathParams":[],"queryParams":[],"sessionAccess":"quotes","responseCodes":[200,400,402,500,503],"x402":{"protocolVersion":2,"requiredHeaders":["PAYMENT-REQUIRED","PAYMENT-SIGNATURE","PAYMENT-RESPONSE"],"facilitator":"https://facilitator.goplausible.xyz","requirementTemplate":{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.1"},"accepts":[{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.1"}],"amountUsdc":"0.1","amountMicro":"100000"}},{"id":"executionSimulate","method":"POST","path":"/execution/simulate","access":"paid","summary":"Simulate compiled unsigned groups for predicted balance and position deltas","description":"Given compiled unsigned group(s) from a plan or execution quote, returns predicted wallet balance and position deltas without signing or submitting. Fails closed with machine-readable reasons when the group would not succeed (stale quote, not opted in, min balance, health factor too low, capacity). Canix does not sign or submit. POST /plans attaches the same simulation summary when compiled groups are available.","tags":["defi","execution","plans","simulation","x402","agents","x402-global-challenge"],"pathParams":[],"queryParams":[],"sessionAccess":"quotes","responseCodes":[200,400,402,500,503],"x402":{"protocolVersion":2,"requiredHeaders":["PAYMENT-REQUIRED","PAYMENT-SIGNATURE","PAYMENT-RESPONSE"],"facilitator":"https://facilitator.goplausible.xyz","requirementTemplate":{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.1"},"accepts":[{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.1"}],"amountUsdc":"0.1","amountMicro":"100000"}},{"id":"sessionsCreate","method":"POST","path":"/sessions","access":"paid","summary":"Buy a prepaid agent session receipt","description":"One compiler-priced x402 payment mints a walletless prepaid session receipt (canix://session/{id}). The receipt unlocks N research calls and M quotes/plans until TTL. Sessions are receipts, not keys — Canix never stores a wallet. Exact-scheme one-shots remain the default; omit X-Canix-Session to pay per request. Fail-closed on expiry, exhausted quota, or store unavailability.","tags":["sessions","x402","agents","x402-global-challenge"],"pathParams":[],"queryParams":[],"responseCodes":[200,400,402,500,503],"x402":{"protocolVersion":2,"requiredHeaders":["PAYMENT-REQUIRED","PAYMENT-SIGNATURE","PAYMENT-RESPONSE"],"facilitator":"https://facilitator.goplausible.xyz","requirementTemplate":{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.25"},"accepts":[{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.25"}],"amountUsdc":"0.25","amountMicro":"250000"}},{"id":"sessionsRefresh","method":"POST","path":"/sessions/refresh","access":"paid","summary":"Refresh a prepaid agent session receipt","description":"Compiler-priced x402 payment that resets N/M quota and TTL on an existing session id, or mints a new receipt if the previous one is gone. Cannot be paid with an existing session — this route is one-shot only.","tags":["sessions","x402","agents","x402-global-challenge"],"pathParams":[],"queryParams":[],"responseCodes":[200,400,402,500,503],"x402":{"protocolVersion":2,"requiredHeaders":["PAYMENT-REQUIRED","PAYMENT-SIGNATURE","PAYMENT-RESPONSE"],"facilitator":"https://facilitator.goplausible.xyz","requirementTemplate":{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.25"},"accepts":[{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.25"}],"amountUsdc":"0.25","amountMicro":"250000"}},{"id":"sessionsReceipt","method":"GET","path":"/sessions/:sessionId","access":"free","summary":"Read prepaid session remaining N/M","description":"Returns the session receipt including remaining research and quotes/plans quota and expiry. Agents should use this resource instead of the public indexer /transactions showcase. Fail-closed 402 when the receipt is unknown or expired.","tags":["sessions","agents","discovery"],"pathParams":["sessionId"],"queryParams":[],"responseCodes":[200,402]},{"id":"watchCreate","method":"POST","path":"/watch","access":"paid","summary":"Register a paid wallet watch retainer","description":"Recurring compiler-priced x402 retainer that registers a walletless watch (address + thresholds + optional HTTPS webhook). Fires signed, idempotent notifications on health-factor, claimable-USD, APY-drop, or Réti-capacity crossings. Canix never stores wallet keys — only the address, callback, and a server-generated HMAC secret (shown once). Refresh with POST /watch/refresh before TTL. MCP resource canix://watch/{watchId} lists recent firings.","tags":["watch","x402","agents","x402-global-challenge"],"pathParams":[],"queryParams":[],"responseCodes":[200,400,402,500,503],"x402":{"protocolVersion":2,"requiredHeaders":["PAYMENT-REQUIRED","PAYMENT-SIGNATURE","PAYMENT-RESPONSE"],"facilitator":"https://facilitator.goplausible.xyz","requirementTemplate":{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.25"},"accepts":[{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.25"}],"amountUsdc":"0.25","amountMicro":"250000"}},{"id":"watchRefresh","method":"POST","path":"/watch/refresh","access":"paid","summary":"Refresh a paid wallet watch retainer","description":"Compiler-priced x402 payment that extends TTL on an existing watch id. Optionally rotateSecret to mint a new HMAC key (returned once). Cannot be paid with a prepaid session. Unknown or expired watches fail-closed; register again with POST /watch.","tags":["watch","x402","agents","x402-global-challenge"],"pathParams":[],"queryParams":[],"responseCodes":[200,400,402,500,503],"x402":{"protocolVersion":2,"requiredHeaders":["PAYMENT-REQUIRED","PAYMENT-SIGNATURE","PAYMENT-RESPONSE"],"facilitator":"https://facilitator.goplausible.xyz","requirementTemplate":{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.25"},"accepts":[{"scheme":"exact","network":"algorand","asset":"31566704","payTo":"3Y2V6ODUVUGM4TXOEXY65YLMKMVLG4PB3GSOXDCJDE4X5YQA5JA3P2FHAQ","maxAmountRequired":"0.25"}],"amountUsdc":"0.25","amountMicro":"250000"}},{"id":"watchReceipt","method":"GET","path":"/watch/:watchId","access":"free","summary":"Read watch receipt and recent threshold firings","description":"Returns the walletless watch receipt including thresholds, webhook URL, expiry, and recent signed-delivery firings (idempotency keys). Does not return the HMAC secret. Unknown or expired receipts fail-closed with 402 WATCH_*.","tags":["watch","agents","discovery"],"pathParams":["watchId"],"queryParams":[],"responseCodes":[200,402]},{"id":"watchRotateSecret","method":"POST","path":"/watch/:watchId/rotate-secret","access":"free","summary":"Rotate the watch webhook HMAC secret","description":"Mints a new webhook signing secret. Requires the current secret in X-Canix-Watch-Secret. The new secret is returned once and never stored as a wallet key. Does not extend retainer TTL — pay POST /watch/refresh for that.","tags":["watch","agents"],"pathParams":["watchId"],"queryParams":[],"responseCodes":[200,402]}],"errorCatalog":[{"code":"MISSING_PAYMENT_SIGNATURE","httpStatus":402,"description":"The paid endpoint was called without PAYMENT-SIGNATURE."},{"code":"MALFORMED_PAYMENT_SIGNATURE","httpStatus":402,"description":"PAYMENT-SIGNATURE payload is malformed."},{"code":"EXPIRED_PAYMENT_PROOF","httpStatus":402,"description":"PAYMENT-SIGNATURE proof has expired."},{"code":"SESSION_INVALID","httpStatus":402,"description":"X-Canix-Session is unknown. Omit the header and pay per request, or buy a new session."},{"code":"SESSION_EXPIRED","httpStatus":402,"description":"Prepaid session TTL has elapsed. Fail-closed; one-shots still work without the session header."},{"code":"SESSION_EXHAUSTED","httpStatus":402,"description":"Prepaid session N/M quota is exhausted. Fail-closed; refresh with POST /sessions/refresh or pay per request."},{"code":"SESSION_UNAVAILABLE","httpStatus":402,"description":"Session store is unavailable. Fail-closed; omit X-Canix-Session and retry with a per-request payment."},{"code":"WATCH_INVALID","httpStatus":402,"description":"Watch receipt is unknown. Register a new paid watch with POST /watch."},{"code":"WATCH_EXPIRED","httpStatus":402,"description":"Watch retainer TTL has elapsed. Fail-closed; pay POST /watch to register again."},{"code":"WATCH_UNAVAILABLE","httpStatus":402,"description":"Watch store is unavailable. Fail-closed; retry later."},{"code":"WATCH_UNAUTHORIZED","httpStatus":402,"description":"Watch HMAC secret does not match. Send the current secret in X-Canix-Watch-Secret to rotate."},{"code":"VALIDATION_ERROR","httpStatus":400,"description":"Request validation failed."},{"code":"NOT_FOUND","httpStatus":404,"description":"Requested resource was not found."},{"code":"INTERNAL_ERROR","httpStatus":500,"description":"Internal server error."}],"sessionPolicy":{"header":"X-Canix-Session","receiptUriTemplate":"canix://session/{sessionId}","researchBudget":50,"quoteBudget":10,"ttlSeconds":14400,"priceUsdc":"0.25","oneShotDefault":true,"note":"Exact-scheme one-shots remain the default. Send X-Canix-Session with a prepaid receipt to consume N research or M quotes/plans until TTL. Create/refresh are one-shot only. Fail-closed on expiry, exhausted quota, or store unavailability."},"watchPolicy":{"receiptUriTemplate":"canix://watch/{watchId}","ttlSeconds":86400,"priceUsdc":"0.25","pollIntervalSeconds":300,"signatureHeader":"X-Canix-Signature","idempotencyHeader":"X-Canix-Idempotency-Key","secretHeader":"X-Canix-Watch-Secret","note":"Recurring x402 retainer. POST /watch registers address + thresholds + optional HTTPS webhook and returns an HMAC secret once. Notifications fire only on threshold crossings, signed with the secret, and carry an idempotency key for replay. Rotate the secret with POST /watch/{id}/rotate-secret. Canix never stores wallet keys."},"mcpServer":{"name":"canix402","transport":"streamable-http","docsUrl":"https://canix402.compx.io/x402#mcp","tools":["canix_health","canix_get_metadata","canix_get_discovery","canix_get_openapi","canix_get_token_prices","canix_list_execution_shapes","canix_list_haystack_launches","canix_get_haystack_launch","canix_list_opportunities","canix_search_opportunities","canix_get_personalized_opportunities","canix_get_opportunity_history","canix_check_eligibility","canix_get_plan","canix_get_rebalance_plan","canix_validate_policy","canix_compose_enter","canix_get_protocol_opportunities","canix_get_positions","canix_list_claimable","canix_get_execution_quote","canix_simulate_execution","canix_create_session","canix_refresh_session","canix_get_session","canix_create_watch","canix_refresh_watch","canix_get_watch","canix_rotate_watch_secret","canix_get_quote","canix_optin","canix_swap"],"url":"https://canix402-mcp.compx.io/mcp","install":"Connect your MCP client to the remote canix402 endpoint at /mcp (walletless pass-through)."}}}