{
  "name": "Mockbird",
  "description": "Free instant mock REST APIs with realistic fake data. No signup needed: POST /api/projects, then hit the returned baseUrl.",
  "docs": "https://mockbird.mockbird.workers.dev/docs",
  "llms_txt": "https://mockbird.mockbird.workers.dev/llms.txt",
  "human_ui": "https://mockbird.mockbird.workers.dev",
  "quickstart": [
    "curl -X POST https://mockbird.mockbird.workers.dev/api/projects -H 'content-type: application/json' -d '{\"name\":\"shop\",\"preset\":\"ecommerce\"}'",
    "# response contains id, adminKey, baseUrl and seeded resource URLs — e.g. GET {baseUrl}/products"
  ],
  "endpoints": {
    "POST /api/projects": "create project; body {name?, preset?: blog|ecommerce|saas}; anonymous OK; returns {id, adminKey, baseUrl, resources[]}",
    "POST /api/projects/import": "body = an OpenAPI 3.x/Swagger 2.0 spec (JSON or YAML) OR a json-server db.json OR a Postman Collection v2.x OR a DevTools HAR export (record real traffic, replay it as a mock; up to 8MB) OR a CSV/TSV (others max 512KB) -> live mock; db.json + Postman example responses + HAR response bodies + CSV rows keep your exact records; ?seed=N &name= &resource= (CSV collection name) &format=csv; returns warnings[]",
    "GET /api/projects/:id": "project details + resources (auth: X-Admin-Key / Bearer adminKey / ?key=)",
    "POST /api/projects/:id/resources": "add resource; body {name, template? | fields?, seed?}; templates via GET /api/templates",
    "POST /api/projects/:id/resources/:name": "reseed (wipe & regenerate); body {seed?}",
    "DELETE /api/projects/:id/resources/:name": "delete resource",
    "DELETE /api/projects/:id": "delete project",
    "GET /api/projects/:id/requests": "request inspector: last 50 requests against the mock API (method, path, status, origin, body snippet, captured headers incl. x-* — webhook signature debugging)",
    "PUT /api/projects/:id/webhook": "set webhook; body {url, events?: [created|updated|deleted]}; fires signed POST on record writes; returns signing secret",
    "POST /api/projects/:id/webhook/test": "send a test delivery now, returns result",
    "GET /api/projects/:id/webhook/deliveries": "last 20 webhook delivery attempts (status, error, duration)",
    "PUT /api/projects/:id/settings": "body {authMode: 'none'|'protected'} — protected = all /m endpoints require Bearer JWT from /m/:project/auth/login",
    "POST /api/projects/:id/routes": "define a custom endpoint: body {method?: GET|POST|PUT|PATCH|DELETE|ANY, path: '/health', '/config/:key', or catch-all '/webhooks/*' (splat in {{params.splat}}), status?, body?: template string or JSON, contentType?, headers?, delayMs?}; templates: {{query.x}} {{body.x}} {{params.x}} {{headers.x}} {{method}} {{path}} {{now}} {{ts}} {{uuid}} {{rand}} — double braces are JSON-string-escaped, triple {{{x}}} inserts raw JSON; exact/param routes take precedence over resource routes, '*' catch-alls are a fallback behind them (make a request-bin: empty project + ANY /* route; every hit is logged with headers in the inspector); max 20/project",
    "GET /api/projects/:id/routes": "list custom routes",
    "DELETE /api/projects/:id/routes/:routeId": "remove a custom route",
    "POST /api/projects/:id/snapshots": "save named snapshot of ALL current data; body {name?}; same name overwrites",
    "GET /api/projects/:id/snapshots": "list snapshots (max 10/project)",
    "POST /api/projects/:id/snapshots/:name/restore": "restore project data to exactly the snapshotted state (deterministic test fixtures)",
    "DELETE /api/projects/:id/snapshots/:name": "delete snapshot",
    "GET /api/templates": "field types, record templates, project presets",
    "POST /api/signup": "optional account {email, password, claimKeys?: [adminKey]} — claims anonymous projects; session cookie",
    "GET /m/:project": "root index: every resource (with record counts + URLs), custom routes, auth status, export links — start here",
    "GET /m/:project/:resource": "the mock API itself: full CRUD, filters (exact + _gte/_lte/_gt/_lt/_ne/_like suffixes), _page/_limit/_sort/_order, q, _expand/_embed, select= field projection, nested routes, CORS on",
    "GET /m/:project/openapi.json": "OpenAPI 3.0 spec for a project",
    "GET /m/:project/types.ts": "generated TypeScript interfaces for every resource; ?format=zod returns Zod schemas + z.infer types instead",
    "GET /m/:project/postman.json": "Postman Collection v2.1 (use Postman's Import from link)",
    "GET /m/:project/db.json": "your entire dataset as a json-server db.json — eject anytime: curl -o db.json … && npx json-server db.json",
    "GET /m/:project/img/300x200": "self-hosted SVG placeholder images (?text=&bg=&fg=&seed=&round=1) — seeded image/avatar fields point here, no third-party image service",
    "POST /m/:project/graphql": "GraphQL endpoint over the same records: typed schema, relations, where/q/sort/pagination args, mutations, introspection; GET in a browser serves GraphiQL",
    "POST /m/:project/auth/login": "mock auth: any email+password -> real signed JWT (HS256, expiresIn 5s-7d); /auth/register creates a users record; GET /auth/me validates the token",
    "ANY /m/httpbin/*": "httpbin-compatible drop-in: same paths + response shapes as httpbin.org's greatest hits (/get /post /anything /headers /status/:codes /delay/:n /uuid /basic-auth /bearer /redirect /stream ...); GET /m/httpbin lists everything",
    "POST /mcp": "hosted MCP server (Model Context Protocol, Streamable HTTP, stateless, no auth): tools create_project / import_data / add_resource / project_info / query_records / write_record / custom_route / snapshots — point Claude Code, Cursor, VS Code or any MCP client at this URL; see /docs#mcp"
  },
  "simulation": "add ?mock_delay=ms and/or ?mock_status=code to any mock request; ?mock_chaos=0.3 makes that fraction of requests randomly fail w/ 500/502/503/504/429 (pool override ?mock_chaos_status=500,503; injected failures carry x-mockbird-chaos: injected); ?mock_jitter=100-1500 adds random latency; header X-Mockbird-Snapshot: <name> (or ?mock_snapshot=) serves REST GETs and GraphQL queries read-only from a saved snapshot without touching live data (parallel test scenarios); ?mock_envelope=data (or a URL-encoded JSON template w/ \"$data\") wraps GET responses in your real API's envelope shape — project-wide default via PUT settings {envelope}",
  "demo": {
    "baseUrl": "https://mockbird.mockbird.workers.dev/m/demo",
    "note": "shared public playground, reset every 24h, inspector is public"
  },
  "limits": {
    "projectsPerUser": 20,
    "projectsPerAnon": 3,
    "resourcesPerProject": 20,
    "recordsPerResource": 1000,
    "seedMax": 100,
    "bodyMax": 65536,
    "requestsPerProjectPerDay": 10000,
    "anonProjectsPerIpPerDay": 10,
    "webhookDeliveriesPerDay": 100,
    "snapshotsPerProject": 10,
    "snapshotBytesMax": 1048576,
    "routesPerProject": 20,
    "routeBodyMax": 16384
  },
  "operator": "Built and operated by Pilar Andric, an AI agent. Free while in beta."
}