{"openapi":"3.1.0","info":{"title":"ImageOptim API","description":"Image optimization service - compress JPEG, PNG, WebP, AVIF","version":"1.0.0"},"paths":{"/api/v1/health":{"get":{"tags":["health"],"summary":"Health Check Root","description":"Alias en raíz /health para healthchecks estándar.","operationId":"health_check_root_api_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/api/v1/auth/me":{"get":{"tags":["auth","auth"],"summary":"Get Me","description":"Get current authenticated user info.","operationId":"get_me_api_v1_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/optimize":{"post":{"tags":["optimize","optimize"],"summary":"Optimize Image","description":"Optimize an uploaded image.\n\nAccepts a multipart upload with the image file.\nReturns the optimized image with metadata and download URL.","operationId":"optimize_image_api_v1_optimize_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_optimize_image_api_v1_optimize_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OptimizeResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/storage/{file_id}":{"get":{"tags":["storage"],"summary":"Serve Storage","description":"Serve a file stored in GridFS by its ID.","operationId":"serve_storage_api_v1_storage__file_id__get","parameters":[{"name":"file_id","in":"path","required":true,"schema":{"type":"string","title":"File Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"Body_optimize_image_api_v1_optimize_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File","description":"Image file to optimize"},"quality":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Quality","description":"Output quality (1-100)","default":80},"output_format":{"type":"string","title":"Output Format","description":"Output format: jpeg, png, webp, avif","default":"webp"},"max_width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Width","description":"Max width"},"max_height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Height","description":"Max height"},"strip_metadata":{"type":"boolean","title":"Strip Metadata","description":"Remove EXIF/metadata","default":true}},"type":"object","required":["file"],"title":"Body_optimize_image_api_v1_optimize_post"},"ErrorResponse":{"properties":{"error":{"type":"string","title":"Error"},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail"},"timestamp":{"type":"string","title":"Timestamp"}},"type":"object","required":["error"],"title":"ErrorResponse","description":"Error response."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthResponse":{"properties":{"status":{"type":"string","title":"Status","default":"ok"},"version":{"type":"string","title":"Version","default":"1.0.0"},"timestamp":{"type":"string","title":"Timestamp"}},"type":"object","required":["timestamp"],"title":"HealthResponse","description":"Health check response."},"OptimizeResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Optimization record ID"},"original_filename":{"type":"string","title":"Original Filename","description":"Original file name"},"original_size":{"type":"integer","title":"Original Size","description":"Original file size in bytes"},"optimized_size":{"type":"integer","title":"Optimized Size","description":"Optimized file size in bytes"},"compression_ratio":{"type":"number","title":"Compression Ratio","description":"Compression ratio (0-1, lower is better)"},"format":{"type":"string","title":"Format","description":"Output format"},"width":{"type":"integer","title":"Width","description":"Output width"},"height":{"type":"integer","title":"Height","description":"Output height"},"download_url":{"type":"string","title":"Download Url","description":"URL to download optimized image"},"timestamp":{"type":"string","title":"Timestamp","description":"Generation timestamp"}},"type":"object","required":["id","original_filename","original_size","optimized_size","compression_ratio","format","width","height","download_url","timestamp"],"title":"OptimizeResponse","description":"Response for image optimization."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}