{"openapi":"3.1.0","info":{"title":"MarvinMC API","version":"1.0.0","description":"Public utility endpoints. /v1 is canonical; matching unversioned paths use v1 automatically."},"servers":[{"url":"https://marvinmc.dev/v1"}],"paths":{"/health":{"get":{"summary":"Service health","responses":{"200":{"description":"Healthy"}}}},"/ip":{"get":{"summary":"Client IP address","responses":{"200":{"description":"IP response"}}}},"/calculate":{"get":{"summary":"Evaluate a mathematical expression","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Calculation result"},"422":{"description":"Invalid expression"}}}},"/random":{"get":{"summary":"Generate a cryptographically secure random string","parameters":[{"name":"length","in":"query","schema":{"type":"integer","minimum":1,"maximum":256,"default":16}}],"responses":{"200":{"description":"Random value"}}}},"/time":{"get":{"summary":"Convert dates and Unix timestamps","responses":{"200":{"description":"Converted time"}}}},"/convert/xml-to-json":{"post":{"summary":"Convert an XML body to JSON","responses":{"200":{"description":"Converted JSON"},"422":{"description":"Invalid XML"}}}},"/convert/json-to-xml":{"post":{"summary":"Convert a JSON body to XML","responses":{"200":{"description":"Converted XML"},"422":{"description":"Invalid JSON"}}}},"/base64-image":{"post":{"summary":"Validate and decode an image data URI","responses":{"200":{"description":"Sanitized image bytes"},"413":{"description":"Image too large"}}}},"/qr-code":{"get":{"summary":"Generate a PNG or SVG QR code","parameters":[{"name":"content","in":"query","required":true,"description":"UTF-8 text, up to 1024 bytes","schema":{"type":"string","maxLength":1024}},{"name":"format","in":"query","schema":{"type":"string","enum":["png","svg"],"default":"png"}},{"name":"size","in":"query","description":"QR matrix size in pixels; margins are added outside","schema":{"type":"integer","minimum":128,"maximum":2048,"default":512}},{"name":"margin","in":"query","description":"Margin per side in pixels","schema":{"type":"integer","minimum":0,"maximum":128,"default":16}},{"name":"error_correction","in":"query","schema":{"type":"string","enum":["low","medium","quartile","high"],"default":"medium"}},{"name":"foreground","in":"query","schema":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","default":"#101114"}},{"name":"background","in":"query","schema":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","default":"#ffffff"}},{"name":"download","in":"query","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Generated QR code","headers":{"X-QR-Size":{"description":"Final image width and height in pixels","schema":{"type":"integer"}},"X-QR-Content-Bytes":{"description":"Input length in bytes","schema":{"type":"integer"}}},"content":{"image/png":{"schema":{"type":"string","format":"binary"}},"image/svg+xml":{"schema":{"type":"string"}}}},"400":{"description":"Missing content"},"413":{"description":"Content too large"},"422":{"description":"Invalid QR code settings"}}},"post":{"summary":"Generate a QR code from JSON or plain text","parameters":[{"name":"format","in":"query","schema":{"type":"string","enum":["png","svg"],"default":"png"}},{"name":"size","in":"query","description":"QR matrix size in pixels; margins are added outside","schema":{"type":"integer","minimum":128,"maximum":2048,"default":512}},{"name":"margin","in":"query","description":"Margin per side in pixels","schema":{"type":"integer","minimum":0,"maximum":128,"default":16}},{"name":"error_correction","in":"query","schema":{"type":"string","enum":["low","medium","quartile","high"],"default":"medium"}},{"name":"foreground","in":"query","schema":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","default":"#101114"}},{"name":"background","in":"query","schema":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","default":"#ffffff"}},{"name":"download","in":"query","schema":{"type":"boolean","default":false}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["content"],"properties":{"content":{"type":"string","maxLength":1024},"format":{"type":"string","enum":["png","svg"]},"size":{"type":"integer","minimum":128,"maximum":2048},"margin":{"type":"integer","minimum":0,"maximum":128},"error_correction":{"type":"string","enum":["low","medium","quartile","high"]},"foreground":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"background":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"download":{"type":"boolean"}}}},"text/plain":{"schema":{"type":"string","maxLength":1024}}}},"responses":{"200":{"description":"Generated QR code","headers":{"X-QR-Size":{"description":"Final image width and height in pixels","schema":{"type":"integer"}},"X-QR-Content-Bytes":{"description":"Input length in bytes","schema":{"type":"integer"}}},"content":{"image/png":{"schema":{"type":"string","format":"binary"}},"image/svg+xml":{"schema":{"type":"string"}}}},"400":{"description":"Missing content"},"413":{"description":"Content too large"},"422":{"description":"Invalid QR code settings"}}}},"/minecraft":{"get":{"summary":"Query a public Java Minecraft server","parameters":[{"name":"server","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Server status"},"502":{"description":"Server unavailable"}}}},"/whois":{"get":{"summary":"Read local GeoIP information","parameters":[{"name":"ip","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"GeoIP information"},"404":{"description":"No local record"}}}},"/captcha":{"get":{"summary":"Create a CAPTCHA","responses":{"200":{"description":"CAPTCHA metadata"}}}},"/captcha/verify":{"post":{"summary":"Verify a CAPTCHA once","responses":{"200":{"description":"CAPTCHA solved"},"403":{"description":"Wrong or reused code"}}}},"/pdf":{"post":{"summary":"Create a PDF from sanitized HTML","responses":{"201":{"description":"PDF created"},"413":{"description":"HTML too large"}}}},"/marvinlobby":{"post":{"summary":"MarvinLobby persistent data API","responses":{"200":{"description":"Action result"}}}}},"components":{"schemas":{"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string"}}}}}}}}