TypeScript SDK
@pandastack/sdk — official TypeScript / JavaScript SDK.
npm install @pandastack/sdk
# or
pnpm add @pandastack/sdk
# or
bun add @pandastack/sdkWorks in Node 20+, Deno, Bun, and modern edge runtimes (Cloudflare Workers, Vercel Edge).
Authentication
import { Client } from "@pandastack/sdk";
const c = new Client({
apiKey: process.env.PANDASTACK_API_KEY!,
apiUrl: "https://api-dev.pandastack.ai",
});Or set PANDASTACK_API_KEY + PANDASTACK_API in env and the default client picks them up.
Sandbox
import { Sandbox } from "@pandastack/sdk";
const sb = await Sandbox.create({
template: "code-interpreter",
cpu: 1,
memoryMB: 512,
});
try {
const { stdout, exitCode } = await sb.run("python -c 'print(2+2)'");
console.log(stdout);
} finally {
await sb.close();
}Streaming exec
const stream = sb.stream("python -c 'for i in range(10): print(i)'");
for await (const event of stream) {
if (event.type === "stdout") process.stdout.write(event.chunk);
if (event.type === "stderr") process.stderr.write(event.chunk);
if (event.type === "done") console.log("exit:", event.exitCode);
}Filesystem
await sb.fs.writeFile("/tmp/data.csv", "a,b\n1,2\n");
const contents = await sb.fs.readFile("/tmp/data.csv", "utf8");
const entries = await sb.fs.readdir("/tmp");Fork & snapshot
const child = await parent.fork();
const snap = await sb.snapshot();
const restored = await Sandbox.fromSnapshot(snap.id);Volumes
import { Volume } from "@pandastack/sdk";
const vol = await Volume.create({ name: "workspace", sizeGB: 10 });
const sb = await Sandbox.create({
template: "python-data",
volumes: [{ id: vol.id, mount: "/mnt/data" }],
});PTY (interactive terminal)
const pty = await sb.pty({ rows: 30, cols: 100 });
pty.onData((data) => process.stdout.write(data));
process.stdin.on("data", (data) => pty.write(data));Backed by a WebSocket to /v1/sandboxes/<id>/exec/pty.