flaky.

A mock REST API that fails on purpose.

Real-looking data at real URLs, like every other fake API. The difference: you decide how it behaves. Force a 503, add two seconds of latency, make a third of requests fail — on any endpoint, from the query string.

Try it

GET
status time tier remaining
Press Send.

The three parameters

They work on every endpoint, including nested routes and sandboxes. Combine them freely.

# a slow endpoint — test your loading state
GET /v1/posts?_delay=3000

# a hard failure — test your error boundary
GET /v1/posts?_status=503

# an intermittent one — test your retry logic
GET /v1/posts?_fail_rate=0.3

# slow AND flaky, because that is what production is
GET /v1/products?_delay=1500&_fail_rate=0.2
This is the part you would otherwise write a local mock server for. Here it is a query parameter, so it works from a browser console, a curl one-liner, a CodePen, or a colleague's machine with nothing installed.

Resources

ResourceRowsNested
Loading…

Filtering, search, sorting, paging

GET /v1/todos?userId=3&completed=true   # filter by any field
GET /v1/posts?_q=voluptate                # full-text search
GET /v1/products?_sort=price&_order=desc  # sort
GET /v1/photos?_page=2&_limit=50          # paginate
GET /v1/posts/1/comments                  # nested

Writes that actually stick

POST, PUT, PATCH and DELETE are echoed, not stored — same as every other mock API, and the response says so in an x-mock-write header so nobody loses an afternoon to it. When you need writes that persist, take a sandbox.

# 1. a free key (no confirmation email)
curl -X POST https://flaky.dev/v1/keys \
  -H 'content-type: application/json' \
  -d '{"email":"you@example.com"}'

# 2. a sandbox — your own writable copy, 24 hours
curl -X POST https://flaky.dev/v1/sandbox \
  -H 'authorization: Bearer flk_...'

# 3. write to it. this one is real.
curl -X POST https://flaky.dev/v1/sandbox/<id>/posts \
  -H 'content-type: application/json' \
  -d '{"title":"this persists"}'

A sandbox is an overlay, not a copy — only records you change are stored, so the shared dataset stays cached at the edge and your sandbox stays fast.

Limits

TierRequests/dayMax pageSandboxes
Anonymous1,000100
Free key10,0002501
Pro1,000,0001,00025

Limits reset at 00:00 UTC. Every response carries x-ratelimit-remaining. Machine-readable description of all of this at /v1/meta.