{"openapi":"3.0.3","info":{"title":"URL Shortener API","version":"2.0.0","description":"Shorten URLs, expand short codes, get click statistics, and generate QR codes. KV-backed, no third-party auth dependency.","contact":{"url":"https://api.lazy-mac.com/url-shortener-api"},"license":{"name":"Commercial","url":"https://coindany.gumroad.com/l/zdzwf"}},"servers":[{"url":"https://api.lazy-mac.com/url-shortener-api","description":"Production"}],"paths":{"/":{"get":{"summary":"Landing page / API info","operationId":"getRoot","responses":{"200":{"description":"HTML or JSON info"}}}},"/health":{"get":{"summary":"Health check","operationId":"healthCheck","responses":{"200":{"description":"Service healthy","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"service":{"type":"string"},"version":{"type":"string"},"ts":{"type":"string","format":"date-time"}}}}}}}}},"/shorten":{"get":{"summary":"Shorten a URL","operationId":"shortenUrl","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","format":"uri"},"description":"The long URL to shorten"},{"name":"ttl","in":"query","required":false,"schema":{"type":"integer","default":365,"minimum":1,"maximum":3650},"description":"TTL in days (default 365)"},{"name":"alias","in":"query","required":false,"schema":{"type":"string","maxLength":32},"description":"Custom short code alias"}],"responses":{"200":{"description":"Short URL created","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"short_url":{"type":"string","format":"uri"},"code":{"type":"string"},"long_url":{"type":"string","format":"uri"},"expires_at":{"type":"string","format":"date-time"},"qr_url":{"type":"string","format":"uri"}}}}}},"400":{"description":"Invalid input"},"409":{"description":"Alias already taken"}}}},"/expand":{"get":{"summary":"Expand a short code to original URL","operationId":"expandCode","parameters":[{"name":"code","in":"query","required":true,"schema":{"type":"string"},"description":"Short code"}],"responses":{"200":{"description":"Expanded URL","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"code":{"type":"string"},"long_url":{"type":"string","format":"uri"},"short_url":{"type":"string","format":"uri"},"expires_at":{"type":"string","format":"date-time"},"clicks":{"type":"integer"}}}}}},"404":{"description":"Code not found or expired"}}}},"/stats":{"get":{"summary":"Get click statistics for a short code","operationId":"getStats","parameters":[{"name":"code","in":"query","required":true,"schema":{"type":"string"},"description":"Short code"}],"responses":{"200":{"description":"Statistics","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"code":{"type":"string"},"long_url":{"type":"string","format":"uri"},"short_url":{"type":"string","format":"uri"},"clicks":{"type":"integer"},"created_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time"}}}}}},"404":{"description":"Code not found or expired"}}}},"/qr":{"get":{"summary":"Generate a QR code image for any URL","operationId":"generateQr","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","format":"uri"},"description":"URL to encode"},{"name":"size","in":"query","required":false,"schema":{"type":"integer","default":200,"minimum":50,"maximum":1000},"description":"Image size in px (square)"}],"responses":{"200":{"description":"QR code SVG image (inline, no external dep)","content":{"image/svg+xml":{}}},"400":{"description":"Invalid URL"}}}},"/r/{code}":{"get":{"summary":"Redirect short code to original URL (and record click)","operationId":"redirectCode","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"Redirect to original URL"},"404":{"description":"Code not found or expired"}}}},"/mcp":{"get":{"summary":"MCP endpoint info","operationId":"mcpInfo","responses":{"200":{"description":"MCP server info JSON"}}},"post":{"summary":"MCP endpoint (JSON-RPC 2.0)","operationId":"mcpCall","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"jsonrpc":{"type":"string","example":"2.0"},"method":{"type":"string"},"id":{"type":"integer"},"params":{"type":"object"}}}}}},"responses":{"200":{"description":"JSON-RPC response"}}}}},"components":{"securitySchemes":{"apiKey":{"type":"apiKey","in":"header","name":"X-API-Key"}}}}