The official JavaScript client for the Everpod API.
Everpod puts your own AI agent on an always-on cloud computer, secured and backed up: run Claude Code, Codex or any agent you use on a machine that is yours, or have OpenClaw set up and run for you. A key lets an agent or an app you trust see your pods and start a new one for you, which you then pay for on everpod.ai. It can't pay, change or cancel a plan, delete anything, open your agent's control panel, or reach a developer pod's machine.
If you are connecting an agent such as Claude Code or Codex, you do not need this library: point it at Everpod's MCP server, as the API reference shows.
npm install @everpod-ai/sdk
Node.js 18 or later. No dependencies.
To make a key, open everpod.ai/account/keys and sign in with your email address and the code we send you. If you have no account yet, signing in makes one. Give the key to the library from an environment variable.
import { Everpod } from "@everpod-ai/sdk";
const everpod = new Everpod({ apiKey: process.env.EVERPOD_API_KEY });
// Start an OpenClaw pod under the name you want for its agent. Nothing is
// charged: the pod stays unpaid until you open pay_url in a browser and pay there.
const pod = await everpod.startPod({ name: "Otto" });
console.log(pod.status, pod.pay_url);
// Or a developer pod: the machine's name, your username on it, which
// coding agents come installed (any of claude, codex, opencode, pi, hermes and openclaw; Claude Code and Codex when left out) and its size (s, m or
// l; the S when left out).
const machine = await everpod.startPod({ name: "atlas", kind: "developer", login: "alex", agents: ["claude", "codex"], size: "m" });
// The pods on your account, oldest first.
const pods = await everpod.listPods();
// One pod by its id: how to check whether it has been paid for, and whether it is ready.
const same = await everpod.getPod(pod.id);While your account has an unpaid pod, starting another returns that same pod, changed to the name and kind now asked for.
A pod's fields and what each status means are in the API reference.
A refusal throws an EverpodError. Its message is the API's own sentence, which says what happened and what to do next; code and status are the refusal's.
import { EverpodError } from "@everpod-ai/sdk";
try {
await everpod.getPod(id);
} catch (error) {
if (error instanceof EverpodError) console.log(error.code, error.status, error.message);
}MIT