Prerequisites
- A Vast.ai account with credit (~$0.01–0.05, depending on test instance run time)
curlinstalledpython3with therequestslibrary (for the Python examples)
1. Get Your API Key
Generate an API key from the Keys page by clicking +New. Copy the key — you’ll need it for your API calls, and you’ll only see it once. Export it as an environment variable:2. Verify Authentication
Confirm your key works by fetching your account info. This returns your user ID, email, balance, and SSH key — a quick way to verify what your key grants access to.credit field shows your available credit, and ssh_key is the public key that will be injected into new instances.
If you get a
401 or 403, double-check your API key.3. Search for GPUs
Find available machines using the bundles endpoint. This query returns the top 5 on-demand RTX 4090s sorted by deep learning performance benchmarked per dollar:| Parameter | Value | Meaning |
|---|---|---|
verified | {"eq": true} | Only machines verified by Vast.ai (identity-checked hosts) |
rentable | {"eq": true} | Only machines currently available to rent |
gpu_name | {"eq": "RTX 4090"} | Filter to a specific GPU model |
num_gpus | {"eq": 1} | Exactly 1 GPU per instance |
direct_port_count | {"gte": 1} | At least 1 directly accessible port (needed for SSH) |
order | [["dlperf_per_dphtotal", "desc"]] | Sort by deep learning performance per dollar, best value first |
type | "on-demand" | On-demand pricing (vs. interruptible spot/bid) |
limit | 5 | Return at most 5 results |
offers array. Note the id of the offer you want — you’ll use it in the next step. If no offers are returned, try relaxing your filters (e.g. a different GPU model or removing direct_port_count).
4. Create an Instance
Rent the machine by sending a PUT request to the asks endpoint. ReplaceOFFER_ID with the id from step 3.
The simplest approach is to create from a template, which bundles your image, startup commands, and launch settings into a reusable configuration:
new_contract value — this is your instance ID. The instance_api_key provides scoped access for that specific instance (e.g., querying GET /api/v0/instances/{id}/ without your main API key).
Setting
"runtype": "ssh_direct" gives you a direct SSH connection to the machine, which has lower latency than the default proxy SSH. Recommended for interactive work.5. Wait Until Ready
The instance needs time to pull the Docker image and boot. Poll the status endpoint untilactual_status is "running". Replace INSTANCE_ID with the new_contract value from step 4.
actual_status field progresses through these states:
actual_status | Meaning |
|---|---|
null | Instance is being provisioned |
"loading" | Docker image is downloading |
"running" | Ready to use |
onstart script to send a callback when the instance is ready, instead of polling.
This endpoint returns extensive instance details (hardware specs, pricing, networking, utilization metrics, and more). See the Show Instance endpoint for the full field reference.
Once actual_status is "running", you’re ready to connect. Since we set runtype to ssh_direct in step 4, this is a direct connection to the machine.
6. Connect via SSH
Use thessh_host and ssh_port from the status response to connect directly to your new instance:
7. Copy Data
With SSH access, you can transfer files using any standard tool —scp, rsync, rclone, etc. For example:
8. Clean Up
When you’re done, destroy the instance to stop all billing. Alternatively, to pause an instance temporarily instead of destroying it, you can stop it. Stopping halts compute billing but disk storage charges continue. Destroy (removes everything):{"success": true}.
Next Steps
You’ve now completed the full instance lifecycle through the API: authentication, search, creation, polling, and teardown. From here:- SSH setup — See the SSH guide for key configuration and advanced connection options.
- Use templates — Avoid repeating image and config parameters on every create call. The Templates API guide covers creating, sharing, and launching from templates.