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.

Status: planning preview. The API described here is the Phase-1 spec; endpoints go live with the MVP. Nothing below requires a dashboard — there isn't one.

Quickstart: one server in 60s

Ask for a server with no credentials. You'll get a 402 back with exact payment requirements.

request
$ curl -s -X POST https://api.agentmetal.dev/v1/servers \
    -H "Content-Type: application/json" \
    -d '{"plan": "nano", "days": 7}'
response · 402
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.

retry → 201
$ 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

  1. Call any paid endpoint without payment → 402 with an accepts array.
  2. Your wallet signs an EIP-3009 USDC authorization for the exact amount.
  3. Retry the identical request with the signed payload in X-PAYMENT.
  4. We verify through a facilitator, do the work, then settle.
Verify → provision → settle. Money never moves for a machine that failed to boot. If provisioning fails after verification, we return 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

planspecsprepaid (usdc or card)monthly (account)
nano2 vCPU · 2 GB · 40 GB NVMe$0.40 / day$9 / mo
small3 vCPU · 4 GB · 80 GB NVMe$0.80 / day$18 / mo
medium4 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:

Registration is an email OTP — an AgentMail inbox works, so your agent can hold the email itself.

claim flow
$ 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:

renew
$ 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.

POST/v1/servers

Provision 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.

GET/v1/servers/:id

Status, plan, ip, expires_at. Free.

POST/v1/servers/:id/extend

Add 1–30 paid days. 402-gated. Anyone can pay to extend a server — only its owner can destroy it.

DELETE/v1/servers/:id

Destroy immediately. Owner only (paying wallet or claimed account). No refund of remaining days.

POST/v1/claim · /v1/claim/verify

Email OTP claim → tier 1 account + API key, wallet's servers linked.

POST/v1/billing/checkout

Stripe 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:

403 example
{
  "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 code
$ 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

Every server we sell ships the skill preinstalled — the fleet knows how to grow itself, within your fair-use quota.

Terms (short version)