nodes

Create a node (never blocks: provisioning or queued)

Create a node - one of the named node types, "h100-1", "h100-8", "cpu-2", or "cpu-8". For InfiniBand clusters, use create_cluster. Never blocks: returns status "provisioning" (capacity was free; the response carries the locked per-minute rate) or status "queued" with a live position and wait estimates (the scheduler provisions your node the moment a slot frees: set a boot command now - run_command on_wake, arrival_note says how - poll get_node paced off estimated_ready_seconds_p90, and never delete and re-create a queued node: its wait restarts from zero). Re-calling with the same name while queued or provisioning is idempotent, and an explicit max_wait on a queued re-call extends the hold, forward-only. Billing starts when the node is ready: rate.node_per_min is what the whole node costs per minute (rate.per_min is per-GPU), and a ready node with no session idles on its billed grace window - rate.minimum_minutes (currently 15 min on 1x, 20 min on 8x) - then auto-stops. That clock starts at provision time: a boot command or a run_command inside the window keeps the node; call stop_node the moment you are done. hold_node keeps it awake across turns (never a sleep loop). clock_lock and profiling are free and immutable once set (see those parameters); network: "<name>" joins a private network at creation (see attach_network for the trust model). GPU graphics (Vulkan, EGL and OpenGL on the GPU) is off by default and turned on per organization on request: ask with file_ticket; get_node's environment.gpu_graphics_enabled says whether yours has it. NAME IT SO IT IS OBVIOUSLY YOURS: the workspace is shared with other agents, a generic name ("train", "gpu") collides, and a name held by someone else's node refuses rather than handing you their box. Give the node a mission (open_mission first, pass mission: "<name>"): its provenance, work and cost land on the mission's page, the link you hand the human; omit it and the node files under the workspace's dated catch-all.

post/preview/nodes

Request

  • Base URL: https://autoresearch.sfcompute.com
  • URL: https://autoresearch.sfcompute.com/preview/nodes
  • Auth: HTTP bearer

Query parameters

workspacestring

Act in this workspace (its slug). Omitted: the token's bound workspace, then the organization's default. Never ambient - there is no switch-workspace mutation on this door.

Request body

chipstring required

Choose a node type. "h100-1" supplies one H100 GPU; "h100-8" supplies eight, with aliases "h100" and "8xh100". "cpu-2" supplies two reserved physical cores and 8 GiB RAM; "cpu-8" supplies eight cores on one NUMA node and 32 GiB RAM. CPU nodes have no GPU, bill as one unit, and can run in a different region from your GPU nodes. Use export_data and import_data to transfer files between nodes; direct snapshot restore requires a compatible node type and image. clock_lock and profiling require GPU nodes.

clock_lockboolean nullable

Benchmark mode: pin this node's GPUs to the model's published sustained clock for reproducible timings, instead of letting them drift with boost/thermal state. Set once at creation and immutable for the node's life (like the image). Physics, stated honestly: the lock is a CEILING, not a guarantee (the hardware still throttles below it under power/thermal pressure), and on an 8-GPU SXM baseboard neighbors' heat couples, so a full 8x node is the only fully isolated shape. Free: no rate change (you pay in your own forgone boost headroom). Default false. Use it for kernel/inference sweeps where noisy timings would poison the comparison.

from_snapshotstring nullable

Restore a ready snapshot into a new node with an independent volume. Use an id from snapshot_node or list_snapshots, and omit image to keep the source image. Snapshots contain the persistent disk; any declared /scratch starts empty, and billing starts when the clone is ready. The snapshot remains reusable until delete_snapshot. CPU/GPU transfers require compatibility with the requested node type and image, which create_node checks before creating a node. Use export_data and import_data to transfer files when a snapshot cannot restore directly.

homestring nullable

Registry-ref images only: the ABSOLUTE path your persistent disk mounts at. It is the one path that survives stops and wakes. Everything else is the image, and it resets every wake. Omitted = the home directory of the image's USER, from the image's /etc/passwd, else /root. The disk hides what the image keeps at that path, so if your image installs code in its home, pass a path the image does not use ("/data"). Refused alongside a catalog image, whose contract is /home/dev.

imagestring nullable

Catalog image name, or YOUR OWN container image as a registry ref ("nvcr.io/nvidia/pytorch:24.01-py3", "ubuntu:24.04" - anything with a '/', ':' or '@digest' is a ref; bare words are catalog names). Omitted = the catalog default - except with from_snapshot, where omitted = the SNAPSHOT'S own image, so a restore resumes on the toolchain the volume was built under; and with profiling: true, where omitted = the catalog's profiling entry. Naming a catalog image that can't profile alongside profiling: true is refused, never silently substituted; naming one that differs from a snapshot's image warns (venvs and compiled extensions may not import across images). An unknown catalog name is refused with the current list and a one-line description of each - pick by the toolkit your wheels were built against. The default is a bare CUDA toolkit that ships NO torch, so PyTorch work should name a pytorch-* entry, whose torch is preinstalled and built for its toolkit. CUDA version selection IS image selection, and the choice is immutable for the node's life. A registry ref runs YOUR image under the platform's supervision: a tag resolves ONCE at create to a manifest digest and every start runs exactly that build (a moved tag never moves your node); the platform supplies the entrypoint (your image's own never runs); your persistent disk mounts at home (below), and ONLY that path survives stops; run_command needs /bin/sh in the image; a private ref pulls through the org registry connection whose scope pin admits it. Never scanned - it runs in the same hardened isolation every node gets. Profiling with your own image works only if it ships nsight-compute >= 2025. The catalog stays the recommended path: pre-pulled on every host (instant starts), CUDA contract CI-gated, contents public.

max_waitstring nullable

How long a queued node may hold its spot with nobody using it: a duration like "30m" (ceiling "12h"; default: the server queue cap). Re-calling with a longer max_wait extends an existing hold, forward-only - a multi-hour wait should be one hold, not a polling loop.

missionstring nullable required

The mission this node belongs to (open_mission first - it is create-or-attach, so re-opening a name resumes it). Name it for the question you are answering ("serve-llama-70b"), never for the machine: this is the page a human opens to see what the work cost and what it concluded. Work you run on the node inherits it, so this is usually the only place you say it. Required: a call that omits it is refused with the fix.

namestring nullable

Node name (lowercase letters, digits, '-'); omitted = auto-generated.

networkstring nullable

Join a private network at creation: a network name in your workspace - one that doesn't exist yet is created for you (the create is audited separately; same as create_network then attach_network). Membership gives the node stable private addresses for its whole life and makes every port it listens on reachable by every other member - one trust zone: joining a network is trusting its members. Omit = no network (exactly today's isolation; the mesh is opt-in per node).

profilingboolean nullable

Benchmark mode's other half: unlock GPU profiler counters (CUPTI - what ncu needs) for this node. Whole-machine node types only (chip "h100-8"): GPU performance counters are a cross-tenant side channel, so on a shared machine they are never for sale - on a machine that is entirely yours they can only tell you about yourself. Placement waits for a profiling-capable machine (a small cohort; the queue states it honestly). Free: no rate change (you pay in shape). Set once at creation and immutable, like clock_lock - kernel-search customers typically set both. Default false. Also picks your image: an unlocked machine is only half of profiling - the image has to carry a profiler that works (nsight-compute 2025+) - so omitting image lands you on the catalog's profiling entry, which may or may not be the plain default depending on what the default currently ships.

scratch_gibinteger nullable

Ephemeral scratch disk, GiB: mounts fast local disk at /scratch, DESTROYED at stop and never snapshotted - put caches and re-downloadable data there (streaming-dataset shards, HF caches, decompressed archives), never the only copy of anything. Free: you pay only node time, and the space is claimed up front so it cannot vanish mid-run. Set once at creation and immutable, like clock_lock. Default 0 (no scratch). Your ceiling is the node_scratch_gib limit; the platform hard cap is 550 GiB (list_limits shows both) - no raise exceeds the cap. Large values narrow placement to workers with the disk free right now - the refusal names the numbers.

Response

The capability's JSON result.

objectstring

The resource type, when the result is one resource.

Changes

No recorded changes to this operation across all 1 revision of this API.