Prepaid keys
A key is minted by an x402 deposit and spends down per call. No login, no account.
Endpoints
POST /v1/keyswith{ "amount_usd": 5 }: x402 deposit, returns a new keyPOST /v1/keys/topup: x402 deposit plus Bearer, adds balanceGET /v1/keys/me: balance, totals and recent usageDELETE /v1/keys/me: revoke the key and refund what is left
The console manages the same keys from the wallet that funded them: sign one free message with the wallet and every key it owns is listed, with top up and close per key.
Mint from the dashboard
The dashboard runs the whole deposit in your browser wallet: it asks the server for terms, you sign one USDC authorization for exactly the amount you typed, and the key appears. Keys are kept in your browser only.
Mint from a terminal
Any x402 client works. With the official packages:
import { privateKeyToAccount } from "viem/accounts";
import { x402Client, wrapFetchWithPayment } from "@x402/fetch";
import { ExactEvmScheme } from "@x402/evm/exact/client";
const account = privateKeyToAccount(process.env.BUYER_PRIVATE_KEY);
const client = x402Client.fromConfig({
schemes: [{ network: "eip155:5042", client: new ExactEvmScheme(account) }],
});
const pay = wrapFetchWithPayment(fetch, client);
const res = await pay("https://arcrouter.co/v1/keys", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({ amount_usd: 5 }),
});
console.log(await res.json()); // { key: "arc_sk_...", balance_usdc: 5, ... }The full key is returned exactly once. ArcRouter stores only its hash and cannot show it again.
Inspect a key
curl https://arcrouter.co/v1/keys/me -H "Authorization: Bearer $ARCROUTER_KEY"{
"key_prefix": "arc_sk_Ab12...",
"owner": "0x1234...",
"balance_usdc": 4.2187,
"deposited_usdc": 5,
"spent_usdc": 0.7813,
"totals": { "requests": 412, "prompt_tokens": 803112, "completion_tokens": 240877, "cache_hits": 96 },
"usage_daily": [{ "day": "2026-09-21", "requests": 38, "tokens": 91220, "charge_usdc": 0.0641 }],
"recent_usage": [{ "at": "...", "model": "gpt-oss-120b", "prompt_tokens": 1830, "completion_tokens": 412, "charge_usdc": 0.001313, "cached": false }]
}Close a key
DELETE /v1/keys/me revokes the key immediately and queues the remaining balance as a refund to the wallet that funded it.