Test against real APIs without the real accounts.

stunt spins up local simulators for the public APIs your code calls — stateful, deterministic, zero network. A stunt double for the rate-limited, account-gated, billable original. Open source. 91 adapters ship in the binary.

$ brew install stuntapi/tap/stuntget started →

Apache-2.0 · single static binary · 91 adapters embedded · no remote calls

91
reference adapters
40k+
lines of simulator logic
REST · gRPC · WS · GraphQL
transports
0
remote accounts needed

You just want to write a feature. The API has other plans.

Create a developer account. Verify your domain. Wait for sandbox approval. Add a credit card. Hit the rate limit at 2am. Discover the test mode doesn't fire webhooks. Your test now depends on a service you can't control, can't reset, and that bills you.

before — the real thing
  • account-gated sandboxes
  • rate limits & quotas
  • flaky CI hitting prod
  • no clean state reset
  • surprise bills

One manifest. One command. Local, stateful, real-shaped.

TAKE 1

Describe your services

services:
  stripe:
    adapter: embedded:stripe-style
Point a service at a bundled adapter — or write inline rules.
TAKE 2

Run it

$ stunt up
stripe -> http://127.0.0.1:8000
State persists across requests. Webhooks fire to a local sink.
TAKE 3

Point your code at it

STRIPE_API_BASE_URL=\
  http://127.0.0.1:8000
Run your suite. It behaves against the real-shaped response — offline.

Built like a stunt department.

Stateful, not stubbed

Create a charge, list it, capture it, watch the webhook fire. SQLite-backed state survives across requests in one session.

Sandboxed adapters

Adapter logic runs in a Starlark VM — no filesystem, no network, noload(). Safe to install a stranger's mock.

All 4 transports

REST, gRPC (unary + streaming), WebSocket, and GraphQL — each adapter reproduces the real API's shape, not a toy.

Synthetic, enforced

stunt adapter lint rejects real-looking data (emails, tokens, card numbers). Everything is fake by construction.

Real TLS, locally

Optional subdomain mode serves https://api.localhost with a local CA + reverse proxy — no self-signed warning noise.

Operable by machines

--json on catalog/plan/doctor, plus anAGENTS.md + stunt llm reference, so coding agents drive it unaided.

The stand-in, not the stub.

stunthand-rolled mockscloud sandboxes
no remote account
stateful + resettablesometimes
offline / air-gapped CI
sandboxed 3rd-party mocks✓ (Starlark)
cost$0time$ + risk

Run your suite against a stunt double.

No account. No network. No bill.

brew install stuntapi/tap/stunt