Changes apply to the next request
Edit a response, switch to a different one, add a delay. The next request uses it. There is no restart and nothing to reload.
Control your app’s HTTP responses and build repeatable scenarios for failures, retries, timeouts, and edge cases. Run them from the CLI, your test suite, or an AI coding agent.
Nothing has arrived yet. Send a request below.
Press the request marked next four times. GET /account-summary is step 2 and step 4, so it answers 500 and then 200.
GET/orders/:id
200application/json
500200
Most mock servers answer every call to an endpoint the same way, which leaves the retry, the expired session and the timeout untested. A journey is a list of responses in order, and Mimic serves them one per matching request. Nine come with the app.
# the journey the console above is running mimic journey add-template retry-after-failure --activate mimic server start API=localhost:8080 curl -X POST $API/login → 200 curl $API/account-summary → 500 first load fails curl $API/inbox → 200 user moves on curl $API/account-summary → 200 retry succeeds
Each step answers one request. The same URL can return 500 the first time and 200 the second, and a step can repeat if the same request happens several times.
Instead of returning a status code, a step can drop the connection or never respond at all. That covers what your app does when the network itself fails.
A request that is not in the journey is answered from your normal endpoints, so you only have to list the ones you care about.
The controls above the steps deactivate the journey, send the cursor back to step one, or move it on a step. A test does the same thing with one command between cases.
Point your app at Mimic and use it normally. Then select the requests you want from the log at the bottom, right-click, and save them as a journey.
Sorting the log by status code to find the failure does not change the order of what you save.
Six identical 202 responses before a 200 turn into one step that repeats six times.
A step stores what Mimic sent back. Whatever your app put in its request headers is not copied into it.

Create an endpoint, change a response, start a journey, read back the requests that arrived. A coding agent told to mock the checkout API and test a failed payment can set that up, run it and read the result. Your test suite drives it the same way.
# keep test data out of your own projects export MIMIC_DATABASE_PATH="$PWD/.mimic-ci/store.sqlite" mimic daemon start # no window mimic project import fixtures/api.json mimic journey activate "Session expiry" mimic reset --scope all # back to step 1 # … run your tests here … mimic journey status | jq -e '.journeyStatus.isComplete'
# the mimic command just calls this, so anything can H="X-Mimic-Token: $TOKEN" curl -s -H "$H" \ 127.0.0.1:8787/v1/commands # what this build accepts curl -s -X POST 127.0.0.1:8787/v1/command \ -H "$H" \ -d '{"journeyActivate":{"journey":{"name":"Session expiry"}}}'
Ask a running copy of Mimic for its list of commands and it sends one back. An agent that has never seen this version can find out what is available instead of guessing at flags.
Which requests arrived, what was returned, whether a journey finished. A test can assert on that, and an agent can check its own work without asking you to look at the screen.
This interface listens on 127.0.0.1 and nowhere else, and it requires a token that changes every time Mimic starts.
Endpoints on the left, the response you are editing in the middle, its other responses on the right, and the request log along the bottom filling up as your app runs. You can change a response and watch the next request pick it up without leaving this screen.

Grouped by tag, with the one being edited selected.
Status code, headers and body, edited in place.
The app calls them scenarios. One is active at a time.
Everything that arrived, and what answered it.
Edit a response, switch to a different one, add a delay. The next request uses it. There is no restart and nothing to reload.
Keep a success, an error and an empty response on the same endpoint, and switch between them while your app is running.
Every request is listed, including ones nothing is set up for. Those are marked Unmatched, so you can see which endpoints you still need.
Click a request to see what was sent and what came back: headers and body, formatted and searchable.
Most of them can return a different response each time, usually by declaring states and the transitions between them. Here a journey is a list. You write the responses in the order they happen, or you use your app, pick the requests out of the log, and save them as a journey.
Mimic is an HTTP server on localhost:8080, so anything that can make a request can use it. There is no plugin and no adapter to install. Between cases your tests run mimic reset, which returns every journey to its first step and clears the log.
Yes. Every action in the window is also a command and an HTTP call, and both answer in JSON. A test suite or a coding agent can set up endpoints, switch responses, run a journey and read back what arrived. The app does not have to be in front of you.
Nothing. There is no account and no trial period, so there is nothing to cancel either. Download the installer and use it.
It is an early release, numbered below 1.0. Everything described on this page works today, and the app is still changing.
No. macOS 26.0 is the minimum and the installer will not run on anything earlier. It works on both Apple silicon and Intel Macs.
Nowhere. Projects are files on your Mac. The mock server listens only on your own machine, and the interface the command line and agents drive is bound to 127.0.0.1 behind a token that changes every time Mimic starts.
GraphQL is matched on the operation rather than the path, because GraphQL sends everything to one URL. An OpenAPI or Swagger document, or a HAR file saved from your browser, imports as endpoints you can review and edit before keeping them.
Install it, activate one of the included journeys, and point your app at localhost:8080.
# double-click the installer, or from a terminal: sudo installer -pkg ~/Downloads/Mimic-*.pkg -target / # Mimic.app lands in /Applications, the mimic command in # /usr/local/bin. Nothing else to move. mimic --version # check it is on your PATH