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

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

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

Idempotency

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

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

Quote → reserve → access

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

SDK quickstarts

Both SDKs are pre-release until the first published version; the package names below are the intended ones. 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

pip install amplerun
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.

CLI reference

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

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

Errors

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

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

Reference

catalog

GET /api/v1/offers

List admitted offers (public)

Filter by model, minimum VRAM, GPU count, total machine price, region, RAM/disk, measured bandwidth and template compatibility. Only available, recently healthy admitted offers can reserve. No cached public responses. With template_id (D-19(c)) every item carries a server-computed fit object.

Auth
Public — no credential
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
cursorquerystringnoOpaque pagination cursor from a previous response.
limitqueryintegerno
template_idqueryUUIDnoCompute per-offer fit against this template's vram_fit (D-19(c)). Unknown or unpublished template -> 404.
max_rate_micro_per_hourqueryMicroAmountnoOnly offers whose total machine rate is at or below this amount.
gpu_countqueryintegernoOnly offers whose machine manifest lists at least this many devices.
modelquerystringnoCase-insensitive substring match on the first device model in the manifest.
Responses
  • 200Page of offer summaries. (object)
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/offers"

GET /api/v1/offers/{id}

Get one offer (public)

Auth
Public — no credential
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Responses
  • 200Offer summary. (OfferSummary)
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/offers/<id>"

GET /api/v1/templates

List published templates (public)

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

Auth
Public — no credential
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
cursorquerystringnoOpaque pagination cursor from a previous response.
limitqueryintegerno
kindquery"model" | "classical" | "custom"no
min_vram_bytesqueryDecimalStringnoReturn templates that fit a device with this much VRAM.
Responses
  • 200Page of templates. (object)
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/templates"

GET /api/v1/templates/{templateId}

Get one published template (public)

Auth
Public — no credential
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
templateIdpathstringyesTemplate UUID or its slug (spec.template_id, e.g. qwen3-8b-awq); unpublished -> 404.
Responses
  • 200Template. (Template)
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/templates/<templateId>"

jobs

POST /api/v1/quotes

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

Auth
Session cookie or API key with the renter scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
offer_idUUIDyes
image_digestImageDigestnoCustom OCI image; required unless template_id is given.
duration_limit_sintegeryes
budget_microMicroAmountyes
template_idUUIDnoD-19(c): published template; the server sets image_digest from it and the offer must fit, else 422. Mutually exclusive with image_digest.
Responses
  • 201Immutable quote. (Quote)
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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":"00000000-0000-4000-8000-000000000000","image_digest":"string","duration_limit_s":1,"budget_micro":"string","template_id":"00000000-0000-4000-8000-000000000000"}'

GET /api/v1/jobs

List own jobs (renter owner/admin)

Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
cursorquerystringnoOpaque pagination cursor from a previous response.
limitqueryintegerno
Responses
  • 200Page of jobs. (object)
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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/jobs

Reserve job from quote (quote owner)

Atomically holds budget, reserves machine, increments fence and queues start. Rejects expired quote, changed manifest, unavailable machine or insufficient spendable funds without partial holds.

Auth
Session cookie or API key with the renter scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
quote_idUUIDyes
ssh_public_keystringyes
Responses
  • 202Job reserved. (object)
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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":"00000000-0000-4000-8000-000000000000","ssh_public_key":"string"}'

GET /api/v1/jobs/{id}

Job status, cumulative charge, funded-through (owner/admin)

Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Responses
  • 200Job detail. (Job)
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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}/events

Sequenced job events (owner/admin); logs sanitized and bounded

Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
cursorquerystringnoOpaque pagination cursor from a previous response.
limitqueryintegerno
Responses
  • 200Page of sequenced events. (object)
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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}/access

Current endpoint, SSH host-key fingerprint and command (renter owner)

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

Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Responses
  • 200Access material. (object)
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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"

POST /api/v1/jobs/{id}/stop

Stop job (renter owner/admin); repeat is idempotent

Auth
Session cookie or API key with the renter scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
reasonstringyes
Responses
  • 202STOPPING or original terminal result. (object)
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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":"string"}'

POST /api/v1/jobs/{id}/budget-extension

Append funded budget amendment (renter owner)

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

Auth
Session cookie or API key with the renter scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
additional_budget_microMicroAmountyes
new_duration_limit_sintegeryes
expected_job_versionDecimalStringyesUnsigned base-10 integer as string; never a float.
expected_budget_versionDecimalStringyesUnsigned base-10 integer as string; never a float.
Responses
  • 202Amendment committed; returns new budget_version. (object)
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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":"string","new_duration_limit_s":1,"expected_job_version":"string","expected_budget_version":"string"}'

POST /api/v1/jobs/{id}/rerun

Fresh quote parameters (renter owner); never launches/spends automatically

Auth
Session cookie or API key with the renter scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Responses
  • 200Fresh quote parameters. (object)
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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/account

Profile/security metadata (self); no password/token hashes

Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Responses
  • 200Account profile.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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"

GET /api/v1/account/sessions

Session metadata (self)

Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Responses
  • 200Active sessions.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/account/sessions" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"

DELETE /api/v1/account/sessions/{id}

Revoke one of the caller's own sessions (self; interactive sessions only)

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

Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
idpathstringyesBetter Auth session id (not a UUID).
Responses
  • 204Revoked.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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-keys

List API keys (self)

Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Responses
  • 200API key metadata; secrets never re-shown.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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-keys

Create API key (self, step-up)

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

Auth
Session cookie or API key with the renter scope; recent step-up (POST /api/v1/account/step-up) required
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
labelstringyes
expires_atRfc3339Utcno
scopes"renter" | "host"[]yes
Responses
  • 201API key created; secret returned exactly once.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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-01-01T00:00:00Z","scopes":["renter"]}'

DELETE /api/v1/account/api-keys/{id}

Revoke API key (self, step-up)

Auth
Session cookie or API key with the renter scope; recent step-up (POST /api/v1/account/step-up) required
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Responses
  • 204Revoked.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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)"

POST /api/v1/account/export

Data export (self, recent re-auth)

Auth
Session cookie or API key with the renter scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Responses
  • 202Export job persisted.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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-request

Retention-aware deletion request (self, recent re-auth); required ledger evidence preserved under disclosed policy

Auth
Session cookie or API key with the renter scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Responses
  • 202Deletion request persisted.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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)"

wallets

GET /api/v1/wallets

List wallet bindings (verified self)

Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Responses
  • 200Wallet bindings. (object)
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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/nonce

SIWE nonce (verified self, re-auth)

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

Auth
Session cookie or API key with the renter scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Responses
  • 201Single-use nonce. (object)
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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/link

Link wallet via SIWE proof (verified self, re-auth)

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

Auth
Session cookie or API key with the renter scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
chain_idconst 8453yes
addressEvmAddressyes
siwe_messagestringyes
signaturestringyes
Responses
  • 201Binding created. (WalletBinding)
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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":"string","siwe_message":"string","signature":"string"}'

DELETE /api/v1/wallets/{binding_id}

Unlink wallet (verified self, re-auth)

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

Auth
Session cookie or API key with the renter scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
binding_idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Responses
  • 204Unlinked.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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)"

POST /api/v1/wallets/{binding_id}/payout-destination

Select proved, versioned payout destination (verified self, recent re-auth/SIWE)

Future transfer intents bind wallet_binding_id,address,version; pending intents never retarget.

Auth
Session cookie or API key with the renter scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
binding_idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Responses
  • 202Destination version selected.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X POST "https://amplerun.com/api/v1/wallets/<binding_id>/payout-destination" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)"

billing

POST /api/v1/funding-intents

Create funding intent (bound wallet owner)

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

Auth
Session cookie or API key with the renter scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
wallet_binding_idUUIDyes
amount_microMicroAmountyes
Responses
  • 201Funding intent. (object)
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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":"00000000-0000-4000-8000-000000000000","amount_micro":"string"}'

POST /api/v1/funding-intents/{id}/claim

Claim 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. Provider error pauses credit; never zero balance and never success.

Auth
Session cookie or API key with the renter scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
tx_hashstringyes
log_indexintegeryes
Responses
  • 202Claim state. (object)
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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/billing

Balance summary (self/admin); spendable/held/pending/disputed/withdrawable separately

Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Responses
  • 200Balances. (BalanceSet)
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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/entries

Itemized ledger entries (self/admin)

Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
cursorquerystringnoOpaque pagination cursor from a previous response.
limitqueryintegerno
Responses
  • 200Page of ledger entries with immutable external references and evidence links.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 503 unavailable money/provider state with retryable:true. (ErrorEnvelope)
Example
curl -X GET "https://amplerun.com/api/v1/billing/entries" \
  -H "Authorization: Bearer $AMPLERUN_API_KEY"

GET /api/v1/billing/receipts/{job}

Itemized invoice/receipt and supplier information for a job (self/admin)

Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
jobpathUUIDyes
Responses
  • 200Receipt.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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/withdrawals

Create withdrawal (self, step-up)

Locked withdrawal intent; raw/unproved destination rejected; no spendable credit while transfer pending.

Auth
Session cookie or API key with the renter scope; recent step-up (POST /api/v1/account/step-up) required
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
amount_microMicroAmountyes
wallet_binding_idUUIDyes
destination_versionDecimalStringyesUnsigned base-10 integer as string; never a float.
Responses
  • 202Withdrawal intent locked.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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 '{"amount_micro":"string","wallet_binding_id":"00000000-0000-4000-8000-000000000000","destination_version":"string"}'

hosts

POST /api/v1/hosts/enrollment-tokens

Host enrollment token (verified host account)

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

Auth
Session cookie or API key with the host scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Responses
  • 201Enrollment material. (object)
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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)"

GET /api/v1/hosts/machines

List own machines (host owner/admin)

Auth
Session cookie or API key with the host scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
cursorquerystringnoOpaque pagination cursor from a previous response.
limitqueryintegerno
Responses
  • 200Page of machine summaries.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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)

Auth
Session cookie or API key with the host scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Responses
  • 200Machine detail.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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"

POST /api/v1/hosts/machines/{id}/offer

Publish versioned future offer (host owner)

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

Auth
Session cookie or API key with the host scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
rate_micro_per_hourMicroAmountyes
included_quotasobjectyes
available_fromRfc3339Utcyes
available_untilRfc3339Utcyes
maintenance_windowsobject[]no
expected_versionDecimalStringyesUnsigned base-10 integer as string; never a float.
Responses
  • 202Offer version committed with new offer_version.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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":"string","included_quotas":{"included_disk_gib":0,"included_egress_gib":0},"available_from":"2026-01-01T00:00:00Z","available_until":"2026-01-01T00:00:00Z","maintenance_windows":[{"starts_at":"2026-01-01T00:00:00Z","ends_at":"2026-01-01T00:00:00Z","reason":"string"}],"expected_version":"string"}'

POST /api/v1/hosts/machines/{id}/list

List machine (host owner); admission checks apply

Auth
Session cookie or API key with the host scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Responses
  • 202Listing admitted or rejected with findings.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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}/drain

Drain machine (host owner); stops new bookings, never kills an active job or retrieval cleanup

Auth
Session cookie or API key with the host scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Responses
  • 202DRAINING.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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}/unlist

Unlist idle offer (host owner); never kills an active job or retrieval cleanup

Auth
Session cookie or API key with the host scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Responses
  • 202UNLISTED.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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)"

GET /api/v1/hosts/earnings

Earnings (host owner): earned, disputed, payable, requested, settled; gross vs 10% fee; no utilization guess

Auth
Session cookie or API key with the host scope
Idempotency-Key
not used
Responses
  • 200Earnings breakdown. (object)
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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"

POST /api/v1/hosts/payouts

Request payout (host owner, step-up)

Payout intent locked against payable; raw/unproved destination rejected.

Auth
Session cookie or API key with the host scope; recent step-up (POST /api/v1/account/step-up) required
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
amount_microMicroAmountyes
wallet_binding_idUUIDyes
destination_versionDecimalStringyesUnsigned base-10 integer as string; never a float.
Responses
  • 202Payout intent locked.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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 '{"amount_micro":"string","wallet_binding_id":"00000000-0000-4000-8000-000000000000","destination_version":"string"}'

support

GET /api/v1/tickets

List own tickets (opener); cursor paged, ordered by id

Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
cursorquerystringnoOpaque pagination cursor from a previous response.
limitqueryintegerno
Responses
  • 200Page of ticket summaries. (object)
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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/tickets

Open support ticket (participant/admin); secrets redacted, ownership checked

Auth
Session cookie or API key with the renter scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
categorystringyes
textstringyes
job_idUUIDno
payment_referencestringno
Responses
  • 201Ticket created.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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":"00000000-0000-4000-8000-000000000000","payment_reference":"string"}'

GET /api/v1/tickets/{id}

Ticket thread (participant/admin); participants see only their own permitted thread

Auth
Session cookie or API key with the renter scope
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Responses
  • 200Ticket with messages.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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}/messages

Append message (participant/admin)

Auth
Session cookie or API key with the renter scope
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
textstringyes
Responses
  • 201Message appended.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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/users

Admin user view (Admin+MFA); immutable references

Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
cursorquerystringnoOpaque pagination cursor from a previous response.
limitqueryintegerno
Responses
  • 200Filtered operational view.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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/machines

Admin machine view (Admin+MFA)

Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
cursorquerystringnoOpaque pagination cursor from a previous response.
limitqueryintegerno
Responses
  • 200Filtered operational view.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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/jobs

Admin job view (Admin+MFA)

Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
cursorquerystringnoOpaque pagination cursor from a previous response.
limitqueryintegerno
Responses
  • 200Filtered operational view.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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/ledger

Admin ledger view (Admin+MFA)

Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
cursorquerystringnoOpaque pagination cursor from a previous response.
limitqueryintegerno
Responses
  • 200Filtered operational view.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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/payouts

Admin payout view (Admin+MFA)

Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
cursorquerystringnoOpaque pagination cursor from a previous response.
limitqueryintegerno
Responses
  • 200Filtered operational view.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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/tickets

Admin ticket view (Admin+MFA)

Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
cursorquerystringnoOpaque pagination cursor from a previous response.
limitqueryintegerno
Responses
  • 200Filtered operational view.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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/audit

Admin audit view (Admin+MFA)

Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
not used
Parameters
NameInTypeRequiredDescription
cursorquerystringnoOpaque pagination cursor from a previous response.
limitqueryintegerno
Responses
  • 200Filtered operational view.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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/reconciliation

Admin reconciliation view (Admin+MFA); unexplained differences >0 micro pause new paid admissions/payouts

Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
not used
Responses
  • 200Reconciliation status; stale RPC yields UNAVAILABLE without overwriting prior confirmed figures.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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/analytics

Admin analytics (Admin+MFA); committed capacity, paid time, GMV, fees, costs, refunds and repeat users separated; unavailable inputs stay null

Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
not used
Responses
  • 200Analytics.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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"

POST /api/v1/admin/templates/{templateId}/publish

Publish template (Admin+MFA); audit event; refused unless a qualification record binds it to an admitted machine

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

Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
templateIdpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
reasonstringyes
Responses
  • 202Publish accepted; audit event recorded.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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}/approve

Approve machine (Admin+MFA); reason + expected version; in-flight work gets explicit policy, not silent deletion

Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
reasonstringyes
expected_versionDecimalStringyesUnsigned base-10 integer as string; never a float.
Responses
  • 202Approved.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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":"string"}'

POST /api/v1/admin/machines/{id}/quarantine

Quarantine machine (Admin+MFA); reason + expected version; in-flight work gets explicit policy, not silent deletion

Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
reasonstringyes
expected_versionDecimalStringyesUnsigned base-10 integer as string; never a float.
Responses
  • 202Quarantined.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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":"string"}'

POST /api/v1/admin/refunds

Refund (Admin+recentMFA); evidence/reason, exact immutable manifest or compensating journal; no raw balance-edit endpoint

Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
job_idUUIDyes
amount_microMicroAmountyes
reasonstringyes
evidencestring[]yes
Responses
  • 202Refund adjustment committed once; cumulative cap enforced.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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":"00000000-0000-4000-8000-000000000000","amount_micro":"string","reason":"string","evidence":["string"]}'

POST /api/v1/admin/payouts/{id}/approve

Approve payout manifest (Admin+recentMFA); exact immutable manifest hash; destination change invalidates approval

Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
manifest_hashSha256Hashyes
reasonstringyes
Responses
  • 202Approved.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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":"string","reason":"string"}'

POST /api/v1/admin/payouts/{id}/signed-transaction

Submit signer-produced raw transaction (Admin+recentMFA); verified to match approved manifest and signer; returns deterministic hash

Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
idpathUUIDyes
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
raw_transactionstringyes
Responses
  • 202Accepted for broadcast. (object)
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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/admissions

Pause/resume admissions (Admin+recentMFA); pauses new jobs/credits as appropriate, never abrupt tenant termination

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

Auth
Admin session with enrolled TOTP; API keys are rejected
Idempotency-Key
required (UUID header)
Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderUUIDyesUUID scoped to authenticated principal, route and canonical request hash.
Request body (application/json)
PropertyTypeRequiredDescription
enabledbooleanyes
reasonstringyes
Responses
  • 202Admission state committed.
  • defaultError envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 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"}'

health

GET /api/v1/health/live

Liveness (public minimal)

Auth
Public — no credential
Idempotency-Key
not used
Responses
  • 200Process alive.
Example
curl -X GET "https://amplerun.com/api/v1/health/live"

GET /api/v1/health/ready

Readiness (public minimal); schema/DB/worker/clock with redacted degraded reasons; no internal topology leakage

Auth
Public — no credential
Idempotency-Key
not used
Responses
  • 200Ready.
  • 503Degraded; redacted reasons.
Example
curl -X GET "https://amplerun.com/api/v1/health/ready"

GET /api/v1/status

Public status (minimal)

Auth
Public — no credential
Idempotency-Key
not used
Responses
  • 200Status.
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

MicroAmount fields: DecimalString

EvmAddress

EvmAddress fields: string

Sha256Hash

Sha256Hash fields: string

ImageDigest

ImageDigest fields: string

ErrorEnvelope

ErrorEnvelope fields
PropertyTypeRequiredDescription
errorobjectyes

CursorPage

CursorPage fields
PropertyTypeRequiredDescription
itemsobject[]yes
next_cursorstring | nullyes

OfferSummary

No host management address is ever exposed.

OfferSummary fields
PropertyTypeRequiredDescription
offer_idUUIDyes
machine_idUUIDyes
observed_atRfc3339Utcyes
offer_versionDecimalStringyesUnsigned base-10 integer as string; never a float.
expected_versionDecimalStringyesUnsigned base-10 integer as string; never a float.
readiness"ready" | "provisioning" | "unavailable"yes
total_rate_micro_per_hourMicroAmountyes
included_quotasobjectyes
available_fromRfc3339Utcyes
available_untilRfc3339Utcyes
maintenance_windowsobject[]yes
gpu_countintegerno
modelstringno
vram_bytesDecimalStringnoUnsigned base-10 integer as string; never a float.
regionstringno
ram_bytesDecimalStringnoUnsigned base-10 integer as string; never a float.
disk_bytesDecimalStringnoUnsigned base-10 integer as string; never a float.
measured_bandwidth_mbpsDecimalStringnoUnsigned base-10 integer as string; never a float.
template_compatibilitystring[]no
manifest_hashSha256Hashno
fitTemplateFitnoD-19(c). Present only when the request carried template_id; computed server-side from the template vram_fit against measured device VRAM.

Quote

Quote fields
PropertyTypeRequiredDescription
quote_idUUIDyes
expires_atRfc3339UtcyesQuotes expire after 60 seconds.
machine_idUUIDyes
gpu_countintegeryes
machine_rate_micro_per_hourMicroAmountyes
platform_fee_bpsintegeryes
budget_microMicroAmountyes
duration_limit_sintegeryes
included_disk_gibintegerno
included_egress_gibintegerno
manifest_hashSha256Hashyes
image_digestImageDigestyes
terms_versionstringyes
meter_startconst "verified_ready"yes
template_idUUIDnoD-19(c): echoed when the quote was created for a template.
estimated_total_microMicroAmountnoD-19(c): floor(total_rate_micro_per_hour * duration_limit_s / 3600), fee included; informational — the quote's budget_micro remains the only price authority.

Job

Job fields
PropertyTypeRequiredDescription
job_idUUIDyes
state"RESERVED" | "STARTING" | "RUNNING" | "STOPPING" | "STOPPED" | "CLEANING" | "CLOSED" | "FAILED" | "RECONCILING"yes
cumulative_charge_microMicroAmountyes
funded_throughRfc3339Utcyes
budget_versionDecimalStringyesUnsigned base-10 integer as string; never a float.
machine_idUUIDno
fenceDecimalStringnoUnsigned base-10 integer as string; never a float.

JobEvent

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

BalanceSet

BalanceSet fields
PropertyTypeRequiredDescription
spendable_microMicroAmountyes
held_microMicroAmountyes
pending_microMicroAmountyes
disputed_microMicroAmountyes
withdrawable_microMicroAmountyes

WalletBinding

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

Template

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

Template fields
PropertyTypeRequiredDescription
idUUIDyes
publishedbooleanyes
template_idstringyes
namestringyes
template_versionstringyes
image_digestImageDigestyesPinned OCI reference (name@sha256:<64 hex>) — the same form quotes, START commands and qualification records carry.
launch_profile_versionstringyes
kind"model" | "classical" | "custom"yes
engine"vllm" | "llamacpp" | "comfyui" | "faster-whisper" | "pytorch" | "jupyter" | "ollama" | "oci"yes
model_refobjectno
quantizationstringno
vram_fitobjectyes
readinessobjectno
exposesobject[]yes
envobjectyes
min_gpu_countintegeryes
required_runtime"cuda" | "rocm-hip" | "level-zero" | "opencl" | "xpu"yes
setup_notesstringyes

TemplateFit

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

TemplateFit fields
PropertyTypeRequiredDescription
fitsbooleanyes
reasonstringyes