Skip to content

API

Base URL https://api.racksystems.cloud/v1. JSON in, JSON out. Authentication is a bearer key from the console. Every response carries a request_id header. Rate limit is 600 requests per minute per key.

Preview

During preview every endpoint answers HTTP 503 with the body {"error":"Console access is invite only during preview"}. The shapes below are final.

Authentication

bash
curl -s https://api.racksystems.cloud/v1/capacity \
  -H "Authorization: Bearer $RACK_API_KEY"

A missing or invalid key returns 401. A key without permission for the cluster returns 403.

POST /jobs

Submit a job.

FieldTypeRequiredNotes
clusterstringyesc1
imagestringyesOCI image reference
commandstring[]yesEntrypoint override
gpusintegeryes1 to 8
planstringyeson_demand, reserved, batch
max_minutesintegeryes1 to 10080
envobjectnoEnvironment variables
retry_on_preemptbooleannoBatch only, default false
labelsobjectnoFree form, returned unchanged
python
import json, os, urllib.request

def rack(method, path, body=None):
    req = urllib.request.Request(
        f"https://api.racksystems.cloud/v1{path}",
        method=method,
        data=json.dumps(body).encode() if body else None,
        headers={
            "Authorization": f"Bearer {os.environ['RACK_API_KEY']}",
            "Content-Type": "application/json",
        },
    )
    with urllib.request.urlopen(req) as r:
        return json.load(r)

job = rack("POST", "/jobs", {
    "cluster": "c1",
    "image": "ghcr.io/yourlab/train:latest",
    "command": ["python", "train.py"],
    "gpus": 4,
    "plan": "on_demand",
    "max_minutes": 1440,
})
print(job["id"])

Returns 201 with the job object. Returns 422 with a fields object when a field is invalid.

GET /jobs/

bash
curl -s https://api.racksystems.cloud/v1/jobs/job_01j8x2 \
  -H "Authorization: Bearer $RACK_API_KEY"
json
{
  "id": "job_01j8x2", "status": "running", "cluster": "c1", "plan": "on_demand",
  "gpus": ["gpu2", "gpu3", "gpu4", "gpu5"], "queue_position": null,
  "started_at": "2026-09-14T21:03:11Z", "ended_at": null,
  "metered_minutes": 128, "cost_usd": 21.25, "exit_code": null
}

Status is one of queued, running, succeeded, failed, preempted, cancelled. DELETE /jobs/{id} cancels a queued or running job.

GET /clusters/c1/telemetry

Query window from 1m to 30d. Windows up to 24 h return one sample per minute, longer windows one per 5 minutes.

bash
curl -s "https://api.racksystems.cloud/v1/clusters/c1/telemetry?window=1h" \
  -H "Authorization: Bearer $RACK_API_KEY"

Returns { "samples": [ ... ] } with the schema on the telemetry page. Samples for GPUs held by your jobs carry a job_id.

GET /capacity

json
{
  "clusters": [{
    "id": "c1", "region": "us-west", "gpu": "h100-sxm-80gb",
    "free": { "on_demand": 2, "batch": 5 },
    "estimated_wait_minutes": { "on_demand": 0, "batch": 9 }
  }]
}

Add ?report=2026-08 to get a monthly capacity report instead.

Errors

Errors are { "error": "message", "request_id": "..." } with a matching HTTP status. Retry 429 and 503 with backoff. Do not retry 4xx other than 429.

RACK SYSTEMS, us-west. Console and API access is by invitation during preview.