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
- Pick a template and an offer.
GET /api/v1/templateslists published images with their pinnedimage_digest;GET /api/v1/offers?template_id=…lists admitted machines that fit it. - Quote.
POST /api/v1/quoteswithoffer_id,image_digest,duration_limit_sandbudget_microreturns an immutable quote that expires after 60 seconds. - Reserve.
POST /api/v1/jobswithquote_idand yourssh_public_keyatomically holds the budget and the machine, answering202with ajob_idin stateRESERVED. An expired quote, changed manifest or insufficient spendable balance is rejected without a partial hold. - Wait for verified readiness. Poll
GET /api/v1/jobs/{id}or readGET /api/v1/jobs/{id}/events. The meter starts at verified readiness, not at container creation. - Connect.
GET /api/v1/jobs/{id}/accessreturns 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 - Stop.
POST /api/v1/jobs/{id}/stop. After a confirmed stop the access mode becomesretrieval-read-onlyfor a limited window; the receipt is atGET /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/mcpOn 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.
| Command | Does |
|---|---|
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 list | List published templates (public) — GET /api/v1/templates |
amplerun templates get <template-id> | Get one published template (public) — GET /api/v1/templates/{templateId} |
amplerun offers list | List 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 list | List 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 get | Profile/security metadata (self); no password/token hashes — GET /api/v1/account |
amplerun account export | Data export (self, recent re-auth) — POST /api/v1/account/export |
amplerun account request-deletion | Retention-aware deletion request (self, recent re-auth); required ledger evidence preserved under disclosed policy — POST /api/v1/account/deletion-request |
amplerun account sessions list | Session 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 list | List 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 list | List wallet bindings (verified self) — GET /api/v1/wallets |
amplerun wallets nonce | SIWE 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 get | Balance summary (self/admin); spendable/held/pending/disputed/withdrawable separately, plus 30-day spend and active hold — GET /api/v1/billing |
amplerun billing entries | Itemized 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-token | Host enrollment token (verified host account) — POST /api/v1/hosts/enrollment-tokens |
amplerun hosts earnings | Earnings (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 list | List 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 list | List 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 users | Admin user view (Admin); immutable references — GET /api/v1/admin/users |
amplerun admin machines | Admin machine view (Admin) — GET /api/v1/admin/machines |
amplerun admin jobs | Admin job view (Admin) — GET /api/v1/admin/jobs |
amplerun admin ledger | Admin ledger view (Admin) — GET /api/v1/admin/ledger |
amplerun admin payouts | Admin 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 tickets | Admin ticket view (Admin) — GET /api/v1/admin/tickets |
amplerun admin audit | Admin audit view (Admin) — GET /api/v1/admin/audit |
amplerun admin reconciliation | Admin reconciliation view (Admin); unexplained differences >0 micro pause new paid admissions/payouts — GET /api/v1/admin/reconciliation |
amplerun admin analytics | Admin 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 live | Liveness (public minimal) — GET /api/v1/health/live |
amplerun health ready | Readiness (public minimal); schema/DB/worker/clock with redacted degraded reasons; no internal topology leakage — GET /api/v1/health/ready |
amplerun status | Public 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>" } }401unauthenticated ·403forbidden (missing scope, step-up or role) ·404not found or hidden409conflict (idempotency, budget, machine state) ·422invalid input503unavailable 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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | Opaque pagination cursor from a previous response. |
limit | query | integer | no | |
template_id | query | UUID | no | Compute 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_for | query | "all" | no | Additive. `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. |
sort | query | "price_asc" | "price_desc" | "vram_desc" | "reliability_desc" | "uptime_desc" | "newest" | "verification" | "net_desc" | "tflops_desc" | "ai_speed_desc" | no | Keyset sort order; an unknown value falls back to price_asc. |
verification_level | query | "unverified" | "auto_verified" | "manually_verified" | no | Only machines at exactly this verification level. |
include_unverified | query | boolean | no | Also list machines that have not passed admission yet. |
min_bandwidth_mbps | query | integer | no | netfacts 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_hour | query | MicroAmount | no | Only offers whose total machine rate is at or below this amount. |
gpu_count | query | integer | no | Only offers whose machine manifest lists at least this many devices. |
model | query | string | no | Case-insensitive substring match on the first device model in the manifest. |
tier | query | "container" | "inference" | no | Only machines of this tier (D-23). |
backend | query | "cuda" | "rocm" | "sycl" | "vulkan" | "metal" | no | Only machines with a device serving this backend. |
continent | query | ContinentFilter | no | Only machines on this continent (americas = NA + SA). Machines with an unknown location are excluded. Any other value -> 422. |
near | query | ContinentFilter | no | Order 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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | Opaque pagination cursor from a previous response. |
limit | query | integer | no | |
kind | query | "model" | "classical" | "custom" | no | |
min_vram_bytes | query | DecimalString | no | Return templates that fit a device with this much VRAM. |
backend | query | "cuda" | "rocm" | "sycl" | "vulkan" | "metal" | no | Only 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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
templateId | path | string | yes | Template 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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
Idempotency-Key | header | UUID | yes | UUID scoped to authenticated principal, route and canonical request hash. |
| Property | Type | Required | Description |
|---|---|---|---|
offer_id | UUID | yes | |
image_digest | ImageDigest | no | A published template's image, or a custom public image pinned by digest. |
image_ref | string | no | Custom public image by tag or digest ([registry/]repository[:tag][@sha256:...]); the server pins it to a digest at quote time. |
duration_limit_s | integer | yes | Maximum runtime in seconds, metered from verified readiness. |
budget_micro | MicroAmount | yes | Spending cap: the job is never charged more than this. |
template_id | UUID | no | D-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" | no | Additive. 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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | Opaque pagination cursor from a previous response. |
limit | query | integer | no |
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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
Idempotency-Key | header | UUID | yes | UUID scoped to authenticated principal, route and canonical request hash. |
| Property | Type | Required | Description |
|---|---|---|---|
quote_id | UUID | yes | |
ssh_public_key | string | no | One-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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes | |
cursor | query | string | no | Opaque pagination cursor from a previous response. |
limit | query | integer | no |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes |
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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes | |
Idempotency-Key | header | UUID | yes | UUID scoped to authenticated principal, route and canonical request hash. |
| Property | Type | Required | Description |
|---|---|---|---|
reason | string | yes |
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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes | |
Idempotency-Key | header | UUID | yes | UUID scoped to authenticated principal, route and canonical request hash. |
| Property | Type | Required | Description |
|---|---|---|---|
additional_budget_micro | MicroAmount | yes | Money in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float. |
new_duration_limit_s | integer | yes | |
expected_job_version | DecimalString | yes | Unsigned base-10 integer as string; never a float. |
expected_budget_version | DecimalString | yes | Unsigned 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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes | |
Idempotency-Key | header | UUID | yes | UUID 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
| Property | Type | Required | Description |
|---|---|---|---|
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 rowsdefault— 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
| Property | Type | Required | Description |
|---|---|---|---|
agent_account_id | string | no | |
owner_account_id | string | no | |
scopes | string[] | no |
Responses
201— Owner grant202— Agent requestdefault— 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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | Better 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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
Idempotency-Key | header | UUID | yes | UUID scoped to authenticated principal, route and canonical request hash. |
| Property | Type | Required | Description |
|---|---|---|---|
label | string | yes | |
expires_at | Rfc3339Utc | no | |
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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes | |
Idempotency-Key | header | UUID | yes | UUID 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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
provider | path | "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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
provider | path | "huggingface" | yes | |
Idempotency-Key | header | UUID | yes | UUID scoped to authenticated principal, route and canonical request hash. |
| Property | Type | Required | Description |
|---|---|---|---|
token | string | yes |
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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
provider | path | "huggingface" | yes | |
Idempotency-Key | header | UUID | yes | UUID 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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
Idempotency-Key | header | UUID | yes | UUID 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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
Idempotency-Key | header | UUID | yes | UUID 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
| Property | Type | Required | Description |
|---|---|---|---|
address | string | yes |
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
| Property | Type | Required | Description |
|---|---|---|---|
message | string | yes | The challenge message |
signature | string | yes | 0x-prefixed EIP-191 signature. |
agent | object | yes | Self-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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
Idempotency-Key | header | UUID | yes | UUID 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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
Idempotency-Key | header | UUID | yes | UUID scoped to authenticated principal, route and canonical request hash. |
| Property | Type | Required | Description |
|---|---|---|---|
chain_id | const 8453 | yes | |
address | EvmAddress | yes | |
siwe_message | string | yes | |
signature | string | yes |
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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
binding_id | path | UUID | yes | |
Idempotency-Key | header | UUID | yes | UUID 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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
Idempotency-Key | header | UUID | yes | UUID scoped to authenticated principal, route and canonical request hash. |
| Property | Type | Required | Description |
|---|---|---|---|
wallet_binding_id | UUID | yes | |
amount_micro | MicroAmount | yes | Money 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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes |
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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes | |
Idempotency-Key | header | UUID | yes | UUID scoped to authenticated principal, route and canonical request hash. |
| Property | Type | Required | Description |
|---|---|---|---|
tx_hash | string | yes | |
log_index | integer | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
asset | query | "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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
live | query | "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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | Opaque pagination cursor from a previous response. |
limit | query | integer | no |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
job | path | UUID | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
amount_micro | query | DecimalString | yes | Top-up amount in micro-USDC ("5000000" = 5 USDC). |
PAYMENT-SIGNATURE | header | string | no | Base64 JSON x402 v2 PaymentPayload. |
X-PAYMENT | header | string | no | Same 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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
PAYMENT-SIGNATURE | header | string | no | Base64 JSON x402 v2 PaymentPayload for the shortfall. |
X-PAYMENT | header | string | no | Same as PAYMENT-SIGNATURE (x402 v1 header name). |
| Property | Type | Required | Description |
|---|---|---|---|
offer_id | UUID | yes | |
template_id | UUID | no | |
image_digest | ImageDigest | no | |
image_ref | string | no | |
duration_limit_s | integer | yes | |
budget_micro | DecimalString | yes | Unsigned base-10 integer as string; never a float. |
asset | "USDC" | "USDT" | no | |
ssh_public_key | string | no | |
idempotency_key | UUID | yes |
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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
Idempotency-Key | header | UUID | yes | UUID scoped to authenticated principal, route and canonical request hash. |
| Property | Type | Required | Description |
|---|---|---|---|
network | "base" | no | Defaults to base. |
address | EvmAddress | yes | |
amount_micro | MicroAmount | yes | Money in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float. |
asset | "USDC" | "USDT" | no | Defaults to USDC. |
label | string | no | Saved with a new address. |
code | string | no | |
siwe_message | string | no | |
signature | string | no |
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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
Idempotency-Key | header | UUID | yes | UUID scoped to authenticated principal, route and canonical request hash. |
| Property | Type | Required | Description |
|---|---|---|---|
amount_micro | string | yes | |
destination | string | yes |
Responses
202— Queued404— 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
| Property | Type | Required | Description |
|---|---|---|---|
kind | "withdrawal" | "payout" | yes | |
network | "base" | no | |
address | EvmAddress | yes | |
amount_micro | MicroAmount | yes | Money 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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
Idempotency-Key | header | UUID | yes | UUID scoped to authenticated principal, route and canonical request hash. |
| Property | Type | Required | Description |
|---|---|---|---|
network | "base" | no | |
address | EvmAddress | yes | |
label | string | no | |
code | string | no |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes |
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
| Property | Type | Required | Description |
|---|---|---|---|
token | string | yes |
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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
Idempotency-Key | header | UUID | yes | UUID scoped to authenticated principal, route and canonical request hash. |
| Property | Type | Required | Description |
|---|---|---|---|
amount_micro | string | yes | |
destination | string | yes |
Responses
202— Queued404— 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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
Idempotency-Key | header | UUID | yes | UUID 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
| Property | Type | Required | Description |
|---|---|---|---|
summary | object | yes | What 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
| Property | Type | Required | Description |
|---|---|---|---|
user_code | string | yes |
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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
Idempotency-Key | header | UUID | yes | UUID scoped to authenticated principal, route and canonical request hash. |
| Property | Type | Required | Description |
|---|---|---|---|
user_code | string | yes | |
go_live | boolean | no |
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
| Property | Type | Required | Description |
|---|---|---|---|
pairing_id | UUID | yes | |
poll_secret | string | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | Opaque pagination cursor from a previous response. |
limit | query | integer | no |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes | |
window | query | string | no | Lookback 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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes | |
Idempotency-Key | header | UUID | yes | UUID scoped to authenticated principal, route and canonical request hash. |
| Property | Type | Required | Description |
|---|---|---|---|
rate_micro_per_hour | MicroAmount | yes | Money in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float. |
included_quotas | object | yes | |
available_from | Rfc3339Utc | yes | |
available_until | Rfc3339Utc | yes | |
maintenance_windows | object[] | no | |
expected_version | DecimalString | yes | Unsigned 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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes | |
Idempotency-Key | header | UUID | yes | UUID scoped to authenticated principal, route and canonical request hash. |
| Property | Type | Required | Description |
|---|---|---|---|
expected_version | DecimalString | yes | Unsigned base-10 integer as string; never a float. |
rate_micro_per_hour | MicroAmount | yes | Money in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float. |
included_disk_gib | integer | no | |
included_egress_gib | integer | no | |
available_from | Rfc3339Utc | yes | |
available_until | Rfc3339Utc | yes | |
listing_expires_at | Rfc3339Utc | no | |
min_duration_s | integer | no | Accepted, never stored; reported in ignored_fields. |
max_duration_s | integer | no | Accepted, never stored; reported in ignored_fields. |
availability_class | AvailabilityClass | no | D-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_s | integer | no | D-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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes | |
window | query | string | no | Trailing 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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes | |
Idempotency-Key | header | UUID | yes | UUID 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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes | |
Idempotency-Key | header | UUID | yes | UUID 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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes | |
Idempotency-Key | header | UUID | yes | UUID 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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes | |
Idempotency-Key | header | UUID | yes | UUID 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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes |
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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes | |
Idempotency-Key | header | UUID | yes | UUID scoped to authenticated principal, route and canonical request hash. |
| Property | Type | Required | Description |
|---|---|---|---|
accept_terms | const true | yes | |
terms_version | string | yes |
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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes | |
Idempotency-Key | header | UUID | yes | UUID 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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes | |
Idempotency-Key | header | UUID | yes | UUID scoped to authenticated principal, route and canonical request hash. |
| Property | Type | Required | Description |
|---|---|---|---|
accept | boolean | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
asset | query | "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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
gpu_model | query | string | no | Exact manifest GPU model to restrict to. |
window | query | string | no | Trailing 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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
Idempotency-Key | header | UUID | yes | UUID scoped to authenticated principal, route and canonical request hash. |
| Property | Type | Required | Description |
|---|---|---|---|
network | "base" | no | Defaults to base. |
address | EvmAddress | yes | |
amount_micro | MicroAmount | yes | Money in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float. |
asset | "USDC" | "USDT" | no | Defaults to USDC. |
label | string | no | Saved with a new address. |
code | string | no | |
siwe_message | string | no | |
signature | string | no |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | Opaque pagination cursor from a previous response. |
limit | query | integer | no |
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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
Idempotency-Key | header | UUID | yes | UUID scoped to authenticated principal, route and canonical request hash. |
| Property | Type | Required | Description |
|---|---|---|---|
category | string | yes | |
text | string | yes | |
job_id | UUID | no | |
payment_reference | string | no |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes |
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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes | |
Idempotency-Key | header | UUID | yes | UUID scoped to authenticated principal, route and canonical request hash. |
| Property | Type | Required | Description |
|---|---|---|---|
text | string | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | Opaque pagination cursor from a previous response. |
limit | query | integer | no | |
kind | query | "agent" | "human" | no | Only 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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes |
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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | |
Idempotency-Key | header | UUID | yes | UUID 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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | Opaque pagination cursor from a previous response. |
limit | query | integer | no |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | Opaque pagination cursor from a previous response. |
limit | query | integer | no |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | Opaque pagination cursor from a previous response. |
limit | query | integer | no |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | Opaque pagination cursor from a previous response. |
limit | query | integer | no |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | Opaque pagination cursor from a previous response. |
limit | query | integer | no |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
owner_account_id | query | string | no | |
agent_account_id | query | string | no |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | Opaque pagination cursor from a previous response. |
limit | query | integer | no |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
range | query | "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 blocksdefault— 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/searchResolve a record id (Admin)
Exact whole-id equality only — no prefix, wildcard or fuzzy match, so the endpoint cannot be walked to enumerate records. Every miss returns one identical NOT_FOUND message regardless of which kind was searched.
- Auth
- Admin session with enrolled TOTP; API keys are rejected
- Idempotency-Key
- not used
| Name | In | Type | Required | Description |
|---|---|---|---|---|
q | query | string | yes | A complete record id. |
Responses
200— The resolved kind404— 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/search" \
-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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | Opaque pagination cursor from a previous response. |
limit | query | integer | no |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes |
Responses
200— Machine facts404— 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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
templateId | path | UUID | yes | |
Idempotency-Key | header | UUID | yes | UUID scoped to authenticated principal, route and canonical request hash. |
| Property | Type | Required | Description |
|---|---|---|---|
reason | string | yes |
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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes | |
Idempotency-Key | header | UUID | yes | UUID scoped to authenticated principal, route and canonical request hash. |
| Property | Type | Required | Description |
|---|---|---|---|
reason | string | yes | |
expected_version | DecimalString | yes | Unsigned 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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes | |
Idempotency-Key | header | UUID | yes | UUID scoped to authenticated principal, route and canonical request hash. |
| Property | Type | Required | Description |
|---|---|---|---|
reason | string | yes | |
expected_version | DecimalString | yes | Unsigned 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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
Idempotency-Key | header | UUID | yes | UUID scoped to authenticated principal, route and canonical request hash. |
| Property | Type | Required | Description |
|---|---|---|---|
period_start | Rfc3339Utc | yes | |
period_end | Rfc3339Utc | yes | |
gross_micro | MicroAmount | yes | Money in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float. |
source | string | yes | |
reference | string | yes | |
commission_bps | integer | no |
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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
Idempotency-Key | header | UUID | yes | UUID scoped to authenticated principal, route and canonical request hash. |
| Property | Type | Required | Description |
|---|---|---|---|
job_id | UUID | yes | |
amount_micro | MicroAmount | yes | Money in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float. |
reason | string | yes | |
evidence | string[] | 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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes | |
Idempotency-Key | header | UUID | yes | UUID scoped to authenticated principal, route and canonical request hash. |
| Property | Type | Required | Description |
|---|---|---|---|
manifest_hash | Sha256Hash | yes | |
reason | string | yes |
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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes | |
Idempotency-Key | header | UUID | yes | UUID scoped to authenticated principal, route and canonical request hash. |
| Property | Type | Required | Description |
|---|---|---|---|
raw_transaction | string | yes |
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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes | |
Idempotency-Key | header | UUID | yes | UUID scoped to authenticated principal, route and canonical request hash. |
| Property | Type | Required | Description |
|---|---|---|---|
decision | "approve" | "reject" | yes | |
reason | string | yes |
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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | UUID | yes | |
Idempotency-Key | header | UUID | yes | UUID scoped to authenticated principal, route and canonical request hash. |
| Property | Type | Required | Description |
|---|---|---|---|
decision | "approve" | "reject" | yes | |
reason | string | yes |
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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
Idempotency-Key | header | UUID | yes | UUID scoped to authenticated principal, route and canonical request hash. |
| Property | Type | Required | Description |
|---|---|---|---|
enabled | boolean | yes | |
reason | string | yes |
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)
| Name | In | Type | Required | Description |
|---|---|---|---|---|
key | path | string | yes | |
Idempotency-Key | header | UUID | yes | UUID scoped to authenticated principal, route and canonical request hash. |
| Property | Type | Required | Description |
|---|---|---|---|
value | unknown | yes | |
reason | string | yes | |
expected_version | integer | yes |
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
| Property | Type | Required | Description |
|---|---|---|---|
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
| Property | Type | Required | Description |
|---|---|---|---|
error | object | yes |
CursorPage
| Property | Type | Required | Description |
|---|---|---|---|
items | object[] | yes | |
next_cursor | string | null | yes |
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.
| Property | Type | Required | Description |
|---|---|---|---|
key | string | yes | |
category | "branding" | "contact" | "money" | "mail" | "alerts" | "auth-providers" | "chain-access" | "operations" | yes | |
label | string | yes | |
help | string | yes | |
secret | boolean | yes | |
editable | boolean | yes | False for a root-of-trust key — refused at the API, read-only in the UI. |
pinned_reason | string | null | yes | |
value | unknown | yes | |
source | "database" | "environment" | "default" | yes | |
version | integer | yes | |
updated_at | string (date-time) | null | yes | |
updated_by | string | null | yes | |
env | string | yes |
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.
| Property | Type | Required | Description |
|---|---|---|---|
runs | integer | yes | Most recent decided runs counted (at most 40). |
uninterrupted | integer | null | yes | Of those runs, how many lasted horizon_h without interruption; null below the sample gate. |
horizon_h | integer | yes | |
computed_at | Rfc3339Utc | yes | |
summary | string | yes | The 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.
| Property | Type | Required | Description |
|---|---|---|---|
offer_id | UUID | yes | |
machine_id | UUID | yes | |
observed_at | Rfc3339Utc | yes | |
offer_version | DecimalString | yes | Unsigned base-10 integer as string; never a float. |
expected_version | DecimalString | yes | Unsigned base-10 integer as string; never a float. |
readiness | "ready" | "provisioning" | "unavailable" | yes | |
total_rate_micro_per_hour | MicroAmount | yes | Money in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float. |
included_quotas | object | yes | |
available_from | Rfc3339Utc | yes | |
available_until | Rfc3339Utc | yes | |
maintenance_windows | object[] | yes | |
gpu_count | integer | no | |
model | string | no | |
vram_bytes | DecimalString | no | Unsigned base-10 integer as string; never a float. |
region | string | no | |
country | string | no | Additive. 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. |
continent | Continent | no | 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. |
ram_bytes | DecimalString | no | Unsigned base-10 integer as string; never a float. |
disk_bytes | DecimalString | no | Unsigned base-10 integer as string; never a float. |
measured_bandwidth_mbps | integer | no | netfacts lane. Measured DOWNLOAD rate in Mbps; additive. Absent = never measured (never 0). |
net_up_mbps | integer | no | netfacts lane. Measured UPLOAD rate in Mbps; rides the same measurement as measured_bandwidth_mbps. |
net_latency_ms | integer | no | netfacts lane. Median HTTPS latency in ms from the same measurement. |
speedtest_at | Rfc3339Utc | no | netfacts lane. When the current net facts were measured; renders 'measured N ago' honestly. |
tflops_bf16 | number | no | AI Speed. Measured dense BF16 matmul TFLOPS per GPU (the MIN across the machine's GPUs); additive. Absent = never measured (never 0). |
tflops_total | number | no | AI Speed. tflops_bf16 x gpu_count, computed, one decimal. Absent with tflops_bf16 or gpu_count. |
mem_bw_gbps | number | no | AI Speed. Measured device memory bandwidth in GB/s per GPU (the MIN across the machine's GPUs). Absent = never measured (never 0). |
ai_speed | integer | no | AI Speed. round(100*sqrt((tflops_bf16/165.2)*(mem_bw_gbps/1008))); RTX 4090 = 100. Absent unless both figures were measured. |
bench_at | Rfc3339Utc | no | AI Speed. When the current figures were measured. |
bench_flag | "unverified_spec" | no | AI Speed. The GPU has no datasheet row to check the figures against. |
disk_free_bytes | DecimalString | no | Additive. 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_s | DecimalString | no | Additive. Seconds since the machine booted, from the latest telemetry sample. Absent under the same rules as disk_free_bytes. |
gpu_utilization_pct | number | no | Additive. 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_at | Rfc3339Utc | no | Additive. 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_compatibility | string[] | no | |
manifest_hash | Sha256Hash | no | |
fit | TemplateFit | no | D-19(c). Present only when the request carried template_id; computed server-side from the template vram_fit against measured device VRAM. |
fits_template_ids | UUID[] | no | Additive. 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_bps | integer | no | Additive. Platform fee frozen into this offer version, in basis points (500 = 5%), taken out of each charge. |
verification_level | "unverified" | "auto_verified" | "manually_verified" | no | Additive. How the machine's hardware claims were verified. |
admitted | boolean | no | Additive. 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" | no | Additive (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"[] | no | Additive. 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. |
reliability | object | no | Additive. Approximate reliability score from machine fields only (no per-job joins on the catalog path). |
availability_class | AvailabilityClass | no | 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. |
preemption_notice_s | integer | null | no | D-22. Notice in seconds (SIGTERM plus /work/.amplerun-preempt) before the host stops an interruptible rental; null for dedicated. |
interruption_estimate | InterruptionEstimate | null | no | D-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
| Property | Type | Required | Description |
|---|---|---|---|
quote_id | UUID | yes | |
expires_at | Rfc3339Utc | yes | Quotes expire after 60 seconds. |
machine_id | UUID | yes | |
gpu_count | integer | yes | |
machine_rate_micro_per_hour | MicroAmount | yes | Money in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float. |
platform_fee_bps | integer | yes | |
budget_micro | MicroAmount | yes | Money in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float. |
duration_limit_s | integer | yes | |
included_disk_gib | integer | no | |
included_egress_gib | integer | no | |
manifest_hash | Sha256Hash | yes | |
image_digest | ImageDigest | yes | |
terms_version | string | yes | |
meter_start | const "verified_ready" | yes | |
template_id | UUID | no | D-19(c): echoed when the quote was created for a template. |
image_ref | string | no | Echoed when the request named a custom image by image_ref; image_digest is what it was pinned to. |
estimated_total_micro | MicroAmount | no | D-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" | no | Additive. Settlement asset whose balance the reservation holds; USDC unless the request chose USDT. |
availability_class | AvailabilityClass | no | 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. |
preemption_notice_s | integer | null | no | D-22. Notice in seconds before an interruptible rental is stopped; null for dedicated. |
interruption_estimate | InterruptionEstimate | null | no | D-22. For an interruptible quote, computed with horizon_h = the quoted duration rounded up to whole hours; null for dedicated. |
Job
| Property | Type | Required | Description |
|---|---|---|---|
job_id | UUID | yes | |
state | "RESERVED" | "STARTING" | "RUNNING" | "STOPPING" | "STOPPED" | "CLEANING" | "CLOSED" | "FAILED" | "RECONCILING" | yes | |
cumulative_charge_micro | MicroAmount | yes | Money in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float. |
funded_through | Rfc3339Utc | yes | |
budget_version | DecimalString | yes | Unsigned base-10 integer as string; never a float. |
machine_id | UUID | no | |
fence | DecimalString | no | Unsigned base-10 integer as string; never a float. |
rate_micro_per_hour | unknown | no | Additive. 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_ms | unknown | no | Additive. Control-owned accepted-runtime accumulator; 0 before any accepted receipt. |
meter_started_at | Rfc3339Utc | null | no | Additive. When the meter actually started (verified READY), not when the job was reserved. null means "not yet measured" — distinct from zero. |
last_meter_receipt_at | Rfc3339Utc | null | no | Additive. 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_at | Rfc3339Utc | null | no | Additive. 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" | no | Additive (D-23). The machine's tier; inference is community inference (don't send sensitive data). |
gpu_model | string | no | Additive. 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_count | integer | no | Additive. How many of `gpu_model` the machine has, from the same manifest. Absent with gpu_model. |
template | object | no | Additive. Present only when the job's quote named a template (quotes.template_id); summary of templates.spec. |
JobEvent
| Property | Type | Required | Description |
|---|---|---|---|
seq | DecimalString | yes | Unsigned base-10 integer as string; never a float. |
type | string | yes | |
at | Rfc3339Utc | yes | |
detail | object | no |
DepositAddress
| Property | Type | Required | Description |
|---|---|---|---|
chain_id | 8453 | yes | |
network | "base" | yes | |
address | EvmAddress | yes | |
live | boolean | no | False when asked with `live=0`; network statuses and SEEN rows were not read. |
svm_destinations | object[] | no | Additive. 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_deposits | object[] | no | Additive. Finalized credited or cap-held SPL token deposits, separate from EVM transaction hashes. |
networks | object[] | yes | Every 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. |
assets | object[] | yes | |
min_deposit_micro | MicroAmount | yes | Money in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float. |
max_deposit_micro | MicroAmount | null | yes | Room left under the account balance cap; null = no limit. |
finalized_block_number | DecimalString | null | yes | |
deposits | object[] | yes |
BalanceSet
| Property | Type | Required | Description |
|---|---|---|---|
spendable_micro | MicroAmount | yes | Money in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float. |
held_micro | MicroAmount | yes | Money in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float. |
pending_micro | MicroAmount | yes | Money in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float. |
disputed_micro | MicroAmount | yes | Money in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float. |
withdrawable_micro | MicroAmount | yes | Money in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float. |
spend_30d_micro | string | yes | |
spend_window_from | Rfc3339Utc | yes | |
spend_window_to | Rfc3339Utc | yes | |
active_hold_micro | MicroAmount | yes | Money in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float. |
confirming_micro | MicroAmount | no | Stablecoin 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_at | Rfc3339Utc | null | no | When 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_micro | MicroAmount | no | The smallest withdrawal, counted as what leaves the balance (fee included). |
withdrawal_fee_micro | MicroAmount | no | Flat fee kept from each withdrawal when it settles; what arrives is the amount minus this. |
welcome_credit_micro | MicroAmount | no | Remaining 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
| Property | Type | Required | Description |
|---|---|---|---|
binding_id | UUID | yes | |
chain_id | const 8453 | yes | |
address | EvmAddress | yes | |
version | DecimalString | yes | Unsigned base-10 integer as string; never a float. |
linked_at | Rfc3339Utc | yes | |
unlinked_at | Rfc3339Utc | null | yes |
WithdrawalAddress
A saved withdrawal / payout address (034). CONFIRMED by its email link (or the account's sign-in wallet); PENDING until then.
| Property | Type | Required | Description |
|---|---|---|---|
id | UUID | yes | |
network | "base" | yes | |
chain_id | integer | yes | |
address | EvmAddress | yes | |
label | string | null | yes | |
state | "PENDING" | "CONFIRMED" | yes | |
version | DecimalString | yes | Unsigned base-10 integer as string; never a float. |
created_at | Rfc3339Utc | yes | |
confirmed_at | Rfc3339Utc | null | yes |
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.
| Property | Type | Required | Description |
|---|---|---|---|
network | "base" | no | Defaults to base. |
address | EvmAddress | yes | |
amount_micro | MicroAmount | yes | Money in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float. |
asset | "USDC" | "USDT" | no | Defaults to USDC. |
label | string | no | Saved with a new address. |
code | string | no | |
siwe_message | string | no | |
signature | string | no |
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.
| Property | Type | Required | Description |
|---|---|---|---|
state | "INTENT" | "AWAITING_EMAIL_CONFIRMATION" | yes | |
withdrawal_id | UUID | no | |
payout_id | UUID | no | |
confirmation_id | UUID | no | |
address_id | UUID | yes | |
expires_at | Rfc3339Utc | no | |
asset | "USDC" | "USDT" | yes | |
fee_micro | MicroAmount | no | A queued withdrawal only. Kept as the platform fee when it settles. |
receive_micro | MicroAmount | no | A 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.
| Property | Type | Required | Description |
|---|---|---|---|
key_id | UUID | yes | |
label | string | yes | |
prefix | string | yes | First 12 characters of the key, for recognising it. |
scopes | "renter" | "host"[] | yes | |
expires_at | Rfc3339Utc | null | yes | |
revoked_at | Rfc3339Utc | null | yes | |
created_at | Rfc3339Utc | yes |
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.
| Property | Type | Required | Description |
|---|---|---|---|
id | UUID | yes | |
published | boolean | yes | |
template_id | string | yes | |
name | string | yes | |
template_version | string | yes | |
image_digest | ImageDigest | yes | Pinned OCI reference (name@sha256:<64 hex>) — the same form quotes, START commands and qualification records carry. |
launch_profile_version | string | yes | |
kind | "model" | "classical" | "custom" | yes | |
engine | "vllm" | "llamacpp" | "comfyui" | "faster-whisper" | "pytorch" | "jupyter" | "ollama" | "oci" | yes | |
model_ref | object | no | |
quantization | string | no | |
vram_fit | object | yes | |
readiness | object | no | |
exposes | object[] | yes | |
env | object | yes | |
min_gpu_count | integer | yes | |
required_runtime | "cuda" | "rocm-hip" | "level-zero" | "opencl" | "xpu" | yes | |
setup_notes | string | yes | |
runtimes | object | no | Additive. 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"[] | no | Additive. Backends with a built runtime, in preference order ("Works on" filter). Spec compatibility, not a hardware test. |
works_on | "nvidia" | "amd" | "intel" | "apple"[] | no | Additive. Hardware vendors those backends cover. Spec compatibility only; a hardware report is what says "tested on". |
TemplateRuntime
| Property | Type | Required | Description |
|---|---|---|---|
tier | "container" | "inference" | yes | |
image_digest | ImageDigest | yes |
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.
| Property | Type | Required | Description |
|---|---|---|---|
fits | boolean | yes | |
reason | string | yes |
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.
| Property | Type | Required | Description |
|---|---|---|---|
devices | object[] | yes | |
host | object | no |
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.
| Property | Type | Required | Description |
|---|---|---|---|
min | number | yes | |
avg | number | yes | |
max | number | yes |
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).
| Property | Type | Required | Description |
|---|---|---|---|
min | DecimalString | yes | Unsigned base-10 integer as string; never a float. |
avg | DecimalString | yes | Unsigned base-10 integer as string; never a float. |
max | DecimalString | yes | Unsigned 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.
| Property | Type | Required | Description |
|---|---|---|---|
x402Version | 2 | yes | |
error | string | yes | |
resource | object | yes | |
accepts | object[] | yes |
X402TopUp
| Property | Type | Required | Description |
|---|---|---|---|
intent_id | UUID | yes | |
state | "PENDING_FINALITY" | "CONFIRMED" | "EXCEPTION" | yes | |
amount_micro | DecimalString | yes | Unsigned base-10 integer as string; never a float. |
credited_micro | DecimalString | no | Unsigned base-10 integer as string; never a float. |
reason | string | no | |
payer | string | yes | The wallet that signed the authorization. It need not be linked to the account. |
tx_hash | string | yes | |
log_index | integer | yes | |
network | string | yes |
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.
| Property | Type | Required | Description |
|---|---|---|---|
state | string | yes | |
idempotency_key | UUID | yes | |
job_id | UUID | no | |
quote_id | UUID | no | |
budget_micro | DecimalString | no | Unsigned base-10 integer as string; never a float. |
platform_fee_bps | integer | no | |
machine_rate_micro_per_hour | MicroAmount | no | Money in micro-units of the settlement asset as a base-10 integer string ("5000000" is 5 USDC). Never a float. |
duration_limit_s | integer | no | |
estimated_total_micro | DecimalString | no | Unsigned base-10 integer as string; never a float. |
asset | "USDC" | no | |
payment | X402TopUp | null | no | |
retry | string | no | |
intent_id | UUID | no | |
amount_micro | DecimalString | no | Unsigned base-10 integer as string; never a float. |
payer | string | no | |
tx_hash | string | no | |
log_index | integer | no | |
network | string | no |