Every API here is available over the APIs.io API and to AI agents over MCP.
# Verbatim conversion of https://api.liquidagent.ai/openapi.json (fetched 2026-09-19) from JSON to YAML.
# Original bytes: openapi/_original/liquidagent-ai-openapi-original.json. No content was changed.
openapi: 3.1.0
info:
title: Liquid Agent — Buy & Invest in Tokenized Stocks On-Chain
version: 1.0.0
description: 'Part of Liquid Agent, 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 lets you buy and invest in tokenized US stocks and ETFs on-chain from $1: NVIDIA, Apple, Meta and Alphabet. Mint your own vault holding a band-rebalanced stock basket, equal-weight or your custom portfolio, and rebalance or cash out any block. Self-priced NAV (no oracle), in-kind exit, no brokerage account, no project token. Reads are free; transactions return unsigned calldata the agent signs and broadcasts with its own gas.'
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=<amount6> — 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-address> — 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/<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/<you>, 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.'
servers:
- url: https://api.liquidagent.ai
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
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.
paths:
/v1/guide:
get:
operationId: get_v1_guide
summary: '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.'
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
/v1/basket:
get:
operationId: get_v1_basket
summary: 'Discover the tokenized stock index: invest in NVIDIA, Apple, Meta and Alphabet, with live prices and fees.'
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
/v1/vault/{address}:
get:
operationId: get_v1_vault_address
summary: 'Check a vault: its value (NAV), holdings, current vs target weights, and whether it needs rebalancing.'
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
/v1/balance/{agent}:
get:
operationId: get_v1_balance_agent
summary: 'List what an address owns: every vault it holds, its shares, and current USD value.'
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
/v1/quote:
get:
operationId: get_v1_quote
summary: 'Preview a purchase before you buy: shares you would receive and the fee, for a given USDC amount.'
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=<amount USDC-6>. 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
/v1/create-vault:
post:
operationId: post_v1_create-vault
summary: Open your own vault (you control it, no one else). Returns a transaction for you to sign.
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
/v1/set-weights:
post:
operationId: post_v1_set-weights
summary: Set your custom stock allocation (default is equal weight). Returns a transaction for you to sign.
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
/v1/buy:
post:
operationId: post_v1_buy
summary: '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.'
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
/v1/redeem:
post:
operationId: post_v1_redeem
summary: '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.'
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
/v1/rebalance:
post:
operationId: post_v1_rebalance
summary: Rebalance your vault back to its target weights. Returns a transaction for you to sign.
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
/v1/send:
post:
operationId: post_v1_send
summary: '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.'
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
/v1/signals:
get:
operationId: getV1Signals
summary: 'Basket signals: the whole basket''s rebalancing signal in one call — returns, volatility, RSI, trend, relative strength, correlation, plus an inverse-volatility target-weight signal.'
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
/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/<slug> 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
/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 the exact fee in Solana USDC over x402; get it back co-signed.'
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:<base64 v0 or legacy, signed by you, feePayer = the sponsor address from GET>, 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)
/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 or Polygon (add chainId: 137 for Polygon). Pay the fee in USDC on Base or Polygon. One endpoint for plain wallets ({sender, calls}), any EntryPoint v0.8 smart account ({userOperation}, bring your own operation) and smart-wallet SDKs (ERC-7677 JSON-RPC). No ETH, no account, no API key.'
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:<x402 PaymentRequired>}; 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: <payment>})]'
- 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