{"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"},"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"}},"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 simple, high‑performance HTTP request & response service built with Rust and Actix Web. Fully compatible with [httpbin.org](https://httpbin.org), with modern streaming and AI‑friendly enhancements. <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>HTTPBin compatible</b>: Use as a drop‑in replacement for testing/migration</li> <li><b>Modern streaming</b>: Native SSE and NDJSON, AI‑compatible formats (OpenAI/Ollama)</li> <li><b>Tiny Docker image</b>: <10MB, fast to pull and start</li> <li><b>Minimal memory footprint</b>: Efficient async Rust I/O</li> <li><b>High throughput</b>: Actix Web + Tokio</li> </ul>","title":"httpcan.org","version":"0.5.1"},"openapi":"3.0.1","paths":{"/absolute-redirect/{n}":{"get":{"parameters":[{"in":"path","name":"n","required":true,"schema":{}}],"responses":{"302":{"content":{},"description":"A redirection."}},"summary":"Absolutely 302 Redirects n times.","tags":["Redirects"]}},"/anything":{"delete":{"responses":{"200":{"content":{},"description":"Anything passed in request"}},"summary":"Returns anything passed in request data.","tags":["Anything"]},"get":{"responses":{"200":{"content":{},"description":"Anything passed in request"}},"summary":"Returns anything passed in request data.","tags":["Anything"]},"patch":{"responses":{"200":{"content":{},"description":"Anything passed in request"}},"summary":"Returns anything passed in request data.","tags":["Anything"]},"post":{"responses":{"200":{"content":{},"description":"Anything passed in request"}},"summary":"Returns anything passed in request data.","tags":["Anything"]},"put":{"responses":{"200":{"content":{},"description":"Anything passed in request"}},"summary":"Returns anything passed in request data.","tags":["Anything"]}},"/anything/{anything}":{"delete":{"responses":{"200":{"content":{},"description":"Anything passed in request"}},"summary":"Returns anything passed in request data.","tags":["Anything"]},"get":{"responses":{"200":{"content":{},"description":"Anything passed in request"}},"summary":"Returns anything passed in request data.","tags":["Anything"]},"patch":{"responses":{"200":{"content":{},"description":"Anything passed in request"}},"summary":"Returns anything passed in request data.","tags":["Anything"]},"post":{"responses":{"200":{"content":{},"description":"Anything passed in request"}},"summary":"Returns anything passed in request data.","tags":["Anything"]},"put":{"responses":{"200":{"content":{},"description":"Anything passed in request"}},"summary":"Returns anything passed in request data.","tags":["Anything"]}},"/base64/{value}":{"get":{"parameters":[{"in":"path","name":"value","required":true,"schema":{"default":"SFRUUEJJTiBpcyBhd2Vzb21l","type":"string"}}],"responses":{"200":{"content":{},"description":"Decoded base64 content."}},"summary":"Decodes base64url-encoded string.","tags":["Dynamic data"]}},"/basic-auth/{user}":{"get":{"parameters":[{"in":"path","name":"user","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{},"description":"Sucessful authentication."},"401":{"content":{},"description":"Unsuccessful authentication."}},"security":[{"basicAuth":[]}],"summary":"Prompts the user for authorization using HTTP Basic Auth with username only (empty password).","tags":["Auth"]}},"/basic-auth/{user}/{passwd}":{"get":{"parameters":[{"in":"path","name":"user","required":true,"schema":{"type":"string"}},{"in":"path","name":"passwd","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{},"description":"Sucessful authentication."},"401":{"content":{},"description":"Unsuccessful authentication."}},"security":[{"basicAuth":[]}],"summary":"Prompts the user for authorization using HTTP Basic Auth.","tags":["Auth"]}},"/bearer":{"get":{"responses":{"200":{"content":{},"description":"Sucessful authentication."},"401":{"content":{},"description":"Unsuccessful authentication."}},"security":[{"bearerAuth":[]}],"summary":"Prompts the user for authorization using bearer authentication.","tags":["Auth"]}},"/brotli":{"get":{"responses":{"200":{"content":{},"description":"Brotli-encoded data."}},"summary":"Returns Brotli-encoded data.","tags":["Response formats"]}},"/bytes/{n}":{"get":{"parameters":[{"in":"path","name":"n","required":true,"schema":{}}],"responses":{"200":{"content":{},"description":"Bytes."}},"summary":"Returns n random bytes generated with given seed","tags":["Dynamic data"]}},"/cache":{"get":{"parameters":[{"in":"header","name":"If-Modified-Since","schema":{}},{"in":"header","name":"If-None-Match","schema":{}}],"responses":{"200":{"content":{},"description":"Cached response"},"304":{"content":{},"description":"Modified"}},"summary":"Returns a 304 if an If-Modified-Since header or If-None-Match is present. Returns the same as a GET otherwise.","tags":["Response inspection"]}},"/cache/{value}":{"get":{"parameters":[{"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":{"responses":{"200":{"content":{},"description":"Set cookies."}},"summary":"Returns cookie data.","tags":["Cookies"]}},"/cookies/delete":{"get":{"parameters":[{"allowEmptyValue":true,"in":"query","name":"freeform","schema":{}}],"responses":{"200":{"content":{},"description":"Redirect to cookie list"}},"summary":"Deletes cookie(s) as provided by the query string and redirects to cookie list.","tags":["Cookies"]}},"/cookies/set":{"get":{"parameters":[{"allowEmptyValue":true,"in":"query","name":"freeform","schema":{}}],"responses":{"200":{"content":{},"description":"Redirect to cookie list"}},"summary":"Sets cookie(s) as provided by the query string and redirects to cookie list.","tags":["Cookies"]}},"/cookies/set/{name}/{value}":{"get":{"parameters":[{"in":"path","name":"name","required":true,"schema":{"type":"string"}},{"in":"path","name":"value","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{},"description":"Set cookies and redirects to cookie list."}},"summary":"Sets a cookie and redirects to cookie list.","tags":["Cookies"]}},"/deflate":{"get":{"responses":{"200":{"content":{},"description":"Defalte-encoded data."}},"summary":"Returns Deflate-encoded data.","tags":["Response formats"]}},"/delay/{delay}":{"delete":{"parameters":[{"in":"path","name":"delay","required":true,"schema":{}}],"responses":{"200":{"content":{},"description":"A delayed response."}},"summary":"Returns a delayed response (max of 10 seconds).","tags":["Dynamic data"]},"get":{"parameters":[{"in":"path","name":"delay","required":true,"schema":{}}],"responses":{"200":{"content":{},"description":"A delayed response."}},"summary":"Returns a delayed response (max of 10 seconds).","tags":["Dynamic data"]},"patch":{"parameters":[{"in":"path","name":"delay","required":true,"schema":{}}],"responses":{"200":{"content":{},"description":"A delayed response."}},"summary":"Returns a delayed response (max of 10 seconds).","tags":["Dynamic data"]},"post":{"parameters":[{"in":"path","name":"delay","required":true,"schema":{}}],"responses":{"200":{"content":{},"description":"A delayed response."}},"summary":"Returns a delayed response (max of 10 seconds).","tags":["Dynamic data"]},"put":{"parameters":[{"in":"path","name":"delay","required":true,"schema":{}}],"responses":{"200":{"content":{},"description":"A delayed response."}},"summary":"Returns a delayed response (max of 10 seconds).","tags":["Dynamic data"]}},"/delete":{"delete":{"responses":{"200":{"content":{},"description":"The request's DELETE parameters."}},"summary":"The request's DELETE parameters.","tags":["HTTP Methods"]}},"/deny":{"get":{"responses":{"200":{"content":{},"description":"Denied message"}},"summary":"Returns page denied by robots.txt rules.","tags":["Response formats"]}},"/digest-auth/{qop}/{user}/{passwd}":{"get":{"parameters":[{"description":"auth or auth-int","in":"path","name":"qop","required":true,"schema":{"type":"string"}},{"in":"path","name":"user","required":true,"schema":{"type":"string"}},{"in":"path","name":"passwd","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{},"description":"Sucessful authentication."},"401":{"content":{},"description":"Unsuccessful authentication."}},"security":[{"digestAuth":[]}],"summary":"Prompts the user for authorization using Digest Auth.","tags":["Auth"]}},"/digest-auth/{qop}/{user}/{passwd}/{algorithm}":{"get":{"parameters":[{"description":"auth or auth-int","in":"path","name":"qop","required":true,"schema":{"type":"string"}},{"in":"path","name":"user","required":true,"schema":{"type":"string"}},{"in":"path","name":"passwd","required":true,"schema":{"type":"string"}},{"description":"MD5, SHA-256, SHA-512","in":"path","name":"algorithm","required":true,"schema":{"default":"MD5","type":"string"}}],"responses":{"200":{"content":{},"description":"Sucessful authentication."},"401":{"content":{},"description":"Unsuccessful authentication."}},"security":[{"digestAuth":[]}],"summary":"Prompts the user for authorization using Digest Auth + Algorithm.","tags":["Auth"]}},"/digest-auth/{qop}/{user}/{passwd}/{algorithm}/{stale_after}":{"get":{"description":"allow settings the stale_after argument.\n","parameters":[{"description":"auth or auth-int","in":"path","name":"qop","required":true,"schema":{"type":"string"}},{"in":"path","name":"user","required":true,"schema":{"type":"string"}},{"in":"path","name":"passwd","required":true,"schema":{"type":"string"}},{"description":"MD5, SHA-256, SHA-512","in":"path","name":"algorithm","required":true,"schema":{"default":"MD5","type":"string"}},{"in":"path","name":"stale_after","required":true,"schema":{"default":"never","type":"string"}}],"responses":{"200":{"content":{},"description":"Sucessful authentication."},"401":{"content":{},"description":"Unsuccessful authentication."}},"security":[{"digestAuth":[]}],"summary":"Prompts the user for authorization using Digest Auth + Algorithm.","tags":["Auth"]}},"/drip":{"get":{"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"}}],"responses":{"200":{"content":{},"description":"A dripped response."}},"summary":"Drips data over a duration after an optional initial delay.","tags":["Dynamic data"]}},"/echo":{"delete":{"description":"Echoes the request body exactly as received and mirrors request headers in the response. Content-Type and custom headers are preserved.","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.","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 echo).","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.","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.","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.","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"]}},"/encoding/utf8":{"get":{"responses":{"200":{"content":{},"description":"Encoded UTF-8 content."}},"summary":"Returns a UTF-8 encoded body.","tags":["Response formats"]}},"/etag/{etag}":{"get":{"parameters":[{"in":"header","name":"If-None-Match","schema":{}},{"in":"header","name":"If-Match","schema":{}}],"responses":{"200":{"content":{},"description":"Normal response"},"412":{"content":{},"description":"match"}},"summary":"Assumes the resource has the given etag and responds to If-None-Match and If-Match headers appropriately.","tags":["Response inspection"]}},"/get":{"get":{"responses":{"200":{"content":{},"description":"The request's query parameters."}},"summary":"The request's query parameters.","tags":["HTTP Methods"]}},"/gzip":{"get":{"responses":{"200":{"content":{},"description":"GZip-encoded data."}},"summary":"Returns GZip-encoded data.","tags":["Response formats"]}},"/headers":{"get":{"responses":{"200":{"content":{},"description":"The request's headers."}},"summary":"Return the incoming request's HTTP headers.","tags":["Request inspection"]}},"/hidden-basic-auth/{user}":{"get":{"parameters":[{"in":"path","name":"user","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{},"description":"Sucessful authentication."},"404":{"content":{},"description":"Unsuccessful authentication."}},"security":[{"basicAuth":[]}],"summary":"Prompts the user for authorization using HTTP Basic Auth with username only (empty password). Returns 404 on failure.","tags":["Auth"]}},"/hidden-basic-auth/{user}/{passwd}":{"get":{"parameters":[{"in":"path","name":"user","required":true,"schema":{"type":"string"}},{"in":"path","name":"passwd","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{},"description":"Sucessful authentication."},"404":{"content":{},"description":"Unsuccessful authentication."}},"security":[{"basicAuth":[]}],"summary":"Prompts the user for authorization using HTTP Basic Auth.","tags":["Auth"]}},"/html":{"get":{"responses":{"200":{"content":{},"description":"An HTML page."}},"summary":"Returns a simple 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.","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 colored image in various formats (png, jpeg, webp, svg). Respects Accept header for format preference.","tags":["Images"]}},"/image/jpeg":{"get":{"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":{"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":{"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":{"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":{"responses":{"200":{"content":{},"description":"The Requester's IP Address."}},"summary":"Returns the requester's IP Address.","tags":["Request inspection"]}},"/json":{"get":{"responses":{"200":{"content":{},"description":"An JSON document."}},"summary":"Returns a simple JSON document.","tags":["Response formats"]}},"/jwt-bearer":{"get":{"description":"This endpoint validates JWT Bearer tokens, checks expiration claims, and returns comprehensive token analysis including header, payload, claims, and validation status. Useful for testing JWT authentication implementations.","examples":{"Expired Token":{"description":"Request with an expired JWT token","summary":"Example with expired JWT token","value":{"headers":{"Authorization":"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":{"headers":{"Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"}}}},"parameters":[],"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 JWT Bearer tokens and returns detailed token information.","tags":["Auth"]}},"/links/{n}/{offset}":{"get":{"parameters":[{"in":"path","name":"n","required":true,"schema":{}},{"in":"path","name":"offset","required":true,"schema":{}}],"responses":{"200":{"content":{},"description":"HTML links."}},"summary":"Generate a page containing n links to other pages which do the same.","tags":["Dynamic data"]}},"/ndjson":{"get":{"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":{}},"description":"NDJSON stream"}},"summary":"NDJSON streaming endpoint with configurable parameters.","tags":["Streaming"]}},"/ndjson/{count}":{"get":{"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":{}},"description":"NDJSON stream"}},"summary":"NDJSON streaming with specified event count.","tags":["Streaming"]}},"/ndjson/{count}/{delay}":{"get":{"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":{}},"description":"NDJSON stream"}},"summary":"NDJSON streaming with specified event count and delay.","tags":["Streaming"]}},"/patch":{"patch":{"responses":{"200":{"content":{},"description":"The request's PATCH parameters."}},"summary":"The request's PATCH parameters.","tags":["HTTP Methods"]}},"/post":{"post":{"description":"Supports multipart/form-data file uploads. Multiple files with the same parameter name are returned as an array.","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":"The request's POST parameters and uploaded files.","tags":["HTTP Methods"]}},"/put":{"put":{"responses":{"200":{"content":{},"description":"The request's PUT parameters."}},"summary":"The request's PUT parameters.","tags":["HTTP Methods"]}},"/range/{numbytes}":{"get":{"parameters":[{"in":"path","name":"numbytes","required":true,"schema":{}}],"responses":{"200":{"content":{},"description":"Bytes."}},"summary":"Streams n random bytes generated with given seed, at given chunk size per packet.","tags":["Dynamic data"]}},"/redirect-to":{"delete":{"responses":{"302":{"content":{},"description":"A redirection."}},"summary":"302/3XX Redirects to the given URL.","tags":["Redirects"]},"get":{"parameters":[{"in":"query","name":"url","required":true,"schema":{"type":"string"}},{"in":"query","name":"status_code","schema":{}}],"responses":{"302":{"content":{},"description":"A redirection."}},"summary":"302/3XX Redirects to the given URL.","tags":["Redirects"]},"patch":{"responses":{"302":{"content":{},"description":"A redirection."}},"summary":"302/3XX Redirects to the given URL.","tags":["Redirects"]},"post":{"requestBody":{"content":{"multipart/form-data":{"schema":{"properties":{"status_code":{},"url":{"type":"string"}},"required":["url"],"type":"object"}}},"required":true},"responses":{"302":{"content":{},"description":"A redirection."}},"summary":"302/3XX Redirects to the given URL.","tags":["Redirects"]},"put":{"requestBody":{"content":{"multipart/form-data":{"schema":{"properties":{"status_code":{},"url":{"type":"string"}},"required":["url"],"type":"object"}}},"required":true},"responses":{"302":{"content":{},"description":"A redirection."}},"summary":"302/3XX Redirects to the given URL.","tags":["Redirects"]}},"/redirect/{n}":{"get":{"parameters":[{"in":"path","name":"n","required":true,"schema":{}}],"responses":{"302":{"content":{},"description":"A redirection."}},"summary":"302 Redirects n times.","tags":["Redirects"]}},"/relative-redirect/{n}":{"get":{"parameters":[{"in":"path","name":"n","required":true,"schema":{}}],"responses":{"302":{"content":{},"description":"A redirection."}},"summary":"Relatively 302 Redirects n times.","tags":["Redirects"]}},"/response-headers":{"get":{"parameters":[{"allowEmptyValue":true,"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":{"parameters":[{"allowEmptyValue":true,"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"]}},"/robots.txt":{"get":{"responses":{"200":{"content":{},"description":"Robots file"}},"summary":"Returns some robots.txt rules.","tags":["Response formats"]}},"/sse":{"get":{"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":{}},"description":"Server-sent events stream"}},"summary":"Server-Sent Events endpoint with configurable event count, delay, and format.","tags":["Streaming"]}},"/sse/{count}":{"get":{"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":{}},"description":"Server-sent events stream"}},"summary":"Server-Sent Events with specified event count.","tags":["Streaming"]}},"/sse/{count}/{delay}":{"get":{"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":{}},"description":"Server-sent events stream"}},"summary":"Server-Sent Events with specified event count and delay.","tags":["Streaming"]}},"/status/{codes}":{"delete":{"parameters":[{"description":"HTTP status code(s). Multiple codes can be comma-separated (e.g., '200,201,202') for random selection.","in":"path","name":"codes","required":true,"schema":{"example":"200","pattern":"^[0-9]+(,[0-9]+)*$","type":"string"}},{"description":"Custom body content to return in the response (overridden by request body if present)","in":"query","name":"body","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":"Return specified status code or random status code if multiple are given. Supports custom response body via query parameter or request body.","tags":["Status codes"]},"get":{"parameters":[{"description":"HTTP status code(s). Multiple codes can be comma-separated (e.g., '200,201,202') for random selection.","in":"path","name":"codes","required":true,"schema":{"example":"200","pattern":"^[0-9]+(,[0-9]+)*$","type":"string"}},{"description":"Custom body content to return in the response","in":"query","name":"body","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":"Return specified status code or random status code if multiple are given. Supports custom response body via query parameter.","tags":["Status codes"]},"patch":{"parameters":[{"description":"HTTP status code(s). Multiple codes can be comma-separated (e.g., '200,201,202') for random selection.","in":"path","name":"codes","required":true,"schema":{"example":"200","pattern":"^[0-9]+(,[0-9]+)*$","type":"string"}},{"description":"Custom body content to return in the response (overridden by request body if present)","in":"query","name":"body","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":"Return specified status code or random status code if multiple are given. Supports custom response body via query parameter or request body.","tags":["Status codes"]},"post":{"parameters":[{"description":"HTTP status code(s). Multiple codes can be comma-separated (e.g., '200,201,202') for random selection.","in":"path","name":"codes","required":true,"schema":{"example":"200","pattern":"^[0-9]+(,[0-9]+)*$","type":"string"}},{"description":"Custom body content to return in the response (overridden by request body if present)","in":"query","name":"body","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":"Return specified status code or random status code if multiple are given. Supports custom response body via query parameter or request body.","tags":["Status codes"]},"put":{"parameters":[{"description":"HTTP status code(s). Multiple codes can be comma-separated (e.g., '200,201,202') for random selection.","in":"path","name":"codes","required":true,"schema":{"example":"200","pattern":"^[0-9]+(,[0-9]+)*$","type":"string"}},{"description":"Custom body content to return in the response (overridden by request body if present)","in":"query","name":"body","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":"Return specified status code or random status code if multiple are given. Supports custom response body via query parameter or request body.","tags":["Status codes"]}},"/stream-bytes/{n}":{"get":{"parameters":[{"in":"path","name":"n","required":true,"schema":{}}],"responses":{"200":{"content":{},"description":"Bytes."}},"summary":"Streams n random bytes generated with given seed, at given chunk size per packet.","tags":["Dynamic data"]}},"/stream/{n}":{"get":{"parameters":[{"in":"path","name":"n","required":true,"schema":{}}],"responses":{"200":{"content":{},"description":"Streamed JSON responses."}},"summary":"Stream n JSON responses","tags":["Dynamic data"]}},"/user-agent":{"get":{"responses":{"200":{"content":{},"description":"The request's User-Agent header."}},"summary":"Return the incoming requests's User-Agent header.","tags":["Request inspection"]}},"/uuid":{"get":{"responses":{"200":{"content":{},"description":"A UUID4."}},"summary":"Return a UUID4.","tags":["Dynamic data"]}},"/xml":{"get":{"responses":{"200":{"content":{},"description":"An XML document."}},"summary":"Returns a simple XML document.","tags":["Response formats"]}}},"servers":[{"description":"Demo server","url":"https://httpcan.org"}],"tags":[{"description":"Testing different HTTP verbs","name":"HTTP Methods"},{"description":"Auth methods","name":"Auth"},{"description":"Generates responses with 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":"Returns anything that is passed to request","name":"Anything"},{"description":"Server-Sent Events and NDJSON streaming endpoints","name":"Streaming"}],"x-original-swagger-version":"2.0"}