You have the contract before you have the backend. That's the whole point of an OpenAPI spec β but actually running a mock of it usually means installing something: Prism needs Node and a terminal that stays open, Mockoon wants a desktop app, SwaggerHub's hosted mocking caps free mocks at 10 requests/minute and keeps your spec public. Fine on your machine; useless for a deploy preview, a teammate on Windows, CI, or your phone.
Mockbird turns a spec into a hosted mock in one request. JSON or YAML in, live URL out:
curl -X POST https://mockbird.mockbird.workers.dev/api/projects/import \
--data-binary @openapi.yaml
The response is your new backend:
{
"id": "abc123",
"name": "Swagger Petstore",
"adminKey": "β¦keep thisβ¦",
"baseUrl": "https://mockbird.mockbird.workers.dev/m/abc123",
"resources": [
{ "name": "pets", "seeded": 20, "url": "https://mockbird.mockbird.workers.dev/m/abc123/pets" },
{ "name": "owners", "seeded": 20, "url": "https://mockbird.mockbird.workers.dev/m/abc123/owners" }
],
"warnings": []
}
No signup, no CLI, no YAML-to-JSON conversion step. Paste-into-browser also works: the dashboard has an Import OpenAPI / db.json button with a file picker.
.apib with npx apib2swagger first β full migration guide (Apiary was shut down Sep 9, 2025)./users + /users/{id} become a users resource; nested /users/{id}/posts contributes posts. Prefixes like /api/v1 are ignored.$ref and allOf are resolved, including refs into components/schemas and Swagger's definitions.{"data": [...]} are unwrapped to the record schema.format: email seeds real-looking emails, uuid β UUIDs, date-time β ISO timestamps, uri β URLs.price gets prices, avatar gets avatar URLs, city gets cities, createdAt gets past dates, authorId gets small integer FKs that line up with seeded parents.enum: [available, pending, sold] seeds exactly those values β and they round-trip into the mock's own exported spec.Anything it can't model as a record field (nested objects, arrays-of-objects) is skipped and listed in warnings instead of failing the import β you still get a working mock of everything else.
Real specs aren't all /things and /things/{id}. Login endpoints, /search, /health, RPC-style verbs like POST /invoices/{id}/send β the importer turns every operation that doesn't fit the CRUD surface into a custom route that answers with the spec's own example (verbatim, including non-JSON content types) or, when there's only a schema, a value generated from it (format: uuid β a UUID, date-time β a timestamp, enums β their first value). Param segments map naturally: /invoices/{id}/send is served at /invoices/:id/send for any id. A spec with zero CRUD-shaped paths still imports β you get a pure fixed-route mock. Each created route is listed under routes in the import response, and you can edit any of them in the dashboard afterwards (templating, delays, statuses).
If your spec ships explicit response examples, Mockbird doesn't invent data β it hosts your example records exactly as written, the behavior Prism users expect. A collection GET with example: [{...}, {...}] (media-level, schema-level, named examples, or Swagger 2.0 response.examples) becomes those records, verbatim, with wrapper shapes like {"data": [...]} unwrapped. The difference from Prism: the records are live β POST adds one, DELETE removes one, ?status=pending filters them. Resources without examples still get realistic seeded data, and ?examples=0 turns the behavior off if you'd rather have 20 fake records than your 2 examples.
Prism replays examples. Mockbird gives you a real stateful CRUD API over seeded data:
GET /m/abc123/pets?status=available&limit=5 # filters + pagination
POST /m/abc123/pets # actually creates β next GET shows it
PUT /m/abc123/pets/3 # updates persist
DELETE /m/abc123/pets/3
GET /m/abc123/pets?mock_delay=2000 # test your spinner
GET /m/abc123/pets?mock_status=500 # test your error state
Plus sorting, substring search, _expand/_embed relations, nested routes, CORS on everything, a live request inspector, and signed webhooks on writes β all free.
| Option | Effect |
|---|---|
?seed=50 | records per resource (default 20, max 100) |
?name=my-mock | project name (default: the spec's info.title) |
?examples=0 | ignore the spec's response examples and seed fake data instead (default: examples are hosted verbatim) |
Every Mockbird project also exports a live OpenAPI 3.0 document at /m/<project>/openapi.json. Import that into Postman or Swagger UI β or back into Mockbird: the importer honors x-mockbird-type annotations, so export β import reproduces your schema exactly.
| Prism | Mockoon | Mockbird | |
|---|---|---|---|
| Install needed | Node CLI | desktop app | none β one curl |
| Hosted URL for previews/CI/teammates | DIY + tunnel | DIY deploy | built in |
| Stateful CRUD (writes persist) | β | partial | β |
| Seeded realistic data | examples only | templates | β schema-aware, enums kept |
| Spec examples served verbatim | β (static) | β | β and stateful |
| YAML input | β | β | β |
| Price for hosted mocking | n/a | n/a | free |
To be fair: Prism does spec-validation proxying (checking requests against the contract), which Mockbird doesn't. If you need strict contract enforcement, run Prism in CI β and use Mockbird for the hosted, stateful, shareable part. Full head-to-head: Prism alternative.
No spec handy? Import the demo project's own spec:
curl -s https://mockbird.mockbird.workers.dev/m/demo/openapi.json | \
curl -X POST https://mockbird.mockbird.workers.dev/api/projects/import --data-binary @-
Ten seconds from spec to a live, seeded, CORS-enabled mock of an e-commerce API. Anonymous projects can be claimed into a free account later, so nothing is throwaway.