Upload
The CLI handles everything below; use it unless you’re writing your own client:POST /v1/machines/{id}/files/upload takes {"root", "files": [{"path", "size", "sha256", "content_base64"}]}. Paths are relative to root (default /project) or absolute. Each file in the response has a status:
Commit uploaded files with
POST /v1/machines/{id}/files/upload/complete and {"root", "files": [{"path", "sha256", "upload_id"}]}, using each file’s upload_id. Each file comes back written, or committing while it’s still being copied onto the machine.
Download
POST /v1/machines/{id}/files/download takes {"root", "paths": [...]}, files or folders, relative to root (default /project). Each file comes back with its path, size and sha256, and either content_base64 (small files) or a download_url to GET (larger files; valid 2 hours).
Ports
Run a server on the machine, such as a preview, a notebook or a viewer, and open it in your browser:POST /v1/machines/{id}/ports with {"port": 8080} returns {port, url, expires_at}, where url is a link like https://k3v9q2m7x4b8n1c6z5w0.run.voyager.computer/. It serves HTTP and WebSockets while the machine runs, and stops working when it’s released or the link expires.