Every portfolio project, UI-library demo and frontend workshop eventually needs the same thing: a shop backend. Products with prices and images, customers, orders with statuses, reviews with ratings โ and crucially, relationships between them, because that's where interesting UI lives.
Public fixtures like JSONPlaceholder or Fake Store API give you fixed, read-only data that everyone else's demo also uses. Mockbird gives you your own store โ writable, re-seedable, with real foreign keys โ in one click.
In the dashboard choose the ecommerce preset next to "New project", or via API:
curl -X POST https://HOST/api/projects \
-H 'content-type: application/json' \
-d '{"name":"demo-shop","preset":"ecommerce"}'
You get products, customers, orders (with customerId and productId) and reviews (with productId) โ all seeded with plausible data whose foreign keys actually resolve.
# product grid: page 1, cheapest first
GET /m/abc123/products?page=1&limit=12&sortBy=price&order=asc
# search-as-you-type
GET /m/abc123/products?search=chair
# order history for the "logged-in" customer, newest first
GET /m/abc123/orders?customerId=7&sortBy=date&order=desc
# admin view: shipped orders WITH the customer object joined in
GET /m/abc123/orders?status=shipped&_expand=customer
# product detail page: the product plus its reviews, one request
GET /m/abc123/products/4?_embed=reviews
# or path-style:
GET /m/abc123/products/4/reviews
Because the API is writable, your "place order" button can actually place an order:
POST /m/abc123/orders
{"customerId": 7, "productId": 4, "status": "pending"}
# later, in your fake admin panel:
PATCH /m/abc123/orders/31
{"status": "shipped"}
The new order shows up in every subsequent list request โ state that persists across page reloads and devices, which is exactly what makes a demo feel real. Re-seed from the dashboard whenever you want a clean slate.
GET /m/abc123/products?mock_delay=3000 # skeleton screens on the projector
GET /m/abc123/orders?mock_status=500 # "and here's our error handling"
Handy in workshops: attendees each create their own project (no signup required), so nobody overwrites anyone else's data โ a classic failure mode of shared demo APIs.
Your project publishes a live OpenAPI 3.0 spec at /m/abc123/openapi.json. Import it into Swagger UI or Postman, or generate a typed client โ useful when the demo grows into the real thing.
price, image, rating, status, category, refIdโฆ) โ see the docs. Blog and SaaS presets exist too.