Slow it down
Give any endpoint a delay of up to eight seconds. Skeletons, spinners and timeouts finally have something to wait for.
/ordersPOST/ordersGET/orders/:idPATCH/orders/:id/refundGET/users/mePOST/auth/tokenGET/catalog?page=2DELETE/sessions/:sidGET/webhooks/logPOST/payments/intentPUT/settings/notificationsGET/orders/*Describe an endpoint in a sentence. Mockbird serves realistic JSON from a live URL, and lets you make it slow or make it fail, so the loading and error states get built today instead of after the backend ships.
/ m/ a8f3k2/ ordersIdleA real backend is slow, sometimes broken, and particular about routes. Mockbird lets you switch each of those on per endpoint, so your loading, error and routing code runs before launch instead of after.
Give any endpoint a delay of up to eight seconds. Skeletons, spinners and timeouts finally have something to wait for.
Set a failure rate and that share of calls returns the error you pick, from 400 to 503. Your error path runs before a customer finds it.
Static beats parameter beats wildcard, so /orders/new is never swallowed by /orders/:id. Any method, any depth.
/orders/ord_92kd/orders/newchecking/orders/orders/:id/orders/*Write tokens into a stored body and they resolve on every call, so GET /orders/:id returns the id that was asked for. Change the request below and watch the response follow.
{{id}} | The matched path param of that name |
{{query.page}} | A query-string value, empty when absent |
{{wildcard}} | Everything captured by a trailing * |
{{now}} | ISO timestamp at request time |
{{index}} | Position in the enclosing array, as a number |
{{random.name}} | A fake name, new on every call |
{{random.int}} | An integer from 1 to 9999, new on every call |
Only the two random tokens break the same-bytes guarantee.
Your app calls the mock the way it will call the real API: same paths, same status codes, same JSON. Keep the base URL in an environment variable and the switch is a one-line change.
The model runs once, when you press Create. It turns your sentence into a JSON Schema and writes sample records that fit it, and nothing is saved until you accept them.
After that, every call is read from the database and returned verbatim. There is no inference on the request path, so no added seconds, no per-call cost, and no data shifting under the interface you're building. Without a model key, Mockbird falls back to a hand-written skeleton and everything else works the same.