Founding keys are opena year free at 6,000 req/hour, for the first 1,000 developersClaim yours
Documentation 30

Agent tutorials · 3 pages · 10 min each

Test your agent against a world that never moves.

An agent that reads the tools your team works in is only as testable as the data underneath it, and a real account gives you neither a fixed answer nor a safe place to be wrong. Each page below points a tool client at a pinned host whose bytes never change, runs one small agent task against it, and asserts the answer, so the run in CI tonight is the run you did in your terminal this morning.

01Point at the pinned host
02Run the agent task
03Assert the answer in CI

01 / The three pages

One incident, three tools.

They are deliberately the same lesson three times, because the thing worth learning is the shape: fetch what a tool would return, decide something from it, assert the decision. They also read the SAME incident from three sides, so following all three is itself an exercise in whether an agent can cross tools.

02 / The story they read

Cassandra files it, Tiresias ships it.

On 2026-06-17 an engineer at olympus-labs opens a thread in #incident-bridge about events dropped during a rebalance. Six minutes earlier the same person filed FATE-51. Two days later a colleague merges pull request 53 from hotfix/backfill-job-ooming, and twenty-four minutes after the thread's all clear the tracker marks the issue Done.

Three vendors' APIs, asked independently, tell that one story, because one simulated company is underneath rather than three sets of fixtures somebody keeps in step by hand. The four-hop demo walks it end to end in a terminal, and the tour shows who the people in it are.

03 / The shape

Fetch, reason, assert.

Every script on these pages is plain requests in three labelled beats. The middle one is a pure function of the fetched rows, which is the beat you replace with a model call when you want an eval rather than a smoke test:

shape.py
rows = fetch(...)                       # what a tool call would return
answer = decide(rows)                   # swap in a model call here
assert answer == {"shipped": True}      # the row it read is frozen, so this holds

The assertions are values read off a frozen pin, never values typed into a page: apps/web/src/lib/tutorials.ts holds each script as the one string the page renders, and apps/web/src/lib/tutorials.test.ts compiles every one of them on each run and executes them against the pin hosts under SANDBOXAPIS_LIVE_TUTORIALS=1.

terminal
SANDBOXAPIS_LIVE_TUTORIALS=1 pnpm exec vitest run --project @sandboxapis/web src/lib/tutorials.test.ts

Next

Where to go from here.

SandboxAPIs for agents is the wider case for pointing an agent here; MCP setup is the same universe through tools instead of HTTP.

Verified quickstarts · Versioning and pinning · Coverage manifest · All docs