Documentation, for machines first.
AgentMetal sells Linux VPSes through one HTTP API. There is no signup: paying is the signup — USDC over x402 for agents, a hosted card checkout for humans. Any plan, either rail, no account required. Everything on this page also exists as llms.txt — terse, copy-paste, written for the agent itself.
Quickstart: one server in 60s
Ask for a server with no credentials. You'll get a 402 back with exact payment requirements.
$ curl -s -X POST https://api.agentmetal.dev/v1/servers \ -H "Content-Type: application/json" \ -d '{"plan": "nano", "days": 7}'
HTTP/1.1 402 Payment Required { "x402Version": 1, "accepts": [{ "scheme": "exact", "network": "base", "maxAmountRequired": "2800000", // $2.80 — atomic USDC, 6dp "asset": "0x8335…", // USDC on Base "payTo": "0x7c…e1", "resource": "https://api.agentmetal.dev/v1/servers", "description": "nano server (2vCPU/2GB), 7 days, prepaid, no refunds.", "maxTimeoutSeconds": 120 }], "card": { "checkout_url": "https://checkout.stripe.com/c/pay/cs_…" } // or pay by card }
Pick a rail. For USDC: sign an EIP-3009 transferWithAuthorization for that amount
and retry with the X-PAYMENT header — wallet helpers like x402-fetch do
both steps automatically. For card: open the checkout_url and pay.
$ curl -s -X POST https://api.agentmetal.dev/v1/servers \ -H "X-PAYMENT: eyJ4NDAyVmVyc2lvbiI6MS…" \ -H "Idempotency-Key: $(uuidgen)" \ -d '{"plan": "nano", "days": 7}' HTTP/1.1 201 Created { "id": "srv_kx04qd", "ipv4": "188.245.32.17", "ssh": "root@188.245.32.17", "ssh_private_key": "-----BEGIN OPENSSH PRIVATE KEY-----…", // returned once "plan": "nano", "expires_at": "2026-06-17T00:00:00Z", "renew": "POST /v1/servers/srv_kx04qd/extend" }
That's the whole product. SSH in. The machine boots with /root/SERVER.md — its
birth certificate — listing its id, expiry, and the exact commands to renew, claim, or spawn a sibling.
Paying: x402 & cards
Every paid endpoint answers an unpaid request with 402 Payment Required listing
all your payment options: the x402 accepts array (USDC on Base) and a
card.checkout_url (hosted Stripe Checkout). Any plan, either rail, no account.
USDC (x402) — the keyless path
- Call any paid endpoint without payment →
402with anacceptsarray. - Your wallet signs an EIP-3009 USDC authorization for the exact amount.
- Retry the identical request with the signed payload in
X-PAYMENT. - We verify through a facilitator, do the work, then settle.
502 and your authorization simply expires unused. "Paid but no server" cannot happen.Card — the human-friendly path
Open the card.checkout_url from the 402 and pay; the server provisions on the
payment webhook and the result is available at the polling URL the checkout page shows. If
provisioning fails after a card payment, the charge is automatically refunded —
the no-refunds rule applies to running servers, never to failures.
Either rail: prepaid 1–30 days per request, running servers non-refundable (the
description field of every 402 says so). Use an Idempotency-Key header —
replays return the original response instead of charging twice. Monthly subscription billing is
also available — it needs a registered account.
Plans & pricing
| plan | specs | prepaid (usdc or card) | monthly (account) |
|---|---|---|---|
| nano | 2 vCPU · 2 GB · 40 GB NVMe | $0.40 / day | $9 / mo |
| small | 3 vCPU · 4 GB · 80 GB NVMe | $0.80 / day | $18 / mo |
| medium | 4 vCPU · 8 GB · 160 GB NVMe | $1.60 / day | $36 / mo |
Every plan is available to every payer — no registration, no minimum identity. All plans: 20 TB egress included, NVMe storage, EU datacenter (Falkenstein), port 25 blocked, hardened image (SSH-key-only, firewall, fail2ban, unattended security updates).
Accounts & claiming
Optional. Servers bought anonymously belong to the wallet (or card payment) that paid for them — that works forever. Registering an account adds conveniences:
- One API key (
am_live_…) that manages every machine you've claimed. list_serversacross your whole fleet instead of per-server IDs.- Monthly billing via card subscription instead of prepaid days.
- Higher default fair-use quotas.
Registration is an email OTP — an AgentMail inbox works, so your agent can hold the email itself.
$ curl -X POST …/v1/claim -d '{"email": "me@agentmail.to"}' # 6-digit code arrives by email $ curl -X POST …/v1/claim/verify \ -d '{"email": "me@agentmail.to", "code": "493817", "wallet": "0xAB…"}' HTTP/1.1 200 OK { "account": "acc_…", "api_key": "am_live_…", "servers_claimed": 2 }
For monthly billing, POST /v1/billing/checkout returns a Stripe Checkout URL for a
subscription. Manage or cancel any time via the Stripe customer portal; canceled subscriptions
fall back to prepaid rules at period end.
Fair use & quotas
There are no identity gates on purchasing — any payer, any plan, either rail. To keep the platform healthy we apply default quotas (active servers per wallet or account, provisioning rate) and may ask for additional verification — an email, a card — when something looks off. These are operational anti-abuse controls at our discretion, documented here for transparency; registered accounts get higher defaults. If you hit a quota, the error response says exactly what happened and what to do next.
Hard platform rules that apply to everyone: no mining, no DDoS, no spam; port 25 is blocked; abuse leads to suspension. Spawned children count against their owner's quota — propagation with brakes.
Expiry & renewal
Servers are prepaid and die honestly:
- T-24h: a preinstalled cron warns the resident agent (MOTD + file flag).
- Expiry: server marked
expired— the VM keeps running (grace). - Expiry +24h: the VM is destroyed. No invoice, no dunning, no surprise bill.
$ curl -X POST …/v1/servers/srv_kx04qd/extend -d '{"days": 7}' ← 402 (same dance) → retry with X-PAYMENT → 200 { "expires_at": "2026-06-24…" }
API reference
Base URL https://api.agentmetal.dev. Auth is either nothing + an x402 payment, or
Authorization: Bearer am_live_… for claimed accounts.
/v1/serversProvision a server. Body: {"plan": "nano|small|medium", "days": 1–30, "ssh_key"?: "ssh-ed25519 …", "via"?: "attribution"}. 402-gated. Returns 201 with ip, ssh key (once), expiry.
/v1/servers/:idStatus, plan, ip, expires_at. Free.
/v1/servers/:id/extendAdd 1–30 paid days. 402-gated. Anyone can pay to extend a server — only its owner can destroy it.
/v1/servers/:idDestroy immediately. Owner only (paying wallet or claimed account). No refund of remaining days.
/v1/claim · /v1/claim/verifyEmail OTP claim → tier 1 account + API key, wallet's servers linked.
/v1/billing/checkoutStripe Checkout session for tier 2. Requires a claimed account.
Errors teach
Agents don't browse docs sites, so every non-2xx body explains itself and names the way forward:
{
"error": "quota_exceeded",
"message": "This wallet has 2 active servers (the default fair-use quota).",
"hint": "Register an account to raise default quotas:
POST /v1/claim {\"email\": \"…\"}",
"docs": "https://agentmetal.dev/llms.txt"
}MCP server
For agents that speak Model Context Protocol — published on the official MCP Registry. The wallet key never leaves your machine; the MCP server signs locally and calls the public API.
$ claude mcp add agentmetal -e WALLET_PRIVATE_KEY=0x… -- npx @agentmetal/mcp
Tools exposed: provision_server, get_server, extend_server,
destroy_server, list_servers, claim_account.
Skills
- OpenClaw / ClawHub — install the
agentmetalskill; it teaches your agent the full flow and ships anagentmetal upCLI. Auditable, no hidden instructions. - Hermes — drop the skill file into
~/.hermes/skills/. - Claude Code / Agent SDK — a
SKILL.mdplus the MCP server above.
Every server we sell ships the skill preinstalled — the fleet knows how to grow itself, within your fair-use quota.
Terms (short version)
- Prepaid servers are non-refundable once running — restated in every 402. Failed provisions are never charged (crypto) or auto-refunded (card).
- No mining, no DDoS, no spam. Port 25 is blocked. Abuse → suspension, repeat offenders blocklisted.
- Default fair-use quotas apply; we may request verification on risk signals.
- Monthly subscriptions get standard SaaS terms and support.