Your agent's tests pass against mocks that always say 200 OK. The dropped webhook, the stale balance, the race on the queue all surface later, in review or in production.
A Veris Dependency Sandbox replaces every outbound call your code makes with a live simulated instance that holds state.
Coding agents write code faster than anyone can integration-test it. Static mocks return canned responses, and a shared staging environment can't serve a fleet of agents mutating it concurrently.
Your team already has one of these, and each one solves part of the problem. Scored on the same criteria, the gaps are where the state-dependent bugs get through.
| Capability | static mocksWireMock, Nock, MSW | vendor test modeStripe test mode | shared stagingyour staging deploy | empty compute sandboxE2B, Daytona | Veris AI |
|---|---|---|---|---|---|
| Holds state between calls | no | yes | yes | no | yes |
| Vendor-true endpoints, status codes, webhooks | no | yes | partly | no | yes |
| Isolated per agent | yes | no | no | yes | yes |
| Resets to a known seed between runs | yes | no | no | yes | yes |
| Outages and failure paths on cue | partly | no | no | no | yes |
| Safe for destructive tests | yes | partly | no | yes | yes |
| No live credentials handed to the agent | yes | no | no | yes | yes |
| Covers your internal services too | partly | not applicable | yes | no | yes |
| Nothing for the agent to build and maintain | no | yes | yes | no | yes |
Every Veris solution runs on the same simulation engine. Compose an environment by listing the systems in your stack (databases, APIs, MCPs, and the humans in the loop) and describe a scenario in plain language. The engine simulates that world: actors stay on goal and behave like people, services stay consistent and high-fidelity, and every run is isolated and repeatable.
A mock returns the same canned response forever. A Veris twin holds state: write a row, read it back, watch a webhook fire. The failure modes that actually reach production are the ones your agent now catches.
E2B, Daytona, or your own containers answer “where does my code run?” Veris answers “what does my code run against?” An empty compute sandbox has no dependency environment: the agent must invent its own fakes, and whether those fakes match vendor reality is a coin flip. Veris fills the sandbox you already use with stateful, vendor-true twins.
Each Dependency Sandbox is isolated with its own per-service endpoints, so a hundred agents can run destructive tests concurrently without sharing a staging environment. Nobody waits, nobody collides.
The whole lifecycle is an API call: create a Dependency Sandbox, get endpoints, reset state between test runs, destroy it when the branch merges. Built to sit inside an agent loop, not a ticket queue.
Claude Code, Codex, Cursor, or your own harness, running on your laptop, in an E2B or Daytona sandbox, or on your CI runners. The agent just points its config at Veris endpoints. No framework to adopt, no SDK lock-in, nothing new to teach the agent.
Veris is in beta. Bring a repository with tests that call at least one third-party API, and Docker running, and your existing test command starts running against twins.
See twins vs. production →Connect this repository to Veris.
Work through these in order, checking each one first. Skip anything already in place.
1. Work out which coding agent you are.
2. Install the Veris plugin `veris` from the `veris-ai/plugins` marketplace, using your own plugin commands. It carries three commands: setup, build, fix.
3. Install the Veris CLI, then check that `veris version` answers.
macOS and Linux:
curl -LsSf https://raw.githubusercontent.com/veris-ai/veris-cli/main/scripts/install.sh | sh
Windows:
powershell -c "irm https://raw.githubusercontent.com/veris-ai/veris-cli/main/scripts/install.ps1 | iex"
4. Sign me in with `veris login`, then wait until I have approved it in the browser before carrying on. It prints a pairing code and a console link. The key is saved to ~/.veris/twin.yaml — there is no key to copy and no shell profile to edit.
Leave my application code alone. This touches nothing else. If a step fails, tell me which one and how to fix it, then stop.
When everything checks out, make your new commands available and run Veris setup, naming the services this repository calls.No, it fills them. E2B, Daytona, Docker, or your own Kubernetes give the agent compute: a filesystem and a shell. Veris provides what that compute talks to: the stateful databases, payment APIs, CRMs, and queues the code under test depends on. Point the sandbox's environment variables at Veris endpoints and keep everything else exactly as it is. Bring your own compute; Veris supplies the dependency environment.
A mock returns canned responses and holds no state: write a row, and there's nothing to read back. Vendor test modes are real but limited: you can't trigger an outage on cue, async failure paths often depend on webhooks, and the shared account accumulates state across runs. A Veris Dependency Sandbox is stateful and vendor-true, with failure states configurable as data, and every run starts from a fresh reset. In our benchmark, agents with Veris caught every planted integration bug in every run; no other environment achieved full coverage.
Staging is one shared environment: it drifts from production, accumulates state, and usually still touches something real, so a fleet of agents mutating it concurrently is a non-starter. Veris gives every agent its own stack: stateful, isolated, reset in milliseconds, destroyed when the branch merges. Nobody queues, nobody collides, and a destructive test costs nothing.
Environment variables or MCP. A Dependency Sandbox is an API call: create it, get per-service endpoints back, export them as DATABASE_URL / STRIPE_API_BASE / whatever your code already reads. The agent's own loop can create, reset, and destroy sandboxes as it works. No SDK to embed, no proxy to install in your app.
Yes. Hand Veris an API spec, or point it at the repo, and it builds a stateful twin of the service: endpoints that hold state between calls, respond like the real implementation, and fail on cue when you want the unhappy paths tested. That gives your agents an integration target for systems that have no vendor test mode at all, without touching the real deployment.
More than 70 twins are ready today: CRMs, billing, ticketing, databases, queues, clouds. The /twins catalog lists what each one speaks and what it holds state for. For anything else, hand Veris an API spec and it builds the twin, the same way it does for your internal services.
Twins are built vendor-true: the same endpoints, status codes, webhook timing, and edge-case behavior as the service they mirror, and they're maintained centrally, so when a vendor ships a change your tests track the service rather than a snapshot of it.
Every twin starts from a seed you control: bring your own fixtures, or let Veris compose production-shaped synthetic data for you, drawing on your product descriptions and docs, subject-matter-expert input, schemas, and exploration of your code. The seed is part of the sandbox definition, so every reset returns to the same known baseline, which is what makes a failing run reproducible instead of a flake.
The sandboxes don't care who calls them. The same veris.yaml serves three consumers: agents verifying their work in-loop, CI running the integration suite on every pull request, and developers pointing a local .env at a personal stack instead of a shared staging environment. Most teams start with one and end up using all three.
No. Every endpoint is a twin, so there is nothing real to leak: zero live keys handed to any agent. Compare that with testing against a vendor's real test mode, where the agent needs an actual key with actual permissions. Destructive tests, injected outages, and hostile inputs all stay inside a disposable Dependency Sandbox.
Yes, that's the point of one full stack per agent. Each Dependency Sandbox is isolated with its own endpoints and its own state, so a hundred agents can drop tables and refund charges concurrently without sharing a staging environment. Sandboxes spin up in seconds and reset in milliseconds, inside the agent loop rather than a ticket queue.