{"components":{"schemas":{"GetRequestInfo":{"properties":{"args":{"additionalProperties":{"type":"string"},"description":"Query string parameters.","type":"object"},"headers":{"additionalProperties":{"type":"string"},"description":"Request headers (excluding proxy headers).","type":"object"},"origin":{"description":"Client IP address.","type":"string"},"url":{"description":"Full request URL.","type":"string"}},"type":"object"},"NdjsonLineItem":{"description":"One JSON line in the NDJSON stream. Shape depends on the `format` parameter: `simple` (default), `openai`, `ollama`, or `custom` (plain string).","oneOf":[{"$ref":"#/components/schemas/SimpleStreamEvent"},{"$ref":"#/components/schemas/OpenAIChatChunk"},{"$ref":"#/components/schemas/OllamaChunk"},{"description":"format=custom: the custom message verbatim","type":"string"}]},"OllamaChunk":{"description":"Ollama-compatible streaming response","properties":{"context":{"description":"Token context, only on the final chunk.","items":{"type":"integer"},"type":"array"},"created_at":{"description":"RFC 3339 timestamp.","format":"date-time","type":"string"},"done":{"description":"True on the final chunk.","type":"boolean"},"eval_count":{"description":"Generated token count, final chunk only.","type":"integer"},"eval_duration":{"description":"Generation time in ns, final chunk only.","type":"integer"},"load_duration":{"description":"Model load time in ns, final chunk only.","type":"integer"},"model":{"description":"Model name (from ?model=, default llama2).","type":"string"},"prompt_eval_count":{"description":"Prompt token count, final chunk only.","type":"integer"},"prompt_eval_duration":{"description":"Prompt eval time in ns, final chunk only.","type":"integer"},"response":{"description":"The text token for this chunk.","type":"string"},"total_duration":{"description":"Total time in ns, final chunk only.","type":"integer"}},"type":"object"},"OpenAIChatChunk":{"description":"OpenAI-compatible chat.completion.chunk","properties":{"choices":{"description":"Single-element array with the delta.","items":{"properties":{"delta":{"properties":{"content":{"type":["string","null"]},"role":{"type":["string","null"]}},"type":"object"},"finish_reason":{"type":["string","null"]},"index":{"type":"integer"}},"type":"object"},"type":"array"},"created":{"description":"Unix timestamp (seconds).","type":"integer"},"id":{"description":"Unique chunk id (chatcmpl-*).","type":"string"},"model":{"description":"Always \"httpcan-sse\".","type":"string"},"object":{"const":"chat.completion.chunk","description":"Always \"chat.completion.chunk\".","type":"string"}},"type":"object"},"RequestInfo":{"properties":{"args":{"additionalProperties":{"type":"string"},"description":"Query string parameters.","type":"object"},"data":{"description":"Request body content.","type":"string"},"files":{"additionalProperties":{"oneOf":[{"description":"Single file content (text or base64 encoded)","type":"string"},{"description":"Multiple files with the same parameter name","items":{"description":"File content (text or base64 encoded)","type":"string"},"type":"array"}]},"description":"Uploaded files. Single files return as string, multiple files with same parameter name return as array.","example":{"multiple_files":["first file content","second file content"],"single_file":"file content here"},"type":"object"},"form":{"additionalProperties":{"type":"string"},"description":"Form data fields.","type":"object"},"headers":{"additionalProperties":{"type":"string"},"description":"Request headers (excluding proxy headers).","type":"object"},"json":{"description":"Parsed JSON content if Content-Type is application/json."},"method":{"description":"HTTP method.","type":"string"},"origin":{"description":"Client IP address.","type":"string"},"url":{"description":"Full request URL.","type":"string"},"user_agent":{"description":"User-Agent header value.","type":"string"}},"type":"object"},"SimpleStreamEvent":{"properties":{"event":{"description":"1-based event index.","type":"integer"},"message":{"description":"Human-readable event text.","type":"string"},"timestamp":{"description":"RFC 3339 timestamp of the event.","format":"date-time","type":"string"}},"type":"object"},"SseEventItem":{"description":"Payload of one `data:` event in the SSE stream. Shape depends on the `format` parameter: `simple` (default), `openai` (chat.completion.chunk), or `custom` (plain string).","oneOf":[{"$ref":"#/components/schemas/SimpleStreamEvent"},{"$ref":"#/components/schemas/OpenAIChatChunk"},{"description":"format=custom: the custom message verbatim","type":"string"}]}},"securitySchemes":{"basicAuth":{"scheme":"basic","type":"http"},"bearerAuth":{"scheme":"bearer","type":"http"},"digestAuth":{"scheme":"digest","type":"http"}}},"externalDocs":{"description":"GitHub","url":"https://github.com/seedvector/httpcan"},"info":{"description":"A modern, high‑performance superset of [httpbin.org](https://httpbin.org) for testing HTTP clients, proxies, and AI agents — with mock OpenAI/Anthropic LLM APIs and a full OAuth 2.0 server. Built with Rust and Actix Web. Every httpbin.org endpoint is covered and drop‑in compatible, plus dedicated endpoints httpbin.org doesn't have and others it has but httpcan fixes or extends — the homepage at <code>/</code> lists every endpoint with Enhanced/New badges. <br/> <br/> <b>Run locally:</b> <code>$ docker run -p 8080:8080 ghcr.io/seedvector/httpcan:latest</code> <br/> <br/> <b>✨ Features</b> <ul> <li><b>Drop‑in httpbin.org superset</b>: use as a drop‑in replacement for testing and migration</li><li><b>AI API mock</b>: OpenAI‑ and Anthropic‑compatible <code>/llm</code> endpoints — point any SDK <code>base_url</code> at it (streaming included) and test AI clients without a paid provider</li><li><b>OAuth 2.0 mock</b>: a full authorization server at <code>/oauth2</code> — four RFC 6749 grants (authorization code + PKCE, implicit, password, rotating refresh, client credentials), Bearer‑protected userinfo, and RFC 8414 discovery</li><li><b>AI‑friendly streaming</b>: native <code>/sse</code> and <code>/ndjson</code> endpoints with OpenAI/Ollama‑compatible chunk formats</li><li><b>Measured performance</b>: in our benchmarks against comparable HTTP testing servers, HTTPCan led on both throughput and tail latency</li><li><b>Anti‑phishing redirects</b>: browser clients hitting <code>/redirect-to</code> see a confirmation page instead of a silent 302</li><li><b>Correct header handling</b>: duplicate and non‑ASCII request headers are preserved instead of being dropped or crashing the server</li><li><b>Safer by default</b>: built‑in filtering strips reverse‑proxy/CDN headers from echoed responses, with <code>--exclude-headers</code> for more</li><li><b>Cloud‑native observability</b>: <code>/healthz</code> liveness probe, <code>/tags</code> instance identification, and <code>Server-Timing</code>/<code>X-Httpcan-Version</code> headers on every response</li><li><b>Self‑documenting homepage</b>: <code>/</code> lists every endpoint by category with compatibility badges and copy‑curl buttons — static HTML, crawlable by search engines and AI agents</li><li><b>Tiny &amp; fast</b>: tiny Docker image, minimal memory footprint, high throughput via Actix Web + Tokio</li>","license":{"name":"MIT","url":"https://opensource.org/licenses/MIT"},"title":"httpcan.org","version":"0.8.1"},"openapi":"3.2.0","paths":{"/absolute-redirect/{n}":{"get":{"description":"Same as /redirect/{n}, using absolute Location URLs.","operationId":"getAbsoluteRedirectN","parameters":[{"description":"Number of redirects to perform","in":"path","name":"n","required":true,"schema":{}}],"responses":{"302":{"content":{},"description":"A redirection."},"400":{"content":{},"description":"n must be greater than 0."}},"summary":"Redirects n times, using absolute Location URLs.","tags":["Redirects"]}},"/anything":{"delete":{"description":"Accepts any method and echoes the full request; multipart handling matches /post.","operationId":"deleteAnything","responses":{"200":{"content":{},"description":"The echoed request data (args, headers, origin, url, and body)."}},"summary":"Returns anything passed in request data.","tags":["Anything"]},"get":{"description":"Accepts any method and echoes the full request; multipart handling matches /post.","operationId":"getAnything","responses":{"200":{"content":{},"description":"The echoed request data (args, headers, origin, url, and body)."}},"summary":"Returns anything passed in request data.","tags":["Anything"]},"options":{"description":"Plain OPTIONS (non-preflight) echoes the request like GET; CORS preflights carrying Access-Control-Request-Method are handled by the CORS middleware.","operationId":"optionsAnything","responses":{"200":{"content":{},"description":"The echoed request data (args, headers, origin, url, and body)."}},"summary":"Returns anything passed in request data.","tags":["Anything"]},"patch":{"description":"Accepts any method and echoes the full request; multipart handling matches /post.","operationId":"patchAnything","responses":{"200":{"content":{},"description":"The echoed request data (args, headers, origin, url, and body)."}},"summary":"Returns anything passed in request data.","tags":["Anything"]},"post":{"description":"Accepts any method and echoes the full request; multipart handling matches /post.","operationId":"postAnything","responses":{"200":{"content":{},"description":"The echoed request data (args, headers, origin, url, and body)."}},"summary":"Returns anything passed in request data.","tags":["Anything"]},"put":{"description":"Accepts any method and echoes the full request; multipart handling matches /post.","operationId":"putAnything","responses":{"200":{"content":{},"description":"The echoed request data (args, headers, origin, url, and body)."}},"summary":"Returns anything passed in request data.","tags":["Anything"]},"query":{"description":"Uses the QUERY HTTP method (RFC 9430): a safe, idempotent method that carries a request body.","operationId":"queryAnything","responses":{"200":{"content":{},"description":"The echoed request data (args, headers, origin, url, and body)."}},"summary":"Returns anything passed in request data.","tags":["Anything"]},"trace":{"description":"TRACE variant (RFC 9110 §9.8): echoes the request like GET; TRACE carries no body.","operationId":"traceAnything","responses":{"200":{"content":{},"description":"The echoed request data (args, headers, origin, url, and body)."}},"summary":"Returns anything passed in request data.","tags":["Anything"]}},"/anything/{anything}":{"delete":{"description":"Same as /anything, with extra path segment(s) that are ignored.","operationId":"deleteAnythingAnything","parameters":[{"description":"Arbitrary path content after /anything (single or multi-segment), echoed back in the response","in":"path","name":"anything","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{},"description":"The echoed request data (args, headers, origin, url, and body)."}},"summary":"Returns anything passed in request data.","tags":["Anything"]},"get":{"description":"Same as /anything, with extra path segment(s) that are ignored.","operationId":"getAnythingAnything","parameters":[{"description":"Arbitrary path content after /anything (single or multi-segment), echoed back in the response","in":"path","name":"anything","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{},"description":"The echoed request data (args, headers, origin, url, and body)."}},"summary":"Returns anything passed in request data.","tags":["Anything"]},"options":{"description":"Plain OPTIONS (non-preflight) echoes the request like GET; CORS preflights carrying Access-Control-Request-Method are handled by the CORS middleware.","operationId":"optionsAnythingAnything","parameters":[{"description":"Arbitrary path content after /anything (single or multi-segment), echoed back in the response","in":"path","name":"anything","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{},"description":"The echoed request data (args, headers, origin, url, and body)."}},"summary":"Returns anything passed in request data.","tags":["Anything"]},"patch":{"description":"Same as /anything, with extra path segment(s) that are ignored.","operationId":"patchAnythingAnything","parameters":[{"description":"Arbitrary path content after /anything (single or multi-segment), echoed back in the response","in":"path","name":"anything","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{},"description":"The echoed request data (args, headers, origin, url, and body)."}},"summary":"Returns anything passed in request data.","tags":["Anything"]},"post":{"description":"Same as /anything, with extra path segment(s) that are ignored.","operationId":"postAnythingAnything","parameters":[{"description":"Arbitrary path content after /anything (single or multi-segment), echoed back in the response","in":"path","name":"anything","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{},"description":"The echoed request data (args, headers, origin, url, and body)."}},"summary":"Returns anything passed in request data.","tags":["Anything"]},"put":{"description":"Same as /anything, with extra path segment(s) that are ignored.","operationId":"putAnythingAnything","parameters":[{"description":"Arbitrary path content after /anything (single or multi-segment), echoed back in the response","in":"path","name":"anything","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{},"description":"The echoed request data (args, headers, origin, url, and body)."}},"summary":"Returns anything passed in request data.","tags":["Anything"]},"query":{"description":"Uses the QUERY HTTP method (RFC 9430): a safe, idempotent method that carries a request body.","operationId":"queryAnythingAnything","parameters":[{"description":"Arbitrary path content after /anything (single or multi-segment), echoed back in the response","in":"path","name":"anything","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{},"description":"The echoed request data (args, headers, origin, url, and body)."}},"summary":"Returns anything passed in request data.","tags":["Anything"]},"trace":{"description":"TRACE variant (RFC 9110 §9.8): echoes the request like GET; TRACE carries no body.","operationId":"traceAnythingAnything","parameters":[{"description":"Arbitrary path content after /anything (single or multi-segment), echoed back in the response","in":"path","name":"anything","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{},"description":"The echoed request data (args, headers, origin, url, and body)."}},"summary":"Returns anything passed in request data.","tags":["Anything"]}},"/base64":{"post":{"description":"Decodes the base64-encoded request body and returns the decoded content as text/plain; invalid base64 returns 400.","operationId":"postBase64","requestBody":{"content":{"text/plain":{"schema":{"type":"string"}}}},"responses":{"200":{"content":{},"description":"Decoded content as text/plain."},"400":{"content":{},"description":"Invalid base64 data."}},"summary":"Decodes the base64-encoded request body and returns it as text/plain.","tags":["Dynamic data"]}},"/base64/{value}":{"get":{"description":"Decodes a standard base64 string; returns raw bytes (application/octet-stream) for non-UTF-8 content instead of erroring.","operationId":"getBase64Value","parameters":[{"description":"Standard base64-encoded string to decode","in":"path","name":"value","required":true,"schema":{"default":"SFRUUEJJTiBpcyBhd2Vzb21l","type":"string"}}],"responses":{"200":{"content":{},"description":"Decoded base64 content."},"400":{"content":{},"description":"Invalid base64 data."}},"summary":"Decodes a standard base64 string.","tags":["Dynamic data"]}},"/basic-auth/{user}":{"get":{"description":"Challenges HTTP Basic Auth with an empty password (username-only check).","operationId":"getBasicAuthUser","parameters":[{"description":"Username to authenticate with","in":"path","name":"user","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{},"description":"Successful authentication."},"401":{"content":{},"description":"Unsuccessful authentication."}},"security":[{"basicAuth":[]}],"summary":"Prompts for HTTP Basic Auth with username-only check.","tags":["Auth"]},"post":{"description":"POST variant of the username-only Basic Auth check (empty password).","operationId":"postBasicAuthUser","parameters":[{"description":"Username to authenticate with","in":"path","name":"user","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{},"description":"Successful authentication."},"401":{"content":{},"description":"Unsuccessful authentication."}},"security":[{"basicAuth":[]}],"summary":"Prompts for HTTP Basic Auth with username-only check.","tags":["Auth"]}},"/basic-auth/{user}/{passwd}":{"get":{"description":"Returns {\"user\": ...} on success; challenges with 401 on incorrect credentials.","operationId":"getBasicAuthUserPasswd","parameters":[{"description":"Username to authenticate with","in":"path","name":"user","required":true,"schema":{"type":"string"}},{"description":"Password to authenticate with","in":"path","name":"passwd","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{},"description":"Successful authentication."},"401":{"content":{},"description":"Unsuccessful authentication."}},"security":[{"basicAuth":[]}],"summary":"Prompts for HTTP Basic Auth with the given credentials.","tags":["Auth"]},"post":{"description":"Returns {\"user\": ...} on success; challenges with 401 on incorrect credentials.","operationId":"postBasicAuthUserPasswd","parameters":[{"description":"Username to authenticate with","in":"path","name":"user","required":true,"schema":{"type":"string"}},{"description":"Password to authenticate with","in":"path","name":"passwd","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{},"description":"Successful authentication."},"401":{"content":{},"description":"Unsuccessful authentication."}},"security":[{"basicAuth":[]}],"summary":"Prompts for HTTP Basic Auth with the given credentials.","tags":["Auth"]}},"/bearer":{"get":{"description":"Checks for a Bearer token in the Authorization header.","operationId":"getBearer","responses":{"200":{"content":{},"description":"Successful authentication."},"401":{"content":{},"description":"Unsuccessful authentication."}},"security":[{"bearerAuth":[]}],"summary":"Prompts for Bearer authentication.","tags":["Auth"]}},"/body":{"delete":{"description":"Echoes the request body exactly as received and mirrors request headers in the response. Content-Type and custom headers are preserved.","operationId":"DeleteBody","requestBody":{"content":{"application/json":{"schema":{"type":"object"}},"application/octet-stream":{"schema":{"format":"binary","type":"string"}},"application/x-www-form-urlencoded":{"schema":{"additionalProperties":{"type":"string"},"type":"object"}},"multipart/form-data":{"schema":{"additionalProperties":true,"type":"object"}},"text/plain":{"schema":{"type":"string"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}},"application/octet-stream":{"schema":{"format":"binary","type":"string"}},"text/plain":{"schema":{"type":"string"}}},"description":"Echoed request body with mirrored headers."}},"summary":"Returns the exact request body with mirrored headers.","tags":["Request inspection"]},"get":{"description":"Mirrors request headers in the response. GET requests return empty body since there's no request body to echo.","operationId":"GetBody","responses":{"200":{"content":{"text/plain":{"schema":{"example":"","type":"string"}}},"description":"Empty response with mirrored headers."}},"summary":"Returns an empty response for GET requests (no body to return).","tags":["Request inspection"]},"patch":{"description":"Echoes the request body exactly as received and mirrors request headers in the response. Content-Type and custom headers are preserved.","operationId":"PatchBody","requestBody":{"content":{"application/json":{"schema":{"type":"object"}},"application/octet-stream":{"schema":{"format":"binary","type":"string"}},"application/x-www-form-urlencoded":{"schema":{"additionalProperties":{"type":"string"},"type":"object"}},"multipart/form-data":{"schema":{"additionalProperties":true,"type":"object"}},"text/plain":{"schema":{"type":"string"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}},"application/octet-stream":{"schema":{"format":"binary","type":"string"}},"text/plain":{"schema":{"type":"string"}}},"description":"Echoed request body with mirrored headers."}},"summary":"Returns the exact request body with mirrored headers.","tags":["Request inspection"]},"post":{"description":"Echoes the request body exactly as received and mirrors request headers in the response. Content-Type and custom headers are preserved.","operationId":"PostBody","requestBody":{"content":{"application/json":{"example":{"hello":"world"},"schema":{"type":"object"}},"application/octet-stream":{"schema":{"format":"binary","type":"string"}},"application/x-www-form-urlencoded":{"schema":{"additionalProperties":{"type":"string"},"type":"object"}},"multipart/form-data":{"schema":{"additionalProperties":true,"type":"object"}},"text/plain":{"example":"Hello, world!","schema":{"type":"string"}}}},"responses":{"200":{"content":{"application/json":{"example":{"hello":"world"},"schema":{"type":"object"}},"application/octet-stream":{"schema":{"format":"binary","type":"string"}},"text/plain":{"example":"Hello, world!","schema":{"type":"string"}}},"description":"Echoed request body with mirrored headers."}},"summary":"Returns the exact request body with mirrored headers.","tags":["Request inspection"]},"put":{"description":"Echoes the request body exactly as received and mirrors request headers in the response. Content-Type and custom headers are preserved.","operationId":"PutBody","requestBody":{"content":{"application/json":{"schema":{"type":"object"}},"application/octet-stream":{"schema":{"format":"binary","type":"string"}},"application/x-www-form-urlencoded":{"schema":{"additionalProperties":{"type":"string"},"type":"object"}},"multipart/form-data":{"schema":{"additionalProperties":true,"type":"object"}},"text/plain":{"schema":{"type":"string"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}},"application/octet-stream":{"schema":{"format":"binary","type":"string"}},"text/plain":{"schema":{"type":"string"}}},"description":"Echoed request body with mirrored headers."}},"summary":"Returns the exact request body with mirrored headers.","tags":["Request inspection"]},"query":{"description":"Echoes the request body exactly as received, via the QUERY HTTP method (RFC 9430): a safe, idempotent method that carries a request body.","operationId":"QueryBody","requestBody":{"content":{"application/json":{"example":{"hello":"world"},"schema":{"type":"object"}},"application/octet-stream":{"schema":{"format":"binary","type":"string"}},"application/x-www-form-urlencoded":{"schema":{"additionalProperties":{"type":"string"},"type":"object"}},"multipart/form-data":{"schema":{"additionalProperties":true,"type":"object"}},"text/plain":{"example":"Hello, world!","schema":{"type":"string"}}}},"responses":{"200":{"content":{"application/json":{"example":{"hello":"world"},"schema":{"type":"object"}},"application/octet-stream":{"schema":{"format":"binary","type":"string"}},"text/plain":{"example":"Hello, world!","schema":{"type":"string"}}},"description":"Echoed request body with mirrored headers."}},"summary":"Returns the exact request body with mirrored headers.","tags":["Request inspection"]}},"/brotli":{"get":{"description":"Returns a fixed sample JSON document, Brotli-encoded.","operationId":"getBrotli","responses":{"200":{"content":{},"description":"Brotli-encoded data."}},"summary":"Returns Brotli-encoded data.","tags":["Response formats"]},"post":{"description":"Compresses the request body with the matching Content-Encoding and returns it.","operationId":"postBrotli","requestBody":{"content":{"application/octet-stream":{"schema":{"format":"binary","type":"string"}}}},"responses":{"200":{"content":{},"description":"The request body, Brotli-encoded."}},"summary":"Echoes the request body, Brotli-encoded.","tags":["Response formats"]}},"/bytes/{n}":{"get":{"description":"Returns n random bytes; an optional ?seed= makes them deterministic. Over the configured --max-bytes limit returns 404 instead of silently truncating.","operationId":"getBytesN","parameters":[{"description":"Number of random bytes to return","in":"path","name":"n","required":true,"schema":{}},{"description":"Optional seed for deterministic random bytes","in":"query","name":"seed","schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{},"description":"n random bytes (application/octet-stream)."},"404":{"content":{},"description":"n exceeds the server max-bytes limit (configurable via --max-bytes)."}},"summary":"Returns n random bytes.","tags":["Dynamic data"]}},"/cache":{"get":{"description":"Returns 304 if If-Modified-Since or If-None-Match is present, 200 otherwise.","operationId":"getCache","parameters":[{"description":"Conditional request header; a match returns 304","in":"header","name":"If-Modified-Since","schema":{}},{"description":"Conditional request header; a match returns 304","in":"header","name":"If-None-Match","schema":{}}],"responses":{"200":{"content":{},"description":"Cached response."},"304":{"content":{},"description":"Modified."}},"summary":"Returns 304 for conditional requests, 200 otherwise.","tags":["Response inspection"]}},"/cache/{value}":{"get":{"description":"Sets Cache-Control: public, max-age=<value> seconds on the response.","operationId":"getCacheValue","parameters":[{"description":"Cache duration in seconds","in":"path","name":"value","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"content":{},"description":"Cache control set."}},"summary":"Sets a Cache-Control header for n seconds.","tags":["Response inspection"]}},"/cookies":{"get":{"description":"Returns the request cookies as {\"cookies\": {...}}.","operationId":"getCookies","responses":{"200":{"content":{},"description":"Set cookies."}},"summary":"Returns cookie data.","tags":["Cookies"]}},"/cookies/delete":{"get":{"description":"Deletes the given cookies and redirects to /cookies.","operationId":"getCookiesDelete","parameters":[{"allowEmptyValue":true,"description":"Cookie names to delete (one per query parameter)","in":"query","name":"freeform","schema":{}}],"responses":{"200":{"content":{},"description":"Redirects to /cookies."}},"summary":"Deletes the given cookies.","tags":["Cookies"]}},"/cookies/set":{"get":{"description":"Sets cookies from query parameters and redirects to /cookies; supports httponly/secure/samesite/domain/path/max_age attributes.","operationId":"getCookiesSet","parameters":[{"allowEmptyValue":true,"description":"Each name=value query pair becomes a cookie (plus httponly/secure/samesite/domain/path/max_age attributes)","in":"query","name":"freeform","schema":{}},{"description":"If 'true', set the HttpOnly attribute on all cookies","in":"query","name":"httponly","schema":{"type":"string"}},{"description":"If 'true', set the Secure attribute (defaults to the request scheme)","in":"query","name":"secure","schema":{"type":"string"}},{"description":"SameSite attribute","in":"query","name":"samesite","schema":{"enum":["strict","lax","none"],"type":"string"}},{"description":"Cookie Domain attribute","in":"query","name":"domain","schema":{"type":"string"}},{"description":"Max-Age in seconds","in":"query","name":"max_age","schema":{"type":"integer"}},{"description":"Cookie Path attribute (defaults to '/')","in":"query","name":"path","schema":{"type":"string"}}],"responses":{"200":{"content":{},"description":"Redirects to /cookies."}},"summary":"Sets cookies from query string name=value pairs.","tags":["Cookies"]}},"/cookies/set/{name}/{value}":{"get":{"description":"Equivalent to /cookies/set?<name>=<value>: sets one cookie, then redirects to /cookies.","operationId":"getCookiesSetNameValue","parameters":[{"description":"Cookie name","in":"path","name":"name","required":true,"schema":{"type":"string"}},{"description":"Cookie value","in":"path","name":"value","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{},"description":"Set cookies and redirects to /cookies."}},"summary":"Sets a single cookie and redirects to /cookies.","tags":["Cookies"]}},"/deflate":{"get":{"description":"Returns a fixed sample JSON document, Deflate-encoded.","operationId":"getDeflate","responses":{"200":{"content":{},"description":"Deflate-encoded data."}},"summary":"Returns Deflate-encoded data.","tags":["Response formats"]},"post":{"description":"Compresses the request body with the matching Content-Encoding and returns it.","operationId":"postDeflate","requestBody":{"content":{"application/octet-stream":{"schema":{"format":"binary","type":"string"}}}},"responses":{"200":{"content":{},"description":"The request body, Deflate-encoded."}},"summary":"Echoes the request body, Deflate-encoded.","tags":["Response formats"]}},"/delay/{delay}":{"delete":{"description":"Delays the response by up to 10 seconds.","operationId":"deleteDelayDelay","parameters":[{"description":"Delay duration in seconds (max 10)","in":"path","name":"delay","required":true,"schema":{"type":"number"}}],"responses":{"200":{"content":{},"description":"A delayed response."}},"summary":"Returns a delayed response (max of 10 seconds).","tags":["Dynamic data"]},"get":{"description":"Delays the response by up to 10 seconds.","operationId":"getDelayDelay","parameters":[{"description":"Delay duration in seconds (max 10)","in":"path","name":"delay","required":true,"schema":{"type":"number"}}],"responses":{"200":{"content":{},"description":"A delayed response."}},"summary":"Returns a delayed response (max of 10 seconds).","tags":["Dynamic data"]},"patch":{"description":"Delays the response by up to 10 seconds.","operationId":"patchDelayDelay","parameters":[{"description":"Delay duration in seconds (max 10)","in":"path","name":"delay","required":true,"schema":{"type":"number"}}],"responses":{"200":{"content":{},"description":"A delayed response."}},"summary":"Returns a delayed response (max of 10 seconds).","tags":["Dynamic data"]},"post":{"description":"Delays the response by up to 10 seconds.","operationId":"postDelayDelay","parameters":[{"description":"Delay duration in seconds (max 10)","in":"path","name":"delay","required":true,"schema":{"type":"number"}}],"responses":{"200":{"content":{},"description":"A delayed response."}},"summary":"Returns a delayed response (max of 10 seconds).","tags":["Dynamic data"]},"put":{"description":"Delays the response by up to 10 seconds.","operationId":"putDelayDelay","parameters":[{"description":"Delay duration in seconds (max 10)","in":"path","name":"delay","required":true,"schema":{"type":"number"}}],"responses":{"200":{"content":{},"description":"A delayed response."}},"summary":"Returns a delayed response (max of 10 seconds).","tags":["Dynamic data"]},"trace":{"description":"TRACE variant: delays up to 10 seconds, then responds like GET (TRACE carries no body).","operationId":"traceDelayDelay","parameters":[{"description":"Delay duration in seconds (max 10)","in":"path","name":"delay","required":true,"schema":{"type":"number"}}],"responses":{"200":{"content":{},"description":"A delayed response."}},"summary":"Returns a delayed response (max of 10 seconds).","tags":["Dynamic data"]}},"/delete":{"delete":{"description":"Same as /post, for DELETE requests.","operationId":"deleteDelete","responses":{"200":{"content":{},"description":"The request's DELETE parameters."}},"summary":"Echoes the request's DELETE parameters.","tags":["HTTP Methods"]}},"/deny":{"get":{"description":"Returns the page that robots.txt disallows.","operationId":"getDeny","responses":{"200":{"content":{},"description":"Denied message."}},"summary":"Returns page denied by robots.txt rules.","tags":["Response formats"]}},"/digest-auth/{qop}/{user}/{passwd}":{"get":{"description":"Supports both 'auth' and 'auth-int' QoP (Quality of Protection). For 'auth-int', the HA2 hash includes the request body per RFC-7616: HA2 = H(method:uri:H(entity-body)). Supported hash algorithms include SHA-512-256; qop=none enables RFC 2069 legacy mode.","operationId":"getDigestAuthQopUserPasswd","parameters":[{"description":"auth, auth-int, or none. 'auth-int' includes the request body in the hash calculation; 'none' omits qop entirely (RFC 2069 legacy mode).","in":"path","name":"qop","required":true,"schema":{"enum":["auth","auth-int","none"],"type":"string"}},{"description":"Username to authenticate with","in":"path","name":"user","required":true,"schema":{"type":"string"}},{"description":"Password to authenticate with","in":"path","name":"passwd","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{},"description":"Successful authentication."},"401":{"content":{},"description":"Unsuccessful authentication."}},"security":[{"digestAuth":[]}],"summary":"Prompts for HTTP Digest Auth.","tags":["Auth"]},"post":{"description":"POST method for testing 'auth-int' QoP with request bodies. For 'auth-int', the HA2 hash includes the request body per RFC-7616: HA2 = H(method:uri:H(entity-body)). This is essential for proper auth-int testing. Supported hash algorithms include SHA-512-256; qop=none enables RFC 2069 legacy mode.","operationId":"postDigestAuthQopUserPasswd","parameters":[{"description":"auth, auth-int, or none. 'auth-int' includes the request body in the hash calculation; 'none' omits qop entirely (RFC 2069 legacy mode).","in":"path","name":"qop","required":true,"schema":{"enum":["auth","auth-int","none"],"type":"string"}},{"description":"Username to authenticate with","in":"path","name":"user","required":true,"schema":{"type":"string"}},{"description":"Password to authenticate with","in":"path","name":"passwd","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}},"text/plain":{"schema":{"type":"string"}}},"description":"Request body for auth-int QoP testing. The body hash is included in HA2 calculation."},"responses":{"200":{"content":{},"description":"Successful authentication."},"401":{"content":{},"description":"Unsuccessful authentication."}},"security":[{"digestAuth":[]}],"summary":"Prompts for HTTP Digest Auth.","tags":["Auth"]}},"/digest-auth/{qop}/{user}/{passwd}/{algorithm}":{"get":{"description":"Supports both 'auth' and 'auth-int' QoP with configurable hash algorithm. For 'auth-int', the HA2 hash includes the request body per RFC-7616.","operationId":"getDigestAuthQopUserPasswdAlgorithm","parameters":[{"description":"auth, auth-int, or none. 'auth-int' includes the request body in the hash calculation; 'none' omits qop entirely (RFC 2069 legacy mode).","in":"path","name":"qop","required":true,"schema":{"enum":["auth","auth-int","none"],"type":"string"}},{"description":"Username to authenticate with","in":"path","name":"user","required":true,"schema":{"type":"string"}},{"description":"Password to authenticate with","in":"path","name":"passwd","required":true,"schema":{"type":"string"}},{"description":"Hash algorithm for digest calculation","in":"path","name":"algorithm","required":true,"schema":{"default":"MD5","enum":["MD5","SHA-256","SHA-512","SHA-512-256"],"type":"string"}}],"responses":{"200":{"content":{},"description":"Successful authentication."},"400":{"content":{},"description":"Unsupported hash algorithm."},"401":{"content":{},"description":"Unsuccessful authentication."}},"security":[{"digestAuth":[]}],"summary":"Prompts for HTTP Digest Auth with a configurable hash algorithm.","tags":["Auth"]},"post":{"description":"POST method for testing 'auth-int' QoP with request bodies and configurable hash algorithm. For 'auth-int', the HA2 hash includes the request body per RFC-7616.","operationId":"postDigestAuthQopUserPasswdAlgorithm","parameters":[{"description":"auth, auth-int, or none. 'auth-int' includes the request body in the hash calculation; 'none' omits qop entirely (RFC 2069 legacy mode).","in":"path","name":"qop","required":true,"schema":{"enum":["auth","auth-int","none"],"type":"string"}},{"description":"Username to authenticate with","in":"path","name":"user","required":true,"schema":{"type":"string"}},{"description":"Password to authenticate with","in":"path","name":"passwd","required":true,"schema":{"type":"string"}},{"description":"Hash algorithm for digest calculation","in":"path","name":"algorithm","required":true,"schema":{"default":"MD5","enum":["MD5","SHA-256","SHA-512","SHA-512-256"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}},"text/plain":{"schema":{"type":"string"}}},"description":"Request body for auth-int QoP testing. The body hash is included in HA2 calculation."},"responses":{"200":{"content":{},"description":"Successful authentication."},"400":{"content":{},"description":"Unsupported hash algorithm."},"401":{"content":{},"description":"Unsuccessful authentication."}},"security":[{"digestAuth":[]}],"summary":"Prompts for HTTP Digest Auth with a configurable hash algorithm.","tags":["Auth"]}},"/digest-auth/{qop}/{user}/{passwd}/{algorithm}/{stale_after}":{"get":{"description":"Full Digest Auth endpoint with stale_after control. Supports both 'auth' and 'auth-int' QoP. For 'auth-int', the HA2 hash includes the request body per RFC-7616.","operationId":"getDigestAuthQopUserPasswdAlgorithmStaleAfter","parameters":[{"description":"auth, auth-int, or none. 'auth-int' includes the request body in the hash calculation; 'none' omits qop entirely (RFC 2069 legacy mode).","in":"path","name":"qop","required":true,"schema":{"enum":["auth","auth-int","none"],"type":"string"}},{"description":"Username to authenticate with","in":"path","name":"user","required":true,"schema":{"type":"string"}},{"description":"Password to authenticate with","in":"path","name":"passwd","required":true,"schema":{"type":"string"}},{"description":"Hash algorithm for digest calculation","in":"path","name":"algorithm","required":true,"schema":{"default":"MD5","enum":["MD5","SHA-256","SHA-512","SHA-512-256"],"type":"string"}},{"description":"Number of requests before nonce becomes stale, or 'never'","in":"path","name":"stale_after","required":true,"schema":{"default":"never","type":"string"}}],"responses":{"200":{"content":{},"description":"Successful authentication."},"400":{"content":{},"description":"Unsupported hash algorithm."},"401":{"content":{},"description":"Unsuccessful authentication."}},"security":[{"digestAuth":[]}],"summary":"Prompts for HTTP Digest Auth with algorithm and stale_after control.","tags":["Auth"]},"post":{"description":"Full Digest Auth endpoint with stale_after control. POST method for testing 'auth-int' QoP with request bodies. For 'auth-int', the HA2 hash includes the request body per RFC-7616.","operationId":"postDigestAuthQopUserPasswdAlgorithmStaleAfter","parameters":[{"description":"auth, auth-int, or none. 'auth-int' includes the request body in the hash calculation; 'none' omits qop entirely (RFC 2069 legacy mode).","in":"path","name":"qop","required":true,"schema":{"enum":["auth","auth-int","none"],"type":"string"}},{"description":"Username to authenticate with","in":"path","name":"user","required":true,"schema":{"type":"string"}},{"description":"Password to authenticate with","in":"path","name":"passwd","required":true,"schema":{"type":"string"}},{"description":"Hash algorithm for digest calculation","in":"path","name":"algorithm","required":true,"schema":{"default":"MD5","enum":["MD5","SHA-256","SHA-512","SHA-512-256"],"type":"string"}},{"description":"Number of requests before nonce becomes stale, or 'never'","in":"path","name":"stale_after","required":true,"schema":{"default":"never","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}},"text/plain":{"schema":{"type":"string"}}},"description":"Request body for auth-int QoP testing. The body hash is included in HA2 calculation."},"responses":{"200":{"content":{},"description":"Successful authentication."},"400":{"content":{},"description":"Unsupported hash algorithm."},"401":{"content":{},"description":"Unsuccessful authentication."}},"security":[{"digestAuth":[]}],"summary":"Prompts for HTTP Digest Auth with algorithm and stale_after control.","tags":["Auth"]}},"/drip":{"get":{"description":"Drips data over a duration; ?chunked=true streams with real chunked transfer-encoding.","operationId":"getDrip","parameters":[{"description":"The amount of time (in seconds) over which to drip each byte","in":"query","name":"duration","schema":{"default":2,"type":"number"}},{"description":"The number of bytes to respond with","in":"query","name":"numbytes","schema":{"default":10,"type":"integer"}},{"description":"The response code that will be returned","in":"query","name":"code","schema":{"default":200,"type":"integer"}},{"description":"The amount of time (in seconds) to delay before responding","in":"query","name":"delay","schema":{"default":2,"type":"number"}},{"description":"If true, stream with chunked transfer-encoding (omit Content-Length)","in":"query","name":"chunked","schema":{"default":false,"type":"boolean"}}],"responses":{"200":{"content":{},"description":"A dripped response."},"400":{"content":{},"description":"numbytes must be positive."},"404":{"content":{},"description":"numbytes exceeds the server max-bytes limit (configurable via --max-bytes)."}},"summary":"Drips data over a duration after an optional initial delay.","tags":["Dynamic data"]}},"/encoding/iso-8859-1":{"get":{"description":"Returns an ISO-8859-1 encoded page.","operationId":"getEncodingIso88591","responses":{"200":{"content":{"text/html":{"schema":{"type":"string"}}},"description":"Encoded Latin-1 content."}},"summary":"Returns an ISO-8859-1 (Latin-1) encoded body.","tags":["Response formats"]}},"/encoding/utf8":{"get":{"description":"Returns an HTML page of multi-byte UTF-8 demo text.","operationId":"getEncodingUtf8","responses":{"200":{"content":{},"description":"Encoded UTF-8 content."}},"summary":"Returns a UTF-8 encoded body.","tags":["Response formats"]}},"/etag/{etag}":{"get":{"description":"Validates If-Match/If-None-Match against the given ETag; supports weak W/\"...\" validators.","operationId":"getEtagEtag","parameters":[{"description":"The etag value. Use the weak form W/\"value\" for weak validation","in":"path","name":"etag","required":true,"schema":{"type":"string"}},{"description":"Conditional request header; a match returns 304","in":"header","name":"If-None-Match","schema":{}},{"description":"Conditional request header; a mismatch returns 412","in":"header","name":"If-Match","schema":{}}],"responses":{"200":{"content":{},"description":"Normal response."},"412":{"content":{},"description":"Precondition failed: the conditional header did not match the given ETag."}},"summary":"Validates conditional requests against the given ETag.","tags":["Response inspection"]}},"/get":{"get":{"description":"Echoes the request's query parameters, headers, origin, and URL (GET and HEAD); response shape per the GetRequestInfo schema.","operationId":"getGet","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetRequestInfo"}}},"description":"The request's query parameters."}},"summary":"Echoes the request's query parameters, headers, origin, and URL.","tags":["HTTP Methods"]}},"/gzip":{"get":{"description":"Returns a fixed sample JSON document, GZip-encoded.","operationId":"getGzip","responses":{"200":{"content":{},"description":"GZip-encoded data."}},"summary":"Returns GZip-encoded data.","tags":["Response formats"]},"post":{"description":"Compresses the request body with the matching Content-Encoding and returns it.","operationId":"postGzip","requestBody":{"content":{"application/octet-stream":{"schema":{"format":"binary","type":"string"}}}},"responses":{"200":{"content":{},"description":"The request body, GZip-encoded."}},"summary":"Echoes the request body, GZip-encoded.","tags":["Response formats"]}},"/head":{"head":{"description":"HEAD-only: echoes the request headers back as X-Echo-* response headers.","operationId":"headHead","responses":{"200":{"content":{},"description":"Empty body; request headers mirrored as X-Echo-* response headers."}},"summary":"Echoes the request headers as X-Echo-* response headers.","tags":["HTTP Methods"]}},"/headers":{"get":{"description":"Returns the request's HTTP headers as a JSON object; proxy/CDN headers are filtered per --exclude-headers.","operationId":"getHeaders","responses":{"200":{"content":{},"description":"The request's headers."}},"summary":"Returns the request's HTTP headers.","tags":["Request inspection"]}},"/healthz":{"get":{"description":"Liveness probe: returns 200 whenever the server is up.","operationId":"getHealthz","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"status":{"example":"ok","type":"string"}},"type":"object"}}},"description":"Service is healthy."}},"summary":"Liveness probe for orchestrators.","tags":["Observability"]}},"/hidden-basic-auth/{user}":{"get":{"description":"Like /basic-auth/{user}, but returns 404 instead of 401 on failure.","operationId":"getHiddenBasicAuthUser","parameters":[{"description":"Username to authenticate with","in":"path","name":"user","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{},"description":"Successful authentication."},"404":{"content":{},"description":"Unsuccessful authentication."}},"security":[{"basicAuth":[]}],"summary":"Hidden HTTP Basic Auth, username-only: 404 instead of 401 on failure.","tags":["Auth"]},"post":{"description":"POST variant: like /basic-auth/{user}, but returns 404 instead of 401 on failure.","operationId":"postHiddenBasicAuthUser","parameters":[{"description":"Username to authenticate with","in":"path","name":"user","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{},"description":"Successful authentication."},"404":{"content":{},"description":"Unsuccessful authentication."}},"security":[{"basicAuth":[]}],"summary":"Hidden HTTP Basic Auth, username-only: 404 instead of 401 on failure.","tags":["Auth"]}},"/hidden-basic-auth/{user}/{passwd}":{"get":{"description":"Like /basic-auth, but returns 404 instead of 401 on failure.","operationId":"getHiddenBasicAuthUserPasswd","parameters":[{"description":"Username to authenticate with","in":"path","name":"user","required":true,"schema":{"type":"string"}},{"description":"Password to authenticate with","in":"path","name":"passwd","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{},"description":"Successful authentication."},"404":{"content":{},"description":"Unsuccessful authentication."}},"security":[{"basicAuth":[]}],"summary":"Hidden HTTP Basic Auth: 404 instead of 401 on failure.","tags":["Auth"]},"post":{"description":"POST variant: like /basic-auth, but returns 404 instead of 401 on failure.","operationId":"postHiddenBasicAuthUserPasswd","parameters":[{"description":"Username to authenticate with","in":"path","name":"user","required":true,"schema":{"type":"string"}},{"description":"Password to authenticate with","in":"path","name":"passwd","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{},"description":"Successful authentication."},"404":{"content":{},"description":"Unsuccessful authentication."}},"security":[{"basicAuth":[]}],"summary":"Hidden HTTP Basic Auth: 404 instead of 401 on failure.","tags":["Auth"]}},"/html":{"get":{"description":"Returns a sample HTML document (text/html).","operationId":"getHtml","responses":{"200":{"content":{},"description":"An HTML page."}},"summary":"Returns a sample HTML document.","tags":["Response formats"]}},"/image":{"get":{"description":"Returns a random colored image. If the Accept header specifies an image format (image/png, image/jpeg, image/webp, image/svg+xml), returns an image in that format. Otherwise returns a random format.","operationId":"getImage","parameters":[{"description":"Preferred image format. Supports image/png, image/jpeg, image/webp, image/svg+xml, or image/* for random format","example":"image/png","in":"header","name":"Accept","required":false,"schema":{"enum":["image/png","image/jpeg","image/webp","image/svg+xml","image/*"],"type":"string"}}],"responses":{"200":{"content":{"image/jpeg":{"schema":{"format":"binary","type":"string"}},"image/png":{"schema":{"format":"binary","type":"string"}},"image/svg+xml":{"schema":{"format":"binary","type":"string"}},"image/webp":{"schema":{"format":"binary","type":"string"}}},"description":"A random colored image with X-Image-Color header indicating the color and X-Image-Format-Source indicating how the format was chosen.","headers":{"X-Image-Color":{"description":"The color name of the returned image","schema":{"type":"string"}},"X-Image-Format-Source":{"description":"How the image format was determined: 'accept-header', 'random', or 'fallback'","schema":{"enum":["accept-header","random","fallback"],"type":"string"}}}}},"summary":"Returns a random image, negotiated via the Accept header.","tags":["Images"]}},"/image/jpeg":{"get":{"description":"Returns a random colored JPEG image, served as image/jpeg.","operationId":"getImageJpeg","responses":{"200":{"content":{"image/jpeg":{"schema":{"format":"binary","type":"string"}}},"description":"A random colored JPEG image with X-Image-Color header indicating the color.","headers":{"X-Image-Color":{"description":"The color name of the returned image","schema":{"type":"string"}}}}},"summary":"Returns a random colored JPEG image.","tags":["Images"]}},"/image/png":{"get":{"description":"Returns a random colored PNG image, served as image/png.","operationId":"getImagePng","responses":{"200":{"content":{"image/png":{"schema":{"format":"binary","type":"string"}}},"description":"A random colored PNG image with X-Image-Color header indicating the color.","headers":{"X-Image-Color":{"description":"The color name of the returned image","schema":{"type":"string"}}}}},"summary":"Returns a random colored PNG image.","tags":["Images"]}},"/image/svg":{"get":{"description":"Returns a random colored SVG image, served as image/svg+xml.","operationId":"getImageSvg","responses":{"200":{"content":{"image/svg+xml":{"schema":{"format":"binary","type":"string"}}},"description":"A random colored SVG image with X-Image-Color header indicating the color.","headers":{"X-Image-Color":{"description":"The color name of the returned image","schema":{"type":"string"}}}}},"summary":"Returns a random colored SVG image.","tags":["Images"]}},"/image/webp":{"get":{"description":"Returns a random colored WEBP image, served as image/webp.","operationId":"getImageWebp","responses":{"200":{"content":{"image/webp":{"schema":{"format":"binary","type":"string"}}},"description":"A random colored WEBP image with X-Image-Color header indicating the color.","headers":{"X-Image-Color":{"description":"The color name of the returned image","schema":{"type":"string"}}}}},"summary":"Returns a random colored WEBP image.","tags":["Images"]}},"/ip":{"get":{"description":"Returns the client IP as {\"origin\": \"...\"}.","operationId":"getIp","responses":{"200":{"content":{},"description":"The requester's IP address."}},"summary":"Returns the requester's IP address.","tags":["Request inspection"]}},"/json":{"get":{"description":"Returns a sample JSON document (application/json).","operationId":"getJson","responses":{"200":{"content":{},"description":"An JSON document."}},"summary":"Returns a sample JSON document.","tags":["Response formats"]}},"/jwt-bearer":{"get":{"description":"Decodes and inspects a JWT Bearer token without verifying its signature: checks expiration claims and returns token analysis including header, payload, claims, and validation status. Useful for testing JWT authentication implementations.","operationId":"getJwtBearer","parameters":[{"description":"JWT Bearer token to validate","examples":{"Expired Token":{"description":"Request with an expired JWT token","summary":"Example with expired JWT token","value":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJleHAiOjE1MTYyMzkwMjJ9.expired_signature"},"Valid Token":{"description":"Request with a valid JWT token that includes standard claims","summary":"Example with valid JWT token","value":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"}},"in":"header","name":"Authorization","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"authenticated":{"example":true,"type":"boolean"},"token":{"properties":{"header":{"description":"Decoded JWT header","example":{"alg":"HS256","typ":"JWT"},"type":"object"},"payload":{"description":"Decoded JWT payload","example":{"iat":1516239022,"name":"John Doe","sub":"1234567890"},"type":"object"},"payloadFormatted":{"description":"JWT payload with timestamps replaced by human-readable formatted versions","example":{"exp":"2025-01-18T01:30:22Z","iat":"2018-01-18T01:30:22Z","name":"John Doe","sub":"1234567890"},"type":"object"},"raw":{"description":"Original JWT token string","example":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c","type":"string"},"validationStatus":{"properties":{"expiration":{"enum":["valid","expired","not_present","invalid_format"],"example":"not_present","type":"string"},"structure":{"enum":["valid","invalid"],"example":"valid","type":"string"}},"type":"object"}},"type":"object"}},"type":"object"}}},"description":"Valid JWT token with detailed analysis."},"400":{"content":{"application/json":{"schema":{"properties":{"authenticated":{"example":false,"type":"boolean"},"error":{"example":"Invalid Authorization header encoding","type":"string"}},"type":"object"}}},"description":"Bad request (e.g., invalid Authorization header encoding)."},"401":{"content":{"application/json":{"schema":{"properties":{"authenticated":{"example":false,"type":"boolean"},"error":{"description":"Error description","example":"Token expired","type":"string"},"token":{"description":"Available token information (if any could be extracted)","type":"object"}},"type":"object"}}},"description":"Invalid, expired, or missing JWT token."}},"security":[{"bearerAuth":[]}],"summary":"Validates a JWT Bearer token and returns its details.","tags":["Auth"]}},"/links/{n}":{"get":{"description":"Same as /links/{n}/{offset}, with offset defaulted to 0; redirects to the page.","operationId":"getLinks","parameters":[{"description":"Number of links per page","in":"path","name":"n","required":true,"schema":{}}],"responses":{"200":{"content":{},"description":"HTML links."}},"summary":"Returns the first page of n links.","tags":["Dynamic data"]}},"/links/{n}/{offset}":{"get":{"description":"Returns a page of n links, starting at offset.","operationId":"getLinksNOffset","parameters":[{"description":"Number of links per page","in":"path","name":"n","required":true,"schema":{}},{"description":"Page offset (0-based)","in":"path","name":"offset","required":true,"schema":{}}],"responses":{"200":{"content":{},"description":"HTML links."}},"summary":"Returns a page of n links.","tags":["Dynamic data"]}},"/llm":{"get":{"description":"Endpoints, base_url guidance for OpenAI/Anthropic SDKs, and the httpcan response-override contract.","operationId":"getLlmIndex","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"LLM mock index"}},"summary":"Self-describing index of the LLM mock endpoints","tags":["AI API Mock"]}},"/llm/v1/chat/completions":{"post":{"description":"Returns a canonical chat.completion response. Supports stream:true (chat.completion.chunk SSE with [DONE], include_usage via stream_options) and an httpcan.content body override. /llm/chat/completions is an undocumented silent alias.","operationId":"createChatCompletionMock","requestBody":{"content":{"application/json":{"schema":{"properties":{"httpcan":{"properties":{"content":{"type":"string"}},"type":"object"},"messages":{"items":{"properties":{"content":{"oneOf":[{"type":"string"},{"type":"array"}]},"role":{"type":"string"}},"type":"object"},"type":"array"},"model":{"type":"string"},"n":{"default":1,"type":"integer"},"stream":{"default":false,"type":"boolean"},"stream_options":{"properties":{"include_usage":{"type":"boolean"}},"type":"object"}},"required":["messages"],"type":"object"}}},"required":true},"responses":{"200":{"description":"chat.completion object or SSE stream"},"400":{"description":"OpenAI-shaped error"},"405":{"description":"Method not allowed (POST only)"}},"summary":"Mock OpenAI Chat Completions API","tags":["AI API Mock"]}},"/llm/v1/completions":{"post":{"description":"Text-in/text-out legacy completions: canonical text_completion shape with spec-required choices fields (logprobs as null). Supports prompt as string or arrays, echo:true (prepends the prompt), n choices, SSE streaming (no role first-chunk, stop chunk, [DONE], include_usage via stream_options) and the httpcan.content override. /llm/completions is an undocumented silent alias.","operationId":"createCompletionMock","requestBody":{"content":{"application/json":{"schema":{"properties":{"echo":{"default":false,"type":"boolean"},"httpcan":{"properties":{"content":{"type":"string"}},"type":"object"},"model":{"type":"string"},"n":{"default":1,"type":"integer"},"prompt":{"oneOf":[{"type":"string"},{"type":"array"}]},"stream":{"default":false,"type":"boolean"},"stream_options":{"properties":{"include_usage":{"type":"boolean"}},"type":"object"}},"required":["prompt"],"type":"object"}}},"required":true},"responses":{"200":{"description":"text_completion object or SSE stream"},"400":{"description":"OpenAI-shaped error"},"405":{"description":"Method not allowed (POST only)"}},"summary":"Mock OpenAI legacy Completions API","tags":["AI API Mock"]}},"/llm/v1/messages":{"post":{"description":"Returns an Anthropic message with text content blocks and stop_reason. Supports stream:true (full event protocol: message_start through message_stop) and an httpcan.content body override.","operationId":"createMessageMock","requestBody":{"content":{"application/json":{"schema":{"properties":{"httpcan":{"properties":{"content":{"type":"string"}},"type":"object"},"max_tokens":{"type":"integer"},"messages":{"items":{"properties":{"content":{"oneOf":[{"type":"string"},{"type":"array"}]},"role":{"type":"string"}},"type":"object"},"type":"array"},"model":{"type":"string"},"stream":{"default":false,"type":"boolean"},"system":{"oneOf":[{"type":"string"},{"type":"array"}]}},"required":["messages"],"type":"object"}}},"required":true},"responses":{"200":{"description":"Anthropic message object or SSE event stream"},"400":{"description":"Anthropic-shaped error"},"405":{"description":"Method not allowed (POST only)"}},"summary":"Mock Anthropic Messages API","tags":["AI API Mock"]}},"/llm/v1/models":{"get":{"description":"OpenAI list shape by default; Anthropic shape when an anthropic-version request header is present (both SDK families construct this same path).","operationId":"listMockModels","responses":{"200":{"description":"Model list"}},"summary":"List mock models","tags":["AI API Mock"]}},"/llm/v1/models/{model}":{"get":{"description":"Always returns 200 and echoes the requested model id — any model name is valid, consistent with the lenient chat endpoints.","operationId":"retrieveMockModel","parameters":[{"in":"path","name":"model","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Model object"}},"summary":"Retrieve a mock model","tags":["AI API Mock"]}},"/llm/v1/responses":{"post":{"description":"Returns a canonical Response object (spec-required fields incl. temperature/top_p/metadata/tool_choice, output_text convenience, ResponseUsage with detail sub-objects). Streaming emits named SSE events (response.created through response.completed) with incrementing sequence_number and no [DONE] sentinel. /llm/responses is an undocumented silent alias. instructions is echoed back.","operationId":"createResponseMock","requestBody":{"content":{"application/json":{"schema":{"properties":{"httpcan":{"properties":{"content":{"type":"string"}},"type":"object"},"input":{"oneOf":[{"type":"string"},{"type":"array"}]},"instructions":{"type":"string"},"model":{"type":"string"},"stream":{"default":false,"type":"boolean"}},"type":"object"}}},"required":true},"responses":{"200":{"description":"Response object or named SSE event stream"},"400":{"description":"OpenAI-shaped error"},"405":{"description":"Method not allowed (POST only)"}},"summary":"Mock OpenAI Responses API","tags":["AI API Mock"]}},"/method":{"additionalOperations":{"ANY_CUSTOM_METHOD":{"description":"Placeholder key demonstrating that ANY method token is accepted: sending ANY_CUSTOM_METHOD — or any other non-standard token such as LINK (RFC 4918) or PURGE — echoes the method name back unchanged.","operationId":"anyCustomMethod","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"method":{"type":"string"}},"type":"object"}}},"description":"JSON object with the method name."}},"summary":"Echoes the request's HTTP method name.","tags":["Request inspection"]}},"delete":{"description":"Echoes back the HTTP method name used. Any method name is accepted, including extension methods not listed here.","operationId":"deleteMethod","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"method":{"type":"string"}},"type":"object"}}},"description":"JSON object with the method name."}},"summary":"Echoes the request's HTTP method name.","tags":["Request inspection"]},"get":{"description":"Echoes back the HTTP method name used. Any method name is accepted, including extension methods not listed here.","operationId":"getMethod","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"method":{"type":"string"}},"type":"object"}}},"description":"JSON object with the method name."}},"summary":"Echoes the request's HTTP method name.","tags":["Request inspection"]},"head":{"description":"Echoes back the HTTP method name used. Any method name is accepted, including extension methods not listed here. HEAD responses carry the headers with an empty body.","operationId":"headMethod","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"method":{"type":"string"}},"type":"object"}}},"description":"Headers only; no response body (HEAD)."}},"summary":"Echoes the request's HTTP method name.","tags":["Request inspection"]},"options":{"description":"Echoes back the HTTP method name used. Any method name is accepted, including extension methods not listed here.","operationId":"optionsMethod","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"method":{"type":"string"}},"type":"object"}}},"description":"JSON object with the method name."}},"summary":"Echoes the request's HTTP method name.","tags":["Request inspection"]},"patch":{"description":"Echoes back the HTTP method name used. Any method name is accepted, including extension methods not listed here.","operationId":"patchMethod","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"method":{"type":"string"}},"type":"object"}}},"description":"JSON object with the method name."}},"summary":"Echoes the request's HTTP method name.","tags":["Request inspection"]},"post":{"description":"Echoes back the HTTP method name used. Any method name is accepted, including extension methods not listed here.","operationId":"postMethod","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"method":{"type":"string"}},"type":"object"}}},"description":"JSON object with the method name."}},"summary":"Echoes the request's HTTP method name.","tags":["Request inspection"]},"put":{"description":"Echoes back the HTTP method name used. Any method name is accepted, including extension methods not listed here.","operationId":"putMethod","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"method":{"type":"string"}},"type":"object"}}},"description":"JSON object with the method name."}},"summary":"Echoes the request's HTTP method name.","tags":["Request inspection"]},"query":{"description":"Echoes back the HTTP method name used. Any method name is accepted, including extension methods not listed here.","operationId":"queryMethod","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"method":{"type":"string"}},"type":"object"}}},"description":"JSON object with the method name."}},"summary":"Echoes the request's HTTP method name.","tags":["Request inspection"]},"trace":{"description":"Echoes back the HTTP method name used. Any method name is accepted, including extension methods not listed here.","operationId":"traceMethod","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"method":{"type":"string"}},"type":"object"}}},"description":"JSON object with the method name."}},"summary":"Echoes the request's HTTP method name.","tags":["Request inspection"]}},"/ndjson":{"get":{"description":"Streams newline-delimited JSON; supports OpenAI/Ollama-compatible chunk formats.","operationId":"getNdjson","parameters":[{"description":"Number of events to send (default: 5, max: 100)","in":"query","name":"count","schema":{"default":5,"maximum":100,"minimum":1,"type":"integer"}},{"description":"Delay between events in milliseconds (default: 1000, max: 10000)","in":"query","name":"delay","schema":{"default":1000,"maximum":10000,"minimum":100,"type":"integer"}},{"description":"Message format","in":"query","name":"format","schema":{"default":"simple","enum":["simple","openai","ollama","custom"],"type":"string"}},{"description":"Custom message content (used with format=custom)","in":"query","name":"message","schema":{"type":"string"}},{"description":"Model name for ollama format","in":"query","name":"model","schema":{"default":"llama2","type":"string"}}],"responses":{"200":{"content":{"application/x-ndjson":{"itemSchema":{"$ref":"#/components/schemas/NdjsonLineItem"}}},"description":"NDJSON stream."}},"summary":"Streams newline-delimited JSON with configurable parameters.","tags":["Streaming"]}},"/ndjson/{count}":{"get":{"description":"Same as /ndjson, with a fixed line count.","operationId":"getNdjsonCount","parameters":[{"description":"Number of events to send (max: 100)","in":"path","name":"count","required":true,"schema":{"maximum":100,"minimum":1,"type":"integer"}},{"description":"Delay between events in milliseconds (default: 1000, max: 10000)","in":"query","name":"delay","schema":{"default":1000,"maximum":10000,"minimum":100,"type":"integer"}},{"description":"Message format","in":"query","name":"format","schema":{"default":"simple","enum":["simple","openai","ollama","custom"],"type":"string"}},{"description":"Custom message content (used with format=custom)","in":"query","name":"message","schema":{"type":"string"}},{"description":"Model name for ollama format","in":"query","name":"model","schema":{"default":"llama2","type":"string"}}],"responses":{"200":{"content":{"application/x-ndjson":{"itemSchema":{"$ref":"#/components/schemas/NdjsonLineItem"}}},"description":"NDJSON stream."}},"summary":"Streams newline-delimited JSON with a fixed line count.","tags":["Streaming"]}},"/ndjson/{count}/{delay}":{"get":{"description":"Same as /ndjson, with a fixed count and delay between lines.","operationId":"getNdjsonCountDelay","parameters":[{"description":"Number of events to send (max: 100)","in":"path","name":"count","required":true,"schema":{"maximum":100,"minimum":1,"type":"integer"}},{"description":"Delay between events in milliseconds (max: 10000)","in":"path","name":"delay","required":true,"schema":{"maximum":10000,"minimum":100,"type":"integer"}},{"description":"Message format","in":"query","name":"format","schema":{"default":"simple","enum":["simple","openai","ollama","custom"],"type":"string"}},{"description":"Custom message content (used with format=custom)","in":"query","name":"message","schema":{"type":"string"}},{"description":"Model name for ollama format","in":"query","name":"model","schema":{"default":"llama2","type":"string"}}],"responses":{"200":{"content":{"application/x-ndjson":{"itemSchema":{"$ref":"#/components/schemas/NdjsonLineItem"}}},"description":"NDJSON stream."}},"summary":"Streams newline-delimited JSON with fixed count and delay.","tags":["Streaming"]}},"/oauth2":{"get":{"description":"Endpoints, supported grants, PKCE methods, and the mock's state semantics (any credentials accepted unless --oauth2-clients is configured; restarting invalidates issued codes and tokens).","operationId":"getOauth2Index","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"OAuth 2.0 mock index"}},"summary":"Self-describing index of the OAuth 2.0 mock","tags":["OAuth 2.0 Mock"]}},"/oauth2/authorize":{"get":{"description":"Validates the authorization request (RFC 6749 §4.1.1: response_type, client_id, redirect_uri, scope, state, code_challenge) and renders a mock consent page. response_type=code issues a one-time authorization code on approval; response_type=token (implicit, legacy) returns the access token in the redirect fragment. Invalid redirect_uri or client_id is never redirected (§3.1.2.4); other errors are returned to the client via error redirects (§4.1.2.1).","operationId":"getOauth2Authorize","parameters":[{"in":"query","name":"response_type","required":true,"schema":{"enum":["code","token"],"type":"string"}},{"in":"query","name":"client_id","required":true,"schema":{"type":"string"}},{"in":"query","name":"redirect_uri","required":true,"schema":{"format":"uri","type":"string"}},{"in":"query","name":"scope","schema":{"type":"string"}},{"in":"query","name":"state","schema":{"type":"string"}},{"in":"query","name":"code_challenge","schema":{"type":"string"}},{"in":"query","name":"code_challenge_method","schema":{"enum":["S256","plain"],"type":"string"}}],"responses":{"200":{"description":"Consent page (text/html)"},"302":{"description":"Error redirect for other invalid requests (unsupported_response_type, invalid_request)"},"400":{"description":"Invalid redirect_uri or missing client_id (not redirected)"}},"summary":"Authorization endpoint (renders the consent page)","tags":["OAuth 2.0 Mock"]},"post":{"description":"Consumes the consent form (hidden authorize parameters plus email and decision). Approve: 302 with code+state in the query (code flow) or access_token in the fragment (implicit flow, never a refresh token). Decline: 302 with error=access_denied.","operationId":"submitOauth2Consent","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"properties":{"client_id":{"type":"string"},"code_challenge":{"type":"string"},"code_challenge_method":{"type":"string"},"decision":{"enum":["approve","decline"],"type":"string"},"email":{"type":"string"},"redirect_uri":{"type":"string"},"response_type":{"type":"string"},"scope":{"type":"string"},"state":{"type":"string"}},"required":["response_type","client_id","redirect_uri","email","decision"],"type":"object"}}},"required":true},"responses":{"302":{"description":"Redirect to redirect_uri with code/token or error parameters"},"400":{"description":"Invalid redirect_uri or missing email (not redirected)"}},"summary":"Process the consent decision","tags":["OAuth 2.0 Mock"]}},"/oauth2/token":{"post":{"description":"RFC 6749 token endpoint supporting authorization_code (+PKCE), password (legacy), refresh_token (rotating), and client_credentials. Client authentication via Authorization: Basic or form-body client_secret; both at once is rejected. Responses carry Cache-Control: no-store and Pragma: no-cache (§5.1). Without --oauth2-clients any non-empty secret passes.","operationId":"createOauth2Token","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"properties":{"client_id":{"type":"string"},"client_secret":{"type":"string"},"code":{"type":"string"},"code_verifier":{"type":"string"},"grant_type":{"enum":["authorization_code","password","refresh_token","client_credentials"],"type":"string"},"password":{"type":"string"},"redirect_uri":{"type":"string"},"refresh_token":{"type":"string"},"scope":{"type":"string"},"username":{"type":"string"}},"required":["grant_type"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Token response: access_token, token_type, expires_in, optional refresh_token and scope"},"400":{"description":"invalid_request / invalid_grant / unsupported_grant_type (RFC 6749 §5.2 JSON)"},"401":{"description":"invalid_client (when --oauth2-clients is configured)"}},"summary":"Token endpoint (four grants)","tags":["OAuth 2.0 Mock"]}},"/oauth2/userinfo":{"get":{"description":"Verifies the Bearer access token and returns sub/email/client_id/scope. 401 challenges carry error=\"invalid_token\" attributes per RFC 6750 §3.","operationId":"getOauth2Userinfo","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Identity claims"},"401":{"description":"Missing or invalid Bearer token (WWW-Authenticate challenge)"}},"security":[{"bearerAuth":[]}],"summary":"Bearer-protected resource returning the mock identity","tags":["OAuth 2.0 Mock"]},"post":{"description":"Same contract as GET.","operationId":"postOauth2Userinfo","responses":{"200":{"description":"Identity claims"},"401":{"description":"Missing or invalid Bearer token"}},"security":[{"bearerAuth":[]}],"summary":"Bearer-protected resource returning the mock identity","tags":["OAuth 2.0 Mock"]}},"/options":{"options":{"description":"OPTIONS-only: echoes the request and returns an Allow header (RFC 9110 §9.3.7).","operationId":"optionsOptions","responses":{"200":{"content":{},"description":"JSON echo of args/headers/origin/url, plus Allow: OPTIONS."}},"summary":"Echoes the request and returns an Allow header.","tags":["HTTP Methods"]}},"/patch":{"patch":{"description":"Same as /post, for PATCH requests.","operationId":"patchPatch","responses":{"200":{"content":{},"description":"The request's PATCH parameters."}},"summary":"Echoes the request's PATCH parameters.","tags":["HTTP Methods"]}},"/post":{"post":{"description":"Echoes the request's parsed body and uploaded files; multiple files with the same parameter name are returned as an array.","operationId":"postPost","requestBody":{"content":{"application/json":{"schema":{"type":"object"}},"application/x-www-form-urlencoded":{"schema":{"additionalProperties":{"type":"string"},"type":"object"}},"multipart/form-data":{"schema":{"additionalProperties":true,"description":"Supports file uploads. Multiple files with the same field name are returned as an array.","type":"object"}},"text/plain":{"schema":{"type":"string"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestInfo"}}},"description":"The request's POST parameters and uploaded files."}},"summary":"Echoes the request's POST parameters and uploaded files.","tags":["HTTP Methods"]}},"/put":{"put":{"description":"Same as /post, for PUT requests.","operationId":"putPut","responses":{"200":{"content":{},"description":"The request's PUT parameters."}},"summary":"Echoes the request's PUT parameters.","tags":["HTTP Methods"]}},"/query":{"query":{"description":"Echoes the request's URL args and parsed body (form/JSON/multipart), like /post. Uses the QUERY HTTP method (RFC 9430): a safe, idempotent method that carries a request body.","operationId":"queryQuery","responses":{"200":{"content":{},"description":"Echoed request data."}},"summary":"Echoes the request like /post (RFC 9430).","tags":["HTTP Methods"]}},"/range/{numbytes}":{"get":{"description":"Streams numbytes bytes; supports Range requests.","operationId":"getRangeNumbytes","parameters":[{"description":"Total number of bytes in the payload","in":"path","name":"numbytes","required":true,"schema":{}},{"description":"Bytes per chunk (default: 10240)","in":"query","name":"chunk_size","schema":{"type":"integer"}},{"description":"Total streaming duration in seconds (default: 0)","in":"query","name":"duration","schema":{"type":"number"}}],"responses":{"200":{"content":{},"description":"The requested byte range of the numbytes payload."},"404":{"content":{},"description":"numbytes is 0 or exceeds the server max-bytes limit (configurable via --max-bytes)."},"416":{"content":{},"description":"Requested Range is not satisfiable for the given numbytes."}},"summary":"Streams bytes with HTTP Range support.","tags":["Dynamic data"]}},"/redirect-to":{"delete":{"description":"Redirects to ?url=; POST/PUT/PATCH/DELETE also accept urlencoded, multipart, or JSON bodies (body fields win over query); browser clients see an anti-phishing interstitial instead of a silent redirect.","operationId":"deleteRedirectTo","parameters":[{"description":"Target URL to redirect to","in":"query","name":"url","required":true,"schema":{"format":"uri","type":"string"}},{"description":"HTTP status code for the redirect (default 302)","in":"query","name":"status_code","required":false,"schema":{"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"status_code":{},"url":{"type":"string"}},"required":["url"],"type":"object"}},"application/x-www-form-urlencoded":{"schema":{"properties":{"status_code":{},"url":{"type":"string"}},"required":["url"],"type":"object"}},"multipart/form-data":{"schema":{"properties":{"status_code":{},"url":{"type":"string"}},"required":["url"],"type":"object"}}},"required":false},"responses":{"302":{"content":{},"description":"A redirection."},"400":{"content":{},"description":"Missing required url query parameter."}},"summary":"Redirects to the given URL (302 by default, or a custom status).","tags":["Redirects"]},"get":{"description":"Redirects to ?url=; POST/PUT/PATCH/DELETE also accept urlencoded, multipart, or JSON bodies (body fields win over query); browser clients see an anti-phishing interstitial instead of a silent redirect.","operationId":"getRedirectTo","parameters":[{"description":"Target URL to redirect to","in":"query","name":"url","required":true,"schema":{"format":"uri","type":"string"}},{"description":"HTTP status code for the redirect (default 302)","in":"query","name":"status_code","required":false,"schema":{"type":"integer"}}],"responses":{"302":{"content":{},"description":"A redirection."},"400":{"content":{},"description":"Missing required url query parameter."}},"summary":"Redirects to the given URL (302 by default, or a custom status).","tags":["Redirects"]},"patch":{"description":"Redirects to ?url=; POST/PUT/PATCH/DELETE also accept urlencoded, multipart, or JSON bodies (body fields win over query); browser clients see an anti-phishing interstitial instead of a silent redirect.","operationId":"patchRedirectTo","parameters":[{"description":"Target URL to redirect to","in":"query","name":"url","required":true,"schema":{"format":"uri","type":"string"}},{"description":"HTTP status code for the redirect (default 302)","in":"query","name":"status_code","required":false,"schema":{"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"status_code":{},"url":{"type":"string"}},"required":["url"],"type":"object"}},"application/x-www-form-urlencoded":{"schema":{"properties":{"status_code":{},"url":{"type":"string"}},"required":["url"],"type":"object"}},"multipart/form-data":{"schema":{"properties":{"status_code":{},"url":{"type":"string"}},"required":["url"],"type":"object"}}},"required":false},"responses":{"302":{"content":{},"description":"A redirection."},"400":{"content":{},"description":"Missing required url query parameter."}},"summary":"Redirects to the given URL (302 by default, or a custom status).","tags":["Redirects"]},"post":{"description":"Redirects to ?url=; POST/PUT/PATCH/DELETE also accept urlencoded, multipart, or JSON bodies (body fields win over query); browser clients see an anti-phishing interstitial instead of a silent redirect.","operationId":"postRedirectTo","parameters":[{"description":"Target URL to redirect to","in":"query","name":"url","required":true,"schema":{"format":"uri","type":"string"}},{"description":"HTTP status code for the redirect (default 302)","in":"query","name":"status_code","required":false,"schema":{"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"status_code":{},"url":{"type":"string"}},"required":["url"],"type":"object"}},"application/x-www-form-urlencoded":{"schema":{"properties":{"status_code":{},"url":{"type":"string"}},"required":["url"],"type":"object"}},"multipart/form-data":{"schema":{"properties":{"status_code":{},"url":{"type":"string"}},"required":["url"],"type":"object"}}},"required":false},"responses":{"302":{"content":{},"description":"A redirection."},"400":{"content":{},"description":"Missing required url query parameter."}},"summary":"Redirects to the given URL (302 by default, or a custom status).","tags":["Redirects"]},"put":{"description":"Redirects to ?url=; POST/PUT/PATCH/DELETE also accept urlencoded, multipart, or JSON bodies (body fields win over query); browser clients see an anti-phishing interstitial instead of a silent redirect.","operationId":"putRedirectTo","parameters":[{"description":"Target URL to redirect to","in":"query","name":"url","required":true,"schema":{"format":"uri","type":"string"}},{"description":"HTTP status code for the redirect (default 302)","in":"query","name":"status_code","required":false,"schema":{"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"status_code":{},"url":{"type":"string"}},"required":["url"],"type":"object"}},"application/x-www-form-urlencoded":{"schema":{"properties":{"status_code":{},"url":{"type":"string"}},"required":["url"],"type":"object"}},"multipart/form-data":{"schema":{"properties":{"status_code":{},"url":{"type":"string"}},"required":["url"],"type":"object"}}},"required":false},"responses":{"302":{"content":{},"description":"A redirection."},"400":{"content":{},"description":"Missing required url query parameter."}},"summary":"Redirects to the given URL (302 by default, or a custom status).","tags":["Redirects"]},"trace":{"description":"Redirects to ?url=; POST/PUT/PATCH/DELETE also accept urlencoded, multipart, or JSON bodies (body fields win over query); browser clients see an anti-phishing interstitial instead of a silent redirect.","operationId":"traceRedirectTo","parameters":[{"description":"Target URL to redirect to","in":"query","name":"url","required":true,"schema":{"format":"uri","type":"string"}},{"description":"HTTP status code for the redirect (default 302)","in":"query","name":"status_code","required":false,"schema":{"type":"integer"}}],"responses":{"302":{"content":{},"description":"A redirection."},"400":{"content":{},"description":"Missing required url query parameter."}},"summary":"Redirects to the given URL (302 by default, or a custom status).","tags":["Redirects"]}},"/redirect/{n}":{"get":{"description":"Each hop is a 302; after n redirects the chain ends at /get with a 200. ?absolute=true builds absolute (scheme+host) Location URLs and chains via /absolute-redirect instead of /relative-redirect.","operationId":"getRedirectN","parameters":[{"description":"Number of redirects to perform","in":"path","name":"n","required":true,"schema":{}},{"description":"If 'true' (case-insensitive), redirect using absolute URLs and chain via /absolute-redirect; default relative via /relative-redirect.","in":"query","name":"absolute","schema":{"default":"false","enum":["true","false"],"type":"string"}}],"responses":{"302":{"content":{},"description":"A redirection."},"400":{"content":{},"description":"n must be greater than 0."}},"summary":"Redirects n times before returning 200.","tags":["Redirects"]}},"/relative-redirect/{n}":{"get":{"description":"Same as /redirect/{n}, using relative Location URLs.","operationId":"getRelativeRedirectN","parameters":[{"description":"Number of redirects to perform","in":"path","name":"n","required":true,"schema":{}}],"responses":{"302":{"content":{},"description":"A redirection."},"400":{"content":{},"description":"n must be greater than 0."}},"summary":"Redirects n times, using relative Location URLs.","tags":["Redirects"]}},"/response-headers":{"get":{"description":"Echoes query parameters as response headers; ?body= and ?status= override the response body and status code.","operationId":"getResponseHeaders","parameters":[{"allowEmptyValue":true,"description":"Each name=value query pair becomes a response header","in":"query","name":"freeform","schema":{}}],"responses":{"200":{"content":{},"description":"Response headers."}},"summary":"Returns a set of response headers from the query string.","tags":["Response inspection"]},"post":{"description":"Echoes query parameters as response headers; ?body= and ?status= override the response body and status code.","operationId":"postResponseHeaders","parameters":[{"allowEmptyValue":true,"description":"Each name=value query pair becomes a response header","in":"query","name":"freeform","schema":{}}],"responses":{"200":{"content":{},"description":"Response headers."}},"summary":"Returns a set of response headers from the query string.","tags":["Response inspection"]}},"/sse":{"get":{"description":"Streams server-sent events; supports OpenAI-compatible chunk formats.","operationId":"getSse","parameters":[{"description":"Number of events to send (default: 5, max: 100)","in":"query","name":"count","schema":{"default":5,"maximum":100,"minimum":1,"type":"integer"}},{"description":"Delay between events in milliseconds (default: 1000, max: 10000)","in":"query","name":"delay","schema":{"default":1000,"maximum":10000,"minimum":100,"type":"integer"}},{"description":"Message format","in":"query","name":"format","schema":{"default":"simple","enum":["simple","openai","custom"],"type":"string"}},{"description":"Custom message content (used with format=custom)","in":"query","name":"message","schema":{"type":"string"}},{"description":"SSE event type","in":"query","name":"event_type","schema":{"default":"message","type":"string"}}],"responses":{"200":{"content":{"text/event-stream":{"itemSchema":{"$ref":"#/components/schemas/SseEventItem"}}},"description":"SSE event stream."}},"summary":"Streams server-sent events (configurable count/delay/format).","tags":["Streaming"]}},"/sse/{count}":{"get":{"description":"Same as /sse, with a fixed event count.","operationId":"getSseCount","parameters":[{"description":"Number of events to send (max: 100)","in":"path","name":"count","required":true,"schema":{"maximum":100,"minimum":1,"type":"integer"}},{"description":"Delay between events in milliseconds (default: 1000, max: 10000)","in":"query","name":"delay","schema":{"default":1000,"maximum":10000,"minimum":100,"type":"integer"}},{"description":"Message format","in":"query","name":"format","schema":{"default":"simple","enum":["simple","openai","custom"],"type":"string"}},{"description":"Custom message content (used with format=custom)","in":"query","name":"message","schema":{"type":"string"}},{"description":"SSE event type","in":"query","name":"event_type","schema":{"default":"message","type":"string"}}],"responses":{"200":{"content":{"text/event-stream":{"itemSchema":{"$ref":"#/components/schemas/SseEventItem"}}},"description":"SSE event stream."}},"summary":"Streams server-sent events with a fixed count.","tags":["Streaming"]}},"/sse/{count}/{delay}":{"get":{"description":"Same as /sse, with a fixed count and delay between events.","operationId":"getSseCountDelay","parameters":[{"description":"Number of events to send (max: 100)","in":"path","name":"count","required":true,"schema":{"maximum":100,"minimum":1,"type":"integer"}},{"description":"Delay between events in milliseconds (max: 10000)","in":"path","name":"delay","required":true,"schema":{"maximum":10000,"minimum":100,"type":"integer"}},{"description":"Message format","in":"query","name":"format","schema":{"default":"simple","enum":["simple","openai","custom"],"type":"string"}},{"description":"Custom message content (used with format=custom)","in":"query","name":"message","schema":{"type":"string"}},{"description":"SSE event type","in":"query","name":"event_type","schema":{"default":"message","type":"string"}}],"responses":{"200":{"content":{"text/event-stream":{"itemSchema":{"$ref":"#/components/schemas/SseEventItem"}}},"description":"SSE event stream."}},"summary":"Streams server-sent events with fixed count and delay.","tags":["Streaming"]}},"/status/{codes}":{"delete":{"description":"Returns the given status, or a random one from a comma-separated list; supports ?header= injection, a custom body, and trailing path segments, and weighted random picks via 'code:weight'.","operationId":"deleteStatusCodes","parameters":[{"description":"HTTP status code(s). Multiple codes can be comma-separated (e.g., '200,201,202') for random selection; an optional relative weight per code via 'code:weight' (e.g. '200:3,404:1') biases the random pick.","in":"path","name":"codes","required":true,"schema":{"example":"200","pattern":"^(\\d+(:\\d+(\\.\\d+)?)?)(,\\d+(:\\d+(\\.\\d+)?)?)*$","type":"string"}},{"description":"Custom body content to return in the response (overridden by request body if present)","in":"query","name":"body","schema":{"type":"string"}},{"description":"Response header to inject, formatted 'Name:Value'. Repeatable to add multiple (e.g. ?header=Retry-After:120)","in":"query","name":"header","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}},"text/plain":{"schema":{"type":"string"}}},"description":"Custom body content for the response (takes priority over query parameter)"},"responses":{"100":{"content":{},"description":"Informational responses - empty body."},"200":{"content":{"application/json":{"schema":{"properties":{"body":{"type":"string"},"status":{"type":"integer"}},"type":"object"}},"text/plain":{"schema":{"type":"string"}}},"description":"Success."},"204":{"content":{},"description":"No Content - empty body."},"300":{"content":{"application/json":{"schema":{"properties":{"body":{"type":"string"},"status":{"type":"integer"}},"type":"object"}},"text/plain":{"schema":{"type":"string"}}},"description":"Redirection."},"304":{"content":{},"description":"Not Modified - empty body."},"400":{"content":{"application/json":{"schema":{"properties":{"body":{"type":"string"},"status":{"type":"integer"}},"type":"object"}},"text/plain":{"schema":{"type":"string"}}},"description":"Client Errors."},"500":{"content":{"application/json":{"schema":{"properties":{"body":{"type":"string"},"status":{"type":"integer"}},"type":"object"}},"text/plain":{"schema":{"type":"string"}}},"description":"Server Errors."}},"summary":"Returns the given status code, or a random pick from a list.","tags":["Status codes"]},"get":{"description":"Returns the given status, or a random one from a comma-separated list; supports ?header= injection, a custom body, and trailing path segments, and weighted random picks via 'code:weight'.","operationId":"getStatusCodes","parameters":[{"description":"HTTP status code(s). Multiple codes can be comma-separated (e.g., '200,201,202') for random selection; an optional relative weight per code via 'code:weight' (e.g. '200:3,404:1') biases the random pick.","in":"path","name":"codes","required":true,"schema":{"example":"200","pattern":"^(\\d+(:\\d+(\\.\\d+)?)?)(,\\d+(:\\d+(\\.\\d+)?)?)*$","type":"string"}},{"description":"Custom body content to return in the response","in":"query","name":"body","schema":{"type":"string"}},{"description":"Response header to inject, formatted 'Name:Value'. Repeatable to add multiple (e.g. ?header=Retry-After:120)","in":"query","name":"header","schema":{"type":"string"}}],"responses":{"100":{"content":{},"description":"Informational responses - empty body."},"200":{"content":{"application/json":{"schema":{"example":{"status":200},"properties":{"body":{"description":"Custom body content if provided","type":"string"},"status":{"description":"The HTTP status code","type":"integer"}},"type":"object"}},"text/plain":{"schema":{"description":"Custom body content when Accept header is not application/json","type":"string"}}},"description":"Success."},"204":{"content":{},"description":"No Content - empty body."},"300":{"content":{"application/json":{"schema":{"properties":{"body":{"type":"string"},"status":{"type":"integer"}},"type":"object"}},"text/plain":{"schema":{"type":"string"}}},"description":"Redirection."},"304":{"content":{},"description":"Not Modified - empty body."},"400":{"content":{"application/json":{"schema":{"properties":{"body":{"type":"string"},"status":{"type":"integer"}},"type":"object"}},"text/plain":{"schema":{"type":"string"}}},"description":"Client Errors."},"500":{"content":{"application/json":{"schema":{"properties":{"body":{"type":"string"},"status":{"type":"integer"}},"type":"object"}},"text/plain":{"schema":{"type":"string"}}},"description":"Server Errors."}},"summary":"Returns the given status code, or a random pick from a list.","tags":["Status codes"]},"options":{"description":"Returns 200 with Access-Control-Allow-* headers; ?header= overrides apply. The {codes} path segment is accepted but ignored.","operationId":"optionsStatusCodes","parameters":[{"description":"Ignored by OPTIONS; present to satisfy the path template.","in":"path","name":"codes","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{},"description":"Preflight response with Access-Control-Allow-* headers."}},"summary":"CORS preflight for /status/{codes}.","tags":["Status codes"]},"patch":{"description":"Returns the given status, or a random one from a comma-separated list; supports ?header= injection, a custom body, and trailing path segments, and weighted random picks via 'code:weight'.","operationId":"patchStatusCodes","parameters":[{"description":"HTTP status code(s). Multiple codes can be comma-separated (e.g., '200,201,202') for random selection; an optional relative weight per code via 'code:weight' (e.g. '200:3,404:1') biases the random pick.","in":"path","name":"codes","required":true,"schema":{"example":"200","pattern":"^(\\d+(:\\d+(\\.\\d+)?)?)(,\\d+(:\\d+(\\.\\d+)?)?)*$","type":"string"}},{"description":"Custom body content to return in the response (overridden by request body if present)","in":"query","name":"body","schema":{"type":"string"}},{"description":"Response header to inject, formatted 'Name:Value'. Repeatable to add multiple (e.g. ?header=Retry-After:120)","in":"query","name":"header","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}},"text/plain":{"schema":{"type":"string"}}},"description":"Custom body content for the response (takes priority over query parameter)"},"responses":{"100":{"content":{},"description":"Informational responses - empty body."},"200":{"content":{"application/json":{"schema":{"properties":{"body":{"type":"string"},"status":{"type":"integer"}},"type":"object"}},"text/plain":{"schema":{"type":"string"}}},"description":"Success."},"204":{"content":{},"description":"No Content - empty body."},"300":{"content":{"application/json":{"schema":{"properties":{"body":{"type":"string"},"status":{"type":"integer"}},"type":"object"}},"text/plain":{"schema":{"type":"string"}}},"description":"Redirection."},"304":{"content":{},"description":"Not Modified - empty body."},"400":{"content":{"application/json":{"schema":{"properties":{"body":{"type":"string"},"status":{"type":"integer"}},"type":"object"}},"text/plain":{"schema":{"type":"string"}}},"description":"Client Errors."},"500":{"content":{"application/json":{"schema":{"properties":{"body":{"type":"string"},"status":{"type":"integer"}},"type":"object"}},"text/plain":{"schema":{"type":"string"}}},"description":"Server Errors."}},"summary":"Returns the given status code, or a random pick from a list.","tags":["Status codes"]},"post":{"description":"Returns the given status, or a random one from a comma-separated list; supports ?header= injection, a custom body, and trailing path segments, and weighted random picks via 'code:weight'.","operationId":"postStatusCodes","parameters":[{"description":"HTTP status code(s). Multiple codes can be comma-separated (e.g., '200,201,202') for random selection; an optional relative weight per code via 'code:weight' (e.g. '200:3,404:1') biases the random pick.","in":"path","name":"codes","required":true,"schema":{"example":"200","pattern":"^(\\d+(:\\d+(\\.\\d+)?)?)(,\\d+(:\\d+(\\.\\d+)?)?)*$","type":"string"}},{"description":"Custom body content to return in the response (overridden by request body if present)","in":"query","name":"body","schema":{"type":"string"}},{"description":"Response header to inject, formatted 'Name:Value'. Repeatable to add multiple (e.g. ?header=Retry-After:120)","in":"query","name":"header","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}},"text/plain":{"schema":{"type":"string"}}},"description":"Custom body content for the response (takes priority over query parameter)"},"responses":{"100":{"content":{},"description":"Informational responses - empty body."},"200":{"content":{"application/json":{"schema":{"properties":{"body":{"type":"string"},"status":{"type":"integer"}},"type":"object"}},"text/plain":{"schema":{"type":"string"}}},"description":"Success."},"204":{"content":{},"description":"No Content - empty body."},"300":{"content":{"application/json":{"schema":{"properties":{"body":{"type":"string"},"status":{"type":"integer"}},"type":"object"}},"text/plain":{"schema":{"type":"string"}}},"description":"Redirection."},"304":{"content":{},"description":"Not Modified - empty body."},"400":{"content":{"application/json":{"schema":{"properties":{"body":{"type":"string"},"status":{"type":"integer"}},"type":"object"}},"text/plain":{"schema":{"type":"string"}}},"description":"Client Errors."},"500":{"content":{"application/json":{"schema":{"properties":{"body":{"type":"string"},"status":{"type":"integer"}},"type":"object"}},"text/plain":{"schema":{"type":"string"}}},"description":"Server Errors."}},"summary":"Returns the given status code, or a random pick from a list.","tags":["Status codes"]},"put":{"description":"Returns the given status, or a random one from a comma-separated list; supports ?header= injection, a custom body, and trailing path segments, and weighted random picks via 'code:weight'.","operationId":"putStatusCodes","parameters":[{"description":"HTTP status code(s). Multiple codes can be comma-separated (e.g., '200,201,202') for random selection; an optional relative weight per code via 'code:weight' (e.g. '200:3,404:1') biases the random pick.","in":"path","name":"codes","required":true,"schema":{"example":"200","pattern":"^(\\d+(:\\d+(\\.\\d+)?)?)(,\\d+(:\\d+(\\.\\d+)?)?)*$","type":"string"}},{"description":"Custom body content to return in the response (overridden by request body if present)","in":"query","name":"body","schema":{"type":"string"}},{"description":"Response header to inject, formatted 'Name:Value'. Repeatable to add multiple (e.g. ?header=Retry-After:120)","in":"query","name":"header","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}},"text/plain":{"schema":{"type":"string"}}},"description":"Custom body content for the response (takes priority over query parameter)"},"responses":{"100":{"content":{},"description":"Informational responses - empty body."},"200":{"content":{"application/json":{"schema":{"properties":{"body":{"type":"string"},"status":{"type":"integer"}},"type":"object"}},"text/plain":{"schema":{"type":"string"}}},"description":"Success."},"204":{"content":{},"description":"No Content - empty body."},"300":{"content":{"application/json":{"schema":{"properties":{"body":{"type":"string"},"status":{"type":"integer"}},"type":"object"}},"text/plain":{"schema":{"type":"string"}}},"description":"Redirection."},"304":{"content":{},"description":"Not Modified - empty body."},"400":{"content":{"application/json":{"schema":{"properties":{"body":{"type":"string"},"status":{"type":"integer"}},"type":"object"}},"text/plain":{"schema":{"type":"string"}}},"description":"Client Errors."},"500":{"content":{"application/json":{"schema":{"properties":{"body":{"type":"string"},"status":{"type":"integer"}},"type":"object"}},"text/plain":{"schema":{"type":"string"}}},"description":"Server Errors."}},"summary":"Returns the given status code, or a random pick from a list.","tags":["Status codes"]},"trace":{"description":"TRACE variant: same status selection as GET (TRACE carries no body).","operationId":"traceStatusCodes","parameters":[{"description":"HTTP status code(s). Multiple codes can be comma-separated (e.g., '200,201,202') for random selection; an optional relative weight per code via 'code:weight' (e.g. '200:3,404:1') biases the random pick.","in":"path","name":"codes","required":true,"schema":{"example":"200","pattern":"^(\\d+(:\\d+(\\.\\d+)?)?)(,\\d+(:\\d+(\\.\\d+)?)?)*$","type":"string"}},{"description":"Custom body content to return in the response","in":"query","name":"body","schema":{"type":"string"}},{"description":"Response header to inject, formatted 'Name:Value'. Repeatable to add multiple (e.g. ?header=Retry-After:120)","in":"query","name":"header","schema":{"type":"string"}}],"responses":{"100":{"content":{},"description":"Informational responses - empty body."},"200":{"content":{"application/json":{"schema":{"example":{"status":200},"properties":{"body":{"description":"Custom body content if provided","type":"string"},"status":{"description":"The HTTP status code","type":"integer"}},"type":"object"}},"text/plain":{"schema":{"description":"Custom body content when Accept header is not application/json","type":"string"}}},"description":"Success."},"204":{"content":{},"description":"No Content - empty body."},"300":{"content":{"application/json":{"schema":{"properties":{"body":{"type":"string"},"status":{"type":"integer"}},"type":"object"}},"text/plain":{"schema":{"type":"string"}}},"description":"Redirection."},"304":{"content":{},"description":"Not Modified - empty body."},"400":{"content":{"application/json":{"schema":{"properties":{"body":{"type":"string"},"status":{"type":"integer"}},"type":"object"}},"text/plain":{"schema":{"type":"string"}}},"description":"Client Errors."},"500":{"content":{"application/json":{"schema":{"properties":{"body":{"type":"string"},"status":{"type":"integer"}},"type":"object"}},"text/plain":{"schema":{"type":"string"}}},"description":"Server Errors."}},"summary":"Returns the given status code, or a random pick from a list.","tags":["Status codes"]}},"/stream-bytes/{n}":{"get":{"description":"Streams n random bytes chunk by chunk; same limit behavior as /bytes.","operationId":"getStreamBytesN","parameters":[{"description":"Number of random bytes to stream","in":"path","name":"n","required":true,"schema":{}},{"description":"Optional seed for deterministic random bytes","in":"query","name":"seed","schema":{"format":"int64","type":"integer"}},{"description":"Bytes per chunk (default: 10240)","in":"query","name":"chunk_size","schema":{"type":"integer"}}],"responses":{"200":{"content":{},"description":"n random bytes, streamed in chunks (application/octet-stream)."},"404":{"content":{},"description":"n exceeds the server max-bytes limit (configurable via --max-bytes)."}},"summary":"Streams n random bytes chunk by chunk.","tags":["Dynamic data"]}},"/stream/{n}":{"get":{"description":"Each line is a JSON description of the request (url, args, headers, origin), like /get; n is capped at 100.","operationId":"getStreamN","parameters":[{"description":"Number of JSON lines to stream (max 100)","in":"path","name":"n","required":true,"schema":{}}],"responses":{"200":{"content":{},"description":"Streamed JSON responses."}},"summary":"Streams n JSON lines describing the request.","tags":["Dynamic data"]}},"/tags":{"get":{"description":"Exposes every HTTPCAN_* environment variable as a JSON object (suffix mapped to value). Useful for identifying which instance handled a request behind a load balancer. Additionally, XHTTPCAN_* env vars are injected as response headers on every response.","operationId":"getTags","responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object"}}},"description":"Map of tag name to value."}},"summary":"Returns instance tags derived from HTTPCAN_* environment variables.","tags":["Observability"]}},"/tags/{name}":{"get":{"description":"Returns a single HTTPCAN_* environment variable by name.","operationId":"getTagsName","parameters":[{"description":"Tag name (the HTTPCAN_ prefix is added automatically)","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"text/plain":{"schema":{"type":"string"}}},"description":"The tag value."},"404":{"content":{},"description":"Tag not set."}},"summary":"Returns a single instance tag value by name.","tags":["Observability"]}},"/trace":{"trace":{"description":"TRACE-only: echoes the request like /anything (RFC 9110 §9.8).","operationId":"traceTrace","responses":{"200":{"content":{},"description":"JSON echo of the request."}},"summary":"Echoes the request back to the client.","tags":["HTTP Methods"]}},"/user-agent":{"get":{"description":"Returns the User-Agent header as {\"user-agent\": \"...\"}.","operationId":"getUserAgent","responses":{"200":{"content":{},"description":"The request's User-Agent header."}},"summary":"Returns the request's User-Agent header.","tags":["Request inspection"]}},"/uuid":{"get":{"description":"Returns a fresh UUIDv4 as {\"uuid\": \"...\"}.","operationId":"getUuid","responses":{"200":{"content":{},"description":"A UUIDv4."}},"summary":"Returns a UUIDv4.","tags":["Dynamic data"]}},"/xml":{"get":{"description":"Returns a sample XML document (application/xml).","operationId":"getXml","responses":{"200":{"content":{},"description":"An XML document."}},"summary":"Returns a sample XML document.","tags":["Response formats"]}},"/zstd":{"get":{"description":"Returns a fixed sample JSON document, Zstandard-encoded.","operationId":"getZstd","responses":{"200":{"content":{},"description":"Zstandard-encoded data."}},"summary":"Returns Zstandard-encoded data.","tags":["Response formats"]},"post":{"description":"Compresses the request body with the matching Content-Encoding and returns it.","operationId":"postZstd","requestBody":{"content":{"application/octet-stream":{"schema":{"format":"binary","type":"string"}}}},"responses":{"200":{"content":{},"description":"The request body, Zstandard-encoded."}},"summary":"Echoes the request body, Zstandard-encoded.","tags":["Response formats"]}}},"servers":[{"description":"Demo server","url":"https://httpcan.org"}],"tags":[{"description":"Testing different HTTP verbs.","name":"HTTP Methods"},{"description":"Returns anything that is passed to the request.","name":"Anything"},{"description":"Auth methods.","name":"Auth"},{"description":"Generates responses with a given status code.","name":"Status codes"},{"description":"Inspect the request data.","name":"Request inspection"},{"description":"Inspect the response data, like caching and headers.","name":"Response inspection"},{"description":"Returns responses in different data formats.","name":"Response formats"},{"description":"Generates random and dynamic data.","name":"Dynamic data"},{"description":"Creates, reads, and deletes cookies.","name":"Cookies"},{"description":"Returns different image formats.","name":"Images"},{"description":"Returns different redirect responses.","name":"Redirects"},{"description":"Server-Sent Events and NDJSON streaming endpoints.","name":"Streaming"},{"description":"Mock OpenAI- and Anthropic-compatible LLM APIs.","name":"AI API Mock"},{"description":"Mock OAuth 2.0 authorization server: RFC 6749 four grants with PKCE, RFC 8414 discovery.","name":"OAuth 2.0 Mock"},{"description":"Health checks and instance identification.","name":"Observability"}],"x-original-swagger-version":"2.0"}