{
  "openapi": "3.1.1",
  "info": {
    "title": "Audio, video & images API",
    "version": "1.0.0",
    "summary": "Deterministic tools for people and AI agents.",
    "description": "Every endpoint performs the same calculation as the human page and returns inputs, result, units, assumptions, sources, warnings and computedAt. MCP endpoint: /mcp."
  },
  "servers": [
    {
      "url": "https://media.usefulweb.site"
    }
  ],
  "paths": {
    "/api/v1/tools": {
      "get": {
        "operationId": "listTools",
        "summary": "Catalog of all tools",
        "responses": {
          "200": {
            "description": "Tool list.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/{id}": {
      "get": {
        "operationId": "getTool",
        "summary": "Definition of one tool",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "audio-cutter-merger",
                "audio-loudness-normalizer",
                "background-remover",
                "batch-image-resizer",
                "batch-watermark-studio",
                "exif-inspector-cleaner",
                "heic-raw-converter",
                "image-compressor",
                "image-upscaler",
                "mp3-tag-cover-editor",
                "subtitle-studio",
                "svg-optimizer",
                "audio-converter",
                "video-converter",
                "vertical-video-reframer",
                "video-compressor",
                "video-cutter-merger",
                "video-to-gif-creator",
                "video-to-audio-extractor"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Tool definition.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "404": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/audio-cutter-merger/calculate": {
      "post": {
        "operationId": "calculateAudioCutterMerger",
        "summary": "Trim audio, keep or remove ranges, fade in/out, or join up to 10 clips with crossfades.",
        "description": "Cuts an audio file to a start and end time, keeps or removes a list of time ranges, and adds fade-in/fade-out. In merge mode it joins up to 10 clips in order, optionally with a crossfade between them. Output as MP3, M4A, Ogg, Opus, FLAC or WAV.\n\nMethodology:\n- Times are parsed strictly (seconds, mm:ss or hh:mm:ss.mmm); only the resulting numbers are written into the ffmpeg filtergraph, never your text.\n- Cut mode: ranges to keep are sorted, clipped to the file length and merged where they overlap; \"remove\" ranges are inverted into the parts to keep. Each part is cut sample-accurately with atrim and the parts are joined with the concat filter.\n- Merge mode: every clip is converted to a common sample rate (the highest of the clips, max 48 kHz) and channel layout (stereo if any clip is stereo), then joined with concat, or chained with acrossfade (triangular curves) when a crossfade is set. Each crossfade shortens the total by its length.\n- Fade in/out (afade) is applied to the final result. The result is encoded once in the chosen format.",
        "tags": [
          "media"
        ],
        "x-mcp-tool": "audio_cutter_merger",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AudioCutterMergerInput"
              },
              "examples": {
                "example1": {
                  "summary": "Cut 0.1–0.4 s with a short fade out",
                  "value": {
                    "mode": "cut",
                    "file": {
                      "filename": "tone.mp3",
                      "contentType": "audio/mpeg",
                      "contentBase64": "SUQzAwAAAAAANFRJVDIAAAALAAAAVGVzdCB0b25lAFRQRTEAAAALAAAAdXNlZnVsd2ViAAAAAAAAAAAAAAD/4zjAAAAAAAAAAAAASW5mbwAAAA8AAAAJAAADYABVVVVVVVVVVVVVVWpqampqampqampqgICAgICAgICAgICVlZWVlZWVlZWVlaqqqqqqqqqqqqqqwMDAwMDAwMDAwMDV1dXV1dXV1dXV1erq6urq6urq6urq//////////////8AAAAATGF2ZiBsYW1lAAAAAAAAAAAAAAAAJAJgAAAAAAAAA2DhWsr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4xjEAAyokqh5SAAAD22/4d3d3v/RESv5d3f5SSwbgLgLgLg3PlAxw/yhz9/R7+j38HAxkAffWBDmgH+Ud39CgQkKRFiBEz//4xjECA3w6qDBlDgA5MkBJoc7/EBhyQNsGAOBS4BzxgokpgaxKNMIQcg9HhsNv/x0ajU4GhL/hIGhKdBq////////////////4xjECw8QpjgB3gAA+GhGAAYBYAxfoGgIGBqDgYSYPhhOi9GJrekZAAshh+g1GCWCYAgOwqAOYCAAJbFkl+rfoA//b7/L5fX/4xjECQqwjo5YCbRi/n3qiICUpOT5DnL9WR4Ms63+X06P/v9H/+//+nJf+t9GXtsQBtdfrcl5/f+V1eIwQL/nESYRBr0i8sr/4xjEGQtIloJYCnZigON9/lP9n9b/T9v37q/9P2//1fRV///5O3qXQOATAhMCmwMhwSPQYQHRBgcjAEgOoWAuAIB4YAGRACL/4xjEJgpYpjQABvxEbLUb6v///jGAGAADfQMAIBwMCwEgEAvAxGjLAx9m1A6uxbA3pD+AwbAgAwDAJACBeAkAoj4ZgQohCDD/4xjENw04pkABVgAAAR/itBmDQVp/WLIJwRwGKJAwM/DsNjcZwDM5yDpBHgAgGAy0hSC/v8A3wDWMsT8L2PP//zMe5udL5uv/4xjEPRaRlozJlWgAL///+brMwdB8Bn//oB8BmiY1//9BMaaJuNf//3IVBd2AA//aqqp/9VVVOdqOJAwVLAwCARKyIBJV/QX/4xjEHQ1AmqR5xggBBn/0FCv8FBn/FBQp/xQYK/oKFHfiSf/9TEFNRTQuMSAoYWxwaGEgMClVVVVVVVVVVVVVVVVVVVVVVVU="
                    },
                    "start": "0.1",
                    "end": "0.4",
                    "fadeOut": 0.1,
                    "format": "mp3",
                    "bitrate": "64"
                  }
                },
                "example2": {
                  "summary": "Merge two tones with a 0.1 s crossfade",
                  "value": {
                    "mode": "merge",
                    "file": {
                      "filename": "tone.mp3",
                      "contentType": "audio/mpeg",
                      "contentBase64": "SUQzAwAAAAAANFRJVDIAAAALAAAAVGVzdCB0b25lAFRQRTEAAAALAAAAdXNlZnVsd2ViAAAAAAAAAAAAAAD/4zjAAAAAAAAAAAAASW5mbwAAAA8AAAAJAAADYABVVVVVVVVVVVVVVWpqampqampqampqgICAgICAgICAgICVlZWVlZWVlZWVlaqqqqqqqqqqqqqqwMDAwMDAwMDAwMDV1dXV1dXV1dXV1erq6urq6urq6urq//////////////8AAAAATGF2ZiBsYW1lAAAAAAAAAAAAAAAAJAJgAAAAAAAAA2DhWsr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4xjEAAyokqh5SAAAD22/4d3d3v/RESv5d3f5SSwbgLgLgLg3PlAxw/yhz9/R7+j38HAxkAffWBDmgH+Ud39CgQkKRFiBEz//4xjECA3w6qDBlDgA5MkBJoc7/EBhyQNsGAOBS4BzxgokpgaxKNMIQcg9HhsNv/x0ajU4GhL/hIGhKdBq////////////////4xjECw8QpjgB3gAA+GhGAAYBYAxfoGgIGBqDgYSYPhhOi9GJrekZAAshh+g1GCWCYAgOwqAOYCAAJbFkl+rfoA//b7/L5fX/4xjECQqwjo5YCbRi/n3qiICUpOT5DnL9WR4Ms63+X06P/v9H/+//+nJf+t9GXtsQBtdfrcl5/f+V1eIwQL/nESYRBr0i8sr/4xjEGQtIloJYCnZigON9/lP9n9b/T9v37q/9P2//1fRV///5O3qXQOATAhMCmwMhwSPQYQHRBgcjAEgOoWAuAIB4YAGRACL/4xjEJgpYpjQABvxEbLUb6v///jGAGAADfQMAIBwMCwEgEAvAxGjLAx9m1A6uxbA3pD+AwbAgAwDAJACBeAkAoj4ZgQohCDD/4xjENw04pkABVgAAAR/itBmDQVp/WLIJwRwGKJAwM/DsNjcZwDM5yDpBHgAgGAy0hSC/v8A3wDWMsT8L2PP//zMe5udL5uv/4xjEPRaRlozJlWgAL///+brMwdB8Bn//oB8BmiY1//9BMaaJuNf//3IVBd2AA//aqqp/9VVVOdqOJAwVLAwCARKyIBJV/QX/4xjEHQ1AmqR5xggBBn/0FCv8FBn/FBQp/xQYK/oKFHfiSf/9TEFNRTQuMSAoYWxwaGEgMClVVVVVVVVVVVVVVVVVVVVVVVU="
                    },
                    "file2": {
                      "filename": "tone2.mp3",
                      "contentType": "audio/mpeg",
                      "contentBase64": "SUQzBAAAAAAACgAAAAAAAAAAAAD/4zjAAAAAAAAAAAAASW5mbwAAAA8AAAAJAAADYABVVVVVVVVVVVVVVWpqampqampqampqgICAgICAgICAgICVlZWVlZWVlZWVlaqqqqqqqqqqqqqqwMDAwMDAwMDAwMDV1dXV1dXV1dXV1erq6urq6urq6urq//////////////8AAAAATGF2ZiBsYW1lAAAAAAAAAAAAAAAAJAJgAAAAAAAAA2CfAwBHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4xjEAAxI0phRSwAAArwHve973v9jGMYz+Xve9/8MYxlfy977QJAeAEwAwAwAwCwRyef3fv6P8CO4f5T39Co4bDYd/xqIo8P/4xjECQ6I9qABh9AAb/B8Og9Ab/xJ3i4QISh05d3yWWGCOD0Ki/F8hFQXddlMZjNampsTv8qIgqCoiPf+CtX/////9ZiTrBr/4xjECQ4w5kAB1kgAkBgLAcBgRE4Bg3DkBh3BEBhTHYBllKwB/bhaBnMKyBieA6IEAwFgWCgBw+UAwHiVdoWGABh/d9L+WXz/4xjECwxw1lcYDTyg/96/6iyBCGOqUu6gsaCAnw8CE0GRXujP/q+qz7v/9Wv/If9P/9Wt+upZwlQ4QGAbwCAEl7gMALGAlAD/4xjEFA0A5igABX6EeaMmFWhAOaNAJRMACrieyL09zfV/f///7v/9dv///+rMAAuAv/y//63caqKh7oFMhRFHgUzvgEvJhJz/4xjEGwsw4jWQCDxIrAOUZcyRyypv//7d3R//2/+t/////+tBZfcagAABADA3AYFAoAYZAfAYcRigZBRrgeE0lAZXB1AoKwL/4xjEKQzw5kgBVjAA4cDAOAsOeQcmLC0AAICBECgMBgQCf5hkz/FhhUFj/GgLgBQGiskgktEfoSVJ4DBGQWtkQIYMwIAAOQD/4xjEMBgJoq5ZiqAAFn5E///E3hicZMlRZZEyiOf///m6JfN0TMPA//+Aw8D4DNE//8aHiY00l3//5pLkKg3EQFdwAP/2Zl//4xjECg0wzrZZwxAB4zMyl7MzMv/GZv+MGAgImAgIUcUGG/iCnb6Cgw3+goUd8UGO/wUKG/5IKkxBTUU0LjEgKGFscGhhIDA="
                    },
                    "crossfade": 0.1,
                    "format": "wav"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AudioCutterMergerResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/audio-loudness-normalizer/calculate": {
      "post": {
        "operationId": "calculateAudioLoudnessNormalizer",
        "summary": "Measure LUFS and true peak, then normalise to Spotify, podcast or EBU R 128 targets.",
        "description": "Measures integrated loudness (LUFS), true peak (dBTP) and loudness range (LRA) with ffmpeg's EBU R 128 meter, then normalises the file in two passes to a streaming, podcast or broadcast target with a true-peak limit. Shows the measured values before and after, with a player and a download.\n\nMethodology:\n- Pass 1 measures the file with ffmpeg's loudnorm filter (ITU-R BS.1770 / EBU R 128 meter): integrated loudness (LUFS), true peak (dBTP, oversampled), loudness range (LRA) and the gating threshold.\n- Pass 2 feeds the measured values back into loudnorm with linear=true: if the whole file can reach the target with one gain change without exceeding the true-peak limit, only the gain changes (linear). Otherwise loudnorm switches to dynamic mode, which compresses and limits — the result reports which one happened.\n- loudnorm works at 192 kHz internally; the output is resampled back to the original sample rate. The podcast-mono preset also mixes to mono.\n- Pass 3 measures the finished file again, so the \"after\" values are real measurements of the download, not the targets (for files over 15 minutes the normaliser's own output report is used instead, to stay within the time limit). Files up to 45 minutes are accepted.\n- Spotify (−14 LUFS, true peak below −1 dB) and EBU R 128 (−23 LUFS) are published targets; YouTube ≈ −14 and Apple ≈ −16 LUFS are widely used measured/recommended values, not contractual specs. Podcast −16 LUFS stereo / −19 LUFS mono are common industry recommendations.\n\nVery short files (under about 3 seconds) give less reliable integrated loudness, because the meter gates in 400 ms blocks.",
        "tags": [
          "media"
        ],
        "x-mcp-tool": "audio_loudness_normalizer",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AudioLoudnessNormalizerInput"
              },
              "examples": {
                "example1": {
                  "summary": "Normalise a test tone to the Spotify target",
                  "value": {
                    "file": {
                      "filename": "tone.mp3",
                      "contentType": "audio/mpeg",
                      "contentBase64": "SUQzAwAAAAAANFRJVDIAAAALAAAAVGVzdCB0b25lAFRQRTEAAAALAAAAdXNlZnVsd2ViAAAAAAAAAAAAAAD/4zjAAAAAAAAAAAAASW5mbwAAAA8AAAAJAAADYABVVVVVVVVVVVVVVWpqampqampqampqgICAgICAgICAgICVlZWVlZWVlZWVlaqqqqqqqqqqqqqqwMDAwMDAwMDAwMDV1dXV1dXV1dXV1erq6urq6urq6urq//////////////8AAAAATGF2ZiBsYW1lAAAAAAAAAAAAAAAAJAJgAAAAAAAAA2DhWsr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4xjEAAyokqh5SAAAD22/4d3d3v/RESv5d3f5SSwbgLgLgLg3PlAxw/yhz9/R7+j38HAxkAffWBDmgH+Ud39CgQkKRFiBEz//4xjECA3w6qDBlDgA5MkBJoc7/EBhyQNsGAOBS4BzxgokpgaxKNMIQcg9HhsNv/x0ajU4GhL/hIGhKdBq////////////////4xjECw8QpjgB3gAA+GhGAAYBYAxfoGgIGBqDgYSYPhhOi9GJrekZAAshh+g1GCWCYAgOwqAOYCAAJbFkl+rfoA//b7/L5fX/4xjECQqwjo5YCbRi/n3qiICUpOT5DnL9WR4Ms63+X06P/v9H/+//+nJf+t9GXtsQBtdfrcl5/f+V1eIwQL/nESYRBr0i8sr/4xjEGQtIloJYCnZigON9/lP9n9b/T9v37q/9P2//1fRV///5O3qXQOATAhMCmwMhwSPQYQHRBgcjAEgOoWAuAIB4YAGRACL/4xjEJgpYpjQABvxEbLUb6v///jGAGAADfQMAIBwMCwEgEAvAxGjLAx9m1A6uxbA3pD+AwbAgAwDAJACBeAkAoj4ZgQohCDD/4xjENw04pkABVgAAAR/itBmDQVp/WLIJwRwGKJAwM/DsNjcZwDM5yDpBHgAgGAy0hSC/v8A3wDWMsT8L2PP//zMe5udL5uv/4xjEPRaRlozJlWgAL///+brMwdB8Bn//oB8BmiY1//9BMaaJuNf//3IVBd2AA//aqqp/9VVVOdqOJAwVLAwCARKyIBJV/QX/4xjEHQ1AmqR5xggBBn/0FCv8FBn/FBQp/xQYK/oKFHfiSf/9TEFNRTQuMSAoYWxwaGEgMClVVVVVVVVVVVVVVVVVVVVVVVU="
                    },
                    "preset": "spotify",
                    "format": "wav"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AudioLoudnessNormalizerResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/background-remover/calculate": {
      "post": {
        "operationId": "calculateBackgroundRemover",
        "summary": "Remove plain backgrounds from product photos and logos (colour-based, no AI) → transparent PNG.",
        "description": "Makes the background of an image transparent by colour: it estimates the background colour from the image border and removes it with an adjustable tolerance, or removes one colour everywhere (chroma key / green screen). Works well for product photos, logos and scans on plain backgrounds; it does NOT understand people or complex scenes, because it uses no AI model.\n\nMethodology:\n- This is NOT an AI background remover. It decides per pixel by colour distance only, so it works for a subject on a plain, evenly coloured background (product shots, logos, scans, green screen) and fails on busy scenes, hair, or subjects with the same colour as the background.\n- Automatic mode shrinks the image to 200×200 px and takes the per-channel median of a 3-pixel border ring as the background colour. The share of border pixels within the tolerance (\"border uniformity\") predicts how well the method will work.\n- Edge-connected modes add a 1-pixel frame in the background colour and flood-fill from it with ImageMagick (-fuzz, -floodfill), so only background regions touching the edge are removed and same-coloured areas inside the subject stay. Chroma-key mode removes every pixel close to the colour, wherever it is.\n- The resulting mask is cleaned with a morphological open (removes specks) and close (fills pin holes) using a disk of the chosen radius, optionally blurred to feather the edge, and used as the alpha channel of a PNG.\n- Existing transparency is flattened onto white first. Colour tolerance is a root-mean-square distance over R, G and B relative to the full 0–255 range.\n\nColour-based removal is approximate. Check the edges in the preview; for portraits or complex scenes use an AI tool or manual masking.",
        "tags": [
          "media"
        ],
        "x-mcp-tool": "background_remover",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BackgroundRemoverInput"
              },
              "examples": {
                "example1": {
                  "summary": "Red square on white (automatic)",
                  "value": {
                    "file": {
                      "filename": "product.png",
                      "contentType": "image/png",
                      "contentBase64": "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgAQMAAABJtOi3AAAABlBMVEX/////AADrWueTAAAAEklEQVQI12NgIBb8/09dgjgAAPcnH+GApkH4AAAAAElFTkSuQmCC"
                    },
                    "mode": "auto",
                    "fuzz": 10,
                    "cleanup": 1,
                    "feather": 0
                  }
                },
                "example2": {
                  "summary": "Chroma key: remove white everywhere",
                  "value": {
                    "file": {
                      "filename": "logo.png",
                      "contentType": "image/png",
                      "contentBase64": "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgAQMAAABJtOi3AAAABlBMVEX/////AADrWueTAAAAEklEQVQI12NgIBb8/09dgjgAAPcnH+GApkH4AAAAAElFTkSuQmCC"
                    },
                    "mode": "chroma",
                    "color": "#ffffff",
                    "fuzz": 5,
                    "cleanup": 0,
                    "feather": 0
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BackgroundRemoverResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/batch-image-resizer/calculate": {
      "post": {
        "operationId": "calculateBatchImageResizer",
        "summary": "Resize or crop up to 30 images at once: exact size, fit, percentage or 1:1, 4:5, 16:9, 9:16.",
        "description": "Upload one image or a ZIP with up to 30 images and resize them all the same way: to an exact size (cropped to fill, with a chosen focus point), to fit within a box, by percentage, or cropped to a social-media aspect ratio. Choose the output format and quality and download everything as one ZIP with a per-file report.\n\nMethodology:\n- Each file in the upload (or ZIP) is identified by its content; files that are not supported images are listed as skipped. The ZIP is read in memory with limits (30 images, 50 MB each, no encrypted or ZIP64 archives).\n- Every image is first turned upright using its EXIF orientation. Fit: scaled so it fits inside the box (never enlarged unless allowed). Exact size: scaled to cover the box, then cropped around the chosen focus. Percentage: scaled by the factor. Aspect ratio: the largest centred (or focused) crop with that ratio, then optionally fitted into the box.\n- Scaling uses ImageMagick's default high-quality filter (Lanczos when shrinking photos, Mitchell when enlarging). WebP is encoded with cwebp and AVIF with avifenc when installed.\n- Metadata is removed unless you keep it; when kept, exiftool copies it back and resets the orientation tag. The ZIP is built with fixed timestamps so the same input gives the same file.\n\nCropping removes parts of the picture; check the preview before publishing.",
        "tags": [
          "media"
        ],
        "x-mcp-tool": "batch_image_resizer",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BatchImageResizerInput"
              },
              "examples": {
                "example1": {
                  "summary": "Two images in a ZIP → 1:1 squares, WebP",
                  "value": {
                    "images": {
                      "filename": "photos.zip",
                      "contentType": "application/zip",
                      "contentBase64": "UEsDBBQAAAgAAAAAIQAvZbbGVAAAAFQAAAAHAAAAcmVkLnBuZ4lQTkcNChoKAAAADUlIRFIAAAAoAAAAHgEDAAAAZBPOngAAAANQTFRF0EBArFYGfwAAAAxJREFUCNdjYBh6AAAAtAABXnGQvwAAAABJRU5ErkJgglBLAwQUAAAIAAAAACEA+zRozFQAAABUAAAACQAAAGdyZWVuLnBuZ4lQTkcNChoKAAAADUlIRFIAAAAeAAAAKAEDAAAA093YUQAAAANQTFRFQKBADztNYwAAAAxJREFUCNdjYBgeAAAAyAABfGNpfQAAAABJRU5ErkJgglBLAQIUAxQAAAgAAAAAIQAvZbbGVAAAAFQAAAAHAAAAAAAAAAAAAACkgQAAAAByZWQucG5nUEsBAhQDFAAACAAAAAAhAPs0aMxUAAAAVAAAAAkAAAAAAAAAAAAAAKSBeQAAAGdyZWVuLnBuZ1BLBQYAAAAAAgACAGwAAAD0AAAAAAA="
                    },
                    "mode": "aspect",
                    "aspect": "1:1",
                    "format": "webp",
                    "quality": 80
                  }
                },
                "example2": {
                  "summary": "Single image → exactly 32×32 px",
                  "value": {
                    "images": {
                      "filename": "banner.png",
                      "contentType": "image/png",
                      "contentBase64": "iVBORw0KGgoAAAANSUhEUgAAADAAAAAgEAIAAACLJrAIAAADy0lEQVRo3mNUUHBwaGhgGAU4AAuzDIsqi+xoQIwG0GgA0SqApFnUWGRGAwJvCmIdTUH4Aoh1QLIY1zXW7h8rTGfLLb+517lejefcfFNduZ83/EUec5t91Hhj9vUG/9EziY/C1d33Jt4uNtp1eu6jFxo3v2b/4uR4Rk93Mpo+jnWZ60Ufy9jVmFN+m8fWm8zcbptWbtG90YlUE2b8OT4z4PPSzefme/D9NP3jwOpJ8wCy+J+YuTCd1tZI3+NreGW64kn0zIqrLHZMXn/7KTHtj8K/eOYv4X1LpTrnPwv6pCJ6hYYBZCOd2re0hXYWSEryWr0+vep0FEvBRlqYH+a+jG2Cw/Orn/eIutCqkFajTRnEepz5x+/XKyZGHi66xsDA4EibCFimHDG/5KRX0KKuBUd+zf+7k3XukGkHRSrqlWz8yPSAsf7fbRrWMtOYov98j+TWP7F19xLPS6ohzNRvB6lSux3EqcJa/MMzaY1h/bK79Cn+E78aci533Wh9+5V/8zeT39ac4YO6mjc0kRK/xs3AwBBN36aDkaiU4VXV4zLPVC1kqZrFqN1QtC2RbTp2g+EoAwODCD0DyGaO3Jzjbad2v1K1zRnUZZBeldiMi28ZGBiy6JuC9LvEZlw4yezL4spiNahrMcG3HHnvbtA/gIS7OJa84WS+z3KcxW9Qp6APE3/GCWuLmHAwvKRrAH0I/akjHM68jOUNC9WyNgsLDQLo6qb3s0xT7BkkL2+hawBdKf9gYOrGIsOyleX1oK7Fzhx61+DSam8u6bXFmp4BdDrx7Xc3WWYZVlUWjkHdDrqZ/yXR4g8DA51zGMMNmc8PrBYws7JosKQP6jLoTwFDJh/DOv2nW/KXBqVLn5lI8/bQhpynF3N1fysyNfC1MDMwqQ6JvtieitePU7cHyUpfnJjJ4MUgwTCdFrb8Nfl/mjVyl8ebvLSlzFwsuSx/qdybT184f/p9CdrFrcgTtuePHrZUqfvZs9PC/JoVN/ccPPbm1y9+uSCaDHdk7V2857EprbOAyDe2uodzGyqVhey+MF5maPhHUUPuH99/A5aahgN3/x/a8vbD74OyrDQcD8q9ufzh8yAGugBWT0bRn+ZOtYJnph/1ThDm6txEqglbmd6eq/DYl/EhL+PS74J/N9ktaO1mxoKva9he5zPQHbDvZ+z5+lTFlMP7SKb+FO41W0JVT3LkHS7hO8Gi8TLwk9OfW+Lzb+f+mG9jfOngtwwfuTtHvm+yWfJj8/8QHhZ6upOxRHCD9vsehlGApx00Oi9G73bQaACNBtAogAEAmBNP2iSWACUAAAAASUVORK5CYII="
                    },
                    "mode": "cover",
                    "width": 32,
                    "height": 32,
                    "gravity": "center",
                    "format": "jpeg",
                    "quality": 85
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BatchImageResizerResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/batch-watermark-studio/calculate": {
      "post": {
        "operationId": "calculateBatchWatermarkStudio",
        "summary": "Add a text or logo watermark to up to 30 images at once: position, tiling, opacity and angle.",
        "description": "Stamps a text watermark (choice of installed fonts, size, colour, opacity, angle) or your logo (PNG with transparency, scale, opacity) onto one image or a ZIP of up to 30 images, in a corner, the centre or tiled across the whole picture. Download all results as one ZIP and check the preview of the first image.\n\nMethodology:\n- Text is rendered by ImageMagick (label:) with a TrueType font installed on the server, in the chosen colour with the opacity applied to the colour's alpha channel, then rotated. The text is escaped so it is always drawn literally.\n- Logos are decoded from their content (PNG, WebP, JPG, GIF, AVIF), scaled to the given share of each image's width, their alpha channel multiplied by the opacity, then rotated.\n- Each image is first turned upright from its EXIF orientation. The watermark is composited (\"over\") at the chosen position with a margin relative to the shorter side, or repeated as a tile pattern with gaps of 6% of the shorter side around each copy.\n- Sizes are relative to each image, so mixed resolutions get proportionally equal watermarks. Metadata is removed from the outputs; the ZIP uses fixed timestamps.\n\nVisible watermarks deter casual copying but can be cropped or retouched away.",
        "tags": [
          "media"
        ],
        "x-mcp-tool": "batch_watermark_studio",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BatchWatermarkStudioInput"
              },
              "examples": {
                "example1": {
                  "summary": "Text watermark bottom right",
                  "value": {
                    "images": {
                      "filename": "photo.png",
                      "contentType": "image/png",
                      "contentBase64": "iVBORw0KGgoAAAANSUhEUgAAADAAAAAgEAIAAACLJrAIAAADy0lEQVRo3mNUUHBwaGhgGAU4AAuzDIsqi+xoQIwG0GgA0SqApFnUWGRGAwJvCmIdTUH4Aoh1QLIY1zXW7h8rTGfLLb+517lejefcfFNduZ83/EUec5t91Hhj9vUG/9EziY/C1d33Jt4uNtp1eu6jFxo3v2b/4uR4Rk93Mpo+jnWZ60Ufy9jVmFN+m8fWm8zcbptWbtG90YlUE2b8OT4z4PPSzefme/D9NP3jwOpJ8wCy+J+YuTCd1tZI3+NreGW64kn0zIqrLHZMXn/7KTHtj8K/eOYv4X1LpTrnPwv6pCJ6hYYBZCOd2re0hXYWSEryWr0+vep0FEvBRlqYH+a+jG2Cw/Orn/eIutCqkFajTRnEepz5x+/XKyZGHi66xsDA4EibCFimHDG/5KRX0KKuBUd+zf+7k3XukGkHRSrqlWz8yPSAsf7fbRrWMtOYov98j+TWP7F19xLPS6ohzNRvB6lSux3EqcJa/MMzaY1h/bK79Cn+E78aci533Wh9+5V/8zeT39ac4YO6mjc0kRK/xs3AwBBN36aDkaiU4VXV4zLPVC1kqZrFqN1QtC2RbTp2g+EoAwODCD0DyGaO3Jzjbad2v1K1zRnUZZBeldiMi28ZGBiy6JuC9LvEZlw4yezL4spiNahrMcG3HHnvbtA/gIS7OJa84WS+z3KcxW9Qp6APE3/GCWuLmHAwvKRrAH0I/akjHM68jOUNC9WyNgsLDQLo6qb3s0xT7BkkL2+hawBdKf9gYOrGIsOyleX1oK7Fzhx61+DSam8u6bXFmp4BdDrx7Xc3WWYZVlUWjkHdDrqZ/yXR4g8DA51zGMMNmc8PrBYws7JosKQP6jLoTwFDJh/DOv2nW/KXBqVLn5lI8/bQhpynF3N1fysyNfC1MDMwqQ6JvtieitePU7cHyUpfnJjJ4MUgwTCdFrb8Nfl/mjVyl8ebvLSlzFwsuSx/qdybT184f/p9CdrFrcgTtuePHrZUqfvZs9PC/JoVN/ccPPbm1y9+uSCaDHdk7V2857EprbOAyDe2uodzGyqVhey+MF5maPhHUUPuH99/A5aahgN3/x/a8vbD74OyrDQcD8q9ufzh8yAGugBWT0bRn+ZOtYJnph/1ThDm6txEqglbmd6eq/DYl/EhL+PS74J/N9ktaO1mxoKva9he5zPQHbDvZ+z5+lTFlMP7SKb+FO41W0JVT3LkHS7hO8Gi8TLwk9OfW+Lzb+f+mG9jfOngtwwfuTtHvm+yWfJj8/8QHhZ6upOxRHCD9vsehlGApx00Oi9G73bQaACNBtAogAEAmBNP2iSWACUAAAAASUVORK5CYII="
                    },
                    "mode": "text",
                    "text": "© Example",
                    "size": 12,
                    "color": "#ffffff",
                    "opacity": 70,
                    "position": "southeast",
                    "format": "png"
                  }
                },
                "example2": {
                  "summary": "Logo tiled at 30° with 40 % opacity",
                  "value": {
                    "images": {
                      "filename": "photo.png",
                      "contentType": "image/png",
                      "contentBase64": "iVBORw0KGgoAAAANSUhEUgAAADAAAAAgEAIAAACLJrAIAAADy0lEQVRo3mNUUHBwaGhgGAU4AAuzDIsqi+xoQIwG0GgA0SqApFnUWGRGAwJvCmIdTUH4Aoh1QLIY1zXW7h8rTGfLLb+517lejefcfFNduZ83/EUec5t91Hhj9vUG/9EziY/C1d33Jt4uNtp1eu6jFxo3v2b/4uR4Rk93Mpo+jnWZ60Ufy9jVmFN+m8fWm8zcbptWbtG90YlUE2b8OT4z4PPSzefme/D9NP3jwOpJ8wCy+J+YuTCd1tZI3+NreGW64kn0zIqrLHZMXn/7KTHtj8K/eOYv4X1LpTrnPwv6pCJ6hYYBZCOd2re0hXYWSEryWr0+vep0FEvBRlqYH+a+jG2Cw/Orn/eIutCqkFajTRnEepz5x+/XKyZGHi66xsDA4EibCFimHDG/5KRX0KKuBUd+zf+7k3XukGkHRSrqlWz8yPSAsf7fbRrWMtOYov98j+TWP7F19xLPS6ohzNRvB6lSux3EqcJa/MMzaY1h/bK79Cn+E78aci533Wh9+5V/8zeT39ac4YO6mjc0kRK/xs3AwBBN36aDkaiU4VXV4zLPVC1kqZrFqN1QtC2RbTp2g+EoAwODCD0DyGaO3Jzjbad2v1K1zRnUZZBeldiMi28ZGBiy6JuC9LvEZlw4yezL4spiNahrMcG3HHnvbtA/gIS7OJa84WS+z3KcxW9Qp6APE3/GCWuLmHAwvKRrAH0I/akjHM68jOUNC9WyNgsLDQLo6qb3s0xT7BkkL2+hawBdKf9gYOrGIsOyleX1oK7Fzhx61+DSam8u6bXFmp4BdDrx7Xc3WWYZVlUWjkHdDrqZ/yXR4g8DA51zGMMNmc8PrBYws7JosKQP6jLoTwFDJh/DOv2nW/KXBqVLn5lI8/bQhpynF3N1fysyNfC1MDMwqQ6JvtieitePU7cHyUpfnJjJ4MUgwTCdFrb8Nfl/mjVyl8ebvLSlzFwsuSx/qdybT184f/p9CdrFrcgTtuePHrZUqfvZs9PC/JoVN/ccPPbm1y9+uSCaDHdk7V2857EprbOAyDe2uodzGyqVhey+MF5maPhHUUPuH99/A5aahgN3/x/a8vbD74OyrDQcD8q9ufzh8yAGugBWT0bRn+ZOtYJnph/1ThDm6txEqglbmd6eq/DYl/EhL+PS74J/N9ktaO1mxoKva9he5zPQHbDvZ+z5+lTFlMP7SKb+FO41W0JVT3LkHS7hO8Gi8TLwk9OfW+Lzb+f+mG9jfOngtwwfuTtHvm+yWfJj8/8QHhZ6upOxRHCD9vsehlGApx00Oi9G73bQaACNBtAogAEAmBNP2iSWACUAAAAASUVORK5CYII="
                    },
                    "mode": "logo",
                    "logo": {
                      "filename": "logo.png",
                      "contentType": "image/png",
                      "contentBase64": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAQAQMAAAA26i3WAAAABlBMVEX4+PgWUvBKqxVnAAAAEklEQVQI12NgQAP8/z/gxWgAAPdHD/H1HpIcAAAAAElFTkSuQmCC"
                    },
                    "size": 20,
                    "opacity": 40,
                    "angle": 30,
                    "position": "tile",
                    "format": "jpeg",
                    "quality": 85
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BatchWatermarkStudioResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/exif-inspector-cleaner/calculate": {
      "post": {
        "operationId": "calculateExifInspectorCleaner",
        "summary": "See all photo metadata (EXIF, GPS, XMP, IPTC, MakerNotes) and download a cleaned copy.",
        "description": "Lists every metadata tag in a photo, grouped into EXIF, GPS, XMP, IPTC, MakerNotes and colour profile, and warns when the picture reveals where it was taken. Creates a cleaned copy without re-compressing the image: remove everything, only the GPS location, or everything except orientation and colour profile, then checks the cleaned file to prove it.\n\nMethodology:\n- exiftool reads every metadata block (-a -G0:1). Tags are grouped by where they live: EXIF (IFD0/ExifIFD), GPS (the GPS IFD plus XMP GPS tags), XMP, IPTC, MakerNotes (manufacturer data such as serial numbers), the ICC colour profile and file structure. Server-side file system entries (temporary names, dates) are not shown.\n- GPS coordinates are shown as decimal degrees so you can see what others could see. No map service is contacted.\n- Cleaning edits the metadata only; the compressed image data is copied unchanged (no re-encoding, no quality loss). \"Remove all\" deletes every writable tag (including the colour profile); \"Only GPS\" deletes the GPS IFD and all GPS* tags; \"Keep orientation and colour profile\" deletes everything, then copies back Orientation and the colour-space tags (ICC profile, ColorSpace).\n- Verification re-reads the cleaned file with exiftool and counts remaining tags per group; for JPG, PNG, WebP, GIF and TIFF ImageMagick also compares a hash of the decoded pixels before and after.\n- RAW files are inspect-only: deleting their metadata can make them undecodable.\n\nMetadata is only one way photos leak information: faces, street signs and reflections in the picture itself are not removed.",
        "tags": [
          "media"
        ],
        "x-mcp-tool": "exif_inspector_cleaner",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ExifInspectorCleanerInput"
              },
              "examples": {
                "example1": {
                  "summary": "JPEG with camera and GPS tags → remove all",
                  "value": {
                    "file": {
                      "filename": "holiday.jpg",
                      "contentType": "image/jpeg",
                      "contentBase64": "/9j/4AAQSkZJRgABAQAAAAAAAAD/4QFgRXhpZgAATU0AKgAAAAgACAEPAAIAAAALAAAAbgEQAAIAAAAFAAAAegEaAAUAAAABAAAAgAEbAAUAAAABAAAAiAEoAAMAAAABAAEAAAITAAMAAAABAAEAAIdpAAQAAAABAAAAkIglAAQAAAABAAAA5gAAAABFeGFtcGxlQ2FtAABYMTAwAAAAAAAAAAAAAQAAAAAAAAABAAWQAAAHAAAABDAyMzKQAwACAAAAFAAAANKRAQAHAAAABAECAwCgAAAHAAAABDAxMDCgAQADAAAAAf//AAAAAAAAMjAyNDowNTowMSAxMjowMDowMAAABQAAAAEAAAAEAgMAAAABAAIAAAACTgAAAAACAAUAAAADAAABKAADAAIAAAACRQAAAAAEAAUAAAADAAABQAAAAAAAAAAwAAAAAQAAAAgAAAABAAAAQgAAAAUAAAALAAAAAQAAACIAAAABAAAAHgAAAAH/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4NDhwQEBw7KCIoOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozv/wAARCAAQABADASIAAhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAAAAX/xAAUEAEAAAAAAAAAAAAAAAAAAAAA/8QAFAEBAAAAAAAAAAAAAAAAAAAABf/EABQRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/AKoBga//2Q=="
                    },
                    "action": "all"
                  }
                },
                "example2": {
                  "summary": "Remove only the GPS location",
                  "value": {
                    "file": {
                      "filename": "holiday.jpg",
                      "contentType": "image/jpeg",
                      "contentBase64": "/9j/4AAQSkZJRgABAQAAAAAAAAD/4QFgRXhpZgAATU0AKgAAAAgACAEPAAIAAAALAAAAbgEQAAIAAAAFAAAAegEaAAUAAAABAAAAgAEbAAUAAAABAAAAiAEoAAMAAAABAAEAAAITAAMAAAABAAEAAIdpAAQAAAABAAAAkIglAAQAAAABAAAA5gAAAABFeGFtcGxlQ2FtAABYMTAwAAAAAAAAAAAAAQAAAAAAAAABAAWQAAAHAAAABDAyMzKQAwACAAAAFAAAANKRAQAHAAAABAECAwCgAAAHAAAABDAxMDCgAQADAAAAAf//AAAAAAAAMjAyNDowNTowMSAxMjowMDowMAAABQAAAAEAAAAEAgMAAAABAAIAAAACTgAAAAACAAUAAAADAAABKAADAAIAAAACRQAAAAAEAAUAAAADAAABQAAAAAAAAAAwAAAAAQAAAAgAAAABAAAAQgAAAAUAAAALAAAAAQAAACIAAAABAAAAHgAAAAH/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4NDhwQEBw7KCIoOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozv/wAARCAAQABADASIAAhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAAAAX/xAAUEAEAAAAAAAAAAAAAAAAAAAAA/8QAFAEBAAAAAAAAAAAAAAAAAAAABf/EABQRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/AKoBga//2Q=="
                    },
                    "action": "gps"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExifInspectorCleanerResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/heic-raw-converter/calculate": {
      "post": {
        "operationId": "calculateHeicRawConverter",
        "summary": "Convert iPhone HEIC, AVIF and camera RAW (CR2, CR3, NEF, ARW, DNG…) to JPG, PNG or WebP.",
        "description": "Decodes HEIC/HEIF and AVIF photos with libheif and camera RAW files with LibRaw, applies the camera rotation and saves a JPG, PNG or WebP at the quality you choose. Shows the camera, lens and exposure details, and keeps or removes the EXIF metadata as you prefer.\n\nMethodology:\n- The file type is detected from its content: HEIC/HEIF and AVIF by their ISO-BMFF brand, RAW by its TIFF/ORF/RW2/RAF/CR3 signature (for TIFF-based RAW such as NEF/ARW the file extension decides between RAW and plain TIFF).\n- HEIC/HEIF and AVIF are decoded with libheif (heif-convert/heif-dec), which applies the rotation and mirroring stored in the file. RAW files are developed with LibRaw (dcraw_emu): demosaicing (AHD), camera or automatic white balance, sRGB output, 8 bits per channel.\n- ImageMagick encodes JPG/PNG; WebP is encoded with libwebp (cwebp) when installed. Width, height and pixel count are checked before decoding (limit 100 megapixels).\n- With \"Keep EXIF\" on, exiftool copies EXIF/XMP/IPTC from the original into the new file (without embedded previews) and resets the Orientation tag when the pixels were rotated. Otherwise the output carries no metadata at all.\n- RAW development here is a neutral default rendering. A dedicated RAW editor (Lightroom, darktable, RawTherapee) gives more control over exposure, noise and colour.\n\nKeep your original HEIC/RAW file: converting to JPG or WebP discards detail and dynamic range.",
        "tags": [
          "media"
        ],
        "x-mcp-tool": "heic_raw_converter",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/HeicRawConverterInput"
              },
              "examples": {
                "example1": {
                  "summary": "AVIF photo to JPG",
                  "value": {
                    "file": {
                      "filename": "photo.avif",
                      "contentType": "image/avif",
                      "contentBase64": "AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUEAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAAC0AAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAABAAAAAMAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgSAAAAAAABNjb2xybmNseAABAAIABoAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAADVtZGF0EgAKCDgM/thAQIGkMh8YAAooooQAxC02adqijwo4ID0p6Pgn+VaHUuOCSvH4"
                    },
                    "format": "jpeg",
                    "quality": 85
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HeicRawConverterResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/image-compressor/calculate": {
      "post": {
        "operationId": "calculateImageCompressor",
        "summary": "Shrink JPG, PNG, WebP, AVIF or GIF images: convert, resize, strip metadata and compare sizes.",
        "description": "Re-encodes an image as WebP, AVIF, JPEG or PNG at the quality you choose, optionally scales it down to a maximum width or height and removes metadata such as GPS location. Shows the before/after size, the saving and the new dimensions, with a preview and a download.\n\nMethodology:\n- The file type is detected from its first bytes, not from the file name; only JPEG, PNG, WebP, AVIF and GIF are accepted. For animated GIFs only the first frame is used.\n- ImageMagick decodes the image, applies the EXIF orientation, optionally scales it down (never up) to fit the maximum width/height, and encodes it in the chosen format. AVIF is encoded with libavif (avifenc) when it is installed.\n- Quality is passed to the encoder as is (1–100). PNG output is lossless, so quality does not apply; PNG is usually larger than WebP/AVIF for photos.\n- With \"Remove metadata\" on, EXIF/XMP/IPTC data (including GPS location and camera details), comments and embedded profiles are removed. Timestamps are never written, so the same input always gives the same file.\n- Files are processed in a private temporary folder that is deleted right after processing. The result is kept for about 2 hours so you can download it, then deleted.\n\nLossy formats (WebP, AVIF, JPEG) discard detail; keep your original.",
        "tags": [
          "media"
        ],
        "x-mcp-tool": "image_compressor",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ImageCompressorInput"
              },
              "examples": {
                "example1": {
                  "summary": "PNG gradient to WebP",
                  "value": {
                    "file": {
                      "filename": "gradient.png",
                      "contentType": "image/png",
                      "contentBase64": "iVBORw0KGgoAAAANSUhEUgAAADAAAAAgEAIAAACLJrAIAAAAvElEQVRo3u3ZIRLDMAxE0XZmPSqzUA4W3h40uVRwQgqEJcEE/HcCg7W1tt/Lsq7H8UJCNsd2fe9exnPJXPv5u3sZz0WCGrI5SFBBNrWdJCgl87FdJCgVW4wEpWRzbJxBOZmLKVZgijVii5GglGyOnSmWkzk9qBJXDRKUogc19HHRgwpxSJOgFE26IXN6UEU2RQ8q0KQb3MUa8WBGglLx5EqCUvSgRox5EpTiV6PBe1CDHtSQOT2oIpv8alT+GThGqh2cdAQAAAAASUVORK5CYII="
                    },
                    "format": "webp",
                    "quality": 75
                  }
                },
                "example2": {
                  "summary": "JPEG photo to a smaller JPEG, max 64 px wide",
                  "value": {
                    "file": {
                      "filename": "sunset.jpg",
                      "contentType": "image/jpeg",
                      "contentBase64": "/9j/4AAQSkZJRgABAQAAAAAAAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCABAAGADAREAAhEBAxEB/8QAGgABAQEBAQEBAAAAAAAAAAAABgUEAAIDCP/EAB8QAAICAgMBAQEAAAAAAAAAAAEEABECIQMFMTISIv/EABkBAQEBAQEBAAAAAAAAAAAAAAYFBAADB//EAB4RAAIDAQEBAQEBAAAAAAAAAAAEAQIDETESIUFh/9oADAMBAAIRAxEAPwD8jz7wBzUquc8rImFreKRyDYvj9T2S2mndahpprhfWWLKqV1qHmXC5gqU+BCwP5kbZ0q5KGrHr9eTDZ7/TXVM7Lr9eTqvf6dZMy86FA/zN2Lpk1UJjSVXqWVnCVuqRnE6vUQqtdIbKxEbXOGVgRKrvF45JAYx+Z7Blm4xnrjw/eYE89LfFenpnX6sXEV/NQ07vzpfUxECSt1qFHGRIrgXU07rUMNNcECyxYXRsfMgMO8/pbxVN2HX2PmTLv/vpvqmdn19D5nUf/fTrJmFhGh8ymu73+mDZUjuJ1epfVa6RGViE6rV6idNkPtYB95f3UVpb94G28SHyYfjMiJc7fdekDSvzY0JYfrK5lcvyOGhWvZEaHF5B72vooUzEiHADWoQd2FCmQiRXBrUJOsc6JlcS8mndahZtvghWW6VeJAEfMh6vckr5p9g7lQAHzOye7J2ifIJTidXqXFG+khlbhBeXAvUUpMd4HmsQ6/wAXqLUtgy3kG3+L2L0dfAu3mHHcPzlcYJ37HAu1Xkn168eTwfk9048E3X4jUFv29FScCbr8RqDXreipOom6/AGoNfvP6Kk6iVDiBqDXtZgUp5xIhUUGYAAhVpqaSJF14tBzagwBBE5VqbycwvFYDz/ABAXFSOsyG3M4gNdhgBcZIXn8CzlQz2GI3GSNvAq5UM9hiNxkhbwKuR6GewHsaIyFXI9O68+Tn4OTnwTdfkNQW/X0VJyJuvyGoNer6Kk7Cbr8wKg1+k/oqTsJUOUCoNeymRSnpECFRsYAEGFWlZvIkXYisHNtjMEkzlVZpJzDEWgPP8AKDcVI5TAbc0iQ12GYNxkhSfwLOWDPYZDcZI18Crlgz2GQ3GSFfAq5PoZ7A+xojAVcn0+SWf5yqe7lOx08FbckRocvkHvZeihTQSIc4FbhB3EUKaiJFgCtwk6v3omV2LyblVuFm1OiFZnhV4nwB9SHqj2Svm5yDuV8EfU7JHknaOdglOOXe5cUU4SGWekF5gG9xSkvzgea2Dr/ODe4tSxDLeobf5fYvRy8C7egcdz/WVRgnTkdC7VuyZ+PP8AGYM1aV+68M+dvmxcRY83DTuHel9TYQJNVW4UcWEiu5dTcqtww0r0QLMlhd6h9SAwl3+FvFo3YdhQ+pMuh++G+rh2fYWPqdRD98Os4YWHrH1Ka6XP4YNmiO45d7l9VXhEZZITrV3uJ01g+1uH3mPdxWlhzgbb2IfJn+8yYlzr8V4QNLfVjzPQ8zUqwcMqJmFrCLx2DYvt8zyS2m5VbhppXpfWZLKrtVuHmUy5g0U+B+gP6kbZIq5NmrHsNezDZH/DXVw7LsNezqo/4dZwy879g/1N2KRk1bJjTt3uWVkyVu0RnHLvcQqq8IbLJEbYOeVAxKrhFI7JAY2+p5Blm4xn/9k="
                    },
                    "format": "jpeg",
                    "quality": 60,
                    "maxWidth": 64
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImageCompressorResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/image-upscaler/calculate": {
      "post": {
        "operationId": "calculateImageUpscaler",
        "summary": "Enlarge images 2×, 3× or 4× with classic Lanczos/Mitchell filters and sharpening (no AI).",
        "description": "Enlarges a small image by 2, 3 or 4 times (up to 16 megapixels) with high-quality classic resampling filters, optional noise reduction before and unsharp-mask sharpening after. A side-by-side crop compares plain pixel enlargement with the result. This is classic interpolation, not an AI upscaler: it cannot invent detail that is not in the original.\n\nMethodology:\n- Classic (non-AI) upscaling: every new pixel is a weighted average of nearby original pixels. Lanczos, Mitchell and Catmull-Rom are separable windowed filters; \"EWA Lanczos Sharp\" uses a cylindrical (elliptical weighted average) filter that produces fewer staircase artefacts on diagonal edges.\n- Optional noise reduction runs before enlarging (so noise is not magnified): despeckle, enhance or a 3×3 median. Optional unsharp-mask sharpening runs after enlarging to counter the softness that interpolation causes.\n- The image is turned upright from its EXIF orientation, resized in linear light (to avoid darkened edges), converted back to sRGB and encoded. The output is limited to 16 megapixels.\n- What AI upscalers do differently: models such as Real-ESRGAN or SwinIR are neural networks trained on millions of image pairs. They hallucinate plausible texture (hair, foliage, text strokes) that is not in the original. That looks sharper, but it can invent wrong details, alter faces and change text. Classic filters never add information; they only interpolate it, so results look softer but stay faithful.\n\nEnlarging cannot recover detail that was never captured. For prints, prefer the original high-resolution file if you have it.",
        "tags": [
          "media"
        ],
        "x-mcp-tool": "image_upscaler",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ImageUpscalerInput"
              },
              "examples": {
                "example1": {
                  "summary": "Small logo 4× with Lanczos and light sharpening",
                  "value": {
                    "file": {
                      "filename": "logo.png",
                      "contentType": "image/png",
                      "contentBase64": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAQAQMAAAA26i3WAAAABlBMVEX4+PgWUvBKqxVnAAAAEklEQVQI12NgQAP8/z/gxWgAAPdHD/H1HpIcAAAAAElFTkSuQmCC"
                    },
                    "factor": "4",
                    "filter": "lanczos",
                    "sharpen": "light",
                    "format": "png"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImageUpscalerResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/mp3-tag-cover-editor/calculate": {
      "post": {
        "operationId": "calculateMp3TagCoverEditor",
        "summary": "Edit MP3 ID3 tags (title, artist, album, year…) and add, replace or remove the cover.",
        "description": "Shows the ID3 tags and album cover of an MP3, lets you edit title, artist, album, album artist, year, track, genre and comment, and adds, replaces or removes the cover image (PNG/JPG). Writes ID3v2.3 or v2.4 without re-encoding: the audio stays bit-identical, which the tool verifies.\n\nMethodology:\n- The file must be an MP3 by content (ID3 header or MPEG audio frame sync). ffprobe reads the existing tags and the attached picture.\n- ffmpeg copies the audio frames unchanged (-c copy), copies the existing tags (-map_metadata 0) and then sets each field you filled in (title, artist, album, album_artist, date, track, genre, comment). Empty fields keep their value; tags you mark for removal are cleared.\n- A new cover is checked by its content (PNG/JPG, max 5 MB) and stored as an APIC \"Cover (front)\" attached picture. Removing the cover drops the picture stream.\n- Afterwards the MD5 of the audio frames before and after is compared, and ffprobe reads the new tags back for the report.",
        "tags": [
          "media"
        ],
        "x-mcp-tool": "mp3_tag_cover_editor",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Mp3TagCoverEditorInput"
              },
              "examples": {
                "example1": {
                  "summary": "Set album and year, add a cover",
                  "value": {
                    "file": {
                      "filename": "tone.mp3",
                      "contentType": "audio/mpeg",
                      "contentBase64": "SUQzAwAAAAAANFRJVDIAAAALAAAAVGVzdCB0b25lAFRQRTEAAAALAAAAdXNlZnVsd2ViAAAAAAAAAAAAAAD/4zjAAAAAAAAAAAAASW5mbwAAAA8AAAAJAAADYABVVVVVVVVVVVVVVWpqampqampqampqgICAgICAgICAgICVlZWVlZWVlZWVlaqqqqqqqqqqqqqqwMDAwMDAwMDAwMDV1dXV1dXV1dXV1erq6urq6urq6urq//////////////8AAAAATGF2ZiBsYW1lAAAAAAAAAAAAAAAAJAJgAAAAAAAAA2DhWsr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4xjEAAyokqh5SAAAD22/4d3d3v/RESv5d3f5SSwbgLgLgLg3PlAxw/yhz9/R7+j38HAxkAffWBDmgH+Ud39CgQkKRFiBEz//4xjECA3w6qDBlDgA5MkBJoc7/EBhyQNsGAOBS4BzxgokpgaxKNMIQcg9HhsNv/x0ajU4GhL/hIGhKdBq////////////////4xjECw8QpjgB3gAA+GhGAAYBYAxfoGgIGBqDgYSYPhhOi9GJrekZAAshh+g1GCWCYAgOwqAOYCAAJbFkl+rfoA//b7/L5fX/4xjECQqwjo5YCbRi/n3qiICUpOT5DnL9WR4Ms63+X06P/v9H/+//+nJf+t9GXtsQBtdfrcl5/f+V1eIwQL/nESYRBr0i8sr/4xjEGQtIloJYCnZigON9/lP9n9b/T9v37q/9P2//1fRV///5O3qXQOATAhMCmwMhwSPQYQHRBgcjAEgOoWAuAIB4YAGRACL/4xjEJgpYpjQABvxEbLUb6v///jGAGAADfQMAIBwMCwEgEAvAxGjLAx9m1A6uxbA3pD+AwbAgAwDAJACBeAkAoj4ZgQohCDD/4xjENw04pkABVgAAAR/itBmDQVp/WLIJwRwGKJAwM/DsNjcZwDM5yDpBHgAgGAy0hSC/v8A3wDWMsT8L2PP//zMe5udL5uv/4xjEPRaRlozJlWgAL///+brMwdB8Bn//oB8BmiY1//9BMaaJuNf//3IVBd2AA//aqqp/9VVVOdqOJAwVLAwCARKyIBJV/QX/4xjEHQ1AmqR5xggBBn/0FCv8FBn/FBQp/xQYK/oKFHfiSf/9TEFNRTQuMSAoYWxwaGEgMClVVVVVVVVVVVVVVVVVVVVVVVU="
                    },
                    "album": "Test Signals",
                    "year": "2026",
                    "track": "1/2",
                    "coverAction": "replace",
                    "cover": {
                      "filename": "cover.png",
                      "contentType": "image/png",
                      "contentBase64": "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAFElEQVR4nGMUCXjHgA2wYBUdtBIAESEBcPFXW6IAAAAASUVORK5CYII="
                    }
                  }
                },
                "example2": {
                  "summary": "Read tags only (no changes)",
                  "value": {
                    "file": {
                      "filename": "tone.mp3",
                      "contentType": "audio/mpeg",
                      "contentBase64": "SUQzAwAAAAAANFRJVDIAAAALAAAAVGVzdCB0b25lAFRQRTEAAAALAAAAdXNlZnVsd2ViAAAAAAAAAAAAAAD/4zjAAAAAAAAAAAAASW5mbwAAAA8AAAAJAAADYABVVVVVVVVVVVVVVWpqampqampqampqgICAgICAgICAgICVlZWVlZWVlZWVlaqqqqqqqqqqqqqqwMDAwMDAwMDAwMDV1dXV1dXV1dXV1erq6urq6urq6urq//////////////8AAAAATGF2ZiBsYW1lAAAAAAAAAAAAAAAAJAJgAAAAAAAAA2DhWsr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4xjEAAyokqh5SAAAD22/4d3d3v/RESv5d3f5SSwbgLgLgLg3PlAxw/yhz9/R7+j38HAxkAffWBDmgH+Ud39CgQkKRFiBEz//4xjECA3w6qDBlDgA5MkBJoc7/EBhyQNsGAOBS4BzxgokpgaxKNMIQcg9HhsNv/x0ajU4GhL/hIGhKdBq////////////////4xjECw8QpjgB3gAA+GhGAAYBYAxfoGgIGBqDgYSYPhhOi9GJrekZAAshh+g1GCWCYAgOwqAOYCAAJbFkl+rfoA//b7/L5fX/4xjECQqwjo5YCbRi/n3qiICUpOT5DnL9WR4Ms63+X06P/v9H/+//+nJf+t9GXtsQBtdfrcl5/f+V1eIwQL/nESYRBr0i8sr/4xjEGQtIloJYCnZigON9/lP9n9b/T9v37q/9P2//1fRV///5O3qXQOATAhMCmwMhwSPQYQHRBgcjAEgOoWAuAIB4YAGRACL/4xjEJgpYpjQABvxEbLUb6v///jGAGAADfQMAIBwMCwEgEAvAxGjLAx9m1A6uxbA3pD+AwbAgAwDAJACBeAkAoj4ZgQohCDD/4xjENw04pkABVgAAAR/itBmDQVp/WLIJwRwGKJAwM/DsNjcZwDM5yDpBHgAgGAy0hSC/v8A3wDWMsT8L2PP//zMe5udL5uv/4xjEPRaRlozJlWgAL///+brMwdB8Bn//oB8BmiY1//9BMaaJuNf//3IVBd2AA//aqqp/9VVVOdqOJAwVLAwCARKyIBJV/QX/4xjEHQ1AmqR5xggBBn/0FCv8FBn/FBQp/xQYK/oKFHfiSf/9TEFNRTQuMSAoYWxwaGEgMClVVVVVVVVVVVVVVVVVVVVVVVU="
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Mp3TagCoverEditorResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/subtitle-studio/calculate": {
      "post": {
        "operationId": "calculateSubtitleStudio",
        "summary": "Convert SRT, VTT, ASS and SBV; shift, re-sync, fix overlaps, wrap lines and check CPS.",
        "description": "Parses SRT, WebVTT, ASS/SSA (basic) and YouTube SBV subtitles and converts between them. Shift all times, re-sync by two reference points (fixes drifting subtitles), fix overlaps with a minimum gap, wrap or merge lines, remove hearing-impaired tags like [music] or (sighs), and get a reading-speed (characters per second) report and validation errors with line numbers.\n\nMethodology:\n- The format is detected from the content (WEBVTT header, [Script Info]/Dialogue lines, \"-->\" timing lines, or SBV \"start,end\" lines). Files are decoded as UTF-8 or UTF-16 with BOM, falling back to Windows-1252.\n- Each block is validated: missing or out-of-sequence numbers, malformed timing lines, end before start, empty cues, cues longer than 10 s and overlaps are reported with the line number in your file. Broken blocks are skipped, not guessed.\n- Operations run in this order: remove hearing-impaired tags → merge lines → wrap/split long lines → two-point sync → shift → fix overlaps. Two-point sync maps time linearly: t′ = T₁ + (t − S₁) × (T₂ − T₁) ÷ (S₂ − S₁), where S are the current and T the wanted start times of the two reference cues; it corrects both offset and drift (frame-rate mismatch).\n- Line wrapping first tries two balanced lines split near the middle, otherwise wraps greedily; cues needing more lines than allowed are split into consecutive cues with time shared by text length.\n- Reading speed = visible characters (without markup and line breaks) ÷ display time in seconds. ASS output uses one default style; ASS input styles, positions and effects are dropped (italic/bold are kept as <i>/<b>). SRT keeps <i>, <b> and <u>.",
        "tags": [
          "media"
        ],
        "x-mcp-tool": "subtitle_studio",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SubtitleStudioInput"
              },
              "examples": {
                "example1": {
                  "summary": "Clean an SRT: remove [music] tags, wrap at 42, fix overlaps, export WebVTT",
                  "value": {
                    "text": "1\n00:00:01,000 --> 00:00:03,200\n[MUSIC PLAYING]\nHello there!\n\n2\n00:00:03,000 --> 00:00:05,500\nJOHN: (sighs) This line is quite a bit longer than forty-two characters and needs wrapping.\n\n3\n00:00:06,000 --> 00:00:06,400\nToo fast to read comfortably.\n",
                    "outputFormat": "vtt",
                    "removeHi": true,
                    "maxLineLength": 42,
                    "fixOverlaps": true,
                    "minGapMs": 80
                  }
                },
                "example2": {
                  "summary": "Re-sync a drifting WebVTT by two points and save as SRT",
                  "value": {
                    "text": "WEBVTT\n\n00:00:10.000 --> 00:00:12.000\nFirst line\n\n00:00:20.000 --> 00:00:22.500\n<v Anna>Second line</v>\n\n00:01:00.000 --> 00:01:02.000\nThird line\n",
                    "outputFormat": "srt",
                    "syncCueA": 1,
                    "syncTimeA": "00:00:11.000",
                    "syncCueB": 3,
                    "syncTimeB": "00:01:03.500"
                  }
                },
                "example3": {
                  "summary": "Shift an SRT 1.5 s earlier",
                  "value": {
                    "text": "1\n00:00:01,000 --> 00:00:03,200\n[MUSIC PLAYING]\nHello there!\n\n2\n00:00:03,000 --> 00:00:05,500\nJOHN: (sighs) This line is quite a bit longer than forty-two characters and needs wrapping.\n\n3\n00:00:06,000 --> 00:00:06,400\nToo fast to read comfortably.\n",
                    "shiftMs": -1500
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SubtitleStudioResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/svg-optimizer/calculate": {
      "post": {
        "operationId": "calculateSvgOptimizer",
        "summary": "Shrink and sanitise SVG files: strip editor junk and scripts, round numbers, minify paths.",
        "description": "Optimises an SVG file in your choice of steps and shows how many bytes each one saved: removes comments, metadata and Inkscape/Illustrator editor data, hidden and empty elements, rounds numbers, rewrites path data in its shortest form and collapses whitespace. It also removes scripts, event handlers and external references, so the result is safe to embed.\n\nMethodology:\n- The SVG is parsed by a strict built-in XML parser (no external entities; internal DOCTYPE entities are expanded once with a size cap, which blocks \"billion laughs\" files). The document is re-serialised after every step, and the byte count before/after each step is reported.\n- Security (always on): removes <script>, <foreignObject>, <iframe>/<embed>/<object>, all on* event handlers, javascript: links, xml:base, CSS @import and url() references to other files, external href on <use>/<image>/<feImage> (raster data: URIs are kept), and animations that change href or event attributes. Links in <a> may point to http(s) or mailto only.\n- Clean-up: comments, XML declaration, DOCTYPE and processing instructions; <metadata>, RDF and editor namespaces (Inkscape, Sodipodi, Illustrator, Sketch, Serif, Figma); elements with display:none that nothing references; unreferenced children of <defs>; empty groups, and groups without attributes are unwrapped; unused namespace declarations, version and baseProfile.\n- Numbers in geometry attributes are rounded to the chosen decimal places (transforms to two more) with leading zeros dropped. Path data is re-written per segment in whichever of absolute or relative form is shorter, lines become H/V where possible, repeated command letters are omitted, and relative values are computed from the rounded current point so errors do not accumulate.\n- Whitespace between elements is removed except inside text elements and xml:space=\"preserve\". Removing width/height keeps (or creates) the viewBox so the graphic still scales.\n- The optimised SVG is offered as a download (served as an attachment, never rendered on this site).\n\nCheck the optimised file visually: very low precision can shift shapes, and removing width/height changes how some programs size the image.",
        "tags": [
          "media"
        ],
        "x-mcp-tool": "svg_optimizer",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SvgOptimizerInput"
              },
              "examples": {
                "example1": {
                  "summary": "Inkscape export with a script",
                  "value": {
                    "svgText": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<!-- Created with Inkscape (http://www.inkscape.org/) -->\n<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\" xmlns:sodipodi=\"http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd\" width=\"120.000000\" height=\"80.000000\" viewBox=\"0 0 120 80\" version=\"1.1\" onload=\"alert('hi')\">\n  <sodipodi:namedview id=\"namedview1\" pagecolor=\"#ffffff\" inkscape:zoom=\"2.0\"/>\n  <metadata id=\"metadata1\"><rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"/></metadata>\n  <script>alert('x')</script>\n  <g inkscape:label=\"Layer 1\" inkscape:groupmode=\"layer\" id=\"layer1\">\n    <rect x=\"10.0000001\" y=\"10.123456\" width=\"40.000000\" height=\"30.000000\" fill=\"#1652f0\" />\n    <path d=\"M 60.000000 10.000000 L 110.000000 10.000000 L 110.000000 40.000000 L 60.000000 40.000000 Z\" fill=\"#f0a500\" />\n    <circle cx=\"35.555555\" cy=\"60.444444\" r=\"12.0000\" fill=\"#0f8a5f\" style=\"display:none\" />\n    <g></g>\n  </g>\n</svg>\n",
                    "precision": 2
                  }
                },
                "example2": {
                  "summary": "Responsive icon (width/height removed)",
                  "value": {
                    "svgText": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\"><path d=\"M 2.0000 12.0000 L 12.0000 2.0000 L 22.0000 12.0000 L 12.0000 22.0000 Z\" fill=\"currentColor\"/></svg>",
                    "precision": 1,
                    "removeDimensions": true
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SvgOptimizerResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/audio-converter/calculate": {
      "post": {
        "operationId": "calculateAudioConverter",
        "summary": "Convert MP3, WAV, FLAC, Ogg, Opus, M4A and AIFF with bitrate and sample-rate control.",
        "description": "Converts audio between MP3, WAV, FLAC, Ogg Vorbis, Ogg Opus, M4A (AAC) and AIFF with ffmpeg. Choose constant bitrate or VBR quality, sample rate, mono/stereo and bit depth; tags and album covers are kept where the format supports them. Shows an ffprobe report before and after, with a player and a download.\n\nMethodology:\n- The container is detected from the first bytes of the file (not the name) and passed to ffmpeg explicitly, so playlists or files that reference other files are never opened.\n- ffprobe reads codec, sample rate, channels, bitrate, duration and tags before conversion. ffmpeg then decodes the first audio track and encodes it with LAME (MP3), the native AAC encoder (M4A), libvorbis, libopus, FLAC or PCM (WAV/AIFF).\n- Lossy formats use either a fixed/average bitrate or a VBR quality level (MP3 -q:a, Vorbis -q:a; Opus/AAC use VBR at a matching target bitrate). Lossless formats ignore the bitrate.\n- Opus only supports 8/12/16/24/48 kHz and MP3 at most 48 kHz; other rates are resampled to the nearest supported rate and you get a warning.\n- Tags are copied with -map_metadata 0; album covers are copied for MP3, M4A and FLAC (Ogg/WAV/AIFF covers are not supported by ffmpeg muxers). Encoder version tags and timestamps are not written, so the same input always gives the same file.\n- ffprobe reads the result again for the before/after report.\n\nConverting a lossy file (MP3, AAC, Ogg) to another lossy format or to a lossless format cannot restore lost quality.",
        "tags": [
          "media"
        ],
        "x-mcp-tool": "audio_converter",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AudioConverterInput"
              },
              "examples": {
                "example1": {
                  "summary": "MP3 tone to Ogg Opus 64 kbit/s, mono",
                  "value": {
                    "file": {
                      "filename": "tone.mp3",
                      "contentType": "audio/mpeg",
                      "contentBase64": "SUQzAwAAAAAANFRJVDIAAAALAAAAVGVzdCB0b25lAFRQRTEAAAALAAAAdXNlZnVsd2ViAAAAAAAAAAAAAAD/4zjAAAAAAAAAAAAASW5mbwAAAA8AAAAJAAADYABVVVVVVVVVVVVVVWpqampqampqampqgICAgICAgICAgICVlZWVlZWVlZWVlaqqqqqqqqqqqqqqwMDAwMDAwMDAwMDV1dXV1dXV1dXV1erq6urq6urq6urq//////////////8AAAAATGF2ZiBsYW1lAAAAAAAAAAAAAAAAJAJgAAAAAAAAA2DhWsr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4xjEAAyokqh5SAAAD22/4d3d3v/RESv5d3f5SSwbgLgLgLg3PlAxw/yhz9/R7+j38HAxkAffWBDmgH+Ud39CgQkKRFiBEz//4xjECA3w6qDBlDgA5MkBJoc7/EBhyQNsGAOBS4BzxgokpgaxKNMIQcg9HhsNv/x0ajU4GhL/hIGhKdBq////////////////4xjECw8QpjgB3gAA+GhGAAYBYAxfoGgIGBqDgYSYPhhOi9GJrekZAAshh+g1GCWCYAgOwqAOYCAAJbFkl+rfoA//b7/L5fX/4xjECQqwjo5YCbRi/n3qiICUpOT5DnL9WR4Ms63+X06P/v9H/+//+nJf+t9GXtsQBtdfrcl5/f+V1eIwQL/nESYRBr0i8sr/4xjEGQtIloJYCnZigON9/lP9n9b/T9v37q/9P2//1fRV///5O3qXQOATAhMCmwMhwSPQYQHRBgcjAEgOoWAuAIB4YAGRACL/4xjEJgpYpjQABvxEbLUb6v///jGAGAADfQMAIBwMCwEgEAvAxGjLAx9m1A6uxbA3pD+AwbAgAwDAJACBeAkAoj4ZgQohCDD/4xjENw04pkABVgAAAR/itBmDQVp/WLIJwRwGKJAwM/DsNjcZwDM5yDpBHgAgGAy0hSC/v8A3wDWMsT8L2PP//zMe5udL5uv/4xjEPRaRlozJlWgAL///+brMwdB8Bn//oB8BmiY1//9BMaaJuNf//3IVBd2AA//aqqp/9VVVOdqOJAwVLAwCARKyIBJV/QX/4xjEHQ1AmqR5xggBBn/0FCv8FBn/FBQp/xQYK/oKFHfiSf/9TEFNRTQuMSAoYWxwaGEgMClVVVVVVVVVVVVVVVVVVVVVVVU="
                    },
                    "format": "opus",
                    "bitrate": "64",
                    "channels": "1"
                  }
                },
                "example2": {
                  "summary": "MP3 to lossless FLAC with tags",
                  "value": {
                    "file": {
                      "filename": "tone.mp3",
                      "contentType": "audio/mpeg",
                      "contentBase64": "SUQzAwAAAAAANFRJVDIAAAALAAAAVGVzdCB0b25lAFRQRTEAAAALAAAAdXNlZnVsd2ViAAAAAAAAAAAAAAD/4zjAAAAAAAAAAAAASW5mbwAAAA8AAAAJAAADYABVVVVVVVVVVVVVVWpqampqampqampqgICAgICAgICAgICVlZWVlZWVlZWVlaqqqqqqqqqqqqqqwMDAwMDAwMDAwMDV1dXV1dXV1dXV1erq6urq6urq6urq//////////////8AAAAATGF2ZiBsYW1lAAAAAAAAAAAAAAAAJAJgAAAAAAAAA2DhWsr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4xjEAAyokqh5SAAAD22/4d3d3v/RESv5d3f5SSwbgLgLgLg3PlAxw/yhz9/R7+j38HAxkAffWBDmgH+Ud39CgQkKRFiBEz//4xjECA3w6qDBlDgA5MkBJoc7/EBhyQNsGAOBS4BzxgokpgaxKNMIQcg9HhsNv/x0ajU4GhL/hIGhKdBq////////////////4xjECw8QpjgB3gAA+GhGAAYBYAxfoGgIGBqDgYSYPhhOi9GJrekZAAshh+g1GCWCYAgOwqAOYCAAJbFkl+rfoA//b7/L5fX/4xjECQqwjo5YCbRi/n3qiICUpOT5DnL9WR4Ms63+X06P/v9H/+//+nJf+t9GXtsQBtdfrcl5/f+V1eIwQL/nESYRBr0i8sr/4xjEGQtIloJYCnZigON9/lP9n9b/T9v37q/9P2//1fRV///5O3qXQOATAhMCmwMhwSPQYQHRBgcjAEgOoWAuAIB4YAGRACL/4xjEJgpYpjQABvxEbLUb6v///jGAGAADfQMAIBwMCwEgEAvAxGjLAx9m1A6uxbA3pD+AwbAgAwDAJACBeAkAoj4ZgQohCDD/4xjENw04pkABVgAAAR/itBmDQVp/WLIJwRwGKJAwM/DsNjcZwDM5yDpBHgAgGAy0hSC/v8A3wDWMsT8L2PP//zMe5udL5uv/4xjEPRaRlozJlWgAL///+brMwdB8Bn//oB8BmiY1//9BMaaJuNf//3IVBd2AA//aqqp/9VVVOdqOJAwVLAwCARKyIBJV/QX/4xjEHQ1AmqR5xggBBn/0FCv8FBn/FBQp/xQYK/oKFHfiSf/9TEFNRTQuMSAoYWxwaGEgMClVVVVVVVVVVVVVVVVVVVVVVVU="
                    },
                    "format": "flac"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AudioConverterResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/video-converter/calculate": {
      "post": {
        "operationId": "calculateVideoConverter",
        "summary": "Convert video to MP4, WebM, MOV or MKV: resize, set quality and fps, or remux losslessly.",
        "description": "Converts MP4, MOV, MKV, WebM, AVI and other videos to MP4 (H.264/AAC), WebM (VP9/Opus), MOV or MKV. Cap the resolution, choose the quality (CRF) and frame rate, and keep the audio as is when the target container supports it. Remux-only mode changes the container without re-encoding when the codecs fit — fast and lossless.\n\nMethodology:\n- The container is detected from the file content and ffprobe reads codecs, resolution, frame rate, rotation and duration.\n- Remux mode copies the first video stream and all audio streams (-c copy) when the target container accepts the codecs (MP4/MOV: H.264, HEVC, AV1, VP9, MPEG-4 + AAC, MP3, AC-3, Opus, FLAC; WebM: VP8, VP9, AV1 + Opus, Vorbis; MKV: almost anything). Nothing is re-encoded, so quality is identical.\n- Re-encoding uses libx264 (preset veryfast, CRF, High profile, yuv420p) for MP4/MOV/MKV or libvpx-vp9 (constant quality CRF, cpu-used 5, row-mt) for WebM, with -threads 2 on our 2-vCPU server. Scaling keeps the aspect ratio with even dimensions and never enlarges; the frame rate is only ever reduced.\n- Audio is copied when the target container supports the codec, otherwise encoded as AAC 128 kbit/s (MP4/MOV/MKV) or Opus 96 kbit/s (WebM). Subtitles and data tracks are dropped.\n- Before encoding, the work is estimated from output pixels × frames; jobs that would exceed about 220 s of encoding are refused with a suggestion (lower resolution/fps, trim, or remux).",
        "tags": [
          "media"
        ],
        "x-mcp-tool": "video_converter",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VideoConverterInput"
              },
              "examples": {
                "example1": {
                  "summary": "MP4 test clip to WebM (VP9/Opus)",
                  "value": {
                    "file": {
                      "filename": "clip.mp4",
                      "contentType": "video/mp4",
                      "contentBase64": "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"
                    },
                    "format": "webm",
                    "quality": "low"
                  }
                },
                "example2": {
                  "summary": "Remux MP4 into MKV without re-encoding",
                  "value": {
                    "file": {
                      "filename": "clip.mp4",
                      "contentType": "video/mp4",
                      "contentBase64": "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"
                    },
                    "format": "mkv",
                    "remux": true
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VideoConverterResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/vertical-video-reframer/calculate": {
      "post": {
        "operationId": "calculateVerticalVideoReframer",
        "summary": "Reframe video to 9:16, 1:1, 4:5 or 16:9 by cropping, a blurred background or bars.",
        "description": "Turns landscape video into vertical 9:16 (Reels, Shorts, TikTok), square 1:1, 4:5 or 16:9. Crop with a centre, left, right or custom position, fit the whole picture on a blurred copy of itself, or add bars. Output H.264/AAC MP4 at 1080, 720, 540 or 360 px on the short side, with a first-frame preview.\n\nMethodology:\n- The output frame is derived from the aspect ratio and the short side (9:16 at 1080 → 1080×1920). Rotation metadata from phones is applied first.\n- Crop: the video is scaled to cover the frame and a frame-sized window is cut out; the position slides the window from left (0 %) to right (100 %), or top to bottom for sources taller than the frame. The report shows how much of the picture is kept.\n- Blurred background: a copy is scaled to cover the frame, shrunk to a quarter, box-blurred and scaled back up (cheap on CPU); the whole picture is fitted on top, centred.\n- Bars: the picture is fitted inside the frame and padded with black or white bars.\n- All sizes and offsets are computed as numbers in TypeScript before they go into the ffmpeg filtergraph. Encoding: libx264 veryfast CRF 21, AAC audio (copied when it already is AAC). A first frame of the result is saved as a JPEG preview.",
        "tags": [
          "media"
        ],
        "x-mcp-tool": "vertical_video_reframer",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VerticalVideoReframerInput"
              },
              "examples": {
                "example1": {
                  "summary": "4:3 clip to 9:16 on a blurred background (360×640)",
                  "value": {
                    "file": {
                      "filename": "clip.mp4",
                      "contentType": "video/mp4",
                      "contentBase64": "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"
                    },
                    "aspect": "9:16",
                    "mode": "blur",
                    "size": "360"
                  }
                },
                "example2": {
                  "summary": "Square crop, left position (360×360)",
                  "value": {
                    "file": {
                      "filename": "clip.mp4",
                      "contentType": "video/mp4",
                      "contentBase64": "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"
                    },
                    "aspect": "1:1",
                    "mode": "crop",
                    "position": "left",
                    "size": "360"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VerticalVideoReframerResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/video-compressor/calculate": {
      "post": {
        "operationId": "calculateVideoCompressor",
        "summary": "Shrink a video to a target size (two-pass) for e-mail, WhatsApp or Discord, or by quality.",
        "description": "Compresses a video to a target file size with a two-pass H.264 encode: the bitrate is calculated from the size and length, minus the audio budget, and the resolution is lowered automatically when the bitrate would be too thin. Presets for e-mail (25 MB), WhatsApp (16/100 MB) and Discord (10 MB), or a constant-quality CRF mode. Reports the achieved size.\n\nMethodology:\n- Target size: usable bits = (target − 2 % − 20 kB container overhead) × 8. Total bitrate = usable bits ÷ duration. Audio gets 128/96/64/48/32 kbit/s, at most about 20 % of the total; the rest goes to the video. If the video would get less than 50 kbit/s, the tool tells you the smallest workable target instead.\n- Resolution \"automatic\" picks the largest standard height (never above the source) where the video bitrate still gives at least 0.05 bits per pixel per frame — a common H.264 rule of thumb — and caps the frame rate at 30 fps when the bitrate is below 2 Mbit/s. The suggestion table shows bits per pixel for each step.\n- Two-pass libx264 (preset veryfast): pass 1 analyses the video, pass 2 distributes the bitrate where it is needed, which hits the size much more precisely than one pass. maxrate/bufsize limit spikes. Quality mode is a single CRF pass.\n- The output is MP4 (H.264/AAC, faststart for streaming). The achieved size is measured and compared with the target; two-pass is typically within a few percent.\n\nSize limits of e-mail providers and messengers change; check the current limit of your service. Very low targets make the picture blurry.",
        "tags": [
          "media"
        ],
        "x-mcp-tool": "video_compressor",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VideoCompressorInput"
              },
              "examples": {
                "example1": {
                  "summary": "Test clip to a 0.05 MB target (two-pass)",
                  "value": {
                    "file": {
                      "filename": "clip.mp4",
                      "contentType": "video/mp4",
                      "contentBase64": "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"
                    },
                    "mode": "size",
                    "preset": "custom",
                    "targetMb": 0.05
                  }
                },
                "example2": {
                  "summary": "Constant quality CRF 30",
                  "value": {
                    "file": {
                      "filename": "clip.mp4",
                      "contentType": "video/mp4",
                      "contentBase64": "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"
                    },
                    "mode": "quality",
                    "crf": 30
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VideoCompressorResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/video-cutter-merger/calculate": {
      "post": {
        "operationId": "calculateVideoCutterMerger",
        "summary": "Trim video, remove a section or join clips: lossless copy or frame-exact re-encode.",
        "description": "Cuts a video to a start and end time, removes a section from the middle, or joins up to 5 clips in order. Copy mode is fast and lossless but cuts on keyframes; exact mode re-encodes (H.264/AAC) for frame-accurate cuts. Clips with identical settings are joined losslessly with the concat demuxer, others are normalised to a common size and frame rate first.\n\nMethodology:\n- Copy mode (-c copy) never re-encodes, so it is fast and lossless — but a video can only start on a keyframe. ffprobe lists the keyframes, and the tool reports where the cut really starts (the last keyframe at or before your start time). End points are exact to the frame.\n- Exact mode trims with the trim/atrim filters and re-encodes with libx264 (veryfast, CRF 20) and AAC 160 kbit/s, so every cut lands on the requested frame.\n- Remove a section: the parts before and after are kept and joined — by copying both parts and joining them with the concat demuxer (copy mode; the second part starts at a keyframe) or with the concat filter (exact mode).\n- Merge: if all clips share codec, resolution, pixel format, frame rate and audio settings they are joined with the concat demuxer without re-encoding. Otherwise each clip is scaled and padded to the first clip's size (max 1080p), set to its frame rate, given silent audio if it has none, and joined with the concat filter.",
        "tags": [
          "media"
        ],
        "x-mcp-tool": "video_cutter_merger",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VideoCutterMergerInput"
              },
              "examples": {
                "example1": {
                  "summary": "Keep 0.2–0.8 s, frame-exact",
                  "value": {
                    "mode": "cut",
                    "file": {
                      "filename": "clip.mp4",
                      "contentType": "video/mp4",
                      "contentBase64": "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"
                    },
                    "start": "0.2",
                    "end": "0.8",
                    "accuracy": "exact"
                  }
                },
                "example2": {
                  "summary": "Lossless cut from 0.5 s (keyframe copy)",
                  "value": {
                    "mode": "cut",
                    "file": {
                      "filename": "clip.mp4",
                      "contentType": "video/mp4",
                      "contentBase64": "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"
                    },
                    "start": "0.5",
                    "accuracy": "copy"
                  }
                },
                "example3": {
                  "summary": "Merge a clip with itself (lossless concat)",
                  "value": {
                    "mode": "merge",
                    "file": {
                      "filename": "clip.mp4",
                      "contentType": "video/mp4",
                      "contentBase64": "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"
                    },
                    "file2": {
                      "filename": "clip.mp4",
                      "contentType": "video/mp4",
                      "contentBase64": "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"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VideoCutterMergerResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/video-to-gif-creator/calculate": {
      "post": {
        "operationId": "calculateVideoToGifCreator",
        "summary": "Turn a video clip into a high-quality GIF or animated WebP with fps, width and dithering.",
        "description": "Makes a GIF or animated WebP from up to 15 seconds of a video. Choose start, length, frame rate and width; GIFs use ffmpeg's two-stage palette (palettegen/paletteuse) with selectable dithering for much better colours than a default conversion. Shows the size, frame count and a preview.\n\nMethodology:\n- ffmpeg seeks to the start time and reads up to 15 seconds. The frames are resampled to the chosen fps and scaled with Lanczos to the width (never wider than the source); the height follows the aspect ratio.\n- GIF: palettegen builds an optimal palette of up to 256 colours from the clip (from all pixels or only changing ones), and paletteuse maps every frame to it with the chosen dithering. This is the standard two-stage method for high-quality GIFs.\n- Animated WebP uses libwebp (lossy, quality 1–100), which is typically several times smaller than a GIF of the same clip.\n- All values (times, fps, width, colours) are validated numbers or fixed option names before they go into the filtergraph.",
        "tags": [
          "media"
        ],
        "x-mcp-tool": "video_to_gif_creator",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VideoToGifCreatorInput"
              },
              "examples": {
                "example1": {
                  "summary": "1 s test clip to a 64 px GIF at 10 fps",
                  "value": {
                    "file": {
                      "filename": "clip.mp4",
                      "contentType": "video/mp4",
                      "contentBase64": "AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAAatbW9vdgAAAGxtdmhkAAAAAAAAAAAAAAAAAAA+gAAAPoAAAQAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAwt0cmFrAAAAXHRraGQAAAADAAAAAAAAAAAAAAABAAAAAAAAPoAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAAEAAAAAwAAAAAAAkZWR0cwAAABxlbHN0AAAAAAAAAAEAAD6AAAAIAAABAAAAAAKDbWRpYQAAACBtZGhkAAAAAAAAAAAAAAAAAAAoAAAAKABVxAAAAAAALWhkbHIAAAAAAAAAAHZpZGUAAAAAAAAAAAAAAABWaWRlb0hhbmRsZXIAAAACLm1pbmYAAAAUdm1oZAAAAAEAAAAAAAAAAAAAACRkaW5mAAAAHGRyZWYAAAAAAAAAAQAAAAx1cmwgAAAAAQAAAe5zdGJsAAAAvnN0c2QAAAAAAAAAAQAAAK5hdmMxAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAEAAMABIAAAASAAAAAAAAAABDExhdmMgbGlieDI2NAAAAAAAAAAAAAAAAAAAAAAAAAAAGP//AAAANGF2Y0MBZAAK/+EAGGdkAAqs2UR7ARAAAAMAEAAAAwFA8SJZYAEABWjvgxyw/fj4AAAAABBwYXNwAAAAAQAAAAEAAAAUYnRydAAAAAAAACy4AAAAAAAAABhzdHRzAAAAAAAAAAEAAAAKAAAEAAAAABhzdHNzAAAAAAAAAAIAAAABAAAABgAAAGBjdHRzAAAAAAAAAAoAAAABAAAIAAAAAAEAABQAAAAAAQAACAAAAAABAAAAAAAAAAEAAAQAAAAAAQAACAAAAAABAAAUAAAAAAEAAAgAAAAAAQAAAAAAAAABAAAEAAAAAChzdHNjAAAAAAAAAAIAAAABAAAAAgAAAAEAAAACAAAAAQAAAAEAAAA8c3RzegAAAAAAAAAAAAAACgAAA8MAAAAmAAAADAAAAAwAAAAMAAABRQAAACEAAAAMAAAADAAAAAwAAAA0c3RjbwAAAAAAAAAJAAAG3QAAC38AAAziAAAOEAAADqUAABDmAAARjAAAEp4AABMsAAAC8XRyYWsAAABcdGtoZAAAAAMAAAAAAAAAAAAAAAIAAAAAAAA+gAAAAAAAAAAAAAAAAQEAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAACRlZHRzAAAAHGVsc3QAAAAAAAAAAQAAPoAAAAQAAAEAAAAAAmltZGlhAAAAIG1kaGQAAAAAAAAAAAAAAAAAAD6AAABCgFXEAAAAAAAtaGRscgAAAAAAAAAAc291bgAAAAAAAAAAAAAAAFNvdW5kSGFuZGxlcgAAAAIUbWluZgAAABBzbWhkAAAAAAAAAAAAAAAkZGluZgAAABxkcmVmAAAAAAAAAAEAAAAMdXJsIAAAAAEAAAHYc3RibAAAAH5zdHNkAAAAAAAAAAEAAABubXA0YQAAAAAAAAABAAAAAAAAAAAAAQAQAAAAAD6AAAAAAAA2ZXNkcwAAAAADgICAJQACAASAgIAXQBUAAAAAAEZuAABGbgWAgIAFFAhW5QAGgICAAQIAAAAUYnRydAAAAAAAAEZuAABGbgAAACBzdHRzAAAAAAAAAAIAAAAQAAAEAAAAAAEAAAKAAAAAcHN0c2MAAAAAAAAACAAAAAEAAAABAAAAAQAAAAIAAAACAAAAAQAAAAQAAAABAAAAAQAAAAUAAAACAAAAAQAAAAYAAAABAAAAAQAAAAcAAAACAAAAAQAAAAgAAAABAAAAAQAAAAkAAAAFAAAAAQAAAFhzdHN6AAAAAAAAAAAAAAARAAAAuQAAALYAAAChAAAAmQAAAIkAAACJAAAAfQAAAH8AAACFAAAAgQAAAIUAAACCAAAAfgAAAIAAAACOAAAAjAAAAIIAAAA0c3RjbwAAAAAAAAAJAAAKxgAAC4sAAAzuAAAOHAAAD+oAABEHAAARmAAAEqoAABM4AAAAGnNncGQBAAAAcm9sbAAAAAIAAAAB//8AAAAcc2JncAAAAAByb2xsAAAAAQAAABEAAAABAAAAPXVkdGEAAAA1bWV0YQAAAAAAAAAhaGRscgAAAAAAAAAAbWRpcmFwcGwAAAAAAAAAAAAAAAAIaWxzdAAAAAhmcmVlAAAO/W1kYXQAAAKbBgX//5fcRem95tlIt5Ys2CDZI+7veDI2NCAtIGNvcmUgMTY1IC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENvcHlsZWZ0IDIwMDMtMjAyNSAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9wdGlvbnM6IGNhYmFjPTEgcmVmPTEgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MzoweDExMyBtZT1oZXggc3VibWU9MiBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj0wIG1lX3JhbmdlPTE2IGNocm9tYV9tZT0xIHRyZWxsaXM9MCA4eDhkY3Q9MSBjcW09MCBkZWFkem9uZT0yMSwxMSBmYXN0X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0wIHRocmVhZHM9MSBsb29rYWhlYWRfdGhyZWFkcz0xIHNsaWNlZF90aHJlYWRzPTAgbnI9MCBkZWNpbWF0ZT0xIGludGVybGFjZWQ9MCBibHVyYXlfY29tcGF0PTAgY29uc3RyYWluZWRfaW50cmE9MCBiZnJhbWVzPTMgYl9weXJhbWlkPTIgYl9hZGFwdD0xIGJfYmlhcz0wIGRpcmVjdD0xIHdlaWdodGI9MSBvcGVuX2dvcD0wIHdlaWdodHA9MSBrZXlpbnQ9NSBrZXlpbnRfbWluPTEgc2NlbmVjdXQ9NDAgaW50cmFfcmVmcmVzaD0wIHJjX2xvb2thaGVhZD01IHJjPWNyZiBtYnRyZWU9MSBjcmY9MzguMCBxY29tcD0wLjYwIHFwbWluPTAgcXBtYXg9NjkgcXBzdGVwPTQgaXBfcmF0aW89MS40MCBhcT0xOjEuMDAAgAAAASBliIQAR9I6DE+XmH8S+MUThkAmDt/AAaUe0TPuwtKuXPfJ/Uv5EhMrCwMZmvngBPORW4BTrY872aABEXimGiKPPKWi+0+uj6jq5nnFTehYc+fQ8y5nlLT4WoIA0sNC0tHvVic+jcZel4QejR0P/Dyza9DwFp6CutsOdBgwAaxz/SdU+kvYUtd94SXwbVpDTwd1C4rI3Xj8Ci05w9n3F44qDWVK/Ukh5vmjDnFK4HZ4e95RfDBgbiimr1nNMe0DXyzIaIhThpC+yt2tYHIYmERZnwlXDo+iSeZbNKrQ37Ytt8LssQ8EoVLxopyCRBD0LhMYBYhjH4OFgwmIKgdwmLbfLpXsvnW/NaIsJpEsRo3POmKzV11s/dcwt//LsMFATEsAAAAiQZokGIS/ipPPJIwyjL40VjHe2cC8anJOMxbuAI5xVPPxEAEgUKz0lkElu9/Pj78TW+JUm5EkbRCw7y859e7VzFmHSWjfOvifr32nY3ZPYXtr+o3U/1vZfwGbG5zh77JMC6LisTWrLcpGtYnHWGeUslJqsx0bHNX5rHNY59bKTSk0pNKVRlUZVKVSk0tNSNIzs8zzO0k0jSNIzs7PM7SM7SNJM8zzSTSTSNI0jOzs7RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRcAAAACEGeQkI7/6uBASCW2lF1ZiFrMNOLpZ/+H/PnrWpc1+n/p/5eRc1f7f+n/l7C5xP2/+P/Pgl3rQ5X2HeeeeeeeeeeY8wU7bwHFsCFT+PYHrjck+tndO9tG8Wdx3qCbJT7wB/Kh75UM+VDPl8qDAfLjQYD5fKKhYAE2z8KLdkpO39QeeapPkpc6LmF0WrabEL1N8p2EGCZQYJUDBKga8cmU4MDBITK4MDKCTi3d45rgclBC3p7ZMzJ5555555+bm4BBvCtLEKSCX3v+3z+/1GdNySS0iNJWroObP3cXa337vJ9aJ0j6z+B/W6NkGlshBYoyz9bwZSBRJ5hafsvFuKxXsGYVzFGU9T1BvNij14YYdsgtTjjjMyF7++gZPjMHffQH/jMM/voD/xmDvvoD/x8BPvCD/GYJ94VD4AT7+4Hx8B339w/8Zh5+iwfhaIff3UfgFWDSaFUXBBS4UILnFEd4AAAAAgBnmFEJf+xgADcMK0CtTkOAoNI//1+//8fnvS6uq63Va76zUqq4ywi0Yu6E3NcMKvnWWZeetZ6yzzwZVAA8JxwGUSghDfUGbcU3pHr16+HQ9aStqauiNKxtnpuja3ZSCs2qp4aIWM2kIUjCkpjdrRv7OiKuOnkZ6uwyjRrJ2YLDn601YSZsl94cC3Cw47f7q1YXHrs4JUS9TFoecHPOdBljwDaMKzMMYKhx3X/+f5//h53da3OK08cb1VRGXUgmLPttYrxtkEH2b9bYWfdfZ92Nommn6ABcXm3obyH37sa+vDF2di6ePCy90kkZ/pS0a2bePXBaiPDt9qpzlHwW7hOtN1LRI98pq9zKklhDZN3cyARVcfGI53nSplMKWKFhdkWmTE0MWlNF2OAAAAACAGeY0Ql/7GBANowrMxBeqEy//6X+v/6+0y80ZxVTFiZrLwMpWzTWXeLtC7K2TobHOatU9bcq7CmEAK86hVDlmoTappPhq0STSM7Cw9UZrR+cuPqst1EmrClLD32XqnCSaeFPr5tqDhmkffg1zzEKCwhoQtMCF3nHPu9qcaiqSrijleNGrNhQxaS98rsibloRQ4AAAFBZYiCACfRVincV3t/41s3ihhL/RSXWttt72R4j1YMiTYruZgrpfiBtmFrmK4nr+//ZgAAgAipXJ8mfL8EEJjG1Hm5gzT/CfGbZngHW+zYoHoTPTdkRTrf33t9WEYKox3zbKaOthv8IZCzmntUhduDczly+Tfa3kTikcuWo9EBtJIOQp1y0U9HHewAX7zcpPcL3dOqjXsJRtBYYKv2ZdVN0v19HH9zaxn03Kvdc3KqwkRXqpRSCDMSnttKGa6RIrJ+1ZeE3kEBK8S2gnsfy4Q050hu/k4fnFZ9o2XKSJRN0IQu1kh7vWJEJEGqbai4Dygq3EpTu3cCU8+HYDrFH77LYFL6w+n2KXdKLv5DOoi1sDf8jih6lADEq4/64Pd/rzIcfVZT/C+af52QKyyyfkugHxsndIA/DTMM5+fHHlB0o1o5AOIwrMwieal3f/9X/j/+HxV1qUdbxU1zIpUgPKU8qo2hbfEfzBSecNh9GZvnkAK+fr/gS8LpZ12Szr0UfqiMUc4OaIY/eQA1SUHOSmOgrLWLDIASkTuBjXmhOhw/8vfY26U40JKUhphXmfOQ1bVheGPRhUXhmunq0aNchFwA4jCtAxUojdZf/+v3//j9vE42cVxzUqEvKqK4DSmQtUDm7DbgsGvMj0pwXsal1EADI/HQbGXhC3IpoIGwKahvvR+l11Ei9GrnppWXohNRDObmvih53GpHVqlBOKa/ZBHXHAoEqotSSIgC5mnjKsTC5hbDNNBInaVd7rp9LdBwAAAAHUGaJBiEv4pVtmhz+OMuJp+q8OJq7KLcDWSUwxmBANwwqQUVQqP/+X8f/x+cZxF5rIyuudburqVoXHOsjxrabFkdi33lXge1eq794GHiii/F/99ccRQLIyMxNChfKeEECiD5TBPGUEISD54lCSIz0sLAwgGA0QSGSpI711J2STVoJm7SUUIVEAE6vXqRrHLaycQ5XVAiA2hlSF6zkapE0b1BPAAAAAhBnkJCM/+ngQDgMKzMM8OGf/1f7//x9cVVzd1q8rL1zrnVSpKERg0Yxa2cxZhzVqnb3ePeWteJapj4ADDW70YuCTRJNJM7SM6QzazZoQ3yVLk6lpdGwVy3i2aXXijtOrwrQpwzsphX+3MMLcEoIVKF1uR+ue71OulLttCNUHXbM6ydM12rfLW8HADoMK0DFUL9p//V/t/+763L14uVp41fPFK1Wts0Dp4UaaLSov6Mznu3o/aGm+uI2AC/dNKS6eaAkVzh9wONUX+DVzr4ae71pJXhw/cvcrTdovQvu7+1X7F3S6jy+2QiTygu5nRMFBKhiqmdl7tU4ry5TU5mKtM5llcwCgsVYE0JmjInI4AAAAAIAZ5hRCX/sYAA3jCszCGKlEatT//l/H/5fW7rUq80Zmr71vjIIIkdczlam+3G7JVH3xovnrpOjDoAZOgPrHVK4Ntyx2XWXa09cHTulGymz6Sccham7navPBeErHWTVb37Fo3sixzHcFpomKqglZEEyskqIvy6ZnjnG4mEXfdkTXbUnKnw3v+zstdwAAAACAGeY0Ql/7GAANowrMwxooRGnjj//T6//L2qvO5zw65TbjG+sqM0LKtm5rlw7mXjLmGMojEpF19mGnnCABkauhdhrw110v110kxG8nTxx1kexesix+NKxtlRpqnZWKE3z2FsX4o0rA9jvHvaFIyTT8oV+nr2rO12hOO17wJqKTUrF8LclZuAAOQwqQUFEZ3Fa//v/2//f8ZJeaqvauy2LUy4D01bMeG4XrXQcVtvVuM/tv6v1WNiii36pfDuYjRJQK4konXr+hm0/T6A4SKELAeWE9J5fS87DUrU8ENguhE7ACZWICIE37tIreUbQRmqhWIvxe7HebdEna6cKqpp2nLfcLgtYq4A5DCszCQxKcxDean/9T+//7vpXAma3AqVdVxiw1JTyrBpgsrr175JzdqC89kaipkAK4zhctCeQnlnHZpoq6qbBZi1w17FYUxeongaygg8eVgRpupSVqUSnHEU3ABm48lpoK4kk7qmBOZJZkTN3MyILms+506rfW3ZnUxhlL7PhguC2HsQf8Nv/NUgluHAASAwqCg7FQ0w/tWff9P9LqueEtJJEkiSJBxh8o+PtwMRrENB2R/b+i+qix+hv6ScsCwdurLEMbAHtwGB7Yhge2IYHtiGB7Yhge2IYHtiGB7Yhge2IUPWIUPWIUPWIUPWIUHrAFB6xCh6xCg9YAoPWAKD2wBQesAUHrAHD3AFB6wBQe4AoPWAKD3AH4ABLDChBZe9Zm+OMku5JJEkkkSJBR7nubUTTQgsshU00ILNTU1O1mmSaKOiySbI3nhyN54cjeeHI3nhyN54cjeeHI3nhyN5yyN5yyN5yyN5yyN5yyN+5fBvcvg3vD8G9y+De5fBvcvg3uXwb3L4N7l8G9y+De5fBvcvg3uXwb3L4N78"
                    },
                    "duration": 1,
                    "fps": 10,
                    "width": 64
                  }
                },
                "example2": {
                  "summary": "Same clip as animated WebP",
                  "value": {
                    "file": {
                      "filename": "clip.mp4",
                      "contentType": "video/mp4",
                      "contentBase64": "AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAAatbW9vdgAAAGxtdmhkAAAAAAAAAAAAAAAAAAA+gAAAPoAAAQAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAwt0cmFrAAAAXHRraGQAAAADAAAAAAAAAAAAAAABAAAAAAAAPoAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAAEAAAAAwAAAAAAAkZWR0cwAAABxlbHN0AAAAAAAAAAEAAD6AAAAIAAABAAAAAAKDbWRpYQAAACBtZGhkAAAAAAAAAAAAAAAAAAAoAAAAKABVxAAAAAAALWhkbHIAAAAAAAAAAHZpZGUAAAAAAAAAAAAAAABWaWRlb0hhbmRsZXIAAAACLm1pbmYAAAAUdm1oZAAAAAEAAAAAAAAAAAAAACRkaW5mAAAAHGRyZWYAAAAAAAAAAQAAAAx1cmwgAAAAAQAAAe5zdGJsAAAAvnN0c2QAAAAAAAAAAQAAAK5hdmMxAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAEAAMABIAAAASAAAAAAAAAABDExhdmMgbGlieDI2NAAAAAAAAAAAAAAAAAAAAAAAAAAAGP//AAAANGF2Y0MBZAAK/+EAGGdkAAqs2UR7ARAAAAMAEAAAAwFA8SJZYAEABWjvgxyw/fj4AAAAABBwYXNwAAAAAQAAAAEAAAAUYnRydAAAAAAAACy4AAAAAAAAABhzdHRzAAAAAAAAAAEAAAAKAAAEAAAAABhzdHNzAAAAAAAAAAIAAAABAAAABgAAAGBjdHRzAAAAAAAAAAoAAAABAAAIAAAAAAEAABQAAAAAAQAACAAAAAABAAAAAAAAAAEAAAQAAAAAAQAACAAAAAABAAAUAAAAAAEAAAgAAAAAAQAAAAAAAAABAAAEAAAAAChzdHNjAAAAAAAAAAIAAAABAAAAAgAAAAEAAAACAAAAAQAAAAEAAAA8c3RzegAAAAAAAAAAAAAACgAAA8MAAAAmAAAADAAAAAwAAAAMAAABRQAAACEAAAAMAAAADAAAAAwAAAA0c3RjbwAAAAAAAAAJAAAG3QAAC38AAAziAAAOEAAADqUAABDmAAARjAAAEp4AABMsAAAC8XRyYWsAAABcdGtoZAAAAAMAAAAAAAAAAAAAAAIAAAAAAAA+gAAAAAAAAAAAAAAAAQEAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAACRlZHRzAAAAHGVsc3QAAAAAAAAAAQAAPoAAAAQAAAEAAAAAAmltZGlhAAAAIG1kaGQAAAAAAAAAAAAAAAAAAD6AAABCgFXEAAAAAAAtaGRscgAAAAAAAAAAc291bgAAAAAAAAAAAAAAAFNvdW5kSGFuZGxlcgAAAAIUbWluZgAAABBzbWhkAAAAAAAAAAAAAAAkZGluZgAAABxkcmVmAAAAAAAAAAEAAAAMdXJsIAAAAAEAAAHYc3RibAAAAH5zdHNkAAAAAAAAAAEAAABubXA0YQAAAAAAAAABAAAAAAAAAAAAAQAQAAAAAD6AAAAAAAA2ZXNkcwAAAAADgICAJQACAASAgIAXQBUAAAAAAEZuAABGbgWAgIAFFAhW5QAGgICAAQIAAAAUYnRydAAAAAAAAEZuAABGbgAAACBzdHRzAAAAAAAAAAIAAAAQAAAEAAAAAAEAAAKAAAAAcHN0c2MAAAAAAAAACAAAAAEAAAABAAAAAQAAAAIAAAACAAAAAQAAAAQAAAABAAAAAQAAAAUAAAACAAAAAQAAAAYAAAABAAAAAQAAAAcAAAACAAAAAQAAAAgAAAABAAAAAQAAAAkAAAAFAAAAAQAAAFhzdHN6AAAAAAAAAAAAAAARAAAAuQAAALYAAAChAAAAmQAAAIkAAACJAAAAfQAAAH8AAACFAAAAgQAAAIUAAACCAAAAfgAAAIAAAACOAAAAjAAAAIIAAAA0c3RjbwAAAAAAAAAJAAAKxgAAC4sAAAzuAAAOHAAAD+oAABEHAAARmAAAEqoAABM4AAAAGnNncGQBAAAAcm9sbAAAAAIAAAAB//8AAAAcc2JncAAAAAByb2xsAAAAAQAAABEAAAABAAAAPXVkdGEAAAA1bWV0YQAAAAAAAAAhaGRscgAAAAAAAAAAbWRpcmFwcGwAAAAAAAAAAAAAAAAIaWxzdAAAAAhmcmVlAAAO/W1kYXQAAAKbBgX//5fcRem95tlIt5Ys2CDZI+7veDI2NCAtIGNvcmUgMTY1IC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENvcHlsZWZ0IDIwMDMtMjAyNSAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9wdGlvbnM6IGNhYmFjPTEgcmVmPTEgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MzoweDExMyBtZT1oZXggc3VibWU9MiBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj0wIG1lX3JhbmdlPTE2IGNocm9tYV9tZT0xIHRyZWxsaXM9MCA4eDhkY3Q9MSBjcW09MCBkZWFkem9uZT0yMSwxMSBmYXN0X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0wIHRocmVhZHM9MSBsb29rYWhlYWRfdGhyZWFkcz0xIHNsaWNlZF90aHJlYWRzPTAgbnI9MCBkZWNpbWF0ZT0xIGludGVybGFjZWQ9MCBibHVyYXlfY29tcGF0PTAgY29uc3RyYWluZWRfaW50cmE9MCBiZnJhbWVzPTMgYl9weXJhbWlkPTIgYl9hZGFwdD0xIGJfYmlhcz0wIGRpcmVjdD0xIHdlaWdodGI9MSBvcGVuX2dvcD0wIHdlaWdodHA9MSBrZXlpbnQ9NSBrZXlpbnRfbWluPTEgc2NlbmVjdXQ9NDAgaW50cmFfcmVmcmVzaD0wIHJjX2xvb2thaGVhZD01IHJjPWNyZiBtYnRyZWU9MSBjcmY9MzguMCBxY29tcD0wLjYwIHFwbWluPTAgcXBtYXg9NjkgcXBzdGVwPTQgaXBfcmF0aW89MS40MCBhcT0xOjEuMDAAgAAAASBliIQAR9I6DE+XmH8S+MUThkAmDt/AAaUe0TPuwtKuXPfJ/Uv5EhMrCwMZmvngBPORW4BTrY872aABEXimGiKPPKWi+0+uj6jq5nnFTehYc+fQ8y5nlLT4WoIA0sNC0tHvVic+jcZel4QejR0P/Dyza9DwFp6CutsOdBgwAaxz/SdU+kvYUtd94SXwbVpDTwd1C4rI3Xj8Ci05w9n3F44qDWVK/Ukh5vmjDnFK4HZ4e95RfDBgbiimr1nNMe0DXyzIaIhThpC+yt2tYHIYmERZnwlXDo+iSeZbNKrQ37Ytt8LssQ8EoVLxopyCRBD0LhMYBYhjH4OFgwmIKgdwmLbfLpXsvnW/NaIsJpEsRo3POmKzV11s/dcwt//LsMFATEsAAAAiQZokGIS/ipPPJIwyjL40VjHe2cC8anJOMxbuAI5xVPPxEAEgUKz0lkElu9/Pj78TW+JUm5EkbRCw7y859e7VzFmHSWjfOvifr32nY3ZPYXtr+o3U/1vZfwGbG5zh77JMC6LisTWrLcpGtYnHWGeUslJqsx0bHNX5rHNY59bKTSk0pNKVRlUZVKVSk0tNSNIzs8zzO0k0jSNIzs7PM7SM7SNJM8zzSTSTSNI0jOzs7RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRcAAAACEGeQkI7/6uBASCW2lF1ZiFrMNOLpZ/+H/PnrWpc1+n/p/5eRc1f7f+n/l7C5xP2/+P/Pgl3rQ5X2HeeeeeeeeeeY8wU7bwHFsCFT+PYHrjck+tndO9tG8Wdx3qCbJT7wB/Kh75UM+VDPl8qDAfLjQYD5fKKhYAE2z8KLdkpO39QeeapPkpc6LmF0WrabEL1N8p2EGCZQYJUDBKga8cmU4MDBITK4MDKCTi3d45rgclBC3p7ZMzJ5555555+bm4BBvCtLEKSCX3v+3z+/1GdNySS0iNJWroObP3cXa337vJ9aJ0j6z+B/W6NkGlshBYoyz9bwZSBRJ5hafsvFuKxXsGYVzFGU9T1BvNij14YYdsgtTjjjMyF7++gZPjMHffQH/jMM/voD/xmDvvoD/x8BPvCD/GYJ94VD4AT7+4Hx8B339w/8Zh5+iwfhaIff3UfgFWDSaFUXBBS4UILnFEd4AAAAAgBnmFEJf+xgADcMK0CtTkOAoNI//1+//8fnvS6uq63Va76zUqq4ywi0Yu6E3NcMKvnWWZeetZ6yzzwZVAA8JxwGUSghDfUGbcU3pHr16+HQ9aStqauiNKxtnpuja3ZSCs2qp4aIWM2kIUjCkpjdrRv7OiKuOnkZ6uwyjRrJ2YLDn601YSZsl94cC3Cw47f7q1YXHrs4JUS9TFoecHPOdBljwDaMKzMMYKhx3X/+f5//h53da3OK08cb1VRGXUgmLPttYrxtkEH2b9bYWfdfZ92Nommn6ABcXm3obyH37sa+vDF2di6ePCy90kkZ/pS0a2bePXBaiPDt9qpzlHwW7hOtN1LRI98pq9zKklhDZN3cyARVcfGI53nSplMKWKFhdkWmTE0MWlNF2OAAAAACAGeY0Ql/7GBANowrMxBeqEy//6X+v/6+0y80ZxVTFiZrLwMpWzTWXeLtC7K2TobHOatU9bcq7CmEAK86hVDlmoTappPhq0STSM7Cw9UZrR+cuPqst1EmrClLD32XqnCSaeFPr5tqDhmkffg1zzEKCwhoQtMCF3nHPu9qcaiqSrijleNGrNhQxaS98rsibloRQ4AAAFBZYiCACfRVincV3t/41s3ihhL/RSXWttt72R4j1YMiTYruZgrpfiBtmFrmK4nr+//ZgAAgAipXJ8mfL8EEJjG1Hm5gzT/CfGbZngHW+zYoHoTPTdkRTrf33t9WEYKox3zbKaOthv8IZCzmntUhduDczly+Tfa3kTikcuWo9EBtJIOQp1y0U9HHewAX7zcpPcL3dOqjXsJRtBYYKv2ZdVN0v19HH9zaxn03Kvdc3KqwkRXqpRSCDMSnttKGa6RIrJ+1ZeE3kEBK8S2gnsfy4Q050hu/k4fnFZ9o2XKSJRN0IQu1kh7vWJEJEGqbai4Dygq3EpTu3cCU8+HYDrFH77LYFL6w+n2KXdKLv5DOoi1sDf8jih6lADEq4/64Pd/rzIcfVZT/C+af52QKyyyfkugHxsndIA/DTMM5+fHHlB0o1o5AOIwrMwieal3f/9X/j/+HxV1qUdbxU1zIpUgPKU8qo2hbfEfzBSecNh9GZvnkAK+fr/gS8LpZ12Szr0UfqiMUc4OaIY/eQA1SUHOSmOgrLWLDIASkTuBjXmhOhw/8vfY26U40JKUhphXmfOQ1bVheGPRhUXhmunq0aNchFwA4jCtAxUojdZf/+v3//j9vE42cVxzUqEvKqK4DSmQtUDm7DbgsGvMj0pwXsal1EADI/HQbGXhC3IpoIGwKahvvR+l11Ei9GrnppWXohNRDObmvih53GpHVqlBOKa/ZBHXHAoEqotSSIgC5mnjKsTC5hbDNNBInaVd7rp9LdBwAAAAHUGaJBiEv4pVtmhz+OMuJp+q8OJq7KLcDWSUwxmBANwwqQUVQqP/+X8f/x+cZxF5rIyuudburqVoXHOsjxrabFkdi33lXge1eq794GHiii/F/99ccRQLIyMxNChfKeEECiD5TBPGUEISD54lCSIz0sLAwgGA0QSGSpI711J2STVoJm7SUUIVEAE6vXqRrHLaycQ5XVAiA2hlSF6zkapE0b1BPAAAAAhBnkJCM/+ngQDgMKzMM8OGf/1f7//x9cVVzd1q8rL1zrnVSpKERg0Yxa2cxZhzVqnb3ePeWteJapj4ADDW70YuCTRJNJM7SM6QzazZoQ3yVLk6lpdGwVy3i2aXXijtOrwrQpwzsphX+3MMLcEoIVKF1uR+ue71OulLttCNUHXbM6ydM12rfLW8HADoMK0DFUL9p//V/t/+763L14uVp41fPFK1Wts0Dp4UaaLSov6Mznu3o/aGm+uI2AC/dNKS6eaAkVzh9wONUX+DVzr4ae71pJXhw/cvcrTdovQvu7+1X7F3S6jy+2QiTygu5nRMFBKhiqmdl7tU4ry5TU5mKtM5llcwCgsVYE0JmjInI4AAAAAIAZ5hRCX/sYAA3jCszCGKlEatT//l/H/5fW7rUq80Zmr71vjIIIkdczlam+3G7JVH3xovnrpOjDoAZOgPrHVK4Ntyx2XWXa09cHTulGymz6Sccham7navPBeErHWTVb37Fo3sixzHcFpomKqglZEEyskqIvy6ZnjnG4mEXfdkTXbUnKnw3v+zstdwAAAACAGeY0Ql/7GAANowrMwxooRGnjj//T6//L2qvO5zw65TbjG+sqM0LKtm5rlw7mXjLmGMojEpF19mGnnCABkauhdhrw110v110kxG8nTxx1kexesix+NKxtlRpqnZWKE3z2FsX4o0rA9jvHvaFIyTT8oV+nr2rO12hOO17wJqKTUrF8LclZuAAOQwqQUFEZ3Fa//v/2//f8ZJeaqvauy2LUy4D01bMeG4XrXQcVtvVuM/tv6v1WNiii36pfDuYjRJQK4konXr+hm0/T6A4SKELAeWE9J5fS87DUrU8ENguhE7ACZWICIE37tIreUbQRmqhWIvxe7HebdEna6cKqpp2nLfcLgtYq4A5DCszCQxKcxDean/9T+//7vpXAma3AqVdVxiw1JTyrBpgsrr175JzdqC89kaipkAK4zhctCeQnlnHZpoq6qbBZi1w17FYUxeongaygg8eVgRpupSVqUSnHEU3ABm48lpoK4kk7qmBOZJZkTN3MyILms+506rfW3ZnUxhlL7PhguC2HsQf8Nv/NUgluHAASAwqCg7FQ0w/tWff9P9LqueEtJJEkiSJBxh8o+PtwMRrENB2R/b+i+qix+hv6ScsCwdurLEMbAHtwGB7Yhge2IYHtiGB7Yhge2IYHtiGB7Yhge2IUPWIUPWIUPWIUPWIUHrAFB6xCh6xCg9YAoPWAKD2wBQesAUHrAHD3AFB6wBQe4AoPWAKD3AH4ABLDChBZe9Zm+OMku5JJEkkkSJBR7nubUTTQgsshU00ILNTU1O1mmSaKOiySbI3nhyN54cjeeHI3nhyN54cjeeHI3nhyN5yyN5yyN5yyN5yyN5yyN+5fBvcvg3vD8G9y+De5fBvcvg3uXwb3L4N7l8G9y+De5fBvcvg3uXwb3L4N78"
                    },
                    "duration": 1,
                    "fps": 10,
                    "width": 64,
                    "format": "webp"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VideoToGifCreatorResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/video-to-audio-extractor/calculate": {
      "post": {
        "operationId": "calculateVideoToAudioExtractor",
        "summary": "Extract a video’s soundtrack as MP3, WAV or FLAC, or copy the original audio losslessly.",
        "description": "Extracts an audio track from MP4, MOV, MKV, WebM, AVI and other videos. Pick the track if there are several (e.g. languages), save it as MP3 (VBR or CBR), WAV or FLAC, or copy the original AAC/Opus/Vorbis/MP3/FLAC stream into M4A/Ogg/MP3/FLAC without re-encoding. Optional start/end trim.\n\nMethodology:\n- ffprobe lists the audio tracks (codec, channels, sample rate, language). The chosen track is mapped with -map 0:a:N; video, subtitles and data are dropped.\n- MP3 uses LAME VBR (-q:a 0/2/4) or CBR; WAV is 16-bit PCM; FLAC is lossless level 5.\n- \"Copy\" keeps the original bitstream: AAC/ALAC → M4A, MP3 → MP3, Opus → .opus (Ogg), Vorbis → Ogg, FLAC → FLAC, 16/24-bit PCM → WAV. Other codecs (e.g. AC-3, DTS) need re-encoding and are refused in copy mode.\n- Trimming seeks to the start time and stops after the requested length. In copy mode cuts land on audio frame boundaries (a few milliseconds).",
        "tags": [
          "media"
        ],
        "x-mcp-tool": "video_to_audio_extractor",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VideoToAudioExtractorInput"
              },
              "examples": {
                "example1": {
                  "summary": "Soundtrack of a test clip as MP3",
                  "value": {
                    "file": {
                      "filename": "clip.mp4",
                      "contentType": "video/mp4",
                      "contentBase64": "AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAAatbW9vdgAAAGxtdmhkAAAAAAAAAAAAAAAAAAA+gAAAPoAAAQAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAwt0cmFrAAAAXHRraGQAAAADAAAAAAAAAAAAAAABAAAAAAAAPoAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAAEAAAAAwAAAAAAAkZWR0cwAAABxlbHN0AAAAAAAAAAEAAD6AAAAIAAABAAAAAAKDbWRpYQAAACBtZGhkAAAAAAAAAAAAAAAAAAAoAAAAKABVxAAAAAAALWhkbHIAAAAAAAAAAHZpZGUAAAAAAAAAAAAAAABWaWRlb0hhbmRsZXIAAAACLm1pbmYAAAAUdm1oZAAAAAEAAAAAAAAAAAAAACRkaW5mAAAAHGRyZWYAAAAAAAAAAQAAAAx1cmwgAAAAAQAAAe5zdGJsAAAAvnN0c2QAAAAAAAAAAQAAAK5hdmMxAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAEAAMABIAAAASAAAAAAAAAABDExhdmMgbGlieDI2NAAAAAAAAAAAAAAAAAAAAAAAAAAAGP//AAAANGF2Y0MBZAAK/+EAGGdkAAqs2UR7ARAAAAMAEAAAAwFA8SJZYAEABWjvgxyw/fj4AAAAABBwYXNwAAAAAQAAAAEAAAAUYnRydAAAAAAAACy4AAAAAAAAABhzdHRzAAAAAAAAAAEAAAAKAAAEAAAAABhzdHNzAAAAAAAAAAIAAAABAAAABgAAAGBjdHRzAAAAAAAAAAoAAAABAAAIAAAAAAEAABQAAAAAAQAACAAAAAABAAAAAAAAAAEAAAQAAAAAAQAACAAAAAABAAAUAAAAAAEAAAgAAAAAAQAAAAAAAAABAAAEAAAAAChzdHNjAAAAAAAAAAIAAAABAAAAAgAAAAEAAAACAAAAAQAAAAEAAAA8c3RzegAAAAAAAAAAAAAACgAAA8MAAAAmAAAADAAAAAwAAAAMAAABRQAAACEAAAAMAAAADAAAAAwAAAA0c3RjbwAAAAAAAAAJAAAG3QAAC38AAAziAAAOEAAADqUAABDmAAARjAAAEp4AABMsAAAC8XRyYWsAAABcdGtoZAAAAAMAAAAAAAAAAAAAAAIAAAAAAAA+gAAAAAAAAAAAAAAAAQEAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAACRlZHRzAAAAHGVsc3QAAAAAAAAAAQAAPoAAAAQAAAEAAAAAAmltZGlhAAAAIG1kaGQAAAAAAAAAAAAAAAAAAD6AAABCgFXEAAAAAAAtaGRscgAAAAAAAAAAc291bgAAAAAAAAAAAAAAAFNvdW5kSGFuZGxlcgAAAAIUbWluZgAAABBzbWhkAAAAAAAAAAAAAAAkZGluZgAAABxkcmVmAAAAAAAAAAEAAAAMdXJsIAAAAAEAAAHYc3RibAAAAH5zdHNkAAAAAAAAAAEAAABubXA0YQAAAAAAAAABAAAAAAAAAAAAAQAQAAAAAD6AAAAAAAA2ZXNkcwAAAAADgICAJQACAASAgIAXQBUAAAAAAEZuAABGbgWAgIAFFAhW5QAGgICAAQIAAAAUYnRydAAAAAAAAEZuAABGbgAAACBzdHRzAAAAAAAAAAIAAAAQAAAEAAAAAAEAAAKAAAAAcHN0c2MAAAAAAAAACAAAAAEAAAABAAAAAQAAAAIAAAACAAAAAQAAAAQAAAABAAAAAQAAAAUAAAACAAAAAQAAAAYAAAABAAAAAQAAAAcAAAACAAAAAQAAAAgAAAABAAAAAQAAAAkAAAAFAAAAAQAAAFhzdHN6AAAAAAAAAAAAAAARAAAAuQAAALYAAAChAAAAmQAAAIkAAACJAAAAfQAAAH8AAACFAAAAgQAAAIUAAACCAAAAfgAAAIAAAACOAAAAjAAAAIIAAAA0c3RjbwAAAAAAAAAJAAAKxgAAC4sAAAzuAAAOHAAAD+oAABEHAAARmAAAEqoAABM4AAAAGnNncGQBAAAAcm9sbAAAAAIAAAAB//8AAAAcc2JncAAAAAByb2xsAAAAAQAAABEAAAABAAAAPXVkdGEAAAA1bWV0YQAAAAAAAAAhaGRscgAAAAAAAAAAbWRpcmFwcGwAAAAAAAAAAAAAAAAIaWxzdAAAAAhmcmVlAAAO/W1kYXQAAAKbBgX//5fcRem95tlIt5Ys2CDZI+7veDI2NCAtIGNvcmUgMTY1IC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENvcHlsZWZ0IDIwMDMtMjAyNSAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9wdGlvbnM6IGNhYmFjPTEgcmVmPTEgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MzoweDExMyBtZT1oZXggc3VibWU9MiBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj0wIG1lX3JhbmdlPTE2IGNocm9tYV9tZT0xIHRyZWxsaXM9MCA4eDhkY3Q9MSBjcW09MCBkZWFkem9uZT0yMSwxMSBmYXN0X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0wIHRocmVhZHM9MSBsb29rYWhlYWRfdGhyZWFkcz0xIHNsaWNlZF90aHJlYWRzPTAgbnI9MCBkZWNpbWF0ZT0xIGludGVybGFjZWQ9MCBibHVyYXlfY29tcGF0PTAgY29uc3RyYWluZWRfaW50cmE9MCBiZnJhbWVzPTMgYl9weXJhbWlkPTIgYl9hZGFwdD0xIGJfYmlhcz0wIGRpcmVjdD0xIHdlaWdodGI9MSBvcGVuX2dvcD0wIHdlaWdodHA9MSBrZXlpbnQ9NSBrZXlpbnRfbWluPTEgc2NlbmVjdXQ9NDAgaW50cmFfcmVmcmVzaD0wIHJjX2xvb2thaGVhZD01IHJjPWNyZiBtYnRyZWU9MSBjcmY9MzguMCBxY29tcD0wLjYwIHFwbWluPTAgcXBtYXg9NjkgcXBzdGVwPTQgaXBfcmF0aW89MS40MCBhcT0xOjEuMDAAgAAAASBliIQAR9I6DE+XmH8S+MUThkAmDt/AAaUe0TPuwtKuXPfJ/Uv5EhMrCwMZmvngBPORW4BTrY872aABEXimGiKPPKWi+0+uj6jq5nnFTehYc+fQ8y5nlLT4WoIA0sNC0tHvVic+jcZel4QejR0P/Dyza9DwFp6CutsOdBgwAaxz/SdU+kvYUtd94SXwbVpDTwd1C4rI3Xj8Ci05w9n3F44qDWVK/Ukh5vmjDnFK4HZ4e95RfDBgbiimr1nNMe0DXyzIaIhThpC+yt2tYHIYmERZnwlXDo+iSeZbNKrQ37Ytt8LssQ8EoVLxopyCRBD0LhMYBYhjH4OFgwmIKgdwmLbfLpXsvnW/NaIsJpEsRo3POmKzV11s/dcwt//LsMFATEsAAAAiQZokGIS/ipPPJIwyjL40VjHe2cC8anJOMxbuAI5xVPPxEAEgUKz0lkElu9/Pj78TW+JUm5EkbRCw7y859e7VzFmHSWjfOvifr32nY3ZPYXtr+o3U/1vZfwGbG5zh77JMC6LisTWrLcpGtYnHWGeUslJqsx0bHNX5rHNY59bKTSk0pNKVRlUZVKVSk0tNSNIzs8zzO0k0jSNIzs7PM7SM7SNJM8zzSTSTSNI0jOzs7RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRcAAAACEGeQkI7/6uBASCW2lF1ZiFrMNOLpZ/+H/PnrWpc1+n/p/5eRc1f7f+n/l7C5xP2/+P/Pgl3rQ5X2HeeeeeeeeeeY8wU7bwHFsCFT+PYHrjck+tndO9tG8Wdx3qCbJT7wB/Kh75UM+VDPl8qDAfLjQYD5fKKhYAE2z8KLdkpO39QeeapPkpc6LmF0WrabEL1N8p2EGCZQYJUDBKga8cmU4MDBITK4MDKCTi3d45rgclBC3p7ZMzJ5555555+bm4BBvCtLEKSCX3v+3z+/1GdNySS0iNJWroObP3cXa337vJ9aJ0j6z+B/W6NkGlshBYoyz9bwZSBRJ5hafsvFuKxXsGYVzFGU9T1BvNij14YYdsgtTjjjMyF7++gZPjMHffQH/jMM/voD/xmDvvoD/x8BPvCD/GYJ94VD4AT7+4Hx8B339w/8Zh5+iwfhaIff3UfgFWDSaFUXBBS4UILnFEd4AAAAAgBnmFEJf+xgADcMK0CtTkOAoNI//1+//8fnvS6uq63Va76zUqq4ywi0Yu6E3NcMKvnWWZeetZ6yzzwZVAA8JxwGUSghDfUGbcU3pHr16+HQ9aStqauiNKxtnpuja3ZSCs2qp4aIWM2kIUjCkpjdrRv7OiKuOnkZ6uwyjRrJ2YLDn601YSZsl94cC3Cw47f7q1YXHrs4JUS9TFoecHPOdBljwDaMKzMMYKhx3X/+f5//h53da3OK08cb1VRGXUgmLPttYrxtkEH2b9bYWfdfZ92Nommn6ABcXm3obyH37sa+vDF2di6ePCy90kkZ/pS0a2bePXBaiPDt9qpzlHwW7hOtN1LRI98pq9zKklhDZN3cyARVcfGI53nSplMKWKFhdkWmTE0MWlNF2OAAAAACAGeY0Ql/7GBANowrMxBeqEy//6X+v/6+0y80ZxVTFiZrLwMpWzTWXeLtC7K2TobHOatU9bcq7CmEAK86hVDlmoTappPhq0STSM7Cw9UZrR+cuPqst1EmrClLD32XqnCSaeFPr5tqDhmkffg1zzEKCwhoQtMCF3nHPu9qcaiqSrijleNGrNhQxaS98rsibloRQ4AAAFBZYiCACfRVincV3t/41s3ihhL/RSXWttt72R4j1YMiTYruZgrpfiBtmFrmK4nr+//ZgAAgAipXJ8mfL8EEJjG1Hm5gzT/CfGbZngHW+zYoHoTPTdkRTrf33t9WEYKox3zbKaOthv8IZCzmntUhduDczly+Tfa3kTikcuWo9EBtJIOQp1y0U9HHewAX7zcpPcL3dOqjXsJRtBYYKv2ZdVN0v19HH9zaxn03Kvdc3KqwkRXqpRSCDMSnttKGa6RIrJ+1ZeE3kEBK8S2gnsfy4Q050hu/k4fnFZ9o2XKSJRN0IQu1kh7vWJEJEGqbai4Dygq3EpTu3cCU8+HYDrFH77LYFL6w+n2KXdKLv5DOoi1sDf8jih6lADEq4/64Pd/rzIcfVZT/C+af52QKyyyfkugHxsndIA/DTMM5+fHHlB0o1o5AOIwrMwieal3f/9X/j/+HxV1qUdbxU1zIpUgPKU8qo2hbfEfzBSecNh9GZvnkAK+fr/gS8LpZ12Szr0UfqiMUc4OaIY/eQA1SUHOSmOgrLWLDIASkTuBjXmhOhw/8vfY26U40JKUhphXmfOQ1bVheGPRhUXhmunq0aNchFwA4jCtAxUojdZf/+v3//j9vE42cVxzUqEvKqK4DSmQtUDm7DbgsGvMj0pwXsal1EADI/HQbGXhC3IpoIGwKahvvR+l11Ei9GrnppWXohNRDObmvih53GpHVqlBOKa/ZBHXHAoEqotSSIgC5mnjKsTC5hbDNNBInaVd7rp9LdBwAAAAHUGaJBiEv4pVtmhz+OMuJp+q8OJq7KLcDWSUwxmBANwwqQUVQqP/+X8f/x+cZxF5rIyuudburqVoXHOsjxrabFkdi33lXge1eq794GHiii/F/99ccRQLIyMxNChfKeEECiD5TBPGUEISD54lCSIz0sLAwgGA0QSGSpI711J2STVoJm7SUUIVEAE6vXqRrHLaycQ5XVAiA2hlSF6zkapE0b1BPAAAAAhBnkJCM/+ngQDgMKzMM8OGf/1f7//x9cVVzd1q8rL1zrnVSpKERg0Yxa2cxZhzVqnb3ePeWteJapj4ADDW70YuCTRJNJM7SM6QzazZoQ3yVLk6lpdGwVy3i2aXXijtOrwrQpwzsphX+3MMLcEoIVKF1uR+ue71OulLttCNUHXbM6ydM12rfLW8HADoMK0DFUL9p//V/t/+763L14uVp41fPFK1Wts0Dp4UaaLSov6Mznu3o/aGm+uI2AC/dNKS6eaAkVzh9wONUX+DVzr4ae71pJXhw/cvcrTdovQvu7+1X7F3S6jy+2QiTygu5nRMFBKhiqmdl7tU4ry5TU5mKtM5llcwCgsVYE0JmjInI4AAAAAIAZ5hRCX/sYAA3jCszCGKlEatT//l/H/5fW7rUq80Zmr71vjIIIkdczlam+3G7JVH3xovnrpOjDoAZOgPrHVK4Ntyx2XWXa09cHTulGymz6Sccham7navPBeErHWTVb37Fo3sixzHcFpomKqglZEEyskqIvy6ZnjnG4mEXfdkTXbUnKnw3v+zstdwAAAACAGeY0Ql/7GAANowrMwxooRGnjj//T6//L2qvO5zw65TbjG+sqM0LKtm5rlw7mXjLmGMojEpF19mGnnCABkauhdhrw110v110kxG8nTxx1kexesix+NKxtlRpqnZWKE3z2FsX4o0rA9jvHvaFIyTT8oV+nr2rO12hOO17wJqKTUrF8LclZuAAOQwqQUFEZ3Fa//v/2//f8ZJeaqvauy2LUy4D01bMeG4XrXQcVtvVuM/tv6v1WNiii36pfDuYjRJQK4konXr+hm0/T6A4SKELAeWE9J5fS87DUrU8ENguhE7ACZWICIE37tIreUbQRmqhWIvxe7HebdEna6cKqpp2nLfcLgtYq4A5DCszCQxKcxDean/9T+//7vpXAma3AqVdVxiw1JTyrBpgsrr175JzdqC89kaipkAK4zhctCeQnlnHZpoq6qbBZi1w17FYUxeongaygg8eVgRpupSVqUSnHEU3ABm48lpoK4kk7qmBOZJZkTN3MyILms+506rfW3ZnUxhlL7PhguC2HsQf8Nv/NUgluHAASAwqCg7FQ0w/tWff9P9LqueEtJJEkiSJBxh8o+PtwMRrENB2R/b+i+qix+hv6ScsCwdurLEMbAHtwGB7Yhge2IYHtiGB7Yhge2IYHtiGB7Yhge2IUPWIUPWIUPWIUPWIUHrAFB6xCh6xCg9YAoPWAKD2wBQesAUHrAHD3AFB6wBQe4AoPWAKD3AH4ABLDChBZe9Zm+OMku5JJEkkkSJBR7nubUTTQgsshU00ILNTU1O1mmSaKOiySbI3nhyN54cjeeHI3nhyN54cjeeHI3nhyN5yyN5yyN5yyN5yyN5yyN+5fBvcvg3vD8G9y+De5fBvcvg3uXwb3L4N7l8G9y+De5fBvcvg3uXwb3L4N78"
                    },
                    "format": "mp3",
                    "mp3Quality": "128"
                  }
                },
                "example2": {
                  "summary": "Copy the original AAC track into M4A",
                  "value": {
                    "file": {
                      "filename": "clip.mp4",
                      "contentType": "video/mp4",
                      "contentBase64": "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"
                    },
                    "format": "copy"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VideoToAudioExtractorResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/workflows": {
      "get": {
        "operationId": "listWorkflows",
        "summary": "Multi-tool workflows",
        "responses": {
          "200": {
            "description": "Workflow list.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Problem": {
        "type": "object",
        "description": "RFC 9457 problem details. 422 responses include per-field `errors`.",
        "required": [
          "type",
          "title",
          "status",
          "detail"
        ],
        "properties": {
          "type": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "status": {
            "type": "integer"
          },
          "detail": {
            "type": "string"
          },
          "code": {
            "type": "string"
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "field",
                "message"
              ],
              "properties": {
                "field": {
                  "type": "string"
                },
                "message": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "AudioCutterMergerInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "mode": {
            "title": "What to do",
            "type": "string",
            "enum": [
              "cut",
              "merge"
            ],
            "default": "cut"
          },
          "file": {
            "title": "Audio file (clip 1)",
            "description": "MP3, WAV, FLAC, Ogg/Opus, M4A, AIFF; max 100 MB in total. Processed on our server in a private temporary folder that is deleted afterwards; the result can be downloaded for about 2 hours. Upload as {filename, contentType?, contentBase64}. Max 102400 KiB. Accepts .mp3,.wav,.flac,.ogg,.oga,.opus,.m4a,.aac,.aif,.aiff,.wma,.mp4,.mov,.webm,.mkv,audio/*.",
            "type": "object",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "file2": {
            "title": "Clip 2 (merge mode)",
            "type": "object",
            "description": "Upload as {filename, contentType?, contentBase64}. Max 102400 KiB. Accepts .mp3,.wav,.flac,.ogg,.oga,.opus,.m4a,.aac,.aif,.aiff,.wma,.mp4,.mov,.webm,.mkv,audio/*.",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "file3": {
            "title": "Clip 3 (merge mode)",
            "type": "object",
            "description": "Upload as {filename, contentType?, contentBase64}. Max 102400 KiB. Accepts .mp3,.wav,.flac,.ogg,.oga,.opus,.m4a,.aac,.aif,.aiff,.wma,.mp4,.mov,.webm,.mkv,audio/*.",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "file4": {
            "title": "Clip 4 (merge mode)",
            "type": "object",
            "description": "Upload as {filename, contentType?, contentBase64}. Max 102400 KiB. Accepts .mp3,.wav,.flac,.ogg,.oga,.opus,.m4a,.aac,.aif,.aiff,.wma,.mp4,.mov,.webm,.mkv,audio/*.",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "file5": {
            "title": "Clip 5 (merge mode)",
            "type": "object",
            "description": "Upload as {filename, contentType?, contentBase64}. Max 102400 KiB. Accepts .mp3,.wav,.flac,.ogg,.oga,.opus,.m4a,.aac,.aif,.aiff,.wma,.mp4,.mov,.webm,.mkv,audio/*.",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "file6": {
            "title": "Clip 6 (merge mode)",
            "type": "object",
            "description": "Upload as {filename, contentType?, contentBase64}. Max 102400 KiB. Accepts .mp3,.wav,.flac,.ogg,.oga,.opus,.m4a,.aac,.aif,.aiff,.wma,.mp4,.mov,.webm,.mkv,audio/*.",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "file7": {
            "title": "Clip 7 (merge mode)",
            "type": "object",
            "description": "Upload as {filename, contentType?, contentBase64}. Max 102400 KiB. Accepts .mp3,.wav,.flac,.ogg,.oga,.opus,.m4a,.aac,.aif,.aiff,.wma,.mp4,.mov,.webm,.mkv,audio/*.",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "file8": {
            "title": "Clip 8 (merge mode)",
            "type": "object",
            "description": "Upload as {filename, contentType?, contentBase64}. Max 102400 KiB. Accepts .mp3,.wav,.flac,.ogg,.oga,.opus,.m4a,.aac,.aif,.aiff,.wma,.mp4,.mov,.webm,.mkv,audio/*.",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "file9": {
            "title": "Clip 9 (merge mode)",
            "type": "object",
            "description": "Upload as {filename, contentType?, contentBase64}. Max 102400 KiB. Accepts .mp3,.wav,.flac,.ogg,.oga,.opus,.m4a,.aac,.aif,.aiff,.wma,.mp4,.mov,.webm,.mkv,audio/*.",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "file10": {
            "title": "Clip 10 (merge mode)",
            "type": "object",
            "description": "Upload as {filename, contentType?, contentBase64}. Max 102400 KiB. Accepts .mp3,.wav,.flac,.ogg,.oga,.opus,.m4a,.aac,.aif,.aiff,.wma,.mp4,.mov,.webm,.mkv,audio/*.",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "start": {
            "title": "Start time (cut mode)",
            "description": "Seconds (5.5), mm:ss (1:30) or hh:mm:ss.mmm. Empty = from the beginning.",
            "type": "string",
            "maxLength": 20
          },
          "end": {
            "title": "End time (cut mode)",
            "description": "Empty = to the end.",
            "type": "string",
            "maxLength": 20
          },
          "ranges": {
            "title": "Time ranges (cut mode, optional)",
            "description": "One range per line, start-end. Overrides start/end.",
            "type": "array",
            "items": {
              "type": "string"
            },
            "maxItems": 50
          },
          "rangeAction": {
            "title": "Ranges are",
            "type": "string",
            "enum": [
              "keep",
              "remove"
            ],
            "default": "keep"
          },
          "fadeIn": {
            "title": "Fade in",
            "type": "number",
            "minimum": 0,
            "maximum": 30,
            "default": 0,
            "x-unit": "s"
          },
          "fadeOut": {
            "title": "Fade out",
            "type": "number",
            "minimum": 0,
            "maximum": 30,
            "default": 0,
            "x-unit": "s"
          },
          "crossfade": {
            "title": "Crossfade between clips (merge mode)",
            "type": "number",
            "minimum": 0,
            "maximum": 10,
            "default": 0,
            "x-unit": "s"
          },
          "format": {
            "title": "Output format",
            "type": "string",
            "enum": [
              "mp3",
              "m4a",
              "ogg",
              "opus",
              "flac",
              "wav"
            ],
            "default": "mp3"
          },
          "bitrate": {
            "title": "Bitrate (lossy formats)",
            "type": "string",
            "enum": [
              "32",
              "48",
              "64",
              "96",
              "128",
              "160",
              "192",
              "224",
              "256",
              "320"
            ],
            "default": "192"
          }
        },
        "required": [
          "file"
        ]
      },
      "AudioCutterMergerResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "mode",
              "segments",
              "clips",
              "outputFormat",
              "expectedSeconds",
              "durationSeconds",
              "outputBytes",
              "artifact"
            ],
            "properties": {
              "mode": {
                "type": "string",
                "enum": [
                  "cut",
                  "merge"
                ]
              },
              "segments": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "start",
                    "end"
                  ],
                  "properties": {
                    "start": {
                      "type": "number"
                    },
                    "end": {
                      "type": "number"
                    }
                  }
                },
                "description": "Kept parts of the source (cut mode)."
              },
              "clips": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "clip",
                    "durationSeconds",
                    "codec"
                  ],
                  "properties": {
                    "clip": {
                      "type": "integer"
                    },
                    "durationSeconds": {
                      "type": "number"
                    },
                    "codec": {
                      "type": "string"
                    }
                  }
                }
              },
              "crossfadeSeconds": {
                "type": "number"
              },
              "outputFormat": {
                "type": "string"
              },
              "expectedSeconds": {
                "type": "number"
              },
              "durationSeconds": {
                "type": "number"
              },
              "outputBytes": {
                "type": "integer"
              },
              "artifact": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "artifactId",
                  "filename",
                  "mime",
                  "bytes",
                  "sha256",
                  "path"
                ],
                "properties": {
                  "artifactId": {
                    "type": "string"
                  },
                  "filename": {
                    "type": "string"
                  },
                  "mime": {
                    "type": "string"
                  },
                  "bytes": {
                    "type": "integer"
                  },
                  "sha256": {
                    "type": "string"
                  },
                  "path": {
                    "type": "string",
                    "description": "Download path on the same site (valid for about 2 hours)."
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "AudioLoudnessNormalizerInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "file": {
            "title": "Audio file",
            "description": "MP3, WAV, FLAC, Ogg/Opus, M4A, AIFF; max 100 MB and 45 minutes. Processed on our server in a private temporary folder that is deleted afterwards; the result can be downloaded for about 2 hours. Upload as {filename, contentType?, contentBase64}. Max 102400 KiB. Accepts .mp3,.wav,.flac,.ogg,.oga,.opus,.m4a,.aac,.aif,.aiff,.wma,.mp4,.mov,.webm,.mkv,audio/*.",
            "type": "object",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "preset": {
            "title": "Target",
            "type": "string",
            "enum": [
              "spotify",
              "youtube",
              "apple",
              "podcast-stereo",
              "podcast-mono",
              "ebu",
              "custom"
            ],
            "default": "spotify"
          },
          "targetLufs": {
            "title": "Custom integrated loudness",
            "description": "Only used with \"Custom target\".",
            "type": "number",
            "minimum": -40,
            "maximum": -5,
            "default": -16,
            "x-unit": "LUFS"
          },
          "truePeak": {
            "title": "Custom true-peak limit",
            "description": "Only used with \"Custom target\".",
            "type": "number",
            "minimum": -9,
            "maximum": 0,
            "default": -1,
            "x-unit": "dBTP"
          },
          "lra": {
            "title": "Loudness range target",
            "description": "Higher keeps more dynamics. If the source range is larger, ffmpeg compresses it.",
            "type": "number",
            "minimum": 1,
            "maximum": 50,
            "default": 11,
            "x-unit": "LU"
          },
          "format": {
            "title": "Output format",
            "type": "string",
            "enum": [
              "same",
              "mp3",
              "m4a",
              "ogg",
              "opus",
              "flac",
              "wav"
            ],
            "default": "same"
          },
          "bitrate": {
            "title": "Bitrate (lossy formats)",
            "type": "string",
            "enum": [
              "32",
              "48",
              "64",
              "96",
              "128",
              "160",
              "192",
              "224",
              "256",
              "320"
            ],
            "default": "192"
          }
        },
        "required": [
          "file"
        ]
      },
      "AudioLoudnessNormalizerResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "preset",
              "target",
              "before",
              "after",
              "normalizationType",
              "afterSource",
              "gainDb",
              "outputFormat",
              "sampleRate",
              "channels",
              "durationSeconds",
              "outputBytes",
              "artifact"
            ],
            "properties": {
              "preset": {
                "type": "string"
              },
              "target": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "integratedLufs",
                  "truePeakDbtp",
                  "lra"
                ],
                "properties": {
                  "integratedLufs": {
                    "type": "number"
                  },
                  "truePeakDbtp": {
                    "type": "number"
                  },
                  "lra": {
                    "type": "number"
                  }
                }
              },
              "before": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "integratedLufs",
                  "truePeakDbtp",
                  "lra",
                  "thresholdLufs"
                ],
                "properties": {
                  "integratedLufs": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "truePeakDbtp": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "lra": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "thresholdLufs": {
                    "type": [
                      "number",
                      "null"
                    ]
                  }
                }
              },
              "after": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "integratedLufs",
                  "truePeakDbtp",
                  "lra",
                  "thresholdLufs"
                ],
                "properties": {
                  "integratedLufs": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "truePeakDbtp": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "lra": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "thresholdLufs": {
                    "type": [
                      "number",
                      "null"
                    ]
                  }
                }
              },
              "normalizationType": {
                "type": "string",
                "description": "linear = one gain change; dynamic = loudnorm also compressed/limited the audio."
              },
              "afterSource": {
                "type": "string",
                "enum": [
                  "measured",
                  "loudnorm-report"
                ],
                "description": "measured = the encoded file was measured again (files up to 15 min)."
              },
              "gainDb": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "outputFormat": {
                "type": "string"
              },
              "sampleRate": {
                "type": "integer"
              },
              "channels": {
                "type": "integer"
              },
              "durationSeconds": {
                "type": "number"
              },
              "outputBytes": {
                "type": "integer"
              },
              "artifact": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "artifactId",
                  "filename",
                  "mime",
                  "bytes",
                  "sha256",
                  "path"
                ],
                "properties": {
                  "artifactId": {
                    "type": "string"
                  },
                  "filename": {
                    "type": "string"
                  },
                  "mime": {
                    "type": "string"
                  },
                  "bytes": {
                    "type": "integer"
                  },
                  "sha256": {
                    "type": "string"
                  },
                  "path": {
                    "type": "string",
                    "description": "Download path on the same site (valid for about 2 hours)."
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "BackgroundRemoverInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "file": {
            "title": "Image",
            "description": "JPG, PNG, WebP, AVIF, GIF, TIFF or HEIC, max 50 MB. Best results: the subject on a plain, evenly lit background. Upload as {filename, contentType?, contentBase64}. Max 51200 KiB. Accepts .jpg,.jpeg,.png,.webp,.avif,.gif,.tif,.tiff,.heic,.heif,image/jpeg,image/png,image/webp,image/avif,image/gif,image/tiff,image/heic,image/heif.",
            "type": "object",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "mode": {
            "title": "Method",
            "type": "string",
            "enum": [
              "auto",
              "color-connected",
              "chroma"
            ],
            "default": "auto"
          },
          "color": {
            "title": "Background colour",
            "description": "Hex colour, e.g. #ffffff or #00ff00. Required for the two colour methods; ignored by the automatic method.",
            "type": "string",
            "maxLength": 7
          },
          "fuzz": {
            "title": "Colour tolerance",
            "description": "How different a pixel may be from the background colour and still be removed. Raise it for shadows or JPEG noise; lower it if parts of the subject disappear.",
            "type": "number",
            "minimum": 0,
            "maximum": 60,
            "default": 12,
            "x-unit": "%"
          },
          "cleanup": {
            "title": "Edge clean-up",
            "description": "Removes isolated specks and fills small holes in the mask (morphological open/close). 0 = off.",
            "type": "integer",
            "minimum": 0,
            "maximum": 8,
            "default": 1,
            "x-unit": "px"
          },
          "feather": {
            "title": "Feather edges",
            "description": "Softens the cut-out edge. 0 = hard edge.",
            "type": "number",
            "minimum": 0,
            "maximum": 10,
            "default": 0.5,
            "x-unit": "px"
          }
        },
        "required": [
          "file"
        ]
      },
      "BackgroundRemoverResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "mode",
              "backgroundColor",
              "fuzzPercent",
              "borderUniformityPercent",
              "suitability",
              "foregroundPercent",
              "removedPercent",
              "width",
              "height",
              "method",
              "artifact",
              "preview"
            ],
            "properties": {
              "mode": {
                "type": "string",
                "enum": [
                  "auto",
                  "color-connected",
                  "chroma"
                ]
              },
              "backgroundColor": {
                "type": "string",
                "description": "Hex colour that was removed."
              },
              "fuzzPercent": {
                "type": "number"
              },
              "borderUniformityPercent": {
                "type": "number",
                "description": "Share of border pixels within the tolerance of the background colour."
              },
              "suitability": {
                "type": "string",
                "enum": [
                  "good",
                  "fair",
                  "poor"
                ]
              },
              "foregroundPercent": {
                "type": "number"
              },
              "removedPercent": {
                "type": "number"
              },
              "width": {
                "type": "integer"
              },
              "height": {
                "type": "integer"
              },
              "method": {
                "type": "string",
                "enum": [
                  "colour-distance (non-ML)"
                ]
              },
              "artifact": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "artifactId",
                  "filename",
                  "mime",
                  "bytes",
                  "sha256",
                  "path"
                ],
                "properties": {
                  "artifactId": {
                    "type": "string"
                  },
                  "filename": {
                    "type": "string"
                  },
                  "mime": {
                    "type": "string"
                  },
                  "bytes": {
                    "type": "integer"
                  },
                  "sha256": {
                    "type": "string"
                  },
                  "path": {
                    "type": "string",
                    "description": "Download path on the same site (valid for about 2 hours)."
                  }
                }
              },
              "preview": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "artifactId",
                  "filename",
                  "mime",
                  "bytes",
                  "sha256",
                  "path"
                ],
                "properties": {
                  "artifactId": {
                    "type": "string"
                  },
                  "filename": {
                    "type": "string"
                  },
                  "mime": {
                    "type": "string"
                  },
                  "bytes": {
                    "type": "integer"
                  },
                  "sha256": {
                    "type": "string"
                  },
                  "path": {
                    "type": "string",
                    "description": "Download path on the same site (valid for about 2 hours)."
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "BatchImageResizerInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "images": {
            "title": "Image or ZIP of images",
            "description": "One image (JPG, PNG, WebP, AVIF, GIF, TIFF, HEIC) or a ZIP with up to 30 images, max 50 MB per image and 150 MB in total. Your browser form sends one file, so put several images into a ZIP. Upload as {filename, contentType?, contentBase64}. Max 153600 KiB. Accepts .zip,application/zip,.jpg,.jpeg,.png,.webp,.avif,.gif,.tif,.tiff,.heic,.heif,image/jpeg,image/png,image/webp,image/avif,image/gif,image/tiff,image/heic,image/heif.",
            "type": "object",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "mode": {
            "title": "Resize mode",
            "type": "string",
            "enum": [
              "fit",
              "cover",
              "percent",
              "aspect"
            ],
            "default": "fit"
          },
          "width": {
            "title": "Width",
            "description": "Needed for \"Exact size\"; for \"Fit\" give width, height or both.",
            "type": "integer",
            "minimum": 1,
            "maximum": 10000,
            "x-unit": "px"
          },
          "height": {
            "title": "Height",
            "type": "integer",
            "minimum": 1,
            "maximum": 10000,
            "x-unit": "px"
          },
          "percent": {
            "title": "Percentage",
            "description": "Only for \"Scale by percentage\".",
            "type": "number",
            "minimum": 1,
            "maximum": 400,
            "default": 50,
            "x-unit": "%"
          },
          "aspect": {
            "title": "Aspect ratio",
            "description": "Only for \"Crop to aspect ratio\".",
            "type": "string",
            "enum": [
              "1:1",
              "4:5",
              "16:9",
              "9:16",
              "3:2",
              "4:3"
            ],
            "default": "1:1"
          },
          "gravity": {
            "title": "Crop focus",
            "description": "Which part of the image is kept when cropping.",
            "type": "string",
            "enum": [
              "center",
              "north",
              "south",
              "west",
              "east",
              "northwest",
              "northeast",
              "southwest",
              "southeast"
            ],
            "default": "center"
          },
          "upscale": {
            "title": "Allow enlarging small images",
            "type": "boolean",
            "default": false
          },
          "format": {
            "title": "Output format",
            "type": "string",
            "enum": [
              "same",
              "jpeg",
              "png",
              "webp",
              "avif"
            ],
            "default": "same"
          },
          "quality": {
            "title": "Quality",
            "description": "For JPG, WebP and AVIF.",
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 85
          },
          "keepMetadata": {
            "title": "Keep EXIF metadata (camera, date, GPS)",
            "type": "boolean",
            "default": false
          }
        },
        "required": [
          "images"
        ]
      },
      "BatchImageResizerResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "mode",
              "images",
              "processed",
              "failed",
              "skipped",
              "outputFormat",
              "totalOriginalBytes",
              "totalOutputBytes",
              "files",
              "artifact",
              "preview"
            ],
            "properties": {
              "mode": {
                "type": "string"
              },
              "images": {
                "type": "integer"
              },
              "processed": {
                "type": "integer"
              },
              "failed": {
                "type": "integer"
              },
              "skipped": {
                "type": "integer"
              },
              "outputFormat": {
                "type": "string"
              },
              "totalOriginalBytes": {
                "type": "integer"
              },
              "totalOutputBytes": {
                "type": "integer"
              },
              "files": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "name",
                    "output",
                    "status",
                    "inputFormat",
                    "originalWidth",
                    "originalHeight",
                    "width",
                    "height",
                    "originalBytes",
                    "outputBytes"
                  ],
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "output": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "ok",
                        "failed",
                        "skipped"
                      ]
                    },
                    "reason": {
                      "type": "string"
                    },
                    "inputFormat": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "originalWidth": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "originalHeight": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "width": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "height": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "originalBytes": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "outputBytes": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    }
                  }
                }
              },
              "artifact": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "artifactId",
                  "filename",
                  "mime",
                  "bytes",
                  "sha256",
                  "path"
                ],
                "properties": {
                  "artifactId": {
                    "type": "string"
                  },
                  "filename": {
                    "type": "string"
                  },
                  "mime": {
                    "type": "string"
                  },
                  "bytes": {
                    "type": "integer"
                  },
                  "sha256": {
                    "type": "string"
                  },
                  "path": {
                    "type": "string",
                    "description": "Download path on the same site (valid for about 2 hours)."
                  }
                },
                "description": "ZIP of all results, or the single image when only one was uploaded."
              },
              "preview": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "artifactId",
                  "filename",
                  "mime",
                  "bytes",
                  "sha256",
                  "path"
                ],
                "properties": {
                  "artifactId": {
                    "type": "string"
                  },
                  "filename": {
                    "type": "string"
                  },
                  "mime": {
                    "type": "string"
                  },
                  "bytes": {
                    "type": "integer"
                  },
                  "sha256": {
                    "type": "string"
                  },
                  "path": {
                    "type": "string",
                    "description": "Download path on the same site (valid for about 2 hours)."
                  }
                },
                "description": "First result as an image preview (only for ZIP outputs)."
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "BatchWatermarkStudioInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "images": {
            "title": "Image or ZIP of images",
            "description": "One image or a ZIP with up to 30 images (JPG, PNG, WebP, AVIF, GIF, TIFF, HEIC), max 50 MB each and 150 MB in total. Upload as {filename, contentType?, contentBase64}. Max 153600 KiB. Accepts .zip,application/zip,.jpg,.jpeg,.png,.webp,.avif,.gif,.tif,.tiff,.heic,.heif,image/jpeg,image/png,image/webp,image/avif,image/gif,image/tiff,image/heic,image/heif.",
            "type": "object",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "mode": {
            "title": "Watermark type",
            "type": "string",
            "enum": [
              "text",
              "logo"
            ],
            "default": "text"
          },
          "text": {
            "title": "Watermark text",
            "description": "For text watermarks. Line breaks are replaced by spaces.",
            "type": "string",
            "maxLength": 200,
            "default": "© Your Name"
          },
          "font": {
            "title": "Font",
            "type": "string",
            "enum": [
              "dejavu-sans",
              "dejavu-sans-bold",
              "dejavu-serif",
              "dejavu-sans-mono",
              "liberation-sans",
              "liberation-sans-bold",
              "liberation-serif",
              "liberation-serif-italic",
              "liberation-mono"
            ],
            "default": "dejavu-sans"
          },
          "size": {
            "title": "Size",
            "description": "Text: letter height as % of the shorter image side. Logo: logo width as % of the image width.",
            "type": "number",
            "minimum": 1,
            "maximum": 80,
            "default": 6,
            "x-unit": "%"
          },
          "color": {
            "title": "Text colour",
            "description": "Hex colour, e.g. #ffffff (white) or #000000 (black).",
            "type": "string",
            "maxLength": 7,
            "default": "#ffffff"
          },
          "opacity": {
            "title": "Opacity",
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 50,
            "x-unit": "%"
          },
          "angle": {
            "title": "Angle",
            "description": "Rotation of the watermark; e.g. -30 for a diagonal tile pattern.",
            "type": "integer",
            "minimum": -90,
            "maximum": 90,
            "default": 0,
            "x-unit": "°"
          },
          "position": {
            "title": "Position",
            "type": "string",
            "enum": [
              "center",
              "north",
              "south",
              "west",
              "east",
              "northwest",
              "northeast",
              "southwest",
              "southeast",
              "tile"
            ],
            "default": "southeast"
          },
          "margin": {
            "title": "Margin",
            "description": "Distance from the edge as % of the shorter side (ignored for centre and tiling).",
            "type": "number",
            "minimum": 0,
            "maximum": 25,
            "default": 3,
            "x-unit": "%"
          },
          "logo": {
            "title": "Logo (for logo watermarks)",
            "description": "PNG or WebP with a transparent background works best, max 10 MB. Upload as {filename, contentType?, contentBase64}. Max 10240 KiB. Accepts .png,.webp,.jpg,.jpeg,.gif,.avif,image/png,image/webp,image/jpeg,image/gif,image/avif.",
            "type": "object",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "format": {
            "title": "Output format",
            "type": "string",
            "enum": [
              "same",
              "jpeg",
              "png",
              "webp",
              "avif"
            ],
            "default": "same"
          },
          "quality": {
            "title": "Quality",
            "description": "For JPG, WebP and AVIF.",
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 88
          }
        },
        "required": [
          "images"
        ]
      },
      "BatchWatermarkStudioResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "mode",
              "images",
              "processed",
              "failed",
              "skipped",
              "position",
              "opacity",
              "angle",
              "files",
              "artifact",
              "preview"
            ],
            "properties": {
              "mode": {
                "type": "string",
                "enum": [
                  "text",
                  "logo"
                ]
              },
              "images": {
                "type": "integer"
              },
              "processed": {
                "type": "integer"
              },
              "failed": {
                "type": "integer"
              },
              "skipped": {
                "type": "integer"
              },
              "position": {
                "type": "string"
              },
              "opacity": {
                "type": "integer"
              },
              "angle": {
                "type": "integer"
              },
              "font": {
                "type": "string"
              },
              "files": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "name",
                    "output",
                    "status",
                    "inputFormat",
                    "originalWidth",
                    "originalHeight",
                    "width",
                    "height",
                    "originalBytes",
                    "outputBytes"
                  ],
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "output": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "ok",
                        "failed",
                        "skipped"
                      ]
                    },
                    "reason": {
                      "type": "string"
                    },
                    "inputFormat": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "originalWidth": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "originalHeight": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "width": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "height": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "originalBytes": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "outputBytes": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    }
                  }
                }
              },
              "artifact": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "artifactId",
                  "filename",
                  "mime",
                  "bytes",
                  "sha256",
                  "path"
                ],
                "properties": {
                  "artifactId": {
                    "type": "string"
                  },
                  "filename": {
                    "type": "string"
                  },
                  "mime": {
                    "type": "string"
                  },
                  "bytes": {
                    "type": "integer"
                  },
                  "sha256": {
                    "type": "string"
                  },
                  "path": {
                    "type": "string",
                    "description": "Download path on the same site (valid for about 2 hours)."
                  }
                }
              },
              "preview": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "artifactId",
                  "filename",
                  "mime",
                  "bytes",
                  "sha256",
                  "path"
                ],
                "properties": {
                  "artifactId": {
                    "type": "string"
                  },
                  "filename": {
                    "type": "string"
                  },
                  "mime": {
                    "type": "string"
                  },
                  "bytes": {
                    "type": "integer"
                  },
                  "sha256": {
                    "type": "string"
                  },
                  "path": {
                    "type": "string",
                    "description": "Download path on the same site (valid for about 2 hours)."
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "ExifInspectorCleanerInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "file": {
            "title": "Photo",
            "description": "JPG, PNG, WebP, TIFF, HEIC, AVIF or GIF (RAW files can be inspected but not cleaned), max 50 MB. Upload as {filename, contentType?, contentBase64}. Max 51200 KiB. Accepts .jpg,.jpeg,.png,.webp,.tif,.tiff,.heic,.heif,.avif,.gif,.dng,.cr2,.cr3,.nef,.arw,.orf,.rw2,.raf,image/*.",
            "type": "object",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "action": {
            "title": "What to do",
            "type": "string",
            "enum": [
              "all",
              "gps",
              "keep-essential",
              "inspect"
            ],
            "default": "all"
          }
        },
        "required": [
          "file"
        ]
      },
      "ExifInspectorCleanerResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "fileType",
              "tagCount",
              "groups",
              "tags",
              "tagsTruncated",
              "gps",
              "privacyTags",
              "action",
              "cleaned"
            ],
            "properties": {
              "fileType": {
                "type": "string"
              },
              "tagCount": {
                "type": "integer",
                "description": "Metadata tags in EXIF, GPS, XMP, IPTC and MakerNotes."
              },
              "groups": {
                "type": "object",
                "additionalProperties": {
                  "type": "integer"
                }
              },
              "tags": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "group",
                    "source",
                    "tag",
                    "value"
                  ],
                  "properties": {
                    "group": {
                      "type": "string",
                      "enum": [
                        "GPS",
                        "EXIF",
                        "XMP",
                        "IPTC",
                        "MakerNotes",
                        "ICC_Profile",
                        "File",
                        "Other"
                      ]
                    },
                    "source": {
                      "type": "string"
                    },
                    "tag": {
                      "type": "string"
                    },
                    "value": {
                      "type": "string"
                    }
                  }
                }
              },
              "tagsTruncated": {
                "type": "boolean"
              },
              "gps": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "latitude",
                  "longitude",
                  "altitude"
                ],
                "properties": {
                  "latitude": {
                    "type": "number"
                  },
                  "longitude": {
                    "type": "number"
                  },
                  "altitude": {
                    "type": [
                      "number",
                      "null"
                    ]
                  }
                }
              },
              "privacyTags": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "action": {
                "type": "string",
                "enum": [
                  "inspect",
                  "all",
                  "gps",
                  "keep-essential"
                ]
              },
              "cleaned": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "artifact",
                  "remainingTags",
                  "remainingGroups",
                  "gpsRemaining",
                  "pixelsUnchanged",
                  "verified"
                ],
                "properties": {
                  "artifact": {
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "artifactId",
                      "filename",
                      "mime",
                      "bytes",
                      "sha256",
                      "path"
                    ],
                    "properties": {
                      "artifactId": {
                        "type": "string"
                      },
                      "filename": {
                        "type": "string"
                      },
                      "mime": {
                        "type": "string"
                      },
                      "bytes": {
                        "type": "integer"
                      },
                      "sha256": {
                        "type": "string"
                      },
                      "path": {
                        "type": "string",
                        "description": "Download path on the same site (valid for about 2 hours)."
                      }
                    }
                  },
                  "remainingTags": {
                    "type": "integer"
                  },
                  "remainingGroups": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "integer"
                    }
                  },
                  "gpsRemaining": {
                    "type": "integer"
                  },
                  "pixelsUnchanged": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Decoded pixel hash equal before/after (null when not checked)."
                  },
                  "verified": {
                    "type": "boolean"
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "HeicRawConverterInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "file": {
            "title": "HEIC, AVIF or RAW photo",
            "description": "HEIC/HEIF (iPhone), AVIF or camera RAW (CR2, CR3, NEF, ARW, DNG, ORF, RW2, RAF, PEF…), max 50 MB and 100 megapixels. Deleted after processing; the result can be downloaded for about 2 hours. Upload as {filename, contentType?, contentBase64}. Max 51200 KiB. Accepts .heic,.heif,.avif,image/heic,image/heif,image/avif,.cr2,.cr3,.nef,.nrw,.arw,.dng,.orf,.rw2,.raf,.pef,.srw.",
            "type": "object",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "format": {
            "title": "Output format",
            "type": "string",
            "enum": [
              "jpeg",
              "png",
              "webp"
            ],
            "default": "jpeg"
          },
          "quality": {
            "title": "Quality",
            "description": "For JPG and WebP. PNG is always lossless.",
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 90
          },
          "keepExif": {
            "title": "Keep EXIF metadata (camera, date, GPS location)",
            "description": "Off removes all metadata, including the GPS location.",
            "type": "boolean",
            "default": false
          },
          "autoOrient": {
            "title": "Apply the camera rotation",
            "description": "Rotates the pixels upright. HEIC rotation is always applied because the HEIF format requires it.",
            "type": "boolean",
            "default": true
          },
          "rawWhiteBalance": {
            "title": "RAW white balance",
            "type": "string",
            "enum": [
              "camera",
              "auto"
            ],
            "default": "camera"
          }
        },
        "required": [
          "file"
        ]
      },
      "HeicRawConverterResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "inputFormat",
              "inputDetail",
              "outputFormat",
              "quality",
              "originalBytes",
              "outputBytes",
              "width",
              "height",
              "decoder",
              "encoder",
              "metadataKept",
              "camera",
              "gpsInOriginal",
              "artifact"
            ],
            "properties": {
              "inputFormat": {
                "type": "string",
                "enum": [
                  "heic",
                  "avif",
                  "raw"
                ]
              },
              "inputDetail": {
                "type": "string",
                "description": "e.g. HEIC, AVIF, DNG, CR3, NEF"
              },
              "outputFormat": {
                "type": "string",
                "enum": [
                  "jpeg",
                  "png",
                  "webp"
                ]
              },
              "quality": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "originalBytes": {
                "type": "integer"
              },
              "outputBytes": {
                "type": "integer"
              },
              "width": {
                "type": "integer"
              },
              "height": {
                "type": "integer"
              },
              "decoder": {
                "type": "string"
              },
              "encoder": {
                "type": "string"
              },
              "metadataKept": {
                "type": "boolean"
              },
              "gpsInOriginal": {
                "type": "boolean"
              },
              "camera": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "make",
                  "model",
                  "lens",
                  "iso",
                  "exposureTime",
                  "fNumber",
                  "focalLength",
                  "dateTaken"
                ],
                "properties": {
                  "make": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "model": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "lens": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "iso": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "exposureTime": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "fNumber": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "focalLength": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "dateTaken": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                }
              },
              "artifact": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "artifactId",
                  "filename",
                  "mime",
                  "bytes",
                  "sha256",
                  "path"
                ],
                "properties": {
                  "artifactId": {
                    "type": "string"
                  },
                  "filename": {
                    "type": "string"
                  },
                  "mime": {
                    "type": "string"
                  },
                  "bytes": {
                    "type": "integer"
                  },
                  "sha256": {
                    "type": "string"
                  },
                  "path": {
                    "type": "string",
                    "description": "Download path on the same site (valid for about 2 hours)."
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "ImageCompressorInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "file": {
            "title": "Image",
            "description": "JPG, PNG, WebP, AVIF or GIF (first frame), max 30 MB. Processed on our server and deleted; the result can be downloaded for about 2 hours. Upload as {filename, contentType?, contentBase64}. Max 30720 KiB. Accepts .jpg,.jpeg,.png,.webp,.avif,.gif,image/jpeg,image/png,image/webp,image/avif,image/gif.",
            "type": "object",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "format": {
            "title": "Output format",
            "type": "string",
            "enum": [
              "webp",
              "avif",
              "jpeg",
              "png"
            ],
            "default": "webp"
          },
          "quality": {
            "title": "Quality",
            "description": "1 = smallest file, 100 = best quality. Ignored for PNG, which is always lossless.",
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 75
          },
          "maxWidth": {
            "title": "Maximum width",
            "description": "Optional. Larger images are scaled down proportionally; smaller ones are never enlarged.",
            "type": "integer",
            "minimum": 1,
            "maximum": 20000,
            "x-unit": "px"
          },
          "maxHeight": {
            "title": "Maximum height",
            "description": "Optional. Applied together with the maximum width.",
            "type": "integer",
            "minimum": 1,
            "maximum": 20000,
            "x-unit": "px"
          },
          "stripMetadata": {
            "title": "Remove metadata (EXIF, GPS location, camera details, colour profile comments)",
            "type": "boolean",
            "default": true
          }
        },
        "required": [
          "file"
        ]
      },
      "ImageCompressorResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "inputFormat",
              "outputFormat",
              "quality",
              "originalBytes",
              "outputBytes",
              "savingsPercent",
              "originalWidth",
              "originalHeight",
              "width",
              "height",
              "resized",
              "metadataStripped",
              "encoder",
              "artifact"
            ],
            "properties": {
              "inputFormat": {
                "type": "string",
                "enum": [
                  "jpeg",
                  "png",
                  "webp",
                  "avif",
                  "gif"
                ]
              },
              "outputFormat": {
                "type": "string",
                "enum": [
                  "webp",
                  "avif",
                  "jpeg",
                  "png"
                ]
              },
              "quality": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "null for PNG (lossless)"
              },
              "originalBytes": {
                "type": "integer"
              },
              "outputBytes": {
                "type": "integer"
              },
              "savingsPercent": {
                "type": "number",
                "description": "Positive = smaller than the original; negative = larger."
              },
              "originalWidth": {
                "type": "integer"
              },
              "originalHeight": {
                "type": "integer"
              },
              "width": {
                "type": "integer"
              },
              "height": {
                "type": "integer"
              },
              "resized": {
                "type": "boolean"
              },
              "metadataStripped": {
                "type": "boolean"
              },
              "encoder": {
                "type": "string"
              },
              "artifact": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "artifactId",
                  "filename",
                  "mime",
                  "bytes",
                  "sha256",
                  "path"
                ],
                "properties": {
                  "artifactId": {
                    "type": "string"
                  },
                  "filename": {
                    "type": "string"
                  },
                  "mime": {
                    "type": "string"
                  },
                  "bytes": {
                    "type": "integer"
                  },
                  "sha256": {
                    "type": "string"
                  },
                  "path": {
                    "type": "string",
                    "description": "Download path on the same site (valid for about 2 hours)."
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "ImageUpscalerInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "file": {
            "title": "Image",
            "description": "JPG, PNG, WebP, AVIF, GIF, TIFF or HEIC, max 50 MB. The enlarged result may be at most 16 megapixels. Upload as {filename, contentType?, contentBase64}. Max 51200 KiB. Accepts .jpg,.jpeg,.png,.webp,.avif,.gif,.tif,.tiff,.heic,.heif,image/jpeg,image/png,image/webp,image/avif,image/gif,image/tiff,image/heic,image/heif.",
            "type": "object",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "factor": {
            "title": "Scale factor",
            "type": "string",
            "enum": [
              "2",
              "3",
              "4"
            ],
            "default": "2"
          },
          "filter": {
            "title": "Resampling filter",
            "type": "string",
            "enum": [
              "lanczos",
              "mitchell",
              "catrom",
              "ewa"
            ],
            "default": "lanczos"
          },
          "sharpen": {
            "title": "Sharpening after enlarging",
            "type": "string",
            "enum": [
              "none",
              "light",
              "medium",
              "strong"
            ],
            "default": "light"
          },
          "denoise": {
            "title": "Noise reduction before enlarging",
            "type": "string",
            "enum": [
              "none",
              "despeckle",
              "enhance",
              "median"
            ],
            "default": "none"
          },
          "format": {
            "title": "Output format",
            "type": "string",
            "enum": [
              "png",
              "jpeg",
              "webp"
            ],
            "default": "png"
          },
          "quality": {
            "title": "Quality",
            "description": "For JPG and WebP.",
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 92
          }
        },
        "required": [
          "file"
        ]
      },
      "ImageUpscalerResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "factor",
              "filter",
              "sharpen",
              "denoise",
              "originalWidth",
              "originalHeight",
              "width",
              "height",
              "megapixels",
              "originalBytes",
              "outputBytes",
              "outputFormat",
              "method",
              "artifact",
              "comparison"
            ],
            "properties": {
              "factor": {
                "type": "integer"
              },
              "filter": {
                "type": "string"
              },
              "sharpen": {
                "type": "string"
              },
              "denoise": {
                "type": "string"
              },
              "originalWidth": {
                "type": "integer"
              },
              "originalHeight": {
                "type": "integer"
              },
              "width": {
                "type": "integer"
              },
              "height": {
                "type": "integer"
              },
              "megapixels": {
                "type": "number"
              },
              "originalBytes": {
                "type": "integer"
              },
              "outputBytes": {
                "type": "integer"
              },
              "outputFormat": {
                "type": "string"
              },
              "method": {
                "type": "string",
                "enum": [
                  "classic-interpolation"
                ]
              },
              "artifact": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "artifactId",
                  "filename",
                  "mime",
                  "bytes",
                  "sha256",
                  "path"
                ],
                "properties": {
                  "artifactId": {
                    "type": "string"
                  },
                  "filename": {
                    "type": "string"
                  },
                  "mime": {
                    "type": "string"
                  },
                  "bytes": {
                    "type": "integer"
                  },
                  "sha256": {
                    "type": "string"
                  },
                  "path": {
                    "type": "string",
                    "description": "Download path on the same site (valid for about 2 hours)."
                  }
                }
              },
              "comparison": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "artifactId",
                  "filename",
                  "mime",
                  "bytes",
                  "sha256",
                  "path"
                ],
                "properties": {
                  "artifactId": {
                    "type": "string"
                  },
                  "filename": {
                    "type": "string"
                  },
                  "mime": {
                    "type": "string"
                  },
                  "bytes": {
                    "type": "integer"
                  },
                  "sha256": {
                    "type": "string"
                  },
                  "path": {
                    "type": "string",
                    "description": "Download path on the same site (valid for about 2 hours)."
                  }
                },
                "description": "PNG with a centre crop: left nearest-neighbour enlargement, right this result."
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "Mp3TagCoverEditorInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "file": {
            "title": "MP3 file",
            "description": "MP3 only, max 100 MB. Processed on our server in a private temporary folder that is deleted afterwards; the result can be downloaded for about 2 hours. Upload as {filename, contentType?, contentBase64}. Max 102400 KiB. Accepts .mp3,audio/mpeg.",
            "type": "object",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "title": {
            "title": "Title",
            "description": "Empty fields keep their current value.",
            "type": "string",
            "maxLength": 120
          },
          "artist": {
            "title": "Artist",
            "type": "string",
            "maxLength": 120
          },
          "album": {
            "title": "Album",
            "type": "string",
            "maxLength": 120
          },
          "albumArtist": {
            "title": "Album artist",
            "type": "string",
            "maxLength": 120
          },
          "year": {
            "title": "Year",
            "description": "YYYY or YYYY-MM-DD. Empty = keep the current value.",
            "type": "string",
            "maxLength": 120
          },
          "track": {
            "title": "Track",
            "description": "e.g. 3 or 3/12. Empty = keep the current value.",
            "type": "string",
            "maxLength": 120
          },
          "genre": {
            "title": "Genre",
            "type": "string",
            "maxLength": 120
          },
          "comment": {
            "title": "Comment",
            "type": "string",
            "maxLength": 250
          },
          "clearTags": {
            "title": "Remove these tags",
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "title",
                "artist",
                "album",
                "albumArtist",
                "year",
                "track",
                "genre",
                "comment"
              ]
            }
          },
          "coverAction": {
            "title": "Cover image",
            "type": "string",
            "enum": [
              "keep",
              "replace",
              "remove"
            ],
            "default": "keep"
          },
          "cover": {
            "title": "New cover (PNG or JPG)",
            "description": "Max 5 MB. Square images of 500–1400 px work best in players. Upload as {filename, contentType?, contentBase64}. Max 5120 KiB. Accepts .png,.jpg,.jpeg,image/png,image/jpeg.",
            "type": "object",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "id3Version": {
            "title": "ID3 version",
            "type": "string",
            "enum": [
              "3",
              "4"
            ],
            "default": "3"
          },
          "writeId3v1": {
            "title": "Also write an ID3v1 tag (for very old players)",
            "type": "boolean",
            "default": false
          }
        },
        "required": [
          "file"
        ]
      },
      "Mp3TagCoverEditorResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "tagsBefore",
              "tagsAfter",
              "changed",
              "coverBefore",
              "coverAfter",
              "id3Version",
              "audioUnchanged",
              "durationSeconds",
              "outputBytes",
              "artifact"
            ],
            "properties": {
              "tagsBefore": {
                "type": "object",
                "additionalProperties": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              },
              "tagsAfter": {
                "type": "object",
                "additionalProperties": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              },
              "changed": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "coverBefore": {
                "type": [
                  "object",
                  "null"
                ]
              },
              "coverAfter": {
                "type": [
                  "object",
                  "null"
                ]
              },
              "id3Version": {
                "type": "string",
                "enum": [
                  "2.3",
                  "2.4"
                ]
              },
              "audioUnchanged": {
                "type": "boolean",
                "description": "MD5 of the audio frames is identical before and after."
              },
              "durationSeconds": {
                "type": "number"
              },
              "outputBytes": {
                "type": "integer"
              },
              "artifact": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "artifactId",
                  "filename",
                  "mime",
                  "bytes",
                  "sha256",
                  "path"
                ],
                "properties": {
                  "artifactId": {
                    "type": "string"
                  },
                  "filename": {
                    "type": "string"
                  },
                  "mime": {
                    "type": "string"
                  },
                  "bytes": {
                    "type": "integer"
                  },
                  "sha256": {
                    "type": "string"
                  },
                  "path": {
                    "type": "string",
                    "description": "Download path on the same site (valid for about 2 hours)."
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "SubtitleStudioInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "text": {
            "title": "Subtitle text",
            "description": "Paste SRT, WebVTT, ASS/SSA or SBV, or upload a file below.",
            "type": "string",
            "maxLength": 1000000
          },
          "file": {
            "title": "Subtitle file",
            "description": "Max 2 MB. UTF-8, UTF-16 (with BOM) or Windows-1252. Used instead of the text when given. Upload as {filename, contentType?, contentBase64}. Max 2048 KiB. Accepts .srt,.vtt,.ass,.ssa,.sbv,.sub,.txt,text/plain,text/vtt.",
            "type": "object",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "inputFormat": {
            "title": "Input format",
            "type": "string",
            "enum": [
              "auto",
              "srt",
              "vtt",
              "ass",
              "sbv"
            ],
            "default": "auto"
          },
          "outputFormat": {
            "title": "Output format",
            "type": "string",
            "enum": [
              "same",
              "srt",
              "vtt",
              "ass",
              "sbv"
            ],
            "default": "same"
          },
          "shiftMs": {
            "title": "Shift all times",
            "description": "Positive = later, negative = earlier. 1000 ms = 1 s.",
            "type": "integer",
            "minimum": -36000000,
            "maximum": 36000000,
            "default": 0,
            "x-unit": "ms"
          },
          "syncCueA": {
            "title": "Sync point 1: cue number",
            "description": "Two-point sync fixes subtitles that drift (e.g. 25 vs 23.976 fps). Give two cues and when they should start.",
            "type": "integer",
            "minimum": 1,
            "maximum": 100000
          },
          "syncTimeA": {
            "title": "Sync point 1: should start at",
            "type": "string",
            "maxLength": 20
          },
          "syncCueB": {
            "title": "Sync point 2: cue number",
            "type": "integer",
            "minimum": 1,
            "maximum": 100000
          },
          "syncTimeB": {
            "title": "Sync point 2: should start at",
            "type": "string",
            "maxLength": 20
          },
          "removeHi": {
            "title": "Remove hearing-impaired tags ([music], (sighs), speaker labels like JOHN:, ♪ lines)",
            "type": "boolean",
            "default": false
          },
          "mergeLines": {
            "title": "Merge multi-line cues into one line when they fit the maximum line length",
            "type": "boolean",
            "default": false
          },
          "maxLineLength": {
            "title": "Maximum line length",
            "description": "0 = no wrapping. 42 is a common limit for TV/streaming subtitles.",
            "type": "integer",
            "minimum": 0,
            "maximum": 100,
            "default": 0,
            "x-unit": "characters"
          },
          "maxLines": {
            "title": "Maximum lines per cue",
            "description": "Longer cues are split into several cues, with time shared by text length.",
            "type": "integer",
            "minimum": 1,
            "maximum": 4,
            "default": 2
          },
          "fixOverlaps": {
            "title": "Fix overlapping cues (shorten the earlier cue)",
            "type": "boolean",
            "default": false
          },
          "minGapMs": {
            "title": "Minimum gap between cues",
            "description": "Used with \"Fix overlapping cues\". 83 ms ≈ 2 frames at 24 fps.",
            "type": "integer",
            "minimum": 0,
            "maximum": 2000,
            "default": 0,
            "x-unit": "ms"
          },
          "maxCps": {
            "title": "Reading speed limit for the report",
            "description": "Cues faster than this are listed. 15–20 characters per second are common guidelines.",
            "type": "number",
            "minimum": 5,
            "maximum": 40,
            "default": 17,
            "x-unit": "chars/s"
          }
        },
        "required": []
      },
      "SubtitleStudioResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "inputFormat",
              "outputFormat",
              "encoding",
              "cuesIn",
              "cuesOut",
              "lastEndMs",
              "operations",
              "issues",
              "issuesAfter",
              "readingSpeed",
              "output",
              "filename"
            ],
            "properties": {
              "inputFormat": {
                "type": "string",
                "enum": [
                  "srt",
                  "vtt",
                  "ass",
                  "sbv"
                ]
              },
              "outputFormat": {
                "type": "string",
                "enum": [
                  "srt",
                  "vtt",
                  "ass",
                  "sbv"
                ]
              },
              "encoding": {
                "type": "string"
              },
              "cuesIn": {
                "type": "integer"
              },
              "cuesOut": {
                "type": "integer"
              },
              "lastEndMs": {
                "type": "integer"
              },
              "operations": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "hearingImpairedChanged": {
                    "type": "integer"
                  },
                  "hearingImpairedRemovedCues": {
                    "type": "integer"
                  },
                  "mergedCues": {
                    "type": "integer"
                  },
                  "rewrappedCues": {
                    "type": "integer"
                  },
                  "splitCues": {
                    "type": "integer"
                  },
                  "syncFactor": {
                    "type": "number"
                  },
                  "syncOffsetMs": {
                    "type": "integer"
                  },
                  "shiftMs": {
                    "type": "integer"
                  },
                  "clampedCues": {
                    "type": "integer"
                  },
                  "droppedCues": {
                    "type": "integer"
                  },
                  "overlapsFixed": {
                    "type": "integer"
                  },
                  "overlapsUnresolved": {
                    "type": "integer"
                  }
                }
              },
              "issues": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "line",
                    "severity",
                    "message"
                  ],
                  "properties": {
                    "line": {
                      "type": "integer"
                    },
                    "severity": {
                      "type": "string",
                      "enum": [
                        "error",
                        "warning"
                      ]
                    },
                    "message": {
                      "type": "string"
                    }
                  }
                }
              },
              "issuesAfter": {
                "type": "array",
                "items": {
                  "type": "object"
                }
              },
              "readingSpeed": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "maxCps",
                  "averageCps",
                  "limit",
                  "cuesOverLimit"
                ],
                "properties": {
                  "maxCps": {
                    "type": "number"
                  },
                  "averageCps": {
                    "type": "number"
                  },
                  "limit": {
                    "type": "number"
                  },
                  "cuesOverLimit": {
                    "type": "integer"
                  }
                }
              },
              "output": {
                "type": "string",
                "description": "The converted subtitle file."
              },
              "filename": {
                "type": "string"
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "SvgOptimizerInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "svgFile": {
            "title": "SVG file",
            "description": "An .svg or .svgz file, max 5 MB. Alternatively paste the SVG code below. Upload as {filename, contentType?, contentBase64}. Max 5120 KiB. Accepts .svg,.svgz,image/svg+xml.",
            "type": "object",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "svgText": {
            "title": "Or paste SVG code",
            "type": "string",
            "maxLength": 2000000
          },
          "precision": {
            "title": "Decimal places",
            "description": "Coordinates and lengths are rounded to this many decimals. 1–3 is usually invisible; transforms keep two more.",
            "type": "integer",
            "minimum": 0,
            "maximum": 8,
            "default": 3
          },
          "minifyPaths": {
            "title": "Minify path data (shortest relative/absolute commands)",
            "type": "boolean",
            "default": true
          },
          "removeHidden": {
            "title": "Remove hidden elements and unused definitions",
            "type": "boolean",
            "default": true
          },
          "removeDimensions": {
            "title": "Remove width/height (keep viewBox so the SVG scales responsively)",
            "type": "boolean",
            "default": false
          }
        },
        "required": []
      },
      "SvgOptimizerResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "bytesBefore",
              "bytesAfter",
              "savingsPercent",
              "gzipBefore",
              "gzipAfter",
              "elementsBefore",
              "elementsAfter",
              "precision",
              "steps",
              "securityFindings",
              "hasViewBox",
              "artifact"
            ],
            "properties": {
              "bytesBefore": {
                "type": "integer"
              },
              "bytesAfter": {
                "type": "integer"
              },
              "savingsPercent": {
                "type": "number"
              },
              "gzipBefore": {
                "type": "integer",
                "description": "Size after gzip -9, as most web servers deliver SVG."
              },
              "gzipAfter": {
                "type": "integer"
              },
              "elementsBefore": {
                "type": "integer"
              },
              "elementsAfter": {
                "type": "integer"
              },
              "precision": {
                "type": "integer"
              },
              "hasViewBox": {
                "type": "boolean"
              },
              "steps": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "id",
                    "label",
                    "bytesBefore",
                    "bytesAfter",
                    "changes"
                  ],
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "label": {
                      "type": "string"
                    },
                    "bytesBefore": {
                      "type": "integer"
                    },
                    "bytesAfter": {
                      "type": "integer"
                    },
                    "changes": {
                      "type": "integer"
                    }
                  }
                }
              },
              "securityFindings": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "kind",
                    "detail"
                  ],
                  "properties": {
                    "kind": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              },
              "artifact": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "artifactId",
                  "filename",
                  "mime",
                  "bytes",
                  "sha256",
                  "path"
                ],
                "properties": {
                  "artifactId": {
                    "type": "string"
                  },
                  "filename": {
                    "type": "string"
                  },
                  "mime": {
                    "type": "string"
                  },
                  "bytes": {
                    "type": "integer"
                  },
                  "sha256": {
                    "type": "string"
                  },
                  "path": {
                    "type": "string",
                    "description": "Download path on the same site (valid for about 2 hours)."
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "AudioConverterInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "file": {
            "title": "Audio file",
            "description": "MP3, WAV, FLAC, Ogg/Opus, M4A/AAC, AIFF or WMA (also the first audio track of a video), max 100 MB and 2 hours. Processed on our server in a private temporary folder that is deleted afterwards; the result can be downloaded for about 2 hours. Upload as {filename, contentType?, contentBase64}. Max 102400 KiB. Accepts .mp3,.wav,.flac,.ogg,.oga,.opus,.m4a,.aac,.aif,.aiff,.wma,.mp4,.mov,.webm,.mkv,audio/*.",
            "type": "object",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "format": {
            "title": "Output format",
            "type": "string",
            "enum": [
              "mp3",
              "m4a",
              "ogg",
              "opus",
              "flac",
              "wav",
              "aiff"
            ],
            "default": "mp3"
          },
          "mode": {
            "title": "Bitrate mode (lossy formats)",
            "type": "string",
            "enum": [
              "cbr",
              "vbr"
            ],
            "default": "cbr"
          },
          "bitrate": {
            "title": "Bitrate",
            "description": "Used in fixed-bitrate mode. 128 kbit/s is fine for speech, 192–320 kbit/s for music.",
            "type": "string",
            "enum": [
              "32",
              "48",
              "64",
              "96",
              "128",
              "160",
              "192",
              "224",
              "256",
              "320"
            ],
            "default": "192"
          },
          "vbrQuality": {
            "title": "VBR quality",
            "type": "string",
            "enum": [
              "high",
              "medium",
              "low"
            ],
            "default": "high"
          },
          "sampleRate": {
            "title": "Sample rate",
            "type": "string",
            "enum": [
              "keep",
              "8000",
              "16000",
              "22050",
              "32000",
              "44100",
              "48000",
              "96000"
            ],
            "default": "keep"
          },
          "channels": {
            "title": "Channels",
            "type": "string",
            "enum": [
              "keep",
              "1",
              "2"
            ],
            "default": "keep"
          },
          "bitDepth": {
            "title": "Bit depth (WAV, FLAC, AIFF)",
            "type": "string",
            "enum": [
              "16",
              "24"
            ],
            "default": "16"
          },
          "keepTags": {
            "title": "Keep tags (title, artist, album …) and the album cover where the format supports it",
            "type": "boolean",
            "default": true
          }
        },
        "required": [
          "file"
        ]
      },
      "AudioConverterResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "inputContainer",
              "outputFormat",
              "encoderSetting",
              "sampleRate",
              "channels",
              "durationSeconds",
              "originalBytes",
              "outputBytes",
              "tagsKept",
              "coverKept",
              "before",
              "after",
              "artifact"
            ],
            "properties": {
              "inputContainer": {
                "type": "string"
              },
              "outputFormat": {
                "type": "string",
                "enum": [
                  "mp3",
                  "wav",
                  "flac",
                  "ogg",
                  "opus",
                  "m4a",
                  "aiff"
                ]
              },
              "encoderSetting": {
                "type": "string"
              },
              "sampleRate": {
                "type": "integer"
              },
              "channels": {
                "type": "integer"
              },
              "durationSeconds": {
                "type": "number"
              },
              "originalBytes": {
                "type": "integer"
              },
              "outputBytes": {
                "type": "integer"
              },
              "tagsKept": {
                "type": "boolean"
              },
              "coverKept": {
                "type": "boolean"
              },
              "before": {
                "type": "object",
                "required": [
                  "container",
                  "durationSeconds",
                  "bytes",
                  "streams"
                ],
                "properties": {
                  "container": {
                    "type": "string"
                  },
                  "durationSeconds": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "bytes": {
                    "type": "integer"
                  },
                  "bitRateKbps": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "streams": {
                    "type": "array",
                    "items": {
                      "type": "object"
                    }
                  },
                  "tags": {
                    "type": "object"
                  }
                }
              },
              "after": {
                "type": "object",
                "required": [
                  "container",
                  "durationSeconds",
                  "bytes",
                  "streams"
                ],
                "properties": {
                  "container": {
                    "type": "string"
                  },
                  "durationSeconds": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "bytes": {
                    "type": "integer"
                  },
                  "bitRateKbps": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "streams": {
                    "type": "array",
                    "items": {
                      "type": "object"
                    }
                  },
                  "tags": {
                    "type": "object"
                  }
                }
              },
              "artifact": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "artifactId",
                  "filename",
                  "mime",
                  "bytes",
                  "sha256",
                  "path"
                ],
                "properties": {
                  "artifactId": {
                    "type": "string"
                  },
                  "filename": {
                    "type": "string"
                  },
                  "mime": {
                    "type": "string"
                  },
                  "bytes": {
                    "type": "integer"
                  },
                  "sha256": {
                    "type": "string"
                  },
                  "path": {
                    "type": "string",
                    "description": "Download path on the same site (valid for about 2 hours)."
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "VideoConverterInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "file": {
            "title": "Video file",
            "description": "MP4, MOV, MKV, WebM, AVI, MPEG-TS, WMV, FLV; max 250 MB and 20 minutes. Processed on our server in a private temporary folder that is deleted afterwards; the result can be downloaded for about 2 hours. Upload as {filename, contentType?, contentBase64}. Max 256000 KiB. Accepts .mp4,.m4v,.mov,.mkv,.webm,.avi,.ts,.mts,.m2ts,.mpg,.mpeg,.wmv,.flv,.3gp,video/*.",
            "type": "object",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "format": {
            "title": "Output format",
            "type": "string",
            "enum": [
              "mp4",
              "webm",
              "mov",
              "mkv"
            ],
            "default": "mp4"
          },
          "remux": {
            "title": "Remux only: change the container without re-encoding (fails if the codecs do not fit the container)",
            "type": "boolean",
            "default": false
          },
          "quality": {
            "title": "Quality",
            "type": "string",
            "enum": [
              "high",
              "medium",
              "low"
            ],
            "default": "medium"
          },
          "crf": {
            "title": "Custom CRF (optional)",
            "description": "Overrides the quality preset. Lower = better and larger. H.264: 0–51 (18–28 typical); VP9: 0–63 (24–40 typical).",
            "type": "integer",
            "minimum": 0,
            "maximum": 63
          },
          "maxHeight": {
            "title": "Maximum resolution",
            "description": "Caps the short side (height for landscape, width for portrait). Never enlarges.",
            "type": "string",
            "enum": [
              "keep",
              "2160",
              "1440",
              "1080",
              "720",
              "480",
              "360"
            ],
            "default": "keep"
          },
          "fps": {
            "title": "Frame rate",
            "type": "string",
            "enum": [
              "keep",
              "60",
              "50",
              "30",
              "25",
              "24",
              "15"
            ],
            "default": "keep"
          },
          "audio": {
            "title": "Audio",
            "type": "string",
            "enum": [
              "auto",
              "reencode",
              "remove"
            ],
            "default": "auto"
          }
        },
        "required": [
          "file"
        ]
      },
      "VideoConverterResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "outputFormat",
              "remuxed",
              "videoCodec",
              "audioMode",
              "crf",
              "width",
              "height",
              "fps",
              "durationSeconds",
              "originalBytes",
              "outputBytes",
              "before",
              "after",
              "artifact"
            ],
            "properties": {
              "outputFormat": {
                "type": "string",
                "enum": [
                  "mp4",
                  "webm",
                  "mov",
                  "mkv"
                ]
              },
              "remuxed": {
                "type": "boolean"
              },
              "videoCodec": {
                "type": "string"
              },
              "audioMode": {
                "type": "string",
                "enum": [
                  "copy",
                  "reencode",
                  "none"
                ]
              },
              "crf": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "width": {
                "type": "integer"
              },
              "height": {
                "type": "integer"
              },
              "fps": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "durationSeconds": {
                "type": "number"
              },
              "originalBytes": {
                "type": "integer"
              },
              "outputBytes": {
                "type": "integer"
              },
              "estimatedEncodeSeconds": {
                "type": "number"
              },
              "before": {
                "type": "object",
                "required": [
                  "container",
                  "durationSeconds",
                  "bytes",
                  "streams"
                ],
                "properties": {
                  "container": {
                    "type": "string"
                  },
                  "durationSeconds": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "bytes": {
                    "type": "integer"
                  },
                  "bitRateKbps": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "streams": {
                    "type": "array",
                    "items": {
                      "type": "object"
                    }
                  },
                  "tags": {
                    "type": "object"
                  }
                }
              },
              "after": {
                "type": "object",
                "required": [
                  "container",
                  "durationSeconds",
                  "bytes",
                  "streams"
                ],
                "properties": {
                  "container": {
                    "type": "string"
                  },
                  "durationSeconds": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "bytes": {
                    "type": "integer"
                  },
                  "bitRateKbps": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "streams": {
                    "type": "array",
                    "items": {
                      "type": "object"
                    }
                  },
                  "tags": {
                    "type": "object"
                  }
                }
              },
              "artifact": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "artifactId",
                  "filename",
                  "mime",
                  "bytes",
                  "sha256",
                  "path"
                ],
                "properties": {
                  "artifactId": {
                    "type": "string"
                  },
                  "filename": {
                    "type": "string"
                  },
                  "mime": {
                    "type": "string"
                  },
                  "bytes": {
                    "type": "integer"
                  },
                  "sha256": {
                    "type": "string"
                  },
                  "path": {
                    "type": "string",
                    "description": "Download path on the same site (valid for about 2 hours)."
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "VerticalVideoReframerInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "file": {
            "title": "Video file",
            "description": "MP4, MOV, MKV, WebM, AVI; max 250 MB and 20 minutes. Processed on our server in a private temporary folder that is deleted afterwards; the result can be downloaded for about 2 hours. Upload as {filename, contentType?, contentBase64}. Max 256000 KiB. Accepts .mp4,.m4v,.mov,.mkv,.webm,.avi,.ts,.mts,.m2ts,.mpg,.mpeg,.wmv,.flv,.3gp,video/*.",
            "type": "object",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "aspect": {
            "title": "Target aspect ratio",
            "type": "string",
            "enum": [
              "9:16",
              "1:1",
              "4:5",
              "16:9"
            ],
            "default": "9:16"
          },
          "mode": {
            "title": "Reframing",
            "type": "string",
            "enum": [
              "crop",
              "blur",
              "bars"
            ],
            "default": "blur"
          },
          "position": {
            "title": "Crop position",
            "type": "string",
            "enum": [
              "center",
              "left",
              "right",
              "custom"
            ],
            "default": "center"
          },
          "offsetPct": {
            "title": "Custom crop offset",
            "description": "0 = left edge, 50 = centre, 100 = right edge (top/bottom for tall sources).",
            "type": "integer",
            "minimum": 0,
            "maximum": 100,
            "default": 50,
            "x-unit": "%"
          },
          "size": {
            "title": "Resolution (short side)",
            "type": "string",
            "enum": [
              "1080",
              "720",
              "540",
              "360"
            ],
            "default": "1080"
          },
          "barColor": {
            "title": "Bar colour",
            "type": "string",
            "enum": [
              "black",
              "white"
            ],
            "default": "black"
          },
          "blur": {
            "title": "Background blur",
            "type": "string",
            "enum": [
              "light",
              "medium",
              "strong"
            ],
            "default": "medium"
          }
        },
        "required": [
          "file"
        ]
      },
      "VerticalVideoReframerResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "aspect",
              "mode",
              "width",
              "height",
              "sourceWidth",
              "sourceHeight",
              "geometry",
              "upscaled",
              "durationSeconds",
              "outputBytes",
              "artifact",
              "preview"
            ],
            "properties": {
              "aspect": {
                "type": "string"
              },
              "mode": {
                "type": "string",
                "enum": [
                  "crop",
                  "blur",
                  "bars"
                ]
              },
              "width": {
                "type": "integer"
              },
              "height": {
                "type": "integer"
              },
              "sourceWidth": {
                "type": "integer"
              },
              "sourceHeight": {
                "type": "integer"
              },
              "geometry": {
                "type": "object",
                "description": "crop: scaled size, x/y offset and the share of the picture kept; fit: picture size, position and the share of the frame it covers."
              },
              "upscaled": {
                "type": "boolean"
              },
              "durationSeconds": {
                "type": "number"
              },
              "outputBytes": {
                "type": "integer"
              },
              "artifact": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "artifactId",
                  "filename",
                  "mime",
                  "bytes",
                  "sha256",
                  "path"
                ],
                "properties": {
                  "artifactId": {
                    "type": "string"
                  },
                  "filename": {
                    "type": "string"
                  },
                  "mime": {
                    "type": "string"
                  },
                  "bytes": {
                    "type": "integer"
                  },
                  "sha256": {
                    "type": "string"
                  },
                  "path": {
                    "type": "string",
                    "description": "Download path on the same site (valid for about 2 hours)."
                  }
                }
              },
              "preview": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "artifactId",
                  "filename",
                  "mime",
                  "bytes",
                  "sha256",
                  "path"
                ],
                "properties": {
                  "artifactId": {
                    "type": "string"
                  },
                  "filename": {
                    "type": "string"
                  },
                  "mime": {
                    "type": "string"
                  },
                  "bytes": {
                    "type": "integer"
                  },
                  "sha256": {
                    "type": "string"
                  },
                  "path": {
                    "type": "string",
                    "description": "Download path on the same site (valid for about 2 hours)."
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "VideoCompressorInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "file": {
            "title": "Video file",
            "description": "MP4, MOV, MKV, WebM, AVI, MPEG-TS, WMV, FLV; max 250 MB and 20 minutes. Processed on our server in a private temporary folder that is deleted afterwards; the result can be downloaded for about 2 hours. Upload as {filename, contentType?, contentBase64}. Max 256000 KiB. Accepts .mp4,.m4v,.mov,.mkv,.webm,.avi,.ts,.mts,.m2ts,.mpg,.mpeg,.wmv,.flv,.3gp,video/*.",
            "type": "object",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "mode": {
            "title": "Compression mode",
            "type": "string",
            "enum": [
              "size",
              "quality"
            ],
            "default": "size"
          },
          "preset": {
            "title": "Size preset",
            "type": "string",
            "enum": [
              "custom",
              "email-25",
              "whatsapp-16",
              "whatsapp-100",
              "discord-10"
            ],
            "default": "email-25"
          },
          "targetMb": {
            "title": "Custom target size",
            "description": "Only used with \"Custom target size\". 1 MB = 1,000,000 bytes.",
            "type": "number",
            "minimum": 0.01,
            "maximum": 2000,
            "default": 25,
            "x-unit": "MB"
          },
          "crf": {
            "title": "CRF (quality mode)",
            "description": "Lower = better and larger. 23 is the x264 default; 26–30 is small with acceptable quality.",
            "type": "integer",
            "minimum": 18,
            "maximum": 40,
            "default": 26
          },
          "resolution": {
            "title": "Resolution",
            "type": "string",
            "enum": [
              "auto",
              "keep",
              "1080",
              "720",
              "540",
              "480",
              "360"
            ],
            "default": "auto"
          },
          "audio": {
            "title": "Audio",
            "type": "string",
            "enum": [
              "auto",
              "remove"
            ],
            "default": "auto"
          }
        },
        "required": [
          "file"
        ]
      },
      "VideoCompressorResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "mode",
              "targetBytes",
              "originalBytes",
              "outputBytes",
              "withinTarget",
              "videoKbps",
              "audioKbps",
              "width",
              "height",
              "fps",
              "durationSeconds",
              "suggestions",
              "artifact"
            ],
            "properties": {
              "mode": {
                "type": "string",
                "enum": [
                  "size",
                  "quality"
                ]
              },
              "preset": {
                "type": "string"
              },
              "targetBytes": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "originalBytes": {
                "type": "integer"
              },
              "outputBytes": {
                "type": "integer"
              },
              "withinTarget": {
                "type": [
                  "boolean",
                  "null"
                ]
              },
              "savingsPercent": {
                "type": "number"
              },
              "videoKbps": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "Two-pass target video bitrate (null in CRF mode)."
              },
              "audioKbps": {
                "type": "integer"
              },
              "crf": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "width": {
                "type": "integer"
              },
              "height": {
                "type": "integer"
              },
              "fps": {
                "type": "number"
              },
              "durationSeconds": {
                "type": "number"
              },
              "suggestions": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "height",
                    "width",
                    "bitsPerPixel",
                    "verdict"
                  ],
                  "properties": {
                    "height": {
                      "type": "integer"
                    },
                    "width": {
                      "type": "integer"
                    },
                    "bitsPerPixel": {
                      "type": "number"
                    },
                    "verdict": {
                      "type": "string"
                    }
                  }
                }
              },
              "artifact": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "artifactId",
                  "filename",
                  "mime",
                  "bytes",
                  "sha256",
                  "path"
                ],
                "properties": {
                  "artifactId": {
                    "type": "string"
                  },
                  "filename": {
                    "type": "string"
                  },
                  "mime": {
                    "type": "string"
                  },
                  "bytes": {
                    "type": "integer"
                  },
                  "sha256": {
                    "type": "string"
                  },
                  "path": {
                    "type": "string",
                    "description": "Download path on the same site (valid for about 2 hours)."
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "VideoCutterMergerInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "mode": {
            "title": "What to do",
            "type": "string",
            "enum": [
              "cut",
              "remove",
              "merge"
            ],
            "default": "cut"
          },
          "file": {
            "title": "Video file (clip 1)",
            "description": "MP4, MOV, MKV, WebM, AVI, MPEG-TS; max 250 MB and 20 minutes (in total when merging). Processed on our server in a private temporary folder that is deleted afterwards; the result can be downloaded for about 2 hours. Upload as {filename, contentType?, contentBase64}. Max 256000 KiB. Accepts .mp4,.m4v,.mov,.mkv,.webm,.avi,.ts,.mts,.m2ts,.mpg,.mpeg,.wmv,.flv,.3gp,video/*.",
            "type": "object",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "file2": {
            "title": "Clip 2 (merge mode)",
            "type": "object",
            "description": "Upload as {filename, contentType?, contentBase64}. Max 256000 KiB. Accepts .mp4,.m4v,.mov,.mkv,.webm,.avi,.ts,.mts,.m2ts,.mpg,.mpeg,.wmv,.flv,.3gp,video/*.",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "file3": {
            "title": "Clip 3 (merge mode)",
            "type": "object",
            "description": "Upload as {filename, contentType?, contentBase64}. Max 256000 KiB. Accepts .mp4,.m4v,.mov,.mkv,.webm,.avi,.ts,.mts,.m2ts,.mpg,.mpeg,.wmv,.flv,.3gp,video/*.",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "file4": {
            "title": "Clip 4 (merge mode)",
            "type": "object",
            "description": "Upload as {filename, contentType?, contentBase64}. Max 256000 KiB. Accepts .mp4,.m4v,.mov,.mkv,.webm,.avi,.ts,.mts,.m2ts,.mpg,.mpeg,.wmv,.flv,.3gp,video/*.",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "file5": {
            "title": "Clip 5 (merge mode)",
            "type": "object",
            "description": "Upload as {filename, contentType?, contentBase64}. Max 256000 KiB. Accepts .mp4,.m4v,.mov,.mkv,.webm,.avi,.ts,.mts,.m2ts,.mpg,.mpeg,.wmv,.flv,.3gp,video/*.",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "start": {
            "title": "Start time",
            "description": "Seconds, mm:ss or hh:mm:ss.mmm.",
            "type": "string",
            "maxLength": 20
          },
          "end": {
            "title": "End time",
            "description": "Empty = to the end.",
            "type": "string",
            "maxLength": 20
          },
          "accuracy": {
            "title": "Cut accuracy",
            "type": "string",
            "enum": [
              "copy",
              "exact"
            ],
            "default": "copy"
          },
          "forceReencode": {
            "title": "Merge: always normalise and re-encode (use if a lossless merge plays badly)",
            "type": "boolean",
            "default": false
          }
        },
        "required": [
          "file"
        ]
      },
      "VideoCutterMergerResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "mode",
              "method",
              "segments",
              "clips",
              "durationSeconds",
              "outputBytes",
              "outputFormat",
              "artifact"
            ],
            "properties": {
              "mode": {
                "type": "string",
                "enum": [
                  "cut",
                  "remove",
                  "merge"
                ]
              },
              "method": {
                "type": "string",
                "enum": [
                  "stream-copy",
                  "re-encode",
                  "concat-demuxer",
                  "concat-filter"
                ]
              },
              "segments": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "requestedStart",
                    "requestedEnd",
                    "actualStart",
                    "actualEnd"
                  ],
                  "properties": {
                    "requestedStart": {
                      "type": "number"
                    },
                    "requestedEnd": {
                      "type": "number"
                    },
                    "actualStart": {
                      "type": "number"
                    },
                    "actualEnd": {
                      "type": "number"
                    }
                  }
                }
              },
              "clips": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "clip",
                    "durationSeconds",
                    "width",
                    "height",
                    "videoCodec"
                  ],
                  "properties": {
                    "clip": {
                      "type": "integer"
                    },
                    "durationSeconds": {
                      "type": "number"
                    },
                    "width": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "height": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "videoCodec": {
                      "type": "string"
                    }
                  }
                }
              },
              "mismatch": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "durationSeconds": {
                "type": "number"
              },
              "outputBytes": {
                "type": "integer"
              },
              "outputFormat": {
                "type": "string"
              },
              "artifact": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "artifactId",
                  "filename",
                  "mime",
                  "bytes",
                  "sha256",
                  "path"
                ],
                "properties": {
                  "artifactId": {
                    "type": "string"
                  },
                  "filename": {
                    "type": "string"
                  },
                  "mime": {
                    "type": "string"
                  },
                  "bytes": {
                    "type": "integer"
                  },
                  "sha256": {
                    "type": "string"
                  },
                  "path": {
                    "type": "string",
                    "description": "Download path on the same site (valid for about 2 hours)."
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "VideoToGifCreatorInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "file": {
            "title": "Video file",
            "description": "MP4, MOV, MKV, WebM, AVI; max 250 MB and 20 minutes. Processed on our server in a private temporary folder that is deleted afterwards; the result can be downloaded for about 2 hours. Upload as {filename, contentType?, contentBase64}. Max 256000 KiB. Accepts .mp4,.m4v,.mov,.mkv,.webm,.avi,.ts,.mts,.m2ts,.mpg,.mpeg,.wmv,.flv,.3gp,video/*.",
            "type": "object",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "start": {
            "title": "Start time",
            "description": "Seconds, mm:ss or hh:mm:ss.mmm.",
            "type": "string",
            "maxLength": 20
          },
          "duration": {
            "title": "Length",
            "description": "At most 15 seconds.",
            "type": "number",
            "minimum": 0.2,
            "maximum": 15,
            "default": 3,
            "x-unit": "s"
          },
          "fps": {
            "title": "Frame rate",
            "description": "10–15 fps is typical for GIFs; more frames = larger file.",
            "type": "integer",
            "minimum": 1,
            "maximum": 30,
            "default": 12,
            "x-unit": "fps"
          },
          "width": {
            "title": "Width",
            "description": "Height follows the aspect ratio. Never wider than the source.",
            "type": "integer",
            "minimum": 32,
            "maximum": 800,
            "default": 480,
            "x-unit": "px"
          },
          "format": {
            "title": "Output format",
            "type": "string",
            "enum": [
              "gif",
              "webp"
            ],
            "default": "gif"
          },
          "dither": {
            "title": "Dithering (GIF)",
            "type": "string",
            "enum": [
              "sierra2_4a",
              "floyd_steinberg",
              "bayer",
              "none"
            ],
            "default": "sierra2_4a"
          },
          "colors": {
            "title": "Palette colours (GIF)",
            "type": "integer",
            "minimum": 8,
            "maximum": 256,
            "default": 256
          },
          "statsMode": {
            "title": "Palette from (GIF)",
            "type": "string",
            "enum": [
              "full",
              "diff"
            ],
            "default": "full"
          },
          "loop": {
            "title": "Loop forever",
            "type": "boolean",
            "default": true
          },
          "webpQuality": {
            "title": "WebP quality",
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 75
          }
        },
        "required": [
          "file"
        ]
      },
      "VideoToGifCreatorResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "format",
              "startSeconds",
              "durationSeconds",
              "fps",
              "width",
              "height",
              "frames",
              "outputBytes",
              "bytesPerFrame",
              "artifact"
            ],
            "properties": {
              "format": {
                "type": "string",
                "enum": [
                  "gif",
                  "webp"
                ]
              },
              "startSeconds": {
                "type": "number"
              },
              "durationSeconds": {
                "type": "number"
              },
              "fps": {
                "type": "integer"
              },
              "width": {
                "type": "integer"
              },
              "height": {
                "type": "integer"
              },
              "frames": {
                "type": "integer"
              },
              "dither": {
                "type": "string"
              },
              "colors": {
                "type": "integer"
              },
              "outputBytes": {
                "type": "integer"
              },
              "bytesPerFrame": {
                "type": "integer"
              },
              "artifact": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "artifactId",
                  "filename",
                  "mime",
                  "bytes",
                  "sha256",
                  "path"
                ],
                "properties": {
                  "artifactId": {
                    "type": "string"
                  },
                  "filename": {
                    "type": "string"
                  },
                  "mime": {
                    "type": "string"
                  },
                  "bytes": {
                    "type": "integer"
                  },
                  "sha256": {
                    "type": "string"
                  },
                  "path": {
                    "type": "string",
                    "description": "Download path on the same site (valid for about 2 hours)."
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "VideoToAudioExtractorInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "file": {
            "title": "Video file",
            "description": "MP4, MOV, MKV, WebM, AVI, MPEG-TS, WMV, FLV; max 250 MB and 20 minutes. Processed on our server in a private temporary folder that is deleted afterwards; the result can be downloaded for about 2 hours. Upload as {filename, contentType?, contentBase64}. Max 256000 KiB. Accepts .mp4,.m4v,.mov,.mkv,.webm,.avi,.ts,.mts,.m2ts,.mpg,.mpeg,.wmv,.flv,.3gp,video/*.",
            "type": "object",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "stream": {
            "title": "Audio track number",
            "description": "1 = first audio track. The report lists all tracks with language and codec.",
            "type": "integer",
            "minimum": 1,
            "maximum": 32,
            "default": 1
          },
          "format": {
            "title": "Output",
            "type": "string",
            "enum": [
              "mp3",
              "wav",
              "flac",
              "copy"
            ],
            "default": "mp3"
          },
          "mp3Quality": {
            "title": "MP3 quality",
            "type": "string",
            "enum": [
              "v0",
              "v2",
              "v4",
              "320",
              "192",
              "128"
            ],
            "default": "v2"
          },
          "start": {
            "title": "Start time",
            "description": "Optional. Seconds, mm:ss or hh:mm:ss.mmm.",
            "type": "string",
            "maxLength": 20
          },
          "end": {
            "title": "End time",
            "description": "Optional. Empty = to the end.",
            "type": "string",
            "maxLength": 20
          }
        },
        "required": [
          "file"
        ]
      },
      "VideoToAudioExtractorResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "tracks",
              "selectedTrack",
              "sourceCodec",
              "outputFormat",
              "reencoded",
              "startSeconds",
              "endSeconds",
              "durationSeconds",
              "outputBytes",
              "artifact"
            ],
            "properties": {
              "tracks": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "track",
                    "codec",
                    "channels",
                    "sampleRate",
                    "language"
                  ],
                  "properties": {
                    "track": {
                      "type": "integer"
                    },
                    "codec": {
                      "type": "string"
                    },
                    "channels": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "sampleRate": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "language": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  }
                }
              },
              "selectedTrack": {
                "type": "integer"
              },
              "sourceCodec": {
                "type": "string"
              },
              "outputFormat": {
                "type": "string"
              },
              "reencoded": {
                "type": "boolean"
              },
              "startSeconds": {
                "type": "number"
              },
              "endSeconds": {
                "type": "number"
              },
              "durationSeconds": {
                "type": "number"
              },
              "outputBytes": {
                "type": "integer"
              },
              "artifact": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "artifactId",
                  "filename",
                  "mime",
                  "bytes",
                  "sha256",
                  "path"
                ],
                "properties": {
                  "artifactId": {
                    "type": "string"
                  },
                  "filename": {
                    "type": "string"
                  },
                  "mime": {
                    "type": "string"
                  },
                  "bytes": {
                    "type": "integer"
                  },
                  "sha256": {
                    "type": "string"
                  },
                  "path": {
                    "type": "string",
                    "description": "Download path on the same site (valid for about 2 hours)."
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      }
    }
  }
}