{"openapi":"3.0.3","info":{"title":"Web Toolbox","description":"A CORS proxy and web-utilities API. Fetch any URL with permissive CORS headers (bypass 'blocked by CORS policy' errors), extract link preview metadata (Open Graph / Twitter cards), grab favicons, and inspect response headers and redirect chains — all from one endpoint set.","version":"1.0.0"},"components":{"schemas":{}},"paths":{"/health":{"get":{"summary":"Health check","tags":["System"],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"uptimeSeconds":{"type":"number"}}}}}}}}},"/tools/api/ip":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/tools/api/email":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/tools/api/currency":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/tools/api/metadata":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/tools/api/cors":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/tools/api/naics":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/proxy":{"get":{"summary":"Fetch any URL with CORS headers (GET)","tags":["CORS Proxy"],"description":"Server-side GET request to the target `url`. The response body and content-type are passed straight through, with `Access-Control-Allow-Origin: *` added so the result is usable directly from browser JavaScript. Eliminates 'blocked by CORS policy' errors when calling third-party APIs from the frontend.","parameters":[{"schema":{"type":"string"},"example":"https://api.github.com/repos/nodejs/node","in":"query","name":"url","required":true,"description":"The absolute http(s) URL to fetch."}],"responses":{"200":{"description":"Default Response"}}},"post":{"summary":"Proxy any HTTP request (any method, custom headers/body)","tags":["CORS Proxy"],"description":"Forwards a fully-specified request to the target `url` and returns the upstream status, body and content-type with permissive CORS headers. Use this when you need a method other than GET, custom request headers, or a request body.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"Absolute http(s) URL to request."},"method":{"type":"string","enum":["GET","POST","PUT","PATCH","DELETE","HEAD","OPTIONS"],"default":"GET","description":"HTTP method to use."},"headers":{"type":"object","additionalProperties":{"type":"string"},"description":"Request headers to forward to the target."},"body":{"type":"string","description":"Raw request body (for POST/PUT/PATCH)."}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/metadata":{"get":{"summary":"Extract link preview metadata","tags":["Web Tools"],"description":"Returns Open Graph / Twitter card / standard metadata for building link previews.","parameters":[{"schema":{"type":"string"},"example":"https://github.com","in":"query","name":"url","required":true,"description":"Target URL to fetch"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","nullable":true},"title":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"image":{"type":"string","nullable":true},"siteName":{"type":"string","nullable":true},"type":{"type":"string","nullable":true},"author":{"type":"string","nullable":true},"themeColor":{"type":"string","nullable":true},"locale":{"type":"string","nullable":true},"favicon":{"type":"string","nullable":true},"keywords":{"type":"array","items":{"type":"string"}},"requestedUrl":{"type":"string"},"finalUrl":{"type":"string"}},"required":["requestedUrl","finalUrl","keywords"]}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"description":"Bad Request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"413":{"description":"Payload Too Large","content":{"application/json":{"schema":{"description":"Payload Too Large","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"502":{"description":"Bad Gateway","content":{"application/json":{"schema":{"description":"Bad Gateway","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"504":{"description":"Gateway Timeout","content":{"application/json":{"schema":{"description":"Gateway Timeout","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/favicon":{"get":{"summary":"Discover a site's favicons","tags":["Web Tools"],"description":"Finds all link elements that reference icons and returns their URLs.","parameters":[{"schema":{"type":"string"},"example":"https://github.com","in":"query","name":"url","required":true,"description":"Target URL to fetch"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"requestedUrl":{"type":"string"},"finalUrl":{"type":"string"},"best":{"type":"string","nullable":true},"icons":{"type":"array","items":{"type":"object","properties":{"href":{"type":"string"},"rel":{"type":"string"},"type":{"type":"string","nullable":true},"sizes":{"type":"string","nullable":true}},"required":["href","rel"]}}},"required":["requestedUrl","finalUrl","icons"]}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"description":"Bad Request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"413":{"description":"Payload Too Large","content":{"application/json":{"schema":{"description":"Payload Too Large","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"502":{"description":"Bad Gateway","content":{"application/json":{"schema":{"description":"Bad Gateway","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"504":{"description":"Gateway Timeout","content":{"application/json":{"schema":{"description":"Gateway Timeout","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/headers":{"get":{"summary":"Inspect response headers & redirect chain","tags":["Web Tools"],"description":"Returns status, headers, content type, timing and redirect information.","parameters":[{"schema":{"type":"string"},"example":"https://github.com","in":"query","name":"url","required":true,"description":"Target URL to fetch"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"requestedUrl":{"type":"string"},"finalUrl":{"type":"string"},"status":{"type":"number"},"statusText":{"type":"string"},"contentType":{"type":"string","nullable":true},"elapsedMs":{"type":"number"},"redirects":{"type":"array","items":{"type":"string"}},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["requestedUrl","finalUrl","status","statusText","elapsedMs","redirects","headers"]}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"description":"Bad Request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"413":{"description":"Payload Too Large","content":{"application/json":{"schema":{"description":"Payload Too Large","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"502":{"description":"Bad Gateway","content":{"application/json":{"schema":{"description":"Bad Gateway","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"504":{"description":"Gateway Timeout","content":{"application/json":{"schema":{"description":"Gateway Timeout","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/pdf/merge":{"post":{"summary":"Merge multiple PDFs into one","tags":["PDF"],"description":"Accepts an array of PDF inputs (base64 or url) and returns a single merged PDF.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["files"],"properties":{"files":{"type":"array","minItems":2,"items":{"type":"object","properties":{"base64":{"type":"string","description":"Base64-encoded PDF (data URIs ok)"},"url":{"type":"string","description":"Public URL of a PDF (fetched server-side)"}}}}}}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"pdfBase64":{"type":"string"},"pageCount":{"type":"number"}}}}}},"400":{"description":"Bad input","content":{"application/json":{"schema":{"description":"Bad input","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"413":{"description":"Too large","content":{"application/json":{"schema":{"description":"Too large","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"502":{"description":"Upstream fetch failed","content":{"application/json":{"schema":{"description":"Upstream fetch failed","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"504":{"description":"Upstream timed out","content":{"application/json":{"schema":{"description":"Upstream timed out","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/pdf/split":{"post":{"summary":"Split a PDF by page ranges","tags":["PDF"],"description":"Returns one PDF per range (e.g. '1-3,5'), or one PDF per page if ranges is omitted.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["file"],"properties":{"file":{"type":"object","properties":{"base64":{"type":"string","description":"Base64-encoded PDF (data URIs ok)"},"url":{"type":"string","description":"Public URL of a PDF (fetched server-side)"}}},"ranges":{"type":"string","description":"e.g. '1-3,5'. Omit to get one file per page."}}}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"number"},"files":{"type":"array","items":{"type":"object","properties":{"pages":{"type":"string"},"pdfBase64":{"type":"string"}}}}}}}}},"400":{"description":"Bad input","content":{"application/json":{"schema":{"description":"Bad input","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"413":{"description":"Too large","content":{"application/json":{"schema":{"description":"Too large","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"502":{"description":"Upstream fetch failed","content":{"application/json":{"schema":{"description":"Upstream fetch failed","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"504":{"description":"Upstream timed out","content":{"application/json":{"schema":{"description":"Upstream timed out","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/pdf/info":{"post":{"summary":"Inspect a PDF","tags":["PDF"],"description":"Returns page count, byte size, and document metadata.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["file"],"properties":{"file":{"type":"object","properties":{"base64":{"type":"string","description":"Base64-encoded PDF (data URIs ok)"},"url":{"type":"string","description":"Public URL of a PDF (fetched server-side)"}}}}}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"pageCount":{"type":"number"},"sizeBytes":{"type":"number"},"title":{"type":"string","nullable":true},"author":{"type":"string","nullable":true},"subject":{"type":"string","nullable":true},"creator":{"type":"string","nullable":true},"producer":{"type":"string","nullable":true},"keywords":{"type":"string","nullable":true},"creationDate":{"type":"string","nullable":true},"modificationDate":{"type":"string","nullable":true}}}}}},"400":{"description":"Bad input","content":{"application/json":{"schema":{"description":"Bad input","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"413":{"description":"Too large","content":{"application/json":{"schema":{"description":"Too large","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"502":{"description":"Upstream fetch failed","content":{"application/json":{"schema":{"description":"Upstream fetch failed","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"504":{"description":"Upstream timed out","content":{"application/json":{"schema":{"description":"Upstream timed out","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/pdf/watermark":{"post":{"summary":"Add a diagonal text watermark","tags":["PDF"],"description":"Stamps the given text diagonally across every page.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["file","text"],"properties":{"file":{"type":"object","properties":{"base64":{"type":"string","description":"Base64-encoded PDF (data URIs ok)"},"url":{"type":"string","description":"Public URL of a PDF (fetched server-side)"}}},"text":{"type":"string"},"opacity":{"type":"number","default":0.3},"fontSize":{"type":"number","default":48},"color":{"type":"string","description":"#rrggbb","default":"#ff0000"}}}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"pdfBase64":{"type":"string"},"pageCount":{"type":"number"}}}}}},"400":{"description":"Bad input","content":{"application/json":{"schema":{"description":"Bad input","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"413":{"description":"Too large","content":{"application/json":{"schema":{"description":"Too large","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"502":{"description":"Upstream fetch failed","content":{"application/json":{"schema":{"description":"Upstream fetch failed","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"504":{"description":"Upstream timed out","content":{"application/json":{"schema":{"description":"Upstream timed out","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/pdf/rotate":{"post":{"summary":"Rotate pages by a multiple of 90 degrees","tags":["PDF"],"description":"Rotates selected pages (e.g. '1-3,5'), or all pages if 'pages' is omitted.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["file","degrees"],"properties":{"file":{"type":"object","properties":{"base64":{"type":"string","description":"Base64-encoded PDF (data URIs ok)"},"url":{"type":"string","description":"Public URL of a PDF (fetched server-side)"}}},"degrees":{"type":"number","description":"90, 180, or 270"},"pages":{"type":"string","description":"e.g. '1-3,5'; omit for all"}}}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"pdfBase64":{"type":"string"},"pageCount":{"type":"number"}}}}}},"400":{"description":"Bad input","content":{"application/json":{"schema":{"description":"Bad input","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"413":{"description":"Too large","content":{"application/json":{"schema":{"description":"Too large","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"502":{"description":"Upstream fetch failed","content":{"application/json":{"schema":{"description":"Upstream fetch failed","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"504":{"description":"Upstream timed out","content":{"application/json":{"schema":{"description":"Upstream timed out","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/email/validate":{"get":{"summary":"Validate an email address (GET)","tags":["Email"],"description":"Checks syntax, MX/deliverability, disposable & role-account detection, and suggests typo fixes.","parameters":[{"schema":{"type":"string"},"example":"jane.doe@gmail.com","in":"query","name":"email","required":true,"description":"Email address to validate"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string"},"normalized":{"type":"string"},"valid":{"type":"boolean"},"syntaxValid":{"type":"boolean"},"local":{"type":"string","nullable":true},"domain":{"type":"string","nullable":true},"hasMx":{"type":"boolean"},"mxRecords":{"type":"array","items":{"type":"object","properties":{"exchange":{"type":"string"},"priority":{"type":"number"}}}},"isDisposable":{"type":"boolean"},"isRoleAccount":{"type":"boolean"},"didYouMean":{"type":"string","nullable":true},"reason":{"type":"string"}}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}},"post":{"summary":"Validate an email address (POST)","tags":["Email"],"description":"Checks syntax, MX/deliverability, disposable & role-account detection, and suggests typo fixes.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email"],"properties":{"email":{"type":"string"}}}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string"},"normalized":{"type":"string"},"valid":{"type":"boolean"},"syntaxValid":{"type":"boolean"},"local":{"type":"string","nullable":true},"domain":{"type":"string","nullable":true},"hasMx":{"type":"boolean"},"mxRecords":{"type":"array","items":{"type":"object","properties":{"exchange":{"type":"string"},"priority":{"type":"number"}}}},"isDisposable":{"type":"boolean"},"isRoleAccount":{"type":"boolean"},"didYouMean":{"type":"string","nullable":true},"reason":{"type":"string"}}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/email/validate-batch":{"post":{"summary":"Validate up to 100 emails at once","tags":["Email"],"description":"Runs the full validation on each email in the array (max 100).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["emails"],"properties":{"emails":{"type":"array","items":{"type":"string"},"minItems":1,"maxItems":100}}}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"number"},"results":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string"},"normalized":{"type":"string"},"valid":{"type":"boolean"},"syntaxValid":{"type":"boolean"},"local":{"type":"string","nullable":true},"domain":{"type":"string","nullable":true},"hasMx":{"type":"boolean"},"mxRecords":{"type":"array","items":{"type":"object","properties":{"exchange":{"type":"string"},"priority":{"type":"number"}}}},"isDisposable":{"type":"boolean"},"isRoleAccount":{"type":"boolean"},"didYouMean":{"type":"string","nullable":true},"reason":{"type":"string"}}}}}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/ip/lookup":{"get":{"summary":"Geolocate a single IP address","tags":["IP"],"description":"Returns country, city, coordinates, timezone, and accuracy for an IPv4/IPv6 address.","parameters":[{"schema":{"type":"string"},"example":"8.8.8.8","in":"query","name":"ip","required":true,"description":"IPv4 or IPv6 address"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"ip":{"type":"string"},"found":{"type":"boolean"},"country":{"type":"string","nullable":true},"countryName":{"type":"string","nullable":true},"region":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"timezone":{"type":"string","nullable":true},"eu":{"type":"boolean"},"accuracyRadiusKm":{"type":"number","nullable":true},"range":{"type":"array","nullable":true,"items":{"type":"number"}},"error":{"type":"string"}}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/ip/batch":{"post":{"summary":"Geolocate up to 100 IP addresses","tags":["IP"],"description":"Runs the lookup on each IP in the array (max 100).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["ips"],"properties":{"ips":{"type":"array","items":{"type":"string"},"minItems":1,"maxItems":100}}}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"number"},"results":{"type":"array","items":{"type":"object","properties":{"ip":{"type":"string"},"found":{"type":"boolean"},"country":{"type":"string","nullable":true},"countryName":{"type":"string","nullable":true},"region":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"timezone":{"type":"string","nullable":true},"eu":{"type":"boolean"},"accuracyRadiusKm":{"type":"number","nullable":true},"range":{"type":"array","nullable":true,"items":{"type":"number"}},"error":{"type":"string"}}}}}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/ip/distance":{"get":{"summary":"Distance (km) between two IP addresses","tags":["IP"],"description":"Geolocates both IPs and returns the great-circle distance between them.","parameters":[{"schema":{"type":"string"},"example":"8.8.8.8","in":"query","name":"ip1","required":true},{"schema":{"type":"string"},"example":"1.1.1.1","in":"query","name":"ip2","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"ip1":{"type":"string"},"ip2":{"type":"string"},"location1":{"type":"object","properties":{"country":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"latitude":{"type":"number"},"longitude":{"type":"number"}}},"location2":{"type":"object","properties":{"country":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"latitude":{"type":"number"},"longitude":{"type":"number"}}},"distanceKm":{"type":"number"}}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/currency/convert":{"get":{"summary":"Convert an amount between two currencies","tags":["Currency"],"description":"Uses the latest European Central Bank daily reference rates (EUR cross-rates).","parameters":[{"schema":{"type":"string"},"example":"USD","in":"query","name":"from","required":true,"description":"3-letter source currency"},{"schema":{"type":"string"},"example":"EUR","in":"query","name":"to","required":true,"description":"3-letter target currency"},{"schema":{"type":"number","default":1},"in":"query","name":"amount","required":false,"description":"Amount to convert"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"},"amount":{"type":"number"},"rate":{"type":"number"},"result":{"type":"number"},"date":{"type":"string"}}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"503":{"description":"Rates temporarily unavailable","content":{"application/json":{"schema":{"description":"Rates temporarily unavailable","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/currency/rates":{"get":{"summary":"Get all exchange rates for a base currency","tags":["Currency"],"description":"Latest ECB rates, rebased to the requested base currency (default EUR).","parameters":[{"schema":{"type":"string","default":"EUR"},"in":"query","name":"base","required":false,"description":"3-letter base currency"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"base":{"type":"string"},"date":{"type":"string"},"rates":{"type":"object","additionalProperties":{"type":"number"}}}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"503":{"description":"Rates temporarily unavailable","content":{"application/json":{"schema":{"description":"Rates temporarily unavailable","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/currency/list":{"get":{"summary":"List supported currencies","tags":["Currency"],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"date":{"type":"string"},"count":{"type":"number"},"currencies":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"503":{"description":"Rates temporarily unavailable","content":{"application/json":{"schema":{"description":"Rates temporarily unavailable","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/dns/records":{"get":{"summary":"Resolve DNS records for a domain","tags":["DNS"],"description":"Returns DNS records of the requested type for the given domain.","parameters":[{"schema":{"type":"string"},"example":"example.com","in":"query","name":"domain","required":true,"description":"Domain name"},{"schema":{"type":"string","enum":["A","AAAA","MX","TXT","NS","CNAME","SOA"],"default":"A"},"example":"MX","in":"query","name":"type","required":false,"description":"Record type"}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/dns/lookup":{"get":{"summary":"Lookup A and AAAA records","tags":["DNS"],"description":"Resolves both IPv4 and IPv6 addresses for a domain.","parameters":[{"schema":{"type":"string"},"example":"example.com","in":"query","name":"domain","required":true,"description":"Domain name"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"description":"Successful response","type":"object","properties":{"domain":{"type":"string"},"a":{"type":"array","items":{"type":"string"}},"aaaa":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/dns/reverse":{"get":{"summary":"Reverse DNS lookup","tags":["DNS"],"description":"Find hostnames associated with an IP address.","parameters":[{"schema":{"type":"string"},"example":"8.8.8.8","in":"query","name":"ip","required":true,"description":"IP address"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"description":"Successful response","type":"object","properties":{"ip":{"type":"string"},"hostnames":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/crypto/hash":{"get":{"summary":"Compute hash","tags":["Crypto"],"description":"Returns the hash of the provided text.","parameters":[{"schema":{"type":"string","maxLength":100000},"example":"hello","in":"query","name":"text","required":true},{"schema":{"type":"string","enum":["md5","sha1","sha256","sha512"],"default":"sha256"},"example":"sha256","in":"query","name":"algo","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"algo":{"type":"string"},"hash":{"type":"string"},"hex":{"type":"string"},"length":{"type":"integer"}}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/crypto/hmac":{"post":{"summary":"Compute HMAC","tags":["Crypto"],"description":"Returns the HMAC of the provided text and key.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text","key"],"properties":{"text":{"type":"string","maxLength":100000,"example":"hello"},"key":{"type":"string","maxLength":100000,"example":"secret"},"algo":{"type":"string","enum":["md5","sha1","sha256","sha512"],"default":"sha256","example":"sha256"}}}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"algo":{"type":"string"},"hmac":{"type":"string"}}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/crypto/base64/encode":{"get":{"summary":"Base64 encode","tags":["Crypto"],"description":"Encodes text to Base64.","parameters":[{"schema":{"type":"string","maxLength":100000},"example":"hello","in":"query","name":"text","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"type":"string"},"base64":{"type":"string"}}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/crypto/base64/decode":{"get":{"summary":"Base64 decode","tags":["Crypto"],"description":"Decodes Base64 to text.","parameters":[{"schema":{"type":"string","maxLength":100000},"example":"aGVsbG8=","in":"query","name":"data","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"type":"string"},"decoded":{"type":"string"}}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/crypto/uuid":{"get":{"summary":"Generate UUIDs","tags":["Crypto"],"description":"Returns one or more random UUIDs.","parameters":[{"schema":{"type":"integer","default":1,"minimum":1,"maximum":100},"example":3,"in":"query","name":"count","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"},"uuids":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/crypto/password":{"get":{"summary":"Generate password","tags":["Crypto"],"description":"Generates a random password with configurable character sets.","parameters":[{"schema":{"type":"integer","default":16,"minimum":8,"maximum":128},"example":12,"in":"query","name":"length","required":false},{"schema":{"type":"string","default":"true"},"example":"false","in":"query","name":"numbers","required":false},{"schema":{"type":"string","default":"true"},"example":"true","in":"query","name":"symbols","required":false},{"schema":{"type":"string","default":"true"},"example":"true","in":"query","name":"uppercase","required":false},{"schema":{"type":"string","default":"true"},"example":"true","in":"query","name":"lowercase","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"password":{"type":"string"},"length":{"type":"integer"}}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/crypto/jwt/decode":{"post":{"summary":"Decode JWT","tags":["Crypto"],"description":"Decodes a JWT without verifying its signature.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["token"],"properties":{"token":{"type":"string","example":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"}}}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"header":{"type":"object","additionalProperties":true},"payload":{"type":"object","additionalProperties":true},"signature":{"type":"string"},"note":{"type":"string"}}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/qr/generate":{"get":{"summary":"Generate a QR code (PNG, SVG, or data URI)","tags":["QR"],"description":"Encodes text or a URL into a QR code. format=png returns an image/png, format=svg returns image/svg+xml, format=datauri returns JSON with a base64 data URI you can drop into an <img> src.","parameters":[{"schema":{"type":"string"},"example":"https://abundanceapis.com","in":"query","name":"data","required":true,"description":"Text or URL to encode"},{"schema":{"type":"string","enum":["png","svg","datauri"],"default":"png"},"in":"query","name":"format","required":false,"description":"Output format"},{"schema":{"type":"integer","default":256,"minimum":64,"maximum":2000},"in":"query","name":"size","required":false,"description":"Image width in px"},{"schema":{"type":"integer","default":4,"minimum":0,"maximum":20},"in":"query","name":"margin","required":false,"description":"Quiet-zone modules"},{"schema":{"type":"string","enum":["L","M","Q","H"],"default":"M"},"in":"query","name":"ecc","required":false,"description":"Error-correction level"},{"schema":{"type":"string","default":"#000000"},"in":"query","name":"dark","required":false,"description":"Foreground hex color"},{"schema":{"type":"string","default":"#ffffff"},"in":"query","name":"light","required":false,"description":"Background hex color"}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}},"post":{"summary":"Generate a QR code (POST, for long data)","tags":["QR"],"description":"Same as GET /generate but accepts the parameters in a JSON body (useful for long data).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"string","description":"Text or URL to encode","example":"https://abundanceapis.com"},"format":{"type":"string","enum":["png","svg","datauri"],"default":"png","description":"Output format"},"size":{"type":"integer","default":256,"minimum":64,"maximum":2000,"description":"Image width in px"},"margin":{"type":"integer","default":4,"minimum":0,"maximum":20,"description":"Quiet-zone modules"},"ecc":{"type":"string","enum":["L","M","Q","H"],"default":"M","description":"Error-correction level"},"dark":{"type":"string","default":"#000000","description":"Foreground hex color"},"light":{"type":"string","default":"#ffffff","description":"Background hex color"}}}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/phone/validate":{"get":{"summary":"Validate & parse a phone number","tags":["Phone"],"description":"Validates a phone number and returns its country, type (mobile/fixed-line/...), E.164, and national/international formats. Pass an international number (with +), or a national number plus the 2-letter country code.","parameters":[{"schema":{"type":"string"},"example":"+14155552671","in":"query","name":"number","required":true,"description":"Phone number"},{"schema":{"type":"string"},"example":"US","in":"query","name":"country","required":false,"description":"ISO 3166-1 alpha-2 region for national numbers"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"input":{"type":"string"},"valid":{"type":"boolean"},"possible":{"type":"boolean"},"country":{"type":"string","nullable":true},"countryCallingCode":{"type":"string","nullable":true},"nationalNumber":{"type":"string","nullable":true},"e164":{"type":"string","nullable":true},"type":{"type":"string","nullable":true},"formatInternational":{"type":"string","nullable":true},"formatNational":{"type":"string","nullable":true},"reason":{"type":"string"}}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/phone/validate-batch":{"post":{"summary":"Validate up to 100 phone numbers","tags":["Phone"],"description":"Runs full validation on each number in the array (max 100). Optional default country applies to all.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["numbers"],"properties":{"numbers":{"type":"array","items":{"type":"string"},"minItems":1,"maxItems":100},"country":{"type":"string","description":"Default ISO country code for national numbers"}}}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"number"},"results":{"type":"array","items":{"type":"object","properties":{"input":{"type":"string"},"valid":{"type":"boolean"},"possible":{"type":"boolean"},"country":{"type":"string","nullable":true},"countryCallingCode":{"type":"string","nullable":true},"nationalNumber":{"type":"string","nullable":true},"e164":{"type":"string","nullable":true},"type":{"type":"string","nullable":true},"formatInternational":{"type":"string","nullable":true},"formatNational":{"type":"string","nullable":true},"reason":{"type":"string"}}}}}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/image/resize":{"post":{"summary":"Resize an image","tags":["Image"],"description":"Resize an image to width and/or height with a fit mode (cover, contain, fill, inside, outside). Returns the image bytes (default) or JSON with base64.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"Public image URL","example":"https://picsum.photos/800"},"base64":{"type":"string","description":"Base64-encoded image (data URI ok)"},"output":{"type":"string","enum":["binary","base64"],"default":"binary","description":"Return the image bytes or JSON with base64"},"format":{"type":"string","enum":["jpeg","png","webp","avif"],"description":"Output format (default: keep input)"},"quality":{"type":"integer","minimum":1,"maximum":100,"default":80,"description":"Output quality (lossy formats)"},"width":{"type":"integer","minimum":1,"maximum":5000,"example":400},"height":{"type":"integer","minimum":1,"maximum":5000,"example":400},"fit":{"type":"string","enum":["cover","contain","fill","inside","outside"],"default":"cover"}}}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"502":{"description":"Could not load the image","content":{"application/json":{"schema":{"description":"Could not load the image","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/image/convert":{"post":{"summary":"Convert an image to another format","tags":["Image"],"description":"Convert between JPEG, PNG, WebP, and AVIF. Returns the image bytes (default) or JSON with base64.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["format"],"properties":{"url":{"type":"string","description":"Public image URL","example":"https://picsum.photos/800"},"base64":{"type":"string","description":"Base64-encoded image (data URI ok)"},"output":{"type":"string","enum":["binary","base64"],"default":"binary","description":"Return the image bytes or JSON with base64"},"format":{"type":"string","enum":["jpeg","png","webp","avif"],"description":"Output format (default: keep input)"},"quality":{"type":"integer","minimum":1,"maximum":100,"default":80,"description":"Output quality (lossy formats)"}}}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"502":{"description":"Could not load the image","content":{"application/json":{"schema":{"description":"Could not load the image","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/image/compress":{"post":{"summary":"Compress an image","tags":["Image"],"description":"Re-encode an image at a target quality to shrink its size. Defaults to WebP for the best compression; pass format to keep or choose another.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"Public image URL","example":"https://picsum.photos/800"},"base64":{"type":"string","description":"Base64-encoded image (data URI ok)"},"output":{"type":"string","enum":["binary","base64"],"default":"binary","description":"Return the image bytes or JSON with base64"},"format":{"type":"string","enum":["jpeg","png","webp","avif"],"description":"Output format (default: keep input)"},"quality":{"type":"integer","minimum":1,"maximum":100,"default":80,"description":"Output quality (lossy formats)"}}}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"502":{"description":"Could not load the image","content":{"application/json":{"schema":{"description":"Could not load the image","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/image/crop":{"post":{"summary":"Crop a region of an image","tags":["Image"],"description":"Extract a rectangular region (left, top, width, height) from the image.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["left","top","width","height"],"properties":{"url":{"type":"string","description":"Public image URL","example":"https://picsum.photos/800"},"base64":{"type":"string","description":"Base64-encoded image (data URI ok)"},"output":{"type":"string","enum":["binary","base64"],"default":"binary","description":"Return the image bytes or JSON with base64"},"format":{"type":"string","enum":["jpeg","png","webp","avif"],"description":"Output format (default: keep input)"},"quality":{"type":"integer","minimum":1,"maximum":100,"default":80,"description":"Output quality (lossy formats)"},"left":{"type":"integer","minimum":0,"maximum":20000,"example":0},"top":{"type":"integer","minimum":0,"maximum":20000,"example":0},"width":{"type":"integer","minimum":1,"maximum":20000,"example":300},"height":{"type":"integer","minimum":1,"maximum":20000,"example":300}}}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"502":{"description":"Could not load the image","content":{"application/json":{"schema":{"description":"Could not load the image","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/image/info":{"post":{"summary":"Get image metadata","tags":["Image"],"description":"Return format, dimensions, channels, color space, alpha, orientation, and byte size — without re-encoding.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"Public image URL","example":"https://picsum.photos/800"},"base64":{"type":"string","description":"Base64-encoded image (data URI ok)"}}}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"format":{"type":"string","nullable":true},"width":{"type":"integer","nullable":true},"height":{"type":"integer","nullable":true},"channels":{"type":"integer","nullable":true},"space":{"type":"string","nullable":true},"hasAlpha":{"type":"boolean"},"orientation":{"type":"integer","nullable":true},"bytes":{"type":"integer"}}}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"502":{"description":"Could not load the image","content":{"application/json":{"schema":{"description":"Could not load the image","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/color/convert":{"get":{"summary":"Convert a color between formats","tags":["Color"],"description":"Parse a hex, rgb(), hsl(), or CSS named color and return hex, RGB, HSL, HSV, and CMYK.","parameters":[{"schema":{"type":"string"},"example":"#3b82f6","in":"query","name":"color","required":true,"description":"Any CSS color"}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/color/contrast":{"get":{"summary":"WCAG contrast ratio between two colors","tags":["Color"],"description":"Computes the WCAG 2.x contrast ratio and AA/AAA pass-fail for normal and large text.","parameters":[{"schema":{"type":"string"},"example":"#777777","in":"query","name":"foreground","required":true},{"schema":{"type":"string"},"example":"#ffffff","in":"query","name":"background","required":true}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/color/palette":{"get":{"summary":"Generate a color palette","tags":["Color"],"description":"Generate complementary, analogous, triadic, tetradic, or monochromatic palettes from a base color.","parameters":[{"schema":{"type":"string"},"example":"#3b82f6","in":"query","name":"color","required":true},{"schema":{"type":"string","enum":["complementary","analogous","triadic","tetradic","monochromatic"],"default":"complementary"},"in":"query","name":"type","required":false},{"schema":{"type":"integer","minimum":2,"maximum":12,"default":5},"in":"query","name":"count","required":false,"description":"For monochromatic"}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/color/random":{"get":{"summary":"Generate random colors","tags":["Color"],"description":"Return one or more random colors with hex/rgb/hsl.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":50,"default":1},"example":5,"in":"query","name":"count","required":false}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/text/analyze":{"post":{"summary":"Analyze text statistics","tags":["Text"],"description":"Returns various textual metrics.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string","minLength":1,"maxLength":100000,"example":"Sample text"}}}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/text/keywords":{"post":{"summary":"Extract keywords","tags":["Text"],"description":"Returns top n‑gram keywords.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string","minLength":1,"maxLength":100000,"example":"Sample text"},"n":{"type":"integer","minimum":1,"maximum":5,"default":1,"example":2},"limit":{"type":"integer","minimum":1,"maximum":100,"default":20,"example":10},"stopwords":{"type":"boolean","default":true,"example":false}}}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/text/readability":{"post":{"summary":"Readability scores","tags":["Text"],"description":"Returns various readability metrics and interpretation.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string","minLength":1,"maxLength":100000,"example":"Sample text"}}}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/units/convert":{"get":{"summary":"Convert a value between units","tags":["Units"],"description":"Converts a numeric value from one unit to another within the same category.","parameters":[{"schema":{"type":"number"},"example":1,"in":"query","name":"value","required":true},{"schema":{"type":"string"},"example":"m","in":"query","name":"from","required":true},{"schema":{"type":"string"},"example":"km","in":"query","name":"to","required":true},{"schema":{"type":"string"},"example":"length","in":"query","name":"category","required":false}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/units/categories":{"get":{"summary":"List all categories and their units","tags":["Units"],"description":"Returns an array of categories with their available units.","responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/units/units":{"get":{"summary":"List units for a given category","tags":["Units"],"description":"Returns the units belonging to the specified category.","parameters":[{"schema":{"type":"string"},"example":"length","in":"query","name":"category","required":true}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/string/case":{"post":{"summary":"Change case of a string","tags":["String"],"description":"Transforms the input text to the specified case style.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text","type"],"properties":{"text":{"type":"string"},"type":{"type":"string","enum":["upper","lower","title","sentence","camel","pascal","snake","kebab","constant","dot","path"]}}},"example":{"text":"hello world","type":"title"}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/string/slugify":{"post":{"summary":"Generate a URL-friendly slug","tags":["String"],"description":"Creates a slug from the input text with optional separator, case, and length.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string"},"separator":{"type":"string","default":"-"},"lowercase":{"type":"boolean","default":true},"maxLength":{"type":"integer"}}},"example":{"text":"Hello, World!","separator":"-","lowercase":true}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/string/transform":{"post":{"summary":"Apply a transformation operation","tags":["String"],"description":"Performs the specified operation on the input text.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text","op"],"properties":{"text":{"type":"string"},"op":{"type":"string","enum":["reverse","trim","trimStart","trimEnd","collapseWhitespace","repeat","truncate","removeWhitespace","removeAccents"]},"count":{"type":"integer"},"length":{"type":"integer"}}},"example":{"text":"  hello  ","op":"trim"}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/string/escape":{"post":{"summary":"Escape or unescape a string","tags":["String"],"description":"Performs the specified escaping/unescaping operation.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text","mode"],"properties":{"text":{"type":"string"},"mode":{"type":"string","enum":["html","unhtml","url","unurl","base64","unbase64","json"]}}},"example":{"text":"<div>","mode":"html"}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/string/count":{"post":{"summary":"Count characters, words, lines, and bytes","tags":["String"],"description":"Provides statistics about the input text.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string"}}},"example":{"text":"Hello world\nSecond line"}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/datetime/parse":{"get":{"summary":"Parse a date string or epoch","tags":["Date & Time"],"description":"Returns detailed UTC components of the parsed date.","parameters":[{"schema":{"type":"string"},"examples":{"1692106496":{"value":"1692106496"},"2023-08-15T12:34:56Z":{"value":"2023-08-15T12:34:56Z"}},"in":"query","name":"input","required":true}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/datetime/diff":{"get":{"summary":"Difference between two dates","tags":["Date & Time"],"description":"Calculates the difference in the requested unit and a humanized string.","parameters":[{"schema":{"type":"string"},"example":"2023-01-01","in":"query","name":"from","required":true},{"schema":{"type":"string"},"example":"2023-01-10","in":"query","name":"to","required":true},{"schema":{"type":"string","enum":["ms","seconds","minutes","hours","days","weeks"]},"example":"days","in":"query","name":"unit","required":false}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/datetime/add":{"get":{"summary":"Add amount to a date","tags":["Date & Time"],"description":"Adds the specified amount in the given unit to the date.","parameters":[{"schema":{"type":"string"},"example":"2023-01-01","in":"query","name":"date","required":true},{"schema":{"type":"number"},"example":5,"in":"query","name":"amount","required":true},{"schema":{"type":"string","enum":["ms","seconds","minutes","hours","days","weeks","months","years"]},"example":"days","in":"query","name":"unit","required":true}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/datetime/business-days":{"get":{"summary":"Count business days between dates","tags":["Date & Time"],"description":"Counts weekdays (Mon–Fri) inclusive of both endpoints.","parameters":[{"schema":{"type":"string"},"example":"2023-01-01","in":"query","name":"from","required":true},{"schema":{"type":"string"},"example":"2023-01-10","in":"query","name":"to","required":true}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/datetime/age":{"get":{"summary":"Calculate age","tags":["Date & Time"],"description":"Computes age in years, months, days and total days.","parameters":[{"schema":{"type":"string"},"example":"1990-05-20","in":"query","name":"dob","required":true},{"schema":{"type":"string"},"example":"2023-08-15","in":"query","name":"at","required":false}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/geo/plus-code/encode":{"get":{"summary":"Encode Plus Code","tags":["Geo"],"description":"Encode latitude and longitude to a Plus Code.","parameters":[{"schema":{"type":"string"},"example":"37.4220","in":"query","name":"lat","required":true,"description":"Latitude (-90 to 90)"},{"schema":{"type":"string"},"example":"-122.0841","in":"query","name":"lng","required":true,"description":"Longitude (-180 to 180)"},{"schema":{"type":"integer","default":10},"example":10,"in":"query","name":"codeLength","required":false,"description":"Code length (even 2-10, or 11+ for grid refinement)"}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/geo/plus-code/decode":{"get":{"summary":"Decode Plus Code","tags":["Geo"],"description":"Decode a Plus Code to its center and bounds.","parameters":[{"schema":{"type":"string"},"example":"849VCWC8+R9","in":"query","name":"code","required":true,"description":"An Open Location Code (Plus Code)"}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/geo/geohash/encode":{"get":{"summary":"Encode Geohash","tags":["Geo"],"description":"Encode latitude and longitude to a geohash.","parameters":[{"schema":{"type":"string"},"example":"37.4220","in":"query","name":"lat","required":true,"description":"Latitude"},{"schema":{"type":"string"},"example":"-122.0841","in":"query","name":"lng","required":true,"description":"Longitude"},{"schema":{"type":"integer","default":9},"example":9,"in":"query","name":"precision","required":false,"description":"Geohash length (1-12)"}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/geo/geohash/decode":{"get":{"summary":"Decode Geohash","tags":["Geo"],"description":"Decode a geohash to its center and bounds.","parameters":[{"schema":{"type":"string"},"example":"9q9hvu7wbq2","in":"query","name":"geohash","required":true,"description":"A geohash string"}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/geo/geohash/neighbors":{"get":{"summary":"Geohash Neighbors","tags":["Geo"],"description":"Get the eight neighboring geohashes.","parameters":[{"schema":{"type":"string"},"example":"9q9hvu7wbq2","in":"query","name":"geohash","required":true,"description":"A geohash string"}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/geo/maidenhead/encode":{"get":{"summary":"Encode Maidenhead Locator","tags":["Geo"],"description":"Encode latitude and longitude to a Maidenhead locator.","parameters":[{"schema":{"type":"string"},"example":"37.4220","in":"query","name":"lat","required":true,"description":"Latitude"},{"schema":{"type":"string"},"example":"-122.0841","in":"query","name":"lng","required":true,"description":"Longitude"},{"schema":{"type":"integer","default":3},"example":3,"in":"query","name":"precision","required":false,"description":"Locator precision (1-4 pairs)"}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/geo/maidenhead/decode":{"get":{"summary":"Decode Maidenhead Locator","tags":["Geo"],"description":"Decode a Maidenhead locator to its center.","parameters":[{"schema":{"type":"string"},"example":"CM87wm","in":"query","name":"locator","required":true,"description":"A Maidenhead grid locator"}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/geo/distance":{"get":{"summary":"Distance and Bearing","tags":["Geo"],"description":"Calculate distance, bearing, and midpoint between two points.","parameters":[{"schema":{"type":"string"},"example":"40.7128","in":"query","name":"lat1","required":true,"description":"Start latitude"},{"schema":{"type":"string"},"example":"-74.0060","in":"query","name":"lng1","required":true,"description":"Start longitude"},{"schema":{"type":"string"},"example":"34.0522","in":"query","name":"lat2","required":true,"description":"End latitude"},{"schema":{"type":"string"},"example":"-118.2437","in":"query","name":"lng2","required":true,"description":"End longitude"},{"schema":{"type":"string","enum":["km","mi","m","nmi"],"default":"km"},"example":"km","in":"query","name":"unit","required":false}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/geo/destination":{"get":{"summary":"Destination Point","tags":["Geo"],"description":"Calculate destination point given start, distance and bearing.","parameters":[{"schema":{"type":"string"},"example":"0","in":"query","name":"lat","required":true,"description":"Start latitude"},{"schema":{"type":"string"},"example":"0","in":"query","name":"lng","required":true,"description":"Start longitude"},{"schema":{"type":"string"},"example":"111.32","in":"query","name":"distance","required":true,"description":"Distance to travel"},{"schema":{"type":"string"},"example":"0","in":"query","name":"bearing","required":true,"description":"Initial bearing in degrees (0 = north)"},{"schema":{"type":"string","enum":["km","mi","m","nmi"],"default":"km"},"example":"km","in":"query","name":"unit","required":false}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/geo/bbox":{"get":{"summary":"Bounding Box","tags":["Geo"],"description":"Compute bounding box around a point given radius.","parameters":[{"schema":{"type":"string"},"example":"37.4220","in":"query","name":"lat","required":true,"description":"Center latitude"},{"schema":{"type":"string"},"example":"-122.0841","in":"query","name":"lng","required":true,"description":"Center longitude"},{"schema":{"type":"string"},"example":"10","in":"query","name":"radius","required":true,"description":"Radius around the point"},{"schema":{"type":"string","enum":["km","mi","m","nmi"],"default":"km"},"example":"km","in":"query","name":"unit","required":false}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/geo/coordinate":{"get":{"summary":"Coordinate Formats","tags":["Geo"],"description":"Convert decimal degrees to DMS.","parameters":[{"schema":{"type":"string"},"example":"37.4220","in":"query","name":"lat","required":true,"description":"Latitude in decimal degrees"},{"schema":{"type":"string"},"example":"-122.0841","in":"query","name":"lng","required":true,"description":"Longitude in decimal degrees"}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/finance-math/loan":{"get":{"summary":"Loan payment calculation","tags":["Finance"],"description":"Calculate monthly payment, total paid and total interest for a loan.","parameters":[{"schema":{"type":"string"},"in":"query","name":"principal","required":true},{"schema":{"type":"string"},"in":"query","name":"annualRate","required":true},{"schema":{"type":"string"},"in":"query","name":"termMonths","required":true}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/finance-math/amortization":{"get":{"summary":"Amortization schedule","tags":["Finance"],"description":"Provide loan amortization schedule with optional limit.","parameters":[{"schema":{"type":"string"},"in":"query","name":"principal","required":true},{"schema":{"type":"string"},"in":"query","name":"annualRate","required":true},{"schema":{"type":"string"},"in":"query","name":"termMonths","required":true},{"schema":{"type":"string"},"in":"query","name":"limit","required":false}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/finance-math/compound-interest":{"get":{"summary":"Compound interest future value","tags":["Finance"],"description":"Calculate future value with optional monthly contributions.","parameters":[{"schema":{"type":"string"},"in":"query","name":"principal","required":true},{"schema":{"type":"string"},"in":"query","name":"annualRate","required":true},{"schema":{"type":"string"},"in":"query","name":"years","required":true},{"schema":{"type":"string"},"in":"query","name":"compoundsPerYear","required":false},{"schema":{"type":"string"},"in":"query","name":"monthlyContribution","required":false}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/finance-math/roi":{"get":{"summary":"Return on investment","tags":["Finance"],"description":"Calculate ROI, gain and optional annualized ROI.","parameters":[{"schema":{"type":"string"},"in":"query","name":"initialValue","required":true},{"schema":{"type":"string"},"in":"query","name":"finalValue","required":true},{"schema":{"type":"string"},"in":"query","name":"years","required":false}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/finance-math/vat":{"get":{"summary":"VAT calculation","tags":["Finance"],"description":"Add or extract VAT from an amount.","parameters":[{"schema":{"type":"string"},"in":"query","name":"amount","required":true},{"schema":{"type":"string"},"in":"query","name":"rate","required":true},{"schema":{"type":"string","enum":["add","extract"]},"in":"query","name":"mode","required":false}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/finance-math/tip":{"get":{"summary":"Tip calculation","tags":["Finance"],"description":"Calculate tip, total and per person amount.","parameters":[{"schema":{"type":"string"},"in":"query","name":"amount","required":true},{"schema":{"type":"string"},"in":"query","name":"percent","required":true},{"schema":{"type":"string"},"in":"query","name":"split","required":false}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/finance-math/breakeven":{"get":{"summary":"Break-even analysis","tags":["Finance"],"description":"Calculate break-even units and revenue.","parameters":[{"schema":{"type":"string"},"in":"query","name":"fixedCosts","required":true},{"schema":{"type":"string"},"in":"query","name":"pricePerUnit","required":true},{"schema":{"type":"string"},"in":"query","name":"variableCostPerUnit","required":true}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/encrypt/aes/encrypt":{"post":{"summary":"Encrypt with AES-256-GCM","tags":["Encryption"],"description":"Encrypt plaintext using a password-derived or provided key.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["plaintext"],"properties":{"plaintext":{"type":"string"},"password":{"type":"string"},"key":{"type":"string"}},"additionalProperties":false},"example":{"plaintext":"hello","password":"secret"}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/encrypt/aes/decrypt":{"post":{"summary":"Decrypt AES-256-GCM","tags":["Encryption"],"description":"Decrypt ciphertext using password-derived or provided key.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["ciphertext","iv","authTag"],"properties":{"ciphertext":{"type":"string"},"iv":{"type":"string"},"authTag":{"type":"string"},"password":{"type":"string"},"key":{"type":"string"},"salt":{"type":"string"}},"additionalProperties":false},"example":{"ciphertext":"....","iv":"....","authTag":"....","password":"secret","salt":"...."}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/encrypt/key/generate":{"get":{"summary":"Generate random key","tags":["Encryption"],"description":"Generate a random key of specified length and encoding.","parameters":[{"schema":{"type":"integer","minimum":16,"maximum":64,"default":32},"in":"query","name":"bytes","required":false},{"schema":{"type":"string","enum":["hex","base64"],"default":"hex"},"in":"query","name":"encoding","required":false}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/encrypt/rsa/keypair":{"get":{"summary":"Generate RSA keypair","tags":["Encryption"],"description":"Generate RSA public/private key pair.","parameters":[{"schema":{"type":"integer","enum":[2048,3072,4096],"default":2048},"in":"query","name":"modulusLength","required":false}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/encrypt/rsa/encrypt":{"post":{"summary":"RSA encrypt","tags":["Encryption"],"description":"Encrypt plaintext with RSA public key using OAEP SHA-256.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["plaintext","publicKey"],"properties":{"plaintext":{"type":"string"},"publicKey":{"type":"string"}},"additionalProperties":false},"example":{"plaintext":"hello","publicKey":"-----BEGIN PUBLIC KEY-----\n..."}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/encrypt/rsa/decrypt":{"post":{"summary":"RSA decrypt","tags":["Encryption"],"description":"Decrypt RSA ciphertext with private key using OAEP SHA-256.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["ciphertext","privateKey"],"properties":{"ciphertext":{"type":"string"},"privateKey":{"type":"string"}},"additionalProperties":false},"example":{"ciphertext":"....","privateKey":"-----BEGIN PRIVATE KEY-----\n..."}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/encrypt/hash":{"post":{"summary":"Compute hash","tags":["Encryption"],"description":"Compute hash of text with selected algorithm and encoding.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string"},"algorithm":{"type":"string","enum":["sha256","sha512","sha1","md5"],"default":"sha256"},"encoding":{"type":"string","enum":["hex","base64"],"default":"hex"}},"additionalProperties":false},"example":{"text":"hello","algorithm":"sha256","encoding":"hex"}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/anonymize/mask":{"post":{"summary":"Mask a string","tags":["Anonymizer"],"description":"Mask a string according to strategy, with special handling for emails.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["value"],"properties":{"value":{"type":"string"},"strategy":{"type":"string","enum":["partial","full"],"default":"partial"},"keepStart":{"type":"integer","default":1},"keepEnd":{"type":"integer","default":1},"maskChar":{"type":"string","default":"*"}},"additionalProperties":false},"example":{"value":"john.doe@example.com","strategy":"partial"}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/anonymize/hash":{"post":{"summary":"Hash a string","tags":["Anonymizer"],"description":"Compute a SHA-256 or SHA-512 hash, optionally salted.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["value"],"properties":{"value":{"type":"string"},"algorithm":{"type":"string","enum":["sha256","sha512"],"default":"sha256"},"salt":{"type":"string"}},"additionalProperties":false},"example":{"value":"secret","algorithm":"sha256"}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/anonymize/pseudonymize":{"post":{"summary":"Pseudonymize values","tags":["Anonymizer"],"description":"Generate deterministic tokens via HMAC‑SHA256.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["values","secret"],"properties":{"values":{"type":"array","items":{"type":"string"}},"secret":{"type":"string"}},"additionalProperties":false},"example":{"values":["alice","bob"],"secret":"mysecret"}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/anonymize/k-anonymity":{"post":{"summary":"Check k‑anonymity","tags":["Anonymizer"],"description":"Assess whether a dataset satisfies k‑anonymity.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["records","quasiIdentifiers"],"properties":{"records":{"type":"array","items":{"type":"object"}},"quasiIdentifiers":{"type":"array","items":{"type":"string"}},"k":{"type":"integer","default":2}},"additionalProperties":false},"example":{"records":[{"age":30,"zip":"12345"},{"age":30,"zip":"12345"}],"quasiIdentifiers":["age","zip"],"k":2}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/ua/parse":{"get":{"summary":"Parse User-Agent","tags":["User Agent"],"description":"Parse a User-Agent string and return detailed information.","parameters":[{"schema":{"type":"string"},"example":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36","in":"query","name":"ua","required":false,"description":"The User-Agent string to parse. Defaults to the request's own User-Agent header if omitted."}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/ua/parse-batch":{"post":{"summary":"Parse batch of User-Agents","tags":["User Agent"],"description":"Parse up to 100 User-Agent strings in a single request.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["userAgents"],"properties":{"userAgents":{"type":"array","items":{"type":"string"},"maxItems":100}},"additionalProperties":false}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/ua/is-bot":{"get":{"summary":"Detect bot User-Agent","tags":["User Agent"],"description":"Determine whether a User-Agent string belongs to a bot.","parameters":[{"schema":{"type":"string"},"example":"Googlebot/2.1 (+http://www.google.com/bot.html)","in":"query","name":"ua","required":false,"description":"The User-Agent string to test. Defaults to the request's own User-Agent header if omitted."}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/mock/user":{"get":{"summary":"Generate mock users","tags":["Mock Data"],"description":"Returns an array of mock user objects.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":1000},"example":3,"in":"query","name":"count","required":false,"description":"How many records to generate (1-1000)"},{"schema":{"type":"integer"},"example":12345,"in":"query","name":"seed","required":false,"description":"Optional seed for reproducible output"}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/mock/address":{"get":{"summary":"Generate mock addresses","tags":["Mock Data"],"description":"Returns an array of mock address objects.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":1000},"example":3,"in":"query","name":"count","required":false,"description":"How many records to generate (1-1000)"},{"schema":{"type":"integer"},"example":12345,"in":"query","name":"seed","required":false,"description":"Optional seed for reproducible output"}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/mock/company":{"get":{"summary":"Generate mock companies","tags":["Mock Data"],"description":"Returns an array of mock company objects.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":1000},"example":3,"in":"query","name":"count","required":false,"description":"How many records to generate (1-1000)"},{"schema":{"type":"integer"},"example":12345,"in":"query","name":"seed","required":false,"description":"Optional seed for reproducible output"}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/mock/product":{"get":{"summary":"Generate mock products","tags":["Mock Data"],"description":"Returns an array of mock product objects.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":1000},"example":3,"in":"query","name":"count","required":false,"description":"How many records to generate (1-1000)"},{"schema":{"type":"integer"},"example":12345,"in":"query","name":"seed","required":false,"description":"Optional seed for reproducible output"}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/mock/lorem":{"get":{"summary":"Generate lorem text","tags":["Mock Data"],"description":"Returns lorem text of specified type and count.","parameters":[{"schema":{"type":"string","enum":["words","sentences","paragraphs"]},"example":"sentences","in":"query","name":"type","required":false,"description":"Unit of lorem text to generate (default: paragraphs)"},{"schema":{"type":"integer","minimum":1,"maximum":1000},"example":3,"in":"query","name":"count","required":false,"description":"How many units to generate"}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/mock/custom":{"post":{"summary":"Generate custom data","tags":["Mock Data"],"description":"Returns custom generated data based on a schema.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"schema":{"type":"object","additionalProperties":{"type":"string"},"description":"Field name -> generator type (name, firstName, lastName, email, phone, uuid, number, boolean, date, city, country, street, zip, company, jobTitle, word, sentence, paragraph, url, color, price, username, avatar, ip, mac, sku). Unknown types are emitted as literals.","example":{"fullName":"name","email":"email","company":"company"}},"count":{"type":"integer","minimum":1,"maximum":1000,"description":"How many records","example":2},"seed":{"type":"integer","description":"Optional seed for reproducible output","example":12345}},"required":["schema"],"additionalProperties":false}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/sun/times":{"get":{"summary":"Sun times for a location and date","tags":["Sun & Moon"],"description":"Returns sunrise, sunset and related times.","parameters":[{"schema":{"type":"string"},"in":"query","name":"lat","required":true},{"schema":{"type":"string"},"in":"query","name":"lng","required":true},{"schema":{"type":"string"},"in":"query","name":"date","required":false}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/sun/position":{"get":{"summary":"Sun position for a location and date","tags":["Sun & Moon"],"description":"Returns azimuth and altitude of the sun.","parameters":[{"schema":{"type":"string"},"in":"query","name":"lat","required":true},{"schema":{"type":"string"},"in":"query","name":"lng","required":true},{"schema":{"type":"string"},"in":"query","name":"date","required":false}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/sun/moon":{"get":{"summary":"Moon illumination for a date","tags":["Sun & Moon"],"description":"Returns fraction, phase and angle of the moon.","parameters":[{"schema":{"type":"string"},"in":"query","name":"date","required":false}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/sun/moon-times":{"get":{"summary":"Moon rise and set times for a location and date","tags":["Sun & Moon"],"description":"Returns moonrise, moonset and visibility flags.","parameters":[{"schema":{"type":"string"},"in":"query","name":"lat","required":true},{"schema":{"type":"string"},"in":"query","name":"lng","required":true},{"schema":{"type":"string"},"in":"query","name":"date","required":false}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/password-strength/check":{"post":{"summary":"Check password strength","tags":["Password"],"description":"Evaluates password strength using zxcvbn.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["password"],"properties":{"password":{"type":"string","description":"The password to score (max 200 chars). Never logged or stored.","example":"P@ssw0rd123"}}}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/password-strength/pwned":{"post":{"summary":"Check if password has been pwned","tags":["Password"],"description":"Uses HIBP k-anonymity API to check password exposure.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["password"],"properties":{"password":{"type":"string","description":"The password to check against the HIBP breach corpus. Only a 5-char SHA-1 prefix leaves the server (k-anonymity).","example":"password"}}}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/password-strength/generate":{"post":{"summary":"Generate random passwords","tags":["Password"],"description":"Generates one or more random passwords based on criteria.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"length":{"type":"integer","minimum":8,"maximum":128,"default":16},"uppercase":{"type":"boolean","default":true},"lowercase":{"type":"boolean","default":true},"numbers":{"type":"boolean","default":true},"symbols":{"type":"boolean","default":true},"count":{"type":"integer","minimum":1,"maximum":50,"default":1}}}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/password-strength/policy":{"post":{"summary":"Validate password against policy","tags":["Password"],"description":"Checks password against configurable policy rules.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["password"],"properties":{"password":{"type":"string"},"minLength":{"type":"integer","minimum":0,"default":8},"requireUppercase":{"type":"boolean","default":false},"requireLowercase":{"type":"boolean","default":false},"requireNumbers":{"type":"boolean","default":false},"requireSymbols":{"type":"boolean","default":false}}}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/pii/detect":{"post":{"summary":"Detect PII in text","tags":["PII"],"description":"Detects PII entities in the provided text.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string","maxLength":200000},"types":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"example":{"text":"Contact john@example.com","types":["email"]}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/pii/redact":{"post":{"summary":"Redact PII in text","tags":["PII"],"description":"Redacts detected PII according to the selected mode.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string","maxLength":200000},"mode":{"type":"string","enum":["mask","label","remove"]},"maskChar":{"type":"string","minLength":1},"types":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"example":{"text":"SSN: 123-45-6789","mode":"mask","maskChar":"*"}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/pii/analyze":{"post":{"summary":"Analyze PII in text","tags":["PII"],"description":"Provides statistics about PII found in the text.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string","maxLength":200000}},"additionalProperties":false},"example":{"text":"User email john@example.com and SSN 123-45-6789"}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/vision/analyze":{"post":{"summary":"Full image analysis report","tags":["Image Intelligence"],"description":"Decode an image and return a complete technical analysis: dimensions/format, blur/sharpness, brightness, exposure (clipping), saturation, contrast, dominant colors, and an overall quality score. Pure compute, no model.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"Public image URL (fetched via an SSRF-hardened client).","example":"https://picsum.photos/600"},"base64":{"type":"string","description":"Base64-encoded image (data URI prefix allowed)."}}}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/vision/blur":{"post":{"summary":"Detect blur / sharpness","tags":["Image Intelligence"],"description":"Returns the Laplacian variance, a 0–100 sharpness score, and an isBlurry flag. Higher variance = sharper image.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"Public image URL (fetched via an SSRF-hardened client).","example":"https://picsum.photos/600"},"base64":{"type":"string","description":"Base64-encoded image (data URI prefix allowed)."}}}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/vision/exposure":{"post":{"summary":"Exposure, brightness & contrast","tags":["Image Intelligence"],"description":"Returns mean luminance, clipped shadow/highlight percentages, an under/over/balanced label, plus brightness and contrast.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"Public image URL (fetched via an SSRF-hardened client).","example":"https://picsum.photos/600"},"base64":{"type":"string","description":"Base64-encoded image (data URI prefix allowed)."}}}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/vision/saturation":{"post":{"summary":"Saturation analysis","tags":["Image Intelligence"],"description":"Returns mean HSV saturation (0–100) and a label from grayscale to oversaturated.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"Public image URL (fetched via an SSRF-hardened client).","example":"https://picsum.photos/600"},"base64":{"type":"string","description":"Base64-encoded image (data URI prefix allowed)."}}}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/vision/colors":{"post":{"summary":"Dominant colors / palette","tags":["Image Intelligence"],"description":"Returns the top dominant colors (hex + rgb + fraction) via a fast color histogram. Set 'colors' (1–12) for how many.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"Public image URL (fetched via an SSRF-hardened client).","example":"https://picsum.photos/600"},"base64":{"type":"string","description":"Base64-encoded image (data URI prefix allowed)."},"colors":{"type":"integer","minimum":1,"maximum":12,"default":5,"example":5}}}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/vision/quality":{"post":{"summary":"Overall quality score","tags":["Image Intelligence"],"description":"A 0–100 composite quality score from sharpness, exposure, and contrast, with the component sub-scores.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"Public image URL (fetched via an SSRF-hardened client).","example":"https://picsum.photos/600"},"base64":{"type":"string","description":"Base64-encoded image (data URI prefix allowed)."}}}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/vision/moderate":{"post":{"summary":"NSFW / content-moderation scan","tags":["Image Intelligence"],"description":"Classify an image for not-safe-for-work content with an on-device model (the image is never sent to a third party). Returns category tags with scores (Neutral, Drawing, Sexy, Hentai, Porn), a combined nsfwScore, and a safe/nsfw verdict. Set 'threshold' (0–1, default 0.5) for the cutoff. Best-effort signal — not a compliance or CSAM tool.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"Public image URL (fetched via an SSRF-hardened client).","example":"https://picsum.photos/600"},"base64":{"type":"string","description":"Base64-encoded image (data URI prefix allowed)."},"threshold":{"type":"number","minimum":0,"maximum":1,"default":0.5,"example":0.5}}}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/naics/match":{"post":{"summary":"Semantic match: free text → NAICS codes with match ratings","tags":["NAICS"],"description":"Paste a company description, capabilities statement, services list, or website copy and get ranked NAICS codes with a 0–100 match rating, strength band (excellent/strong/moderate/weak), the full sector→industry hierarchy for each hit, the official Census index activity that matched best, and matched index terms for explainability. Hybrid scoring (MiniLM sentence embeddings + IDF keyword overlap) over all 2,125 official 2022 NAICS codes and ~20k Census index activities, typical latency 30–80ms after warmup, and `level` picks the code granularity (6 = national industry, default).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","minLength":3,"maxLength":5000,"example":"We install and repair residential HVAC systems, furnaces, and heat pumps"},"limit":{"type":"integer","minimum":1,"maximum":25,"default":5,"example":5},"level":{"type":"integer","enum":[2,3,4,5,6],"default":6,"example":6}},"required":["text"]}}}},"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"description":"Not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/naics/search":{"get":{"summary":"Keyword search across all NAICS codes and index activities","tags":["NAICS"],"description":"IDF-weighted keyword search over titles, official index activities, and descriptions at every level (sector to national industry). No ML model involved — sub-millisecond. Use it for autocomplete or when you already know roughly the right words.","parameters":[{"schema":{"type":"string","minLength":2,"maxLength":200},"example":"coffee shop","in":"query","name":"q","required":true},{"schema":{"type":"integer","minimum":1,"maximum":50,"default":10},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","enum":[2,3,4,5,6]},"in":"query","name":"level","required":false}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"description":"Not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/naics/code":{"get":{"summary":"Look up one NAICS code: description, hierarchy, children, index activities","tags":["NAICS"],"description":"Full official record for any 2–6 digit 2022 NAICS code — title, complete description, cross-references, parent chain from sector down, direct child codes, and every official Census index activity filed under it.","parameters":[{"schema":{"type":"string","pattern":"^[0-9]{2,6}$"},"example":"238220","in":"query","name":"code","required":true}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"description":"Not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/naics/similar":{"get":{"summary":"Find NAICS codes most similar to a given code","tags":["NAICS"],"description":"Nearest codes at the same level by precomputed sentence embeddings of the official titles+descriptions. Instant (no model call). Useful for broadening classification, finding adjacent industries, or building \"related industries\" features.","parameters":[{"schema":{"type":"string","pattern":"^[0-9]{2,6}$"},"example":"238220","in":"query","name":"code","required":true},{"schema":{"type":"integer","minimum":1,"maximum":25,"default":10},"in":"query","name":"limit","required":false}],"responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"description":"Not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/naics/dataset":{"get":{"summary":"Dataset metadata: NAICS version, source, code counts","tags":["NAICS"],"description":"Metadata about the NAICS dataset, including version, source, total number of codes, counts per level, and total index activities.","responses":{"400":{"description":"Bad request","content":{"application/json":{"schema":{"description":"Bad request","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"description":"Not found","type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}}},"servers":[{"url":"https://abundanceapis.com","description":"Production"}],"tags":[{"name":"CORS Proxy","description":"Fetch any URL with CORS headers."},{"name":"Web Tools","description":"Link metadata, favicons, and header inspection."},{"name":"System","description":"Health and meta endpoints."}]}