The Everpod API
The Everpod API is how an agent you already use, such as Claude Code or Codex, works with your Everpod account 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, or open your agent’s control panel.
It is an MCP server at https://everpod.ai/mcp and three REST routes under https://everpod.ai/api/v1, both used with a key you make in your account.
Make a key
- Sign in at everpod.ai/signin with your email address and the code we send you. If you have no account yet, signing in makes one.
- Open API keys from your account page, at everpod.ai/account/keys, name the key after what will use it, and make it.
- Copy the key. It starts with
everpod_.
We show a key once, when you make it, and keep no copy of it. You can revoke a key in your account at any time, and anything using it stops working at once. A key is not a way to sign in. Whoever holds a key can use it, so keep it secret. Give each agent or app a key of its own, so that revoking one leaves the others working.
What a key can do
Three operations. An agent you connect has each as a tool, with the description shown here, and a script calls each as a route.
- List pods (
list_pods,GET /api/v1/pods): List the pods on the owner's Everpod account, oldest first. Each has its status and the link its owner needs: pay_url while it is awaiting payment, url (the pod's page on everpod.ai) once it is paid. - Get a pod (
get_pod,GET /api/v1/pods/{id}): Read one pod by its id: its status and the link its owner needs. This is how to check whether a started pod has been paid for, and whether it is ready. - Start a pod (
start_pod,POST /api/v1/pods): Start a new pod for the owner, under the name they want for their agent. This call charges nothing: the pod stays unpaid until its owner opens pay_url in their browser and pays there. While the account has an unpaid pod, calling again returns that same pod, renamed if the name differs.
What a pod costs is on the page where you pay for it, and on everpod.ai.
Connect an agent
An MCP client connects to https://everpod.ai/mcp over HTTP and sends the key as the header Authorization: Bearer YOUR_KEY. When it connects, the agent is told what its tools can and cannot do and what each pod status means, so it can tell you where to pay and what happens next.
Claude Code
claude mcp add --transport http --scope user everpod https://everpod.ai/mcp \
--header "Authorization: Bearer YOUR_KEY"Codex
export EVERPOD_API_KEY=YOUR_KEY
codex mcp add everpod --url https://everpod.ai/mcp \
--bearer-token-env-var EVERPOD_API_KEYCodex reads the key from that environment variable each time it starts, so set it in the shell Codex runs in.
Another MCP client
Give it the address and the header. As a JSON entry, in the form Claude Code’s .mcp.json takes, with the key read from an environment variable so that it is never written into a file you share:
{
"mcpServers": {
"everpod": {
"type": "http",
"url": "https://everpod.ai/mcp",
"headers": { "Authorization": "Bearer ${EVERPOD_API_KEY}" }
}
}
}Then ask the agent, for example:
Start an Everpod pod called Otto and tell me where to pay.Call it from code
The same three operations over HTTPS. Every request carries the key as Authorization: Bearer YOUR_KEY, and requests and answers are JSON. The list answers { "pods": [...] }; reading or starting a pod answers { "pod": {...} }. Starting one takes { "name": "..." }, the name you want for the pod’s agent, up to 40 characters.
export EVERPOD_API_KEY=YOUR_KEY
curl https://everpod.ai/api/v1/pods \
-H "Authorization: Bearer $EVERPOD_API_KEY"
curl -X POST https://everpod.ai/api/v1/pods \
-H "Authorization: Bearer $EVERPOD_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Otto"}'A pod
{
"pod": {
"id": "5f0c1a52-8f1e-4d0b-9a57-3f6f2f7c1e9a",
"name": "Otto",
"harness": "openclaw",
"status": "awaiting_payment",
"created_at": "2026-10-03T09:12:44.512345+00:00",
"url": null,
"pay_url": "https://everpod.ai/create?pod=5f0c1a52-8f1e-4d0b-9a57-3f6f2f7c1e9a",
"plan": null,
"subscription": null
}
}id: the pod’s id, which reading one pod takes.name: the name of the pod’s agent.harness: the agent software the pod runs:openclawtoday.status: one of the statuses below.created_at: when the pod was started.pay_url: where the pod is paid for, by its owner in a browser. Present while the status isawaiting_payment, and null after.url: the pod’s page on everpod.ai, where its signed-in owner opens the agent’s control panel, connects a messaging app and manages the plan. Null until the pod is paid for.plan: the plan the pod is on,basewhen it is first paid for. Null until then.subscription: itsstatus, when the paid period ends (current_period_end), and whether it is set to end then (cancel_at_period_end). Null until the pod is paid for.
Pod status
awaiting_payment: named, and waiting for its owner to pay at pay_url.building: paid, and its computer is being set up. Setup usually takes about 15 minutes; its page (url) shows where this one is, and its owner gets an email when it is ready.setup_delayed: setup stopped partway on Everpod's side. Everpod is alerted and will fix it, and setup then carries on from where it stopped. Nothing is needed from the owner, who gets an email when the pod is ready.ready: awake. url is its page on everpod.ai, where its signed-in owner opens the agent's control panel and connects a messaging app.needs_attention: was running and has a problem. Its page (url) says what.stopped: its subscription ended. Its page (url) says what happens next.
When a request is refused
A refusal answers with a code and a message. The message says what happened and what to do next, in words an agent can pass on to you; over MCP the same message arrives as the tool’s error.
{
"error": {
"code": "not_found",
"message": "No pod with that id on this account."
}
}unauthorized(401): the request carried no key, or one that does not work: mistyped, or revoked.rate_limited(429): requests are arriving too quickly. The message says how long to wait.not_found(404): No pod with that id on this account.name_required(400): A pod needs a name: send a 'name', the name the owner wants for their agent.invalid_body(400): The request body must be JSON.server_error(500): Something went wrong on Everpod's side. Try again in a minute; support@everpod.ai if it keeps happening.
Questions
Anything about the API: support@everpod.ai. How your account and your keys are protected is in the Security overview.