{"openapi":"3.1.0","info":{"title":"Mossy API","version":"0.3.0"},"servers":[{"url":"/api/v1"}],"paths":{"/ping":{"get":{"operationId":"ping","summary":"Check API availability","responses":{"200":{"description":"The API is responding.","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"const":"ok"}},"required":["status"]}}}},"500":{"description":"An unexpected error occurred while handling or serializing the response.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"const":"api.internal_server_error"},"message":{"const":"Internal server error"}},"required":["code","message"]}},"required":["error"]}}}}}}},"/date-converter/convert":{"get":{"operationId":"convertDate","summary":"Convert a date","description":"Parse a date or timestamp and return all supported formats in UTC. Explicit input offsets are respected; timezone-less dates are interpreted as UTC. Ambiguous calendar dates require an explicit dateOrder. Unknown query parameters are rejected.","tags":["date-converter"],"parameters":[{"name":"value","in":"query","required":true,"schema":{"type":"string","description":"Date or numeric timestamp to convert. Supports ISO, calendar, RFC, Unix timestamps, and explicit Excel serial dates. Dates without a timezone are interpreted as UTC.","examples":["2026-09-20T12:34:56.789Z","1789907696.789"]},"description":"Date or numeric timestamp to convert. Supports ISO, calendar, RFC, Unix timestamps, and explicit Excel serial dates. Dates without a timezone are interpreted as UTC."},{"name":"dateOrder","in":"query","required":false,"schema":{"enum":["auto","dmy","mdy"],"description":"Calendar date order. Auto rejects ambiguous dates such as 03/04/2026.","default":"auto"},"description":"Calendar date order. Auto rejects ambiguous dates such as 03/04/2026."},{"name":"timestampUnit","in":"query","required":false,"schema":{"enum":["auto","seconds","milliseconds","excel"],"description":"Numeric input unit. Auto treats absolute values below 100000000000 as seconds, otherwise milliseconds. Excel serial dates require excel and use the 1900 date system.","default":"auto"},"description":"Numeric input unit. Auto treats absolute values below 100000000000 as seconds, otherwise milliseconds. Excel serial dates require excel and use the 1900 date system."},{"name":"locale","in":"query","required":false,"schema":{"type":"string","description":"Locale identifier for the human-readable output, e.g. en or fr.","default":"en"},"description":"Locale identifier for the human-readable output, e.g. en or fr."}],"responses":{"200":{"description":"The detected input format and all date formats in UTC.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"detectedFormat":{"enum":["iso","calendar","rfc","unix-seconds","unix-milliseconds","excel"]},"formats":{"type":"object","properties":{"humanReadable":{"type":"string","description":"Formatted date in UTC. Numeric formats are strings."},"zoned":{"type":"string","description":"Formatted date in UTC. Numeric formats are strings."},"iso":{"type":"string","description":"Formatted date in UTC. Numeric formats are strings."},"utc":{"type":"string","description":"Formatted date in UTC. Numeric formats are strings."},"unixSeconds":{"type":"string","description":"Formatted date in UTC. Numeric formats are strings."},"unixMilliseconds":{"type":"string","description":"Formatted date in UTC. Numeric formats are strings."},"excel":{"type":"string","description":"Formatted date in UTC. Numeric formats are strings."},"date":{"type":"string","description":"Formatted date in UTC. Numeric formats are strings."},"time":{"type":"string","description":"Formatted date in UTC. Numeric formats are strings."}},"required":["humanReadable","zoned","iso","utc","unixSeconds","unixMilliseconds","excel","date","time"]}},"required":["detectedFormat","formats"]}},"required":["data"]}}}},"400":{"description":"The request could not be parsed or failed validation.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"const":"api.validation_error"},"message":{"const":"Bad request"},"details":{"type":"array","items":{"type":"object","properties":{"path":{"anyOf":[{"type":"string"},{"type":"null"}]},"message":{"type":"string"}},"required":["path","message"]}}},"required":["code","message","details"]}},"required":["error"]}}}},"422":{"description":"The input is empty, invalid, or ambiguous, or the locale identifier is invalid.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["date-converter.empty-input","date-converter.invalid-date","date-converter.ambiguous-date","date-converter.invalid-options"]},"message":{"type":"string"}},"required":["code","message"]}},"required":["error"]}}}},"500":{"description":"An unexpected error occurred while handling or serializing the response.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"const":"api.internal_server_error"},"message":{"const":"Internal server error"}},"required":["code","message"]}},"required":["error"]}}}}}}},"/random-port-generator/port":{"get":{"operationId":"generateRandomPort","summary":"Generate a random port","description":"Generate a random port from the selected ranges: well-known (0–1023), private (1024–49151), and dynamic (49152–65535). Defaults to private ports. Select at least one range.","tags":["random-port-generator"],"parameters":[{"name":"includeWellKnownPorts","in":"query","required":false,"schema":{"enum":["true","false"],"default":"false"}},{"name":"includePrivatePorts","in":"query","required":false,"schema":{"enum":["true","false"],"default":"true"}},{"name":"includeDynamicPorts","in":"query","required":false,"schema":{"enum":["true","false"],"default":"false"}}],"responses":{"200":{"description":"The generated port.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"port":{"type":"integer","minimum":0,"maximum":65535,"description":"The randomly generated port number."}},"required":["port"]}},"required":["data"]}}}},"400":{"description":"The request could not be parsed or failed validation.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"const":"api.validation_error"},"message":{"const":"Bad request"},"details":{"type":"array","items":{"type":"object","properties":{"path":{"anyOf":[{"type":"string"},{"type":"null"}]},"message":{"type":"string"}},"required":["path","message"]}}},"required":["code","message","details"]}},"required":["error"]}}}},"500":{"description":"An unexpected error occurred while handling or serializing the response.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"const":"api.internal_server_error"},"message":{"const":"Internal server error"}},"required":["code","message"]}},"required":["error"]}}}}}}},"/token-generator/token":{"get":{"operationId":"generateToken","summary":"Generate a random token","description":"Generate a token with a configurable length and character set.","tags":["token-generator"],"parameters":[{"name":"length","in":"query","required":false,"schema":{"type":"string","description":"Token length, parsed as a number. Must be an integer from 1 to 4096.","default":"64"},"description":"Token length, parsed as a number. Must be an integer from 1 to 4096."},{"name":"withUppercase","in":"query","required":false,"schema":{"enum":["true","false"],"default":"true"}},{"name":"withLowercase","in":"query","required":false,"schema":{"enum":["true","false"],"default":"true"}},{"name":"withNumbers","in":"query","required":false,"schema":{"enum":["true","false"],"default":"true"}},{"name":"withSymbols","in":"query","required":false,"schema":{"enum":["true","false"],"default":"false"}}],"responses":{"200":{"description":"The generated token.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"token":{"type":"string","description":"The randomly generated token."}},"required":["token"]}},"required":["data"]}}}},"400":{"description":"The request could not be parsed or failed validation.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"const":"api.validation_error"},"message":{"const":"Bad request"},"details":{"type":"array","items":{"type":"object","properties":{"path":{"anyOf":[{"type":"string"},{"type":"null"}]},"message":{"type":"string"}},"required":["path","message"]}}},"required":["code","message","details"]}},"required":["error"]}}}},"500":{"description":"An unexpected error occurred while handling or serializing the response.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"const":"api.internal_server_error"},"message":{"const":"Internal server error"}},"required":["code","message"]}},"required":["error"]}}}}}}}}}