Developers

API reference

AmpleRun business API, contract v3.0.0. JSON over HTTPS, UUID identifiers, RFC 3339 UTC timestamps; money and millisecond quantities are base-10 integer strings. Product concepts (quotes, verified start, retrieval window) are explained in How rentals work.

Authentication

Two credentials are accepted. A browser session (Better Auth cookie) carries the full capability of your account. A scoped API key is sent as Authorization: Bearer ark_… and carries only the scopes chosen at creation: renter, host, or both. API keys never grant admin authority and cannot bypass MFA; every /api/v1/admin/* route requires an interactive admin session with an enrolled TOTP factor.

Keys are issued from Account → API keys or with POST /api/v1/account/api-keys. Creation is a step-up action: first prove a recent sign-in with POST /api/v1/account/step-up (password, or TOTP for admins), then create the key within the grant window. The secret is returned exactly once; only its hash is stored. Withdrawals, host payouts and key revocation are step-up actions too.

export AMPLERUN_API_KEY=ark_…
curl "https://amplerun.com/api/v1/account" -H "Authorization: Bearer $AMPLERUN_API_KEY"

Unauthenticated requests get 401; a key lacking the needed scope gets 403(or 404 where existence must not leak).

Idempotency

Every mutating financial or job request requires an Idempotency-Key header holding a UUID. The key is scoped to the authenticated principal, the route and a canonical hash of the body. Replaying the same key with the same body returns the original result; the same key with a different body returns 409 IDEMPOTENCY_CONFLICT. A missing or malformed key is 422 INVALID_INPUT. Generate a fresh UUID per logical action and reuse it on retries. Both SDKs do this for you.

curl -X POST "https://amplerun.com/api/v1/jobs/<id>/stop" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"reason":"done"}'

Quote → reserve → access

  1. Pick a template and an offer. GET /api/v1/templates lists published images with their pinned image_digest; GET /api/v1/offers?template_id=… lists admitted machines that fit it.
  2. Quote. POST /api/v1/quotes with offer_id, image_digest, duration_limit_s and budget_micro returns an immutable quote that expires after 60 seconds.
  3. Reserve. POST /api/v1/jobs with quote_id and your ssh_public_key atomically holds the budget and the machine, answering 202 with a job_id in state RESERVED. An expired quote, changed manifest or insufficient spendable balance is rejected without a partial hold.
  4. Wait for verified readiness. Poll GET /api/v1/jobs/{id} or read GET /api/v1/jobs/{id}/events. The meter starts at verified readiness, not at container creation.
  5. Connect. GET /api/v1/jobs/{id}/access returns the SSH endpoint, the host-key fingerprint to verify, and a ready-made command. Forward the template's port to your machine:
    ssh -L 8888:127.0.0.1:8888 -p <external_port> tenant@<external_host>
    # or let the CLI build it from the access material:
    amplerun tunnel <job-id> --template qwen3-8b-awq          # prints the command
    amplerun tunnel <job-id> --template qwen3-8b-awq --exec   # runs it
  6. Stop. POST /api/v1/jobs/{id}/stop. After a confirmed stop the access mode becomes retrieval-read-only for a limited window; the receipt is at GET /api/v1/billing/receipts/{job}.

SDK quickstarts

The TypeScript SDK is on npm (@amplerun/sdk). The Python SDK is pre-release. Sources: packages/sdk-ts and sdk/python in the repository.

TypeScript

npm i @amplerun/sdk

import { createAmpleRun, AmpleRunError } from "@amplerun/sdk";
const ar = createAmpleRun({ apiKey: process.env.AMPLERUN_API_KEY! });

const { items: templates } = await ar.templates.list({ kind: "model" });
const { items: offers } = await ar.offers.list({ template_id: templates[0]!.template_id });
const quote = await ar.quotes.create({
  offer_id: offers[0]!.offer_id,
  image_digest: templates[0]!.image_digest,
  duration_limit_s: 7200,
  budget_micro: "5000000",
});
const job = await ar.jobs.create({ quote_id: quote.quote_id, ssh_public_key: "ssh-ed25519 AAAA…" });
const access = await ar.jobs.access(job.job_id);

One method per operation; mutating calls accept an optional trailing { idempotencyKey }; failures throw AmpleRunError { status, code, message, retryable, requestId }.

Python

Not on PyPI yet. Until it is, call the REST API from Python; the SDK will look like this.

pip install amplerun   # not on PyPI yet
export AMPLERUN_API_KEY=ark_…

from amplerun import AmpleRun
ar = AmpleRun()  # api_key from $AMPLERUN_API_KEY
offers = ar.search_offers(template_id="qwen3-8b-awq")
job = ar.deploy("qwen3-8b-awq", offer_id=offers["items"][0]["offer_id"], hours=2)  # quote -> job
print(ar.tunnel(job["job_id"], template="qwen3-8b-awq"))

AsyncAmpleRun mirrors every method as a coroutine. Namespaces match the TypeScript SDK.

AI agents (MCP)

@amplerun/mcp is a local MCP server for agents such as Claude Code. It can list templates, search offers, price a rental, rent within a budget you set, read state and access, stop a rental and read your balance. It is read-only unless started with AMPLERUN_MCP_ALLOW_SPEND=1, and every rental needs an explicit budget_micro, which is a hard cap. Your API key stays on your machine and is sent only to the AmpleRun API.

claude mcp add amplerun -e AMPLERUN_API_KEY=ark_… -- npx -y @amplerun/mcp

On npm: npx -y @amplerun/mcp. Or skip the install and use the hosted endpoint in the agents guide. Setup for Claude Desktop and other MCP clients, the tool list and the safety model are in the @amplerun/mcp README.

CLI reference

amplerun ships with the Python package. Global options: --json (compact output, errors as the wire envelope on stderr, exit 1), --api-key / $AMPLERUN_API_KEY, --base-url / $AMPLERUN_BASE_URL. Every SDK method is a subcommand with the same name, hyphenated; JSON-object arguments are passed as JSON text.

Commands
CommandDoes
amplerun search-offers [--template-id] [--model] [--gpu-count] [--max-rate-micro-per-hour]Alias for offers list.
amplerun deploy <template> [--offer-id] [--gpu] [--hours] [--budget-micro] [--ssh-public-key]Quote then reserve in one call; picks the first fitting offer unless --offer-id is given; budget defaults to rate × hours; SSH key defaults to ~/.ssh/id_ed25519.pub or id_rsa.pub.
amplerun tunnel <job-id> [--template] [--local-port] [--exec]Print (or --exec run) the ssh -L port-forward command from jobs access; port from the template's exposes, else 8888.
amplerun templates listList published templates (public) — GET /api/v1/templates
amplerun templates get <template-id>Get one published template (public) — GET /api/v1/templates/{templateId}
amplerun offers listList admitted offers (public) — GET /api/v1/offers
amplerun offers get <offer-id>Get one offer (public) — GET /api/v1/offers/{id}
amplerun quotes create <offer-id> <duration-s> <budget-micro> (--template-id | --image-digest)Create immutable quote (verified renter) — POST /api/v1/quotes
amplerun jobs create <quote-id> <ssh-public-key>Reserve job from quote (quote owner) — POST /api/v1/jobs
amplerun jobs listList own jobs (renter owner/admin) — GET /api/v1/jobs
amplerun jobs get <job-id>Job status, cumulative charge, funded-through (owner/admin) — GET /api/v1/jobs/{id}
amplerun jobs events <job-id>Sequenced job events (owner/admin); logs sanitized and bounded — GET /api/v1/jobs/{id}/events
amplerun jobs access <job-id>Current endpoint, SSH host-key fingerprint and command (renter owner) — GET /api/v1/jobs/{id}/access
amplerun jobs stop <job-id> [--reason]Stop job (renter owner/admin); repeat is idempotent — POST /api/v1/jobs/{id}/stop
amplerun jobs extend-budget <job-id> …Append funded budget amendment (renter owner) — POST /api/v1/jobs/{id}/budget-extension
amplerun jobs rerun <job-id>Fresh quote parameters (renter owner); never launches/spends automatically — POST /api/v1/jobs/{id}/rerun
amplerun account getProfile/security metadata (self); no password/token hashes — GET /api/v1/account
amplerun account exportData export (self, recent re-auth) — POST /api/v1/account/export
amplerun account request-deletionRetention-aware deletion request (self, recent re-auth); required ledger evidence preserved under disclosed policy — POST /api/v1/account/deletion-request
amplerun account sessions listSession metadata (self) — GET /api/v1/account/sessions
amplerun account sessions revoke <session-id>Revoke one of the caller's own sessions (self; interactive sessions only) — DELETE /api/v1/account/sessions/{id}
amplerun account api-keys listList API keys (self) — GET /api/v1/account/api-keys
amplerun account api-keys create <label> <scopes…>Create API key (self, step-up) — POST /api/v1/account/api-keys
amplerun account api-keys revoke <key-id>Revoke API key (self, step-up) — DELETE /api/v1/account/api-keys/{id}
amplerun wallets listList wallet bindings (verified self) — GET /api/v1/wallets
amplerun wallets nonceSIWE nonce (verified self, re-auth) — POST /api/v1/wallets/nonce
amplerun wallets link <address> <siwe-message> <signature>Link wallet via SIWE proof (verified self, re-auth) — POST /api/v1/wallets/link
amplerun wallets unlink <binding-id>Unlink wallet (verified self, re-auth) — DELETE /api/v1/wallets/{binding_id}
amplerun wallets select-payout-destination <binding-id> — POST /api/v1/wallets/{binding_id}/payout-destination
amplerun funding-intents create <wallet-binding-id> <amount-micro>Create funding intent (bound wallet owner) — POST /api/v1/funding-intents
amplerun funding-intents claim <intent-id> <tx-hash> <log-index>Claim funding intent (intent owner) — POST /api/v1/funding-intents/{id}/claim
amplerun billing getBalance summary (self/admin); spendable/held/pending/disputed/withdrawable separately, plus 30-day spend and active hold — GET /api/v1/billing
amplerun billing entriesItemized ledger entries (self/admin) — GET /api/v1/billing/entries
amplerun billing receipt <job-id>Itemized invoice/receipt and supplier information for a job (self/admin) — GET /api/v1/billing/receipts/{job}
amplerun billing withdraw <amount-micro> <wallet-binding-id> <destination-version>Withdraw to an address (code; a new address is confirmed by an email link) — POST /api/v1/withdrawals
amplerun hosts enrollment-tokenHost enrollment token (verified host account) — POST /api/v1/hosts/enrollment-tokens
amplerun hosts earningsEarnings (host owner): earned, disputed, payable, requested, settled; gross vs snapshotted fee; no utilization guess — GET /api/v1/hosts/earnings
amplerun hosts request-payout <amount-micro> <wallet-binding-id> <destination-version>Request a payout to an address (host owner; same model as withdrawals) — POST /api/v1/hosts/payouts
amplerun hosts machines listList own machines (host owner/admin) — GET /api/v1/hosts/machines
amplerun hosts machines get <machine-id>Machine detail: compatibility findings, current offer/job, observed metrics, drain state (host owner/admin) — GET /api/v1/hosts/machines/{id}
amplerun hosts machines publish-offer <machine-id> <body-json>Publish versioned future offer (host owner) — POST /api/v1/hosts/machines/{id}/offer
amplerun hosts machines list-machine <machine-id>List machine (host owner); admission checks apply — POST /api/v1/hosts/machines/{id}/list
amplerun hosts machines drain <machine-id>Drain machine (host owner); stops new bookings, never kills an active job or retrieval cleanup — POST /api/v1/hosts/machines/{id}/drain
amplerun hosts machines unlist <machine-id>Unlist idle offer (host owner); never kills an active job or retrieval cleanup — POST /api/v1/hosts/machines/{id}/unlist
amplerun tickets listList own tickets (opener); cursor paged, ordered by id — GET /api/v1/tickets
amplerun tickets create <category> <text>Open support ticket (participant/admin); secrets redacted, ownership checked — POST /api/v1/tickets
amplerun tickets get <ticket-id>Ticket thread (participant/admin); participants see only their own permitted thread — GET /api/v1/tickets/{id}
amplerun tickets add-message <ticket-id> <text>Append message (participant/admin) — POST /api/v1/tickets/{id}/messages
amplerun admin usersAdmin user view (Admin); immutable references — GET /api/v1/admin/users
amplerun admin machinesAdmin machine view (Admin) — GET /api/v1/admin/machines
amplerun admin jobsAdmin job view (Admin) — GET /api/v1/admin/jobs
amplerun admin ledgerAdmin ledger view (Admin) — GET /api/v1/admin/ledger
amplerun admin payoutsAdmin payout and withdrawal view (Admin); rows carry kind, and unsigned requests the automatic path holds carry hold_code/hold_reason — GET /api/v1/admin/payouts
amplerun admin ticketsAdmin ticket view (Admin) — GET /api/v1/admin/tickets
amplerun admin auditAdmin audit view (Admin) — GET /api/v1/admin/audit
amplerun admin reconciliationAdmin reconciliation view (Admin); unexplained differences >0 micro pause new paid admissions/payouts — GET /api/v1/admin/reconciliation
amplerun admin analyticsAdmin analytics (Admin); committed capacity, paid time, GMV, fees, costs, refunds and repeat users separated; unavailable inputs stay null — GET /api/v1/admin/analytics
amplerun admin publish-template <template-id> <reason>Publish template (Admin); audit event; refused unless a qualification record binds it to an admitted machine — POST /api/v1/admin/templates/{templateId}/publish
amplerun admin approve-machine <machine-id> <reason> <expected-version>Approve machine (Admin); reason + expected version; in-flight work gets explicit policy, not silent deletion — POST /api/v1/admin/machines/{id}/approve
amplerun admin quarantine-machine <machine-id> <reason> <expected-version>Quarantine machine (Admin); reason + expected version; in-flight work gets explicit policy, not silent deletion — POST /api/v1/admin/machines/{id}/quarantine
amplerun admin refund <job-id> <amount-micro> <reason> <evidence…>Refund (Admin+recentMFA); evidence/reason, exact immutable manifest or compensating journal; no raw balance-edit endpoint — POST /api/v1/admin/refunds
amplerun admin approve-payout <payout-id> <manifest-hash> <reason>Approve payout manifest (Admin+recentMFA); exact immutable manifest hash; destination change invalidates approval — POST /api/v1/admin/payouts/{id}/approve
amplerun admin submit-signed-transaction <payout-id> <raw-transaction>Submit signer-produced raw transaction (Admin+recentMFA); verified to match approved manifest and signer; returns deterministic hash — POST /api/v1/admin/payouts/{id}/signed-transaction
amplerun admin set-admissions <enabled> <reason>Pause/resume admissions (Admin+recentMFA); pauses new jobs/credits as appropriate, never abrupt tenant termination — POST /api/v1/admin/admissions
amplerun health liveLiveness (public minimal) — GET /api/v1/health/live
amplerun health readyReadiness (public minimal); schema/DB/worker/clock with redacted degraded reasons; no internal topology leakage — GET /api/v1/health/ready
amplerun statusPublic status (minimal) — GET /api/v1/status

Errors

Every error is a JSON envelope; stack traces and secrets never appear. retryable: true means the same request may succeed later (for example 503 when a money or provider dependency is unavailable). Quote request_id when opening a support case.

{ "error": { "code": "IDEMPOTENCY_CONFLICT", "message": "…", "retryable": false, "request_id": "<uuid>" } }
  • 401 unauthenticated · 403 forbidden (missing scope, step-up or role) · 404 not found or hidden
  • 409 conflict (idempotency, budget, machine state) · 422 invalid input
  • 503 unavailable money/provider state, retryable: true

Reference

catalog

GET /api/v1/offersList admitted offers (public)

Listed offers on available, admitted machines with a heartbeat in the last 90 seconds; only these can be reserved. Server-side filters are model, gpu_count, max_rate_micro_per_hour, verification_level, continent and template_id; sort defaults to price_asc, and near puts one continent's machines first. There is no VRAM, region, RAM, disk or bandwidth filter: each item carries vram_bytes, region, ram_bytes and disk_bytes when measured, for client-side filtering. With template_id (D-19(c)) every item carries a server-computed fit object. No cached public responses.

Auth
Public — no credential
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
cursorquerystringnoOpaque pagination cursor from a previous response.
limitqueryintegerno
template_idqueryUUIDnoCompute per-offer fit against this template's vram_fit (D-19(c)). The template's `id` (UUID), not its slug; resolve a slug with GET /api/v1/templates/{templateId}. Unknown or unpublished template -> 404, a slug -> 422.
fits_forquery"all"noAdditive. `all` adds fits_template_ids to every item, the ids of every published template that fits that offer under the same rule as template_id, in one read. Any other value -> 422.
sortquery"price_asc" | "price_desc" | "vram_desc" | "reliability_desc" | "uptime_desc" | "newest" | "verification" | "net_desc" | "tflops_desc" | "ai_speed_desc"noKeyset sort order; an unknown value falls back to price_asc.
verification_levelquery"unverified" | "auto_verified" | "manually_verified"noOnly machines at exactly this verification level.
include_unverifiedquerybooleannoAlso list machines that have not passed admission yet.
min_bandwidth_mbpsqueryintegernonetfacts lane. Only machines whose MEASURED download rate is at least this; machines that never measured are excluded (they cannot claim a rate).
max_rate_micro_per_hourqueryMicroAmountnoOnly offers whose total machine rate is at or below this amount.
gpu_countqueryintegernoOnly offers whose machine manifest lists at least this many devices.
modelquerystringnoCase-insensitive substring match on the first device model in the manifest.
tierquery"container" | "inference"noOnly machines of this tier (D-23).
backendquery"cuda" | "rocm" | "sycl" | "vulkan" | "metal"noOnly machines with a device serving this backend.
continentqueryContinentFilternoOnly machines on this continent (americas = NA + SA). Machines with an unknown location are excluded. Any other value -> 422.
nearqueryContinentFilternoOrder this continent's machines first (lower latency), then by sort. Keeps every other machine. Any other value -> 422.
Responses
  • 200 — Page of offer summaries. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/offers"
GET /api/v1/offers/{id}Get one offer (public)
Auth
Public — no credential
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Responses
  • 200 — Offer summary. (OfferSummary)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/offers/<id>"
GET /api/v1/templatesList published templates (public)

D-19(c). Cursor paged; filters kind and min_vram_bytes (templates whose vram_fit.min_vram_bytes <= the given value). Only published templates (bound to at least one admitted machine by a qualification record) are listed. No cached public responses.

Auth
Public — no credential
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
cursorquerystringnoOpaque pagination cursor from a previous response.
limitqueryintegerno
kindquery"model" | "classical" | "custom"no
min_vram_bytesqueryDecimalStringnoReturn templates that fit a device with this much VRAM.
backendquery"cuda" | "rocm" | "sycl" | "vulkan" | "metal"noOnly templates with a built runtime for this backend ("Works on").
Responses
  • 200 — Page of templates. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/templates"
GET /api/v1/templates/{templateId}Get one published template (public)
Auth
Public — no credential
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
templateIdpathstringyesTemplate UUID or its slug (spec.template_id, e.g. qwen3-8b-awq); unpublished -> 404.
Responses
  • 200 — Template. (Template)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/templates/<templateId>"

jobs

POST /api/v1/quotesCreate immutable quote (verified renter)

Returns an immutable quote with 60s expiry, terms version, machine manifest hash and total rate. Refresh stale catalog quotes before charging. Quoting is free and holds nothing; POST /api/v1/jobs reserves. The Idempotency-Key is not deduplicated on this route, so a retry returns a fresh quote. 409 CONFLICT when the offer's machine is not admitted: an unverified listing (OfferSummary admitted false) is shown but cannot be quoted or reserved until it passes qualification.

Auth
Session cookie or API key with the renter scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
offer_idUUIDyes
image_digestImageDigestnoA published template's image, or a custom public image pinned by digest.
image_refstringnoCustom public image by tag or digest ([registry/]repository[:tag][@sha256:...]); the server pins it to a digest at quote time.
duration_limit_sintegeryesMaximum runtime in seconds, metered from verified readiness.
budget_microMicroAmountyesSpending cap: the job is never charged more than this.
template_idUUIDnoD-19(c): published template; the server sets image_digest from it and the offer must fit, else 422. Mutually exclusive with image_digest. The template's `id` (UUID), not its slug.
asset"USDC" | "USDT"noAdditive. Settlement asset whose balance the reservation holds; unknown values are 422.
Responses
  • 201 — Immutable quote. (Quote)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/quotes" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"offer_id":"8b0c2f4e-1d3a-4c5b-9e6f-7a8b9c0d1e2f","template_id":"a35d15fe-ab57-4283-87f8-a00528d1d631","duration_limit_s":7200,"budget_micro":"1000000"}'
GET /api/v1/jobsList own jobs (renter owner/admin)
Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
cursorquerystringnoOpaque pagination cursor from a previous response.
limitqueryintegerno
Responses
  • 200 — Page of jobs. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/jobs" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
POST /api/v1/jobsReserve job from quote (quote owner)

Atomically holds budget, reserves machine, increments fence and queues start. Rejects expired quote (409 QUOTE_EXPIRED), changed manifest, unavailable or not admitted machine, or insufficient spendable funds (409 INSUFFICIENT_FUNDS) without partial holds. Replaying the same Idempotency-Key with the same body returns the original job, so a timed-out request is safe to retry; the same key with another body is 409 IDEMPOTENCY_CONFLICT and reserves nothing.

Auth
Session cookie or API key with the renter scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
quote_idUUIDyes
ssh_public_keystringnoOne-line OpenSSH public key installed for the tenant user. Optional: without it the server installs a generated key whose private half it discards, so SSH is off for that rental (model rentals chat through /jobs/{id}/openai/v1).
Responses
  • 202 — Job reserved. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/jobs" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"quote_id":"0c1d2e3f-4a5b-4c6d-8e7f-8091a2b3c4d5","ssh_public_key":"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGVxYW1wbGVrZXlfbm90X3JlYWw you@laptop"}'
GET /api/v1/jobs/{id}Job status, cumulative charge, funded-through (owner/admin)

Poll this after POST /api/v1/jobs. States run RESERVED -> STARTING -> RUNNING (verified ready; the meter starts here) -> STOPPING -> STOPPED -> CLEANING -> CLOSED, or FAILED / RECONCILING. GET /api/v1/jobs/{id}/access answers only while RUNNING (execution) or, for a limited window, after STOPPED (read-only retrieval); other states are 403.

Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Responses
  • 200 — Job detail. (Job)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/jobs/<id>" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
GET /api/v1/jobs/{id}/eventsSequenced job events (owner/admin); logs sanitized and bounded
Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
cursorquerystringnoOpaque pagination cursor from a previous response.
limitqueryintegerno
Responses
  • 200 — Page of sequenced events. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/jobs/<id>/events" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
GET /api/v1/jobs/{id}/accessCurrent endpoint, SSH host-key fingerprint and command (renter owner)

Execution access only while ready/running; STOPPED retrieval access is read-only, time-limited and explicitly labeled. No execution endpoint before verified readiness.

Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Responses
  • 200 — Access material. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/jobs/<id>/access" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
GET /api/v1/jobs/{id}/openai/v1/modelsOpenAI-compatible relay to a running model rental, list models (renter owner/admin)

One of four relay paths (models, chat/completions, completions, embeddings); any other path under /openai/v1 is 404. The server forwards to the rental's own leased http endpoint and adds the per-job key; client cookies and Authorization never reach the host. 409 unless the job is RUNNING with a model endpoint. Bodies over 1 MiB are 413. Rate-limited per account. Point any OpenAI client here as its base URL with an AmpleRun API key (renter scope).

Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Responses
  • 200 — The engine's model list, passed through. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/jobs/<id>/openai/v1/models" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
POST /api/v1/jobs/{id}/openai/v1/chat/completionsOpenAI-compatible relay, chat completions (renter owner/admin)

Same rules as the models path. With stream:true the response is text/event-stream, streamed unbuffered.

Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
idpathUUIDyes

Request body (application/json): object

Responses
  • 200 — The engine's response, passed through (JSON, or SSE when stream:true). (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/jobs/<id>/openai/v1/chat/completions" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"Qwen/Qwen3-32B-AWQ","stream":true,"messages":[{"role":"user","content":"hello"}]}'
POST /api/v1/jobs/{id}/openai/v1/completionsOpenAI-compatible relay, text completions (renter owner/admin)

Same rules as the models path; stream:true streams text/event-stream.

Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
idpathUUIDyes

Request body (application/json): object

Responses
  • 200 — The engine's response, passed through. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/jobs/<id>/openai/v1/completions" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '"string"'
POST /api/v1/jobs/{id}/openai/v1/embeddingsOpenAI-compatible relay, embeddings (renter owner/admin)

Same rules as the models path.

Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
idpathUUIDyes

Request body (application/json): object

Responses
  • 200 — The engine's response, passed through. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/jobs/<id>/openai/v1/embeddings" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '"string"'
POST /api/v1/jobs/{id}/stopStop job (renter owner/admin); repeat is idempotent
Auth
Session cookie or API key with the renter scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
reasonstringyes
Responses
  • 202 — STOPPING or original terminal result. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/jobs/<id>/stop" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"reason":"training finished"}'
POST /api/v1/jobs/{id}/budget-extensionAppend funded budget amendment (renter owner)

Idempotent. Appends one immutable amendment plus hold atomically; keeps original rate and snapshotted host-availability ceiling; bumps budget_version. Rejects once STOPPING begins. D-16 — budget_version changes only with a committed funding amendment.

Auth
Session cookie or API key with the renter scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
additional_budget_microMicroAmountyesMoney in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float.
new_duration_limit_sintegeryes
expected_job_versionDecimalStringyesUnsigned base-10 integer as string; never a float.
expected_budget_versionDecimalStringyesUnsigned base-10 integer as string; never a float.
Responses
  • 202 — Amendment committed; returns new budget_version. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/jobs/<id>/budget-extension" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"additional_budget_micro":"5000000","new_duration_limit_s":1,"expected_job_version":"1","expected_budget_version":"1"}'
POST /api/v1/jobs/{id}/rerunFresh quote parameters (renter owner); never launches/spends automatically
Auth
Session cookie or API key with the renter scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Responses
  • 200 — Fresh quote parameters. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/jobs/<id>/rerun" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)"

account

GET /api/v1/auth/providersConfigured social sign-in providers (public names only)
Auth
Public — no credential
Idempotency-Key
not used
Responses
  • 200 — Currently composed providers; credentials are never returned. (object)
Example
curl -X GET "https://amplerun.com/api/v1/auth/providers"
GET /api/v1/accountProfile/security metadata (self); no password/token hashes
Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Responses
  • 200 — Account profile. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/account" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
PATCH /api/v1/accountSet which console is emphasized (self)

role_preference is rent, host or both. It changes navigation emphasis only. Renting and hosting stay available. Completes role onboarding.

Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Request body (application/json)
PropertyTypeRequiredDescription
role_preference"rent" | "host" | "both"yes
Responses
  • 200 — Saved. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X PATCH "https://amplerun.com/api/v1/account" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"role_preference":"rent"}'
GET /api/v1/account/delegationsFleet delegations this account owns or holds
Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Responses
  • 200 — Delegation rows
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/account/delegations" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
POST /api/v1/account/delegationsGrant a fleet delegation, or request one

The owner sends agent_account_id and the grant is approved immediately. The agent sends owner_account_id and the row stays pending until the owner approves. Scopes are machines:enroll, machines:read, offer:price, machines:listing, machines:status, earnings:read, payouts:read. Withdrawals, wallets, payout destinations and machine transfer are refused.

Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Request body (application/json)
PropertyTypeRequiredDescription
agent_account_idstringno
owner_account_idstringno
scopesstring[]no
Responses
  • 201 — Owner grant
  • 202 — Agent request
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/account/delegations" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"agent_account_id":"string","owner_account_id":"string","scopes":["string"]}'
POST /api/v1/account/delegations/{id}/approveOwner approves a pending fleet delegation
Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Responses
  • 200 — Approved.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/account/delegations/<id>/approve" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
POST /api/v1/account/delegations/{id}/revokeOwner or agent revokes a fleet delegation
Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Responses
  • 200 — Revoked. Repeating a revoke stays revoked.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/account/delegations/<id>/revoke" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
GET /api/v1/account/sessionsSession metadata (self)
Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Responses
  • 200 — Active sessions.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/account/sessions" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
DELETE /api/v1/account/sessions/{id}Revoke one of the caller's own sessions (self; interactive sessions only)

Deleting the session row is the revocation. A session the caller does not own is indistinguishable from a missing one (404). API-key callers have no sessions (404).

Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
idpathstringyesBetter Auth session id (not a UUID).
Responses
  • 204 — Revoked.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X DELETE "https://amplerun.com/api/v1/account/sessions/<id>" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
GET /api/v1/account/api-keysList API keys (self)
Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Responses
  • 200 — API key metadata; secrets never re-shown. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/account/api-keys" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
POST /api/v1/account/api-keysCreate API key (self, step-up)

Label, expiry and explicit renter/host scopes. Secret revealed once; only hash stored. No admin scopes or key-based MFA bypass.

Auth
Session cookie or API key with the renter scope; recent step-up (POST /api/v1/account/step-up) required
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
labelstringyes
expires_atRfc3339Utcno
scopes"renter" | "host"[]yes
Responses
  • 201 — API key created; secret returned exactly once. (unknown)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/account/api-keys" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"label":"string","expires_at":"2026-09-25T12:00:00Z","scopes":["renter"]}'
DELETE /api/v1/account/api-keys/{id}Revoke API key (self, step-up)
Auth
Session cookie or API key with the renter scope; recent step-up (POST /api/v1/account/step-up) required
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Responses
  • 204 — Revoked.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X DELETE "https://amplerun.com/api/v1/account/api-keys/<id>" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)"
GET /api/v1/account/integrations/{provider}Third-party token status (self)

Whether a per-user token is on file for this provider; never the value.

Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
providerpath"huggingface"yes
Responses
  • 200 — Token status. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/account/integrations/<provider>" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
POST /api/v1/account/integrations/{provider}Set/replace third-party token (self, step-up)

Encrypted at rest the same way as an admin secret setting; never re-shown once saved.

Auth
Session cookie or API key with the renter scope; recent step-up (POST /api/v1/account/step-up) required
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
providerpath"huggingface"yes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
tokenstringyes
Responses
  • 201 — Token stored.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/account/integrations/<provider>" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"token":"string"}'
DELETE /api/v1/account/integrations/{provider}Remove third-party token (self, step-up)
Auth
Session cookie or API key with the renter scope; recent step-up (POST /api/v1/account/step-up) required
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
providerpath"huggingface"yes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Responses
  • 204 — Removed.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X DELETE "https://amplerun.com/api/v1/account/integrations/<provider>" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)"
POST /api/v1/account/exportData export (self, recent re-auth)
Auth
Session cookie or API key with the renter scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Responses
  • 202 — Export job persisted.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/account/export" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)"
POST /api/v1/account/deletion-requestRetention-aware deletion request (self, recent re-auth); required ledger evidence preserved under disclosed policy
Auth
Session cookie or API key with the renter scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Responses
  • 202 — Deletion request persisted.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/account/deletion-request" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)"

agents

POST /api/v1/agents/accounts/challengeStep 1 of agent self-registration; an EIP-4361 message to sign (unauthenticated)

Returns a server-written Sign-In with Ethereum (EIP-4361) message for this address: this deployment's domain and URI, Base (chain 8453), a single-use nonce and a five-minute expiry. Its statement carries the Terms version the agent accepts by signing. Sign it exactly as returned (EIP-191 personal_sign) with the wallet's key. EOA wallets only. Rate-limited per source address and per wallet. Not /api/v1/agents/enroll, which enrolls host machines.

Auth
Public — no credential
Idempotency-Key
not used
Request body (application/json)
PropertyTypeRequiredDescription
addressstringyes
Responses
  • 200 — The message to sign. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/agents/accounts/challenge" \
  -H "Content-Type: application/json" \
  -d '{"address":"string"}'
POST /api/v1/agents/accountsStep 2 of agent self-registration; the signed message returns an agent account and an API key (unauthenticated)

Verifies the signed challenge (single use, unexpired, byte-for-byte the message the server wrote, signed by its address) and opens an account tagged account_kind agent, with the wallet as its verified linked wallet and payout destination. Returns an API key with the renter and host scopes unless scopes names a subset, shown once. The same wallet again returns the same account (200) and a new key, only with a fresh signature. There is no free credit: fund the account (POST /api/v1/funding-intents) before renting. Refused: a replayed, expired or tampered message (401); a wallet linked to or unlinked from another account, or an account with an authenticator app (409); a suspended account's wallet (403). Rate-limited per source address and per wallet (429). Audited.

Auth
Public — no credential
Idempotency-Key
not used
Request body (application/json)
PropertyTypeRequiredDescription
messagestringyesThe challenge message
signaturestringyes0x-prefixed EIP-191 signature.
agentobjectyesSelf-declared and unverified; shown to operators, never used for authorization.
scopes"renter" | "host"[]no
Responses
  • 200 — The agent's account (201 new, 200 existing) and a new API key. The secret is shown only here. (object)
  • 201 — The agent's account (201 new, 200 existing) and a new API key. The secret is shown only here. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/agents/accounts" \
  -H "Content-Type: application/json" \
  -d '{"message":"string","signature":"string","agent":{"name":"string","vendor":"string","model":"string","operator_contact":"string","homepage":"string"},"scopes":["renter"]}'

wallets

GET /api/v1/walletsList wallet bindings (verified self)
Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Responses
  • 200 — Wallet bindings. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/wallets" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
POST /api/v1/wallets/nonceSIWE nonce (verified self, re-auth)

Five-minute single-use nonce with exact origin/URI, chain, issued/expiration time and server-session binding.

Auth
Session cookie or API key with the renter scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Responses
  • 201 — Single-use nonce. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/wallets/nonce" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)"
POST /api/v1/wallets/linkLink wallet via SIWE proof (verified self, re-auth)

Binds chain/address to account; nonce consumed once. UNIQUE(chain_id,address) across accounts.

Auth
Session cookie or API key with the renter scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
chain_idconst 8453yes
addressEvmAddressyes
siwe_messagestringyes
signaturestringyes
Responses
  • 201 — Binding created. (WalletBinding)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/wallets/link" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"chain_id":8453,"address":"0x1111111111111111111111111111111111111111","siwe_message":"string","signature":"string"}'
DELETE /api/v1/wallets/{binding_id}Unlink wallet (verified self, re-auth)

Blocks future use but retains historical attribution and pending-intent versions; old transfers cannot become claimable by another account.

Auth
Session cookie or API key with the renter scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
binding_idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Responses
  • 204 — Unlinked.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X DELETE "https://amplerun.com/api/v1/wallets/<binding_id>" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)"

billing

POST /api/v1/funding-intentsCreate funding intent (bound wallet owner)

Chain 8453/USDC to treasury address/token, exact network, expiry and noncustodial-send instructions. No private key collection.

Auth
Session cookie or API key with the renter scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
wallet_binding_idUUIDyes
amount_microMicroAmountyesMoney in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float.
Responses
  • 201 — Funding intent. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/funding-intents" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"wallet_binding_id":"3f0e2a55-8c1b-4d2e-9a6f-0b7c1d2e3f40","amount_micro":"5000000"}'
GET /api/v1/funding-intents/{id}Funding intent state (intent owner)

Read-only; never claims or credits. While a recorded transfer awaits finality, finalized_block_number is the RPC's finalized head (null when the RPC is unreachable). No time estimate is given.

Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Responses
  • 200 — Funding intent. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/funding-intents/<id>" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
POST /api/v1/funding-intents/{id}/claimClaim funding intent (intent owner)

Verifies ERC20 Transfer sender=bound wallet, recipient=treasury, exact token/chain, successful receipt, canonical block and finalized head; PENDING/CONFIRMED/EXCEPTION. A transfer from a wallet not bound to this account is 403 and records nothing on the intent; a transfer not yet visible is PENDING and records nothing. Provider error pauses credit; never zero balance and never success.

Auth
Session cookie or API key with the renter scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
tx_hashstringyes
log_indexintegeryes
Responses
  • 202 — Claim state. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/funding-intents/<id>/claim" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"tx_hash":"string","log_index":0}'
GET /api/v1/billingBalance summary (self/admin); spendable/held/pending/disputed/withdrawable separately, plus 30-day spend and active hold
Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
assetquery"USDC" | "USDT"no
Responses
  • 200 — Balances. (BalanceSet)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/billing" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
GET /api/v1/billing/deposit-addressThis account's own deposit address (the same on every listed network, created on first call), plus recent deposits

Send USDC or USDT, or the network's own coin (ETH, POL, BNB, AVAX), to `address` on any network in `networks`, from anywhere: an exchange or any wallet. No wallet linking and no transaction hash are needed. Each stablecoin transfer is credited exactly once, after that network's finality, 1:1. A native coin is credited in USD at the Chainlink price at finality minus `native.spread_bps`. The address never changes. Funds sent on a network not listed in `networks` are not credited. `deposits` lists recent deposits: SEEN (on chain, waiting for finality; display only), CREDITED, or HELD (arrived but over a balance cap; credited automatically once there is room).

Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
livequery"0" | "1"no`0` answers from the database alone, without reading each network's RPC: `live` is false, every EVM network's status is UNAVAILABLE (not read), and there are no SEEN rows or native quotes. Much faster; use it to show the address, then ask again without it for live status.
Responses
  • 200 — The deposit address and recent deposits. (DepositAddress)
  • 503 — Deposit addresses are not configured on this server.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/billing/deposit-address" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
GET /api/v1/billing/entriesItemized ledger entries (self/admin)
Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
cursorquerystringnoOpaque pagination cursor from a previous response.
limitqueryintegerno
Responses
  • 200 — Page of ledger entries with immutable external references and evidence links.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/billing/entries" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
GET /api/v1/billing/receipts/{job}Itemized invoice/receipt and supplier information for a job (self/admin)
Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
jobpathUUIDyes
Responses
  • 200 — Receipt. charge_micro = fee_micro + host_micro, as posted to the ledger. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/billing/receipts/<job>" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
POST /api/v1/billing/x402/top-upTop up the prepaid balance with an x402 payment (agents)

x402 v2, scheme exact: an EIP-3009 transferWithAuthorization of native USDC on Base (eip155:8453) straight to the treasury. Without a payment header the answer is 402 with PaymentRequirements (also base64 in the PAYMENT-REQUIRED header). Sign them and repeat the same request with PAYMENT-SIGNATURE (the v1 header name X-PAYMENT is accepted too). The payment itself authorizes the top-up; no Idempotency-Key is needed, and repeating the same payment returns the first result. The credit goes to the API key's account whatever wallet pays, and lands once, after Base finality (state PENDING_FINALITY until then). A 202 means the settlement is broadcast but not mined yet; repeat the same request. 404 while the operator has not enabled x402.

Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
amount_microqueryDecimalStringyesTop-up amount in micro-USDC ("5000000" = 5 USDC).
PAYMENT-SIGNATUREheaderstringnoBase64 JSON x402 v2 PaymentPayload.
X-PAYMENTheaderstringnoSame as PAYMENT-SIGNATURE (x402 v1 header name).
Responses
  • 200 — Settled on chain and pinned to this account; credited now (CONFIRMED) or after finality (PENDING_FINALITY). PAYMENT-RESPONSE and X-PAYMENT-RESPONSE carry the base64 SettlementResponse. (X402TopUp)
  • 202 — Settlement broadcast, not mined yet. Repeat the same request. (object)
  • 402 — Payment required, or the payment was refused (error names the reason, e.g. invalid_amount, authorization_expired). (X402PaymentRequired)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/billing/x402/top-up" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
POST /api/v1/billing/x402/rentPay a rental shortfall with x402 and reserve the machine (agents)

x402 v2, scheme exact, EIP-3009 USDC. If the account's spendable USDC already covers budget_micro, the rental is reserved and nothing else is charged. Otherwise the answer is 402 for the shortfall only. Signing it credits this account the way a deposit does (one credit per authorization nonce, shared with the top-up route so the same payment cannot settle twice). The rental is reserved once that credit is spendable. Repeat the same body: idempotency_key reserves at most one job. 202 means the settlement is broadcast and not mined yet. PENDING_FINALITY means the payment is pinned and the credit is not spendable yet. Mainnet is omitted from this rental offer unless X402_MAINNET_ENABLED is set. Top-ups are not gated by that flag. 404 while x402 is off. Solana is not accepted.

Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
PAYMENT-SIGNATUREheaderstringnoBase64 JSON x402 v2 PaymentPayload for the shortfall.
X-PAYMENTheaderstringnoSame as PAYMENT-SIGNATURE (x402 v1 header name).
Request body (application/json)
PropertyTypeRequiredDescription
offer_idUUIDyes
template_idUUIDno
image_digestImageDigestno
image_refstringno
duration_limit_sintegeryes
budget_microDecimalStringyesUnsigned base-10 integer as string; never a float.
asset"USDC" | "USDT"no
ssh_public_keystringno
idempotency_keyUUIDyes
Responses
  • 200 — Rental reserved, or the payment is pinned and waiting until the credit is spendable. (X402Rent)
  • 202 — Settlement broadcast, not mined yet. Repeat the same request. (X402Rent)
  • 402 — Payment required for the shortfall, or the payment was refused. (X402PaymentRequired)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/billing/x402/rent" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"offer_id":"3f0e2a55-8c1b-4d2e-9a6f-0b7c1d2e3f40","template_id":"3f0e2a55-8c1b-4d2e-9a6f-0b7c1d2e3f40","image_digest":"registry.amplerun.com/templates/pytorch-cuda@sha256:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08","image_ref":"string","duration_limit_s":1,"budget_micro":"1","asset":"USDC","ssh_public_key":"string","idempotency_key":"3f0e2a55-8c1b-4d2e-9a6f-0b7c1d2e3f40"}'
POST /api/v1/withdrawalsWithdraw to an address (code; a new address is confirmed by an email link)

Locked withdrawal intent to a saved address, or, for an address this account never used, a parked request that the emailed link (30 min) queues unchanged. New addresses are refused for 24 h after a password, 2FA or email change. API keys reach saved addresses only, without a code. No spendable credit while a transfer is pending. `amount_micro` is what leaves the balance: at least the WITHDRAWAL_MIN_MICRO setting (5 USDC by default), of which the WITHDRAWAL_FEE_MICRO fee (0.5 USDC by default) is kept when the withdrawal settles and the rest arrives. A failed withdrawal is not charged.

Auth
Session cookie or API key with the renter scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
network"base"noDefaults to base.
addressEvmAddressyes
amount_microMicroAmountyesMoney in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float.
asset"USDC" | "USDT"noDefaults to USDC.
labelstringnoSaved with a new address.
codestringno
siwe_messagestringno
signaturestringno
Responses
  • 202 — Queued, or waiting for the email link. (TransferAccepted)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/withdrawals" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"network":"base","address":"0x1111111111111111111111111111111111111111","amount_micro":"5000000","asset":"USDC","label":"string","code":"string","siwe_message":"string","signature":"string"}'
POST /api/v1/solana/withdrawalsWithdraw SPL USDC from the Solana hot wallet

404 while SOLANA_HOT_PAYOUTS_ENABLED is not exactly "true". Queues an SPL USDC withdrawal. SOL is the fee coin and is not paid out. The Ethereum withdrawal route is a different operation. Idempotency-Key replays the same body and rejects a different one. The amount is capped by SOLANA_HOT_MAX_MICRO.

Auth
Session cookie or API key with the renter scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
amount_microstringyes
destinationstringyes
Responses
  • 202 — Queued
  • 404 — Solana hot payouts are off.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/solana/withdrawals" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"amount_micro":"string","destination":"string"}'
POST /api/v1/withdrawals/codeEmail a 6-digit code for one withdrawal or payout (session, no 2FA)

Bound to kind, network, address, amount and asset; 10 minutes, 5 tries, single use, 5 per hour. 409 for 2FA accounts (use the authenticator).

Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Request body (application/json)
PropertyTypeRequiredDescription
kind"withdrawal" | "payout"yes
network"base"no
addressEvmAddressyes
amount_microMicroAmountyesMoney in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float.
asset"USDC" | "USDT"no
Responses
  • 202 — Code sent. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/withdrawals/code" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kind":"withdrawal","network":"base","address":"0x1111111111111111111111111111111111111111","amount_micro":"5000000","asset":"USDC"}'
GET /api/v1/withdrawal-addressesSaved withdrawal and payout addresses (self)
Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Responses
  • 200 — Saved and pending addresses. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/withdrawal-addresses" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
POST /api/v1/withdrawal-addressesSave an address ahead of time (session; confirmed by email link)

2FA accounts also send their authenticator `code`. Needed before API-key withdrawals to a new address. Wallet-only accounts and API keys cannot add addresses.

Auth
Session cookie or API key with the renter scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
network"base"no
addressEvmAddressyes
labelstringno
codestringno
Responses
  • 202 — Link sent (or already saved). (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/withdrawal-addresses" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"network":"base","address":"0x1111111111111111111111111111111111111111","label":"string","code":"string"}'
DELETE /api/v1/withdrawal-addresses/{id}Remove a saved address (self)

Bumps its version; an unsigned transfer to it is no longer paid automatically.

Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Responses
  • 200 — Removed. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X DELETE "https://amplerun.com/api/v1/withdrawal-addresses/<id>" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
POST /api/v1/withdrawal-addresses/confirmOpen the emailed link (no sign-in; the token is the proof)

Confirms the address and queues the parked withdrawal or payout exactly as requested. Idempotent. Refused after 30 minutes or after a credential change.

Auth
Public — no credential
Idempotency-Key
not used
Request body (application/json)
PropertyTypeRequiredDescription
tokenstringyes
Responses
  • 200 — Confirmed. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/withdrawal-addresses/confirm" \
  -H "Content-Type: application/json" \
  -d '{"token":"string"}'

hosts

POST /api/v1/solana/payoutsPay SPL USDC from the Solana hot wallet to a host

404 while SOLANA_HOT_PAYOUTS_ENABLED is not exactly "true". Queues an SPL USDC host payout. The Ethereum payout route is a different operation.

Auth
Session cookie or API key with the host scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
amount_microstringyes
destinationstringyes
Responses
  • 202 — Queued
  • 404 — Solana hot payouts are off.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/solana/payouts" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"amount_micro":"string","destination":"string"}'
POST /api/v1/hosts/enrollment-tokensHost enrollment token (verified host account)

One-use 10-minute token plus signed release URL/digest and preflight steps. Rate-limited independently.

Auth
Session cookie or API key with the host scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Responses
  • 201 — Enrollment material. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/hosts/enrollment-tokens" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)"
POST /api/v1/hosts/pairingsOpen a host pairing (installer; unauthenticated)

Called by the one-line installer (`curl -fsSL https://amplerun.com/host | sudo bash`). Returns a short user_code for a person to approve on /pair and a poll_secret only the installer holds; only their hashes are stored. Expires after 10 minutes. The code alone never yields a token. Rate-limited per source address.

Auth
Public — no credential
Idempotency-Key
not used
Request body (application/json)
PropertyTypeRequiredDescription
summaryobjectyesWhat the installer reports about the machine. Unverified; shown to the approver.
Responses
  • 201 — Pairing opened. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/hosts/pairings" \
  -H "Content-Type: application/json" \
  -d '{"summary":{"hostname":"string","os":"string","gpus":[{"name":"string","vram_mib":0}]}}'
POST /api/v1/hosts/pairings/lookupShow the machine behind a pairing code (verified session)

Returns the installer's report for a pending, unexpired code. Same session and guessing rules as approve; a wrong code counts as a miss (10 per hour per account and per address).

Auth
Session cookie or API key with the host scope
Idempotency-Key
not used
Request body (application/json)
PropertyTypeRequiredDescription
user_codestringyes
Responses
  • 200 — Pending pairing. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/hosts/pairings/lookup" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"user_code":"string"}'
POST /api/v1/hosts/pairings/approveApprove a pairing code (verified session, or an API key with the host scope)

The consent step of one-line host onboarding. Applies the same hosting rules as createEnrollmentToken (verified email, host scope, admin block, new-host cap; the first use turns hosting on). go_live (default true) lists the machine's seeded offer, unverified, on its first healthy heartbeat through the same path as listMachine with x-accept-unverified, paid-admission guard included. Audited. Wrong codes are limited as in lookup.

Auth
Session cookie or API key with the host scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
user_codestringyes
go_livebooleanno
Responses
  • 200 — Approved. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/hosts/pairings/approve" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"user_code":"string","go_live":true}'
POST /api/v1/hosts/pairings/pollPoll a pairing (installer; needs poll_secret)

pending, expired, approved (once, with a fresh single-use 10-minute enrollment token for POST /api/v1/agents/enroll; the pairing is consumed in the same transaction after the approver's hosting rules are re-checked), then consumed (no token; the enrolled machine's Go-live state). A wrong pairing_id or poll_secret is 404.

Auth
Public — no credential
Idempotency-Key
not used
Request body (application/json)
PropertyTypeRequiredDescription
pairing_idUUIDyes
poll_secretstringyes
Responses
  • 200 — Pairing state. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/hosts/pairings/poll" \
  -H "Content-Type: application/json" \
  -d '{"pairing_id":"3f0e2a55-8c1b-4d2e-9a6f-0b7c1d2e3f40","poll_secret":"string"}'
GET /api/v1/hosts/machinesList own machines (host owner/admin)

Each row carries the machine's hardware specs and its current offer, so a console can render a fleet table without one detail fetch per machine. Specs are read from the same source the public catalog reads (`manifest->devices`). A spec nobody measured is `null` — never 0 and never an empty string; `ram_bytes`, `disk_bytes` and `region` are not measured anywhere today and are therefore null in practice. `current_offer` is null when the machine has no published offer version, which is a real state (a machine mid-onboarding), not a free listing.

Auth
Session cookie or API key with the host scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
cursorquerystringnoOpaque pagination cursor from a previous response.
limitqueryintegerno
Responses
  • 200 — Page of machine summaries. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/hosts/machines" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
GET /api/v1/hosts/machines/{id}Machine detail: compatibility findings, current offer/job, observed metrics, drain state (host owner/admin)

Includes `telemetry`: the latest agent-reported sample plus `observed_at`, `age_s` and `boot_id`, or null when nothing was ever reported. Telemetry is evidence only and never influences admission, qualification, billing or job state. A measurement the host could not take is ABSENT from the object — it is never rendered as 0 and never carried over from an earlier sample, so a consumer must age it via `age_s` and show `unknown` when stale.

Auth
Session cookie or API key with the host scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Responses
  • 200 — Machine detail. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/hosts/machines/<id>" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
DELETE /api/v1/hosts/machines/{id}Remove an idle machine registration, preserving history

Revokes agent credentials and unlists offers. Active rentals or incomplete cleanup return 409. Re-enrollment is required to reconnect.

Auth
Session cookie or API key with the host scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Responses
  • 204 — Registration removed; history retained.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X DELETE "https://amplerun.com/api/v1/hosts/machines/<id>" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
GET /api/v1/hosts/machines/{id}/telemetryRolling telemetry history in 5-minute buckets (host owner/admin)

Min/avg/max per measured field per 5-minute bucket, for sparklines. Host owner only: a non-owner receives 404, never 403, so machine existence never leaks. History is retained for 48 h and pruned by the worker cleanup task; a `window` longer than the retention is refused rather than silently clamped. A field that was never measured in a bucket is absent, and a bucket's `samples` count states how much evidence backs it.

Auth
Session cookie or API key with the host scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
windowquerystringnoLookback as <n>s|<n>m|<n>h (default 6h, at most the retention window).
Responses
  • 200 — Telemetry history buckets, oldest first. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/hosts/machines/<id>/telemetry" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
POST /api/v1/hosts/machines/{id}/offerPublish versioned future offer (host owner)

Aggregate rate, included limits, available_from/available_until, optional maintenance window, expected_version. Versioned future offer only; never alters a running price.

Auth
Session cookie or API key with the host scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
rate_micro_per_hourMicroAmountyesMoney in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float.
included_quotasobjectyes
available_fromRfc3339Utcyes
available_untilRfc3339Utcyes
maintenance_windowsobject[]no
expected_versionDecimalStringyesUnsigned base-10 integer as string; never a float.
Responses
  • 202 — Offer version committed with new offer_version.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/hosts/machines/<id>/offer" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"rate_micro_per_hour":"5000000","included_quotas":{"included_disk_gib":0,"included_egress_gib":0},"available_from":"2026-09-25T12:00:00Z","available_until":"2026-09-25T12:00:00Z","maintenance_windows":[{"starts_at":"2026-09-25T12:00:00Z","ends_at":"2026-09-25T12:00:00Z","reason":"string"}],"expected_version":"1"}'
PATCH /api/v1/hosts/machines/{id}/offerEdit the listing by publishing the next offer version (host owner)

The host console's listing editor. Despite the verb this is APPEND-ONLY: the next `version` is inserted and no existing row is ever rewritten, so a live job keeps the rate its quote snapshotted — the quote remains the only price authority. `expected_version` is compare-and-swapped against the CURRENT offer version (not the machine version the POST form uses); a race answers 409 with `error.code = VERSION_CONFLICT` and a sibling `current` block so the editor can show what changed instead of overwriting it. `listing_expires_at` has no column of its own and is FOLDED onto `available_until` (the earlier of the two wins — `available_until` already means "bookable until", which is what the catalog filters on); the response echoes the stored value. `min_duration_s` and `max_duration_s` are accepted but NOT stored, because no per-offer duration bound exists in the schema and nothing at quote time would enforce one; they are named back to the caller in `ignored_fields` rather than silently dropped. A publish that would retract availability a live job is already holding is refused 409 CONFLICT.

Auth
Session cookie or API key with the host scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
expected_versionDecimalStringyesUnsigned base-10 integer as string; never a float.
rate_micro_per_hourMicroAmountyesMoney in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float.
included_disk_gibintegerno
included_egress_gibintegerno
available_fromRfc3339Utcyes
available_untilRfc3339Utcyes
listing_expires_atRfc3339Utcno
min_duration_sintegernoAccepted, never stored; reported in ignored_fields.
max_duration_sintegernoAccepted, never stored; reported in ignored_fields.
availability_classAvailabilityClassnoD-22. Omitted keeps the current version's class. interruptible needs preemption_notice_s; an idle or co-listed host can rent only interruptible offers. 409 until the D-22 migration is released.
preemption_notice_sintegernoD-22. Required for interruptible, refused for dedicated; omitted keeps the current value.
Responses
  • 202 — Next offer version published. (object)
  • 409 — Offer version race (`VERSION_CONFLICT`, with `current`) or a live job whose availability the change would retract (`CONFLICT`). (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X PATCH "https://amplerun.com/api/v1/hosts/machines/<id>/offer" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"expected_version":"1","rate_micro_per_hour":"5000000","included_disk_gib":0,"included_egress_gib":0,"available_from":"2026-09-25T12:00:00Z","available_until":"2026-09-25T12:00:00Z","listing_expires_at":"2026-09-25T12:00:00Z","min_duration_s":0,"max_duration_s":0,"availability_class":"dedicated","preemption_notice_s":0}'
GET /api/v1/hosts/machines/{id}/earningsPer-machine earnings day-series (host owner)

The account-wide `/hosts/earnings` day-series narrowed to one machine and attributed through `jobs.machine_id`, in the identical shape so one chart renders both. Ledger-derived only: every bar links back to `journal_lines` on `host_payable:<id>` for jobs that ran on this machine, and the series reconciles exactly to those rows. `paid_micro` is zero throughout, because payout settlements carry no `job_id` and belong to the account rather than to any one machine — attributing them would double-count a payout across the fleet. A non-owner receives 404, never 403, so machine existence never leaks. A malformed `window` is refused rather than silently defaulted.

Auth
Session cookie or API key with the host scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
windowquerystringnoTrailing window as <n>d (default 30d, 1..365).
Responses
  • 200 — Daily earnings bars for this machine, oldest first. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/hosts/machines/<id>/earnings" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
POST /api/v1/hosts/machines/{id}/listList machine (host owner); admission checks apply
Auth
Session cookie or API key with the host scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Responses
  • 202 — Listing admitted or rejected with findings.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/hosts/machines/<id>/list" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)"
POST /api/v1/hosts/machines/{id}/drainDrain machine (host owner); stops new bookings, never kills an active job or retrieval cleanup
Auth
Session cookie or API key with the host scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Responses
  • 202 — DRAINING.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/hosts/machines/<id>/drain" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)"
POST /api/v1/hosts/machines/{id}/unlistUnlist idle offer (host owner); never kills an active job or retrieval cleanup
Auth
Session cookie or API key with the host scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Responses
  • 202 — UNLISTED.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/hosts/machines/<id>/unlist" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)"
POST /api/v1/hosts/machines/{id}/nettestRe-run the network measurement (host owner/admin); queues a NETTEST command, result lands with the agent's next contact

netfacts lane. The agent measures download/upload Mbps and latency from the HOST network namespace against a public endpoint (bounded 30 s) and answers with a machine.nettest receipt that updates the machine's net facts. 202 = queued, never the measurement itself.

Auth
Session cookie or API key with the host scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Responses
  • 202 — Queued; body carries machine_id, command_id, state=QUEUED.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/hosts/machines/<id>/nettest" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)"
GET /api/v1/hosts/machines/{id}/idle-poolIdle pool status for one machine. 404 while the flag is off or for a non-owner.
Auth
Session cookie or API key with the host scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Responses
  • 200 — Opt-in and eligibility.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/hosts/machines/<id>/idle-pool" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
POST /api/v1/hosts/machines/{id}/idle-poolOpt this machine into the idle pool. 404 while the flag is off.
Auth
Session cookie or API key with the host scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
accept_termsconst trueyes
terms_versionstringyes
Responses
  • 200 — Current opt-in.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/hosts/machines/<id>/idle-pool" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"accept_terms":true,"terms_version":"string"}'
DELETE /api/v1/hosts/machines/{id}/idle-poolOpt this machine out of the idle pool. 404 while the flag is off.
Auth
Session cookie or API key with the host scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Responses
  • 200 — Current opt-in.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X DELETE "https://amplerun.com/api/v1/hosts/machines/<id>/idle-pool" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)"
PUT /api/v1/hosts/machines/{id}/custom-imagesOpt this machine in or out of renter-supplied public images (host owner)

Default false: a machine that never opted in never receives a custom image. Opting in is 409 while the marketplace has custom images disabled; opting out always works and wins any reservation in flight. Custom images still run under the mandatory launch profile. Each change is audited.

Auth
Session cookie or API key with the host scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
acceptbooleanyes
Responses
  • 200 — Current opt-in. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X PUT "https://amplerun.com/api/v1/hosts/machines/<id>/custom-images" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"accept":true}'
GET /api/v1/hosts/idle-poolIdle pool status and credited USDC for this host. 404 while the flag is off.
Auth
Session cookie or API key with the host scope
Idempotency-Key
not used
Responses
  • 200 — Opt-in, eligibility and credited micro-USDC per machine. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/hosts/idle-pool" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
GET /api/v1/hosts/earningsEarnings (host owner): earned, disputed, payable, requested, settled; gross vs snapshotted fee; no utilization guess
Auth
Session cookie or API key with the host scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
assetquery"USDC" | "USDT"no
Responses
  • 200 — Earnings breakdown. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/hosts/earnings" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
GET /api/v1/hosts/marketMarket stats (host): per-GPU-model supply, listed-rate band, fill rate and time-to-first-rental — aggregate only

Our own marketplace, never a competitor's. Aggregate only: no machine id, host id, offer id or any individual host's rate is ever returned — the only rate values that escape are the p10/median/p90 band of a bucket of at least `min_sample_size` listed machines, plus the CALLER's own median listed rate (`your_rate_micro`). Below the threshold a bucket reports its `sample_size` with every metric null; a median is never computed from a handful of observations. `median_time_to_first_rental_s` has its own sample gate (`rental_sample_size`), because a model can be widely listed and barely rented. Window is half-open UTC `[from, to)`.

Auth
Session cookie or API key with the host scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
gpu_modelquerystringnoExact manifest GPU model to restrict to.
windowquerystringnoTrailing window, e.g. 30d (1..365); anything else is 422.
Responses
  • 200 — Per-model market aggregates. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/hosts/market" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
GET /api/v1/hosts/payoutsList this host's payouts (read-only; no destination addresses)

Amount, asset, state and time. Does not move funds and does not return a payout address. A delegated agent with payouts:read passes the owner id.

Auth
Session cookie or API key with the host scope
Idempotency-Key
not used
Responses
  • 200 — Newest payouts for this host account. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/hosts/payouts" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
POST /api/v1/hosts/payoutsRequest a payout to an address (host owner; same model as withdrawals)

Payout intent locked against payable, to a saved address, or parked until the emailed link confirms a new one. Sessions confirm with `code` (POST /api/v1/withdrawals/code with kind=payout, or the authenticator); API keys reach saved addresses only.

Auth
Session cookie or API key with the host scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
network"base"noDefaults to base.
addressEvmAddressyes
amount_microMicroAmountyesMoney in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float.
asset"USDC" | "USDT"noDefaults to USDC.
labelstringnoSaved with a new address.
codestringno
siwe_messagestringno
signaturestringno
Responses
  • 202 — Queued, or waiting for the email link. (TransferAccepted)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/hosts/payouts" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"network":"base","address":"0x1111111111111111111111111111111111111111","amount_micro":"5000000","asset":"USDC","label":"string","code":"string","siwe_message":"string","signature":"string"}'

support

GET /api/v1/ticketsList own tickets (opener); cursor paged, ordered by id
Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
cursorquerystringnoOpaque pagination cursor from a previous response.
limitqueryintegerno
Responses
  • 200 — Page of ticket summaries. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/tickets" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
POST /api/v1/ticketsOpen support ticket (participant/admin); secrets redacted, ownership checked
Auth
Session cookie or API key with the renter scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
categorystringyes
textstringyes
job_idUUIDno
payment_referencestringno
Responses
  • 201 — Ticket created.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/tickets" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"category":"string","text":"string","job_id":"3f0e2a55-8c1b-4d2e-9a6f-0b7c1d2e3f40","payment_reference":"string"}'
GET /api/v1/tickets/{id}Ticket thread (participant/admin); participants see only their own permitted thread
Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Responses
  • 200 — Ticket with messages. Each message carries author (you, support, customer or host, relative to the reader); can_reply is true while the case is open.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/tickets/<id>" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
POST /api/v1/tickets/{id}/messagesAppend message (participant/admin)

The opener, the rental's host, or an admin (a support reply) may post to an OPEN case; anyone else gets 403 and a closed case 409.

Auth
Session cookie or API key with the renter scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
textstringyes
Responses
  • 201 — Message appended.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/tickets/<id>/messages" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"text":"string"}'

admin

GET /api/v1/admin/usersAdmin user view (Admin); immutable references
Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
cursorquerystringnoOpaque pagination cursor from a previous response.
limitqueryintegerno
kindquery"agent" | "human"noOnly accounts an AI agent registered for itself (agent), or the rest (human).
Responses
  • 200 — Filtered operational view. Each row carries account_kind and, for agents, the self-declared agent_profile.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/admin/users" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
GET /api/v1/admin/users/{id}User detail (Admin) — role, capabilities, MFA, linked providers, wallets, sessions, live rentals

Everything that decides what this account can do right now, on one response. Credential material is never projected: no password hash, no TOTP secret or backup codes, no API key hash, no session token. A linked sign-in provider shows its name and when it was linked, nothing else. `user.version` is the expected-version token for the actions endpoint.

Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
idpathstringyes
Responses
  • 200 — The account's current authority and state.
  • 404 — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/admin/users/<id>" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
POST /api/v1/admin/users/{id}/actionsUser management command (Admin+step-up); typed reason, expected version, audit event

One of five commands. Every one requires an admin session with an enrolled TOTP factor, a fresh `admin-sensitive` step-up grant, an Idempotency-Key, a typed reason and the `expected_version` read from GET /api/v1/admin/users/{id}. A stale version is 409 STALE_VERSION and writes nothing. There is no balance action here and there must never be one. `set_role` and `set_suspension` are refused with 409 CONFLICT when they would leave the system with zero admins; the check locks the admin set inside the transaction, so two demotions racing cannot both succeed. `set_suspension` blocks sign-in and every API key on the next request and stops new admissions for the account, but never cancels a running rental: it keeps metering and billing to funded expiry or stop. `reset_mfa` clears the enrolment and every session so the user must re-enrol; it never reveals or sets a secret.

Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
idpathstringyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.

Request body (application/json): object | object | object | object

Responses
  • 200 — Applied. Returns the new version, what changed and the stated consequence.
  • 409 — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/admin/users/<id>/actions" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"action":"set_role","role":"renter","reason":"string","expected_version":"string"}'
GET /api/v1/admin/machinesAdmin machine view (Admin)
Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
cursorquerystringnoOpaque pagination cursor from a previous response.
limitqueryintegerno
Responses
  • 200 — Filtered operational view.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/admin/machines" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
GET /api/v1/admin/jobsAdmin job view (Admin)
Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
cursorquerystringnoOpaque pagination cursor from a previous response.
limitqueryintegerno
Responses
  • 200 — Filtered operational view.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/admin/jobs" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
GET /api/v1/admin/ledgerAdmin ledger view (Admin)
Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
cursorquerystringnoOpaque pagination cursor from a previous response.
limitqueryintegerno
Responses
  • 200 — Filtered operational view.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/admin/ledger" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
GET /api/v1/admin/payoutsAdmin payout and withdrawal view (Admin); rows carry kind, and unsigned requests the automatic path holds carry hold_code/hold_reason
Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
cursorquerystringnoOpaque pagination cursor from a previous response.
limitqueryintegerno
Responses
  • 200 — Filtered operational view.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/admin/payouts" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
GET /api/v1/admin/ticketsAdmin ticket view (Admin)
Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
cursorquerystringnoOpaque pagination cursor from a previous response.
limitqueryintegerno
Responses
  • 200 — Filtered operational view.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/admin/tickets" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
GET /api/v1/admin/host-delegationsList fleet delegations (admin)
Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
owner_account_idquerystringno
agent_account_idquerystringno
Responses
  • 200 — Delegation rows.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/admin/host-delegations" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
GET /api/v1/admin/auditAdmin audit view (Admin)
Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
cursorquerystringnoOpaque pagination cursor from a previous response.
limitqueryintegerno
Responses
  • 200 — Filtered operational view.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/admin/audit" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
GET /api/v1/admin/reconciliationAdmin reconciliation view (Admin); unexplained differences >0 micro pause new paid admissions/payouts
Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
not used
Responses
  • 200 — Reconciliation status; stale RPC yields UNAVAILABLE without overwriting prior confirmed figures.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/admin/reconciliation" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
GET /api/v1/admin/analyticsAdmin analytics (Admin); committed capacity, paid time, GMV, fees, costs, refunds and repeat users separated; unavailable inputs stay null

Read-only. Adds daily UTC series for the range (signups, active users, rentals, GMV, fees, host earnings, deposits by rail, paid transfers, admitted machines), totals against the previous period, the signup funnel, top renters and hosts with masked emails, and live counts. Series rows and totals also carry `gmv_net_micro` (customer credit debits less refund-reversal credits) and `fees_net_micro` (platform fee credits less debits) over journal kinds charge and refund_reversal, stablecoin assets only, decimal strings in micro-units. `attribution` groups signups, depositors and the first credited stablecoin deposit by ref and by utm_content. Admin accounts and the ATTRIBUTION_EXCLUDE list are left out. Null when the report cannot be read. `paid_time.paid_runtime_ms` sums accepted runtime of finished (CLOSED) and in-flight jobs; admitted capacity stops at `retired_at` for retired machines.

Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
rangequery"7d" | "30d" | "90d"no
Responses
  • 200 — Analytics.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/admin/analytics" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
GET /api/v1/admin/statusAdmin status bar (Admin); admissions, reconciliation, worker heartbeat age and RPC reachability

Read-only. Each source is probed independently; a source that cannot be read reports state "unknown" — never a healthy default and never a stale value presented as fresh. The worker staleness threshold is the same one /api/v1/health/ready applies.

Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
not used
Responses
  • 200 — Four independent health blocks
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/admin/status" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
GET /api/v1/admin/treasuryHot wallet float, treasury and liabilities (Admin)

Aggregates over the immutable journal. Money is bigint decimal strings end to end. A group whose inputs are unavailable is null, never zero. Read-only; no per-account detail is projected. hot_float carries the hot payout wallet's balance, what it owes, its cap and what would sweep; networks carries each rail keyed by the reconciliation report's own rail id, which is an EVM chain id or "solana-mainnet", with chain_id null on a rail that is not an EVM chain; hot_wallet_gas is the worker's last gas alert for that wallet, dated, dispatched only while gas runs low; and hot_wallet_gas_reading is its routine native-balance reading on the primary chain, taken on every automatic-payout pass including a pass with an empty queue, as balance_wei (a coin quantity in wei, never summed with a micro-amount) with the read_at it was measured at. Both are null when nothing has been recorded, which a caller renders as unknown, never as an empty wallet. gas_floors carries the empty-queue alert thresholds (eth_wei and sol_lamports; "0" means that alert is off) and solana_hot_gas carries the public Solana watch address with its lamport balance and read_at, null until the worker has recorded one.

Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
not used
Responses
  • 200 — Hot wallet float and gas, per-rail books and holdings, treasury asset, customer/host liabilities, platform fees and refund totals.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/admin/treasury" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
GET /api/v1/admin/financeEarnings and deposits (Admin)

What the platform earns and what accounts deposit. earnings is the platform_fee account over the immutable journal, net of refund reversals, per window (today UTC, 7 days, 30 days, all time) with the amount charged, the amount hosts earned and the rentals billed, plus a per-day series for the last 30 days. deposits is every credited deposit of the EVM, Solana and native-coin rails, dated by the journal transaction that credited it, per window and per rail and asset, plus what is seen or held but not yet credited and the newest deposits with their state and a masked account email. Money is bigint decimal strings end to end; a window with no rows keeps count 0 rather than reporting a zero figure; a group whose inputs are unavailable is null. Read-only.

Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
not used
Responses
  • 200 — Fee windows and daily series, deposit windows, rails, pending transfers and the newest deposits.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/admin/finance" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
GET /api/v1/admin/incidentsAdmin incident view (Admin); dispatched alerts with their transport acknowledgement
Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
cursorquerystringnoOpaque pagination cursor from a previous response.
limitqueryintegerno
Responses
  • 200 — Filtered operational view.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/admin/incidents" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
GET /api/v1/admin/machines/{id}/evidenceQualification evidence and manifest drift for a machine (Admin)

The qualification records an admission decision was made on, plus the drift between the running manifest hash and the qualified one. With no qualification record, drifted is null (unknown), never false.

Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Responses
  • 200 — Machine facts
  • 404 — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/admin/machines/<id>/evidence" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
POST /api/v1/admin/templates/{templateId}/publishPublish template (Admin); audit event; refused unless a qualification record binds it to an admitted machine

D-19(b)/(c). Admin session; no step-up required. 409 when no qualification_records row binds the template to at least one admitted machine; fixtures never publish.

Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
templateIdpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
reasonstringyes
Responses
  • 202 — Publish accepted; audit event recorded.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/admin/templates/<templateId>/publish" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"reason":"string"}'
POST /api/v1/admin/machines/{id}/approveApprove machine (Admin); reason + expected version; in-flight work gets explicit policy, not silent deletion
Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
reasonstringyes
expected_versionDecimalStringyesUnsigned base-10 integer as string; never a float.
Responses
  • 202 — Approved.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/admin/machines/<id>/approve" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"reason":"string","expected_version":"1"}'
POST /api/v1/admin/machines/{id}/quarantineQuarantine machine (Admin); reason + expected version; in-flight work gets explicit policy, not silent deletion
Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
reasonstringyes
expected_versionDecimalStringyesUnsigned base-10 integer as string; never a float.
Responses
  • 202 — Quarantined.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/admin/machines/<id>/quarantine" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"reason":"string","expected_version":"1"}'
POST /api/v1/admin/idle-pool/periodsRecord an idle-pool reward period and credit host balances. 404 while the flag is off. No chain transaction.
Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
period_startRfc3339Utcyes
period_endRfc3339Utcyes
gross_microMicroAmountyesMoney in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float.
sourcestringyes
referencestringyes
commission_bpsintegerno
Responses
  • 200 — The same reference was already allocated.
  • 201 — Period allocated.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/admin/idle-pool/periods" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"period_start":"2026-09-25T12:00:00Z","period_end":"2026-09-25T12:00:00Z","gross_micro":"5000000","source":"string","reference":"string","commission_bps":0}'
POST /api/v1/admin/refundsRefund (Admin+recentMFA); evidence/reason, exact immutable manifest or compensating journal; no raw balance-edit endpoint
Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
job_idUUIDyes
amount_microMicroAmountyesMoney in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float.
reasonstringyes
evidencestring[]yes
Responses
  • 202 — Refund adjustment committed once; cumulative cap enforced.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/admin/refunds" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"job_id":"3f0e2a55-8c1b-4d2e-9a6f-0b7c1d2e3f40","amount_micro":"5000000","reason":"string","evidence":["string"]}'
POST /api/v1/admin/payouts/{id}/approveApprove payout manifest (Admin+recentMFA); exact immutable manifest hash; destination change invalidates approval
Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
manifest_hashSha256Hashyes
reasonstringyes
Responses
  • 202 — Approved.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/admin/payouts/<id>/approve" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"manifest_hash":"sha256:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08","reason":"string"}'
POST /api/v1/admin/payouts/{id}/signed-transactionSubmit signer-produced raw transaction (Admin+recentMFA); verified to match approved manifest and signer; returns deterministic hash
Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
raw_transactionstringyes
Responses
  • 202 — Accepted for broadcast. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/admin/payouts/<id>/signed-transaction" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"raw_transaction":"string"}'
POST /api/v1/admin/payouts/{id}/reviewApprove or reject a host payout held by the automatic payout path (Admin + TOTP step-up). approve releases the hold (the worker re-runs every correctness check); reject fails the unsigned request and releases its locked balance
Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
decision"approve" | "reject"yes
reasonstringyes
Responses
  • 202 — Decision recorded (audited with the admin and reason). (object)
  • 409 — The request is no longer unsigned (a nonce is pinned); it cannot be reviewed.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/admin/payouts/<id>/review" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"decision":"approve","reason":"string"}'
POST /api/v1/admin/withdrawals/{id}/reviewApprove or reject a renter withdrawal held by the automatic payout path (Admin + TOTP step-up). approve releases the hold (the worker re-runs every correctness check); reject fails the unsigned request and releases its locked balance
Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
decision"approve" | "reject"yes
reasonstringyes
Responses
  • 202 — Decision recorded (audited with the admin and reason). (object)
  • 409 — The request is no longer unsigned (a nonce is pinned); it cannot be reviewed.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/admin/withdrawals/<id>/review" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"decision":"approve","reason":"string"}'
POST /api/v1/admin/admissionsPause/resume admissions (Admin+recentMFA); pauses new jobs/credits as appropriate, never abrupt tenant termination

While public admission is paused, only a valid acceptance authorization (see schemas/acceptance-authorization.schema.json) consumed by the shared paid_admission_guard permits funding credit, reservation, host publication, payout and withdrawal.

Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
enabledbooleanyes
reasonstringyes
Responses
  • 202 — Admission state committed.
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/admin/admissions" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"enabled":true,"reason":"string"}'
GET /api/v1/admin/settingsList settings (Admin); the D-20 registry grouped by category, plus every root-of-trust key rendered read-only; a secret value is always {set, updated_at}, never the value
Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
not used
Responses
  • 200 — Settings grouped by category. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/admin/settings" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"
PATCH /api/v1/admin/settings/{key}Update one setting (Admin+recentMFA); typed reason + expected-version CAS; a root-of-trust key is refused 403; a stale version is 409 VERSION_CONFLICT with the current value attached and writes nothing
Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
keypathstringyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
valueunknownyes
reasonstringyes
expected_versionintegeryes
Responses
  • 200 — Written. The new version. (object)
  • 409 — Version conflict — nothing was overwritten. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X PATCH "https://amplerun.com/api/v1/admin/settings/<key>" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"value":"string","reason":"string","expected_version":0}'
POST /api/v1/admin/settings/testTest one subsystem's connectivity (Admin, rate limited); mail/alerts/chain-access/auth-provider; the target always comes from the stored setting, never the request body
Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
not used
Request body (application/json)
PropertyTypeRequiredDescription
subsystem"mail" | "alerts" | "chain-access" | "auth-provider"yes
provider"github" | "google"no
Responses
  • 200 — The real result of the check. (object)
  • default — Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/admin/settings/test" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"subsystem":"mail","provider":"github"}'

health

GET /api/v1/health/liveLiveness (public minimal)
Auth
Public — no credential
Idempotency-Key
not used
Responses
  • 200 — Process alive. (object)
Example
curl -X GET "https://amplerun.com/api/v1/health/live"
GET /api/v1/health/readyReadiness (public minimal); schema/DB/worker/clock with redacted degraded reasons; no internal topology leakage
Auth
Public — no credential
Idempotency-Key
not used
Responses
  • 200 — Ready. (object)
  • 503 — Degraded; redacted reasons. (object)
Example
curl -X GET "https://amplerun.com/api/v1/health/ready"
GET /api/v1/statusPublic status (minimal)

While admissions_paused is true, new reservations are refused with 403 ADMISSION_PAUSED; running rentals are unaffected.

Auth
Public — no credential
Idempotency-Key
not used
Responses
  • 200 — Status. (object)
Example
curl -X GET "https://amplerun.com/api/v1/status"

Schemas

UUID

UUID fields: string (uuid)

Rfc3339Utc

Rfc3339Utc fields: string (date-time)

DecimalString

Unsigned base-10 integer as string; never a float.

DecimalString fields: string

MicroAmount

Money in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float.

MicroAmount fields: DecimalString

EvmAddress

EvmAddress fields: string

Sha256Hash

Sha256Hash fields: string

ImageDigest

ImageDigest fields: string

ErrorEnvelope

ErrorEnvelope fields
PropertyTypeRequiredDescription
errorobjectyes

CursorPage

CursorPage fields
PropertyTypeRequiredDescription
itemsobject[]yes
next_cursorstring | nullyes

SettingView

One row of the D-20 settings registry, or a pinned root-of-trust key. When `secret` is true, `value` is always `{set: boolean}` — the wire never carries a secret or a root-of-trust value.

SettingView fields
PropertyTypeRequiredDescription
keystringyes
category"branding" | "contact" | "money" | "mail" | "alerts" | "auth-providers" | "chain-access" | "operations"yes
labelstringyes
helpstringyes
secretbooleanyes
editablebooleanyesFalse for a root-of-trust key — refused at the API, read-only in the UI.
pinned_reasonstring | nullyes
valueunknownyes
source"database" | "environment" | "default"yes
versionintegeryes
updated_atstring (date-time) | nullyes
updated_bystring | nullyes
envstringyes

AvailabilityClass

D-22. dedicated (the default) is never preempted. interruptible is sold only from idle or co-listed hosts: the host may take the machine back after preemption_notice_s seconds of notice, and billing stops at the notice.

AvailabilityClass fields: "dedicated" | "interruptible"

InterruptionEstimate

D-22, interruptible offers only. Plain observed counts, never a prediction. A run is one continuous period in which the host reported the machine offerable (from heartbeats); it counts when it ended, or has already lasted horizon_h. uninterrupted is null below the sample gate (20 runs): not enough history.

InterruptionEstimate fields
PropertyTypeRequiredDescription
runsintegeryesMost recent decided runs counted (at most 40).
uninterruptedinteger | nullyesOf those runs, how many lasted horizon_h without interruption; null below the sample gate.
horizon_hintegeryes
computed_atRfc3339Utcyes
summarystringyesThe counts in words, e.g. "34 of the last 40 runs lasted 4 h without interruption" or "Not enough history (12 runs so far)".

OfferSummary

No host management address is ever exposed. gpu_count, model and vram_bytes come from the machine manifest; vram_bytes is per GPU and is absent when the GPUs differ or memory was not measured. region, ram_bytes and disk_bytes are absent when the host did not measure them, never 0.

OfferSummary fields
PropertyTypeRequiredDescription
offer_idUUIDyes
machine_idUUIDyes
observed_atRfc3339Utcyes
offer_versionDecimalStringyesUnsigned base-10 integer as string; never a float.
expected_versionDecimalStringyesUnsigned base-10 integer as string; never a float.
readiness"ready" | "provisioning" | "unavailable"yes
total_rate_micro_per_hourMicroAmountyesMoney in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float.
included_quotasobjectyes
available_fromRfc3339Utcyes
available_untilRfc3339Utcyes
maintenance_windowsobject[]yes
gpu_countintegerno
modelstringno
vram_bytesDecimalStringnoUnsigned base-10 integer as string; never a float.
regionstringno
countrystringnoAdditive. ISO 3166-1 alpha-2 country of the machine, read by the controller from the agent's request country as reported by the trusted proxy (never from host input). Absent when unknown.
continentContinentnoAdditive. Continent derived from country: AF Africa, AN Antarctica, AS Asia, EU Europe, NA North America, OC Oceania, SA South America. Absent when the country is unknown.
ram_bytesDecimalStringnoUnsigned base-10 integer as string; never a float.
disk_bytesDecimalStringnoUnsigned base-10 integer as string; never a float.
measured_bandwidth_mbpsintegernonetfacts lane. Measured DOWNLOAD rate in Mbps; additive. Absent = never measured (never 0).
net_up_mbpsintegernonetfacts lane. Measured UPLOAD rate in Mbps; rides the same measurement as measured_bandwidth_mbps.
net_latency_msintegernonetfacts lane. Median HTTPS latency in ms from the same measurement.
speedtest_atRfc3339Utcnonetfacts lane. When the current net facts were measured; renders 'measured N ago' honestly.
tflops_bf16numbernoAI Speed. Measured dense BF16 matmul TFLOPS per GPU (the MIN across the machine's GPUs); additive. Absent = never measured (never 0).
tflops_totalnumbernoAI Speed. tflops_bf16 x gpu_count, computed, one decimal. Absent with tflops_bf16 or gpu_count.
mem_bw_gbpsnumbernoAI Speed. Measured device memory bandwidth in GB/s per GPU (the MIN across the machine's GPUs). Absent = never measured (never 0).
ai_speedintegernoAI Speed. round(100*sqrt((tflops_bf16/165.2)*(mem_bw_gbps/1008))); RTX 4090 = 100. Absent unless both figures were measured.
bench_atRfc3339UtcnoAI Speed. When the current figures were measured.
bench_flag"unverified_spec"noAI Speed. The GPU has no datasheet row to check the figures against.
disk_free_bytesDecimalStringnoAdditive. Free disk space in bytes from the machine's latest telemetry sample. Absent when there is no sample, the sample is older than 60 seconds (2x the 30 s heartbeat, the host console STALE_AFTER_S rule) or the agent did not report it; never 0 as a stand-in.
uptime_sDecimalStringnoAdditive. Seconds since the machine booted, from the latest telemetry sample. Absent under the same rules as disk_free_bytes.
gpu_utilization_pctnumbernoAdditive. Live GPU load, the PEAK across the machine's devices, from the latest telemetry sample. Absent under the same rules as disk_free_bytes, and when no device reported utilisation. 0 means measured idle.
telemetry_atRfc3339UtcnoAdditive. observed_at of the telemetry sample disk_free_bytes, uptime_s and gpu_utilization_pct came from. Present only with at least one of them; absent whenever they are.
template_compatibilitystring[]no
manifest_hashSha256Hashno
fitTemplateFitnoD-19(c). Present only when the request carried template_id; computed server-side from the template vram_fit against measured device VRAM.
fits_template_idsUUID[]noAdditive. Present only when the request carried fits_for=all; the ids of every published template that fits this offer (the same rule as fit).
platform_fee_bpsintegernoAdditive. Platform fee frozen into this offer version, in basis points (500 = 5%), taken out of each charge.
verification_level"unverified" | "auto_verified" | "manually_verified"noAdditive. How the machine's hardware claims were verified.
admittedbooleannoAdditive. Whether the machine has passed admission (a passed qualification for its current manifest). false is an unverified listing: shown in the catalog, never quoted or reserved (409 CONFLICT).
tier"container" | "inference"noAdditive (D-23). container: SSH containers under the launch profile. inference: managed models on a signed, hash-pinned runtime with no renter code, reached over the host's outbound session (community inference: don't send sensitive data).
backends"cuda" | "rocm" | "sycl" | "vulkan" | "metal"[]noAdditive. Backends the machine's devices serve, in preference order (cuda > rocm > sycl > vulkan > metal). A template runs here with the first one it has a runtime for.
reliabilityobjectnoAdditive. Approximate reliability score from machine fields only (no per-job joins on the catalog path).
availability_classAvailabilityClassnoD-22. dedicated (the default) is never preempted. interruptible is sold only from idle or co-listed hosts: the host may take the machine back after preemption_notice_s seconds of notice, and billing stops at the notice.
preemption_notice_sinteger | nullnoD-22. Notice in seconds (SIGTERM plus /work/.amplerun-preempt) before the host stops an interruptible rental; null for dedicated.
interruption_estimateInterruptionEstimate | nullnoD-22. Present for interruptible offers (horizon 4 h in the catalog); null for dedicated.

Continent

Additive. Continent derived from country: AF Africa, AN Antarctica, AS Asia, EU Europe, NA North America, OC Oceania, SA South America. Absent when the country is unknown.

Continent fields: "AF" | "AN" | "AS" | "EU" | "NA" | "OC" | "SA"

ContinentFilter

A continent code, case-insensitive, or americas (North and South America).

ContinentFilter fields: "af" | "an" | "as" | "eu" | "na" | "oc" | "sa" | "americas" | "AF" | "AN" | "AS" | "EU" | "NA" | "OC" | "SA"

Quote

Quote fields
PropertyTypeRequiredDescription
quote_idUUIDyes
expires_atRfc3339UtcyesQuotes expire after 60 seconds.
machine_idUUIDyes
gpu_countintegeryes
machine_rate_micro_per_hourMicroAmountyesMoney in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float.
platform_fee_bpsintegeryes
budget_microMicroAmountyesMoney in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float.
duration_limit_sintegeryes
included_disk_gibintegerno
included_egress_gibintegerno
manifest_hashSha256Hashyes
image_digestImageDigestyes
terms_versionstringyes
meter_startconst "verified_ready"yes
template_idUUIDnoD-19(c): echoed when the quote was created for a template.
image_refstringnoEchoed when the request named a custom image by image_ref; image_digest is what it was pinned to.
estimated_total_microMicroAmountnoD-19(c): floor(total_rate_micro_per_hour * duration_limit_s / 3600), fee included; informational — the quote's budget_micro remains the only price authority.
asset"USDC" | "USDT"noAdditive. Settlement asset whose balance the reservation holds; USDC unless the request chose USDT.
availability_classAvailabilityClassnoD-22. dedicated (the default) is never preempted. interruptible is sold only from idle or co-listed hosts: the host may take the machine back after preemption_notice_s seconds of notice, and billing stops at the notice.
preemption_notice_sinteger | nullnoD-22. Notice in seconds before an interruptible rental is stopped; null for dedicated.
interruption_estimateInterruptionEstimate | nullnoD-22. For an interruptible quote, computed with horizon_h = the quoted duration rounded up to whole hours; null for dedicated.

Job

Job fields
PropertyTypeRequiredDescription
job_idUUIDyes
state"RESERVED" | "STARTING" | "RUNNING" | "STOPPING" | "STOPPED" | "CLEANING" | "CLOSED" | "FAILED" | "RECONCILING"yes
cumulative_charge_microMicroAmountyesMoney in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float.
funded_throughRfc3339Utcyes
budget_versionDecimalStringyesUnsigned base-10 integer as string; never a float.
machine_idUUIDno
fenceDecimalStringnoUnsigned base-10 integer as string; never a float.
rate_micro_per_hourunknownnoAdditive. The rate agreed at reservation, read from the job's quote snapshot (quotes.machine_rate_micro_per_hour). Evidence only: never recomputed from current offers, never an input to billing or state.
accepted_runtime_msunknownnoAdditive. Control-owned accepted-runtime accumulator; 0 before any accepted receipt.
meter_started_atRfc3339Utc | nullnoAdditive. When the meter actually started (verified READY), not when the job was reserved. null means "not yet measured" — distinct from zero.
last_meter_receipt_atRfc3339Utc | nullnoAdditive. Observation time (wall_time) of the most recent ACCEPTED meter receipt. null when no receipt has been accepted yet — a RUNNING job with meter_started_at set may still have this null.
stopped_atRfc3339Utc | nullnoAdditive. When the machine confirmed the stop (jobs.stopped_at). Set once the job reaches STOPPED; null before, and null when no stop was confirmed. Display only.
tier"container" | "inference"noAdditive (D-23). The machine's tier; inference is community inference (don't send sensitive data).
gpu_modelstringnoAdditive. The GPU model the machine's agent reported (its manifest), for naming the deployment ("Qwen3 8B · RTX 4090"). Absent when the agent reported none. Display only, never billing input.
gpu_countintegernoAdditive. How many of `gpu_model` the machine has, from the same manifest. Absent with gpu_model.
templateobjectnoAdditive. Present only when the job's quote named a template (quotes.template_id); summary of templates.spec.

JobEvent

JobEvent fields
PropertyTypeRequiredDescription
seqDecimalStringyesUnsigned base-10 integer as string; never a float.
typestringyes
atRfc3339Utcyes
detailobjectno

DepositAddress

DepositAddress fields
PropertyTypeRequiredDescription
chain_id8453yes
network"base"yes
addressEvmAddressyes
livebooleannoFalse when asked with `live=0`; network statuses and SEEN rows were not read.
svm_destinationsobject[]noAdditive. Separate SVM custody destinations. Empty unless custody, RPC and finalized scanner readiness pass. Never send SPL tokens to the EVM address. Solana wallet login and EVM Pay with wallet do not apply to this rail.
svm_depositsobject[]noAdditive. Finalized credited or cap-held SPL token deposits, separate from EVM transaction hashes.
networksobject[]yesEvery network this address is watched on right now (Base first). The address is the same on each. Stablecoins credit 1:1; the native coin credits in USD at the Chainlink price at finality minus spread_bps.
assetsobject[]yes
min_deposit_microMicroAmountyesMoney in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float.
max_deposit_microMicroAmount | nullyesRoom left under the account balance cap; null = no limit.
finalized_block_numberDecimalString | nullyes
depositsobject[]yes

BalanceSet

BalanceSet fields
PropertyTypeRequiredDescription
spendable_microMicroAmountyesMoney in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float.
held_microMicroAmountyesMoney in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float.
pending_microMicroAmountyesMoney in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float.
disputed_microMicroAmountyesMoney in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float.
withdrawable_microMicroAmountyesMoney in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float.
spend_30d_microstringyes
spend_window_fromRfc3339Utcyes
spend_window_toRfc3339Utcyes
active_hold_microMicroAmountyesMoney in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float.
confirming_microMicroAmountnoStablecoin deposits credited before chain finality. Already in spendable_micro (usable for rentals), not yet in withdrawable_micro; they become withdrawable once final, or are reversed if the chain drops them.
confirming_ready_atRfc3339Utc | nullnoWhen the last confirming deposit should be final (the chain's typical finality lag); null when none is confirming. An estimate, not a promise.
withdrawal_min_microMicroAmountnoThe smallest withdrawal, counted as what leaves the balance (fee included).
withdrawal_fee_microMicroAmountnoFlat fee kept from each withdrawal when it settles; what arrives is the amount minus this.
welcome_credit_microMicroAmountnoRemaining one-time test credit, in micro-USDC. Included in spendable_micro and excluded from withdrawable_micro. Omitted when this account has none. It pays for rentals only.

WalletBinding

WalletBinding fields
PropertyTypeRequiredDescription
binding_idUUIDyes
chain_idconst 8453yes
addressEvmAddressyes
versionDecimalStringyesUnsigned base-10 integer as string; never a float.
linked_atRfc3339Utcyes
unlinked_atRfc3339Utc | nullyes

WithdrawalAddress

A saved withdrawal / payout address (034). CONFIRMED by its email link (or the account's sign-in wallet); PENDING until then.

WithdrawalAddress fields
PropertyTypeRequiredDescription
idUUIDyes
network"base"yes
chain_idintegeryes
addressEvmAddressyes
labelstring | nullyes
state"PENDING" | "CONFIRMED"yes
versionDecimalStringyesUnsigned base-10 integer as string; never a float.
created_atRfc3339Utcyes
confirmed_atRfc3339Utc | nullyes

TransferRequest

A withdrawal or host payout to a typed address. Sessions confirm with `code`: the authenticator code when the account has 2FA, else the 6-digit code from POST /api/v1/withdrawals/code. A wallet-only account (no email) sends `siwe_message` + `signature` (a step-up challenge from its sign-in wallet) instead. API keys send no code and reach saved (CONFIRMED) addresses only.

TransferRequest fields
PropertyTypeRequiredDescription
network"base"noDefaults to base.
addressEvmAddressyes
amount_microMicroAmountyesMoney in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float.
asset"USDC" | "USDT"noDefaults to USDC.
labelstringnoSaved with a new address.
codestringno
siwe_messagestringno
signaturestringno

TransferAccepted

INTENT: queued to a saved address (withdrawal_id or payout_id set). AWAITING_EMAIL_CONFIRMATION: a new address; nothing is locked until the emailed link (30 min) is opened, which queues exactly this request.

TransferAccepted fields
PropertyTypeRequiredDescription
state"INTENT" | "AWAITING_EMAIL_CONFIRMATION"yes
withdrawal_idUUIDno
payout_idUUIDno
confirmation_idUUIDno
address_idUUIDyes
expires_atRfc3339Utcno
asset"USDC" | "USDT"yes
fee_microMicroAmountnoA queued withdrawal only. Kept as the platform fee when it settles.
receive_microMicroAmountnoA queued withdrawal only. What arrives at the address (amount_micro minus fee_micro).

ApiKeyView

API key metadata. The secret itself appears only in the creation response.

ApiKeyView fields
PropertyTypeRequiredDescription
key_idUUIDyes
labelstringyes
prefixstringyesFirst 12 characters of the key, for recognising it.
scopes"renter" | "host"[]yes
expires_atRfc3339Utc | nullyes
revoked_atRfc3339Utc | nullyes
created_atRfc3339Utcyes

Template

Public template (D-19(b)); mirrors packages/contracts/schemas/template.schema.json, which remains the authority for templates.spec. kind=model requires model_ref and readiness.

Template fields
PropertyTypeRequiredDescription
idUUIDyes
publishedbooleanyes
template_idstringyes
namestringyes
template_versionstringyes
image_digestImageDigestyesPinned OCI reference (name@sha256:<64 hex>) — the same form quotes, START commands and qualification records carry.
launch_profile_versionstringyes
kind"model" | "classical" | "custom"yes
engine"vllm" | "llamacpp" | "comfyui" | "faster-whisper" | "pytorch" | "jupyter" | "ollama" | "oci"yes
model_refobjectno
quantizationstringno
vram_fitobjectyes
readinessobjectno
exposesobject[]yes
envobjectyes
min_gpu_countintegeryes
required_runtime"cuda" | "rocm-hip" | "level-zero" | "opencl" | "xpu"yes
setup_notesstringyes
runtimesobjectnoAdditive. One template, many backends: the same weights and API contract per backend. tier container is an OCI image; tier inference is the signed Tier B runtime artifact (<source>@sha256:<hex>). The control plane picks the machine's runtime by preference (cuda > rocm > sycl > vulkan > metal) and pins its digest in the quote and lease.
backends"cuda" | "rocm" | "sycl" | "vulkan" | "metal"[]noAdditive. Backends with a built runtime, in preference order ("Works on" filter). Spec compatibility, not a hardware test.
works_on"nvidia" | "amd" | "intel" | "apple"[]noAdditive. Hardware vendors those backends cover. Spec compatibility only; a hardware report is what says "tested on".

TemplateRuntime

TemplateRuntime fields
PropertyTypeRequiredDescription
tier"container" | "inference"yes
image_digestImageDigestyes

TemplateFit

D-19(c) per-offer fit verdict for a template, computed server-side from vram_fit against measured device VRAM. reason is human-readable and non-empty when fits is false.

TemplateFit fields
PropertyTypeRequiredDescription
fitsbooleanyes
reasonstringyes

TelemetrySample

Task A machine telemetry sample, mirroring telemetry.schema.json (the cross-language authority). EVERY measurement is optional: a probe that failed or was absent omits its field entirely. An absent field means "not measured", never 0 and never the previous reading. Byte/second counters are decimal strings; percentages and temperatures are bounded numbers.

TelemetrySample fields
PropertyTypeRequiredDescription
devicesobject[]yes
hostobjectno

TelemetryNumberSummary

Min/avg/max of one measured numeric field within a 5-minute bucket. Present only when the field was measured at least once in that bucket.

TelemetryNumberSummary fields
PropertyTypeRequiredDescription
minnumberyes
avgnumberyes
maxnumberyes

TelemetryAmountSummary

Min/avg/max of one measured byte/second counter within a 5-minute bucket, as exact decimal strings (avg is floored; a byte count is never a float).

TelemetryAmountSummary fields
PropertyTypeRequiredDescription
minDecimalStringyesUnsigned base-10 integer as string; never a float.
avgDecimalStringyesUnsigned base-10 integer as string; never a float.
maxDecimalStringyesUnsigned base-10 integer as string; never a float.

X402PaymentRequired

x402 v2 PaymentRequired. accepts has one entry, the exact EIP-3009 USDC payment to the treasury.

X402PaymentRequired fields
PropertyTypeRequiredDescription
x402Version2yes
errorstringyes
resourceobjectyes
acceptsobject[]yes

X402TopUp

X402TopUp fields
PropertyTypeRequiredDescription
intent_idUUIDyes
state"PENDING_FINALITY" | "CONFIRMED" | "EXCEPTION"yes
amount_microDecimalStringyesUnsigned base-10 integer as string; never a float.
credited_microDecimalStringnoUnsigned base-10 integer as string; never a float.
reasonstringno
payerstringyesThe wallet that signed the authorization. It need not be linked to the account.
tx_hashstringyes
log_indexintegeryes
networkstringyes

X402Rent

A rental paid from balance, or the x402 credit that will fund it. job_id is set once the machine is reserved. PENDING_FINALITY means the payment is pinned and the same request should be repeated once the credit is spendable. SETTLING is only on HTTP 202.

X402Rent fields
PropertyTypeRequiredDescription
statestringyes
idempotency_keyUUIDyes
job_idUUIDno
quote_idUUIDno
budget_microDecimalStringnoUnsigned base-10 integer as string; never a float.
platform_fee_bpsintegerno
machine_rate_micro_per_hourMicroAmountnoMoney in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float.
duration_limit_sintegerno
estimated_total_microDecimalStringnoUnsigned base-10 integer as string; never a float.
asset"USDC"no
paymentX402TopUp | nullno
retrystringno
intent_idUUIDno
amount_microDecimalStringnoUnsigned base-10 integer as string; never a float.
payerstringno
tx_hashstringno
log_indexintegerno
networkstringno

Go to a page or search