639·Shell Alpha · looking for testers

HTTPS API and SDKs

Your machines and account over HTTPS: everything an agent or a script needs (writing rules, turning delete protection off and answering invites stay in the app). Base URL: https://api.shell.639cloud.com. JSON in and out.

API keys

ssh keys@shell.639cloud.com new laptop    # prints the key once
ssh keys@shell.639cloud.com list
ssh keys@shell.639cloud.com revoke ID

Send it on every request as Authorization: Bearer 639_…. We store only a hash, so a lost key can't be recovered: revoke it and make a new one.

Quick start

export KEY=639_…
curl -s https://api.shell.639cloud.com/v1/catalog -H "Authorization: Bearer $KEY"
curl -s -X POST https://api.shell.639cloud.com/v1/machines \
  -H "Authorization: Bearer $KEY" -d '{"size": "s1", "image": "ubuntu"}'
curl -s -X POST https://api.shell.639cloud.com/v1/machines/ubuntu-1/exec \
  -H "Authorization: Bearer $KEY" -d '{"command": "uname -a"}'
curl -s -X DELETE https://api.shell.639cloud.com/v1/machines/ubuntu-1 -H "Authorization: Bearer $KEY"

Every call wakes a sleeping machine as needed.

Endpoints

GET /v1/catalog sizes and images
GET, POST /v1/machines list, create
GET, PATCH, DELETE /v1/machines/{name} read, change (RAM, CPU, disk, sleep, network, inbound, name), delete
POST /v1/machines/{name}/sleep, /restart sleep now, cold restart
POST /v1/machines/{name}/exec run a command; add ?stream=1 for live output (Server-Sent Events)
PUT, GET /v1/machines/{name}/files?path=… upload, download (up to 512 MB)
GET, POST /v1/vpcs, DELETE /v1/vpcs/{name} private networks
GET /v1/machines/{name}/bootlog a Full VM's boot log (plain text)
PUT /v1/machines/{name}/protection delete protection on ({"on": true}); off only in the app
POST, DELETE /v1/machines/{name}/vpc join, leave a VPC
GET, POST /v1/ips, DELETE /v1/ips/{addr} public IPv4s
GET /v1/usage?from=&to=&group_by= usage and cost, by machine or by a label
GET /v1/events, GET, POST /v1/webhooks, DELETE /v1/webhooks/{id} what happened, as a list or a live stream, and webhooks (see Events and webhooks)
GET, POST /v1/orgs, PATCH, DELETE /v1/orgs/{id} a platform's managed orgs; 639-Org: <id> on any call acts in one (see Platforms)
GET, POST /v1/templates, DELETE /v1/templates/{name}, POST /v1/templates/{name}/fork templates, fork many (beta; see Forking)
GET /v1/machines/{name}/rules, POST …/rules/ack the rules agents get, and acknowledging them (see Rules for agents)
GET, POST /v1/machines/{name}/notes, … the machine's notes
GET /v1/history, GET /v1/notifications what happened, notices

The full list, with every field: the OpenAPI spec and the API reference. | POST /v1/ips/{addr}/attach, /detach | attach, detach | | GET, POST /v1/keys, DELETE /v1/keys/{id} | API keys |

Errors are JSON, {"error": "…"}. Limits per key: 20 requests a second (bursts to 40), 30 creates a minute, and 5 machine deletes (sandboxes aside) in any 10 minutes; over that you get 429 with Retry-After. Agents over MCP have the same call and delete limits (as tool errors), and the delete limit is per person: all their keys and agents share it.

Python

from cloud639 import Client

c = Client()                     # reads CLOUD639_API_KEY
with c.create("s1", "ubuntu", delete_on_exit=True) as m:
    print(m.exec("uname -a").stdout)

TypeScript

import { Client } from "cloud639";

const c = new Client();          // reads CLOUD639_API_KEY
await using m = await c.create({ size: "s1", image: "node", deleteOnDispose: true });
console.log((await m.exec("node -e 'console.log(6*7)'")).stdout);

Both SDKs have no dependencies.

This page as Markdown: /docs/api-and-sdks.md