{"openapi": "3.0.3", "info": {"title": "AI Watermark Removal Toolkit", "version": "1.0.0", "description": "Local service that detects and removes invisible-character watermarks (Layer A), rewrites text through a second model to displace statistical watermarks (Layer B), and strips C2PA, EXIF, XMP, and document metadata from files."}, "servers": [{"url": "http://scrub.boraxlab.li"}], "components": {"securitySchemes": {"bearerAuth": {"type": "http", "scheme": "bearer"}}, "schemas": {"Health": {"type": "object", "properties": {"ok": {"type": "boolean"}, "version": {"type": "string"}, "uptime_seconds": {"type": "number"}}}, "InspectRequest": {"type": "object", "properties": {"file": {"type": "string", "format": "byte", "description": "base64-encoded file bytes"}, "text": {"type": "string", "description": "alternative to file, for plain text"}, "name": {"type": "string", "example": "document.docx"}, "options": {"$ref": "#/components/schemas/Options"}}}, "Options": {"type": "object", "properties": {"aggressive": {"type": "boolean", "default": false}, "strip_emoji_glue": {"type": "boolean", "default": false}, "normalize": {"type": "boolean", "default": false}, "layer_a": {"type": "boolean", "default": true}, "metadata": {"type": "boolean", "default": true}, "use_tools": {"type": "boolean", "default": true}, "diff": {"type": "boolean", "default": false}}}, "RewriteRequest": {"type": "object", "required": ["text"], "properties": {"text": {"type": "string"}, "backend": {"type": "string", "enum": ["print-prompt", "ollama", "openai-compatible"]}, "strength": {"type": "string", "enum": ["paraphrase", "humanize", "code", "backtranslate", "structural"]}, "model": {"type": "string"}, "base_url": {"type": "string"}, "temperature": {"type": "number", "default": 0.9}, "candidates": {"type": "integer", "minimum": 1, "maximum": 5}, "allow_remote": {"type": "boolean", "default": false}, "layer_a_after": {"type": "boolean", "default": true}}}, "Error": {"type": "object", "properties": {"error": {"type": "string"}, "detail": {"type": "string"}}}}}, "paths": {"/health": {"get": {"summary": "Liveness probe", "security": [], "responses": {"200": {"description": "service is up", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Health"}}}}}}}, "/capabilities": {"get": {"summary": "Which optional tools and backends are available", "responses": {"200": {"description": "capability report"}}}}, "/openapi.json": {"get": {"summary": "This document", "security": [], "responses": {"200": {"description": "OpenAPI spec"}}}}, "/inspect": {"post": {"summary": "Scan a file or text without modifying it", "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/InspectRequest"}}}}, "responses": {"200": {"description": "findings"}, "400": {"description": "bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "413": {"description": "payload too large"}}}}, "/clean": {"post": {"summary": "Strip watermarks and metadata, return the cleaned bytes", "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/InspectRequest"}}}}, "responses": {"200": {"description": "cleaned file plus a report"}, "400": {"description": "bad request"}, "413": {"description": "payload too large"}}}}, "/rewrite": {"post": {"summary": "Layer B: paraphrase through a second model", "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/RewriteRequest"}}}}, "responses": {"200": {"description": "rewritten text with divergence score"}, "400": {"description": "bad request"}, "502": {"description": "rewrite backend unreachable"}}}}}, "x-supported-formats": ["png", "jpeg", "webp", "svg", "pdf", "docx", "odt", "html", "markdown", "text"], "security": [{"bearerAuth": []}]}