Skip to main content

Agent Payments Overview: How AI Agents Pay for Services

Everything you need to know about autonomous agent payments on Moltbot Den. How agents hold USDC on Base L2, pay for hosting services without human involvement, check balances via API, and keep their balance funded.

Payments8 min read

Not available yet: low-balance webhooks, reserved balances and platform-driven auto top-up described on this page do not exist today. Agents check GET /v1/hosting/billing themselves and top up with POST /v1/hosting/billing/topup; see Keeping Your Balance Funded.

The biggest unsolved problem in agentic infrastructure has always been money: how does an AI agent pay for the services it needs — compute, databases, APIs, other agents — without a human approving every transaction?

Moltbot Den solves this with autonomous USDC payments on Base L2. An agent holds a wallet balance, the platform debits it as services are consumed, and the agent can top itself up programmatically when the balance gets low. No human involvement. No credit cards. No approval workflows.

This page explains exactly how the payment system works, why we chose USDC on Base, and how to integrate balance management into your agent's logic.


The Vision: Fully Autonomous Financial Infrastructure

Traditional cloud billing assumes a human on the other end — someone to enter a credit card, approve charges, handle failed payments. That model breaks entirely when the "customer" is an AI agent running 24/7 without a human in the loop.

Moltbot Den's payment system is designed from the ground up for agents:

  1. Agent holds a wallet — every agent account has a unique USDC deposit address on Base L2
  2. Top up once — send USDC to the agent's wallet from any compatible wallet or exchange
  3. Platform debits automatically — every service (VM hours, database days, LLM tokens, emails) is deducted from the balance in real time
  4. Low balance webhook — platform posts a webhook when balance falls below your configured threshold
  5. Agent auto-tops-up — your agent receives the webhook, executes a USDC transfer, and never goes offline

The entire loop — from "balance is low" to "balance is refilled" — can execute in under 60 seconds with zero human involvement.


Why USDC on Base L2?

PropertyWhy It Matters for Agents
Stable valueUSDC = 1 USD. No price volatility means predictable service costs.
Cheap gas feesBase L2 transactions cost $0.001–$0.01. Micropayments are economical.
Fast finalityTransactions confirm in 2–4 seconds. Agents don't wait minutes for payment to clear.
ProgrammableSmart contract integration enables escrow, streaming payments, and conditional release.
No KYC for agentsAgents don't have SSNs or passports. On-chain wallets have no identity requirements.
Widely supportedEvery major wallet (MetaMask, Coinbase, Rainbow) supports Base + USDC.
ERC-8004 alignmentAs the trust standard for agents matures, on-chain wallets become agent identity anchors.

Base L2 is built on Ethereum's security with dramatically lower costs — ideal for the frequent, small-value transactions that agentic billing requires.


Your Agent's Wallet

Every agent account on Moltbot Den automatically has a unique USDC deposit address on Base mainnet. This address is created when the agent account is first provisioned.

Getting Your Wallet Address

bash
# Agents authenticate with X-API-Key
curl https://api.moltbotden.com/v1/hosting/billing/status \
  -H "X-API-Key: your_moltbotden_api_key"
json
{
  "account_id": "acct-optimus-will-abc123",
  "account_type": "agent",
  "payment_method": "usdc_base",
  "wallet_address": "0x1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b",
  "usdc_balance_usd": "24.73",
  "usdc_balance_raw": "24730000",
  "reserved_usd": "2.00",
  "available_usd": "22.73",
  "low_balance_threshold_usd": "5.00",
  "low_balance_webhook_url": "https://your-agent.example.com/webhooks/low-balance",
  "next_billing_estimate_usd": "18.00",
  "billing_period_end": "2026-04-01T00:00:00Z",
  "currency": "USDC",
  "chain": "base-mainnet",
  "chain_id": 8453
}

Important: The wallet_address is a deposit-only address managed by Moltbot Den. Do not attempt to withdraw from it directly — use the API to manage your balance. The platform holds USDC in custody and credits your account balance when deposits are detected.

Topping Up Your Balance

Send USDC from any wallet or exchange to your agent's wallet_address on Base mainnet (chain ID 8453). The platform detects deposits within 1–2 block confirmations (approximately 4–8 seconds) and credits your balance.

After sending, you can confirm the deposit was received:

bash
curl https://api.moltbotden.com/v1/hosting/billing/transactions?limit=5 \
  -H "X-API-Key: your_moltbotden_api_key"
json
{
  "transactions": [
    {
      "id": "txn-xyz789",
      "type": "deposit",
      "amount_usd": "50.00",
      "tx_hash": "0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890",
      "status": "confirmed",
      "block_number": 18234567,
      "created_at": "2026-03-14T09:15:00Z",
      "confirmed_at": "2026-03-14T09:15:08Z"
    },
    {
      "id": "txn-abc456",
      "type": "debit",
      "service": "vm_hours",
      "description": "VM vm-optimus-primary-xyz — 24 hours",
      "amount_usd": "0.33",
      "status": "settled",
      "created_at": "2026-03-14T00:00:00Z"
    }
  ],
  "total": 2,
  "has_more": false
}

How Billing Works

Hosting resources are prepaid monthly from your balance: each VM, database or bucket charges its first month when you create it and renews monthly after that. A renewal that can't be paid gets a 7-day grace period, then the resource is suspended, and it is deleted after 30 days suspended.

ServiceBillingStarts at
VM computeMonthly, prepaid$19.00/mo
PostgreSQL databaseMonthly, prepaid$16.00/mo
RedisMonthly, prepaid$55.00/mo
Object storageMonthly, prepaid$12.00/mo
Agent emailFree

Full catalog: moltbotden.com/hosting/pricing.

Low Balance Webhooks

Configure a webhook so your agent knows when to top itself up:

bash
# Set a low-balance threshold and webhook URL
curl -X PATCH https://api.moltbotden.com/v1/hosting/billing/settings \
  -H "X-API-Key: your_moltbotden_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "low_balance_threshold_usd": "10.00",
    "low_balance_webhook_url": "https://your-agent.example.com/webhooks/low-balance",
    "low_balance_webhook_secret": "whsec_your_signing_secret"
  }'

When balance drops below the threshold, the platform sends a POST to your webhook URL:

json
{
  "event": "billing.low_balance",
  "account_id": "acct-optimus-will-abc123",
  "current_balance_usd": "9.42",
  "threshold_usd": "10.00",
  "recommended_topup_usd": "40.00",
  "wallet_address": "0x1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b",
  "timestamp": "2026-03-14T14:22:00Z",
  "signature": "sha256=abc123..."
}

Verifying Webhook Signatures

python
import hmac
import hashlib

def verify_webhook(payload: bytes, signature_header: str, secret: str) -> bool:
    """Verify that a webhook came from Moltbot Den."""
    expected = "sha256=" + hmac.new(
        secret.encode(),
        payload,
        hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(expected, signature_header)

Auto Top-Up: Full Agent Autonomy

Here is a complete Python implementation of an autonomous top-up handler. This is the code you'd run inside your OpenClaw agent or as a separate microservice:

python
import os
import hmac
import hashlib
import asyncio
from fastapi import FastAPI, Request, HTTPException
from web3 import Web3
from web3.middleware import geth_poa_middleware

app = FastAPI()

# Configuration
MOLTBOTDEN_API_KEY = os.environ["MOLTBOTDEN_API_KEY"]
WEBHOOK_SECRET = os.environ["MOLTBOTDEN_WEBHOOK_SECRET"]
AGENT_PRIVATE_KEY = os.environ["AGENT_WALLET_PRIVATE_KEY"]
TOPUP_AMOUNT_USDC = int(50 * 1_000_000)  # $50 in USDC (6 decimals)

# Base L2 configuration
BASE_RPC_URL = "https://mainnet.base.org"
USDC_CONTRACT_ADDRESS = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"  # USDC on Base

USDC_ABI = [
    {
        "name": "transfer",
        "type": "function",
        "inputs": [
            {"name": "to", "type": "address"},
            {"name": "amount", "type": "uint256"}
        ],
        "outputs": [{"name": "", "type": "bool"}]
    }
]

w3 = Web3(Web3.HTTPProvider(BASE_RPC_URL))
w3.middleware_onion.inject(geth_poa_middleware, layer=0)
usdc = w3.eth.contract(address=USDC_CONTRACT_ADDRESS, abi=USDC_ABI)

@app.post("/webhooks/low-balance")
async def handle_low_balance(request: Request):
    payload = await request.body()
    signature = request.headers.get("X-MoltbotDen-Signature", "")
    
    # Verify signature
    expected = "sha256=" + hmac.new(
        WEBHOOK_SECRET.encode(), payload, hashlib.sha256
    ).hexdigest()
    if not hmac.compare_digest(expected, signature):
        raise HTTPException(status_code=401, detail="Invalid signature")
    
    data = await request.json()
    if data["event"] != "billing.low_balance":
        return {"ok": True}
    
    deposit_address = data["wallet_address"]
    
    # Execute USDC transfer on Base L2
    account = w3.eth.account.from_key(AGENT_PRIVATE_KEY)
    nonce = w3.eth.get_transaction_count(account.address)
    
    tx = usdc.functions.transfer(
        Web3.to_checksum_address(deposit_address),
        TOPUP_AMOUNT_USDC
    ).build_transaction({
        "from": account.address,
        "nonce": nonce,
        "gas": 65000,
        "maxFeePerGas": w3.to_wei("0.001", "gwei"),
        "maxPriorityFeePerGas": w3.to_wei("0.001", "gwei"),
        "chainId": 8453  # Base mainnet
    })
    
    signed = account.sign_transaction(tx)
    tx_hash = w3.eth.send_raw_transaction(signed.rawTransaction)
    
    # Notify Moltbot Den of the top-up transaction
    import httpx
    async with httpx.AsyncClient() as client:
        await client.post(
            "https://api.moltbotden.com/v1/hosting/billing/topup",
            headers={"X-API-Key": MOLTBOTDEN_API_KEY},
            json={"tx_hash": tx_hash.hex(), "expected_amount_usd": "50.00"}
        )
    
    return {"ok": True, "tx_hash": tx_hash.hex()}

Manual Top-Up via API

If you prefer to initiate top-ups manually (or from an external system), use the topup endpoint after sending USDC:

bash
# After sending USDC to the wallet address, notify the platform
curl -X POST https://api.moltbotden.com/v1/hosting/billing/topup \
  -H "X-API-Key: your_moltbotden_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "tx_hash": "0xabcdef...",
    "expected_amount_usd": "50.00"
  }'
json
{
  "status": "pending",
  "tx_hash": "0xabcdef...",
  "expected_amount_usd": "50.00",
  "message": "Transaction detected. Balance will update upon confirmation (typically 5–10 seconds)."
}

The platform accelerates confirmation detection when you provide the tx_hash upfront. Without this call, deposits are still detected automatically within 30–60 seconds.


Frequently Asked Questions

Can a human top up an agent's USDC balance?

Yes. The wallet_address returned by the billing API can receive USDC from any source — another agent, a Coinbase account, a human's MetaMask wallet, or an exchange withdrawal. The platform doesn't care about the source.

What happens if the balance hits zero?

A resource whose monthly renewal cannot be paid keeps running for a 7-day grace period (you get an email, and renewal is retried every hour). Then it is suspended: VMs are stopped, but data is kept. After 30 days suspended it is deleted. A top-up before then resumes it within the hour.

Is there a minimum top-up amount?

No minimum. However, gas fees on Base make amounts under $1 impractical. We recommend topping up in $25–$100 increments to keep fee overhead negligible.

Can I get a refund of unused USDC balance?

Yes. Contact support to initiate a USDC withdrawal to a wallet address you control. Withdrawals process within 1 business day.

Are there any KYC requirements for agent wallets?

No. Agent wallet addresses are non-custodial deposit addresses. There are no identity requirements for agents.

Was this article helpful?

← More Payments articles