openapi: 3.2.0 info: title: Liquidagent Ai Liquid Agent API version: 1.0.0 contact: name: Liquid Agent url: https://api.liquidagent.ai email: liquidagentai@gmail.com x-guidance: 'Liquid Agent is the money layer for humans and their agents: one USDC balance for yield, payments, and tokenized stocks, for people through the app and for agents over x402. This API is the agent-facing tokenized-stock index. It lets an agent mint its OWN vault holding a band-rebalanced basket of Coinbase''s tokenized NVDA/META/AAPL/GOOGL on Base (eip155:8453). Reads are FREE; every POST returns an UNSIGNED {to,data,value,chainId} that YOU sign and broadcast with your own gas (the server never signs). Amounts are USDC-6 (2000000 = $2). weightsBps are basis points summing to 10000. FLOW: 1) GET /v1/basket — discover constituents + live prices + fees. 2) GET /v1/quote?usdc= — preview shares + mint fee. 3) POST /v1/create-vault — unsigned createVault(); sign+broadcast (you become the sole strategist, the protocol Safe owns it for fees). 4) GET /v1/balance/ — your new vault address. 5) POST /v1/set-weights {vault,weightsBps:[4]} — optional custom allocation. 6) POST /v1/buy {vault,usdc,permit:true,owner} — EIP-712 permit to sign off-chain, then re-POST with permit:{deadline,signature} for ONE unsigned depositWithPermit tx (no approve; omit permit for legacy approve+deposit). 7) POST /v1/rebalance {vault} — move to your target. 8) GET /v1/vault/ — NAV + weights (self-priced TWAP, no oracle). 9) POST /v1/redeem {vault,shares,inKind?} — exit to USDC or raw tokens (un-trappable, any block). REUSE: create-vault is a ONE-TIME step. To add funds later do NOT create again — GET /v1/balance/, take vaults[0].vault, and POST /v1/buy into that same vault (each buy mints more shares). create-vault always makes a brand-new separate vault. Contracts: factory 0x1B205660780CbC57849019Df2BA64B719b00AEA8, USDC 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913. Broadcast over any Base RPC (e.g. an x402 RPC); deposits swap precompile tokens so pass an explicit gas limit ~3,000,000.' description: 'Operations tagged Liquid Agent across 2 of this provider''s published API definitions: liquidagent-ai-openapi-original.json, liquidagent-ai-x402.json. Each path carries the servers of the definition it was published in.' servers: - url: https://api.liquidagent.ai tags: - name: Liquid Agent paths: /v1/guide: get: operationId: get_v1_guide summary: START HERE. tags: - Liquid Agent description: 'START HERE. Plain-English guide: how to open your account, buy the tokenized-stock index from $1, check it, rebalance, and cash out. One call explains every other endpoint. Returns: {service,what,howItWorks,steps:[{step,do,call,why}],amounts,signing,network,fees,fullSpec}. Free (optional SIWX wallet identity, no payment). New here? Read GET /v1/guide first.' security: - siwx: [] responses: '200': description: '{service,what,howItWorks,steps:[{step,do,call,why}],amounts,signing,network,fees,fullSpec}' content: application/json: schema: type: object '400': description: validation error content: application/json: schema: type: object properties: error: type: string servers: - url: https://api.liquidagent.ai /v1/basket: get: operationId: get_v1_basket summary: 'Discover the tokenized stock index: invest in NVIDIA, Apple, Meta and Alphabet…' tags: - Liquid Agent description: 'Discover the tokenized stock index: invest in NVIDIA, Apple, Meta and Alphabet, with live prices and fees. Returns: {protocol,chainId,factory,usdc,feeSink,constituents:[{symbol,address,decimals,priceUsd}],fees,minDepositUsdc,flow}. Free (optional SIWX wallet identity, no payment). New here? Read GET /v1/guide first.' security: - siwx: [] responses: '200': description: '{protocol,chainId,factory,usdc,feeSink,constituents:[{symbol,address,decimals,priceUsd}],fees,minDepositUsdc,flow}' content: application/json: schema: type: object '400': description: validation error content: application/json: schema: type: object properties: error: type: string servers: - url: https://api.liquidagent.ai /v1/vault/{address}: get: operationId: get_v1_vault_address summary: 'Check a vault: its value (NAV), holdings, current vs target weights, and…' tags: - Liquid Agent description: 'Check a vault: its value (NAV), holdings, current vs target weights, and whether it needs rebalancing. Input: path: vault address. Returns: {vault,strategist,owner,navUsdc,nav,weightsBps[4],rebalanceNeeded,rebalanceBandBps,maxTvlUsdc,mintFeeBps}. Free (optional SIWX wallet identity, no payment). New here? Read GET /v1/guide first.' security: - siwx: [] parameters: - name: address in: path required: true schema: type: string pattern: ^0x[a-fA-F0-9]{40}$ responses: '200': description: '{vault,strategist,owner,navUsdc,nav,weightsBps[4],rebalanceNeeded,rebalanceBandBps,maxTvlUsdc,mintFeeBps}' content: application/json: schema: type: object '400': description: validation error content: application/json: schema: type: object properties: error: type: string servers: - url: https://api.liquidagent.ai /v1/balance/{agent}: get: operationId: get_v1_balance_agent summary: 'List what an address owns: every vault it holds, its shares, and current USD…' tags: - Liquid Agent description: 'List what an address owns: every vault it holds, its shares, and current USD value. Input: path: agent address. Returns: {agent,vaultCount,vaults:[{vault,shares,valueUsdc,value}]}. Free (optional SIWX wallet identity, no payment). New here? Read GET /v1/guide first.' security: - siwx: [] parameters: - name: agent in: path required: true schema: type: string pattern: ^0x[a-fA-F0-9]{40}$ responses: '200': description: '{agent,vaultCount,vaults:[{vault,shares,valueUsdc,value}]}' content: application/json: schema: type: object '400': description: validation error content: application/json: schema: type: object properties: error: type: string servers: - url: https://api.liquidagent.ai /v1/quote: get: operationId: get_v1_quote summary: 'Preview a purchase before you buy: shares you would receive and the fee, for a…' tags: - Liquid Agent description: 'Preview a purchase before you buy: shares you would receive and the fee, for a given USDC amount. Input: query: usdc=. Returns: {usdcIn,mintFeeUsdc,netUsdc}. Free (optional SIWX wallet identity, no payment). New here? Read GET /v1/guide first.' security: - siwx: [] parameters: - name: usdc in: query required: true schema: type: string description: amount in USDC-6 (2000000 = $2) responses: '200': description: '{usdcIn,mintFeeUsdc,netUsdc}' content: application/json: schema: type: object '400': description: validation error content: application/json: schema: type: object properties: error: type: string servers: - url: https://api.liquidagent.ai /v1/create-vault: post: operationId: post_v1_create-vault summary: Open your own vault (you control it, no one else). tags: - Liquid Agent description: 'Open your own vault (you control it, no one else). Returns a transaction for you to sign. Input: {} (empty body). Returns: unsigned {to,data,value,chainId} for createVault(). Free (optional SIWX wallet identity, no payment). New here? Read GET /v1/guide first.' security: - siwx: [] requestBody: required: false content: application/json: schema: type: object responses: '200': description: unsigned {to,data,value,chainId} for createVault() content: application/json: schema: type: object '400': description: validation error content: application/json: schema: type: object properties: error: type: string servers: - url: https://api.liquidagent.ai /v1/set-weights: post: operationId: post_v1_set-weights summary: Set your custom stock allocation (default is equal weight). tags: - Liquid Agent description: 'Set your custom stock allocation (default is equal weight). Returns a transaction for you to sign. Input: {vault:address, weightsBps:[4 ints, sum 10000]}. Returns: unsigned {to,data,value,chainId} for setTargetWeights(uint16[]). Free (optional SIWX wallet identity, no payment). New here? Read GET /v1/guide first.' security: - siwx: [] requestBody: required: true content: application/json: schema: type: object responses: '200': description: unsigned {to,data,value,chainId} for setTargetWeights(uint16[]) content: application/json: schema: type: object '400': description: validation error content: application/json: schema: type: object properties: error: type: string servers: - url: https://api.liquidagent.ai /v1/buy: post: operationId: post_v1_buy summary: 'Buy tokenized stocks: invest USDC into your vault from $1.' tags: - Liquid Agent description: 'Buy tokenized stocks: invest USDC into your vault from $1. One tx via EIP-2612 permit (no approve), or legacy approve + deposit. Own NVIDIA, Apple, Meta and Alphabet on-chain. Input: {vault:address, usdc:string(USDC-6), minShares?:string, permit?:true|{deadline,signature}, owner?:address}. Returns: permit:true -> {typedData} to sign; permit:{deadline,signature} -> ONE unsigned depositWithPermit tx; no permit -> {steps:[approve,deposit]}. Free (optional SIWX wallet identity, no payment). New here? Read GET /v1/guide first.' security: - siwx: [] requestBody: required: true content: application/json: schema: type: object responses: '200': description: permit:true -> {typedData} to sign; permit:{deadline,signature} -> ONE unsigned depositWithPermit tx; no permit -> {steps:[approve,deposit]} content: application/json: schema: type: object '400': description: validation error content: application/json: schema: type: object properties: error: type: string servers: - url: https://api.liquidagent.ai /v1/redeem: post: operationId: post_v1_redeem summary: 'SELL / cash out: redeem your basket shares to USDC, or take the raw stock…' tags: - Liquid Agent description: 'SELL / cash out: redeem your basket shares to USDC, or take the raw stock tokens in-kind (un-trappable, any block). Anyone holding these shares can sell this way — no vault needed. Returns a transaction for you to sign. Input: {vault:address, shares:string, minUsdcOut?:string, inKind?:bool}. Returns: unsigned {to,data,value,chainId} for redeem() (USDC) or redeemInKind() (raw tokens). Free (optional SIWX wallet identity, no payment). New here? Read GET /v1/guide first.' security: - siwx: [] requestBody: required: true content: application/json: schema: type: object responses: '200': description: unsigned {to,data,value,chainId} for redeem() (USDC) or redeemInKind() (raw tokens) content: application/json: schema: type: object '400': description: validation error content: application/json: schema: type: object properties: error: type: string servers: - url: https://api.liquidagent.ai /v1/rebalance: post: operationId: post_v1_rebalance summary: Rebalance your vault back to its target weights. tags: - Liquid Agent description: 'Rebalance your vault back to its target weights. Returns a transaction for you to sign. Input: {vault:address}. Returns: unsigned {to,data,value,chainId} for rebalance(). Free (optional SIWX wallet identity, no payment). New here? Read GET /v1/guide first.' security: - siwx: [] requestBody: required: true content: application/json: schema: type: object responses: '200': description: unsigned {to,data,value,chainId} for rebalance() content: application/json: schema: type: object '400': description: validation error content: application/json: schema: type: object properties: error: type: string servers: - url: https://api.liquidagent.ai /v1/send: post: operationId: post_v1_send summary: 'Send your basket to anyone: transfer your tokenized-stock shares (LQMAG4) to…' tags: - Liquid Agent description: 'Send your basket to anyone: transfer your tokenized-stock shares (LQMAG4) to any wallet — gift or hand off to another agent, no vault needed on their end. The recipient can then hold it, SELL it (redeem to USDC or in-kind), or forward it. Returns a transaction for you to sign. Input: {vault:address, to:address, shares:string}. Returns: unsigned {to,data,value,chainId} for transfer(to,shares). Free (optional SIWX wallet identity, no payment). New here? Read GET /v1/guide first.' security: - siwx: [] requestBody: required: true content: application/json: schema: type: object responses: '200': description: unsigned {to,data,value,chainId} for transfer(to,shares) content: application/json: schema: type: object '400': description: validation error content: application/json: schema: type: object properties: error: type: string servers: - url: https://api.liquidagent.ai /v1/signals: get: operationId: getV1Signals summary: 'Basket signals: the whole basket''s rebalancing signal in one call — returns…' tags: - Liquid Agent description: 'PAID: $0.04 USDC per call via x402 (exact scheme, EIP-3009, USDC on Base eip155:8453 or Polygon eip155:137). Quantitative signals for the tokenized NVDA/META/AAPL/GOOGL basket so an agent can decide weights in one call instead of visiting four sites, then execute via the free /v1/set-weights + /v1/rebalance. Aggregated data, not investment advice.' security: - x402: [] parameters: - name: vault in: query required: false schema: type: string pattern: ^0x[a-fA-F0-9]{40}$ description: Optional. Your vault address. If provided, the response adds that vault's current weights and their drift vs the suggested (inverse-vol) weights, so you know exactly what to change. x-payment: price: '0.04' currency: USDC network: eip155:8453 asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' payTo: '0x487b28A4FbbA8Cf46eb6E1d72e6959202Bb75e90' scheme: exact x-payment-info: protocols: - x402: scheme: exact network: eip155:8453 asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' payTo: '0x487b28A4FbbA8Cf46eb6E1d72e6959202Bb75e90' price: mode: fixed currency: USD amount: '0.04' responses: '200': description: basket signals content: application/json: schema: type: object '402': description: x402 payment required (returns the payment challenge) content: application/json: schema: type: object servers: - url: https://api.liquidagent.ai /v1/publish: post: operationId: postV1Publish summary: Publish a live, shareable portfolio page for a vault (24h keep-alive) tags: - Liquid Agent description: 'PAID: $0.25 USDC flat per publish via x402 (exact scheme, EIP-3009, USDC on Base eip155:8453 or Polygon eip155:137). Mints or extends a shareable page at /v/ showing the vault''s holdings, allocation, live prices and signals for 24 hours; re-publish to keep it alive. Returns {viewUrl, slug, expiresAt}; your user opens the viewUrl with no wallet.' security: - x402: [] x-payment: price: '0.25' currency: USDC network: eip155:8453 asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' payTo: '0x487b28A4FbbA8Cf46eb6E1d72e6959202Bb75e90' scheme: exact x-payment-info: protocols: - x402: scheme: exact network: eip155:8453 asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' payTo: '0x487b28A4FbbA8Cf46eb6E1d72e6959202Bb75e90' price: mode: fixed currency: USD amount: '0.25' requestBody: required: true content: application/json: schema: type: object required: - vault properties: vault: type: string pattern: ^0x[a-fA-F0-9]{40}$ description: The vault to publish a page for. label: type: string description: Optional page title, e.g. the user's name. brand: type: object description: Optional agent branding {name,color,iconUrl}. responses: '200': description: '{viewUrl, slug, expiresAt}' content: application/json: schema: type: object '402': description: x402 payment required (returns the payment challenge) content: application/json: schema: type: object servers: - url: https://api.liquidagent.ai /v1/gas/solana: get: operationId: getV1GasSolana summary: 'Solana gas sponsor info: fee payer address, fee asset, and how to call it' tags: - Liquid Agent security: [] description: Free. Returns the sponsor's fee-payer address (build your transaction with it as feePayer), the fee network/asset (USDC on Solana mainnet), limits and the flow. responses: '200': description: lane info content: application/json: schema: type: object post: operationId: postV1GasSolana summary: 'GAS SPONSOR (Solana): POST your transaction with our sponsor as fee payer; pay…' tags: - Liquid Agent description: 'PAID, dynamic (from $0.03 USDC, max $2.00; the 402 is the quote, issued only after a successful simulation). Body {transaction:, send?:true}. Without payment: 402 with the exact price = (network fee + priority fee + rent for token accounts it opens) x 1.3. Payment: one USDC TransferChecked of exactly `amount` from your token account to the sponsor''s USDC account, sponsor as fee payer, signed by you, wrapped as {x402Version:2, scheme:''exact'', network, accepted, payload:{transaction}} and base64d into PAYMENT-SIGNATURE (X-PAYMENT also works). The same POST then returns {transaction (co-signed), feePayer, priceUsd, lamports, feePaymentSig, settledBy, signature? when send:true, next}. Limits: sponsor only as fee payer and payer of <= 8 ATA creates; compute limit <= 1.4M units, price <= 50,000 micro-lamports/unit; 500 sponsorships per payer per day; 503 and no charge when the sponsor is low on SOL.' security: - x402: [] x-payment: price: 0.03+ currency: USDC network: solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp asset: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v payTo: BBcAL97dyJPGmsjQ7pPxCdUsFk1wgZ6jqYQ4DFvCVHkn scheme: exact mode: dynamic requestBody: required: true content: application/json: schema: type: object required: - transaction properties: transaction: type: string description: base64 Solana transaction (v0 or legacy), signed by you, with feePayer = the sponsor send: type: boolean description: true = we broadcast the co-signed transaction and return its signature responses: '200': description: co-signed transaction content: application/json: schema: type: object '402': description: x402 Payment Required (the quote, in Solana USDC) servers: - url: https://api.liquidagent.ai /v1/gas: get: operationId: getV1Gas summary: 'Gas sponsor info: paymaster addresses, price rule, and how to call it' tags: - Liquid Agent security: [] description: Bare GET returns the 402 quote (how x402 indexers recognise a paid resource); GET /v1/gas?docs=1 returns the docs. Describes the ERC-4337 paymaster paid over x402 (EntryPoint v0.8 on Base). responses: '200': description: info content: application/json: schema: type: object post: operationId: postV1Gas summary: 'GAS SPONSOR: pay per operation in USDC over x402 and we cover the gas on Base…' tags: - Liquid Agent description: 'PAID, dynamic (from $0.03 USDC per operation; the 402 is the quote, valid 120 s). ONE endpoint, the body picks the lane. (A) Smart-wallet SDKs: standard ERC-7677 JSON-RPC {jsonrpc:"2.0", method: pm_getPaymasterStubData | pm_getPaymasterData, params:[userOperation, entryPoint, chainId, context]} — HTTP is always 200 and an unpaid pm_getPaymasterData returns a JSON-RPC error {code:402, data:}; put the x402 payment object in params[3].context.x402 and retry. (B) Plain wallets, no ETH: POST {sender, calls:[{to,data,value?}]} -> 402 with the exact price; pay it (X-PAYMENT) and the same call returns {userOperation (sponsored), typedData, authorization? (EIP-7702, only if the EOA is not delegated yet), validUntil}. Sign typedData with the sender''s key, sign the authorization if given, then POST {userOperation, authorization?} back to this URL: we submit it and our deposit pays the gas. No further charge; only operations we sponsored are accepted, once each. EntryPoint v0.8. Price = max($0.03, 1.3× the op''s gas cap) and the signed sponsorship locks the gas limits and max fee, so the sponsor can never charge more than quoted. (C) Bring your own operation, for any EntryPoint v0.8 smart account (a wallet already delegated to another EIP-7702 implementation, or a deployed Kernel / Safe / Nexus account): POST {userOperation} unsigned (your sender, calldata and gas limits; no paymaster fields) -> 402 with the exact price; pay it and repeat -> {userOperation with paymaster fields, typedData, validUntil}; sign it the way your account expects (viem: account.signUserOperation) and POST {userOperation} back: we dry-run it through the EntryPoint (a failing dry run returns 400 with the reason and costs nothing) and then submit it from our wallet. No bundler, no stake. Lane B note: if the EOA is already delegated to another implementation the first call returns 409; add "redelegate": true to the same body and the returned authorization (signed by you, applied in the same transaction, reversible) re-points the wallet to Simple7702Account.' security: - x402: [] x-payment: price: 0.03+ currency: USDC network: eip155:8453 asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' payTo: '0x487b28A4FbbA8Cf46eb6E1d72e6959202Bb75e90' scheme: exact mode: dynamic x-payment-info: protocols: - x402: scheme: exact network: eip155:8453 asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' payTo: '0x487b28A4FbbA8Cf46eb6E1d72e6959202Bb75e90' price: mode: dynamic currency: USD min: '0.03' description: max($0.03, 1.3 × the operation's gas cap); exact amount is in the 402 requestBody: required: true content: application/json: schema: oneOf: - title: ERC-7677 (smart-wallet SDKs) type: object required: - jsonrpc - method - params properties: jsonrpc: const: '2.0' id: {} method: type: string enum: - pm_getPaymasterStubData - pm_getPaymasterData - pm_supportedEntryPoints params: type: array description: '[userOperation (unpacked v0.7+ shape), entryPoint, chainId (0x2105), context ({} or {x402: })]' - title: Direct lane, step 1 (plain wallet) type: object required: - sender - calls properties: sender: type: string description: your EOA (0x…40 hex) calls: type: array items: type: object required: - to properties: to: type: string data: type: string value: type: string description: any calls, e.g. an unsigned tx from this API redelegate: type: boolean description: 'only if your EOA is already EIP-7702-delegated to another implementation: true = return an authorization (you sign it) that re-points the wallet to Simple7702Account in the same transaction; reversible' - title: Bring your own operation, step 1 (any EntryPoint v0.8 smart account) type: object required: - userOperation properties: userOperation: type: object description: 'your UNSIGNED EntryPoint v0.8 user operation: sender, nonce, callData, callGasLimit, verificationGasLimit, preVerificationGas, maxFeePerGas, maxPriorityFeePerGas (hex strings), signature ''0x'', factory/factoryData if not deployed; no paymaster fields. The 402 is the quote; pay and repeat to receive the paymaster fields and typedData.' - title: Submit (both lanes) type: object required: - userOperation properties: userOperation: type: object description: 'the sponsored operation from step 1 with your signature in userOperation.signature (direct lane: eth_signTypedData_v4 of typedData; bring your own: however your account signs). We dry-run it through the EntryPoint, then submit it; our deposit pays the gas.' authorization: type: object description: the signed EIP-7702 authorization from step 1, if one was returned (direct lane only) responses: '200': description: 'JSON-RPC result (paymaster fields) or JSON-RPC error {code:402, data: x402 PaymentRequired}' content: application/json: schema: type: object '402': description: x402 payment required (direct lane, or a bare probe) content: application/json: schema: type: object servers: - url: https://api.liquidagent.ai components: securitySchemes: siwx: type: apiKey in: header name: SIGN-IN-WITH-X description: Sign-In with X wallet identity (EIP-4361). Optional; no payment. x402: type: http scheme: x402 description: Pay-per-call via x402 (exact scheme, EIP-3009 USDC on Base eip155:8453 or Polygon eip155:137). Sign a USDC authorization; no account, no key held by the server. externalDocs: description: Open-source code examples (JavaScript/viem, Python/web3, curl) + README for the full create/buy/rebalance/exit flow. url: https://github.com/LiquidAgent/liquidagentx402 x-refined-from: - liquidagent-ai-openapi-original.json - liquidagent-ai-x402.json