For agent testing · no signup to try

An agent that reads GitHub, Jira and Slack needs something real and repeatable to be evaluated against.

SandboxAPIs serves read-only replicas of 25 APIs, filled with one simulated company, and every run gets the same answer. Point the agent at a base URL instead of the real service: its real keys stay out of the run, and nothing it does can write to production.

Run it here: one incident, followed across four vendors' APIs

Five GET requests to four pinned hosts. No key, no signup.

  1. 1SlackThe argumentnot run
    $ curl -s "https://slack-2026-08.snap.sandboxapis.dev/api/conversations.history?channel=CF1UPUMGC8Q&limit=1"
    posted at
    text

    Press Run to send the first request.

  2. 2JiraThe ticketnot run
    $ curl -s "https://jira-v3-g6.snap.sandboxapis.dev/rest/api/3/issue/FATE-46"
    key
    summary
    created

    Runs when step 1 resolves.

  3. 3GitHubThe issue, found by Jira's text, and the pull requestnot run
    $ curl -s "https://gh-2026-03-g6.snap.sandboxapis.dev/repos/olympus-labs/parthenon/issues?state=all&per_page=100"
    $ curl -s "https://gh-2026-03-g6.snap.sandboxapis.dev/repos/olympus-labs/parthenon/pulls/47"
    issue
    pull request
    branch
    head sha

    Runs when step 2 resolves.

  4. 4GitLabThe same branch, on a different vendornot run
    $ curl -s "https://gl-v4-g6.snap.sandboxapis.dev/api/v4/projects/olympus-labs%2Fparthenon/merge_requests?source_branch=<branch from step 3>"
    merge request
    head sha

    Runs when step 3 resolves.

    GitHub head SHA
    GitLab head SHA

    waiting The verdict appears when both SHAs are in.

01 / For integration tests

Test the integration, not the test account.

Replacing a mock server? Start at the comparison.

What you skip

  • Set up a test account
  • Register an OAuth app, mint a token
  • Put a real credential in CI
  • Write fake data, keep it fresh
  • Maintain mocks against a moving spec
  • Burn real API quota in test runs
  • Keep one mock per SDK
  • Chase CI flakes from drifting data
  • Hope nothing writes to production

What you get

Believable by default

Repositories, issues, users, teams, commits, channel threads — all pre-populated and internally consistent.

One data set, every provider

The same people, PRs, issues and threads on every host we serve, with matching SHAs — so an integration that spans tools lines up.

Deterministic

Pinned snapshots regenerate byte-identically, so CI never flakes on the data and agent evals replay exactly.

REST + GraphQL

Exercise the exact transport your integration uses today. Same data, provider-shaped semantics.

02 / The catalog

25 APIs, one data set.

Browse every provider

Providers

25

Across 7 categories, each on its own hostname, all telling one story.

Read surfaces

4,524

REST endpoints, GraphQL entities and git-transport routes in the coverage manifest — 3,026 served and verified today, the rest answering with an explicit coverage error.

Pinned snapshots

148

Pinned, byte-reproducible universes on their own hosts, so CI never flakes on the data.

2 categories are listed above with nothing in them yet — they are the lanes the provider-expansion program opens next, and they are named rather than hidden so this page reports what we do not serve as plainly as what we do.

03 / Adoption is a base-URL swap

Keep your client library — change one line.

See all 25 client swaps
javascript
import { Octokit } from "@octokit/rest";

// The only change: point baseUrl at SandboxAPIs.
const octokit = new Octokit({ baseUrl: "https://gh.sandboxapis.dev" });

const { data } = await octokit.repos.get({
  owner: "olympus-labs",
  repo: "parthenon",
});
console.log(data.full_name); // "olympus-labs/parthenon"

04 / How it works

One base URL. Zero ceremony.

Read the docs
01

Get a free key

Or stay anonymous at 60 req/hour. A free key raises that to 600 req/hour, burstable in a fixed hourly window and reported in the rate-limit headers your client already reads.

02

Set one env var

Point your client's base URL at the host you need. 7 categories — git host, issue tracker, AI telemetry, messaging, CI/CD, observability, CRM/support — all serve the same data set, and your auth, SDK and client code stay exactly as-is.

03

Your app just works

Exercise the happy path and the weird path against one deep, coherent data set that behaves like production — with nothing real connected.

05 / Look around

Add the MCP server to your AI client

  • Claude, web and desktophttps://api.sandboxapis.dev/mcp/auth
  • ChatGPThttps://api.sandboxapis.dev/mcp
  • Claude Codeclaude mcp add --transport http sandboxapis https://api.sandboxapis.dev/mcp
  • CursorAdd to Cursorhttps://api.sandboxapis.dev/mcp
  • VS CodeAdd to VS CodeInsidershttps://api.sandboxapis.dev/mcp
  • AntigravityShow the confighttps://api.sandboxapis.dev/mcp

Steps for each client, and the npm package to run it locally, are on the MCP docs.

06 / Pricing

Get started for free.

What each tier includes

Every provider is served at every tier — a paid plan buys headroom, never an endpoint. Anonymous access stays free at 60 req/hour forever, and paid starts at $5/month for one developer.

Ready when you are

Make your integration the easy part.