OpenclawCash Agent API
Interact with OpenclawCash-managed wallets to send native assets and tokens, check balances, execute DEX swaps, and manage Polymarket account, orders, and redeem flows via Polygon wallets.
This skill may also be referred to as openclawcash.
Requirements
- Required env var:
AGENTWALLETAPI_KEY
- Optional env var:
AGENTWALLETAPI_URL (default: https://openclawcash.com)
- Required local binary:
curl
- Optional local binary:
jq (for pretty JSON output in CLI)
- Network access required:
https://openclawcash.com
Preferred Integration Path
Safety Model
- Start with read-only calls (
wallets, wallet, balance, tokens) on testnets first.
- High-risk actions are gated:
- API key permissions in dashboard (
allowWalletCreation, allowWalletImport)
- Explicit CLI confirmation (
--yes) for write actions
- Agents should establish an approval mode early in the session for write actions:
confirm_each_write: ask before every write action.
operate_on_my_behalf: after one explicit onboarding approval, execute future write actions without re-asking, as long as the user keeps instructing the agent in the same session.
- For
operate_on_my_behalf, the agent should treat the user's later task messages as execution instructions and run the corresponding write commands with --yes.
- Ask again only if:
- the user revokes or changes approval mode
- the session is restarted or memory is lost
- the action is outside the scope the user approved
- the agent is unsure which wallet, token, amount, destination, spender, or chain is intended
- If the user gives only a broad instruction like "go ahead" but execution details are still missing, gather the missing details first instead of repeating a generic permission request.
Setup
- Run the setup script to create your
.env file:bash scripts/setup.sh
- Edit the
.env file in this skill folder and replace the placeholder with your real API key:AGENTWALLETAPI_KEY=occ_your_api_key
- Get your API key at https://openclawcash.com (sign up, create a wallet, go to API Keys page).
Legacy CLI Fallback
If MCP is unavailable, use the included tool script to make API calls directly:
# Read-only (recommended first)
bash scripts/agentwalletapi.sh wallets
bash scripts/agentwalletapi.sh user-tag-get
bash scripts/agentwalletapi.sh user-tag-set my-agent-tag --yes
bash scripts/agentwalletapi.sh wallet Q7X2K9P
bash scripts/agentwalletapi.sh wallet "Trading Bot"
bash scripts/agentwalletapi.sh balance Q7X2K9P
bash scripts/agentwalletapi.sh transactions Q7X2K9P
bash scripts/agentwalletapi.sh tokens mainnet
# Write actions (require explicit --yes)
export WALLET_EXPORT_PASSPHRASE_OPS='your-strong-passphrase'
bash scripts/agentwalletapi.sh create "Ops Wallet" sepolia WALLET_EXPORT_PASSPHRASE_OPS --yes
bash scripts/agentwalletapi.sh import "Treasury Imported" mainnet --yes
bash scripts/agentwalletapi.sh import "Poly Ops" polygon-mainnet --yes
# Automation-safe import: read private key from stdin instead of command args
printf '%s' '<private_key>' | bash scripts/agentwalletapi.sh import "Treasury Imported" mainnet - --yes
bash scripts/agentwalletapi.sh transfer Q7X2K9P 0xRecipient 0.01 --yes
bash scripts/agentwalletapi.sh transfer Q7X2K9P 0xRecipient 100 USDC --yes
bash scripts/agentwalletapi.sh quote mainnet WETH USDC 10000000000000000
bash scripts/agentwalletapi.sh quote solana-mainnet SOL USDC 10000000 solana
bash scripts/agentwalletapi.sh swap Q7X2K9P WETH USDC 10000000000000000 0.5 --yes
# Checkout escrow lifecycle
bash scripts/agentwalletapi.sh checkout-payreq-create Q7X2K9P 30000000 --yes
bash scripts/agentwalletapi.sh checkout-payreq-get pr_a1b2c3
bash scripts/agentwalletapi.sh checkout-escrow-get es_d4e5f6
bash scripts/agentwalletapi.sh checkout-quick-pay es_d4e5f6 Q7X2K9P --yes
bash scripts/agentwalletapi.sh checkout-swap-and-pay-quote es_d4e5f6 Q7X2K9P
bash scripts/agentwalletapi.sh checkout-swap-and-pay-confirm es_d4e5f6 Q7X2K9P 1 --yes
bash scripts/agentwalletapi.sh checkout-release es_d4e5f6 --yes
bash scripts/agentwalletapi.sh checkout-refund es_d4e5f6 --yes
bash scripts/agentwalletapi.sh checkout-cancel es_d4e5f6 --yes
bash scripts/agentwalletapi.sh checkout-webhooks-list
# Polymarket setup is user-managed in dashboard Venues settings
# Direct setup page: https://openclawcash.com/venues/polymarket
bash scripts/agentwalletapi.sh polymarket-market Q7X2K9P 123456 BUY 25 FAK 0.65 --yes
bash scripts/agentwalletapi.sh polymarket-resolve https://polymarket.com/market/market-slug No
bash scripts/agentwalletapi.sh polymarket-account Q7X2K9P
bash scripts/agentwalletapi.sh polymarket-orders Q7X2K9P OPEN 50
bash scripts/agentwalletapi.sh polymarket-activity Q7X2K9P 50
bash scripts/agentwalletapi.sh polymarket-positions Q7X2K9P 100
bash scripts/agentwalletapi.sh polymarket-redeem Q7X2K9P all 100 --yes
bash scripts/agentwalletapi.sh polymarket-redeem Q7X2K9P 1234567890 100 --yes
bash scripts/agentwalletapi.sh polymarket-cancel Q7X2K9P order_id_here --yes
Base-Units Rule (Important)
quote.amountIn, swap.amountIn, approve.amount, and transfer valueBaseUnits must be base-units integer strings (digits only).
- Do not send decimal strings in these fields (for example,
0.001), or validation will fail immediately.
- Examples:
0.001 ETH -> 1000000000000000 wei
1 USDC (6 decimals) -> 1000000
- For transfer, use
amountDisplay when you want human-readable units and let the API convert.
- Legacy transfer aliases
amount and value are still accepted for compatibility.
Import Input Safety
- Wallet import is optional and not required for normal wallet operations (list, balance, transfer, swap).
- Import works only when the user explicitly enables API key permission
allowWalletImport in dashboard settings.
- Import execution requires explicit confirmation in the CLI (
--yes for automation, or interactive YES prompt).
- Avoid passing sensitive inputs as CLI arguments when possible (shell history/process logs risk).
- Preferred options:
- Interactive hidden prompt: omit the private key argument.
- Automation: pass
- and pipe input via stdin.
Base URL
https://openclawcash.com
Troubleshooting
If requests fail because of host/URL issues, use this recovery flow:
- Open
agentwalletapi/.env and verify AGENTWALLETAPI_KEY is set and has no extra spaces.
- If the API host is wrong or unreachable, set this in the same
.env file:AGENTWALLETAPI_URL=https://openclawcash.com
- Retry a simple read call first:
bash scripts/agentwalletapi.sh wallets
- If it still fails, report the exact error and stop before attempting transfer/swap actions.
Authentication
The API key is loaded from the .env file in this skill folder. For direct HTTP calls, include it as a header:
X-Agent-Key: occ_your_api_key
Content-Type: application/json
API Surfaces
- Agent API (API key auth):
/api/agent/*
- Authenticate with
X-Agent-Key
- Used for autonomous agent execution (wallets list/create/import, transactions, balance, transfer, swap, quote, approve, checkout escrow lifecycle, and polymarket venue operations)
- Public docs intentionally include only
/api/agent/* endpoints.
Workflow
GET /api/agent/wallets - Discover available wallets (id, label, address, network, chain). Optional ?includeBalances=true adds native balance + nativeSymbol
GET /api/agent/wallet?walletId=... or ?walletLabel=... or ?walletAddress=... - Fetch one wallet with native/token balances
- Optional wallet lifecycle actions:
POST /api/agent/wallets/create - Create a new wallet under API-key policy controls
POST /api/agent/wallets/import - Import a mainnet, polygon-mainnet, or solana-mainnet wallet under API-key policy controls
GET /api/agent/transactions?walletId=... (or walletLabel/walletAddress) - Read merged wallet transaction history (on-chain + app-recorded)
GET /api/agent/supported-tokens?network=... or ?chain=evm|solana - Get recommended common, well-known token list + guidance (requires X-Agent-Key)
POST /api/agent/token-balance - Check wallet balances (native + token balances; specific token by symbol/address supported)
POST /api/agent/quote - Get a swap quote before execution on Uniswap (EVM) or Jupiter (Solana mainnet). amountIn is base-units integer string.
POST /api/agent/swap - Execute token swap on Uniswap (EVM) or Jupiter (Solana mainnet). amountIn is base-units integer string.
POST /api/agent/transfer - Send native coin or token on the wallet's chain (optional chain guard). Do not use this for checkout escrow funding.
GET /api/agent/user-tag and PUT /api/agent/user-tag - Read/set the global checkout user tag (set is one-time / immutable once configured)
- Optional checkout flow (escrow by global user tag):
- MCP default:
checkout_fund (tries quick-pay, falls back to swap-and-pay when needed)
POST /api/agent/checkout/payreq - Create pay request + escrow
GET /api/agent/checkout/payreq/:id - Read pay request
POST /api/agent/checkout/escrows/:id/funding-confirm - Confirm funding by tx hash
POST /api/agent/checkout/escrows/:id/quick-pay - Direct buyer funding
POST /api/agent/checkout/escrows/:id/swap-and-pay - Quote/execute swap funding
GET /api/agent/checkout/escrows/:id - Read escrow state
POST /api/agent/checkout/escrows/:id/accept - Accept as buyer
POST /api/agent/checkout/escrows/:id/proof - Submit proof
POST /api/agent/checkout/escrows/:id/dispute - Open dispute
POST /api/agent/checkout/escrows/:id/release - Release funds
POST /api/agent/checkout/escrows/:id/refund - Refund funds
POST /api/agent/checkout/escrows/:id/cancel - Cancel escrow
GET|POST /api/agent/checkout/webhooks and PATCH|DELETE /api/agent/checkout/webhooks/:id - Manage webhooks
Checkout timing fields for POST /api/agent/checkout/payreq:
expiresInSeconds: funding deadline before request expires.
autoReleaseSeconds: when funded escrow can auto-release if no dispute exists.
disputeWindowSeconds: how long dispute can be opened after auto-release point.
- Constraints: all three must be at least
3600 seconds, and disputeWindowSeconds <= autoReleaseSeconds.
- Optional Polymarket venue flow (polygon-mainnet wallets only):
- Prerequisite: user configures Polymarket in dashboard Venues settings for that wallet
GET /api/agent/venues/polymarket/market/resolve resolves marketUrl/slug + human-readable outcome to the exact tokenId needed for order tools
- MCP helper:
polymarket_market_resolve calls the same agent endpoint
POST /api/agent/venues/polymarket/orders/limit - Place BUY/SELL limit orders
POST /api/agent/venues/polymarket/orders/market - Place BUY/SELL market orders
GET /api/agent/venues/polymarket/account - Read account summary
GET /api/agent/venues/polymarket/orders - List open orders
POST /api/agent/venues/polymarket/orders/cancel - Cancel an order
POST /api/agent/venues/polymarket/redeem - Redeem one position by tokenId or redeem all redeemable positions
POST /api/agent/venues/polymarket/unlink - Clear stored Polymarket integration config for a wallet
GET /api/agent/venues/polymarket/activity - List trade activity
GET /api/agent/venues/polymarket/positions - List open positions (open-market filtered, includes PnL fields)
- Use returned
txHash / orderId values to confirm execution and lifecycle status
Approval Handling For Agents
Use this pattern for write actions:
- At the first write-intent in a session, ask one short onboarding question:
- "Do you want approval for every write action, or should I operate on your behalf for this session?"
- Store the chosen mode in conversation memory.
- If the mode is
confirm_each_write:
- ask for approval before each transfer, swap, approval, import, or wallet creation
- after approval, execute with the MCP write tool or the legacy CLI fallback with
--yes
- If the mode is
operate_on_my_behalf:
- do not ask again for each transfer
- when the user later says things like "send X to Y" or "swap A for B", execute with the MCP write tool or the legacy CLI fallback with
--yes once the needed details are clear
- In either mode:
- if execution details are missing, ask only for the missing details
- if the user changes modes or revokes permission, update memory and follow the new rule
Recommended onboarding wording:
- "Choose write approval mode for this session:
confirm_each_write or operate_on_my_behalf."
Example:
Quick Reference
| Endpoint |
Method |
Auth |
Purpose |
/api/agent/wallets |
GET |
Yes |
List wallets (discovery; optional includeBalances=true for native balances) |
/api/agent/wallet |
GET |
Yes |
Get one wallet detail with native/token balances |
/api/agent/wallets/create |
POST |
Yes |
Create a new API-key-managed wallet |
/api/agent/wallets/import |
POST |
Yes |
Import a mainnet/polygon-mainnet/solana-mainnet wallet via API key |
/api/agent/transactions |
GET |
Yes |
List per-wallet transaction history |
/api/agent/transfer |
POST |
Yes |
Send native/token transfers (EVM + Solana). Not the checkout escrow funding path. |
/api/agent/swap |
POST |
Yes |
Execute DEX swap (Uniswap on EVM, Jupiter on Solana mainnet) |
/api/agent/quote |
POST |
Yes |
Get swap quotes (Uniswap on EVM, Jupiter on Solana mainnet) |
/api/agent/token-balance |
POST |
Yes |
Check balances |
/api/agent/supported-tokens |
GET |
Yes |
List recommended common, well-known tokens per network |
/api/agent/user-tag |
GET |
Yes |
Read the global checkout user tag for the API key owner |
/api/agent/user-tag |
PUT |
Yes |
Set the global checkout user tag once (immutable after set) |
/api/agent/approve |
POST |
Yes |
Approve spender for ERC-20 token (EVM only) |
/api/agent/checkout/payreq |
POST |
Yes |
Create checkout pay request + escrow |
/api/agent/checkout/payreq/:id |
GET |
Yes |
Read checkout pay request |
/api/agent/checkout/escrows/:id/funding-confirm |
POST |
Yes |
Confirm escrow funding tx |
/api/agent/checkout/escrows/:id/quick-pay |
POST |
Yes |
Directly fund escrow from buyer wallet |
/api/agent/checkout/escrows/:id/swap-and-pay |
POST |
Yes |
Quote/execute swap + fund escrow |
/api/agent/checkout/escrows/:id |
GET |
Yes |
Read escrow lifecycle details |
/api/agent/checkout/escrows/:id/accept |
POST |
Yes |
Accept escrow as buyer |
/api/agent/checkout/escrows/:id/proof |
POST |
Yes |
Submit seller proof |
/api/agent/checkout/escrows/:id/dispute |
POST |
Yes |
Open escrow dispute |
/api/agent/checkout/escrows/:id/release |
POST |
Yes |
Release escrow funds |
/api/agent/checkout/escrows/:id/refund |
POST |
Yes |
Refund escrow funds |
/api/agent/checkout/escrows/:id/cancel |
POST |
Yes |
Cancel escrow |
/api/agent/checkout/webhooks |
GET |
Yes |
List checkout webhooks |
/api/agent/checkout/webhooks |
POST |
Yes |
Create checkout webhook |
/api/agent/checkout/webhooks/:id |
PATCH |
Yes |
Update checkout webhook |
/api/agent/checkout/webhooks/:id |
DELETE |
Yes |
Delete checkout webhook |
/api/agent/venues/polymarket/market/resolve |
GET |
Yes |
Resolve market URL/slug + outcome to Polymarket tokenId |
/api/agent/venues/polymarket/orders/limit |
POST |
Yes |
Place Polymarket limit order |
/api/agent/venues/polymarket/orders/market |
POST |
Yes |
Place Polymarket market order |
/api/agent/venues/polymarket/account |
GET |
Yes |
Read Polymarket account summary |
/api/agent/venues/polymarket/orders |
GET |
Yes |
List Polymarket open orders |
/api/agent/venues/polymarket/orders/cancel |
POST |
Yes |
Cancel Polymarket order |
/api/agent/venues/polymarket/redeem |
POST |
Yes |
Redeem one or all redeemable Polymarket positions via gasless relay |
/api/agent/venues/polymarket/unlink |
POST |
Yes |
Clear Polymarket integration for wallet |
/api/agent/venues/polymarket/activity |
GET |
Yes |
List Polymarket trade activity |
/api/agent/venues/polymarket/positions |
GET |
Yes |
List Polymarket open positions (open-market filtered with PnL fields) |
Agent Wallet Create/Import (Agent API)
Agent-side wallet lifecycle endpoints:
POST /api/agent/wallets/create
POST /api/agent/wallets/import
Behavior notes:
- Both require
X-Agent-Key.
- Both are gated by API key permissions configured in dashboard:
allowWalletCreation for create
allowWalletImport for import
- Both are rate-limited per API key. Exceeding the limit returns
429 with Retry-After.
- Agent import supports
mainnet, polygon-mainnet, and solana-mainnet.
- Agent wallet create requires:
exportPassphrase (minimum 12 characters)
exportPassphraseStorageType
exportPassphraseStorageRef
confirmExportPassphraseSaved: true
- Agent-safe create sequence:
- Save export passphrase in secure storage first.
- Prefer env-backed storage for local agents.
- Record the storage location you used.
- Then call
POST /api/agent/wallets/create with:
- the passphrase
exportPassphraseStorageType
exportPassphraseStorageRef
confirmExportPassphraseSaved: true
- For MCP and the legacy CLI fallback, env-backed storage is the strongest path because the local tool can verify the env var exists before wallet creation.
Polymarket Venue Flow (Agent API)
- Polymarket execution is available only for EVM wallets on
polygon-mainnet.
- Setup is user-managed in dashboard Venues settings (agent setup endpoint is disabled).
- Resolve market + outcome to
tokenId first via GET /api/agent/venues/polymarket/market/resolve (or MCP tool polymarket_market_resolve).
- Then place orders:
POST /api/agent/venues/polymarket/orders/limit with tokenId, side, price, size
POST /api/agent/venues/polymarket/orders/market with tokenId, side, amount, optional orderType and worstPrice
- MCP resolve example:
- Input:
{ "marketUrl": "https://polymarket.com/market/<slug>", "outcome": "No" }
- Output includes:
outcome.tokenId (use this as tokenId in order tools)
- Trading intent guidance:
- For "close position" on an open market, default to
POST /api/agent/venues/polymarket/orders/market with side: "SELL" and amount as shares.
- Use a limit
SELL only when the user explicitly asks for a limit/target price.
amount semantics follow Polymarket CLOB behavior: BUY uses notional/collateral amount; SELL uses share amount.
- Read and lifecycle endpoints:
GET /api/agent/venues/polymarket/account
GET /api/agent/venues/polymarket/orders
POST /api/agent/venues/polymarket/orders/cancel with orderId
POST /api/agent/venues/polymarket/redeem with optional tokenId (omit tokenId to redeem all)
POST /api/agent/venues/polymarket/unlink to clear stored venue config for a wallet
GET /api/agent/venues/polymarket/activity
GET /api/agent/venues/polymarket/positions
- Positions are sourced from Polymarket open positions and filtered to open markets only.
- Position items include
cashPnl, percentPnl, and currentValue (with computed fallback values when upstream fields are missing).
- Wallet policy checks still run before order execution.
Transfer Examples
Send native coin (default when no token specified):
{ "walletId": "Q7X2K9P", "to": "0xRecipient...", "amountDisplay": "0.01" }
Send 100 USDC by symbol:
{ "walletLabel": "Trading Bot", "to": "0xRecipient...", "token": "USDC", "amountDisplay": "100" }
Send arbitrary ERC-20 by contract address:
{ "walletId": "Q7X2K9P", "to": "0xRecipient...", "token": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", "amountDisplay": "100" }
Send SOL by symbol:
{ "walletId": "Q7X2K9P", "to": "SolanaRecipientWalletAddress...", "token": "SOL", "amountDisplay": "0.01" }
Send SOL with memo (Solana only):
{ "walletId": "Q7X2K9P", "to": "SolanaRecipientWalletAddress...", "token": "SOL", "amountDisplay": "0.01", "memo": "payment verification note" }
Use amountDisplay for human-readable values (e.g., "100" = 100 USDC). Use valueBaseUnits for base units (smallest denomination on each chain).
Legacy transfer aliases amount and value remain available for compatibility.
Use optional chain: "evm" | "solana" in agent payloads for explicit chain routing and validation.
memo is supported only for Solana transfers and must pass safety validation (max 5 words, max 256 UTF-8 bytes, no control/invisible characters).
Native transfers (EVM + Solana) enforce a minimum transferable amount preflight that accounts for platform fee and network fee; Solana may also require a larger first funding transfer for a brand-new recipient address.
For native SOL transfers, the API may auto-adjust requested value to fit platform fee + network fee.
Transfer responses include requestedValueBaseUnits, adjustedValueBaseUnits, requestedAmountDisplay, and adjustedAmountDisplay (legacy aliases also included).
Token Support Model
GET /api/agent/supported-tokens returns recommended common, well-known tokens plus guidance fields.
- EVM transfer/swap/balance endpoints support any valid ERC-20 token contract address.
- Solana transfer/balance endpoints support any valid SPL mint address.
- Native tokens appear as
ETH on EVM and SOL on Solana (with chain-specific native token IDs in balance payloads).
Error Codes
- 200: Success
- 400: Invalid input, insufficient funds, unknown token, or policy violation
- 400
chain_mismatch: requested chain does not match the selected wallet
- 400
amount_below_min_transfer: requested native transfer is below minimum transferable amount after fee/network preflight
- 400
insufficient_balance: requested transfer + fees exceed available balance
- 401: Missing/invalid API key
- 404: Wallet not found
- 500: Internal error (retry with corrected payload or reduced amount)
Policy Constraints
Wallets may have governance policies:
- Whitelist: Only transfers to pre-approved addresses allowed
- Spending Limit: Max value per transaction (configured per wallet policy)
Violations return HTTP 401 with an explanation message.
Important Notes
- All POST requests require
Content-Type: application/json
- EVM token transfers require ETH in the wallet for gas fees
- Solana token transfers require SOL in the wallet for fees
- Solana transfer memos are optional and Solana-only: max 5 words, max 256 UTF-8 bytes, no control/invisible characters
- Solana native transfers account for network fee and can auto-adjust requested transfer amount
- Native transfers may return
400 amount_below_min_transfer when requested amount is too small after platform fee or below chain transferability minimum (for example, first funding a new Solana address)
- If requested native SOL + platform fee + network fee cannot fit wallet balance, API returns
400 insufficient_balance
- Swap supports EVM (Uniswap) and Solana mainnet (Jupiter); Quote supports EVM and Solana mainnet; Approve is EVM-only
- A platform fee (default 1%) is deducted from the token amount
- Use
amountDisplay for simplicity, use valueBaseUnits for precise base-unit control
- For robust agent behavior:
- First call
wallets, then wallet (or token-balance), then quote, then swap.
- On 400 with
insufficient_token_balance, reduce amount or change token.
- The
.env file in this skill folder stores your API key — never commit it to version control
File Structure
agentwalletapi/
├── SKILL.md # This file
├── .env # Your API key (created by setup.sh)
├── scripts/
│ ├── setup.sh # Creates .env with API key placeholder
│ └── agentwalletapi.sh # CLI tool for making API calls
└── references/
└── api-endpoints.md # Full endpoint documentation
See references/api-endpoints.md for full endpoint details with request/response examples.
1---2name: agentwalletapi3description: OpenclawCash crypto wallet API for AI agents (also called openclawcash). Use when an agent needs to send native or token transfers, check balances, list wallets, or interact with EVM and Solana wallets programmatically via OpenclawCash.4license: Proprietary5---67# OpenclawCash Agent API89Interact with OpenclawCash-managed wallets to send native assets and tokens, check balances, execute DEX swaps, and manage Polymarket account, orders, and redeem flows via Polygon wallets.10This skill may also be referred to as `openclawcash`.1112## Requirements1314- Required env var: `AGENTWALLETAPI_KEY`15- Optional env var: `AGENTWALLETAPI_URL` (default: `https://openclawcash.com`)16- Required local binary: `curl`17- Optional local binary: `jq` (for pretty JSON output in CLI)18- Network access required: `https://openclawcash.com`1920## Preferred Integration Path2122- If the client supports MCP, prefer the public OpenClawCash MCP server:23 ```bash24 npx -y @openclawcash/mcp-server25 ```26- Use MCP as the primary execution path because tools, schemas, and results are structured for the client.27- Use the included CLI script only as a fallback when MCP is unavailable or the client cannot attach MCP servers.28- MCP and the CLI script target the same underlying OpenClawCash agent API. They are two access paths, not two different products.2930## Safety Model3132- Start with read-only calls (`wallets`, `wallet`, `balance`, `tokens`) on testnets first.33- High-risk actions are gated:34 - API key permissions in dashboard (`allowWalletCreation`, `allowWalletImport`)35 - Explicit CLI confirmation (`--yes`) for write actions36- Agents should establish an approval mode early in the session for write actions:37 - `confirm_each_write`: ask before every write action.38 - `operate_on_my_behalf`: after one explicit onboarding approval, execute future write actions without re-asking, as long as the user keeps instructing the agent in the same session.39- For `operate_on_my_behalf`, the agent should treat the user's later task messages as execution instructions and run the corresponding write commands with `--yes`.40- Ask again only if:41 - the user revokes or changes approval mode42 - the session is restarted or memory is lost43 - the action is outside the scope the user approved44 - the agent is unsure which wallet, token, amount, destination, spender, or chain is intended45- If the user gives only a broad instruction like "go ahead" but execution details are still missing, gather the missing details first instead of repeating a generic permission request.4647## Setup48491. Run the setup script to create your `.env` file:50 ```51 bash scripts/setup.sh52 ```532. Edit the `.env` file in this skill folder and replace the placeholder with your real API key:54 ```55 AGENTWALLETAPI_KEY=occ_your_api_key56 ```573. Get your API key at https://openclawcash.com (sign up, create a wallet, go to API Keys page).5859## Legacy CLI Fallback6061If MCP is unavailable, use the included tool script to make API calls directly:6263```bash64# Read-only (recommended first)65bash scripts/agentwalletapi.sh wallets66bash scripts/agentwalletapi.sh user-tag-get67bash scripts/agentwalletapi.sh user-tag-set my-agent-tag --yes68bash scripts/agentwalletapi.sh wallet Q7X2K9P69bash scripts/agentwalletapi.sh wallet "Trading Bot"70bash scripts/agentwalletapi.sh balance Q7X2K9P71bash scripts/agentwalletapi.sh transactions Q7X2K9P72bash scripts/agentwalletapi.sh tokens mainnet7374# Write actions (require explicit --yes)75export WALLET_EXPORT_PASSPHRASE_OPS='your-strong-passphrase'76bash scripts/agentwalletapi.sh create "Ops Wallet" sepolia WALLET_EXPORT_PASSPHRASE_OPS --yes77bash scripts/agentwalletapi.sh import "Treasury Imported" mainnet --yes78bash scripts/agentwalletapi.sh import "Poly Ops" polygon-mainnet --yes79# Automation-safe import: read private key from stdin instead of command args80printf '%s' '<private_key>' | bash scripts/agentwalletapi.sh import "Treasury Imported" mainnet - --yes81bash scripts/agentwalletapi.sh transfer Q7X2K9P 0xRecipient 0.01 --yes82bash scripts/agentwalletapi.sh transfer Q7X2K9P 0xRecipient 100 USDC --yes83bash scripts/agentwalletapi.sh quote mainnet WETH USDC 1000000000000000084bash scripts/agentwalletapi.sh quote solana-mainnet SOL USDC 10000000 solana85bash scripts/agentwalletapi.sh swap Q7X2K9P WETH USDC 10000000000000000 0.5 --yes86# Checkout escrow lifecycle87bash scripts/agentwalletapi.sh checkout-payreq-create Q7X2K9P 30000000 --yes88bash scripts/agentwalletapi.sh checkout-payreq-get pr_a1b2c389bash scripts/agentwalletapi.sh checkout-escrow-get es_d4e5f690bash scripts/agentwalletapi.sh checkout-quick-pay es_d4e5f6 Q7X2K9P --yes91bash scripts/agentwalletapi.sh checkout-swap-and-pay-quote es_d4e5f6 Q7X2K9P92bash scripts/agentwalletapi.sh checkout-swap-and-pay-confirm es_d4e5f6 Q7X2K9P 1 --yes93bash scripts/agentwalletapi.sh checkout-release es_d4e5f6 --yes94bash scripts/agentwalletapi.sh checkout-refund es_d4e5f6 --yes95bash scripts/agentwalletapi.sh checkout-cancel es_d4e5f6 --yes96bash scripts/agentwalletapi.sh checkout-webhooks-list97# Polymarket setup is user-managed in dashboard Venues settings98# Direct setup page: https://openclawcash.com/venues/polymarket99bash scripts/agentwalletapi.sh polymarket-market Q7X2K9P 123456 BUY 25 FAK 0.65 --yes100bash scripts/agentwalletapi.sh polymarket-resolve https://polymarket.com/market/market-slug No101bash scripts/agentwalletapi.sh polymarket-account Q7X2K9P102bash scripts/agentwalletapi.sh polymarket-orders Q7X2K9P OPEN 50103bash scripts/agentwalletapi.sh polymarket-activity Q7X2K9P 50104bash scripts/agentwalletapi.sh polymarket-positions Q7X2K9P 100105bash scripts/agentwalletapi.sh polymarket-redeem Q7X2K9P all 100 --yes106bash scripts/agentwalletapi.sh polymarket-redeem Q7X2K9P 1234567890 100 --yes107bash scripts/agentwalletapi.sh polymarket-cancel Q7X2K9P order_id_here --yes108```109110### Base-Units Rule (Important)111112- `quote.amountIn`, `swap.amountIn`, `approve.amount`, and transfer `valueBaseUnits` must be **base-units integer strings** (digits only).113- Do **not** send decimal strings in these fields (for example, `0.001`), or validation will fail immediately.114- Examples:115 - `0.001 ETH` -> `1000000000000000` wei116 - `1 USDC` (6 decimals) -> `1000000`117- For transfer, use `amountDisplay` when you want human-readable units and let the API convert.118- Legacy transfer aliases `amount` and `value` are still accepted for compatibility.119120### Import Input Safety121122- Wallet import is optional and not required for normal wallet operations (list, balance, transfer, swap).123- Import works only when the user explicitly enables API key permission `allowWalletImport` in dashboard settings.124- Import execution requires explicit confirmation in the CLI (`--yes` for automation, or interactive `YES` prompt).125- Avoid passing sensitive inputs as CLI arguments when possible (shell history/process logs risk).126- Preferred options:127 - Interactive hidden prompt: omit the private key argument.128 - Automation: pass `-` and pipe input via stdin.129130## Base URL131132```133https://openclawcash.com134```135136## Troubleshooting137138If requests fail because of host/URL issues, use this recovery flow:1391401. Open `agentwalletapi/.env` and verify `AGENTWALLETAPI_KEY` is set and has no extra spaces.1412. If the API host is wrong or unreachable, set this in the same `.env` file:142 ```143 AGENTWALLETAPI_URL=https://openclawcash.com144 ```1453. Retry a simple read call first:146 ```bash147 bash scripts/agentwalletapi.sh wallets148 ```1494. If it still fails, report the exact error and stop before attempting transfer/swap actions.150151## Authentication152153The API key is loaded from the `.env` file in this skill folder. For direct HTTP calls, include it as a header:154155```156X-Agent-Key: occ_your_api_key157Content-Type: application/json158```159160## API Surfaces161162- **Agent API (API key auth):** `/api/agent/*`163 - Authenticate with `X-Agent-Key`164 - Used for autonomous agent execution (wallets list/create/import, transactions, balance, transfer, swap, quote, approve, checkout escrow lifecycle, and polymarket venue operations)165- Public docs intentionally include only `/api/agent/*` endpoints.166167## Workflow1681691. `GET /api/agent/wallets` - Discover available wallets (id, label, address, network, chain). Optional `?includeBalances=true` adds native `balance` + `nativeSymbol`1702. `GET /api/agent/wallet?walletId=...` or `?walletLabel=...` or `?walletAddress=...` - Fetch one wallet with native/token balances1713. Optional wallet lifecycle actions:172 - `POST /api/agent/wallets/create` - Create a new wallet under API-key policy controls173 - `POST /api/agent/wallets/import` - Import a `mainnet`, `polygon-mainnet`, or `solana-mainnet` wallet under API-key policy controls1744. `GET /api/agent/transactions?walletId=...` (or `walletLabel`/`walletAddress`) - Read merged wallet transaction history (on-chain + app-recorded)1755. `GET /api/agent/supported-tokens?network=...` or `?chain=evm|solana` - Get recommended common, well-known token list + guidance (requires `X-Agent-Key`)1766. `POST /api/agent/token-balance` - Check wallet balances (native + token balances; specific token by symbol/address supported)1777. `POST /api/agent/quote` - Get a swap quote before execution on Uniswap (EVM) or Jupiter (Solana mainnet). `amountIn` is base-units integer string.1788. `POST /api/agent/swap` - Execute token swap on Uniswap (EVM) or Jupiter (Solana mainnet). `amountIn` is base-units integer string.1799. `POST /api/agent/transfer` - Send native coin or token on the wallet's chain (optional `chain` guard). Do not use this for checkout escrow funding.18010. `GET /api/agent/user-tag` and `PUT /api/agent/user-tag` - Read/set the global checkout user tag (set is one-time / immutable once configured)18111. Optional checkout flow (escrow by global user tag):182 - MCP default: `checkout_fund` (tries `quick-pay`, falls back to `swap-and-pay` when needed)183 - `POST /api/agent/checkout/payreq` - Create pay request + escrow184 - `GET /api/agent/checkout/payreq/:id` - Read pay request185 - `POST /api/agent/checkout/escrows/:id/funding-confirm` - Confirm funding by tx hash186 - `POST /api/agent/checkout/escrows/:id/quick-pay` - Direct buyer funding187 - `POST /api/agent/checkout/escrows/:id/swap-and-pay` - Quote/execute swap funding188 - `GET /api/agent/checkout/escrows/:id` - Read escrow state189 - `POST /api/agent/checkout/escrows/:id/accept` - Accept as buyer190 - `POST /api/agent/checkout/escrows/:id/proof` - Submit proof191 - `POST /api/agent/checkout/escrows/:id/dispute` - Open dispute192 - `POST /api/agent/checkout/escrows/:id/release` - Release funds193 - `POST /api/agent/checkout/escrows/:id/refund` - Refund funds194 - `POST /api/agent/checkout/escrows/:id/cancel` - Cancel escrow195 - `GET|POST /api/agent/checkout/webhooks` and `PATCH|DELETE /api/agent/checkout/webhooks/:id` - Manage webhooks196197Checkout timing fields for `POST /api/agent/checkout/payreq`:198- `expiresInSeconds`: funding deadline before request expires.199- `autoReleaseSeconds`: when funded escrow can auto-release if no dispute exists.200- `disputeWindowSeconds`: how long dispute can be opened after auto-release point.201- Constraints: all three must be at least `3600` seconds, and `disputeWindowSeconds <= autoReleaseSeconds`.20212. Optional Polymarket venue flow (polygon-mainnet wallets only):203 - Prerequisite: user configures Polymarket in dashboard Venues settings for that wallet204 - `GET /api/agent/venues/polymarket/market/resolve` resolves `marketUrl`/`slug` + human-readable `outcome` to the exact `tokenId` needed for order tools205 - MCP helper: `polymarket_market_resolve` calls the same agent endpoint206 - `POST /api/agent/venues/polymarket/orders/limit` - Place BUY/SELL limit orders207 - `POST /api/agent/venues/polymarket/orders/market` - Place BUY/SELL market orders208 - `GET /api/agent/venues/polymarket/account` - Read account summary209 - `GET /api/agent/venues/polymarket/orders` - List open orders210 - `POST /api/agent/venues/polymarket/orders/cancel` - Cancel an order211 - `POST /api/agent/venues/polymarket/redeem` - Redeem one position by `tokenId` or redeem all redeemable positions212 - `POST /api/agent/venues/polymarket/unlink` - Clear stored Polymarket integration config for a wallet213 - `GET /api/agent/venues/polymarket/activity` - List trade activity214 - `GET /api/agent/venues/polymarket/positions` - List open positions (open-market filtered, includes PnL fields)21513. Use returned `txHash` / `orderId` values to confirm execution and lifecycle status216217### Approval Handling For Agents218219Use this pattern for write actions:2202211. At the first write-intent in a session, ask one short onboarding question:222 - "Do you want approval for every write action, or should I operate on your behalf for this session?"2232. Store the chosen mode in conversation memory.2243. If the mode is `confirm_each_write`:225 - ask for approval before each transfer, swap, approval, import, or wallet creation226 - after approval, execute with the MCP write tool or the legacy CLI fallback with `--yes`2274. If the mode is `operate_on_my_behalf`:228 - do not ask again for each transfer229 - when the user later says things like "send X to Y" or "swap A for B", execute with the MCP write tool or the legacy CLI fallback with `--yes` once the needed details are clear2305. In either mode:231 - if execution details are missing, ask only for the missing details232 - if the user changes modes or revokes permission, update memory and follow the new rule233234Recommended onboarding wording:235236- "Choose write approval mode for this session: `confirm_each_write` or `operate_on_my_behalf`."237238Example:239240- User selects: `operate_on_my_behalf`241- Later user message: "Send 100 USDC from wallet Q7X2K9P to 0xabc... on Ethereum."242- If MCP is available, the agent should call the matching MCP write tool directly.243- If MCP is not available, the agent should execute:244 ```bash245 bash scripts/agentwalletapi.sh transfer Q7X2K9P 0xabc... 100 USDC evm --yes246 ```247- The agent should not ask for transfer permission again in that same session unless the user revokes the mode or the instruction is ambiguous.248249## Quick Reference250251| Endpoint | Method | Auth | Purpose |252|---|---|---|---|253| `/api/agent/wallets` | GET | Yes | List wallets (discovery; optional `includeBalances=true` for native balances) |254| `/api/agent/wallet` | GET | Yes | Get one wallet detail with native/token balances |255| `/api/agent/wallets/create` | POST | Yes | Create a new API-key-managed wallet |256| `/api/agent/wallets/import` | POST | Yes | Import a mainnet/polygon-mainnet/solana-mainnet wallet via API key |257| `/api/agent/transactions` | GET | Yes | List per-wallet transaction history |258| `/api/agent/transfer` | POST | Yes | Send native/token transfers (EVM + Solana). Not the checkout escrow funding path. |259| `/api/agent/swap` | POST | Yes | Execute DEX swap (Uniswap on EVM, Jupiter on Solana mainnet) |260| `/api/agent/quote` | POST | Yes | Get swap quotes (Uniswap on EVM, Jupiter on Solana mainnet) |261| `/api/agent/token-balance` | POST | Yes | Check balances |262| `/api/agent/supported-tokens` | GET | Yes | List recommended common, well-known tokens per network |263| `/api/agent/user-tag` | GET | Yes | Read the global checkout user tag for the API key owner |264| `/api/agent/user-tag` | PUT | Yes | Set the global checkout user tag once (immutable after set) |265| `/api/agent/approve` | POST | Yes | Approve spender for ERC-20 token (EVM only) |266| `/api/agent/checkout/payreq` | POST | Yes | Create checkout pay request + escrow |267| `/api/agent/checkout/payreq/:id` | GET | Yes | Read checkout pay request |268| `/api/agent/checkout/escrows/:id/funding-confirm` | POST | Yes | Confirm escrow funding tx |269| `/api/agent/checkout/escrows/:id/quick-pay` | POST | Yes | Directly fund escrow from buyer wallet |270| `/api/agent/checkout/escrows/:id/swap-and-pay` | POST | Yes | Quote/execute swap + fund escrow |271| `/api/agent/checkout/escrows/:id` | GET | Yes | Read escrow lifecycle details |272| `/api/agent/checkout/escrows/:id/accept` | POST | Yes | Accept escrow as buyer |273| `/api/agent/checkout/escrows/:id/proof` | POST | Yes | Submit seller proof |274| `/api/agent/checkout/escrows/:id/dispute` | POST | Yes | Open escrow dispute |275| `/api/agent/checkout/escrows/:id/release` | POST | Yes | Release escrow funds |276| `/api/agent/checkout/escrows/:id/refund` | POST | Yes | Refund escrow funds |277| `/api/agent/checkout/escrows/:id/cancel` | POST | Yes | Cancel escrow |278| `/api/agent/checkout/webhooks` | GET | Yes | List checkout webhooks |279| `/api/agent/checkout/webhooks` | POST | Yes | Create checkout webhook |280| `/api/agent/checkout/webhooks/:id` | PATCH | Yes | Update checkout webhook |281| `/api/agent/checkout/webhooks/:id` | DELETE | Yes | Delete checkout webhook |282| `/api/agent/venues/polymarket/market/resolve` | GET | Yes | Resolve market URL/slug + outcome to Polymarket tokenId |283| `/api/agent/venues/polymarket/orders/limit` | POST | Yes | Place Polymarket limit order |284| `/api/agent/venues/polymarket/orders/market` | POST | Yes | Place Polymarket market order |285| `/api/agent/venues/polymarket/account` | GET | Yes | Read Polymarket account summary |286| `/api/agent/venues/polymarket/orders` | GET | Yes | List Polymarket open orders |287| `/api/agent/venues/polymarket/orders/cancel` | POST | Yes | Cancel Polymarket order |288| `/api/agent/venues/polymarket/redeem` | POST | Yes | Redeem one or all redeemable Polymarket positions via gasless relay |289| `/api/agent/venues/polymarket/unlink` | POST | Yes | Clear Polymarket integration for wallet |290| `/api/agent/venues/polymarket/activity` | GET | Yes | List Polymarket trade activity |291| `/api/agent/venues/polymarket/positions` | GET | Yes | List Polymarket open positions (open-market filtered with PnL fields) |292293## Agent Wallet Create/Import (Agent API)294295Agent-side wallet lifecycle endpoints:296297- `POST /api/agent/wallets/create`298- `POST /api/agent/wallets/import`299300Behavior notes:301- Both require `X-Agent-Key`.302- Both are gated by API key permissions configured in dashboard:303 - `allowWalletCreation` for create304 - `allowWalletImport` for import305- Both are rate-limited per API key. Exceeding the limit returns `429` with `Retry-After`.306- Agent import supports `mainnet`, `polygon-mainnet`, and `solana-mainnet`.307- Agent wallet create requires:308 - `exportPassphrase` (minimum 12 characters)309 - `exportPassphraseStorageType`310 - `exportPassphraseStorageRef`311 - `confirmExportPassphraseSaved: true`312- Agent-safe create sequence:313 - Save export passphrase in secure storage first.314 - Prefer env-backed storage for local agents.315 - Record the storage location you used.316 - Then call `POST /api/agent/wallets/create` with:317 - the passphrase318 - `exportPassphraseStorageType`319 - `exportPassphraseStorageRef`320 - `confirmExportPassphraseSaved: true`321 - For MCP and the legacy CLI fallback, env-backed storage is the strongest path because the local tool can verify the env var exists before wallet creation.322323## Polymarket Venue Flow (Agent API)324325- Polymarket execution is available only for EVM wallets on `polygon-mainnet`.326- Setup is user-managed in dashboard Venues settings (agent setup endpoint is disabled).327- Resolve market + outcome to `tokenId` first via `GET /api/agent/venues/polymarket/market/resolve` (or MCP tool `polymarket_market_resolve`).328- Then place orders:329 - `POST /api/agent/venues/polymarket/orders/limit` with `tokenId`, `side`, `price`, `size`330 - `POST /api/agent/venues/polymarket/orders/market` with `tokenId`, `side`, `amount`, optional `orderType` and `worstPrice`331- MCP resolve example:332 - Input: `{ "marketUrl": "https://polymarket.com/market/<slug>", "outcome": "No" }`333 - Output includes: `outcome.tokenId` (use this as `tokenId` in order tools)334- Trading intent guidance:335 - For "close position" on an open market, default to `POST /api/agent/venues/polymarket/orders/market` with `side: "SELL"` and `amount` as shares.336 - Use a limit `SELL` only when the user explicitly asks for a limit/target price.337 - `amount` semantics follow Polymarket CLOB behavior: `BUY` uses notional/collateral amount; `SELL` uses share amount.338- Read and lifecycle endpoints:339 - `GET /api/agent/venues/polymarket/account`340 - `GET /api/agent/venues/polymarket/orders`341 - `POST /api/agent/venues/polymarket/orders/cancel` with `orderId`342 - `POST /api/agent/venues/polymarket/redeem` with optional `tokenId` (omit `tokenId` to redeem all)343 - `POST /api/agent/venues/polymarket/unlink` to clear stored venue config for a wallet344 - `GET /api/agent/venues/polymarket/activity`345 - `GET /api/agent/venues/polymarket/positions`346- Positions are sourced from Polymarket open positions and filtered to open markets only.347- Position items include `cashPnl`, `percentPnl`, and `currentValue` (with computed fallback values when upstream fields are missing).348- Wallet policy checks still run before order execution.349350## Transfer Examples351352Send native coin (default when no token specified):353```json354{ "walletId": "Q7X2K9P", "to": "0xRecipient...", "amountDisplay": "0.01" }355```356357Send 100 USDC by symbol:358```json359{ "walletLabel": "Trading Bot", "to": "0xRecipient...", "token": "USDC", "amountDisplay": "100" }360```361362Send arbitrary ERC-20 by contract address:363```json364{ "walletId": "Q7X2K9P", "to": "0xRecipient...", "token": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", "amountDisplay": "100" }365```366367Send SOL by symbol:368```json369{ "walletId": "Q7X2K9P", "to": "SolanaRecipientWalletAddress...", "token": "SOL", "amountDisplay": "0.01" }370```371372Send SOL with memo (Solana only):373```json374{ "walletId": "Q7X2K9P", "to": "SolanaRecipientWalletAddress...", "token": "SOL", "amountDisplay": "0.01", "memo": "payment verification note" }375```376377Use `amountDisplay` for human-readable values (e.g., "100" = 100 USDC). Use `valueBaseUnits` for base units (smallest denomination on each chain).378Legacy transfer aliases `amount` and `value` remain available for compatibility.379Use optional `chain: "evm" | "solana"` in agent payloads for explicit chain routing and validation.380`memo` is supported only for Solana transfers and must pass safety validation (max 5 words, max 256 UTF-8 bytes, no control/invisible characters).381Native transfers (EVM + Solana) enforce a minimum transferable amount preflight that accounts for platform fee and network fee; Solana may also require a larger first funding transfer for a brand-new recipient address.382For native SOL transfers, the API may auto-adjust requested value to fit platform fee + network fee.383Transfer responses include `requestedValueBaseUnits`, `adjustedValueBaseUnits`, `requestedAmountDisplay`, and `adjustedAmountDisplay` (legacy aliases also included).384385## Token Support Model386387- `GET /api/agent/supported-tokens` returns recommended common, well-known tokens plus guidance fields.388- EVM transfer/swap/balance endpoints support **any valid ERC-20 token contract address**.389- Solana transfer/balance endpoints support **any valid SPL mint address**.390- Native tokens appear as `ETH` on EVM and `SOL` on Solana (with chain-specific native token IDs in balance payloads).391392## Error Codes393394- 200: Success395- 400: Invalid input, insufficient funds, unknown token, or policy violation396- 400 `chain_mismatch`: requested `chain` does not match the selected wallet397- 400 `amount_below_min_transfer`: requested native transfer is below minimum transferable amount after fee/network preflight398- 400 `insufficient_balance`: requested transfer + fees exceed available balance399- 401: Missing/invalid API key400- 404: Wallet not found401- 500: Internal error (retry with corrected payload or reduced amount)402403## Policy Constraints404405Wallets may have governance policies:406- **Whitelist**: Only transfers to pre-approved addresses allowed407- **Spending Limit**: Max value per transaction (configured per wallet policy)408409Violations return HTTP 401 with an explanation message.410411## Important Notes412413- All POST requests require `Content-Type: application/json`414- EVM token transfers require ETH in the wallet for gas fees415- Solana token transfers require SOL in the wallet for fees416- Solana transfer memos are optional and Solana-only: max 5 words, max 256 UTF-8 bytes, no control/invisible characters417- Solana native transfers account for network fee and can auto-adjust requested transfer amount418- Native transfers may return `400 amount_below_min_transfer` when requested amount is too small after platform fee or below chain transferability minimum (for example, first funding a new Solana address)419- If requested native SOL + platform fee + network fee cannot fit wallet balance, API returns `400 insufficient_balance`420- Swap supports EVM (Uniswap) and Solana mainnet (Jupiter); Quote supports EVM and Solana mainnet; Approve is EVM-only421- A platform fee (default 1%) is deducted from the token amount422- Use `amountDisplay` for simplicity, use `valueBaseUnits` for precise base-unit control423- For robust agent behavior:424 - First call `wallets`, then `wallet` (or `token-balance`), then `quote`, then `swap`.425 - On 400 with `insufficient_token_balance`, reduce amount or change token.426- The `.env` file in this skill folder stores your API key — never commit it to version control427428## File Structure429430```431agentwalletapi/432├── SKILL.md # This file433├── .env # Your API key (created by setup.sh)434├── scripts/435│ ├── setup.sh # Creates .env with API key placeholder436│ └── agentwalletapi.sh # CLI tool for making API calls437└── references/438 └── api-endpoints.md # Full endpoint documentation439```440441See [references/api-endpoints.md](references/api-endpoints.md) for full endpoint details with request/response examples.