Skip to main content

Description

The Pome REST API is the control plane at https://api.pome.sh/v1. It starts sandboxes, seeds them with a world of your own, and hands back the evidence a run produced. Everything the CLI and the MCP server do, they do by calling it. Reach for it directly when you are bringing your own evaluation harness. Pome gives you a deterministic world and a recorded tape; your harness decides what counts as a pass. If you would rather have Pome grade the run too, that works over the same API — see finalize. Every response is JSON except the markdown run report, which is text/markdown.

Base URL and versioning

v1 is the only version. Responses are tolerant-reader by design: the control plane may add fields to a response, so parse the keys you need and ignore the rest rather than rejecting an unfamiliar body. Two other hosts appear in responses, and neither is this API:

Authentication

Every endpoint takes a team API key as a bearer token:
Keys are shaped pme_<id>_<secret> and are minted in the dashboard, or by pome login, which stores one where the CLI can find it. The key is team-scoped: every sandbox, run, and task it can see belongs to that team.
A sandbox’s agent_token is not an API key. It is a short-lived bearer, scoped to one sandbox and expiring with it, and it authenticates calls to the twins on twins.pome.sh — never to api.pome.sh/v1. Hand that one to your agent; keep the pme_ key out of the agent’s environment.
Two failures are deliberately distinguishable:

How errors arrive

Every error is the same envelope. Sibling pages link back to this table rather than repeating it.
type is the coarse class and is drawn from a closed set. details is where the specific failure lives — branch on details.error when you need to tell two validation_faileds apart. request_id is on every error; quote it if you ask us about one.
Quota trips are 402, never 429. A 402 will not clear on its own — free a sandbox or raise the plan.

The error vocabulary worth branching on

These are the named failures a caller hits in normal use. Most arrive as 422 under details.error. The last three carry a different code and live under details.reason instead — each row says which key and which code.

Endpoint index

Every endpoint is documented on the endpoints page with the same shape: what it does, an input table, what comes back, the errors worth branching on, and one example call.

Identity and quota

Seeds

Sandboxes

Grading vocabulary

Runs and evidence

The loop, end to end

Four calls take you from nothing to a running agent in a world you wrote. Each one links to its full entry.
Step 4 is the tape: one row per HTTP call the agent made, with method, path, request body, and what the twin answered. It is live for as long as the sandbox is, it costs nothing, and it is what a bring-your-own-eval harness scores against. The digital twin quickstarts work through reading it.
task_source in step 2 is IyAuLgo= — base64 for # .., a stub. Today POST /v1/sandboxes requires a task even when you have brought a seed and will never read one. The full entry explains why, and it is the one wart on this path.
To have Pome grade the run instead of scoring it yourself, add a fifth call — finalize — while the sandbox is still live.

Limits

Concurrent sandboxes are a plan limit rather than a fixed number — GET /v1/usage reports yours.

See also

  • Endpoints — the full reference for every call above.
  • Digital twins — what each twin serves, and the shape of its seed.
  • CLI reference — the same loop, driven from a terminal.
  • MCP reference — the same loop, driven by a coach agent.
  • Terminology — what a sandbox, a run, and a criterion are.