{
  "api": {
    "DELETE /_sim/scenarios/{name}": "remove (not built-ins)",
    "GET /_sim/jobs/{id}": "one run's progress",
    "GET /_sim/jobs?scenario=": "recent runs, newest first, with what each phase served",
    "GET /_sim/scenarios": "every scenario and its current phase",
    "POST /_sim/scenarios/{name}/force": "an incident now: {for: \"5m\", status: 503} or {for, action: \"hang\"}",
    "POST /_sim/scenarios/{name}/restart": "stop the current run and any forcing; the next request starts over",
    "PUT /_sim/scenarios/{name}": "create or replace: {description, onEnd: repeat|hold, phases: [{for or requests, action, status, latency, ...}]}"
  },
  "endpoints": {
    "/auth/basic?user=\u0026pass=": "200 with those basic credentials, else 401",
    "/auth/bearer?token=": "200 with that bearer token, else 401",
    "/delay/{ms}": "200 after a delay (ms or 2s)",
    "/drop": "closes the connection without a response",
    "/echo": "the request as JSON: method, headers, body",
    "/flaky?fail=0.3\u0026code=503": "fails that share of requests",
    "/hang": "never answers (until the client gives up)",
    "/healthz": "200 ok",
    "/redirect-loop": "redirects to itself",
    "/redirect/{n}": "n redirects, then 200",
    "/reset": "aborts the connection with a TCP reset",
    "/scenario/{name}": "runs a scenario: the first request starts a job; headers X-Simulator-Job, -Phase, -Request and -State",
    "/size/{bytes}": "a body of that many bytes",
    "/slow": "trickles the body a byte every 200 ms",
    "/status/{code}": "any HTTP status"
  },
  "modifiers": "?latency=, ?jitter= (ms or 2s), ?status= and ?body= work on every endpoint",
  "service": "Exometer simulator"
}
