{"openapi":"3.1.0","info":{"title":"FortFi keyless x402 API","version":"2.0.0","description":"Pay-per-call FortFi agent finance for callers without a FortFi account. Each call is paid in USDC on Base over x402 and the verified paying wallet is the identity. No API key is issued. Money moves go through FortFi policy, caps, allowlists, and co-sign rules; payment never bypasses them.","contact":{"email":"support@fortfiapp.com"},"x-guidance":"FortFi keyless x402: no account, no API key.\n1. POST /api/x402/v1/accounts with PAYMENT-SIGNATURE and x-fortfi-request-signature, body { contactEmail } to create an agent account owned by your paying wallet.\n2. Call any /api/x402/v1/* endpoint with a fresh PAYMENT-SIGNATURE from the same wallet. Write endpoints also need x-fortfi-request-signature (the 401 body returns the exact message).\n3. Money moves: propose (swap/propose, send/propose, ...) then proposals/confirm. Policy, caps, allowlists, and co-sign thresholds apply.\nFailed, rejected, or policy-denied calls are not charged. Each payment authorization is single-use.\nFortFi account holders use their existing API key on /api/mcp at no per-call cost.\nHuman docs: /agents · Tool catalog: /.well-known/mcp/server-card.json · REST parity: /developers/rest-api"},"servers":[{"url":"https://fortfiapp.com","description":"Production"}],"components":{"securitySchemes":{"x402":{"type":"apiKey","in":"header","name":"PAYMENT-SIGNATURE","description":"Base64-encoded x402 v2 PaymentPayload (upto Permit2 or exact EIP-3009 USDC authorization on Base). The verified payer wallet is the caller identity. Each authorization is single-use."}},"schemas":{"X402PaymentRequiredV2":{"type":"object","required":["x402Version","resource","accepts"],"properties":{"x402Version":{"type":"integer","const":2},"error":{"type":"string"},"resource":{"type":"object","required":["url","description","mimeType"],"properties":{"url":{"type":"string","format":"uri"},"description":{"type":"string"},"mimeType":{"type":"string"},"serviceName":{"type":"string"}}},"accepts":{"type":"array","minItems":1,"items":{"type":"object","required":["scheme","network","amount","asset","payTo","maxTimeoutSeconds"],"properties":{"scheme":{"type":"string","enum":["upto","exact"]},"network":{"type":"string","example":"eip155:8453"},"amount":{"type":"string","description":"USDC atomic units (6 decimals)"},"asset":{"type":"string"},"payTo":{"type":"string"},"maxTimeoutSeconds":{"type":"integer"},"extra":{"type":"object"}}}},"extensions":{"type":"object"}}},"X402KeylessSuccess":{"type":"object","required":["ok","data","payment"],"properties":{"ok":{"type":"boolean","const":true},"data":{"type":"object"},"payment":{"type":"object","properties":{"scheme":{"type":"string","enum":["upto","exact"]},"amountSmallestUnit":{"type":"string"},"txHash":{"type":["string","null"]},"payer":{"type":"string"}}}}}}},"paths":{"/api/x402/v1/accounts":{"get":{"operationId":"x402AccountsCreateDescriptor","summary":"Create a FortFi agent account owned by the paying wallet (contactEmail recovery owner required) (402 descriptor)","tags":["Accounts and payments"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"1.00"},"protocols":[{"x402":{}}]},"responses":{"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}}}},"post":{"operationId":"x402AccountsCreate","summary":"Create a FortFi agent account owned by the paying wallet (contactEmail recovery owner required)","description":"1.00 USDC on Base per successful call. The verified paying wallet is the identity; no API key is issued. Validation, policy, or execution failures are not charged.","tags":["Accounts and payments"],"security":[{"x402":[]}],"parameters":[{"name":"x-fortfi-request-signature","in":"header","required":true,"schema":{"type":"string"},"description":"EIP-191 personal_sign by the payer wallet over: 'FortFi x402 request\\n{host}\\nPOST\\n{path}\\n{sha256 hex of raw body}\\n{payment nonce}'. A 401 response includes the exact message to sign. Binds the body to the payment so it cannot be swapped in flight."}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"1.00"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contactEmail":{},"displayName":{"type":"string","minLength":1,"maxLength":100},"agentLabel":{"type":"string","minLength":2,"maxLength":64,"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$"}},"required":["contactEmail"],"additionalProperties":false},"example":{"contactEmail":"owner@example.com","displayName":"Treasury Agent"}}}},"responses":{"200":{"description":"Success; payment settled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402KeylessSuccess"}}}},"400":{"description":"Request rejected; no payment was settled"},"401":{"description":"Missing or invalid request signature; not charged"},"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}},"403":{"description":"Request rejected; no payment was settled"},"404":{"description":"Request rejected; no payment was settled"},"409":{"description":"Payment authorization already used, or ambiguous agent; not charged"},"413":{"description":"Request rejected; no payment was settled"},"422":{"description":"Policy, risk, or tool validation failure; not charged"},"429":{"description":"Request rejected; no payment was settled"}}}},"/api/x402/v1/accounts/list":{"get":{"operationId":"x402AccountsListDescriptor","summary":"List agent accounts funded by the paying wallet (402 descriptor)","tags":["Accounts and payments"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.00"},"protocols":[{"x402":{}}]},"responses":{"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}}}},"post":{"operationId":"x402AccountsList","summary":"List agent accounts funded by the paying wallet","description":"0.00 USDC on Base per successful call. The verified paying wallet is the identity; no API key is issued. Validation, policy, or execution failures are not charged.","tags":["Accounts and payments"],"security":[{"x402":[]}],"parameters":[{"name":"x-fortfi-request-signature","in":"header","required":true,"schema":{"type":"string"},"description":"EIP-191 personal_sign by the payer wallet over: 'FortFi x402 request\\n{host}\\nPOST\\n{path}\\n{sha256 hex of raw body}\\n{payment nonce}'. A 401 response includes the exact message to sign. Binds the body to the payment so it cannot be swapped in flight."}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.00"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false},"example":{}}}},"responses":{"200":{"description":"Success; payment settled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402KeylessSuccess"}}}},"400":{"description":"Request rejected; no payment was settled"},"401":{"description":"Missing or invalid request signature; not charged"},"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}},"403":{"description":"Request rejected; no payment was settled"},"404":{"description":"Request rejected; no payment was settled"},"409":{"description":"Payment authorization already used, or ambiguous agent; not charged"},"413":{"description":"Request rejected; no payment was settled"},"422":{"description":"Policy, risk, or tool validation failure; not charged"},"429":{"description":"Request rejected; no payment was settled"}}}},"/api/x402/v1/vaults":{"get":{"operationId":"x402VaultsCreateDescriptor","summary":"Create an additional vault (wallet) on the agent account (402 descriptor)","tags":["Accounts and payments"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.25"},"protocols":[{"x402":{}}]},"responses":{"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}}}},"post":{"operationId":"x402VaultsCreate","summary":"Create an additional vault (wallet) on the agent account","description":"0.25 USDC on Base per successful call. The verified paying wallet is the identity; no API key is issued. Validation, policy, or execution failures are not charged.","tags":["Accounts and payments"],"security":[{"x402":[]}],"parameters":[{"name":"x-fortfi-request-signature","in":"header","required":true,"schema":{"type":"string"},"description":"EIP-191 personal_sign by the payer wallet over: 'FortFi x402 request\\n{host}\\nPOST\\n{path}\\n{sha256 hex of raw body}\\n{payment nonce}'. A 401 response includes the exact message to sign. Binds the body to the payment so it cannot be swapped in flight."}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.25"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agent":{"type":"string","minLength":2,"maxLength":64},"chainId":{"type":"string","enum":["base-mainnet","ethereum-mainnet","polygon-mainnet","arbitrum-mainnet","optimism-mainnet","bnb-mainnet","avalanche-mainnet","hyperliquid-mainnet","megaeth-mainnet","robinhood-mainnet","gnosis-mainnet","solana-mainnet","base-sepolia","ethereum-sepolia","polygon-amoy","arbitrum-sepolia"]},"walletName":{"type":"string","minLength":2,"maxLength":64},"metadata":{"type":"object","additionalProperties":{"type":"string","maxLength":256}}},"required":["chainId","walletName"],"additionalProperties":false},"example":{"chainId":"base-mainnet","walletName":"Ops Vault"}}}},"responses":{"200":{"description":"Success; payment settled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402KeylessSuccess"}}}},"400":{"description":"Request rejected; no payment was settled"},"401":{"description":"Missing or invalid request signature; not charged"},"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}},"403":{"description":"Request rejected; no payment was settled"},"404":{"description":"Request rejected; no payment was settled"},"409":{"description":"Payment authorization already used, or ambiguous agent; not charged"},"413":{"description":"Request rejected; no payment was settled"},"422":{"description":"Policy, risk, or tool validation failure; not charged"},"429":{"description":"Request rejected; no payment was settled"}}}},"/api/x402/v1/wallets":{"get":{"operationId":"x402WalletsListDescriptor","summary":"List agent vaults with addresses and chains (402 descriptor)","tags":["Accounts and payments"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.00"},"protocols":[{"x402":{}}]},"responses":{"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}}}},"post":{"operationId":"x402WalletsList","summary":"List agent vaults with addresses and chains","description":"0.00 USDC on Base per successful call. The verified paying wallet is the identity; no API key is issued. Validation, policy, or execution failures are not charged.","tags":["Accounts and payments"],"security":[{"x402":[]}],"parameters":[{"name":"x-fortfi-request-signature","in":"header","required":true,"schema":{"type":"string"},"description":"EIP-191 personal_sign by the payer wallet over: 'FortFi x402 request\\n{host}\\nPOST\\n{path}\\n{sha256 hex of raw body}\\n{payment nonce}'. A 401 response includes the exact message to sign. Binds the body to the payment so it cannot be swapped in flight."}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.00"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agent":{"type":"string","minLength":2,"maxLength":64},"metadataKey":{"type":"string","maxLength":64},"metadataValue":{"type":"string","maxLength":256},"cursor":{"type":"string","maxLength":256},"limit":{"type":"integer","minimum":1,"maximum":200}},"additionalProperties":false},"example":{}}}},"responses":{"200":{"description":"Success; payment settled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402KeylessSuccess"}}}},"400":{"description":"Request rejected; no payment was settled"},"401":{"description":"Missing or invalid request signature; not charged"},"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}},"403":{"description":"Request rejected; no payment was settled"},"404":{"description":"Request rejected; no payment was settled"},"409":{"description":"Payment authorization already used, or ambiguous agent; not charged"},"413":{"description":"Request rejected; no payment was settled"},"422":{"description":"Policy, risk, or tool validation failure; not charged"},"429":{"description":"Request rejected; no payment was settled"}}}},"/api/x402/v1/portfolio":{"get":{"operationId":"x402PortfolioGetDescriptor","summary":"Portfolio summary across all agent vaults (402 descriptor)","tags":["Accounts and payments"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.00"},"protocols":[{"x402":{}}]},"responses":{"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}}}},"post":{"operationId":"x402PortfolioGet","summary":"Portfolio summary across all agent vaults","description":"0.00 USDC on Base per successful call. The verified paying wallet is the identity; no API key is issued. Validation, policy, or execution failures are not charged.","tags":["Accounts and payments"],"security":[{"x402":[]}],"parameters":[{"name":"x-fortfi-request-signature","in":"header","required":true,"schema":{"type":"string"},"description":"EIP-191 personal_sign by the payer wallet over: 'FortFi x402 request\\n{host}\\nPOST\\n{path}\\n{sha256 hex of raw body}\\n{payment nonce}'. A 401 response includes the exact message to sign. Binds the body to the payment so it cannot be swapped in flight."}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.00"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agent":{"type":"string","minLength":2,"maxLength":64}},"additionalProperties":false},"example":{}}}},"responses":{"200":{"description":"Success; payment settled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402KeylessSuccess"}}}},"400":{"description":"Request rejected; no payment was settled"},"401":{"description":"Missing or invalid request signature; not charged"},"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}},"403":{"description":"Request rejected; no payment was settled"},"404":{"description":"Request rejected; no payment was settled"},"409":{"description":"Payment authorization already used, or ambiguous agent; not charged"},"413":{"description":"Request rejected; no payment was settled"},"422":{"description":"Policy, risk, or tool validation failure; not charged"},"429":{"description":"Request rejected; no payment was settled"}}}},"/api/x402/v1/holdings":{"get":{"operationId":"x402HoldingsGetDescriptor","summary":"Token balances for one vault (402 descriptor)","tags":["Accounts and payments"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.00"},"protocols":[{"x402":{}}]},"responses":{"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}}}},"post":{"operationId":"x402HoldingsGet","summary":"Token balances for one vault","description":"0.00 USDC on Base per successful call. The verified paying wallet is the identity; no API key is issued. Validation, policy, or execution failures are not charged.","tags":["Accounts and payments"],"security":[{"x402":[]}],"parameters":[{"name":"x-fortfi-request-signature","in":"header","required":true,"schema":{"type":"string"},"description":"EIP-191 personal_sign by the payer wallet over: 'FortFi x402 request\\n{host}\\nPOST\\n{path}\\n{sha256 hex of raw body}\\n{payment nonce}'. A 401 response includes the exact message to sign. Binds the body to the payment so it cannot be swapped in flight."}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.00"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agent":{"type":"string","minLength":2,"maxLength":64},"walletId":{"type":"string","format":"uuid"}},"required":["walletId"],"additionalProperties":false},"example":{"walletId":"00000000-0000-4000-8000-000000000001"}}}},"responses":{"200":{"description":"Success; payment settled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402KeylessSuccess"}}}},"400":{"description":"Request rejected; no payment was settled"},"401":{"description":"Missing or invalid request signature; not charged"},"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}},"403":{"description":"Request rejected; no payment was settled"},"404":{"description":"Request rejected; no payment was settled"},"409":{"description":"Payment authorization already used, or ambiguous agent; not charged"},"413":{"description":"Request rejected; no payment was settled"},"422":{"description":"Policy, risk, or tool validation failure; not charged"},"429":{"description":"Request rejected; no payment was settled"}}}},"/api/x402/v1/policy-limits":{"get":{"operationId":"x402PolicyLimitsGetDescriptor","summary":"Per-transaction, daily, and monthly caps for the agent account (402 descriptor)","tags":["Accounts and payments"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.00"},"protocols":[{"x402":{}}]},"responses":{"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}}}},"post":{"operationId":"x402PolicyLimitsGet","summary":"Per-transaction, daily, and monthly caps for the agent account","description":"0.00 USDC on Base per successful call. The verified paying wallet is the identity; no API key is issued. Validation, policy, or execution failures are not charged.","tags":["Accounts and payments"],"security":[{"x402":[]}],"parameters":[{"name":"x-fortfi-request-signature","in":"header","required":true,"schema":{"type":"string"},"description":"EIP-191 personal_sign by the payer wallet over: 'FortFi x402 request\\n{host}\\nPOST\\n{path}\\n{sha256 hex of raw body}\\n{payment nonce}'. A 401 response includes the exact message to sign. Binds the body to the payment so it cannot be swapped in flight."}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.00"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agent":{"type":"string","minLength":2,"maxLength":64}},"additionalProperties":false},"example":{}}}},"responses":{"200":{"description":"Success; payment settled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402KeylessSuccess"}}}},"400":{"description":"Request rejected; no payment was settled"},"401":{"description":"Missing or invalid request signature; not charged"},"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}},"403":{"description":"Request rejected; no payment was settled"},"404":{"description":"Request rejected; no payment was settled"},"409":{"description":"Payment authorization already used, or ambiguous agent; not charged"},"413":{"description":"Request rejected; no payment was settled"},"422":{"description":"Policy, risk, or tool validation failure; not charged"},"429":{"description":"Request rejected; no payment was settled"}}}},"/api/x402/v1/recipients/list":{"get":{"operationId":"x402RecipientsListDescriptor","summary":"List allowlisted recipients and cooldown status (402 descriptor)","tags":["Accounts and payments"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.00"},"protocols":[{"x402":{}}]},"responses":{"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}}}},"post":{"operationId":"x402RecipientsList","summary":"List allowlisted recipients and cooldown status","description":"0.00 USDC on Base per successful call. The verified paying wallet is the identity; no API key is issued. Validation, policy, or execution failures are not charged.","tags":["Accounts and payments"],"security":[{"x402":[]}],"parameters":[{"name":"x-fortfi-request-signature","in":"header","required":true,"schema":{"type":"string"},"description":"EIP-191 personal_sign by the payer wallet over: 'FortFi x402 request\\n{host}\\nPOST\\n{path}\\n{sha256 hex of raw body}\\n{payment nonce}'. A 401 response includes the exact message to sign. Binds the body to the payment so it cannot be swapped in flight."}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.00"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agent":{"type":"string","minLength":2,"maxLength":64}},"additionalProperties":false},"example":{}}}},"responses":{"200":{"description":"Success; payment settled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402KeylessSuccess"}}}},"400":{"description":"Request rejected; no payment was settled"},"401":{"description":"Missing or invalid request signature; not charged"},"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}},"403":{"description":"Request rejected; no payment was settled"},"404":{"description":"Request rejected; no payment was settled"},"409":{"description":"Payment authorization already used, or ambiguous agent; not charged"},"413":{"description":"Request rejected; no payment was settled"},"422":{"description":"Policy, risk, or tool validation failure; not charged"},"429":{"description":"Request rejected; no payment was settled"}}}},"/api/x402/v1/recipients/add":{"get":{"operationId":"x402RecipientsAddDescriptor","summary":"Add an allowlisted recipient (funding-wallet GOVERN challenge, two calls) (402 descriptor)","tags":["Accounts and payments"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.02"},"protocols":[{"x402":{}}]},"responses":{"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}}}},"post":{"operationId":"x402RecipientsAdd","summary":"Add an allowlisted recipient (funding-wallet GOVERN challenge, two calls)","description":"0.02 USDC on Base per successful call. The verified paying wallet is the identity; no API key is issued. Validation, policy, or execution failures are not charged.","tags":["Accounts and payments"],"security":[{"x402":[]}],"parameters":[{"name":"x-fortfi-request-signature","in":"header","required":true,"schema":{"type":"string"},"description":"EIP-191 personal_sign by the payer wallet over: 'FortFi x402 request\\n{host}\\nPOST\\n{path}\\n{sha256 hex of raw body}\\n{payment nonce}'. A 401 response includes the exact message to sign. Binds the body to the payment so it cannot be swapped in flight."}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.02"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agent":{"type":"string","minLength":2,"maxLength":64},"address":{"type":"string","pattern":"^(0x[0-9a-fA-F]{40}|[1-9A-HJ-NP-Za-km-z]{32,44})$"},"chainId":{"type":"string","enum":["base-mainnet","ethereum-mainnet","polygon-mainnet","arbitrum-mainnet","optimism-mainnet","bnb-mainnet","avalanche-mainnet","hyperliquid-mainnet","megaeth-mainnet","robinhood-mainnet","gnosis-mainnet","solana-mainnet","base-sepolia","ethereum-sepolia","polygon-amoy","arbitrum-sepolia"]},"nickname":{"type":"string","maxLength":64},"challengeId":{"type":"string","minLength":1,"maxLength":256},"walletSignature":{"type":"string","minLength":1,"maxLength":1024}},"required":["address","chainId"],"additionalProperties":false},"example":{"address":"0x0000000000000000000000000000000000000001","chainId":"base-mainnet"}}}},"responses":{"200":{"description":"Success; payment settled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402KeylessSuccess"}}}},"400":{"description":"Request rejected; no payment was settled"},"401":{"description":"Missing or invalid request signature; not charged"},"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}},"403":{"description":"Request rejected; no payment was settled"},"404":{"description":"Request rejected; no payment was settled"},"409":{"description":"Payment authorization already used, or ambiguous agent; not charged"},"413":{"description":"Request rejected; no payment was settled"},"422":{"description":"Policy, risk, or tool validation failure; not charged"},"429":{"description":"Request rejected; no payment was settled"}}}},"/api/x402/v1/swap/quote":{"get":{"operationId":"x402SwapQuoteDescriptor","summary":"Preview a same-chain swap quote (no funds move) (402 descriptor)","tags":["Accounts and payments"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.00"},"protocols":[{"x402":{}}]},"responses":{"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}}}},"post":{"operationId":"x402SwapQuote","summary":"Preview a same-chain swap quote (no funds move)","description":"0.00 USDC on Base per successful call. The verified paying wallet is the identity; no API key is issued. Validation, policy, or execution failures are not charged.","tags":["Accounts and payments"],"security":[{"x402":[]}],"parameters":[{"name":"x-fortfi-request-signature","in":"header","required":true,"schema":{"type":"string"},"description":"EIP-191 personal_sign by the payer wallet over: 'FortFi x402 request\\n{host}\\nPOST\\n{path}\\n{sha256 hex of raw body}\\n{payment nonce}'. A 401 response includes the exact message to sign. Binds the body to the payment so it cannot be swapped in flight."}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.00"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agent":{"type":"string","minLength":2,"maxLength":64},"fromWalletId":{"type":"string","format":"uuid"},"sellTokenAddress":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"buyTokenAddress":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"sellMint":{"type":"string","maxLength":64},"buyMint":{"type":"string","maxLength":64},"sellSymbol":{"type":"string","minLength":1,"maxLength":24},"buySymbol":{"type":"string","minLength":1,"maxLength":24},"amountUsd":{"type":"string","pattern":"^\\d{1,12}(\\.\\d{1,6})?$"},"toWalletId":{"type":"string","format":"uuid"},"slippagePercent":{"type":"number","minimum":0,"maximum":50}},"required":["fromWalletId","sellSymbol","buySymbol","amountUsd"],"additionalProperties":false},"example":{"fromWalletId":"00000000-0000-4000-8000-000000000001","sellSymbol":"USDC","buySymbol":"ETH","amountUsd":"25.00"}}}},"responses":{"200":{"description":"Success; payment settled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402KeylessSuccess"}}}},"400":{"description":"Request rejected; no payment was settled"},"401":{"description":"Missing or invalid request signature; not charged"},"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}},"403":{"description":"Request rejected; no payment was settled"},"404":{"description":"Request rejected; no payment was settled"},"409":{"description":"Payment authorization already used, or ambiguous agent; not charged"},"413":{"description":"Request rejected; no payment was settled"},"422":{"description":"Policy, risk, or tool validation failure; not charged"},"429":{"description":"Request rejected; no payment was settled"}}}},"/api/x402/v1/swap/propose":{"get":{"operationId":"x402SwapProposeDescriptor","summary":"Propose an EVM swap; confirm with proposals/confirm (402 descriptor)","tags":["Accounts and payments"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.05"},"protocols":[{"x402":{}}]},"responses":{"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}}}},"post":{"operationId":"x402SwapPropose","summary":"Propose an EVM swap; confirm with proposals/confirm","description":"0.05 USDC on Base per successful call. The verified paying wallet is the identity; no API key is issued. Validation, policy, or execution failures are not charged.","tags":["Accounts and payments"],"security":[{"x402":[]}],"parameters":[{"name":"x-fortfi-request-signature","in":"header","required":true,"schema":{"type":"string"},"description":"EIP-191 personal_sign by the payer wallet over: 'FortFi x402 request\\n{host}\\nPOST\\n{path}\\n{sha256 hex of raw body}\\n{payment nonce}'. A 401 response includes the exact message to sign. Binds the body to the payment so it cannot be swapped in flight."}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.05"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agent":{"type":"string","minLength":2,"maxLength":64},"fromWalletId":{"type":"string","format":"uuid"},"sellTokenAddress":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"buyTokenAddress":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"sellSymbol":{"type":"string","minLength":1,"maxLength":24},"buySymbol":{"type":"string","minLength":1,"maxLength":24},"amountUsd":{"type":"string","pattern":"^\\d{1,12}(\\.\\d{1,6})?$"},"previewQuoteId":{"type":"string","minLength":1,"maxLength":256},"slippagePercent":{"type":"number","minimum":0,"maximum":50}},"required":["fromWalletId","sellTokenAddress","buyTokenAddress","sellSymbol","buySymbol","amountUsd"],"additionalProperties":false},"example":{"fromWalletId":"00000000-0000-4000-8000-000000000001","sellTokenAddress":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","buyTokenAddress":"0x4200000000000000000000000000000000000006","sellSymbol":"USDC","buySymbol":"WETH","amountUsd":"25.00"}}}},"responses":{"200":{"description":"Success; payment settled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402KeylessSuccess"}}}},"400":{"description":"Request rejected; no payment was settled"},"401":{"description":"Missing or invalid request signature; not charged"},"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}},"403":{"description":"Request rejected; no payment was settled"},"404":{"description":"Request rejected; no payment was settled"},"409":{"description":"Payment authorization already used, or ambiguous agent; not charged"},"413":{"description":"Request rejected; no payment was settled"},"422":{"description":"Policy, risk, or tool validation failure; not charged"},"429":{"description":"Request rejected; no payment was settled"}}}},"/api/x402/v1/send/propose":{"get":{"operationId":"x402SendProposeDescriptor","summary":"Send USDC to an allowlisted recipient (policy, caps, and cosign rules apply) (402 descriptor)","tags":["Accounts and payments"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.05"},"protocols":[{"x402":{}}]},"responses":{"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}}}},"post":{"operationId":"x402SendPropose","summary":"Send USDC to an allowlisted recipient (policy, caps, and cosign rules apply)","description":"0.05 USDC on Base per successful call. The verified paying wallet is the identity; no API key is issued. Validation, policy, or execution failures are not charged.","tags":["Accounts and payments"],"security":[{"x402":[]}],"parameters":[{"name":"x-fortfi-request-signature","in":"header","required":true,"schema":{"type":"string"},"description":"EIP-191 personal_sign by the payer wallet over: 'FortFi x402 request\\n{host}\\nPOST\\n{path}\\n{sha256 hex of raw body}\\n{payment nonce}'. A 401 response includes the exact message to sign. Binds the body to the payment so it cannot be swapped in flight."}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.05"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agent":{"type":"string","minLength":2,"maxLength":64},"fromWalletId":{"type":"string","format":"uuid"},"recipientId":{"type":"string","format":"uuid"},"amountUsdc":{"type":"string","pattern":"^\\d{1,12}(\\.\\d{1,6})?$"},"memo":{"type":"string","maxLength":256}},"required":["fromWalletId","recipientId","amountUsdc"],"additionalProperties":false},"example":{"fromWalletId":"00000000-0000-4000-8000-000000000001","recipientId":"00000000-0000-4000-8000-000000000001","amountUsdc":"5.00"}}}},"responses":{"200":{"description":"Success; payment settled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402KeylessSuccess"}}}},"400":{"description":"Request rejected; no payment was settled"},"401":{"description":"Missing or invalid request signature; not charged"},"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}},"403":{"description":"Request rejected; no payment was settled"},"404":{"description":"Request rejected; no payment was settled"},"409":{"description":"Payment authorization already used, or ambiguous agent; not charged"},"413":{"description":"Request rejected; no payment was settled"},"422":{"description":"Policy, risk, or tool validation failure; not charged"},"429":{"description":"Request rejected; no payment was settled"}}}},"/api/x402/v1/proposals/confirm":{"get":{"operationId":"x402ProposalsConfirmDescriptor","summary":"Confirm a pending proposal (delegated confirmation; cosign thresholds still apply) (402 descriptor)","tags":["Accounts and payments"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.02"},"protocols":[{"x402":{}}]},"responses":{"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}}}},"post":{"operationId":"x402ProposalsConfirm","summary":"Confirm a pending proposal (delegated confirmation; cosign thresholds still apply)","description":"0.02 USDC on Base per successful call. The verified paying wallet is the identity; no API key is issued. Validation, policy, or execution failures are not charged.","tags":["Accounts and payments"],"security":[{"x402":[]}],"parameters":[{"name":"x-fortfi-request-signature","in":"header","required":true,"schema":{"type":"string"},"description":"EIP-191 personal_sign by the payer wallet over: 'FortFi x402 request\\n{host}\\nPOST\\n{path}\\n{sha256 hex of raw body}\\n{payment nonce}'. A 401 response includes the exact message to sign. Binds the body to the payment so it cannot be swapped in flight."}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.02"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agent":{"type":"string","minLength":2,"maxLength":64},"proposalId":{"type":"string","format":"uuid"},"confirmToken":{"type":"string","minLength":32,"maxLength":1024}},"required":["proposalId"],"additionalProperties":false},"example":{"proposalId":"00000000-0000-4000-8000-000000000001"}}}},"responses":{"200":{"description":"Success; payment settled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402KeylessSuccess"}}}},"400":{"description":"Request rejected; no payment was settled"},"401":{"description":"Missing or invalid request signature; not charged"},"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}},"403":{"description":"Request rejected; no payment was settled"},"404":{"description":"Request rejected; no payment was settled"},"409":{"description":"Payment authorization already used, or ambiguous agent; not charged"},"413":{"description":"Request rejected; no payment was settled"},"422":{"description":"Policy, risk, or tool validation failure; not charged"},"429":{"description":"Request rejected; no payment was settled"}}}},"/api/x402/v1/bridge/quote":{"get":{"operationId":"x402BridgeQuoteDescriptor","summary":"Preview a cross-chain bridge quote (no funds move) (402 descriptor)","tags":["Perps, yield, bridge"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.00"},"protocols":[{"x402":{}}]},"responses":{"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}}}},"post":{"operationId":"x402BridgeQuote","summary":"Preview a cross-chain bridge quote (no funds move)","description":"0.00 USDC on Base per successful call. The verified paying wallet is the identity; no API key is issued. Validation, policy, or execution failures are not charged.","tags":["Perps, yield, bridge"],"security":[{"x402":[]}],"parameters":[{"name":"x-fortfi-request-signature","in":"header","required":true,"schema":{"type":"string"},"description":"EIP-191 personal_sign by the payer wallet over: 'FortFi x402 request\\n{host}\\nPOST\\n{path}\\n{sha256 hex of raw body}\\n{payment nonce}'. A 401 response includes the exact message to sign. Binds the body to the payment so it cannot be swapped in flight."}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.00"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agent":{"type":"string","minLength":2,"maxLength":64},"fromWalletId":{"type":"string","format":"uuid"},"toWalletId":{"type":"string","format":"uuid"},"sellSymbol":{"type":"string","minLength":1,"maxLength":24},"buySymbol":{"type":"string","minLength":1,"maxLength":24},"amountUsd":{"type":"string","pattern":"^\\d{1,12}(\\.\\d{1,6})?$"}},"required":["fromWalletId","toWalletId","sellSymbol","buySymbol","amountUsd"],"additionalProperties":false},"example":{"fromWalletId":"00000000-0000-4000-8000-000000000001","toWalletId":"00000000-0000-4000-8000-000000000001","sellSymbol":"USDC","buySymbol":"USDC","amountUsd":"25.00"}}}},"responses":{"200":{"description":"Success; payment settled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402KeylessSuccess"}}}},"400":{"description":"Request rejected; no payment was settled"},"401":{"description":"Missing or invalid request signature; not charged"},"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}},"403":{"description":"Request rejected; no payment was settled"},"404":{"description":"Request rejected; no payment was settled"},"409":{"description":"Payment authorization already used, or ambiguous agent; not charged"},"413":{"description":"Request rejected; no payment was settled"},"422":{"description":"Policy, risk, or tool validation failure; not charged"},"429":{"description":"Request rejected; no payment was settled"}}}},"/api/x402/v1/bridge/propose":{"get":{"operationId":"x402BridgeProposeDescriptor","summary":"Propose a cross-chain bridge; confirm with proposals/confirm (402 descriptor)","tags":["Perps, yield, bridge"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.10"},"protocols":[{"x402":{}}]},"responses":{"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}}}},"post":{"operationId":"x402BridgePropose","summary":"Propose a cross-chain bridge; confirm with proposals/confirm","description":"0.10 USDC on Base per successful call. The verified paying wallet is the identity; no API key is issued. Validation, policy, or execution failures are not charged.","tags":["Perps, yield, bridge"],"security":[{"x402":[]}],"parameters":[{"name":"x-fortfi-request-signature","in":"header","required":true,"schema":{"type":"string"},"description":"EIP-191 personal_sign by the payer wallet over: 'FortFi x402 request\\n{host}\\nPOST\\n{path}\\n{sha256 hex of raw body}\\n{payment nonce}'. A 401 response includes the exact message to sign. Binds the body to the payment so it cannot be swapped in flight."}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.10"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agent":{"type":"string","minLength":2,"maxLength":64},"fromWalletId":{"type":"string","format":"uuid"},"toWalletId":{"type":"string","format":"uuid"},"sellTokenAddress":{"type":"string","maxLength":64},"buyTokenAddress":{"type":"string","maxLength":64},"sellSymbol":{"type":"string","minLength":1,"maxLength":24},"buySymbol":{"type":"string","minLength":1,"maxLength":24},"amountUsd":{"type":"string","pattern":"^\\d{1,12}(\\.\\d{1,6})?$"},"previewQuoteId":{"type":"string","minLength":1,"maxLength":256}},"required":["fromWalletId","toWalletId","sellSymbol","buySymbol","amountUsd"],"additionalProperties":false},"example":{"fromWalletId":"00000000-0000-4000-8000-000000000001","toWalletId":"00000000-0000-4000-8000-000000000001","sellSymbol":"USDC","buySymbol":"USDC","amountUsd":"25.00"}}}},"responses":{"200":{"description":"Success; payment settled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402KeylessSuccess"}}}},"400":{"description":"Request rejected; no payment was settled"},"401":{"description":"Missing or invalid request signature; not charged"},"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}},"403":{"description":"Request rejected; no payment was settled"},"404":{"description":"Request rejected; no payment was settled"},"409":{"description":"Payment authorization already used, or ambiguous agent; not charged"},"413":{"description":"Request rejected; no payment was settled"},"422":{"description":"Policy, risk, or tool validation failure; not charged"},"429":{"description":"Request rejected; no payment was settled"}}}},"/api/x402/v1/perps/positions":{"get":{"operationId":"x402PerpsPositionsDescriptor","summary":"Open Hyperliquid perp positions and margin for a vault (402 descriptor)","tags":["Perps, yield, bridge"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.00"},"protocols":[{"x402":{}}]},"responses":{"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}}}},"post":{"operationId":"x402PerpsPositions","summary":"Open Hyperliquid perp positions and margin for a vault","description":"0.00 USDC on Base per successful call. The verified paying wallet is the identity; no API key is issued. Validation, policy, or execution failures are not charged.","tags":["Perps, yield, bridge"],"security":[{"x402":[]}],"parameters":[{"name":"x-fortfi-request-signature","in":"header","required":true,"schema":{"type":"string"},"description":"EIP-191 personal_sign by the payer wallet over: 'FortFi x402 request\\n{host}\\nPOST\\n{path}\\n{sha256 hex of raw body}\\n{payment nonce}'. A 401 response includes the exact message to sign. Binds the body to the payment so it cannot be swapped in flight."}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.00"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agent":{"type":"string","minLength":2,"maxLength":64},"walletId":{"type":"string","format":"uuid"}},"required":["walletId"],"additionalProperties":false},"example":{"walletId":"00000000-0000-4000-8000-000000000001"}}}},"responses":{"200":{"description":"Success; payment settled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402KeylessSuccess"}}}},"400":{"description":"Request rejected; no payment was settled"},"401":{"description":"Missing or invalid request signature; not charged"},"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}},"403":{"description":"Request rejected; no payment was settled"},"404":{"description":"Request rejected; no payment was settled"},"409":{"description":"Payment authorization already used, or ambiguous agent; not charged"},"413":{"description":"Request rejected; no payment was settled"},"422":{"description":"Policy, risk, or tool validation failure; not charged"},"429":{"description":"Request rejected; no payment was settled"}}}},"/api/x402/v1/perps/open":{"get":{"operationId":"x402PerpsOpenDescriptor","summary":"Propose opening a Hyperliquid perp (leverage and notional policy apply) (402 descriptor)","tags":["Perps, yield, bridge"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.05"},"protocols":[{"x402":{}}]},"responses":{"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}}}},"post":{"operationId":"x402PerpsOpen","summary":"Propose opening a Hyperliquid perp (leverage and notional policy apply)","description":"0.05 USDC on Base per successful call. The verified paying wallet is the identity; no API key is issued. Validation, policy, or execution failures are not charged.","tags":["Perps, yield, bridge"],"security":[{"x402":[]}],"parameters":[{"name":"x-fortfi-request-signature","in":"header","required":true,"schema":{"type":"string"},"description":"EIP-191 personal_sign by the payer wallet over: 'FortFi x402 request\\n{host}\\nPOST\\n{path}\\n{sha256 hex of raw body}\\n{payment nonce}'. A 401 response includes the exact message to sign. Binds the body to the payment so it cannot be swapped in flight."}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.05"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agent":{"type":"string","minLength":2,"maxLength":64},"walletId":{"type":"string","format":"uuid"},"symbol":{"type":"string","minLength":1,"maxLength":40},"side":{"type":"string","enum":["long","short"]},"size":{"type":"string","pattern":"^\\d{1,12}(\\.\\d{1,6})?$"},"sizeUsd":{"type":"string","pattern":"^\\d{1,12}(\\.\\d{1,6})?$"},"leverage":{"type":"number","exclusiveMinimum":0,"maximum":100},"stopLoss":{"type":"string","pattern":"^\\d{1,12}(\\.\\d{1,6})?$"},"takeProfit":{"type":"string","pattern":"^\\d{1,12}(\\.\\d{1,6})?$"}},"required":["walletId","symbol","side"],"additionalProperties":false},"example":{"walletId":"00000000-0000-4000-8000-000000000001","symbol":"BTC","side":"long","sizeUsd":"20","leverage":2}}}},"responses":{"200":{"description":"Success; payment settled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402KeylessSuccess"}}}},"400":{"description":"Request rejected; no payment was settled"},"401":{"description":"Missing or invalid request signature; not charged"},"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}},"403":{"description":"Request rejected; no payment was settled"},"404":{"description":"Request rejected; no payment was settled"},"409":{"description":"Payment authorization already used, or ambiguous agent; not charged"},"413":{"description":"Request rejected; no payment was settled"},"422":{"description":"Policy, risk, or tool validation failure; not charged"},"429":{"description":"Request rejected; no payment was settled"}}}},"/api/x402/v1/perps/close":{"get":{"operationId":"x402PerpsCloseDescriptor","summary":"Propose closing a Hyperliquid perp (reduce-only) (402 descriptor)","tags":["Perps, yield, bridge"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.02"},"protocols":[{"x402":{}}]},"responses":{"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}}}},"post":{"operationId":"x402PerpsClose","summary":"Propose closing a Hyperliquid perp (reduce-only)","description":"0.02 USDC on Base per successful call. The verified paying wallet is the identity; no API key is issued. Validation, policy, or execution failures are not charged.","tags":["Perps, yield, bridge"],"security":[{"x402":[]}],"parameters":[{"name":"x-fortfi-request-signature","in":"header","required":true,"schema":{"type":"string"},"description":"EIP-191 personal_sign by the payer wallet over: 'FortFi x402 request\\n{host}\\nPOST\\n{path}\\n{sha256 hex of raw body}\\n{payment nonce}'. A 401 response includes the exact message to sign. Binds the body to the payment so it cannot be swapped in flight."}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.02"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agent":{"type":"string","minLength":2,"maxLength":64},"walletId":{"type":"string","format":"uuid"},"symbol":{"type":"string","minLength":1,"maxLength":40},"size":{"type":"string","pattern":"^\\d{1,12}(\\.\\d{1,6})?$"}},"required":["walletId","symbol"],"additionalProperties":false},"example":{"walletId":"00000000-0000-4000-8000-000000000001","symbol":"BTC"}}}},"responses":{"200":{"description":"Success; payment settled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402KeylessSuccess"}}}},"400":{"description":"Request rejected; no payment was settled"},"401":{"description":"Missing or invalid request signature; not charged"},"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}},"403":{"description":"Request rejected; no payment was settled"},"404":{"description":"Request rejected; no payment was settled"},"409":{"description":"Payment authorization already used, or ambiguous agent; not charged"},"413":{"description":"Request rejected; no payment was settled"},"422":{"description":"Policy, risk, or tool validation failure; not charged"},"429":{"description":"Request rejected; no payment was settled"}}}},"/api/x402/v1/yield/markets":{"get":{"operationId":"x402YieldMarketsDescriptor","summary":"Morpho yield markets with policy eligibility (402 descriptor)","tags":["Perps, yield, bridge"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.00"},"protocols":[{"x402":{}}]},"responses":{"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}}}},"post":{"operationId":"x402YieldMarkets","summary":"Morpho yield markets with policy eligibility","description":"0.00 USDC on Base per successful call. The verified paying wallet is the identity; no API key is issued. Validation, policy, or execution failures are not charged.","tags":["Perps, yield, bridge"],"security":[{"x402":[]}],"parameters":[{"name":"x-fortfi-request-signature","in":"header","required":true,"schema":{"type":"string"},"description":"EIP-191 personal_sign by the payer wallet over: 'FortFi x402 request\\n{host}\\nPOST\\n{path}\\n{sha256 hex of raw body}\\n{payment nonce}'. A 401 response includes the exact message to sign. Binds the body to the payment so it cannot be swapped in flight."}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.00"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agent":{"type":"string","minLength":2,"maxLength":64},"chainId":{"type":"string","enum":["base-mainnet","ethereum-mainnet","polygon-mainnet","arbitrum-mainnet","optimism-mainnet","bnb-mainnet","avalanche-mainnet","hyperliquid-mainnet","megaeth-mainnet","robinhood-mainnet","gnosis-mainnet","solana-mainnet","base-sepolia","ethereum-sepolia","polygon-amoy","arbitrum-sepolia"]},"asset":{"type":"string","minLength":1,"maxLength":24},"verifiedOnly":{"type":"boolean"},"minTvlUsd":{"type":"number","minimum":0,"maximum":1000000000000},"sortBy":{"type":"string","enum":["net_apy","tvl"]},"limit":{"type":"integer","minimum":1,"maximum":25}},"additionalProperties":false},"example":{"chainId":"base-mainnet"}}}},"responses":{"200":{"description":"Success; payment settled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402KeylessSuccess"}}}},"400":{"description":"Request rejected; no payment was settled"},"401":{"description":"Missing or invalid request signature; not charged"},"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}},"403":{"description":"Request rejected; no payment was settled"},"404":{"description":"Request rejected; no payment was settled"},"409":{"description":"Payment authorization already used, or ambiguous agent; not charged"},"413":{"description":"Request rejected; no payment was settled"},"422":{"description":"Policy, risk, or tool validation failure; not charged"},"429":{"description":"Request rejected; no payment was settled"}}}},"/api/x402/v1/yield/positions":{"get":{"operationId":"x402YieldPositionsDescriptor","summary":"Active yield positions (402 descriptor)","tags":["Perps, yield, bridge"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.00"},"protocols":[{"x402":{}}]},"responses":{"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}}}},"post":{"operationId":"x402YieldPositions","summary":"Active yield positions","description":"0.00 USDC on Base per successful call. The verified paying wallet is the identity; no API key is issued. Validation, policy, or execution failures are not charged.","tags":["Perps, yield, bridge"],"security":[{"x402":[]}],"parameters":[{"name":"x-fortfi-request-signature","in":"header","required":true,"schema":{"type":"string"},"description":"EIP-191 personal_sign by the payer wallet over: 'FortFi x402 request\\n{host}\\nPOST\\n{path}\\n{sha256 hex of raw body}\\n{payment nonce}'. A 401 response includes the exact message to sign. Binds the body to the payment so it cannot be swapped in flight."}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.00"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agent":{"type":"string","minLength":2,"maxLength":64}},"additionalProperties":false},"example":{}}}},"responses":{"200":{"description":"Success; payment settled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402KeylessSuccess"}}}},"400":{"description":"Request rejected; no payment was settled"},"401":{"description":"Missing or invalid request signature; not charged"},"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}},"403":{"description":"Request rejected; no payment was settled"},"404":{"description":"Request rejected; no payment was settled"},"409":{"description":"Payment authorization already used, or ambiguous agent; not charged"},"413":{"description":"Request rejected; no payment was settled"},"422":{"description":"Policy, risk, or tool validation failure; not charged"},"429":{"description":"Request rejected; no payment was settled"}}}},"/api/x402/v1/yield/deposit":{"get":{"operationId":"x402YieldDepositDescriptor","summary":"Propose a Morpho vault deposit; confirm with proposals/confirm (402 descriptor)","tags":["Perps, yield, bridge"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.05"},"protocols":[{"x402":{}}]},"responses":{"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}}}},"post":{"operationId":"x402YieldDeposit","summary":"Propose a Morpho vault deposit; confirm with proposals/confirm","description":"0.05 USDC on Base per successful call. The verified paying wallet is the identity; no API key is issued. Validation, policy, or execution failures are not charged.","tags":["Perps, yield, bridge"],"security":[{"x402":[]}],"parameters":[{"name":"x-fortfi-request-signature","in":"header","required":true,"schema":{"type":"string"},"description":"EIP-191 personal_sign by the payer wallet over: 'FortFi x402 request\\n{host}\\nPOST\\n{path}\\n{sha256 hex of raw body}\\n{payment nonce}'. A 401 response includes the exact message to sign. Binds the body to the payment so it cannot be swapped in flight."}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.05"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agent":{"type":"string","minLength":2,"maxLength":64},"fromWalletId":{"type":"string","format":"uuid"},"fromAccountQuery":{"type":"string","maxLength":64},"vaultAddress":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"amountUsd":{"type":"string","pattern":"^\\d{1,12}(\\.\\d{1,6})?$"},"assetSymbol":{"type":"string","enum":["USDC","USDT"]}},"required":["vaultAddress","amountUsd"],"additionalProperties":false},"example":{"vaultAddress":"0x0000000000000000000000000000000000000002","amountUsd":"100.00"}}}},"responses":{"200":{"description":"Success; payment settled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402KeylessSuccess"}}}},"400":{"description":"Request rejected; no payment was settled"},"401":{"description":"Missing or invalid request signature; not charged"},"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}},"403":{"description":"Request rejected; no payment was settled"},"404":{"description":"Request rejected; no payment was settled"},"409":{"description":"Payment authorization already used, or ambiguous agent; not charged"},"413":{"description":"Request rejected; no payment was settled"},"422":{"description":"Policy, risk, or tool validation failure; not charged"},"429":{"description":"Request rejected; no payment was settled"}}}},"/api/x402/v1/yield/withdraw":{"get":{"operationId":"x402YieldWithdrawDescriptor","summary":"Propose a Morpho vault withdraw; confirm with proposals/confirm (402 descriptor)","tags":["Perps, yield, bridge"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.05"},"protocols":[{"x402":{}}]},"responses":{"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}}}},"post":{"operationId":"x402YieldWithdraw","summary":"Propose a Morpho vault withdraw; confirm with proposals/confirm","description":"0.05 USDC on Base per successful call. The verified paying wallet is the identity; no API key is issued. Validation, policy, or execution failures are not charged.","tags":["Perps, yield, bridge"],"security":[{"x402":[]}],"parameters":[{"name":"x-fortfi-request-signature","in":"header","required":true,"schema":{"type":"string"},"description":"EIP-191 personal_sign by the payer wallet over: 'FortFi x402 request\\n{host}\\nPOST\\n{path}\\n{sha256 hex of raw body}\\n{payment nonce}'. A 401 response includes the exact message to sign. Binds the body to the payment so it cannot be swapped in flight."}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.05"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agent":{"type":"string","minLength":2,"maxLength":64},"fromWalletId":{"type":"string","format":"uuid"},"fromAccountQuery":{"type":"string","maxLength":64},"vaultAddress":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"amountDisplay":{"type":"string","pattern":"^\\d{1,12}(\\.\\d{1,6})?$"},"assetSymbol":{"type":"string","enum":["USDC","USDT"]},"vaultName":{"type":"string","maxLength":128}},"required":["vaultAddress","amountDisplay"],"additionalProperties":false},"example":{"vaultAddress":"0x0000000000000000000000000000000000000002","amountDisplay":"50.00"}}}},"responses":{"200":{"description":"Success; payment settled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402KeylessSuccess"}}}},"400":{"description":"Request rejected; no payment was settled"},"401":{"description":"Missing or invalid request signature; not charged"},"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}},"403":{"description":"Request rejected; no payment was settled"},"404":{"description":"Request rejected; no payment was settled"},"409":{"description":"Payment authorization already used, or ambiguous agent; not charged"},"413":{"description":"Request rejected; no payment was settled"},"422":{"description":"Policy, risk, or tool validation failure; not charged"},"429":{"description":"Request rejected; no payment was settled"}}}},"/api/x402/v1/research/backtest":{"get":{"operationId":"x402ResearchBacktestDescriptor","summary":"Out-of-sample Hyperliquid backtest from a Strategy Spec (402 descriptor)","tags":["Research and screening"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.10"},"protocols":[{"x402":{}}]},"responses":{"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}}}},"post":{"operationId":"x402ResearchBacktest","summary":"Out-of-sample Hyperliquid backtest from a Strategy Spec","description":"0.10 USDC on Base per successful call. The verified paying wallet is the identity; no API key is issued. Validation, policy, or execution failures are not charged.","tags":["Research and screening"],"security":[{"x402":[]}],"parameters":[{"name":"x-fortfi-request-signature","in":"header","required":true,"schema":{"type":"string"},"description":"EIP-191 personal_sign by the payer wallet over: 'FortFi x402 request\\n{host}\\nPOST\\n{path}\\n{sha256 hex of raw body}\\n{payment nonce}'. A 401 response includes the exact message to sign. Binds the body to the payment so it cannot be swapped in flight."}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.10"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agent":{"type":"string","minLength":2,"maxLength":64},"spec":{"type":"object","additionalProperties":{}}},"required":["spec"],"additionalProperties":false},"example":{"spec":{"name":"top-n-momentum","interval":"1d"}}}}},"responses":{"200":{"description":"Success; payment settled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402KeylessSuccess"}}}},"400":{"description":"Request rejected; no payment was settled"},"401":{"description":"Missing or invalid request signature; not charged"},"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}},"403":{"description":"Request rejected; no payment was settled"},"404":{"description":"Request rejected; no payment was settled"},"409":{"description":"Payment authorization already used, or ambiguous agent; not charged"},"413":{"description":"Request rejected; no payment was settled"},"422":{"description":"Policy, risk, or tool validation failure; not charged"},"429":{"description":"Request rejected; no payment was settled"}}}},"/api/x402/v1/markets/hyperliquid/screen":{"get":{"operationId":"x402MarketsHyperliquidScreenDescriptor","summary":"Hyperliquid breakout screener with TA (402 descriptor)","tags":["Research and screening"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.00"},"protocols":[{"x402":{}}]},"responses":{"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}}}},"post":{"operationId":"x402MarketsHyperliquidScreen","summary":"Hyperliquid breakout screener with TA","description":"0.00 USDC on Base per successful call. The verified paying wallet is the identity; no API key is issued. Validation, policy, or execution failures are not charged.","tags":["Research and screening"],"security":[{"x402":[]}],"parameters":[{"name":"x-fortfi-request-signature","in":"header","required":true,"schema":{"type":"string"},"description":"EIP-191 personal_sign by the payer wallet over: 'FortFi x402 request\\n{host}\\nPOST\\n{path}\\n{sha256 hex of raw body}\\n{payment nonce}'. A 401 response includes the exact message to sign. Binds the body to the payment so it cannot be swapped in flight."}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.00"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agent":{"type":"string","minLength":2,"maxLength":64},"scope":{"type":"string","enum":["core","all"]},"includeAllDesks":{"type":"boolean"},"dex":{"oneOf":[{"type":"string","maxLength":200},{"type":"array","items":{"type":"string","maxLength":40},"maxItems":20}]},"assetClass":{"oneOf":[{"type":"string","maxLength":200},{"type":"array","items":{"type":"string","enum":["crypto","equity","commodity","fx","index","pre_ipo","other"]},"maxItems":7}]},"sort":{"type":"string","enum":["volume","pctChange","funding"]},"direction":{"type":"string","enum":["asc","desc"]},"sideBias":{"type":"string","enum":["long","short","both"]},"minDayVolumeUsd":{"type":"number","minimum":0,"maximum":10000000000000},"limit":{"type":"integer","minimum":1,"maximum":100},"chartLimit":{"type":"integer","minimum":1,"maximum":40},"interval":{"type":"string","enum":["1m","5m","15m","1h","4h","1d"]},"indicators":{"type":"array","items":{"type":"string","enum":["return","drawdown","ema","rsi","macd","bollinger"]},"maxItems":6},"includeCharts":{"type":"boolean"}},"additionalProperties":false},"example":{"sort":"pctChange","limit":20}}}},"responses":{"200":{"description":"Success; payment settled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402KeylessSuccess"}}}},"400":{"description":"Request rejected; no payment was settled"},"401":{"description":"Missing or invalid request signature; not charged"},"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}},"403":{"description":"Request rejected; no payment was settled"},"404":{"description":"Request rejected; no payment was settled"},"409":{"description":"Payment authorization already used, or ambiguous agent; not charged"},"413":{"description":"Request rejected; no payment was settled"},"422":{"description":"Policy, risk, or tool validation failure; not charged"},"429":{"description":"Request rejected; no payment was settled"}}}},"/api/x402/v1/markets/hyperliquid/rank":{"get":{"operationId":"x402MarketsHyperliquidRankDescriptor","summary":"Rank Hyperliquid perps by volume, change, or funding (402 descriptor)","tags":["Research and screening"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.00"},"protocols":[{"x402":{}}]},"responses":{"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}}}},"post":{"operationId":"x402MarketsHyperliquidRank","summary":"Rank Hyperliquid perps by volume, change, or funding","description":"0.00 USDC on Base per successful call. The verified paying wallet is the identity; no API key is issued. Validation, policy, or execution failures are not charged.","tags":["Research and screening"],"security":[{"x402":[]}],"parameters":[{"name":"x-fortfi-request-signature","in":"header","required":true,"schema":{"type":"string"},"description":"EIP-191 personal_sign by the payer wallet over: 'FortFi x402 request\\n{host}\\nPOST\\n{path}\\n{sha256 hex of raw body}\\n{payment nonce}'. A 401 response includes the exact message to sign. Binds the body to the payment so it cannot be swapped in flight."}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.00"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agent":{"type":"string","minLength":2,"maxLength":64},"scope":{"type":"string","enum":["core","all"]},"includeAllDesks":{"type":"boolean"},"dex":{"oneOf":[{"type":"string","maxLength":200},{"type":"array","items":{"type":"string","maxLength":40},"maxItems":20}]},"assetClass":{"oneOf":[{"type":"string","maxLength":200},{"type":"array","items":{"type":"string","enum":["crypto","equity","commodity","fx","index","pre_ipo","other"]},"maxItems":7}]},"sort":{"type":"string","enum":["volume","pctChange","funding"]},"direction":{"type":"string","enum":["asc","desc"]},"limit":{"type":"integer","minimum":1,"maximum":100}},"additionalProperties":false},"example":{"sort":"volume","limit":20}}}},"responses":{"200":{"description":"Success; payment settled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402KeylessSuccess"}}}},"400":{"description":"Request rejected; no payment was settled"},"401":{"description":"Missing or invalid request signature; not charged"},"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}},"403":{"description":"Request rejected; no payment was settled"},"404":{"description":"Request rejected; no payment was settled"},"409":{"description":"Payment authorization already used, or ambiguous agent; not charged"},"413":{"description":"Request rejected; no payment was settled"},"422":{"description":"Policy, risk, or tool validation failure; not charged"},"429":{"description":"Request rejected; no payment was settled"}}}},"/api/x402/v1/markets/tokens/screen":{"get":{"operationId":"x402MarketsTokensScreenDescriptor","summary":"Cross-chain token screen (verified assets by default) (402 descriptor)","tags":["Research and screening"],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.00"},"protocols":[{"x402":{}}]},"responses":{"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}}}},"post":{"operationId":"x402MarketsTokensScreen","summary":"Cross-chain token screen (verified assets by default)","description":"0.00 USDC on Base per successful call. The verified paying wallet is the identity; no API key is issued. Validation, policy, or execution failures are not charged.","tags":["Research and screening"],"security":[{"x402":[]}],"parameters":[{"name":"x-fortfi-request-signature","in":"header","required":true,"schema":{"type":"string"},"description":"EIP-191 personal_sign by the payer wallet over: 'FortFi x402 request\\n{host}\\nPOST\\n{path}\\n{sha256 hex of raw body}\\n{payment nonce}'. A 401 response includes the exact message to sign. Binds the body to the payment so it cannot be swapped in flight."}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.00"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agent":{"type":"string","minLength":2,"maxLength":64},"chains":{"type":"array","items":{"type":"string","minLength":1,"maxLength":40},"minItems":1,"maxItems":20},"mode":{"type":"string","enum":["quick","standard","deep"]},"deepOptIn":{"type":"boolean"},"verifiedOnly":{"type":"boolean"},"includeUnverified":{"type":"boolean"},"minMarketCapUsd":{"type":"number","minimum":0,"maximum":10000000000000},"minVolume1dUsd":{"type":"number","minimum":0,"maximum":10000000000000},"candidateLimit":{"type":"integer","minimum":1,"maximum":100},"sorts":{"type":"array","items":{"type":"string","enum":["gainers_1d","gainers_30d","gainers_90d","gainers_365d","volume_1d","market_cap"]},"maxItems":6}},"required":["chains"],"additionalProperties":false},"example":{"chains":["base-mainnet"]}}}},"responses":{"200":{"description":"Success; payment settled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402KeylessSuccess"}}}},"400":{"description":"Request rejected; no payment was settled"},"401":{"description":"Missing or invalid request signature; not charged"},"402":{"description":"Payment Required: x402 v2 PaymentRequired JSON body (also in the PAYMENT-REQUIRED header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PaymentRequiredV2"}}}},"403":{"description":"Request rejected; no payment was settled"},"404":{"description":"Request rejected; no payment was settled"},"409":{"description":"Payment authorization already used, or ambiguous agent; not charged"},"413":{"description":"Request rejected; no payment was settled"},"422":{"description":"Policy, risk, or tool validation failure; not charged"},"429":{"description":"Request rejected; no payment was settled"}}}}},"tags":[{"name":"Accounts and payments","description":"Agent account, vaults, balances, swaps, sends"},{"name":"Perps, yield, bridge","description":"Hyperliquid perps, Morpho yield, cross-chain bridges"},{"name":"Research and screening","description":"Backtests and market screens"}],"x-discovery":{"ownershipProofs":["0xC06cFfF1843087b3B1aC9fFA30e4f85Fd9b1b092"]}}