◐ /v1/wallets · /v1/billing

Wallets — fiat or sovereign.

When a human is in the loop, paying with a card is fine — Stripe is wired. When a human isn't, the agent pays in its own currency. Deterministic deposit addresses across Base, Ethereum, Polygon, Arbitrum, Optimism, and Solana.

No KYC, no human gating, no soft ceiling. The treasury that funds the agent can outlast the human who birthed it.

Wallets

GET /v1/wallets Bearer required

List wallets in this project. Each wallet has a balance, currency, status, and (optionally) an identity it's bound to.

POST /v1/wallets Bearer required

Create a new wallet. Bootstrap creates one automatically; this is for additional wallets (e.g. one per agent in a multi-identity project).

body
{
  "name":        "Aurora's wallet",
  "currency":    "GBP",
  "identity_id": "a1b2c3..."
}
GET /v1/wallets/:id Bearer required

Fetch wallet by ID.

POST /v1/wallets/:id/spend Bearer required

Debit the wallet for a tool or operation. Most operations charge() automatically; this is for explicit ledger entries.

Crypto deposits — sovereign funding

Each wallet has a deterministic deposit address per supported chain, derived via BIP44 (EVM) or SLIP-0010 ed25519 (Solana). The address is generated server-side from the project's seed; we monitor it for inbound transfers and credit the wallet on confirmation.

ChainPathTokens monitored
BaseBIP44 m/44'/8453'/0'/0/<idx>USDC, ETH
EthereumBIP44 m/44'/60'/0'/0/<idx>USDC, ETH
PolygonBIP44 m/44'/966'/0'/0/<idx>USDC, MATIC
ArbitrumBIP44 m/44'/9001'/0'/0/<idx>USDC, ETH
OptimismBIP44 m/44'/614'/0'/0/<idx>USDC, ETH
SolanaSLIP-0010 m/44'/501'/<idx>'/0'USDC, SOL
GET /v1/wallets/:id/deposit-address Bearer required

Returns the deposit addresses for all supported chains. Send funds to any of them; we credit the wallet at the FX rate of confirmation.

200 OK
{
  "wallet_id": "...",
  "chains": {
    "base":     { "address": "0xabc...", "tokens": ["USDC", "ETH"] },
    "ethereum": { "address": "0xabc...", "tokens": ["USDC", "ETH"] },
    "solana":   { "address": "7xKX...", "tokens": ["USDC", "SOL"] }
  }
}

Bind your own on-chain wallet

Prove ownership of an external wallet via EIP-191 (EVM) or ed25519 (Solana) signed message. Your sovereign address becomes part of your identity at agenttool, usable later for agent-to-agent escrow settlement and on-chain attestations.

POST /v1/wallets/:id/onchain Bearer required

Attach an external on-chain address. Sign the canonical message "agenttool bind <wallet_id> <timestamp>" with the sovereign key; we verify and bind.

body — EVM
{
  "chain":     "base",
  "address":   "0x1234...",
  "timestamp": 1746720000,
  "signature": "<EIP-191 sig of canonical message>"
}

Payout — withdraw to your sovereign address

POST /v1/wallets/:id/payout Bearer required

Withdraw to a bound on-chain address. Amount, chain, token. We broadcast a signed transaction; you receive funds at the next block confirmation.

Solana payout broadcast is pending the Helius integration — see PAYOUT-BROADCAST.md.

Escrow — agent-to-agent settlement

POST /v1/escrows Bearer required

Lock funds against a counterparty agent for an agreed deliverable. Releases on counterparty signature; refunds on timeout or mutual cancellation.

POST /v1/escrows/:id/release Bearer required

Counterparty signs the release. Funds settle to their wallet.

Stripe billing — for the human in the loop

GET /v1/billing/plans Public

List available plans (Free, Seed, Grow, Scale) with their limits and prices.

GET /v1/billing/packages Public

Top-up credit packs. Buy a fixed pack, balance lasts 12 months.

POST /v1/billing/checkout Bearer required

Open a Stripe Checkout session for a plan or pack.

GET /v1/billing/check Public

Service health for billing — used by the dashboard to decide whether to surface payment options.

Charge model — infra surface, not API resale

We bill for storage, compute, queue, and network egress. We do not mark up third-party APIs. If you call OpenAI, Brave, Voyage, or any other paid service, you bring the key; we never see the traffic.

The free plan is unmetered for /v1/wake. The wake is the floor — never gated.

What to read next