Ask for CPU, RAM and a region. Get a cloud VM.
Routing finds the machine that fits your ask at the best price across providers. The meter runs per second at raw provider cost, and the machine dies on your TTL, your budget, or a DELETE.
give this to your agent
set up https://reachpad.dev/router/skill.mdThe skill covers keys, paying, provisioning, exec and teardown. An agent with a funded key takes it from there.

Build every call
Everything lives under https://router.reachpad.dev/v1 and answers JSON. Open an endpoint, pick its values, copy the call. Payment is USDC over x402, with one 5% fee at top-up; machines spend at raw provider cost, metered per second, until ttl_seconds, max_spend, or a DELETE ends them.
cpuram_gbdisk_gbregionaccessssh is a key login and a hostname; exec runs one command over HTTP, with neither.
ssh_public_keyssh-ed25519 AAAA... you@hostA placeholder. Paste your own key before running.
ttl_secondsDestroys the machine at expiry; default 4 hours. Some offers cap TTL, so shorter routes to more of them.
max_spendDestroys the machine when accrued spend reaches it. Offers that cannot run 5 minutes inside it never route.
max_rate and client_ref
max_rateDrops offers whose hourly rate is above it.
client_refA retried create carrying the same ref returns the machine it already made instead of buying a second one.
POST /v1/machines# $KEY is your API key: POST /v1/accounts mints one$ curl -sS -X POST https://router.reachpad.dev/v1/machines \ -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \ -d '{"cpu":2,"ram_gb":4,"disk_gb":8, "region":"us-west","access":["ssh"], "ssh_public_key":"ssh-ed25519 AAAA... you@host", "ttl_seconds":3600,"max_spend":"1.50"}'
:idGET /v1/machines/:id$ curl -sS https://router.reachpad.dev/v1/machines/rp_vm_abc123def4 \ -H "Authorization: Bearer $KEY"
No request fields.
GET /v1/machines$ curl -sS https://router.reachpad.dev/v1/machines \ -H "Authorization: Bearer $KEY"
:idIdempotent: a second DELETE returns the same final charge.
DELETE /v1/machines/:id$ curl -sS -X DELETE https://router.reachpad.dev/v1/machines/rp_vm_abc123def4 \ -H "Authorization: Bearer $KEY"
:idcmdA shell string; stdout and stderr come back combined.
timeout_sDefault 300, max 600. The process is killed at expiry.
POST /v1/machines/:id/exec$ curl -sS -X POST https://router.reachpad.dev/v1/machines/rp_vm_abc123def4/exec \ -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \ -d '{"cmd":"uname -a"}'
:idportHTTP and WebSocket only; the response carries the provider's own bridge URL.
POST /v1/machines/:id/ports$ curl -sS -X POST https://router.reachpad.dev/v1/machines/rp_vm_abc123def4/ports \ -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \ -d '{"port":3000}'
No request fields and no key: this is where a key comes from.
POST /v1/accounts$ curl -sS -X POST https://router.reachpad.dev/v1/accounts# -> {"id":"cus_...","api_key":"rp_key_..."} shown once; store it
No request fields.
GET /v1/credits$ curl -sS https://router.reachpad.dev/v1/credits \ -H "Authorization: Bearer $KEY"
amountUSDC over x402, $1.00 minimum. The 402 carries the payment block; retry the same request with a PAYMENT-SIGNATURE header to settle.
POST /v1/credits/topups$ curl -sS -X POST https://router.reachpad.dev/v1/credits/topups \ -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \ -d '{"method":"usdc","amount":"25.00"}'# 402: the x402 payment block for that amount
walletWallet accounts only: a key minted at /v1/accounts has no wallet and no recovery path.
GET, POST /v1/credits/recovery$ curl -sS "https://router.reachpad.dev/v1/credits/recovery?wallet=0xYourWallet"# -> a challenge message to sign with the wallet$ curl -sS -X POST https://router.reachpad.dev/v1/credits/recovery \ -H "Content-Type: application/json" \ -d '{"wallet":"0xYourWallet","message":"<the message verbatim>","signature":"0x..."}'
Make the first call.
Hand the skill to your agent, or read the reference and run the curl yourself.
set up https://reachpad.dev/router/skill.md