{"version":2,"endpoints":{"crafted":{"path":"GET / (or any path) with query params","params":{"status":"integer 200-599, default 200","statuscode":"alias of status","code":"alias of status","delay":"milliseconds 0-300000","redirect":"URL; sets Location header","redir":"alias of redirect","html":"string body, Content-Type: text/html","script":"string, wrapped in <script>, Content-Type: text/html","js":"string, Content-Type: application/javascript","text":"string, Content-Type: text/plain","json":"string, Content-Type: application/json","body":"string, fallback body","h[Name]":"header value (qs-nested); repeat for multiples","header[Name]":"alternate header form","headers[Name]":"alternate header form","dryrun":"1/true to return JSON describing the response instead of sending it"},"bodyParamPrecedence":["html","script","js","text","json","body"],"dryrunResponse":{"status":"integer","headers":"object — { Name: value | value[] }","body":"string — what would be sent","contentType":"string — final Content-Type that would be set","delay":"integer — echoed but not applied in dryrun","method":"string — request method"}},"saveShare":{"path":"POST /api/shares","body":{"oneOf":[{"mode":"\"sane\"","state":"EditorState — see endpoints.editorState.schema","name":"string ≤80 chars (optional)"},{"mode":"\"raw\"","state":"RawConfig — see endpoints.raw.config","name":"string ≤80 chars (optional)"}]},"response":{"id":"string","name":"string|null","mode":"\"sane\"|\"raw\"","replayUrl":"/s/:id — saved response replay; raw shares redirect to raw.<domain>","editorUrl":"/e/:id (sane only) — opens the editor pre-filled with the saved state","curlExample":"string — ready-to-paste curl","jsExample":"string — ready-to-paste fetch() snippet"}},"editorState":{"path":"POST /api/shares with mode=\"sane\" uses this shape as `state`","schema":{"type":"object","required":["status","delay","payloadParam","editorLanguage","editorContent","headers"],"properties":{"status":{"type":"integer","minimum":200,"maximum":599},"delay":{"type":"integer","minimum":0,"maximum":300000},"payloadParam":{"enum":["html","script","js","json","text","body"]},"editorLanguage":{"enum":["html","javascript","json","plaintext"]},"editorContent":{"type":"string"},"headers":{"type":"array","items":{"type":"object","required":["id","name","value"],"properties":{"id":{"type":"string","description":"Mandatory React key. Any non-empty string works (e.g. crypto.randomUUID()). Not a server-side identifier."},"name":{"type":"string"},"value":{"type":"string"}}}}}},"example":{"status":200,"delay":0,"payloadParam":"html","editorLanguage":"html","editorContent":"<h1>hi</h1>","headers":[{"id":"h1","name":"X-Demo","value":"true"}]}},"capture":{"create":{"path":"POST /api/captures","body":{"label":"string?"}},"sink":"ANY /c/:id (and subpaths) — body capped at 1MB","stream":"GET /c/:id/stream — text/event-stream; supports Last-Event-ID","list":"GET /api/captures/:id/requests?since=<id>&limit=<n>"},"raw":{"host":"raw.<domain>","usage":"GET https://raw.<domain>/?raw=<id> — TCP+TLS passthrough; bytes are byte-exact and not parsed by the proxy","rateLimit":"soft per-IP, configurable via XSSCOOL_RAW_RATE (default 60/min)","config":{"statusLine":"string, default \"HTTP/1.1 200 OK\"","headers":"array of {name, value}, ordered, non-normalized","crlfStyle":"\"crlf\"|\"lf\"|\"mixed\"|\"none\"","headerBodySeparator":"\"crlfcrlf\"|\"lflf\"|\"crlf\"|\"none\"","contentLengthMode":"\"auto\"|\"omit\"|\"exact\"|\"offset\"","contentLengthValue":"integer (used by exact/offset)","body":"string","bodyEncoding":"\"utf8\"|\"base64\"","chunkDelayMs":"integer 0-60000"}},"config":{"path":"GET /api/config","response":{"domains":"string[] — public hosts the deployment serves"}}},"ttls":{"shares":"never","captures":"7 days","captureRequests":"7 days (deleted with their capture)"}}