此 MCP 可以做什么
Analyzes and converts documents, images, audio, video, archives, data files, and other media formats, with PDF chat and file inspection utilities.
工具
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (MP3, WAV, AAC, OGG, FLAC, M4A, WMA, OPUS or AIFF)'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Image (JPG, PNG, WebP)'}, 'colors': {'type': 'integer', 'title': 'Colors to extract', 'default': 8, 'maximum': 32, 'minimum': 1, 'description': 'How many dominant colours to pull out of the image.'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (CSV)'}, 'strict': {'type': 'boolean', 'title': 'Refuse partial answers', 'default': False, 'description': 'Files over 10,000 rows are analysed from the first 10,000 only. Switch on to get an error instead of statistics that cover part of the file.'}}}
输入模式
{'type': 'object', 'required': ['files'], 'properties': {'files': {'type': 'array', 'items': {'type': 'string', 'format': 'binary'}, 'maxItems': 20, 'minItems': 2, 'description': '2-20 files to compare (any type). Files beyond the first 20 are silently ignored.'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (TXT, HTML, CSV, XML)'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (any)'}}}
输入模式
{'type': 'object', 'properties': {'file_a': {'type': 'string', 'title': 'Original file', 'format': 'binary', 'description': 'First file — TXT, CSV, JSON, XML. Send file_a AND file_b together (file mode).'}, 'file_b': {'type': 'string', 'title': 'Updated file', 'format': 'binary', 'description': 'Second file.'}, 'strict': {'type': 'boolean', 'title': 'Refuse partial answers', 'default': False, 'description': 'Only the first 2,000 lines of each side are compared. Switch on to get an error instead of a comparison that covers part of the files.'}, 'text_a': {'type': 'string', 'x-ui': {'multiline': True, 'unset_label': 'Leave both texts empty to compare two files'}, 'title': 'Original text', 'description': 'The BEFORE version. Anything that appears only here is reported as removed.'}, 'text_b': {'type': 'string', 'x-ui': {'multiline': True, 'unset_label': 'Leave both texts empty to compare two files'}, 'title': 'Updated text', 'description': 'The AFTER version. Anything that appears only here is reported as added.'}}, 'x-require-one-of': [['file_a', 'file_b'], ['text_a', 'text_b']]}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (PDF, DOCX)'}}}
输入模式
{'type': 'object', 'required': ['text'], 'properties': {'mode': {'enum': ['strict', 'tone-preserving'], 'type': 'string', 'title': 'How picky should it be', 'default': 'tone-preserving', 'description': 'Keep my voice leaves your phrasing alone; Strict also flags casual or loose wording.', 'x-show-when': {'include_llm': [True]}}, 'text': {'type': 'string', 'x-ui': {'multiline': True}, 'description': 'The text to check (max 50,000 characters).'}, 'style': {'enum': ['apa', 'mla', 'chicago', 'ap', 'ieee', 'none'], 'type': 'string', 'x-ui': {'labels': {'ap': 'AP', 'apa': 'APA', 'mla': 'MLA', 'ieee': 'IEEE', 'none': 'No style guide', 'chicago': 'Chicago'}}, 'title': 'Style guide', 'default': 'none', 'description': 'Style-guide conventions to enforce (e.g. Oxford comma for APA/MLA/IEEE/Chicago, dropped for AP).'}, 'dialect': {'enum': ['en-US', 'en-GB', 'en-CA', 'en-AU', 'auto'], 'type': 'string', 'x-ui': {'labels': {'auto': 'Detect automatically', 'en-AU': 'Australian English', 'en-CA': 'Canadian English', 'en-GB': 'British English', 'en-US': 'American English'}}, 'title': 'English spelling', 'default': 'en-US', 'description': 'English dialect for spelling and grammar rules.'}, 'include_llm': {'type': 'boolean', 'title': 'Deeper AI check', 'default': True, 'description': 'Adds a second pass that catches wording and context problems the rule checker cannot see. Turn off for rule-based results only, which is faster.'}}}
输入模式
{'type': 'object', 'required': [], 'properties': {'file': {'type': 'string', 'title': 'File to hash', 'format': 'binary', 'description': 'The file to hash. Any type, of any size we accept.'}, 'text': {'type': 'string', 'x-ui': {'multiline': True, 'unset_label': 'Uses the attached file instead'}, 'title': 'Text to hash', 'description': 'Hash typed text instead of a file. Ignored if a file is attached — the file wins.'}}, 'x-require-one-of': [['file'], ['text']]}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (JPG, PNG, WebP)'}}}
输入模式
{'type': 'object', 'required': ['file_a', 'file_b'], 'properties': {'file_a': {'type': 'string', 'format': 'binary', 'description': 'First image — JPG, PNG'}, 'file_b': {'type': 'string', 'format': 'binary', 'description': 'Second image — JPG, PNG'}}}
输入模式
{'type': 'object', 'required': [], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'A JSON or XML file to check — this is how a previous step hands its output over. Up to 1 MB. Send this or the text below; a file wins if both arrive.'}, 'text': {'type': 'string', 'x-ui': {'multiline': True, 'unset_label': 'Uses the attached file instead'}, 'title': 'Text to check', 'maxLength': 1048576, 'description': "Up to 1 MB of valid UTF-8. Nesting deeper than 256 levels is refused rather than followed, because following it exhausts the server's stack."}, 'format': {'enum': ['json', 'xml', 'auto'], 'type': 'string', 'x-ui': {'labels': {'xml': 'XML', 'auto': 'Work it out from the text', 'json': 'JSON'}}, 'title': 'Which format', 'default': 'auto', 'description': 'Leave it on automatic and the format is read from the text itself.'}}, 'x-passes-no-file': True, 'x-require-one-of': [['file'], ['text']]}
输入模式
{'type': 'object', 'required': [], 'properties': {'file': {'type': 'string', 'title': 'File to scan', 'format': 'binary', 'description': 'A PDF or HTML file to pull the links out of. Any other type is read as plain text.'}, 'text': {'type': 'string', 'x-ui': {'multiline': True, 'unset_label': 'Uses the attached file instead'}, 'title': 'Text or HTML to scan', 'description': 'Paste text or HTML to pull links out of. Ignored if a file is attached — the file wins.'}}, 'x-require-one-of': [['file'], ['text']]}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (any)'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (PDF)'}}}
输入模式
{'type': 'object', 'required': [], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Alternative: upload a .txt, .pdf, or .docx document (max 25MB).'}, 'text': {'type': 'string', 'x-ui': {'multiline': True}, 'title': 'Text to score', 'description': 'Paste the text to score — about five words minimum. Leave blank if you are uploading a document instead.'}}, 'x-require-one-of': [['file'], ['text']]}
输入模式
{'type': 'object', 'required': ['hostname'], 'properties': {'hostname': {'type': 'string', 'title': 'Website address', 'description': 'The site to check, e.g. example.com — just the address, with no https:// in front and no page path. A port number is ignored; 443 is always used.'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (MP4, MOV, AVI, MKV, WebM, WMV, FLV, 3GP or MPG)'}}}
输入模式
{'type': 'object', 'required': [], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Alternative: upload a .txt, .pdf, or .docx document (max 25MB).'}, 'text': {'type': 'string', 'x-ui': {'multiline': True}, 'title': 'Text to count', 'description': 'Paste the text to count. Leave blank if you are uploading a document instead.'}}, 'x-require-one-of': [['file'], ['text']]}
输入模式
{'type': 'object', 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Text or document file'}, 'text': {'type': 'string', 'x-ui': {'multiline': True, 'unset_label': 'Uses the attached file instead'}, 'description': 'Direct text input. Provide either file or text.'}, 'topN': {'type': 'integer', 'title': 'How many words to show', 'default': 20, 'maximum': 200, 'minimum': 1, 'description': 'Show this many of the most common words, most frequent first.'}, 'exclude': {'type': 'string', 'x-ui': {'unset_label': 'No extra words left out'}, 'title': 'Words to ignore', 'description': 'Comma-separated, e.g. the, and, of. Capitals and spacing do not matter. Words under two letters are always ignored.'}}, 'x-require-one-of': [['file'], ['text']]}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'The document to read'}, 'max_chars': {'type': 'integer', 'x-ui': {'unit': 'chars'}, 'title': 'How much to read', 'default': 4000, 'maximum': 12000, 'minimum': 200, 'description': 'How much of the document to read, in characters. Anything past this is left out, and the step says so.'}}}
输入模式
{'type': 'object', 'required': ['file', 'to'], 'properties': {'to': {'enum': ['zip', 'tar', 'tar.gz', 'tar.bz2', 'tar.xz', '7z'], 'type': 'string', 'default': 'zip', 'description': 'The archive format you want back. ZIP opens on every computer without extra software.'}, 'file': {'type': 'string', 'format': 'binary', 'description': 'Archive to convert — ZIP, RAR, 7Z, GZ, TAR, TAR.BZ2, TAR.XZ, CAB, ISO (max 200MB)'}}}
输入模式
{'type': 'object', 'required': ['files'], 'properties': {'files': {'type': 'array', 'items': {'type': 'string', 'format': 'binary'}, 'description': "200 MB combined cap. Rows that can't convert are skipped, not fatal — check _manifest.txt in the ZIP for per-row status."}, 'target': {'type': 'string', 'default': 'auto', 'description': "What to turn every file into. Leave it on 'auto' and we pick a sensible result for each one (Word becomes PDF, HEIC photos become JPG, MOV becomes MP4). Type a single format, like pdf, to force them all the same way."}, 'filenames': {'type': 'array', 'x-ui': {'no_recall': True}, 'items': {'type': 'string'}, 'description': 'Not used by this tool — the names come from the uploaded files themselves. Leave it empty.'}}}
输入模式
{'type': 'object', 'required': ['file', 'steps'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Max 100 MB — tighter than single-tool caps because chains amplify temp disk.'}, 'from': {'enum': ['jpg', 'png', 'webp', 'bmp', 'tiff', 'gif', 'avif', 'ico', 'heic', 'svg', 'psd', 'cbz', 'mp3', 'wav', 'ogg', 'opus', 'flac', 'm4a', 'aac', 'wma', 'aiff', 'alac', 'mp4', 'mov', 'webm', 'mkv', 'avi', 'flv', 'wmv', '3gp', 'mpg', 'vob', 'ts', 'm2ts', 'pdf', 'pdfa', 'docx', 'doc', 'odt', 'rtf', 'xlsx', 'xls', 'ods', 'pptx', 'ppt', 'odp', 'html', 'txt', 'md', 'rst', 'org', 'ipynb', 'epub', 'mobi', 'azw3', 'fb2', 'lit', 'csv', 'tsv', 'json', 'ndjson', 'xml', 'yaml', 'toml', 'ini', 'sqlite', 'parquet', 'gpx', 'kml', 'kmz', 'geojson', 'zip', '7z', 'tar', 'tar.gz', 'tar.bz2', 'tar.xz', 'rar', 'srt', 'vtt', 'vcf', 'ics', 'msg', 'eml'], 'type': 'string', 'x-ui': {'unset_label': 'Read from file'}, 'description': 'What the file is now. Usually read from the file itself — but text files (CSV, Markdown, HTML, JSON) all look alike inside, so say which one it is.'}, 'steps': {'type': 'string', 'minLength': 1, 'description': 'The formats to pass the file through, in order — 1 to 5 of them. Each hop is written as {"to":"pdf"}; we choose the right engine for it. A Word file to PDF to EPUB is [{"to":"pdf"},{"to":"epub"}].'}}}
输入模式
{'type': 'object', 'required': ['file', 'from', 'to'], 'properties': {'to': {'enum': ['csv', 'vcf', 'json', 'eml', 'pdf', 'xlsx'], 'type': 'string', 'description': 'Target format. Only these pairs are valid: vcf→csv, vcf→xlsx, csv→vcf, ics→json, ics→csv, msg→eml, eml→pdf.'}, 'file': {'type': 'string', 'format': 'binary', 'description': "Parsed as the declared 'from' — bytes are never sniffed. Size caps vary by pair: 10 MB vcf/csv/ics, 25 MB eml, 50 MB msg."}, 'from': {'enum': ['vcf', 'csv', 'ics', 'msg', 'eml'], 'type': 'string', 'description': 'Source format.'}}}
输入模式
{'type': 'object', 'required': ['file', 'to'], 'properties': {'to': {'enum': ['csv', 'tsv', 'json', 'ndjson', 'xml', 'yaml', 'toml', 'ini'], 'type': 'string', 'default': 'json', 'description': 'The format you want back. It has to be different from what you put in.'}, 'file': {'type': 'string', 'format': 'binary', 'description': 'The data file to convert (max 5MB).'}, 'from': {'enum': ['csv', 'tsv', 'json', 'ndjson', 'xml', 'yaml', 'toml', 'ini'], 'type': 'string', 'x-ui': {'unset_label': 'Read from file'}, 'description': "Source format. Optional — inferred from the file extension when omitted. 'ndjson' (aka jsonl) is newline-delimited JSON; 'tsv' is tab-separated values."}}}
输入模式
{'type': 'object', 'required': ['file', 'from', 'to'], 'properties': {'to': {'enum': ['pdf', 'docx', 'doc', 'odt', 'rtf', 'txt', 'html', 'md', 'pptx', 'odp', 'xlsx', 'ods', 'csv', 'epub'], 'type': 'string', 'default': 'pdf', 'description': 'What you want back. PDF works from every source. Word stays Word, spreadsheets stay spreadsheets, slides stay slides — a Word file cannot become slides. A PDF source can only come back as Markdown.'}, 'file': {'type': 'string', 'format': 'binary', 'description': "Max 25 MB. Routed by filename extension first; the 'from' field is the fallback for synthetic/extensionless names."}, 'from': {'enum': ['md', 'docx', 'doc', 'odt', 'rtf', 'pdf', 'html', 'txt', 'pptx', 'ppt', 'odp', 'xlsx', 'xls', 'ods', 'csv', 'epub', 'ipynb'], 'type': 'string', 'description': 'What the file is now. We normally read this from the file name; set it when the file has no name or an odd one. Markdown and Jupyter notebooks always take their own route, so say so here for those two.'}}}
输入模式
{'type': 'object', 'required': ['file', 'from', 'to'], 'properties': {'to': {'enum': ['epub', 'mobi', 'azw3', 'pdf'], 'type': 'string', 'default': 'epub', 'description': 'The format you want back. EPUB is what a modern Kindle accepts when you send a book to it, so it is the usual answer. Pick MOBI or AZW3 only for an older device.'}, 'file': {'type': 'string', 'format': 'binary', 'description': "The ebook itself. Bytes are sniffed and must match 'from' (mismatch = 400). DRM-protected books always fail."}, 'from': {'enum': ['mobi', 'azw3', 'fb2', 'lit', 'epub', 'pdf'], 'type': 'string', 'description': 'Source ebook format — REQUIRED.'}}}
输入模式
{'type': 'object', 'required': ['file', 'to'], 'properties': {'to': {'enum': ['pdf', 'jpg', 'png', 'webp', 'bmp', 'tiff', 'gif', 'avif', 'ico', 'mp3', 'wav', 'ogg', 'opus', 'flac', 'm4a', 'aac', 'wma', 'aiff', 'alac', 'mp4', 'mov', 'webm', 'mkv', 'avi', '3gp', 'flv', 'm2ts', 'mpg', 'ts', 'vob', 'wmv', 'srt', 'vtt', 'txt'], 'type': 'string', 'description': 'The format you want back. Apple Lossless (alac) is delivered as a .m4a file.'}, 'file': {'type': 'string', 'format': 'binary', 'description': 'The file to convert. We read its current format from the file itself, so you only need to say what you want back.'}, 'from': {'enum': ['jpg', 'png', 'webp', 'bmp', 'tiff', 'gif', 'avif', 'ico', 'heic', 'svg', 'psd', 'mp3', 'wav', 'ogg', 'opus', 'flac', 'm4a', 'aac', 'wma', 'aiff', 'alac', 'mp4', 'mov', 'webm', 'mkv', 'avi', 'flv', 'wmv', '3gp', 'mpg', 'vob', 'ts', 'm2ts', 'srt', 'vtt', 'docx', 'doc', 'txt', 'cbz'], 'type': 'string', 'x-ui': {'unset_label': 'Read from file'}, 'description': 'Leave blank and we read the format from the file itself. Only set it if the file has no name or an odd one.'}, 'gif_fps': {'type': 'integer', 'x-ui': {'unit': 'fps'}, 'default': 10, 'maximum': 30, 'minimum': 1, 'description': 'Frames per second. Higher is smoother and bigger. If the width and frame rate together are too heavy we keep the width and ease this down.', 'x-show-when': {'to': ['gif']}}, 'gif_width': {'type': 'integer', 'x-ui': {'unit': 'px'}, 'default': 320, 'maximum': 1280, 'minimum': 64, 'description': 'How wide the GIF should be, in pixels. Height follows automatically. Very wide plus very smooth is capped - we keep the width you asked for and ease the frame rate down.', 'x-show-when': {'to': ['gif']}}}}
输入模式
{'type': 'object', 'required': ['file', 'to'], 'properties': {'to': {'enum': ['gpx', 'kml', 'kmz', 'geojson'], 'type': 'string', 'description': 'Must differ from the detected source — gpx→gpx is a 400; format-version upgrades happen implicitly on read.'}, 'file': {'type': 'string', 'format': 'binary', 'description': 'A .gpx, .kml, .kmz or .geojson file.'}, 'from': {'enum': ['gpx', 'kml', 'kmz', 'geojson'], 'type': 'string', 'x-ui': {'unset_label': 'Read from file'}, 'description': 'Optional. Detected from content; declare it only when the upload has no meaningful filename.'}, 'strict': {'type': 'boolean', 'default': False, 'description': 'Stop the conversion rather than hand back a file that has lost something. Off by default: you get the result plus a note about anything that could not be carried over.'}}}
输入模式
{'type': 'object', 'required': ['files'], 'properties': {'files': {'type': 'array', 'items': {'type': 'string', 'format': 'binary'}, 'description': 'Input files (JPG, PNG)'}}}
输入模式
{'type': 'object', 'required': ['file', 'to'], 'properties': {'to': {'enum': ['csv', 'tsv', 'json', 'ndjson', 'xlsx', 'parquet'], 'type': 'string', 'description': "'jsonl' is accepted as an alias for ndjson. One side of the pair must be parquet — table→table pairs belong to convert_data."}, 'file': {'type': 'string', 'format': 'binary', 'description': 'A .parquet file, or a .csv/.tsv/.json/.ndjson/.xlsx table to turn into Parquet.'}, 'from': {'enum': ['parquet', 'csv', 'tsv', 'json', 'ndjson', 'xlsx'], 'type': 'string', 'x-ui': {'unset_label': 'Read from file'}, 'description': 'Optional but recommended when uploading csv/tsv/json/ndjson: those are indistinguishable by content, so declare which one it is.'}, 'sheet': {'type': 'string', 'description': 'Which worksheet to read. Leave it blank for the first one.', 'x-show-when': {'from': ['xlsx']}}}}
输入模式
{'type': 'object', 'required': ['file', 'to'], 'properties': {'to': {'enum': ['csv', 'json', 'xlsx'], 'type': 'string', 'default': 'csv', 'description': 'What you want back. A database holds several tables, so the shape follows: CSV gives one file per table (zipped if there is more than one), Excel gives one workbook with a sheet per table, JSON gives the rows as records.'}, 'file': {'type': 'string', 'format': 'binary', 'description': 'SQLite database file.'}, 'table': {'type': 'string', 'x-ui': {'unset_label': 'All tables'}, 'description': 'Optional: export only this table (must match a table in the database).'}, 'strict': {'type': 'boolean', 'title': 'Refuse partial answers', 'default': False, 'description': 'Stop rather than hand back a partial export. Off by default: a very large database comes back with whatever we could reach, and a note saying what was left out.'}}}
输入模式
{'type': 'object', 'required': ['text', 'from', 'to'], 'properties': {'to': {'enum': ['html', 'md', 'json', 'csv', 'xml', 'yaml', 'txt'], 'type': 'string', 'default': 'html', 'description': 'What you want back. Must differ from the source. For a Base64 or URL encode/decode, leave this on the format you want the result read as — do NOT pick plain text, which currently returns the input untouched.'}, 'from': {'enum': ['md', 'html', 'csv', 'json', 'xml', 'yaml', 'base64_encode', 'base64_decode', 'url_encode', 'url_decode'], 'type': 'string', 'default': 'md', 'description': 'What the text is now — or the encoding job to run (Base64 / URL encode and decode ride in this field).'}, 'text': {'type': 'string', 'x-ui': {'multiline': True}, 'description': "The text/data to convert. Field name is 'text' — not 'content'."}}}
输入模式
{'type': 'object', 'required': ['value', 'from', 'to', 'category'], 'properties': {'to': {'enum': ['meter', 'kilometer', 'centimeter', 'millimeter', 'mile', 'yard', 'foot', 'inch', 'nautical_mile', 'kilogram', 'gram', 'milligram', 'pound', 'ounce', 'ton', 'stone', 'square_meter', 'square_kilometer', 'square_centimeter', 'square_mile', 'square_yard', 'square_foot', 'square_inch', 'hectare', 'acre', 'liter', 'milliliter', 'cubic_meter', 'cubic_centimeter', 'gallon_us', 'gallon_uk', 'quart', 'pint', 'cup', 'fluid_ounce', 'tablespoon', 'teaspoon', 'meter_per_second', 'kilometer_per_hour', 'mile_per_hour', 'knot', 'foot_per_second', 'second', 'millisecond', 'minute', 'hour', 'day', 'week', 'month', 'year', 'byte', 'kilobyte', 'megabyte', 'gigabyte', 'terabyte', 'bit', 'kilobit', 'megabit', 'gigabit', 'celsius', 'fahrenheit', 'kelvin'], 'type': 'string', 'description': 'The unit you want. It must belong to the same kind of measurement as the one you have.'}, 'from': {'enum': ['meter', 'kilometer', 'centimeter', 'millimeter', 'mile', 'yard', 'foot', 'inch', 'nautical_mile', 'kilogram', 'gram', 'milligram', 'pound', 'ounce', 'ton', 'stone', 'square_meter', 'square_kilometer', 'square_centimeter', 'square_mile', 'square_yard', 'square_foot', 'square_inch', 'hectare', 'acre', 'liter', 'milliliter', 'cubic_meter', 'cubic_centimeter', 'gallon_us', 'gallon_uk', 'quart', 'pint', 'cup', 'fluid_ounce', 'tablespoon', 'teaspoon', 'meter_per_second', 'kilometer_per_hour', 'mile_per_hour', 'knot', 'foot_per_second', 'second', 'millisecond', 'minute', 'hour', 'day', 'week', 'month', 'year', 'byte', 'kilobyte', 'megabyte', 'gigabyte', 'terabyte', 'bit', 'kilobit', 'megabit', 'gigabit', 'celsius', 'fahrenheit', 'kelvin'], 'type': 'string', 'description': 'The unit you have. It must belong to the kind of measurement chosen above. Data sizes are the computing kind (1 kilobyte = 1024 bytes).'}, 'value': {'type': 'number', 'description': 'The amount to convert. Negative numbers are fine (below-zero temperatures, drops in weight).'}, 'category': {'enum': ['length', 'weight', 'area', 'volume', 'speed', 'time', 'data', 'temperature'], 'type': 'string', 'default': 'length', 'description': 'What kind of measurement this is. Pick this first — it decides which units are available.'}}}
输入模式
{'type': 'object', 'required': ['url'], 'properties': {'url': {'type': 'string', 'description': 'The http(s) URL of the web page to render to PDF.'}}}
输入模式
{'type': 'object', 'required': ['file', 'to'], 'properties': {'to': {'enum': ['mp4', 'mov', 'webm', 'mkv', 'avi', 'gif'], 'type': 'string', 'default': 'mp4', 'description': 'The format you want back. MP4 plays almost everywhere. MKV, AVI and animated GIF need Business. A GIF is made at 480p unless you set the size below.'}, 'crf': {'type': 'integer', 'default': 23, 'maximum': 51, 'minimum': 0, 'description': 'Picture quality. Lower is better-looking and bigger; higher is smaller and rougher. 23 is the everyday setting for H.264. Each compression method reads this scale differently - left alone we pick the matching everyday value (28 for H.265, 32 for VP9, 30 for AV1). Out-of-range values are pulled back into range rather than refused, and the whole setting is ignored if you set a data rate or pick a platform preset.', 'x-show-when': {'to': ['mp4', 'mov', 'webm', 'mkv', 'avi']}}, 'file': {'type': 'string', 'format': 'binary', 'description': 'Max 500 MB; duration ≤5 min on Free, 30 min on Business. Format is sniffed from bytes; the filename extension is the fallback when sniffing fails.'}, 'codec': {'enum': ['auto', 'h264', 'vp9', 'h265', 'av1'], 'type': 'string', 'default': 'auto', 'description': 'How the picture is compressed. Leave it on Automatic unless you know you need otherwise — a compression method the chosen format cannot carry (H.265 in a WebM, say) will fail during conversion. H.265 and AV1 need Business.', 'x-show-when': {'to': ['mp4', 'mov', 'webm', 'mkv', 'avi']}}, 'resolution': {'enum': ['source', '2160p', '1080p', '720p', '480p'], 'type': 'string', 'default': 'source', 'description': "How big the picture should be. 'Source' keeps the original size. Height is set and the shape is kept. 1080p and 4K need Business."}, 'preset_name': {'enum': ['tiktok', 'reels', 'shorts', 'twitter', 'whatsapp'], 'type': 'string', 'x-ui': {'no_recall': True, 'unset_label': 'No preset'}, 'description': 'Make it ready for one place in particular. Picking one sets the format, size, compression and data rate for you and ignores your choices above. Business only.'}, 'bitrate_kbps': {'type': 'integer', 'x-ui': {'unit': 'kbps', 'unset_label': 'Chosen automatically'}, 'maximum': 40000, 'minimum': 250, 'description': 'Aim for a file size instead of a quality level. Setting this overrides the quality slider. Leave it alone unless you have a size you must hit.', 'x-show-when': {'to': ['mp4', 'mov', 'webm', 'mkv', 'avi']}}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (DOCX, DOC)'}}}
输入模式
{'type': 'object', 'required': ['text'], 'properties': {'name': {'type': 'string', 'default': 'data', 'description': 'File name without the extension — the extension comes from the format above. Anything over 80 characters is shortened.'}, 'text': {'type': 'string', 'x-ui': {'multiline': True}, 'description': 'The result to save. Point this at the earlier step whose text or data you want in the file — the colour palette, the password, the extracted text.'}, 'format': {'enum': ['txt', 'csv', 'json', 'md'], 'type': 'string', 'default': 'txt', 'description': 'What kind of file to write. csv turns a list of values into a spreadsheet — a header row and one row per value — and anything it cannot tabulate becomes a single column. json is pretty-printed, and data that is not valid JSON is saved as plain text instead.'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'The image to look at'}, 'question': {'type': 'string', 'x-ui': {'multiline': True}, 'default': 'Describe this image concisely: subject, notable details, and any visible text.', 'description': 'What to ask about the image. Left as it is, you get the subject, the notable details and any text visible in the picture.'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': "The file to save — usually the previous step's output."}, 'filename': {'type': 'string', 'title': 'Save it as', 'description': 'Optional. The name the file gets in Drive, extension included. Leave blank to keep the name it already has.'}, 'folder_name': {'type': 'string', 'title': 'Folder in your Drive', 'description': 'Optional. We create this folder the first time and put later files in the same one. We cannot see folders you made yourself, so if you already have one with this name you will end up with two — leave it blank to save straight into My Drive.'}}, 'x-passes-no-file': True}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'array', 'items': {'type': 'string', 'format': 'binary'}, 'description': "The file or files to email, typically the previous step's output. Several files are zipped into one attachment, so it is always one email."}, 'note': {'type': 'string', 'x-ui': {'unset_label': 'No note'}, 'description': 'Optional one-line note to put in the email body. The mail is sent from your own connected Google account, to you — files up to 5 MB.'}, 'subject': {'type': 'string', 'default': 'Your file is ready', 'description': 'Subject line of the email.'}}, 'x-passes-no-file': True}
输入模式
{'type': 'object', 'required': ['file', 'fields'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'PDF to sign'}, 'fields': {'type': 'string', 'description': "Where each signature, initial, date or text box sits on the page. Build these on the PDF E-Signature page — it draws them on the document and gives you this value — then paste it here. Up to 100 placements; each names a page, a box in points from that page's top-left corner, and a type: signature, initial, date or text."}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (PDF)'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': "The archive to open — normally the previous step's output, e.g. {{step_1.file_id}}."}}}
输入模式
{'type': 'object', 'required': ['files'], 'properties': {'name': {'type': 'string', 'description': "Name for the archive, without .zip. Leave it blank and the archive is named johns-essentials- plus today's date."}, 'files': {'type': 'array', 'items': {'type': 'string', 'format': 'binary'}, 'description': 'The files to bundle: uploaded file ids, {{step_N.files}} (everything a step that ran once per file made), or {{file_ids}} (every upload). 1-50 files.'}}}
输入模式
{'type': 'object', 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'The picture to convert, up to 10 MB. Used when Mode is Image, and also when Text is left empty; with words in Text and Mode on Text, the picture is ignored.'}, 'font': {'enum': ['standard', 'big', 'block', 'banner', 'bubble', 'digital', 'ivrit', 'lean', 'mini', 'mnemonic', 'script', 'shadow', 'slant', 'small', 'smscript', 'smshadow', 'smslant', 'term'], 'type': 'string', 'default': 'standard', 'description': 'Lettering style.', 'x-show-when': {'mode': ['text']}}, 'mode': {'enum': ['text', 'image'], 'type': 'string', 'default': 'text', 'description': 'Draw your words as big letters, or turn a picture into characters. If you attach a picture and type nothing, picture mode is used automatically.'}, 'text': {'type': 'string', 'x-ui': {'unset_label': 'The picture is converted instead'}, 'description': 'The words to draw. Longer than 100 characters is trimmed.', 'x-show-when': {'mode': ['text']}}, 'width': {'type': 'integer', 'x-ui': {'unit': 'chars'}, 'default': 80, 'maximum': 200, 'minimum': 40, 'description': 'How many characters wide the picture is.', 'x-show-when': {'mode': ['image']}}}}
输入模式
{'type': 'object', 'required': ['content'], 'properties': {'type': {'enum': ['code128', 'ean13', 'upca', 'code39', 'ean8', 'itf14', 'datamatrix', 'pdf417', 'qr'], 'type': 'string', 'x-ui': {'labels': {'qr': 'QR Code', 'ean8': 'EAN-8', 'upca': 'UPC-A', 'ean13': 'EAN-13', 'itf14': 'ITF-14', 'code39': 'Code 39', 'pdf417': 'PDF417', 'code128': 'Code 128', 'datamatrix': 'Data Matrix'}}, 'default': 'code128', 'description': 'Which barcode standard to make. Code 128 takes any text or number; EAN-13 needs 12-13 digits and EAN-8 needs 7-8; UPC-A needs 11-12; Code 39 takes capitals and digits; ITF-14 needs 13-14 digits; Data Matrix, PDF417 and QR are the square ones that hold any text. Anything we do not recognise is made as a Code 128.'}, 'height': {'type': 'integer', 'x-ui': {'unit': 'px'}, 'default': 150, 'maximum': 800, 'minimum': 50, 'description': 'How tall the bars are, in pixels. The width follows automatically.'}, 'content': {'type': 'string', 'description': 'The data to encode'}, 'showText': {'type': 'boolean', 'default': True, 'description': 'Print the encoded digits underneath the bars, so a cashier can key them in if a scan fails.'}}}
输入模式
{'type': 'object', 'required': ['fullName'], 'properties': {'email': {'type': 'string', 'description': 'Printed verbatim in the contact block — no validation, no mailto link; empty = line omitted.'}, 'phone': {'type': 'string', 'description': 'Printed verbatim in the contact block; empty = line omitted. No formatting applied.'}, 'format': {'enum': ['pdf', 'png'], 'type': 'string', 'default': 'pdf', 'description': "'pdf' (default) or 'png' (300 DPI Ghostscript raster, 1050x600). Any other value silently returns the PDF."}, 'company': {'type': 'string', 'description': "Printed under the name; omitted entirely when empty. Latin-1 only — CJK/emoji glyphs render as '.'."}, 'website': {'type': 'string', 'description': "Printed exactly as sent — strip 'https://' yourself if unwanted; empty = line omitted."}, 'fullName': {'type': 'string', 'description': "Full name printed on the card. Field name is 'fullName' — not 'name'."}, 'jobTitle': {'type': 'string', 'x-ui': {'unset_label': 'Left off the card'}, 'description': "Job title. Field name is 'jobTitle' — not 'title'."}, 'template': {'enum': ['modern', 'classic', 'minimal', 'creative', 'corporate', 'elegant'], 'type': 'string', 'default': 'modern', 'description': 'Card layout.'}, 'primaryColor': {'type': 'string', 'default': '1a1a2e', 'description': "Hex color WITHOUT the leading '#'."}, 'secondaryColor': {'type': 'string', 'default': 'E05535', 'description': "Hex color WITHOUT the leading '#'."}}}
输入模式
{'type': 'object', 'required': ['recipientName'], 'properties': {'date': {'type': 'string', 'description': "Free text centred at the bottom, printed verbatim ('12 June 2026' works); empty = omitted."}, 'format': {'enum': ['pdf', 'png'], 'type': 'string', 'default': 'pdf', 'description': "'pdf' (default) or 'png' (300 DPI Ghostscript raster). Any other value silently returns the PDF."}, 'template': {'type': 'string', 'default': 'achievement', 'description': 'Kept for older calls; it does not change the certificate. Set the heading with Cert title and the look with Border style.', 'x-show-when': {'borderStyle': ['__never']}}, 'certTitle': {'type': 'string', 'default': 'Certificate of Achievement', 'description': "Certificate heading. Field name is 'certTitle' — not 'title'."}, 'issuerName': {'type': 'string', 'x-ui': {'unset_label': 'Left off the certificate'}, 'description': 'Printed above the signature line. Empty hides the WHOLE issuer block, issuerTitle included.'}, 'borderStyle': {'enum': ['gold', 'silver', 'blue', 'green'], 'type': 'string', 'default': 'gold', 'description': 'Unknown values fall back to gold. This is the main visual lever — it colours border, corners, and title.'}, 'description': {'type': 'string', 'x-ui': {'unset_label': 'Left off the certificate'}, 'description': 'Optional body text under the title.'}, 'issuerTitle': {'type': 'string', 'x-ui': {'unset_label': 'Left off the certificate'}, 'description': 'Italic line under the signature — rendered only when issuerName is also set.'}, 'orientation': {'enum': ['landscape', 'portrait'], 'type': 'string', 'default': 'landscape', 'description': "'landscape' (default) or 'portrait' (A4). Any value other than 'portrait' renders landscape."}, 'recipientName': {'type': 'string', 'description': "Recipient's name (REQUIRED). Field name is 'recipientName' — not 'recipient'."}}}
输入模式
{'type': 'object', 'properties': {'count': {'type': 'integer', 'title': 'How many colours', 'default': 5, 'maximum': 10, 'minimum': 3, 'description': 'Out-of-range values are pulled back to the nearest allowed value rather than refused.'}, 'scheme': {'enum': ['complementary', 'analogous', 'triadic', 'tetradic', 'split-complementary', 'monochromatic'], 'type': 'string', 'x-ui': {'labels': {'triadic': 'Triadic — three evenly spaced', 'tetradic': 'Tetradic — four evenly spaced', 'analogous': 'Analogous — neighbours on the wheel', 'complementary': 'Complementary — the opposite colour', 'monochromatic': 'Monochromatic — one colour, many shades', 'split-complementary': 'Split complementary — either side of the opposite'}}, 'title': 'Harmony', 'default': 'complementary', 'description': 'How the other colours are chosen relative to the starting colour.'}, 'base_color': {'type': 'string', 'title': 'Starting colour', 'default': '#E05535', 'pattern': '^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$', 'description': "A hex colour, three or six digits, with or without the leading '#'. Anything else is refused."}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Source image (PNG, SVG, JPG — max 20MB)'}, 'background': {'enum': ['none', 'white', 'black', 'gray', 'silver', 'red', 'green', 'blue', 'yellow', 'orange', 'purple', 'pink', 'brown', 'navy', 'teal', 'cyan', 'magenta'], 'type': 'string', 'x-ui': {'labels': {'none': 'See-through'}}, 'default': 'none', 'description': 'Fill behind a logo that is not square. None leaves it see-through, which suits both light and dark browser tabs. A hex colour such as #1a1a1a is also accepted; anything we do not recognise is treated as see-through.'}, 'includeIco': {'type': 'boolean', 'default': True, 'description': 'Also generate favicon.ico.'}, 'borderRadius': {'type': 'integer', 'x-ui': {'unit': '%'}, 'default': 0, 'maximum': 50, 'minimum': 0, 'description': 'Rounded-corner radius as a percent (0-50).'}}}
输入模式
{'type': 'object', 'required': ['colors'], 'properties': {'width': {'type': 'integer', 'x-ui': {'unit': 'px'}, 'default': 1200, 'maximum': 4096, 'minimum': 16, 'description': 'Out-of-range values are pulled back rather than refused. Width times height is also capped at 8 megapixels; over that, both sides shrink together and the shape is kept.'}, 'colors': {'type': 'array', 'items': {'type': 'string'}, 'title': 'Colours to blend', 'maxItems': 16, 'minItems': 2, 'description': 'Two to sixteen colours, in order. Hex (#E05535, #E55, or with alpha #E05535FF) or a colour name. Fewer than two or more than sixteen is refused, not trimmed.'}, 'format': {'enum': ['png'], 'type': 'string', 'default': 'png', 'description': 'PNG only. Any other value is refused.'}, 'height': {'type': 'integer', 'x-ui': {'unit': 'px'}, 'default': 630, 'maximum': 4096, 'minimum': 16, 'description': 'Out-of-range values are pulled back rather than refused. See the note on width about the 8 megapixel cap.'}, 'direction': {'type': 'string', 'title': 'Direction', 'default': 'to right', 'description': "Which way the blend runs: a CSS side or corner ('to right', 'to bottom left'), an explicit angle ('135deg', '-45'), 'radial' for a circular blend, or 'conic' for one that sweeps around. A direction we do not recognise is refused rather than quietly becoming top-to-bottom."}, 'positions': {'type': 'array', 'x-ui': {'unit': '%', 'unset_label': 'Spaced evenly'}, 'items': {'type': 'number', 'maximum': 100, 'minimum': 0}, 'title': 'Colour stops', 'description': 'Where each colour sits along the blend, as a percentage from 0 to 100: one entry per colour, in the same order. Two colours at the same stop make a hard edge (0, 50, 50, 100). Leave it out and the colours are spaced evenly. A list without exactly one entry per colour is refused.', 'x-show-when': {'colors': ['__never']}}}}
输入模式
{'type': 'object', 'required': [], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'A file to hash instead of typed text. If you attach one, the file wins.'}, 'text': {'type': 'string', 'x-ui': {'multiline': True}, 'title': 'Text to hash', 'description': 'The text to hash. Leave it blank when you are hashing a file instead.'}}, 'x-require-one-of': [['file'], ['text']]}
输入模式
{'type': 'object', 'properties': {'type': {'enum': ['words', 'sentences', 'paragraphs'], 'type': 'string', 'default': 'paragraphs', 'description': "Unit to generate. Field names are 'type' + 'count' — 'paragraphs'/'words_per_paragraph' do not exist."}, 'count': {'type': 'integer', 'default': 3, 'maximum': 100, 'minimum': 1, 'description': 'How many words/sentences/paragraphs to generate.'}, 'startLorem': {'type': 'boolean', 'default': False, 'description': "Start with the classic 'Lorem ipsum dolor sit amet' opening."}}}
输入模式
{'type': 'object', 'properties': {'count': {'type': 'integer', 'default': 1, 'maximum': 50, 'minimum': 1, 'description': 'Number of passwords to generate.'}, 'length': {'type': 'integer', 'x-ui': {'unit': 'chars'}, 'default': 16, 'maximum': 256, 'minimum': 4, 'description': 'Characters per password.'}, 'numbers': {'type': 'boolean', 'default': True, 'description': 'Include digits 0-9. Turning all four off is the same as leaving all four on.'}, 'symbols': {'type': 'boolean', 'default': True, 'description': 'Include symbols from !@#$%^&*()-_=+[]{}|;:,.<>? - quotes, backslash, backtick, tilde and slash are never used. Turning all four off is the same as leaving all four on.'}, 'lowercase': {'type': 'boolean', 'default': True, 'description': 'Include small letters a-z. Turning all four off is the same as leaving all four on.'}, 'uppercase': {'type': 'boolean', 'default': True, 'description': 'Include capital letters A-Z. Turning all four off is the same as leaving all four on.'}, 'excludeSimilar': {'type': 'boolean', 'default': False, 'description': 'Exclude look-alike characters (iIlL1oO0).'}}}
输入模式
{'type': 'object', 'properties': {'text': {'type': 'string', 'description': "Label text. Defaults to '<width> × <height>'."}, 'width': {'type': 'integer', 'x-ui': {'unit': 'px', 'pair_with': 'height', 'pair_label': 'Size'}, 'default': 640, 'maximum': 4096, 'minimum': 1, 'description': 'Pixels wide. >4096 clamps to 4096; 0/omitted = 640. The default label text shows the FINAL clamped size.'}, 'format': {'enum': ['png', 'jpg', 'webp'], 'type': 'string', 'default': 'png', 'description': 'Image file type to save as.'}, 'height': {'type': 'integer', 'x-ui': {'unit': 'px'}, 'default': 480, 'maximum': 4096, 'minimum': 1, 'description': 'Pixels tall. >4096 clamps to 4096; 0/omitted = 480.'}, 'bgColor': {'type': 'string', 'default': '3B82F6', 'description': "Background hex color, with or without '#'. Field name is 'bgColor' — not 'bg_color'."}, 'fgColor': {'type': 'string', 'default': 'FFFFFF', 'description': "Label text hex color. Field name is 'fgColor' — not 'text_color'."}}}
输入模式
{'type': 'object', 'required': ['content'], 'properties': {'size': {'type': 'integer', 'x-ui': {'unit': 'px'}, 'default': 256, 'maximum': 2000, 'minimum': 200, 'description': 'Width and height of the square image, in pixels.'}, 'level': {'enum': ['L', 'M', 'Q', 'H'], 'type': 'string', 'default': 'M', 'description': 'Error-correction level'}, 'content': {'type': 'string', 'description': 'The URL, text, or vCard data to encode'}}}
输入模式
{'type': 'object', 'required': ['name'], 'properties': {'name': {'type': 'string', 'title': 'Name to sign', 'maxLength': 64, 'minLength': 1, 'description': "One line, up to 64 characters. Line breaks and tabs become spaces, and a leading '@' is stripped — ImageMagick reads a leading '@' as 'go and read this file', so it is never passed through."}, 'color': {'type': 'string', 'title': 'Ink colour', 'default': '#1a1a2e', 'description': "A hex colour (#1a1a2e or #fff, with or without the '#', optionally with an alpha pair) or a colour name such as black or navy. A colour we cannot read is refused, and so is ink that would not show, such as transparent."}, 'style': {'enum': ['script', 'elegant', 'handwritten', 'bold'], 'type': 'string', 'x-ui': {'labels': {'bold': 'Bold', 'script': 'Script', 'elegant': 'Elegant', 'handwritten': 'Handwritten'}}, 'title': 'Handwriting style', 'default': 'script', 'description': 'Which handwriting face to use: Script is Dancing Script, Elegant is Great Vibes, Handwritten is Pacifico and Bold is Lobster, the faces the web page draws. When that face is not installed on our server, another handwriting face is drawn in its place, never a plain block font, and the X-JE-Font-Substituted response header says so. Only when no handwriting face is installed does the request fail.'}, 'padding': {'type': 'integer', 'x-ui': {'unit': 'px'}, 'title': 'Clear space around it', 'default': 16, 'maximum': 100, 'minimum': 0, 'description': 'Empty space left around the signature, so it does not sit flush against the edge when it is stamped onto something.'}, 'fontSize': {'type': 'integer', 'x-ui': {'unit': 'px'}, 'title': 'Lettering size', 'default': 72, 'maximum': 200, 'minimum': 20, 'description': 'Out-of-range values are pulled back to the nearest allowed value rather than refused.'}, 'background': {'type': 'string', 'title': 'Background', 'default': 'transparent', 'description': "'transparent' is what makes the result stampable onto a PDF or a photo. Give a colour instead, as hex or a name such as white, if you want it on a solid card. A colour we cannot read is refused rather than turned transparent."}}}
输入模式
{'type': 'object', 'properties': {'count': {'type': 'integer', 'title': 'How many', 'default': 1, 'maximum': 1000, 'minimum': 1, 'description': 'Out-of-range values are pulled back to the nearest allowed value rather than refused, and the reply says so when it happened.'}, 'format': {'enum': ['v4', 'v7', 'nanoid', 'ulid', 'hex'], 'type': 'string', 'x-ui': {'labels': {'v4': 'UUID v4 (random)', 'v7': 'UUID v7 (sortable by time)', 'hex': 'Plain random hex', 'ulid': 'ULID (sortable, short)', 'nanoid': 'Nano ID (short)'}}, 'title': 'Kind of identifier', 'default': 'v4', 'description': 'A name we do not recognise is refused and the five accepted names are listed. It is not quietly turned into a v4 — a caller that asked for a ULID and got a UUID has data of the wrong shape that looks perfectly healthy until something downstream breaks.'}, 'length': {'type': 'integer', 'x-ui': {'unit': 'chars'}, 'title': 'Nano ID length', 'default': 21, 'maximum': 36, 'minimum': 8, 'description': 'How many characters long each Nano ID is. Only used when the kind above is Nano ID.', 'x-show-when': {'format': ['nanoid']}}, 'hyphens': {'type': 'boolean', 'title': 'Keep the dashes', 'default': True, 'description': 'Turn this off for the 32-character form with no dashes. Only applies to the two UUID kinds.', 'x-show-when': {'format': ['v4', 'v7']}}, 'uppercase': {'type': 'boolean', 'title': 'Upper case', 'default': False, 'description': 'Return the letters in capitals. Nano ID and ULID have their own fixed alphabets and ignore this.', 'x-show-when': {'format': ['v4', 'v7', 'hex']}}}}
输入模式
{'type': 'object', 'required': ['file', 'text'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': "Video to watermark. Forces a full H.264 re-encode into MP4 (audio copied) — among the platform's slowest ops on long videos."}, 'text': {'type': 'string', 'description': 'The words burned into every frame, drawn exactly as typed (% signs and backslashes included) on one line of up to 200 characters. Required; there is no default.'}, 'opacity': {'type': 'number', 'default': 0.7, 'maximum': 1, 'minimum': 0, 'description': 'How solid the watermark looks: 1 is fully solid, 0.3 is a faint ghost.'}, 'fontsize': {'type': 'integer', 'x-ui': {'unit': 'px'}, 'default': 0, 'maximum': 400, 'minimum': 0, 'description': "Text size in pixels. Leave it at 0 and the size is worked out from the video's own height - about 36 on a 1080p video. Sizes below 6 are treated the same as 0."}, 'position': {'enum': ['topleft', 'topright', 'bottomleft', 'bottomright', 'center'], 'type': 'string', 'x-ui': {'labels': {'center': 'Centre', 'topleft': 'Top left', 'topright': 'Top right', 'bottomleft': 'Bottom left', 'bottomright': 'Bottom right'}}, 'default': 'bottomright', 'description': 'Which corner of the frame the watermark sits in.'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Video in any FFmpeg-readable container; always comes back as H.264/AAC MP4 (yuv420p, faststart) whatever went in.'}, 'quality': {'enum': ['high', 'medium', 'low'], 'type': 'string', 'default': 'medium', 'description': "Quality preset mapping to H.264 CRF 18/23/28. Field name is 'quality' — there is no 'crf' parameter."}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Video to pull the soundtrack from (any FFmpeg-readable container), or an M4A: an MP4 that carries only sound. Audio is always re-encoded to `format`, never stream-copied.'}, 'format': {'enum': ['mp3', 'wav', 'ogg', 'flac', 'aac'], 'type': 'string', 'default': 'mp3', 'description': 'What to save the soundtrack as. WAV and FLAC keep every bit of the original; MP3, OGG and AAC are smaller but re-compressed.'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'fps': {'type': 'number', 'x-ui': {'unit': 'fps'}, 'default': 1, 'maximum': 30, 'minimum': 0.1, 'description': 'How many frames to take per second of video. 1 means one frame a second.'}, 'max': {'type': 'integer', 'title': 'Most frames to take', 'default': 10, 'maximum': 100, 'minimum': 1, 'description': 'Stop after this many frames, however long the video is.'}, 'file': {'type': 'string', 'format': 'binary', 'description': 'Video to sample. Frames are always JPEGs (frame_0001.jpg…) in a ZIP — no PNG option despite the tool blurb.'}}}
输入模式
{'type': 'object', 'required': ['files'], 'properties': {'files': {'type': 'array', 'items': {'type': 'string', 'format': 'binary'}, 'minItems': 2, 'description': 'Input audio files (MP3, WAV, AAC, OGG, FLAC, M4A, WMA, OPUS or AIFF) — at least 2 required.'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (MP4, MOV, AVI, MKV, WebM or MPG)'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'end': {'type': 'string', 'description': "End time e.g. '00:01:30'. Omit to trim to the end of the file; when set it must be after start."}, 'file': {'type': 'string', 'format': 'binary', 'description': "Audio to trim. Output keeps this file's container/codec (stream copy); a file name with no extension is read by the file's type, and treated as .mp3 when the type names no sound format."}, 'start': {'type': 'string', 'x-ui': {'pair_with': 'end', 'pair_joint': 'to', 'pair_label': 'Part to keep'}, 'default': '0', 'description': "Start time e.g. '00:00:10'. Defaults to the beginning."}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'end': {'type': 'string', 'description': 'End time. Omit to trim to the end of the file; when set it must be after start.'}, 'file': {'type': 'string', 'format': 'binary', 'description': 'Video to trim. Stream copy — output keeps this container/codec, and the cut starts at the keyframe at or before `start`.'}, 'start': {'type': 'string', 'x-ui': {'pair_with': 'end', 'pair_joint': 'to', 'pair_label': 'Part to keep'}, 'default': '0', 'description': "Start time e.g. '00:00:10'. Defaults to the beginning."}}}
输入模式
{'type': 'object', 'required': ['file_id'], 'properties': {'hard': {'type': 'boolean', 'default': False, 'description': 'Hard-delete (only allowed on files already in trash).'}, 'file_id': {'type': 'string'}}}
输入模式
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'default': 20, 'maximum': 100, 'minimum': 1, 'description': '1-100; values outside this range silently fall back to 20.'}, 'folder': {'type': 'string', 'description': 'Folder to list, written exactly as it is stored, closing slash included: /Tax/2026/. Leave blank for every recent file.'}}}
输入模式
{'type': 'object', 'required': ['path'], 'properties': {'path': {'type': 'string', 'description': 'Folder path to create, e.g. /Clients/Acme.'}}, 'x-passes-no-file': True}
输入模式
{'type': 'object', 'required': ['path'], 'properties': {'path': {'type': 'string', 'description': 'Folder path to create, e.g. /Tax/2026/.'}}}
输入模式
{'type': 'object', 'required': ['file_id', 'to_path'], 'properties': {'file_id': {'type': 'string'}, 'to_path': {'type': 'string', 'description': 'Destination folder path.'}, 'new_name': {'type': 'string', 'description': 'Optional new filename.'}}}
输入模式
{'type': 'object', 'required': ['file_id', 'to_path'], 'properties': {'file_id': {'type': 'string', 'description': "The file to move: an uploaded file id or a previous step's {{step_N.file_id}}."}, 'to_path': {'type': 'string', 'description': 'Destination folder path, e.g. /Tax/2026. Created if missing.'}, 'new_name': {'type': 'string', 'x-ui': {'unset_label': 'Keeps its name'}, 'description': 'Optional new file name, with extension.'}}}
输入模式
{'type': 'object', 'required': ['file_id'], 'properties': {'as_text': {'type': 'boolean', 'default': True, 'description': 'If true and MIME is text-like, return content as UTF-8 string instead of base64.'}, 'file_id': {'type': 'string', 'description': 'FileID (UUID) from octopus.list / octopus.search.'}}}
输入模式
{'type': 'object', 'required': ['query'], 'properties': {'limit': {'type': 'integer', 'default': 25, 'maximum': 200}, 'query': {'type': 'string', 'description': 'Free-text + optional tag:/ in:/ qualifiers.'}}}
输入模式
{'type': 'object', 'required': ['query'], 'properties': {'query': {'type': 'string', 'description': 'Text matched against file names and tags.'}}}
输入模式
{'type': 'object', 'oneOf': [{'required': ['content_text']}, {'required': ['content_base64']}], 'required': ['name'], 'properties': {'name': {'type': 'string', 'description': 'Filename including extension.'}, 'path': {'type': 'string', 'description': 'Folder to write into. Defaults to /agent/{session}/.'}, 'tags': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Optional tags.'}, 'mime_type': {'type': 'string', 'description': 'Optional. Sniffed from extension if omitted.'}, 'content_text': {'type': 'string', 'description': 'UTF-8 content (use for text/markdown/json). Provide exactly ONE of content_text or content_base64. Max 25 MiB.'}, 'content_base64': {'type': 'string', 'description': 'Base64 content (use for binary). Decoded size max 25 MiB.'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'PDF to compress'}, 'quality': {'enum': ['light', 'balanced', 'mobile', 'maximum'], 'type': 'string', 'default': 'balanced', 'description': 'How hard to squeeze. Light keeps print quality (300 DPI); balanced is the everyday choice (150 DPI); mobile (96 DPI) and maximum (72 DPI) trade sharpness for size.', 'x-show-when': {'metadataOnly': ['false']}}, 'targetSize': {'type': 'integer', 'x-ui': {'unit': 'MB', 'wire_scale': 1000000, 'unset_label': 'No size target: Quality decides'}, 'title': 'Squeeze down to', 'maximum': 26214400, 'minimum': 1, 'description': 'Squeeze until the file fits this size. Overrides the preset above.', 'x-show-when': {'metadataOnly': ['false']}}, 'metadataOnly': {'type': 'boolean', 'default': False, 'description': 'Only strip the hidden details - author, title, producing software - and leave every page exactly as it is.'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'top': {'type': 'number', 'x-ui': {'unit': 'pt'}, 'default': 36, 'maximum': 288, 'minimum': 0, 'description': 'How much to cut off the top edge, in points - 72 points is one inch. 0 leaves this edge alone. Cut away more than the page holds and you get a 1-point page rather than an error.'}, 'file': {'type': 'string', 'format': 'binary', 'description': 'Input PDF (max 25MB)'}, 'left': {'type': 'number', 'x-ui': {'unit': 'pt'}, 'default': 36, 'maximum': 288, 'minimum': 0, 'description': 'How much to cut off the left edge, in points - 72 points is one inch. 0 leaves this edge alone. Cut away more than the page holds and you get a 1-point page rather than an error.'}, 'right': {'type': 'number', 'x-ui': {'unit': 'pt'}, 'default': 36, 'maximum': 288, 'minimum': 0, 'description': 'How much to cut off the right edge, in points - 72 points is one inch. 0 leaves this edge alone. Cut away more than the page holds and you get a 1-point page rather than an error.'}, 'bottom': {'type': 'number', 'x-ui': {'unit': 'pt'}, 'default': 36, 'maximum': 288, 'minimum': 0, 'description': 'How much to cut off the bottom edge, in points - 72 points is one inch. 0 leaves this edge alone. Cut away more than the page holds and you get a 1-point page rather than an error.'}, 'outputFilename': {'type': 'string', 'x-ui': {'unset_label': 'Named after your file'}, 'description': 'Optional custom output filename.'}}}
输入模式
{'type': 'object', 'required': ['file', 'pages'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'The PDF to edit. Password-protected input is rejected 400 — run pdf_unlock first.'}, 'pages': {'type': 'string', 'x-ui': {'no_recall': True, 'page_select': {'leave_one': True}}, 'title': 'Pages to delete', 'description': "Pages to delete e.g. '1,3,5-7'. At least one page must be left."}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input spreadsheet (.xlsx, .xls, .csv, .ods)'}, 'pdfa': {'enum': ['none', '1b', '2b', '3b'], 'type': 'string', 'x-ui': {'labels': {'1b': 'PDF/A-1b', '2b': 'PDF/A-2b (most asked for)', '3b': 'PDF/A-3b', 'none': 'Ordinary PDF'}}, 'default': 'none', 'description': "Save in the PDF/A archive format, which embeds everything the file needs to open correctly in decades' time. Off unless you need it; 2b is the version most archives ask for."}, 'scale': {'type': 'integer', 'x-ui': {'unit': '%'}, 'maximum': 400, 'minimum': 10, 'description': 'Print size as a percentage, where 100 is life size and less shrinks the sheet to fit more on a page. Leave it blank unless you want a specific percentage - setting any value here turns Fit to page off.', 'x-show-when': {'fitToPage': ['none']}}, 'footer': {'type': 'string', 'x-ui': {'unset_label': "Sheet's own footer"}, 'description': 'Per-page footer template. Same tokens as header.'}, 'header': {'type': 'string', 'x-ui': {'unset_label': "Sheet's own header"}, 'description': 'Per-page header template. Tokens: {page}, {pages}, {sheet}, {date}, {filename}.'}, 'sheets': {'type': 'string', 'default': 'all', 'description': 'Which sheets to convert: all, or the names or positions you want — Sales,Ledger or 0,2.'}, 'margins': {'enum': ['default', 'narrow', 'normal', 'wide'], 'type': 'string', 'x-ui': {'labels': {'wide': 'Wide', 'narrow': 'Narrow', 'normal': 'Normal', 'default': "Keep the sheet's own margins"}}, 'default': 'default', 'description': "default|narrow|normal|wide (Excel's inch presets); default keeps the sheet's own margins. Only applies to .xlsx input; unknown → default."}, 'quality': {'enum': ['low', 'medium', 'high'], 'type': 'string', 'x-ui': {'labels': {'low': 'Smallest file (96 DPI pictures)', 'high': 'Best quality (no downsizing)', 'medium': 'Balanced (150 DPI pictures)'}, 'unset_label': "Converter's setting"}, 'description': "How sharp the pictures and charts stay in the PDF. Leave blank for the converter's own setting."}, 'password': {'type': 'string', 'x-ui': {'unset_label': 'No password'}, 'format': 'password', 'description': 'Open password for the output PDF (user password).'}, 'bookmarks': {'type': 'boolean', 'default': False, 'description': 'Add PDF bookmarks, one per sheet.'}, 'fitToPage': {'enum': ['none', 'width', 'height', 'one-page'], 'type': 'string', 'default': 'none', 'description': "Fit each sheet to a page. 'width' prevents column cutoff; 'one-page' squeezes each sheet onto a single page."}, 'gridlines': {'enum': ['true', 'false'], 'type': 'string', 'x-ui': {'labels': {'true': 'Show gridlines', 'false': 'Hide gridlines'}, 'unset_label': "Sheet's own setting"}, 'description': 'Print the faint grid between cells. Leave blank to keep whatever the sheet already does.'}, 'paperSize': {'enum': ['a4', 'letter', 'legal', 'tabloid', 'a3'], 'type': 'string', 'default': 'a4', 'description': 'a4 (default) | letter | legal | tabloid | a3. Only applies to .xlsx input (excelize preprocess); unknown values silently become a4.'}, 'splitMode': {'enum': ['combined', 'per-sheet'], 'type': 'string', 'default': 'combined', 'description': 'One PDF containing every sheet, or a ZIP holding one PDF per sheet.'}, 'repeatRows': {'type': 'string', 'x-ui': {'unset_label': "Sheet's own print titles"}, 'description': "Print titles — rows that repeat on every page. e.g. '1' or '1-3'."}, 'orientation': {'enum': ['auto', 'portrait', 'landscape'], 'type': 'string', 'default': 'auto', 'description': "Page orientation. 'auto' picks landscape for sheets with ≥8 data columns."}, 'showHeaders': {'enum': ['true', 'false'], 'type': 'string', 'x-ui': {'labels': {'true': 'Show row & column headings', 'false': 'Hide row & column headings'}, 'unset_label': "Sheet's own setting"}, 'description': "Print the A B C column letters and 1 2 3 row numbers down the edges. Leave blank to keep the sheet's own setting."}, 'permPassword': {'type': 'string', 'x-ui': {'unset_label': 'Same as the open password'}, 'title': 'Owner password', 'format': 'password', 'description': 'A second, different password that locks printing, copying and editing. Only takes effect if you also set an open password above.'}, 'watermarkFont': {'enum': ['Helvetica', 'Times-Roman', 'Courier'], 'type': 'string', 'default': 'Helvetica', 'description': 'Lettering style for the watermark. Latin alphabet only. Only used when there is watermark text.'}, 'watermarkText': {'type': 'string', 'x-ui': {'unset_label': 'No watermark'}, 'description': 'Optional text watermark stamped on every page of the output.'}, 'watermarkColor': {'type': 'string', 'default': '#808080', 'description': 'Colour of the watermark lettering, as #rgb or #rrggbb. Anything else becomes mid-grey. Only used when there is watermark text.'}, 'watermarkScale': {'type': 'number', 'x-ui': {'unit': 'x'}, 'default': 1, 'maximum': 20, 'minimum': 0.01, 'description': 'Size multiplier applied on top of the lettering size. Only used when there is watermark text.'}, 'watermarkOpacity': {'type': 'number', 'default': 0.3, 'maximum': 1, 'minimum': 0, 'description': 'How solid the watermark looks: 1 is fully solid, 0.3 is a faint ghost. This is a fraction, not a percent. Only used when there is watermark text.'}, 'watermarkFontSize': {'type': 'integer', 'x-ui': {'unit': 'pt'}, 'default': 48, 'maximum': 1000, 'minimum': 1, 'description': 'Height of the watermark lettering in points. Only used when there is watermark text.'}, 'watermarkPosition': {'enum': ['c', 'tl', 'tc', 'tr', 'ml', 'mr', 'bl', 'bc', 'br'], 'type': 'string', 'x-ui': {'labels': {'c': 'Centre', 'bc': 'Bottom centre', 'bl': 'Bottom left', 'br': 'Bottom right', 'ml': 'Middle left', 'mr': 'Middle right', 'tc': 'Top centre', 'tl': 'Top left', 'tr': 'Top right'}}, 'default': 'c', 'description': 'Where the watermark sits on the page. Only used when there is watermark text.'}, 'watermarkRotation': {'type': 'integer', 'x-ui': {'unit': 'deg'}, 'default': 45, 'maximum': 180, 'minimum': -180, 'description': 'Angle of the watermark in whole degrees; 45 is the classic diagonal. Only used when there is watermark text.'}}}
输入模式
{'type': 'object', 'required': ['files'], 'properties': {'pdfa': {'enum': ['none', '1b', '2b', '3b'], 'type': 'string', 'x-ui': {'labels': {'1b': 'PDF/A-1b', '2b': 'PDF/A-2b (most asked for)', '3b': 'PDF/A-3b', 'none': 'Ordinary PDF'}}, 'default': 'none', 'description': "Save in the PDF/A archive format, which embeds everything the file needs to open correctly in decades' time. Off unless you need it; 2b is the version most archives ask for."}, 'files': {'type': 'array', 'items': {'type': 'string', 'format': 'binary'}, 'description': 'Up to 20 input spreadsheets'}, 'scale': {'type': 'integer', 'x-ui': {'unit': '%'}, 'maximum': 400, 'minimum': 10, 'description': 'Print size as a percentage, where 100 is life size and less shrinks the sheet to fit more on a page. Leave it blank unless you want a specific percentage - setting any value here turns Fit to page off.', 'x-show-when': {'fitToPage': ['none']}}, 'footer': {'type': 'string', 'x-ui': {'unset_label': "Sheet's own footer"}, 'description': 'Per-page footer template. Same tokens as header.'}, 'header': {'type': 'string', 'x-ui': {'unset_label': "Sheet's own header"}, 'description': 'Per-page header template. Tokens: {page}, {pages}, {sheet}, {date}, {filename}.'}, 'sheets': {'type': 'string', 'default': 'all', 'description': 'Which sheets to convert: all, or the names or positions you want — Sales,Ledger or 0,2.'}, 'margins': {'enum': ['default', 'narrow', 'normal', 'wide'], 'type': 'string', 'x-ui': {'labels': {'wide': 'Wide', 'narrow': 'Narrow', 'normal': 'Normal', 'default': "Keep the sheet's own margins"}}, 'default': 'default', 'description': "default|narrow|normal|wide (Excel's inch presets); default keeps the sheet's own margins. Only applies to .xlsx input; unknown → default."}, 'quality': {'enum': ['low', 'medium', 'high'], 'type': 'string', 'x-ui': {'labels': {'low': 'Smallest file (96 DPI pictures)', 'high': 'Best quality (no downsizing)', 'medium': 'Balanced (150 DPI pictures)'}, 'unset_label': "Converter's setting"}, 'description': "How sharp the pictures and charts stay in the PDF. Leave blank for the converter's own setting."}, 'password': {'type': 'string', 'x-ui': {'unset_label': 'No password'}, 'format': 'password', 'description': 'Open password for the output PDF (user password).'}, 'bookmarks': {'type': 'boolean', 'default': False, 'description': 'Add PDF bookmarks, one per sheet.'}, 'fitToPage': {'enum': ['none', 'width', 'height', 'one-page'], 'type': 'string', 'default': 'none', 'description': "Fit each sheet to a page. 'width' prevents column cutoff; 'one-page' squeezes each sheet onto a single page."}, 'gridlines': {'enum': ['true', 'false'], 'type': 'string', 'x-ui': {'labels': {'true': 'Show gridlines', 'false': 'Hide gridlines'}, 'unset_label': "Sheet's own setting"}, 'description': 'Print the faint grid between cells. Leave blank to keep whatever the sheet already does.'}, 'paperSize': {'enum': ['a4', 'letter', 'legal', 'tabloid', 'a3'], 'type': 'string', 'default': 'a4', 'description': 'a4 (default) | letter | legal | tabloid | a3. Only applies to .xlsx input (excelize preprocess); unknown values silently become a4.'}, 'splitMode': {'enum': ['combined', 'per-sheet'], 'type': 'string', 'default': 'combined', 'description': 'One PDF containing every sheet, or a ZIP holding one PDF per sheet.'}, 'repeatRows': {'type': 'string', 'x-ui': {'unset_label': "Sheet's own print titles"}, 'description': "Print titles — rows that repeat on every page. e.g. '1' or '1-3'."}, 'orientation': {'enum': ['auto', 'portrait', 'landscape'], 'type': 'string', 'default': 'auto', 'description': "Page orientation. 'auto' picks landscape for sheets with ≥8 data columns."}, 'showHeaders': {'enum': ['true', 'false'], 'type': 'string', 'x-ui': {'labels': {'true': 'Show row & column headings', 'false': 'Hide row & column headings'}, 'unset_label': "Sheet's own setting"}, 'description': "Print the A B C column letters and 1 2 3 row numbers down the edges. Leave blank to keep the sheet's own setting."}, 'permPassword': {'type': 'string', 'x-ui': {'unset_label': 'Same as the open password'}, 'title': 'Owner password', 'format': 'password', 'description': 'A second, different password that locks printing, copying and editing. Only takes effect if you also set an open password above.'}, 'watermarkFont': {'enum': ['Helvetica', 'Times-Roman', 'Courier'], 'type': 'string', 'default': 'Helvetica', 'description': 'Lettering style for the watermark. Latin alphabet only. Only used when there is watermark text.'}, 'watermarkText': {'type': 'string', 'x-ui': {'unset_label': 'No watermark'}, 'description': 'Optional text watermark stamped on every page of the output.'}, 'watermarkColor': {'type': 'string', 'default': '#808080', 'description': 'Colour of the watermark lettering, as #rgb or #rrggbb. Anything else becomes mid-grey. Only used when there is watermark text.'}, 'watermarkScale': {'type': 'number', 'x-ui': {'unit': 'x'}, 'default': 1, 'maximum': 20, 'minimum': 0.01, 'description': 'Size multiplier applied on top of the lettering size. Only used when there is watermark text.'}, 'watermarkOpacity': {'type': 'number', 'default': 0.3, 'maximum': 1, 'minimum': 0, 'description': 'How solid the watermark looks: 1 is fully solid, 0.3 is a faint ghost. This is a fraction, not a percent. Only used when there is watermark text.'}, 'watermarkFontSize': {'type': 'integer', 'x-ui': {'unit': 'pt'}, 'default': 48, 'maximum': 1000, 'minimum': 1, 'description': 'Height of the watermark lettering in points. Only used when there is watermark text.'}, 'watermarkPosition': {'enum': ['c', 'tl', 'tc', 'tr', 'ml', 'mr', 'bl', 'bc', 'br'], 'type': 'string', 'x-ui': {'labels': {'c': 'Centre', 'bc': 'Bottom centre', 'bl': 'Bottom left', 'br': 'Bottom right', 'ml': 'Middle left', 'mr': 'Middle right', 'tc': 'Top centre', 'tl': 'Top left', 'tr': 'Top right'}}, 'default': 'c', 'description': 'Where the watermark sits on the page. Only used when there is watermark text.'}, 'watermarkRotation': {'type': 'integer', 'x-ui': {'unit': 'deg'}, 'default': 45, 'maximum': 180, 'minimum': -180, 'description': 'Angle of the watermark in whole degrees; 45 is the classic diagonal. Only used when there is watermark text.'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (XLSX, XLS, CSV, ODS)'}}}
输入模式
{'type': 'object', 'required': ['file', 'pages'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input PDF (max 25MB). The uploaded filename must end in .pdf.'}, 'pages': {'type': 'string', 'x-ui': {'no_recall': True, 'page_select': {}}, 'title': 'Pages to extract', 'description': "Page range e.g. '2-5,8'"}, 'outputName': {'type': 'string', 'x-ui': {'unset_label': 'Named after your file'}, 'description': 'Optional custom output basename.'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (PDF)'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input PDF'}, 'mode': {'enum': ['all', 'annotations', 'forms', 'none'], 'type': 'string', 'default': 'all', 'description': "Which interactive elements to flatten. 'none' runs no flatten (useful for OCR/watermark/PDFA-only pipelines)."}, 'pages': {'type': 'string', 'x-ui': {'no_recall': True, 'page_select': {}, 'unset_label': 'All pages'}, 'title': 'Pages to flatten', 'description': "Optional page range (e.g. '1-3,5,7-9'). Only listed pages are flattened; others stay interactive."}, 'ocrLang': {'enum': ['eng', 'fra', 'spa', 'deu', 'ita', 'por', 'nld', 'pol', 'chi_sim', 'jpn', 'kor', 'ara', 'rus', 'hin'], 'type': 'string', 'x-ui': {'labels': {'ara': 'Arabic', 'deu': 'German', 'eng': 'English', 'fra': 'French', 'hin': 'Hindi', 'ita': 'Italian', 'jpn': 'Japanese', 'kor': 'Korean', 'nld': 'Dutch', 'pol': 'Polish', 'por': 'Portuguese', 'rus': 'Russian', 'spa': 'Spanish', 'chi_sim': 'Chinese (Simplified)'}}, 'default': 'eng', 'description': 'Which language the scanned text is in.', 'x-show-when': {'ocrFirst': ['true']}}, 'ocrFirst': {'type': 'boolean', 'default': False, 'description': 'Run ocrmypdf before flattening (for scanned PDFs). Requires Starter+ tier.', 'tier_required': 'starter'}, 'exportData': {'type': 'boolean', 'default': False, 'description': 'Also give me the form answers and note text as separate files. You get a ZIP containing the flattened PDF plus form_values.json and annotations.json - not a PDF.'}, 'outputFormat': {'enum': ['pdf', 'pdfa'], 'type': 'string', 'default': 'pdf', 'description': 'pdfa produces a PDF/A-2b archival output. Requires Starter+ tier.', 'tier_required': 'starter'}, 'preserveLinks': {'type': 'boolean', 'default': False, 'description': 'Keep clickable hyperlinks after flattening (uses qpdf --flatten-annotations=print).'}, 'signatureMode': {'enum': ['preserve', 'ignore', 'block'], 'type': 'string', 'x-ui': {'labels': {'block': 'Stop and tell me', 'ignore': 'Flatten anyway (breaks the signature)', 'preserve': 'Leave signed files untouched'}}, 'default': 'preserve', 'description': 'What to do if the PDF has been digitally signed. Flattening destroys a signature, so by default we hand the original back untouched.'}, 'watermarkFont': {'enum': ['Helvetica', 'Times-Roman', 'Courier'], 'type': 'string', 'default': 'Helvetica', 'description': 'Exactly Helvetica, Times-Roman, or Courier (case-sensitive); anything else becomes Helvetica. Read only when watermarkText is set.'}, 'watermarkText': {'type': 'string', 'description': 'Text watermark to stamp before flattening. Leave empty to skip.'}, 'compressImages': {'type': 'boolean', 'default': False, 'description': 'Downsample images after flattening to shrink file size.'}, 'compressPreset': {'enum': ['screen', 'ebook', 'printer', 'prepress'], 'type': 'string', 'default': 'ebook', 'description': 'How hard to squeeze the pictures: screen 72 DPI, ebook 150 DPI, printer and prepress 300 DPI.', 'x-show-when': {'compressImages': ['true']}}, 'outputFilename': {'type': 'string', 'x-ui': {'unset_label': 'Named after your file'}, 'description': 'Optional custom filename for the flattened output (without path).'}, 'watermarkColor': {'type': 'string', 'default': '#808080', 'description': 'Hex color, #rgb or #rrggbb.'}, 'watermarkScale': {'type': 'number', 'x-ui': {'unit': 'x'}, 'default': 1, 'maximum': 20, 'minimum': 0.01, 'description': 'Absolute scale factor; default 1.0. Non-numeric resets to 1.0.'}, 'watermarkOpacity': {'type': 'number', 'default': 0.3, 'maximum': 1, 'minimum': 0, 'description': '0 = invisible, 1 = solid; default 0.3. Non-numeric resets to 0.3. Read only when watermarkText is set.'}, 'watermarkFontSize': {'type': 'integer', 'x-ui': {'unit': 'pt'}, 'default': 48, 'maximum': 1000, 'minimum': 1, 'description': 'Point size, integer; non-integer input silently resets to 48. Read only when watermarkText is set.'}, 'watermarkPosition': {'enum': ['c', 'tl', 'tc', 'tr', 'ml', 'mr', 'bl', 'bc', 'br'], 'type': 'string', 'x-ui': {'labels': {'c': 'Centre', 'bc': 'Bottom centre', 'bl': 'Bottom left', 'br': 'Bottom right', 'ml': 'Middle left', 'mr': 'Middle right', 'tc': 'Top centre', 'tl': 'Top left', 'tr': 'Top right'}}, 'default': 'c', 'description': 'Where the watermark sits on the page. Only used when there is watermark text.'}, 'watermarkRotation': {'type': 'integer', 'x-ui': {'unit': 'deg'}, 'default': 45, 'maximum': 180, 'minimum': -180, 'description': 'Degrees, integer; default 45 = classic diagonal. Non-integer resets to 45. Read only when watermarkText is set.'}}}
输入模式
{'type': 'object', 'required': ['files'], 'properties': {'mode': {'enum': ['all', 'annotations', 'forms', 'none'], 'type': 'string', 'default': 'all', 'description': "Which interactive elements to flatten. 'none' runs no flatten (useful for OCR/watermark/PDFA-only pipelines)."}, 'files': {'type': 'array', 'items': {'type': 'string', 'format': 'binary'}, 'description': 'Up to 20 input PDFs'}, 'pages': {'type': 'string', 'x-ui': {'no_recall': True, 'page_select': {}, 'unset_label': 'All pages'}, 'title': 'Pages to flatten', 'description': "Optional page range (e.g. '1-3,5,7-9'). Only listed pages are flattened; others stay interactive."}, 'ocrLang': {'enum': ['eng', 'fra', 'spa', 'deu', 'ita', 'por', 'nld', 'pol', 'chi_sim', 'jpn', 'kor', 'ara', 'rus', 'hin'], 'type': 'string', 'x-ui': {'labels': {'ara': 'Arabic', 'deu': 'German', 'eng': 'English', 'fra': 'French', 'hin': 'Hindi', 'ita': 'Italian', 'jpn': 'Japanese', 'kor': 'Korean', 'nld': 'Dutch', 'pol': 'Polish', 'por': 'Portuguese', 'rus': 'Russian', 'spa': 'Spanish', 'chi_sim': 'Chinese (Simplified)'}}, 'default': 'eng', 'description': 'Which language the scanned text is in.', 'x-show-when': {'ocrFirst': ['true']}}, 'ocrFirst': {'type': 'boolean', 'default': False, 'description': 'Run ocrmypdf before flattening (for scanned PDFs). Requires Starter+ tier.', 'tier_required': 'starter'}, 'exportData': {'type': 'boolean', 'default': False, 'description': 'Also give me the form answers and note text as separate files. You get a ZIP containing the flattened PDF plus form_values.json and annotations.json - not a PDF.'}, 'outputFormat': {'enum': ['pdf', 'pdfa'], 'type': 'string', 'default': 'pdf', 'description': 'pdfa produces a PDF/A-2b archival output. Requires Starter+ tier.', 'tier_required': 'starter'}, 'preserveLinks': {'type': 'boolean', 'default': False, 'description': 'Keep clickable hyperlinks after flattening (uses qpdf --flatten-annotations=print).'}, 'signatureMode': {'enum': ['preserve', 'ignore', 'block'], 'type': 'string', 'x-ui': {'labels': {'block': 'Stop and tell me', 'ignore': 'Flatten anyway (breaks the signature)', 'preserve': 'Leave signed files untouched'}}, 'default': 'preserve', 'description': 'What to do if the PDF has been digitally signed. Flattening destroys a signature, so by default we hand the original back untouched.'}, 'watermarkFont': {'enum': ['Helvetica', 'Times-Roman', 'Courier'], 'type': 'string', 'default': 'Helvetica', 'description': 'Exactly Helvetica, Times-Roman, or Courier (case-sensitive); anything else becomes Helvetica. Read only when watermarkText is set.'}, 'watermarkText': {'type': 'string', 'description': 'Text watermark to stamp before flattening. Leave empty to skip.'}, 'compressImages': {'type': 'boolean', 'default': False, 'description': 'Downsample images after flattening to shrink file size.'}, 'compressPreset': {'enum': ['screen', 'ebook', 'printer', 'prepress'], 'type': 'string', 'default': 'ebook', 'description': 'How hard to squeeze the pictures: screen 72 DPI, ebook 150 DPI, printer and prepress 300 DPI.', 'x-show-when': {'compressImages': ['true']}}, 'outputFilename': {'type': 'string', 'x-ui': {'unset_label': 'Named after your file'}, 'description': 'Optional custom filename for the flattened output (without path).'}, 'watermarkColor': {'type': 'string', 'default': '#808080', 'description': 'Hex color, #rgb or #rrggbb.'}, 'watermarkScale': {'type': 'number', 'x-ui': {'unit': 'x'}, 'default': 1, 'maximum': 20, 'minimum': 0.01, 'description': 'Absolute scale factor; default 1.0. Non-numeric resets to 1.0.'}, 'watermarkOpacity': {'type': 'number', 'default': 0.3, 'maximum': 1, 'minimum': 0, 'description': '0 = invisible, 1 = solid; default 0.3. Non-numeric resets to 0.3. Read only when watermarkText is set.'}, 'watermarkFontSize': {'type': 'integer', 'x-ui': {'unit': 'pt'}, 'default': 48, 'maximum': 1000, 'minimum': 1, 'description': 'Point size, integer; non-integer input silently resets to 48. Read only when watermarkText is set.'}, 'watermarkPosition': {'enum': ['c', 'tl', 'tc', 'tr', 'ml', 'mr', 'bl', 'bc', 'br'], 'type': 'string', 'x-ui': {'labels': {'c': 'Centre', 'bc': 'Bottom centre', 'bl': 'Bottom left', 'br': 'Bottom right', 'ml': 'Middle left', 'mr': 'Middle right', 'tc': 'Top centre', 'tl': 'Top left', 'tr': 'Top right'}}, 'default': 'c', 'description': 'Where the watermark sits on the page. Only used when there is watermark text.'}, 'watermarkRotation': {'type': 'integer', 'x-ui': {'unit': 'deg'}, 'default': 45, 'maximum': 180, 'minimum': -180, 'description': 'Degrees, integer; default 45 = classic diagonal. Non-integer resets to 45. Read only when watermarkText is set.'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (PDF)'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (PDF)'}, 'mode': {'enum': ['gray', 'bw'], 'type': 'string', 'x-ui': {'labels': {'bw': 'Pure black and white', 'gray': 'Shades of grey'}}, 'default': 'gray', 'description': 'Grey keeps every shade of the original. Black and white forces each dot to pure black or pure white - smaller, and right for line art or a fax.'}, 'pages': {'type': 'string', 'x-ui': {'no_recall': True, 'page_select': {}}, 'title': 'Pages to convert', 'description': 'Which pages to convert, written as 3,7 or 1-5. Leave it blank to convert every page.'}, 'strict': {'type': 'boolean', 'title': 'Refuse partial answers', 'default': False, 'description': 'Refuse the job if any page could not be converted, rather than handing back a document with colour pages still in it.'}, 'outputName': {'type': 'string', 'description': 'Optional name for the file you get back. Leave blank and we name it for you.'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input PDF (max 50MB)'}, 'color': {'type': 'string', 'default': '#404040', 'description': 'Hex color #rrggbb.'}, 'pages': {'type': 'string', 'x-ui': {'no_recall': True, 'page_select': {}}, 'title': 'Pages to add the header and footer to', 'description': "Optional page range, e.g. '1-3,5'. Empty = all pages."}, 'footer': {'type': 'string', 'x-ui': {'unset_label': 'No footer text'}, 'description': 'Footer text.'}, 'header': {'type': 'string', 'x-ui': {'unset_label': 'No header text'}, 'description': 'Header text. At least one of header/footer/pageNumbers is required.'}, 'margin': {'type': 'number', 'x-ui': {'unit': 'pt'}, 'default': 30, 'maximum': 100, 'minimum': 10, 'description': 'How far in from the edge of the page the text sits, in points (72 = 1 inch).'}, 'fontSize': {'type': 'integer', 'x-ui': {'unit': 'pt'}, 'default': 10, 'maximum': 20, 'minimum': 6, 'description': 'Text size in points.'}, 'fontFamily': {'enum': ['Helvetica', 'Times-Roman', 'Courier'], 'type': 'string', 'default': 'Helvetica', 'description': 'Typeface for the header and footer text.'}, 'footerAlign': {'enum': ['left', 'center', 'right'], 'type': 'string', 'default': 'center', 'description': 'Line the footer text up left, centred, or right.'}, 'headerAlign': {'enum': ['left', 'center', 'right'], 'type': 'string', 'default': 'center', 'description': 'Line the header text up left, centred, or right.'}, 'pageNumbers': {'enum': ['none', 'simple', 'pageN', 'nOfTotal', 'pageNOfTotal'], 'type': 'string', 'x-ui': {'labels': {'none': 'No page numbers', 'pageN': 'Page 7', 'simple': '7', 'nOfTotal': '7 of 12', 'pageNOfTotal': 'Page 7 of 12'}}, 'default': 'none', 'description': 'Page-number style.'}, 'outputFilename': {'type': 'string', 'x-ui': {'unset_label': "Keeps your file's name"}, 'description': 'Optional custom output filename.'}, 'pageNumberPosition': {'enum': ['header', 'footer'], 'type': 'string', 'default': 'footer', 'description': 'Put the page number in the header or the footer.', 'x-show-when': {'pageNumbers': ['simple', 'pageN', 'nOfTotal', 'pageNOfTotal']}}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'HTML file (.html or .htm, max 25MB)'}}}
输入模式
{'type': 'object', 'required': ['files'], 'properties': {'files': {'type': 'array', 'items': {'type': 'string', 'format': 'binary'}, 'description': 'Input files (JPG, JPEG, PNG, WEBP)'}, 'margin': {'type': 'integer', 'x-ui': {'unit': 'pt'}, 'default': 0, 'maximum': 200, 'minimum': 0, 'description': 'White border around each picture, in points - 72 points is one inch. A margin so large that nothing is left for the picture is ignored rather than refused.', 'x-show-when': {'pageSize': ['a4', 'a4-landscape', 'letter', 'letter-landscape', 'legal', 'legal-landscape', 'a3', 'a3-landscape', 'a5', 'a5-landscape', 'tabloid', 'tabloid-landscape']}}, 'fitMode': {'enum': ['contain', 'fill'], 'type': 'string', 'x-ui': {'labels': {'fill': 'Fill the page (crops the edges)', 'contain': 'Show the whole picture'}}, 'default': 'contain', 'description': 'How each picture sits on the page.', 'x-show-when': {'pageSize': ['a4', 'a4-landscape', 'letter', 'letter-landscape', 'legal', 'legal-landscape', 'a3', 'a3-landscape', 'a5', 'a5-landscape', 'tabloid', 'tabloid-landscape']}}, 'pageSize': {'enum': ['fit', 'a4', 'a4-landscape', 'letter', 'letter-landscape', 'legal', 'legal-landscape', 'a3', 'a3-landscape', 'a5', 'a5-landscape', 'tabloid', 'tabloid-landscape'], 'type': 'string', 'x-ui': {'labels': {'a3': 'A3 portrait', 'a4': 'A4 portrait', 'a5': 'A5 portrait', 'fit': 'Fit the page to the picture', 'legal': 'Legal portrait', 'letter': 'Letter portrait', 'tabloid': 'Tabloid portrait', 'a3-landscape': 'A3 landscape', 'a4-landscape': 'A4 landscape', 'a5-landscape': 'A5 landscape', 'legal-landscape': 'Legal landscape', 'letter-landscape': 'Letter landscape', 'tabloid-landscape': 'Tabloid landscape'}}, 'default': 'fit', 'description': 'Fit makes every page exactly the size of its own picture, so a phone photo becomes a page yards across. Any fixed size gives one uniform, printable document.'}, 'autoOrient': {'type': 'boolean', 'default': True, 'description': "Turn photos the right way up using the camera's own rotation tag. On by default — switch it off only if you want the raw pixels exactly as stored."}, 'orientation': {'enum': ['portrait', 'landscape', 'auto'], 'type': 'string', 'x-ui': {'labels': {'auto': 'Match each picture', 'portrait': 'Portrait', 'landscape': 'Landscape'}, 'unset_label': 'Follows page size'}, 'description': 'Leave blank to follow the page size you picked.', 'x-show-when': {'pageSize': ['a4', 'a4-landscape', 'letter', 'letter-landscape', 'legal', 'legal-landscape', 'a3', 'a3-landscape', 'a5', 'a5-landscape', 'tabloid', 'tabloid-landscape']}}}}
输入模式
{'type': 'object', 'required': ['files'], 'properties': {'files': {'type': 'array', 'items': {'type': 'string', 'format': 'binary'}, 'description': 'Input files (PDF (exactly 2 files))'}}}
输入模式
{'type': 'object', 'required': ['files'], 'properties': {'files': {'type': 'array', 'items': {'type': 'string', 'format': 'binary'}, 'minItems': 2, 'description': 'Input PDFs — at least 2 required.'}, 'title': {'type': 'string', 'x-ui': {'unset_label': 'Kept from the first file'}, 'description': 'Optional output metadata Title.'}, 'author': {'type': 'string', 'x-ui': {'unset_label': 'Kept from the first file'}, 'description': 'Optional output metadata Author.'}, 'subject': {'type': 'string', 'x-ui': {'unset_label': 'Kept from the first file'}, 'description': 'Optional output metadata Subject.'}, 'pageRanges': {'type': 'array', 'x-ui': {'no_recall': True, 'page_select': {'per_file': True}}, 'items': {'type': 'string'}, 'title': 'Pages to take from each file', 'description': 'Leave blank to use every page. To take only part of a file, give its pages in the same order as the files themselves — 1-3 for the first, 2,5 for the second.'}, 'addBookmarks': {'type': 'boolean', 'default': False, 'description': 'Add a bookmark at each document boundary.'}, 'insertBlanks': {'type': 'boolean', 'default': False, 'description': 'Insert a blank page between documents.'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Scanned PDF to make searchable.'}, 'lang': {'enum': ['eng', 'deu', 'fra', 'spa', 'ita', 'por', 'nld', 'rus', 'jpn', 'kor', 'chi_sim', 'chi_tra', 'ara', 'hin', 'eng+fra', 'eng+deu', 'eng+spa'], 'type': 'string', 'x-ui': {'labels': {'ara': 'Arabic', 'deu': 'German', 'eng': 'English', 'fra': 'French', 'hin': 'Hindi', 'ita': 'Italian', 'jpn': 'Japanese', 'kor': 'Korean', 'nld': 'Dutch', 'por': 'Portuguese', 'rus': 'Russian', 'spa': 'Spanish', 'chi_sim': 'Chinese (Simplified)', 'chi_tra': 'Chinese (Traditional)', 'eng+deu': 'English + German', 'eng+fra': 'English + French', 'eng+spa': 'English + Spanish'}}, 'default': 'eng', 'description': 'The language of the writing in the scan. The wrong language makes the searchable text gibberish.'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (PDF)'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'PDF up to 25MB. Password-protected input is rejected 400 — run pdf_unlock first.'}, 'color': {'type': 'string', 'default': '#333333', 'description': 'Hex color #rrggbb.'}, 'start': {'type': 'integer', 'default': 1, 'maximum': 999, 'minimum': 1, 'description': 'The number printed on the first numbered page.'}, 'format': {'enum': ['Page {page}', '{page}', '{page} of {pages}', '- {page} -'], 'type': 'string', 'x-ui': {'labels': {'{page}': '1', '- {page} -': '- 1 -', 'Page {page}': 'Page 1', '{page} of {pages}': '1 of 10'}}, 'default': 'Page {page}', 'description': 'How each number is written on the page.'}, 'fontSize': {'type': 'integer', 'x-ui': {'unit': 'pt'}, 'default': 10, 'maximum': 72, 'minimum': 6, 'description': 'Does NOT clamp — anything below 6 or above 72 silently RESETS to the default 10.'}, 'position': {'enum': ['bc', 'bl', 'br', 'tc', 'tl', 'tr'], 'type': 'string', 'x-ui': {'labels': {'bc': 'Bottom centre', 'bl': 'Bottom left', 'br': 'Bottom right', 'tc': 'Top centre', 'tl': 'Top left', 'tr': 'Top right'}}, 'default': 'bc', 'description': 'Where the number sits on the page.'}, 'skipLast': {'type': 'boolean', 'default': False, 'description': 'Skip numbering the last page.'}, 'pageRange': {'type': 'string', 'x-ui': {'no_recall': True, 'page_select': {}}, 'title': 'Pages to number', 'description': "Only number these pages, e.g. '2-5,8'. Empty = all pages."}, 'skipFirst': {'type': 'boolean', 'default': False, 'description': 'Skip numbering the first page.'}, 'fontFamily': {'enum': ['Helvetica', 'Times-Roman', 'Courier'], 'type': 'string', 'default': 'Helvetica', 'description': "Outside the enum it silently becomes Helvetica. Latin-1 fonts — a 'format' template with CJK/Cyrillic/emoji is refused 400."}, 'romanNumerals': {'type': 'boolean', 'default': False, 'description': 'Render numbers as roman numerals.'}, 'outputFilename': {'type': 'string', 'description': 'Optional custom output filename.'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (PPTX, PPT)'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input PDF (max 25MB)'}, 'password': {'type': 'string', 'title': 'Password', 'format': 'password', 'description': 'One password used for both opening the file and unlocking its permissions. Leave it blank only if you set an open password or a permissions password below instead - one of the three is needed.'}, 'encryption': {'enum': ['aes128', 'aes256'], 'type': 'string', 'x-ui': {'labels': {'aes128': 'AES-128 (compatible)', 'aes256': 'AES-256 (strongest)'}}, 'default': 'aes256', 'description': 'How strongly the file is locked.'}, 'outputName': {'type': 'string', 'x-ui': {'unset_label': 'Named after your file'}, 'description': 'Optional custom output filename.'}, 'permissions': {'type': 'string', 'description': 'What a reader is still allowed to do after they enter the password. Use any of print, copy, edit, annotate, separated by commas - or the single word all. A word we do not recognise is ignored, and if none of them are recognised the reader can do nothing at all, so leave this blank rather than guessing.'}, 'userPassword': {'type': 'string', 'x-ui': {'unset_label': 'Same as Password above'}, 'format': 'password', 'description': 'Optional separate open (user) password.'}, 'ownerPassword': {'type': 'string', 'x-ui': {'unset_label': 'Same as the open password (random if you limit permissions)'}, 'format': 'password', 'description': 'Optional separate permissions (owner) password.'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (PDF)'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (PDF)'}, 'passthrough': {'type': 'boolean', 'title': 'Carry on if there is nothing to remove', 'default': False, 'description': 'Some watermarks are painted into the page and cannot be lifted out. Left off, the step stops with an error when that happens. Switch it on and the file is passed through untouched so the rest of the workflow still runs.'}}}
输入模式
{'type': 'object', 'required': ['file', 'order'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input PDF (max 25MB)'}, 'order': {'type': 'string', 'description': "Complete new page order — EVERY page exactly once, comma-separated, e.g. '3,1,2' for a 3-page PDF. Partial orders, duplicates, or missing pages are rejected with a 400."}, 'password': {'type': 'string', 'x-ui': {'unset_label': 'Only needed for a locked PDF'}, 'format': 'password', 'description': 'Optional password for encrypted PDFs.'}, 'outputName': {'type': 'string', 'x-ui': {'unset_label': 'Named after your file'}, 'description': 'Optional custom output basename.'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (PDF)'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (PDF)'}, 'ranges': {'type': 'string', 'title': 'Only these pages', 'description': 'Reverse only these pages, written as 1-3,7-10. Leave it blank to reverse the whole document.'}, 'outputName': {'type': 'string', 'description': 'Optional name for the file you get back. Leave blank and we name it for you.'}, 'reverseTarget': {'enum': ['in', 'off'], 'type': 'string', 'x-ui': {'labels': {'in': 'Reverse the pages inside those ranges', 'off': 'Reverse everything outside those ranges'}}, 'default': 'in', 'description': 'Which pages the reversal applies to when you have named a range above. Ignored when no range is given.'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input PDF (max 25MB)'}, 'pages': {'type': 'string', 'x-ui': {'no_recall': True, 'page_select': {}}, 'title': 'Pages to rotate', 'description': "Which pages to turn, e.g. '1-3,5'. Leave blank to turn every page."}, 'rotation': {'enum': [90, 180, 270], 'type': 'integer', 'x-ui': {'labels': {'90': '90° clockwise', '180': '180° (upside down)', '270': '90° anticlockwise'}}, 'default': 90, 'description': 'How far to turn each page, clockwise.'}, 'outputName': {'type': 'string', 'description': 'Optional custom output filename.'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (RTF)'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'The PDF to edit. Password-protected input is rejected 400 — run pdf_unlock first.'}, 'title': {'type': 'string', 'x-ui': {'unset_label': 'Keeps the current title'}, 'description': 'At least one of title/author/subject/keywords is required.'}, 'author': {'type': 'string', 'description': 'Written verbatim to Author. Empty = left unchanged — this tool cannot blank a field (use pdf_remove_metadata to clear).'}, 'subject': {'type': 'string', 'description': 'Written verbatim to Subject. Empty = left unchanged — clearing a field is not possible here (use pdf_remove_metadata).'}, 'keywords': {'type': 'string', 'description': 'Free-text Keywords string written verbatim (commas are convention, not parsed). Empty = left unchanged, never cleared.'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input PDF (max 25MB)'}, 'mode': {'enum': ['range', 'all', 'chunks', 'even', 'odd'], 'type': 'string', 'default': 'range', 'description': "Split mode. 'range' extracts the pages listed in 'pages'; 'all' splits every page into its own file; 'chunks' splits every chunkSize pages; 'even'/'odd' keep only even/odd pages."}, 'pages': {'type': 'string', 'x-ui': {'no_recall': True, 'page_select': {'no_all': True}}, 'title': 'Pages to keep', 'description': "Which pages to keep, e.g. '1-3,5,7-9'.", 'x-show-when': {'mode': ['range']}}, 'chunkSize': {'type': 'integer', 'x-ui': {'unit': 'pages'}, 'default': 1, 'maximum': 100, 'minimum': 1, 'description': 'How many pages go into each output file.', 'x-show-when': {'mode': ['chunks']}}, 'outputName': {'type': 'string', 'description': 'Optional base name for the output file(s).'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'The PDF to preview. A 1-page input returns a bare JPEG instead of a ZIP — plan for both shapes. Password-protected = 400.'}, 'quality': {'enum': ['small', 'medium', 'large'], 'type': 'string', 'default': 'small', 'description': "Thumbnail size: small=72dpi, medium=150dpi, large=300dpi. There is no 'width' parameter."}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input PDF'}, 'pages': {'type': 'string', 'x-ui': {'no_recall': True, 'page_select': {}}, 'title': 'Pages to read', 'description': "Optional page range e.g. '1-5,10'. Empty = all pages."}, 'engine': {'enum': ['auto', 'lattice', 'stream', 'libreoffice'], 'type': 'string', 'default': 'auto', 'description': 'Table detection engine. auto = tabula lattice → stream → libreoffice fallback.'}, 'format': {'enum': ['xlsx', 'csv', 'tsv', 'json'], 'type': 'string', 'default': 'xlsx', 'description': 'xlsx/csv/tsv are file downloads; json returns structured data.'}, 'ocrLang': {'enum': ['eng', 'fra', 'spa', 'deu', 'ita', 'por', 'nld', 'pol', 'chi_sim', 'jpn', 'kor', 'ara', 'rus', 'hin'], 'type': 'string', 'x-ui': {'labels': {'ara': 'Arabic', 'deu': 'German', 'eng': 'English', 'fra': 'French', 'hin': 'Hindi', 'ita': 'Italian', 'jpn': 'Japanese', 'kor': 'Korean', 'nld': 'Dutch', 'pol': 'Polish', 'por': 'Portuguese', 'rus': 'Russian', 'spa': 'Spanish', 'chi_sim': 'Chinese (Simplified)'}}, 'default': 'eng', 'description': 'The language of the writing in the scan.', 'x-show-when': {'ocrFirst': ['true']}}, 'ocrFirst': {'type': 'boolean', 'default': False, 'description': 'Run ocrmypdf before extraction (beta — scanned PDFs).'}, 'sheetMode': {'enum': ['per-table', 'per-page', 'single'], 'type': 'string', 'x-ui': {'labels': {'single': 'Everything on one sheet', 'per-page': 'One sheet per page', 'per-table': 'One sheet per table'}}, 'default': 'per-table', 'description': "How the tables are laid out across the workbook's sheets.", 'x-show-when': {'format': ['xlsx']}}, 'tableIndexes': {'type': 'string', 'description': "Comma-separated 0-based indexes to keep (e.g. '0,2,3'). Empty = all tables."}}}
输入模式
{'type': 'object', 'required': ['files'], 'properties': {'files': {'type': 'array', 'items': {'type': 'string', 'format': 'binary'}, 'description': 'Up to 20 input PDFs'}, 'pages': {'type': 'string', 'x-ui': {'no_recall': True, 'page_select': {}}, 'title': 'Pages to read', 'description': "Optional page range e.g. '1-5,10'. Empty = all pages."}, 'engine': {'enum': ['auto', 'lattice', 'stream', 'libreoffice'], 'type': 'string', 'default': 'auto', 'description': 'Table detection engine. auto = tabula lattice → stream → libreoffice fallback.'}, 'format': {'enum': ['xlsx', 'csv', 'tsv', 'json'], 'type': 'string', 'default': 'xlsx', 'description': 'xlsx/csv/tsv are file downloads; json returns structured data.'}, 'ocrLang': {'enum': ['eng', 'fra', 'spa', 'deu', 'ita', 'por', 'nld', 'pol', 'chi_sim', 'jpn', 'kor', 'ara', 'rus', 'hin'], 'type': 'string', 'x-ui': {'labels': {'ara': 'Arabic', 'deu': 'German', 'eng': 'English', 'fra': 'French', 'hin': 'Hindi', 'ita': 'Italian', 'jpn': 'Japanese', 'kor': 'Korean', 'nld': 'Dutch', 'pol': 'Polish', 'por': 'Portuguese', 'rus': 'Russian', 'spa': 'Spanish', 'chi_sim': 'Chinese (Simplified)'}}, 'default': 'eng', 'description': 'The language of the writing in the scan.', 'x-show-when': {'ocrFirst': ['true']}}, 'ocrFirst': {'type': 'boolean', 'default': False, 'description': 'Run ocrmypdf before extraction (beta — scanned PDFs).'}, 'sheetMode': {'enum': ['per-table', 'per-page', 'single'], 'type': 'string', 'x-ui': {'labels': {'single': 'Everything on one sheet', 'per-page': 'One sheet per page', 'per-table': 'One sheet per table'}}, 'default': 'per-table', 'description': "How the tables are laid out across the workbook's sheets.", 'x-show-when': {'format': ['xlsx']}}, 'tableIndexes': {'type': 'string', 'description': "Comma-separated 0-based indexes to keep (e.g. '0,2,3'). Empty = all tables."}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': "The PDF to scan (multipart field 'file', 25MB cap). Runs real extraction but returns JSON metadata only — nothing is converted."}, 'pages': {'type': 'string', 'x-ui': {'no_recall': True, 'page_select': {}, 'unset_label': 'All pages'}, 'title': 'Pages to read', 'description': 'Optional page range'}, 'engine': {'enum': ['auto', 'lattice', 'stream', 'libreoffice'], 'type': 'string', 'default': 'auto', 'description': 'Table detection engine; invalid values fall back to auto.'}, 'ocrLang': {'type': 'string', 'default': 'eng', 'description': 'Accepted but ignored by the inspector - it never runs OCR. Run PDF OCR first, then inspect.', 'x-show-when': {'engine': ['__never']}}, 'ocrFirst': {'type': 'boolean', 'default': False, 'description': 'Accepted but ignored by the inspector — run pdf_ocr first, then inspect.', 'x-show-when': {'engine': ['__never']}}, 'tableIndexes': {'type': 'string', 'x-ui': {'unset_label': 'All tables'}, 'description': 'Accepted but ignored by the inspector - its whole job is to report every table so you can choose indexes on PDF to Excel afterwards.', 'x-show-when': {'engine': ['__never']}}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'dpi': {'type': 'integer', 'x-ui': {'unit': 'dpi'}, 'default': 150, 'maximum': 600, 'minimum': 30, 'description': 'Out-of-range values clamp silently to 30-600 — never an error. Non-numeric is ignored and stays 150.'}, 'crop': {'type': 'string', 'x-ui': {'unset_label': 'No cropping'}, 'description': "Area crop in PDF points: 'x,y,w,h'"}, 'file': {'type': 'string', 'format': 'binary', 'description': 'Input PDF'}, 'mode': {'enum': ['pages', 'sheet', 'filmstrip'], 'type': 'string', 'default': 'pages', 'description': 'sheet/filmstrip require Starter+'}, 'pages': {'type': 'string', 'x-ui': {'no_recall': True, 'page_select': {}}, 'title': 'Pages to convert', 'description': 'Page range e.g. 1-3,5,7-9. Empty = all.'}, 'format': {'enum': ['png', 'jpg', 'webp', 'avif', 'tiff'], 'type': 'string', 'default': 'png', 'description': 'Aliases jpeg/tif accepted; unknown values silently stay png. avif is Starter+ — Free tier gets a 402.'}, 'preset': {'enum': ['web', 'print', 'email', 'archive'], 'type': 'string', 'x-ui': {'labels': {'web': 'For a web page (WEBP, 96 DPI)', 'email': 'For emailing (JPG, 150 DPI)', 'print': 'For printing (PNG, 300 DPI)', 'archive': 'For keeping (PNG, 300 DPI)'}, 'unset_label': 'No preset'}, 'description': 'A ready-made bundle of settings. Anything you set yourself wins over the preset.'}, 'maxWidth': {'type': 'integer', 'x-ui': {'unit': 'px', 'pair_with': 'maxHeight', 'pair_label': 'Fit inside'}, 'maximum': 10000, 'minimum': 100, 'description': 'Shrink-only width cap in pixels, aspect preserved. Leave blank for no cap — an explicit 0 clamps UP to 100 and shrinks every page.'}, 'response': {'enum': ['zip', 'json', 'urls'], 'type': 'string', 'default': 'zip', 'description': 'urls mode requires Starter+ and authentication'}, 'sheetGap': {'type': 'integer', 'x-ui': {'unit': 'px'}, 'default': 10, 'maximum': 200, 'minimum': 0, 'description': 'Spacing between the tiles, in pixels.', 'x-show-when': {'mode': ['sheet', 'filmstrip']}}, 'colorMode': {'enum': ['rgb', 'grayscale', 'mono'], 'type': 'string', 'default': 'rgb', 'description': 'mono+jpg has no 1-bit JPEG — it silently renders grayscale and sets X-Color-Mode-Adjusted. Unknown values fall back to rgb.'}, 'maxHeight': {'type': 'integer', 'x-ui': {'unit': 'px'}, 'maximum': 10000, 'minimum': 100, 'description': 'Shrink-only height cap in pixels, aspect preserved. Omit for no cap — an explicit 0 clamps UP to 100 and shrinks every page.'}, 'avifQuality': {'type': 'integer', 'default': 75, 'maximum': 95, 'minimum': 50, 'description': 'Higher keeps more detail and makes a bigger file.', 'x-show-when': {'format': ['avif']}, 'tier_required': 'starter'}, 'jpegQuality': {'type': 'integer', 'default': 85, 'maximum': 95, 'minimum': 50, 'description': 'Higher keeps more detail and makes a bigger file. 50 is the lowest this tool will go.', 'x-show-when': {'format': ['jpg', 'tiff']}}, 'namePattern': {'type': 'string', 'description': 'Filename template with {basename}/{page}/{page:03d}/{dpi}/{format}/{date} tokens'}, 'transparent': {'type': 'boolean', 'default': False, 'description': 'Leave the paper see-through instead of white.', 'x-show-when': {'format': ['png', 'webp', 'avif'], 'colorMode': ['rgb']}}, 'webpQuality': {'type': 'integer', 'default': 80, 'maximum': 95, 'minimum': 50, 'description': 'Higher keeps more detail and makes a bigger file.', 'x-show-when': {'format': ['webp']}}, 'sheetColumns': {'type': 'integer', 'default': 4, 'maximum': 10, 'minimum': 1, 'description': 'How many pages sit side by side on the contact sheet.', 'x-show-when': {'mode': ['sheet']}}, 'watermarkFont': {'enum': ['Helvetica', 'Times-Roman', 'Courier'], 'type': 'string', 'default': 'Helvetica', 'description': 'Outside the enum it silently becomes Helvetica. Does nothing unless watermarkText is set.'}, 'watermarkText': {'type': 'string', 'x-ui': {'unset_label': 'No watermark'}, 'description': 'Optional text watermark stamped on each image'}, 'watermarkTile': {'type': 'boolean', 'default': False, 'description': 'Not used by this tool - a rasterised page is stamped once, where Watermark position says.', 'x-show-when': {'mode': ['__never']}}, 'watermarkColor': {'type': 'string', 'default': '#808080', 'description': 'Hex color, #rgb or #rrggbb.'}, 'watermarkScale': {'type': 'number', 'default': 1, 'maximum': 10, 'minimum': 0.01, 'description': 'Not used by this tool — size the stamp with Watermark font size.', 'x-show-when': {'mode': ['__never']}}, 'backgroundColor': {'type': 'string', 'default': '#FFFFFF', 'description': 'What fills the see-through parts of the page in a format that cannot keep them.', 'x-show-when': {'format': ['jpg', 'webp']}}, 'sheetBackground': {'type': 'string', 'title': 'Sheet background colour', 'default': '#FFFFFF', 'description': 'Colour of the canvas behind the tiles, as #rgb or #rrggbb. Anything we cannot read stays white.', 'x-show-when': {'mode': ['sheet', 'filmstrip']}}, 'tiffCompression': {'enum': ['lzw', 'packbits', 'zip', 'jpeg', 'g4', 'none'], 'type': 'string', 'x-ui': {'labels': {'g4': 'Group 4 (black and white)', 'lzw': 'LZW (lossless, default)', 'zip': 'ZIP (lossless)', 'jpeg': 'JPEG (smaller, lossy)', 'none': 'None (largest)', 'packbits': 'PackBits (lossless)'}}, 'default': 'lzw', 'description': 'How the TIFF is packed down.', 'x-show-when': {'format': ['tiff']}}, 'watermarkOpacity': {'type': 'number', 'default': 0.3, 'maximum': 1, 'minimum': 0, 'description': '0 invisible to 1 solid; out-of-range clamps. NOT a percent — 50 renders fully opaque. Needs watermarkText.'}, 'watermarkFontSize': {'type': 'integer', 'x-ui': {'unit': 'px'}, 'default': 48, 'maximum': 500, 'minimum': 1, 'description': "Size of the stamped text in PIXELS of the rasterised page: it is annotated onto the bitmap at ImageMagick's 72 dpi default, so at dpi=300 the same number covers ~4x less of the page than it would inside a PDF. Needs watermarkText."}, 'watermarkPosition': {'enum': ['c', 'tl', 'tc', 'tr', 'ml', 'mr', 'bl', 'bc', 'br'], 'type': 'string', 'x-ui': {'labels': {'c': 'Centre', 'bc': 'Bottom centre', 'bl': 'Bottom left', 'br': 'Bottom right', 'ml': 'Middle left', 'mr': 'Middle right', 'tc': 'Top centre', 'tl': 'Top left', 'tr': 'Top right'}}, 'default': 'c', 'description': 'Where the stamp sits on each image.'}, 'watermarkRotation': {'type': 'integer', 'x-ui': {'unit': 'deg'}, 'default': 45, 'maximum': 360, 'minimum': -360, 'description': "Integer degrees only — a decimal like '45.5' silently resets to 45. Needs watermarkText."}}}
输入模式
{'type': 'object', 'required': ['files'], 'properties': {'dpi': {'type': 'integer', 'x-ui': {'unit': 'dpi'}, 'default': 150, 'maximum': 600, 'minimum': 30, 'description': 'Out-of-range values clamp silently to 30-600 — never an error. Non-numeric is ignored and stays 150.'}, 'crop': {'type': 'string', 'x-ui': {'unset_label': 'No cropping'}, 'description': "Area crop in PDF points: 'x,y,w,h'"}, 'mode': {'enum': ['pages', 'sheet', 'filmstrip'], 'type': 'string', 'default': 'pages', 'description': 'sheet/filmstrip require Starter+'}, 'files': {'type': 'array', 'items': {'type': 'string', 'format': 'binary'}, 'description': 'Up to 20 input PDFs'}, 'pages': {'type': 'string', 'x-ui': {'no_recall': True, 'page_select': {}}, 'title': 'Pages to convert', 'description': 'Page range e.g. 1-3,5,7-9. Empty = all.'}, 'format': {'enum': ['png', 'jpg', 'webp', 'avif', 'tiff'], 'type': 'string', 'default': 'png', 'description': 'Aliases jpeg/tif accepted; unknown values silently stay png. avif is Starter+ — Free tier gets a 402.'}, 'preset': {'enum': ['web', 'print', 'email', 'archive'], 'type': 'string', 'x-ui': {'labels': {'web': 'For a web page (WEBP, 96 DPI)', 'email': 'For emailing (JPG, 150 DPI)', 'print': 'For printing (PNG, 300 DPI)', 'archive': 'For keeping (PNG, 300 DPI)'}, 'unset_label': 'No preset'}, 'description': 'A ready-made bundle of settings. Anything you set yourself wins over the preset.'}, 'maxWidth': {'type': 'integer', 'x-ui': {'unit': 'px', 'pair_with': 'maxHeight', 'pair_label': 'Fit inside'}, 'maximum': 10000, 'minimum': 100, 'description': 'Shrink-only width cap in pixels, aspect preserved. Leave blank for no cap — an explicit 0 clamps UP to 100 and shrinks every page.'}, 'sheetGap': {'type': 'integer', 'x-ui': {'unit': 'px'}, 'default': 10, 'maximum': 200, 'minimum': 0, 'description': 'Spacing between the tiles, in pixels.', 'x-show-when': {'mode': ['sheet', 'filmstrip']}}, 'colorMode': {'enum': ['rgb', 'grayscale', 'mono'], 'type': 'string', 'default': 'rgb', 'description': 'mono+jpg has no 1-bit JPEG — it silently renders grayscale and sets X-Color-Mode-Adjusted. Unknown values fall back to rgb.'}, 'maxHeight': {'type': 'integer', 'x-ui': {'unit': 'px'}, 'maximum': 10000, 'minimum': 100, 'description': 'Shrink-only height cap in pixels, aspect preserved. Omit for no cap — an explicit 0 clamps UP to 100 and shrinks every page.'}, 'avifQuality': {'type': 'integer', 'default': 75, 'maximum': 95, 'minimum': 50, 'description': 'Higher keeps more detail and makes a bigger file.', 'x-show-when': {'format': ['avif']}, 'tier_required': 'starter'}, 'jpegQuality': {'type': 'integer', 'default': 85, 'maximum': 95, 'minimum': 50, 'description': 'Higher keeps more detail and makes a bigger file. 50 is the lowest this tool will go.', 'x-show-when': {'format': ['jpg', 'tiff']}}, 'namePattern': {'type': 'string', 'description': 'Filename template with {basename}/{page}/{page:03d}/{dpi}/{format}/{date} tokens'}, 'transparent': {'type': 'boolean', 'default': False, 'description': 'Leave the paper see-through instead of white.', 'x-show-when': {'format': ['png', 'webp', 'avif'], 'colorMode': ['rgb']}}, 'webpQuality': {'type': 'integer', 'default': 80, 'maximum': 95, 'minimum': 50, 'description': 'Higher keeps more detail and makes a bigger file.', 'x-show-when': {'format': ['webp']}}, 'sheetColumns': {'type': 'integer', 'default': 4, 'maximum': 10, 'minimum': 1, 'description': 'How many pages sit side by side on the contact sheet.', 'x-show-when': {'mode': ['sheet']}}, 'watermarkFont': {'enum': ['Helvetica', 'Times-Roman', 'Courier'], 'type': 'string', 'default': 'Helvetica', 'description': 'Outside the enum it silently becomes Helvetica. Does nothing unless watermarkText is set.'}, 'watermarkText': {'type': 'string', 'x-ui': {'unset_label': 'No watermark'}, 'description': 'Optional text watermark stamped on each image'}, 'watermarkTile': {'type': 'boolean', 'default': False, 'description': 'Not used by this tool - a rasterised page is stamped once, where Watermark position says.', 'x-show-when': {'mode': ['__never']}}, 'watermarkColor': {'type': 'string', 'default': '#808080', 'description': 'Hex color, #rgb or #rrggbb.'}, 'watermarkScale': {'type': 'number', 'default': 1, 'maximum': 10, 'minimum': 0.01, 'description': 'Not used by this tool — size the stamp with Watermark font size.', 'x-show-when': {'mode': ['__never']}}, 'backgroundColor': {'type': 'string', 'default': '#FFFFFF', 'description': 'What fills the see-through parts of the page in a format that cannot keep them.', 'x-show-when': {'format': ['jpg', 'webp']}}, 'sheetBackground': {'type': 'string', 'title': 'Sheet background colour', 'default': '#FFFFFF', 'description': 'Colour of the canvas behind the tiles, as #rgb or #rrggbb. Anything we cannot read stays white.', 'x-show-when': {'mode': ['sheet', 'filmstrip']}}, 'tiffCompression': {'enum': ['lzw', 'packbits', 'zip', 'jpeg', 'g4', 'none'], 'type': 'string', 'x-ui': {'labels': {'g4': 'Group 4 (black and white)', 'lzw': 'LZW (lossless, default)', 'zip': 'ZIP (lossless)', 'jpeg': 'JPEG (smaller, lossy)', 'none': 'None (largest)', 'packbits': 'PackBits (lossless)'}}, 'default': 'lzw', 'description': 'How the TIFF is packed down.', 'x-show-when': {'format': ['tiff']}}, 'watermarkOpacity': {'type': 'number', 'default': 0.3, 'maximum': 1, 'minimum': 0, 'description': '0 invisible to 1 solid; out-of-range clamps. NOT a percent — 50 renders fully opaque. Needs watermarkText.'}, 'watermarkFontSize': {'type': 'integer', 'x-ui': {'unit': 'px'}, 'default': 48, 'maximum': 500, 'minimum': 1, 'description': "Size of the stamped text in PIXELS of the rasterised page: it is annotated onto the bitmap at ImageMagick's 72 dpi default, so at dpi=300 the same number covers ~4x less of the page than it would inside a PDF. Needs watermarkText."}, 'watermarkPosition': {'enum': ['c', 'tl', 'tc', 'tr', 'ml', 'mr', 'bl', 'bc', 'br'], 'type': 'string', 'x-ui': {'labels': {'c': 'Centre', 'bc': 'Bottom centre', 'bl': 'Bottom left', 'br': 'Bottom right', 'ml': 'Middle left', 'mr': 'Middle right', 'tc': 'Top centre', 'tl': 'Top left', 'tr': 'Top right'}}, 'default': 'c', 'description': 'Where the stamp sits on each image.'}, 'watermarkRotation': {'type': 'integer', 'x-ui': {'unit': 'deg'}, 'default': 45, 'maximum': 360, 'minimum': -360, 'description': "Integer degrees only — a decimal like '45.5' silently resets to 45. Needs watermarkText."}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (PDF)'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (PDF)'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (PDF)'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (TXT)'}}}
输入模式
{'type': 'object', 'required': ['file', 'password'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input PDF (max 25MB)'}, 'password': {'type': 'string', 'format': 'password', 'description': "The PDF's current password."}, 'outputName': {'type': 'string', 'x-ui': {'unset_label': 'Named after your file'}, 'description': 'Optional custom output filename.'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input PDF (filename must end in .pdf)'}, 'mode': {'enum': ['text', 'image'], 'type': 'string', 'default': 'text', 'description': "Watermark type. 'image' requires the imageFile field — presence of an image alone does NOT switch modes."}, 'text': {'type': 'string', 'default': 'CONFIDENTIAL', 'description': 'The wording stamped across each page.', 'x-show-when': {'mode': ['text']}}, 'tile': {'type': 'boolean', 'default': False, 'description': 'Repeat the watermark in a tiled pattern.'}, 'color': {'type': 'string', 'default': '#808080', 'description': 'Colour of the lettering. Hex, #rgb or #rrggbb.', 'x-show-when': {'mode': ['text']}}, 'pages': {'type': 'string', 'x-ui': {'no_recall': True, 'page_select': {}}, 'title': 'Pages to stamp', 'description': "Which pages to stamp, e.g. '1-3,5'. Empty = all pages."}, 'scale': {'type': 'number', 'default': 1, 'maximum': 10, 'minimum': 0.01, 'description': 'Size multiplier. With tile=true only values in (0,1] count (fraction of page) — anything else silently tiles at 0.3.'}, 'opacity': {'type': 'number', 'default': 0.3, 'maximum': 1, 'minimum': 0, 'description': '0-1 float; non-numeric resets to 0.3, but out-of-range values reach the PDF engine and 500. NOT a percent.'}, 'fontSize': {'type': 'integer', 'x-ui': {'unit': 'pt'}, 'default': 48, 'maximum': 500, 'minimum': 1, 'description': 'Height of the lettering in points.', 'x-show-when': {'mode': ['text']}}, 'position': {'enum': ['c', 'tl', 'tc', 'tr', 'ml', 'mr', 'bl', 'bc', 'br'], 'type': 'string', 'x-ui': {'labels': {'c': 'Centre', 'bc': 'Bottom centre', 'bl': 'Bottom left', 'br': 'Bottom right', 'ml': 'Middle left', 'mr': 'Middle right', 'tc': 'Top centre', 'tl': 'Top left', 'tr': 'Top right'}}, 'default': 'c', 'description': "Long names like 'bottom-right' are NOT recognized and silently fall back to c. ml/mr work (folded to engine anchors l/r)."}, 'rotation': {'type': 'integer', 'x-ui': {'unit': 'deg'}, 'default': 45, 'maximum': 180, 'minimum': -180, 'description': "Whole degrees only — a decimal string like '45.5' silently resets to 45."}, 'imageFile': {'type': 'string', 'format': 'binary', 'description': 'Watermark image — PNG, JPG, or SVG. REQUIRED when mode=image; ignored otherwise.', 'x-show-when': {'mode': ['image']}}, 'fontFamily': {'enum': ['Helvetica', 'Times-Roman', 'Courier'], 'type': 'string', 'default': 'Helvetica', 'description': 'Lettering style. Latin alphabet only — for other scripts stamp an image instead.', 'x-show-when': {'mode': ['text']}}, 'outputFilename': {'type': 'string', 'description': 'Optional custom output filename.'}}}
输入模式
{'type': 'object', 'x-draw': {'border': {'noun': 'border', 'shape': 'border', 'title': 'The border'}}, 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': "JPG, PNG or WebP. Max 25 MB. The output keeps the input format. The type is read from the file's own bytes, not from its name."}, 'size': {'type': 'integer', 'x-ui': {'draw': {'of': 'border', 'role': 'thickness'}, 'unit': 'px'}, 'title': 'Border thickness', 'default': 10, 'maximum': 500, 'minimum': 0, 'description': 'How thick the border is, in pixels, on all four sides. Out-of-range values are pulled back to the nearest allowed value rather than refused. 0 adds no border, but it is NOT a pass-through: the picture is still decoded and written out again (a JPEG is re-encoded at quality 92), and an EXIF-rotated phone photo comes back physically rotated with its orientation tag cleared.'}, 'color': {'type': 'string', 'x-ui': {'draw': {'of': 'border', 'role': 'color', 'names': {'red': [255, 0, 0], 'tan': [210, 180, 140], 'aqua': [0, 255, 255], 'blue': [0, 0, 255], 'cyan': [0, 255, 255], 'gold': [255, 215, 0], 'gray': [128, 128, 128], 'grey': [128, 128, 128], 'lime': [0, 255, 0], 'navy': [0, 0, 128], 'pink': [255, 192, 203], 'teal': [0, 128, 128], 'beige': [245, 245, 220], 'black': [0, 0, 0], 'brown': [165, 42, 42], 'green': [0, 128, 0], 'ivory': [255, 255, 240], 'khaki': [240, 230, 140], 'olive': [128, 128, 0], 'white': [255, 255, 255], 'indigo': [75, 0, 130], 'maroon': [128, 0, 0], 'orange': [255, 165, 0], 'purple': [128, 0, 128], 'salmon': [250, 128, 114], 'silver': [192, 192, 192], 'violet': [238, 130, 238], 'yellow': [255, 255, 0], 'crimson': [220, 20, 60], 'fuchsia': [255, 0, 255], 'magenta': [255, 0, 255], 'lavender': [230, 230, 250], 'turquoise': [64, 224, 208]}}}, 'title': 'Border colour', 'default': '#000000', 'description': 'A hex colour (#rgb, #rgba, #rrggbb or #rrggbbaa) or one of these 35 names — a hand-picked set, not the whole CSS list, so lightblue and darkgreen are refused: black, silver, gray, grey, white, maroon, red, purple, fuchsia, green, lime, olive, yellow, navy, blue, teal, aqua, cyan, magenta, orange, pink, brown, beige, ivory, gold, tan, khaki, crimson, indigo, violet, salmon, turquoise, lavender, plus none and transparent, which still widen the picture by the border size on every side but fill those new pixels with see-through rather than a visible frame. Anything else is refused rather than quietly falling back. A see-through colour needs a PNG or WebP input — on a JPEG it is refused, because JPEG cannot hold transparency and the border would come out black.'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'JPG, PNG, WebP, BMP (max 20MB)'}, 'model': {'enum': ['u2net', 'u2net_human_seg', 'isnet-general-use'], 'type': 'string', 'x-ui': {'labels': {'u2net': 'Standard', 'u2net_human_seg': 'People and portraits', 'isnet-general-use': 'Fine detail (slower)'}}, 'default': 'u2net', 'description': 'Segmentation model; u2net_human_seg is tuned for people. Invalid values fall back to u2net.'}, 'bg_color': {'type': 'string', 'x-ui': {'unset_label': 'Transparent'}, 'description': 'Optional solid background fill color. Default: transparent.'}, 'alpha_matting': {'type': 'boolean', 'title': 'Soften the edges', 'default': False, 'description': 'Re-solves hair, fur and glass edges as a soft fade instead of a hard cut. Slower and uses more memory.'}, 'alpha_matting_erode_size': {'type': 'integer', 'default': 10, 'maximum': 64, 'minimum': 0, 'description': 'Width of the band around the subject that gets re-solved. Only used when edge softening is on. Values outside 0-64 are pulled back into range.', 'x-show-when': {'alpha_matting': ['true']}}, 'alpha_matting_background_threshold': {'type': 'integer', 'default': 10, 'maximum': 255, 'minimum': 0, 'description': 'How certain a pixel must be to count as definitely background. Only used when edge softening is on. Values outside 0-255 are pulled back into range.', 'x-show-when': {'alpha_matting': ['true']}}, 'alpha_matting_foreground_threshold': {'type': 'integer', 'default': 240, 'maximum': 255, 'minimum': 0, 'description': 'How certain a pixel must be to count as definitely the subject. Only used when edge softening is on. Values outside 0-255 are pulled back into range.', 'x-show-when': {'alpha_matting': ['true']}}}}
输入模式
{'type': 'object', 'required': ['files'], 'properties': {'gap': {'type': 'integer', 'x-ui': {'unit': 'px'}, 'default': 10, 'maximum': 100, 'minimum': 0, 'description': 'Gap between cells in px, 0-100.'}, 'files': {'type': 'array', 'items': {'type': 'string', 'format': 'binary'}, 'description': "2-16 images — JPG, PNG, WebP, HEIC. The multipart field name is 'files[]' (with brackets)."}, 'layout': {'enum': ['1x2', '2x1', '2x2', '2x3', '3x2', '3x3', '4x4'], 'type': 'string', 'default': '2x2', 'description': 'A plain grid, written as columns then rows.', 'x-show-when': {'layout_mode': ['grid_legacy']}}, 'quality': {'type': 'integer', 'default': 90, 'maximum': 100, 'minimum': 1, 'description': 'Output quality; 0 or omitted = engine default.', 'x-show-when': {'output_format': ['jpg', 'webp', 'avif']}}, 'bg_color': {'type': 'string', 'default': 'white', 'description': "'white', 'black', 'transparent', or hex (#abc/#aabbcc). Unknown values silently become white; jpg output flattens transparency to white."}, 'template': {'enum': ['ig_post_2x2', 'ig_post_hero_3', 'ig_post_5_magazine', 'ig_story_3_vertical', 'ig_story_hero_4', 'ig_carousel_4_split', 'pinterest_3_stack', 'landscape_3up_equal', 'landscape_hero_2_offset', 'landscape_film_strip', 'square_diptych', 'square_triptych_top_2_bottom_1'], 'type': 'string', 'x-ui': {'labels': {'ig_post_2x2': 'Instagram post — 2x2', 'ig_post_hero_3': 'Instagram post — hero + 3', 'square_diptych': 'Diptych — side by side', 'ig_story_hero_4': 'Story — hero + 4 strip', 'pinterest_3_stack': 'Pinterest — 3 stack', 'ig_post_5_magazine': 'Magazine — 5 photos', 'ig_carousel_4_split': 'Carousel — quad split', 'ig_story_3_vertical': 'Story — 3 stacked', 'landscape_3up_equal': 'Landscape — 3 equal columns', 'landscape_film_strip': 'Landscape — 5 film strip', 'landscape_hero_2_offset': 'Landscape — hero + 2 stacked', 'square_triptych_top_2_bottom_1': 'Triptych — 2 over 1'}, 'unset_label': 'Choose a template'}, 'description': 'Named template (layout_mode=template), e.g. ig_post_2x2, ig_story_3_vertical, ig_post_5_magazine. Needed when Layout mode is template: there is no default, and a template-mode run with none chosen, or with fewer photos than the template has places for, is refused with the reason.', 'x-show-when': {'layout_mode': ['template']}}, 'layout_mode': {'enum': ['smart', 'template', 'grid_legacy'], 'type': 'string', 'default': 'smart', 'description': "Omit to auto-infer: 'template' present implies template mode, 'layout' implies grid_legacy, otherwise smart."}, 'aspect_ratio': {'enum': ['1:1', '4:5', '9:16', '2:3', '16:9', '3:2'], 'type': 'string', 'default': '1:1', 'description': 'Output aspect ratio (smart mode).', 'x-show-when': {'layout_mode': ['smart', 'grid_legacy']}}, 'output_width': {'type': 'integer', 'x-ui': {'unit': 'px'}, 'default': 1200, 'maximum': 4000, 'minimum': 400, 'description': 'Older name for the setting above. Set the longest side instead; this is only used if that one is left empty.'}, 'output_format': {'enum': ['jpg', 'png', 'webp', 'avif'], 'type': 'string', 'default': 'jpg', 'description': "'jpeg' is accepted as an alias for jpg. png ignores 'quality' (fixed compression)."}, 'output_long_edge': {'type': 'integer', 'x-ui': {'unit': 'px'}, 'default': 1200, 'maximum': 4000, 'minimum': 400, 'description': 'Output long edge in px.'}}}
输入模式
{'type': 'object', 'required': ['files'], 'properties': {'fps': {'type': 'integer', 'x-ui': {'unit': 'fps'}, 'default': 24, 'maximum': 30, 'minimum': 15, 'description': 'Frames per second, 15-30.'}, 'gap': {'type': 'integer', 'x-ui': {'unit': 'px'}, 'default': 10, 'maximum': 100, 'minimum': 0, 'description': 'Gap between cells in px, 0-100.'}, 'files': {'type': 'array', 'items': {'type': 'string', 'format': 'binary'}, 'description': "2-16 images — JPG, PNG, WebP, HEIC. The multipart field name is 'files[]' (with brackets)."}, 'layout': {'type': 'string', 'default': '2x2', 'description': 'A plain grid, written as columns then rows: 2x2, 3x2, 1x4. Each number may be 1 to 8.', 'x-show-when': {'layout_mode': ['grid_legacy']}}, 'motion': {'enum': ['ken_burns', 'none'], 'type': 'string', 'default': 'ken_burns', 'description': 'ken_burns = slow pan/zoom per cell. Invalid values silently become ken_burns, not an error.'}, 'bg_color': {'type': 'string', 'default': 'white', 'description': "'white', 'black', 'transparent', or hex. Unknown values become white; frames encode as jpg so transparency flattens to white."}, 'template': {'enum': ['ig_post_2x2', 'ig_post_hero_3', 'ig_post_5_magazine', 'ig_story_3_vertical', 'ig_story_hero_4', 'ig_carousel_4_split', 'pinterest_3_stack', 'landscape_3up_equal', 'landscape_hero_2_offset', 'landscape_film_strip', 'square_diptych', 'square_triptych_top_2_bottom_1'], 'type': 'string', 'x-ui': {'labels': {'ig_post_2x2': 'Instagram post — 2x2', 'ig_post_hero_3': 'Instagram post — hero + 3', 'square_diptych': 'Diptych — side by side', 'ig_story_hero_4': 'Story — hero + 4 strip', 'pinterest_3_stack': 'Pinterest — 3 stack', 'ig_post_5_magazine': 'Magazine — 5 photos', 'ig_carousel_4_split': 'Carousel — quad split', 'ig_story_3_vertical': 'Story — 3 stacked', 'landscape_3up_equal': 'Landscape — 3 equal columns', 'landscape_film_strip': 'Landscape — 5 film strip', 'landscape_hero_2_offset': 'Landscape — hero + 2 stacked', 'square_triptych_top_2_bottom_1': 'Triptych — 2 over 1'}, 'unset_label': 'Choose a template'}, 'description': 'Named template (layout_mode=template). Needed when Layout mode is template: there is no default, and a template-mode run with none chosen, or with fewer photos than the template has places for, is refused with the reason.', 'x-show-when': {'layout_mode': ['template']}}, 'layout_mode': {'enum': ['smart', 'template', 'grid_legacy'], 'type': 'string', 'default': 'smart', 'description': "Omit to auto-infer: 'template' present implies template mode, 'layout' implies grid_legacy, otherwise smart."}, 'aspect_ratio': {'enum': ['1:1', '4:5', '9:16', '2:3', '16:9', '3:2'], 'type': 'string', 'default': '1:1', 'description': "Defaults to the template's own ratio in template mode, else 1:1. The long edge is height for portrait ratios.", 'x-show-when': {'layout_mode': ['smart', 'grid_legacy']}}, 'duration_sec': {'type': 'integer', 'x-ui': {'unit': 'seconds'}, 'default': 4, 'maximum': 10, 'minimum': 1, 'description': 'Video duration in seconds, 1-10.'}, 'output_width': {'type': 'integer', 'x-ui': {'unit': 'px'}, 'default': 1080, 'maximum': 1920, 'minimum': 400, 'description': 'Older name for the setting above. Set the longest side instead; this is only used if that one is left empty.'}, 'output_long_edge': {'type': 'integer', 'x-ui': {'unit': 'px'}, 'default': 1080, 'maximum': 1920, 'minimum': 400, 'description': 'Output long edge in px, 400-1920.'}, 'output_video_format': {'enum': ['mp4', 'gif', 'webm'], 'type': 'string', 'default': 'mp4', 'description': 'gif returns image/gif and balloons in size at high fps — prefer mp4/webm beyond a few seconds.'}}}
输入模式
{'type': 'object', 'required': ['target_image', 'tile_files'], 'properties': {'bg_color': {'type': 'string', 'default': 'white', 'description': 'white/black/transparent/none or #hex (3 or 6 digit); anything else silently = white. Visible only where a tile cell fails to render.'}, 'tile_files': {'type': 'array', 'items': {'type': 'string', 'format': 'binary'}, 'description': "20-1000 tile photos. The multipart field name is 'tile_files[]' (with brackets)."}, 'target_image': {'type': 'string', 'format': 'binary', 'description': 'The hero photo the mosaic recreates — exactly one file.'}, 'tile_size_px': {'type': 'integer', 'x-ui': {'unit': 'px'}, 'default': 60, 'maximum': 200, 'minimum': 30, 'description': 'Tile size in px, 30-200.'}, 'output_format': {'enum': ['jpg', 'png', 'webp', 'avif'], 'type': 'string', 'default': 'jpg', 'description': "'jpeg' is accepted as an alias for jpg. Any other unlisted value silently falls back to jpg — no error."}, 'output_long_edge': {'type': 'integer', 'x-ui': {'unit': 'px'}, 'default': 2400, 'maximum': 4000, 'minimum': 1200, 'description': 'Output long edge in px, 1200-4000.'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'JPG, PNG, WebP, GIF, BMP, HEIC, TIFF. Max 25 MB. Output keeps the input format, except that a HEIC or HEIF photo comes back as a JPG.'}, 'contrast': {'type': 'number', 'x-ui': {'unit': '%'}, 'default': 0, 'maximum': 100, 'minimum': -100, 'description': 'Percent -100..100; 0 = no change. Not clamped server-side — keep within range.'}, 'brightness': {'type': 'number', 'x-ui': {'unit': '%'}, 'default': 0, 'maximum': 100, 'minimum': -100, 'description': 'Percent -100..100; 0 = no change (unlike saturation where 100 = no change). -100 = solid black, +100 = solid white.'}, 'saturation': {'type': 'number', 'x-ui': {'unit': '%'}, 'default': 100, 'maximum': 200, 'minimum': 0, 'description': "0-200 scale where 100 = unchanged, 0 = grayscale, 200 = double saturation. Do NOT send 0 for 'no change'."}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'JPG, PNG, WebP, GIF, BMP, HEIC/HEIF. HEIC/HEIF input always comes back as JPG unless output_format overrides.'}, 'quality': {'type': 'integer', 'default': 80, 'maximum': 100, 'minimum': 1, 'description': '1-100 (400 outside). PNG→PNG maps it to lossless compression effort — pixels unchanged; other formats re-encode lossily.'}, 'strip_exif': {'type': 'boolean', 'default': True, 'description': 'Strip EXIF metadata from the output. Pass false to preserve it.'}, 'output_format': {'enum': ['jpg', 'png', 'webp'], 'type': 'string', 'x-ui': {'unset_label': 'Keeps input format (HEIC becomes JPG)'}, 'description': 'Optional output format; omit to keep the input format. HEIC input converts to JPG unless overridden.'}}}
输入模式
{'type': 'object', 'required': ['file', 'target_size_kb'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'JPG, PNG, WebP, GIF, BMP, HEIC, HEIF'}, 'strip_exif': {'type': 'boolean', 'default': True, 'description': 'Strip EXIF metadata from the output.'}, 'output_format': {'enum': ['jpg', 'png', 'webp'], 'type': 'string', 'x-ui': {'unset_label': 'Keeps input format (HEIC becomes JPG)'}, 'description': 'What to save it as. Leave blank to keep the format it came in as - except HEIC and HEIF pictures, which always come back as JPG. Squeezing to a size needs a format that compresses, which is why BMP and GIF are not offered.'}, 'target_size_kb': {'type': 'integer', 'x-ui': {'unit': 'KB'}, 'default': 500, 'maximum': 25600, 'minimum': 1, 'description': "Target size in KB as a positive integer, e.g. 200. Field name is 'target_size_kb' — not 'target_size'."}}}
输入模式
{'type': 'object', 'x-draw': {'crop': {'noun': 'crop box', 'shape': 'box', 'title': 'Part to keep'}}, 'required': ['file', 'width', 'height'], 'properties': {'x': {'type': 'integer', 'x-ui': {'draw': {'of': 'crop', 'role': 'left'}, 'unit': 'px', 'pair_with': 'y', 'pair_joint': ',', 'pair_label': 'Top-left corner'}, 'default': 0, 'maximum': 20000, 'minimum': 0, 'description': 'Left offset px on the DISPLAYED (EXIF-upright) image — the handler auto-orients before cropping.'}, 'y': {'type': 'integer', 'x-ui': {'draw': {'of': 'crop', 'role': 'top'}, 'unit': 'px'}, 'default': 0, 'maximum': 20000, 'minimum': 0, 'description': 'Top offset px on the DISPLAYED (EXIF-upright) image — the handler auto-orients before cropping.'}, 'file': {'type': 'string', 'format': 'binary', 'description': 'JPG, PNG, WebP, HEIC, TIFF, BMP, or GIF. Output keeps the input format, except that a HEIC or HEIF photo comes back as a JPG.'}, 'width': {'type': 'integer', 'x-ui': {'draw': {'of': 'crop', 'role': 'width'}, 'unit': 'px', 'pair_with': 'height', 'pair_label': 'Size'}, 'maximum': 20000, 'minimum': 1, 'description': 'Crop width px. Clipped at the image edge if the region overruns.'}, 'height': {'type': 'integer', 'x-ui': {'draw': {'of': 'crop', 'role': 'height'}, 'unit': 'px'}, 'maximum': 20000, 'minimum': 1, 'description': 'Crop height px. A region overrunning the image edge is clipped, not an error.'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'JPG, PNG, WebP, GIF, BMP, HEIC, TIFF (max 25MB). Output keeps the input format, except that a HEIC or HEIF photo comes back as a JPG.'}, 'filter': {'enum': ['grayscale', 'sepia', 'blur', 'sharpen', 'negate', 'vignette'], 'type': 'string', 'default': 'grayscale', 'description': 'Filter to apply.'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (JPG, PNG, TIFF, HEIC)'}}}
输入模式
{'type': 'object', 'x-draw': {'areas': {'note': 'Every face it finds is hidden the same way. Mark anything else to hide, like a name badge or a license plate.', 'noun': 'area to hide', 'shape': 'boxes', 'title': 'Areas to hide', 'note_no_picture': 'Every face it finds is hidden the same way. Other areas can be marked only when this step works on an attached picture.'}}, 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'JPG, PNG, WebP, BMP (max 25MB)'}, 'blur_mode': {'enum': ['gaussian', 'pixelate', 'solid'], 'type': 'string', 'x-ui': {'draw': {'of': 'areas', 'role': 'look', 'looks': {'solid': 'fill', 'gaussian': 'blur', 'pixelate': 'pixelate'}, 'fallback': 'gaussian'}}, 'default': 'gaussian', 'description': 'gaussian softens, pixelate mosaics, solid draws an opaque black box — solid is the only mode that survives deblurring attacks.'}, 'block_size': {'type': 'integer', 'x-ui': {'draw': {'of': 'areas', 'from': 2, 'role': 'block_size'}, 'unit': 'px'}, 'default': 0, 'maximum': 30, 'minimum': 0, 'description': 'Size of each mosaic square. 0 uses the amount chosen above; 1 is ignored, use 2 or more.', 'x-show-when': {'blur_mode': ['pixelate']}}, 'blur_radius': {'type': 'integer', 'x-ui': {'draw': {'of': 'areas', 'from': 1, 'role': 'blur_radius'}, 'unit': 'px'}, 'default': 0, 'maximum': 100, 'minimum': 0, 'description': 'Gaussian radius override. 0 = auto from blur_strength.', 'x-show-when': {'blur_mode': ['gaussian']}}, 'manual_faces': {'type': 'string', 'x-ui': {'draw': {'of': 'areas', 'role': 'list'}, 'unset_label': 'Only the faces it finds'}, 'description': 'Advanced: extra rectangles to blur even if no face was found there, as [{"x":10,"y":20,"w":80,"h":80}] in pixels of the picture as it is shown (turned upright by its EXIF tag). Decimals are rounded.'}, 'blur_strength': {'type': 'integer', 'x-ui': {'draw': {'of': 'areas', 'blur': [8, 16, 28, 42], 'role': 'strength', 'block': [4, 6, 10, 15]}}, 'default': 2, 'maximum': 4, 'minimum': 1, 'description': 'Preset intensity 1-4. blur_radius/block_size overrides beat it when set; irrelevant for solid mode.', 'x-show-when': {'blur_mode': ['gaussian', 'pixelate']}}, 'output_format': {'enum': ['jpg', 'png', 'webp', 'bmp'], 'type': 'string', 'x-ui': {'unset_label': 'Keeps input format'}, 'description': 'Optional output format; defaults to the input format.'}, 'selected_faces': {'type': 'string', 'x-ui': {'builder_omits': True}, 'description': 'Advanced: which detected faces to blur, as a list of numbers starting at 0, e.g. [0,2]. Leave it blank to blur every face found; an empty list [] blurs none of them, only the areas in manual_faces. Not offered in the workflow builder: each file there has its own faces.', 'x-show-when': {'blur_mode': ['__never']}}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (JPG, PNG, WebP, BMP)'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input image (max 25MB)'}, 'action': {'enum': ['rotate90', 'rotate180', 'rotate270', 'flip-h', 'flip-v', 'custom'], 'type': 'string', 'x-ui': {'labels': {'custom': 'Rotate by an exact angle', 'flip-h': 'Flip left to right', 'flip-v': 'Flip top to bottom', 'rotate90': 'Rotate 90° right', 'rotate180': 'Rotate 180°', 'rotate270': 'Rotate 90° left'}}, 'default': 'rotate90', 'description': "Rotate values have NO hyphen: 'rotate90', not 'rotate-90'. 'custom' rotates by the 'degrees' field."}, 'degrees': {'type': 'number', 'x-ui': {'unit': 'deg'}, 'default': 0, 'maximum': 360, 'minimum': -360, 'description': 'Rotation degrees, -360 to 360 — only used when action=custom.', 'x-show-when': {'action': ['custom']}}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input format is unrestricted — anything ImageMagick reads, incl. HEIC. Max 25 MB.'}, 'format': {'enum': ['jpg', 'png', 'webp', 'tiff', 'bmp', 'gif', 'avif'], 'type': 'string', 'default': 'png', 'description': "'jpeg' also accepted (saved as .jpg). EXIF rotation is baked into the pixels — most target formats can't carry the tag."}}}
输入模式
{'type': 'object', 'required': ['image1', 'image2'], 'properties': {'fuzz': {'type': 'integer', 'x-ui': {'unit': '%'}, 'default': 5, 'maximum': 20, 'minimum': 0, 'description': 'Per-pixel tolerance percent, 0-20.'}, 'image1': {'type': 'string', 'format': 'binary', 'description': 'First image — JPG, PNG, WebP, BMP (max 25MB)'}, 'image2': {'type': 'string', 'format': 'binary', 'description': 'Second image — JPG, PNG, WebP, BMP (max 25MB)'}, 'normalize': {'type': 'boolean', 'default': True, 'description': 'Normalize sizes before comparing.'}, 'output_format': {'enum': ['png', 'jpg', 'webp'], 'type': 'string', 'default': 'png', 'description': 'Format of the returned diff image. AE/SSIM/PSNR/RMSE scores ride X-JE-Metric-* response headers, not the body.'}, 'lowlight_color': {'type': 'string', 'default': '#222222', 'description': 'Hex color for unchanged pixels.'}, 'highlight_color': {'type': 'string', 'default': '#ff0000', 'description': 'Hex color for changed pixels.'}}}
输入模式
{'type': 'object', 'x-draw': {'overlay': {'on': 'background', 'noun': 'overlay', 'image': 'overlay', 'shape': 'stamp', 'title': 'Where the overlay goes'}}, 'required': ['background', 'overlay'], 'properties': {'scale': {'type': 'integer', 'x-ui': {'draw': {'of': 'overlay', 'role': 'size', 'measure': 'percent-own'}, 'unit': '%'}, 'default': 30, 'maximum': 200, 'minimum': 1, 'description': "Overlay size as a percent of the overlay's own size, not of the background: 100 keeps it as it is, 50 halves it, 200 doubles it."}, 'opacity': {'type': 'integer', 'x-ui': {'draw': {'of': 'overlay', 'max': 100, 'role': 'opacity'}, 'unit': '%'}, 'default': 100, 'maximum': 100, 'minimum': 0, 'description': 'Overlay opacity 0-100.'}, 'overlay': {'type': 'string', 'format': 'binary', 'description': 'Image composited on top — JPG, PNG, WebP, BMP (max 20MB)'}, 'position': {'enum': ['tl', 'tc', 'tr', 'ml', 'mc', 'mr', 'bl', 'bc', 'br'], 'type': 'string', 'x-ui': {'draw': {'of': 'overlay', 'role': 'anchor', 'cells': {'bc': 'bc', 'bl': 'bl', 'br': 'br', 'mc': 'mc', 'ml': 'ml', 'mr': 'mr', 'tc': 'tc', 'tl': 'tl', 'tr': 'tr'}}, 'labels': {'bc': 'Bottom centre', 'bl': 'Bottom left', 'br': 'Bottom right', 'mc': 'Middle centre', 'ml': 'Middle left', 'mr': 'Middle right', 'tc': 'Top centre', 'tl': 'Top left', 'tr': 'Top right'}}, 'default': 'mc', 'description': 'Anchor cell the overlay snaps to; x_offset/y_offset shift from THIS anchor, not from the top-left corner.'}, 'x_offset': {'type': 'integer', 'x-ui': {'draw': {'of': 'overlay', 'from': 'inward', 'role': 'offset_x'}, 'unit': 'px', 'pair_with': 'y_offset', 'pair_joint': ',', 'pair_label': 'Nudge from the anchor'}, 'default': 0, 'maximum': 10000, 'minimum': -10000, 'description': 'Px shift with gravity semantics: positive pushes inward from the anchored edge (leftward from right-side anchors).'}, 'y_offset': {'type': 'integer', 'x-ui': {'draw': {'of': 'overlay', 'from': 'inward', 'role': 'offset_y'}, 'unit': 'px'}, 'default': 0, 'maximum': 10000, 'minimum': -10000, 'description': 'Px shift with gravity semantics: positive pushes inward from the anchored edge (upward from bottom anchors).'}, 'background': {'type': 'string', 'format': 'binary', 'description': 'Base image — JPG, PNG, WebP, BMP (max 30MB)'}, 'output_format': {'enum': ['jpg', 'png', 'webp', 'bmp'], 'type': 'string', 'x-ui': {'unset_label': "Keeps background's format"}, 'description': "Optional output format; defaults to the background's format."}}}
输入模式
{'type': 'object', 'x-draw': {'grid': {'noun': 'grid', 'shape': 'grid', 'title': 'Where it is cut'}}, 'required': ['file'], 'properties': {'cols': {'type': 'integer', 'x-ui': {'draw': {'of': 'grid', 'role': 'cols'}, 'pair_with': 'rows', 'pair_label': 'Grid'}, 'title': 'Columns', 'default': 3, 'maximum': 8, 'minimum': 1, 'description': 'Columns, 1-8. The rightmost column absorbs remainder px, so tile widths can differ slightly.'}, 'file': {'type': 'string', 'format': 'binary', 'description': 'Image to split — JPG, PNG, WebP, or BMP (max 30 MB). Output is ALWAYS a ZIP of tiles, even for tiny grids.'}, 'rows': {'type': 'integer', 'x-ui': {'draw': {'of': 'grid', 'role': 'rows'}}, 'default': 3, 'maximum': 8, 'minimum': 1, 'description': 'Rows, 1-8. The bottom row absorbs remainder px. rows x cols tiles come back in one ZIP.'}, 'output_format': {'enum': ['jpg', 'png', 'webp', 'bmp'], 'type': 'string', 'x-ui': {'unset_label': 'Keeps input format'}, 'description': 'Optional tile format; defaults to the input format.'}}}
输入模式
{'type': 'object', 'x-draw': {'captions': {'noun': 'caption', 'shape': 'captions', 'title': 'Captions on the picture'}}, 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Base image — JPG, PNG, WebP, BMP (max 25MB)'}, 'font': {'enum': ['Impact', 'Arial-Bold', 'DejaVu-Sans-Bold'], 'type': 'string', 'x-ui': {'draw': {'of': 'captions', 'role': 'font', 'faces': {'Impact': 'anton', 'Arial-Bold': 'liberation-sans-bold', 'DejaVu-Sans-Bold': 'dejavu-sans-bold'}, 'fallback': 'Impact'}}, 'default': 'Impact', 'description': "A font the server does not have is replaced: Impact by Anton (a free face in Impact's style, shipped with the server), Arial-Bold by Liberation-Sans-Bold (drawn to Arial Bold's exact widths). X-JE-Font-* response headers report what actually rendered."}, 'top_text': {'type': 'string', 'x-ui': {'draw': {'of': 'captions', 'role': 'caption_top'}, 'unset_label': 'None, as long as the bottom caption is set'}, 'description': 'Top caption. At least ONE of top_text/bottom_text must be non-empty or the request is rejected.'}, 'font_size': {'type': 'string', 'x-ui': {'draw': {'of': 'captions', 'auto': {'max': 150, 'min': 20, 'per': 10}, 'role': 'size', 'accept': {'max': 200, 'min': 10}, 'measure': 'caption-px'}}, 'default': 'auto', 'description': 'Caption size in pixels, or the word auto to size it from the picture (a tenth of its height, kept between 20 and 150). A number outside 10 to 200 is treated as auto.'}, 'font_color': {'type': 'string', 'x-ui': {'draw': {'of': 'captions', 'role': 'color'}}, 'default': '#ffffff', 'description': 'Caption fill — #rrggbb or #rrggbbaa hex only; invalid values silently revert to #ffffff.'}, 'bottom_text': {'type': 'string', 'x-ui': {'draw': {'of': 'captions', 'role': 'caption_bottom'}, 'unset_label': 'None, as long as the top caption is set'}, 'description': 'Bottom caption.'}, 'stroke_color': {'type': 'string', 'x-ui': {'draw': {'of': 'captions', 'role': 'outline_color'}}, 'default': '#000000', 'description': 'Caption outline hex; invalid values silently revert to #000000. Drawn at 2x stroke_width beneath the fill.'}, 'stroke_width': {'type': 'integer', 'x-ui': {'draw': {'of': 'captions', 'role': 'outline_width'}}, 'default': 3, 'maximum': 8, 'minimum': 1, 'description': 'Outline stroke width, 1-8.'}, 'output_format': {'enum': ['jpg', 'png', 'webp'], 'type': 'string', 'x-ui': {'unset_label': 'Keeps input format'}, 'description': "Defaults to the input image's format."}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'JPG, PNG, WebP, BMP, TIFF (max 25MB)'}, 'mode': {'enum': ['auto', 'median', 'despeckle', 'gaussian', 'luminance', 'nlmeans', 'dctdnoiz', 'smart'], 'type': 'string', 'x-ui': {'labels': {'auto': 'Balanced', 'smart': 'Let the tool decide', 'median': 'Speckle removal', 'nlmeans': 'Best quality (slow)', 'dctdnoiz': 'Best for JPEG blockiness (slow)', 'gaussian': 'Soft blur', 'despeckle': 'Gentle speckle removal', 'luminance': 'Keep colour, smooth brightness'}}, 'default': 'auto', 'description': 'Denoise algorithm.'}, 'sharpen': {'enum': ['none', 'light', 'medium'], 'type': 'string', 'default': 'none', 'description': 'Optional post-denoise sharpening.', 'x-show-when': {'mode': ['auto', 'median', 'despeckle', 'gaussian', 'luminance', 'nlmeans', 'dctdnoiz']}}, 'strength': {'enum': ['1', '2', '3', '4'], 'type': 'string', 'x-ui': {'labels': {'1': 'Light', '2': 'Medium', '3': 'Strong', '4': 'Maximum'}}, 'default': '2', 'description': "STRING enum '1'-'4', not an int. Invalid values silently become '2'. Ignored when mode=smart — the analyzer overrides it.", 'x-show-when': {'mode': ['auto', 'median', 'despeckle', 'gaussian', 'luminance', 'nlmeans', 'dctdnoiz']}}, 'output_format': {'enum': ['jpg', 'png', 'webp', 'bmp', 'tiff'], 'type': 'string', 'x-ui': {'unset_label': 'Keeps input format'}, 'description': 'Optional output format; defaults to the input format.'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'JPG, PNG, WebP, GIF, BMP, TIFF, AVIF, HEIC or HEIF. Output keeps the input format, except that a HEIC or HEIF photo comes back as a JPG.'}, 'mode': {'enum': ['dimensions', 'percentage', 'width', 'height', 'max', 'canvas'], 'type': 'string', 'x-ui': {'labels': {'max': 'Fit inside a box (never enlarge)', 'width': 'Fit to a width', 'canvas': 'Pad to an exact canvas', 'height': 'Fit to a height', 'dimensions': 'Exact width and height', 'percentage': 'Scale by percent'}}, 'default': 'dimensions', 'description': "'max' fits within width×width and never upscales; 'canvas' resizes then pads to exact WxH with bg_color; 'percentage' scales by %."}, 'width': {'type': 'integer', 'x-ui': {'unit': 'px', 'pair_with': 'height', 'pair_label': 'Size'}, 'maximum': 20000, 'minimum': 1, 'description': "Target width in pixels. In 'Fit inside a box' mode this is the longest side the picture may reach.", 'x-show-when': {'mode': ['dimensions', 'width', 'max', 'canvas']}}, 'height': {'type': 'integer', 'x-ui': {'unit': 'px'}, 'maximum': 20000, 'minimum': 1, 'description': 'Target height px.', 'x-show-when': {'mode': ['dimensions', 'height', 'canvas']}}, 'bg_color': {'type': 'string', 'default': 'white', 'description': 'Colour of the padding added around the picture when it does not fill the canvas.', 'x-show-when': {'mode': ['canvas']}}, 'percentage': {'type': 'integer', 'x-ui': {'unit': '%'}, 'maximum': 1000, 'minimum': 1, 'description': 'Scale to this percent of the original size.', 'x-show-when': {'mode': ['percentage']}}, 'strip_meta': {'type': 'boolean', 'default': True, 'description': 'Strip EXIF metadata from the output.'}, 'force_exact': {'type': 'boolean', 'default': False, 'description': 'Force exact dimensions, ignoring aspect ratio.', 'x-show-when': {'mode': ['dimensions']}}, 'maintain_ratio': {'type': 'boolean', 'default': True, 'description': "Keep aspect ratio (dimensions mode). Field name is 'maintain_ratio' — not 'maintain_aspect'.", 'x-show-when': {'mode': ['dimensions']}}}}
输入模式
{'type': 'object', 'x-draw': {'corners': {'noun': 'corners', 'shape': 'corners', 'title': 'The corners'}}, 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'JPG, PNG, WebP, GIF, BMP, TIFF or AVIF. Max 25 MB. HEIC is refused — run it through the Format Converter first. Whatever arrives, a PNG comes back.'}, 'radius': {'type': 'integer', 'x-ui': {'draw': {'of': 'corners', 'role': 'radius'}, 'unit_from': {'param': 'radius_unit', 'by_value': {'px': {'unit': 'px', 'maximum': 5000}, 'percent': {'unit': '%', 'maximum': 50}}}}, 'title': 'Corner radius', 'default': 20, 'maximum': 5000, 'minimum': 0, 'description': 'How far the curve reaches in from each corner. Measured in whichever unit the next setting says: PIXELS, up to 5000 — or PERCENT of the shorter side, where anything above 50 is treated as 50, because half the shorter side is a full semicircle and there is nothing beyond it. Out-of-range values are pulled back rather than refused. Fractions are rounded.'}, 'corners': {'type': 'string', 'x-ui': {'draw': {'of': 'corners', 'role': 'which'}}, 'title': 'Which corners', 'default': 'all', 'description': "'all', or a comma-separated list of tl, tr, br, bl (top-left, top-right, bottom-right, bottom-left). An edge word — top, bottom, left or right — selects that edge's two corners."}, 'background': {'type': 'string', 'x-ui': {'draw': {'of': 'corners', 'role': 'fill', 'names': {'red': [255, 0, 0], 'tan': [210, 180, 140], 'aqua': [0, 255, 255], 'blue': [0, 0, 255], 'cyan': [0, 255, 255], 'gold': [255, 215, 0], 'gray': [128, 128, 128], 'grey': [128, 128, 128], 'lime': [0, 255, 0], 'navy': [0, 0, 128], 'pink': [255, 192, 203], 'teal': [0, 128, 128], 'beige': [245, 245, 220], 'black': [0, 0, 0], 'brown': [165, 42, 42], 'green': [0, 128, 0], 'ivory': [255, 255, 240], 'khaki': [240, 230, 140], 'olive': [128, 128, 0], 'white': [255, 255, 255], 'indigo': [75, 0, 130], 'maroon': [128, 0, 0], 'orange': [255, 165, 0], 'purple': [128, 0, 128], 'salmon': [250, 128, 114], 'silver': [192, 192, 192], 'violet': [238, 130, 238], 'yellow': [255, 255, 0], 'crimson': [220, 20, 60], 'fuchsia': [255, 0, 255], 'magenta': [255, 0, 255], 'lavender': [230, 230, 250], 'turquoise': [64, 224, 208]}}}, 'title': 'Behind the corners', 'default': 'transparent', 'description': "What fills the corners that were rounded off: 'transparent' (the default; 'none' means the same) leaves them see-through. Anything else fills them with a colour: a hex value (#rgb, #rgba, #rrggbb or #rrggbbaa, such as #1a1a1a) or any of the named colours Add Border accepts (red, navy, gold and others; not case-sensitive). Any other name is refused with a 400 that lists every accepted name."}, 'radius_unit': {'enum': ['px', 'percent'], 'type': 'string', 'x-ui': {'draw': {'of': 'corners', 'role': 'radius_unit'}, 'labels': {'px': 'Pixels', 'percent': 'Percent of the shorter side'}}, 'title': 'Radius measured in', 'default': 'px', 'description': "Whether the radius above is a number of pixels or a percentage of the picture's shorter side. Percent is the one to pick when the step runs on pictures of different sizes."}}}
输入模式
{'type': 'object', 'x-draw': {'shadow': {'noun': 'shadow', 'shape': 'shadow', 'title': 'The shadow'}}, 'required': ['file'], 'properties': {'blur': {'type': 'integer', 'x-ui': {'draw': {'of': 'shadow', 'role': 'blur'}, 'unit': 'px'}, 'default': 10, 'maximum': 100, 'minimum': 0, 'description': 'Shadow edge softness in px. 0 = hard-edged rectangle of a shadow.'}, 'file': {'type': 'string', 'format': 'binary', 'description': 'Image to shadow — JPG, PNG, or WebP only (max 25 MB). BMP is NOT accepted here, unlike most photo tools.'}, 'angle': {'type': 'number', 'x-ui': {'draw': {'of': 'shadow', 'role': 'angle'}, 'unit': 'deg'}, 'default': 45, 'maximum': 360, 'minimum': -360, 'description': 'Which way the shadow falls, in degrees clockwise from the right: 0 moves it right, 90 down, 180 left, 270 up. The default 45 puts it down and to the right, as if lit from the top left.'}, 'opacity': {'type': 'integer', 'x-ui': {'draw': {'of': 'shadow', 'max': 100, 'role': 'opacity'}, 'unit': '%'}, 'default': 70, 'maximum': 100, 'minimum': 0, 'description': 'Shadow darkness 0-100. Affects the shadow layer only, never the image itself.'}, 'distance': {'type': 'integer', 'x-ui': {'draw': {'of': 'shadow', 'role': 'distance'}, 'unit': 'px'}, 'default': 15, 'maximum': 200, 'minimum': 0, 'description': 'Shadow offset in px.'}, 'shadow_color': {'type': 'string', 'x-ui': {'draw': {'of': 'shadow', 'role': 'color', 'names': {'red': [255, 0, 0], 'tan': [210, 180, 140], 'aqua': [0, 255, 255], 'blue': [0, 0, 255], 'cyan': [0, 255, 255], 'gold': [255, 215, 0], 'gray': [128, 128, 128], 'grey': [128, 128, 128], 'lime': [0, 255, 0], 'navy': [0, 0, 128], 'pink': [255, 192, 203], 'teal': [0, 128, 128], 'beige': [245, 245, 220], 'black': [0, 0, 0], 'brown': [165, 42, 42], 'green': [0, 128, 0], 'ivory': [255, 255, 240], 'khaki': [240, 230, 140], 'olive': [128, 128, 0], 'white': [255, 255, 255], 'indigo': [75, 0, 130], 'maroon': [128, 0, 0], 'orange': [255, 165, 0], 'purple': [128, 0, 128], 'salmon': [250, 128, 114], 'silver': [192, 192, 192], 'violet': [238, 130, 238], 'yellow': [255, 255, 0], 'crimson': [220, 20, 60], 'fuchsia': [255, 0, 255], 'magenta': [255, 0, 255], 'lavender': [230, 230, 250], 'turquoise': [64, 224, 208]}}}, 'default': '#000000', 'description': "Hex shadow color. Field name is 'shadow_color' — not 'color'."}, 'output_format': {'enum': ['png', 'jpg', 'webp'], 'type': 'string', 'x-ui': {'draw': {'of': 'shadow', 'role': 'format', 'see_through': ['png']}, 'unset_label': 'Keeps input format'}, 'description': 'Leave blank to keep the format it came in as. Only PNG keeps the area around the shadow see-through; JPG and WebP are flattened onto white.'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'dpi': {'enum': ['72', '96', '144', '300'], 'type': 'string', 'default': '96', 'description': "String, not a number — only '72', '96', '144', '300'; anything else silently becomes '96'."}, 'file': {'type': 'string', 'format': 'binary', 'description': 'SVG file (max 25MB)'}, 'width': {'type': 'integer', 'x-ui': {'unit': 'px', 'pair_with': 'height', 'pair_label': 'Size'}, 'default': 0, 'maximum': 8000, 'minimum': 0, 'description': "Output width in px. 0 (default) = render at the SVG's intrinsic size."}, 'height': {'type': 'integer', 'x-ui': {'unit': 'px'}, 'default': 0, 'maximum': 8000, 'minimum': 0, 'description': 'Output height in px. 0 = intrinsic.'}, 'bg_color': {'type': 'string', 'default': 'transparent', 'description': "'transparent', 'white', or a hex color."}, 'output_format': {'enum': ['png', 'jpg', 'webp'], 'type': 'string', 'default': 'png', 'description': 'jpg cannot hold transparency: without an explicit bg_color the artwork is flattened onto white, never black.'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'JPG, PNG, WebP, BMP, TIFF (max 15MB)'}, 'output': {'enum': ['json', 'text'], 'type': 'string', 'default': 'json', 'description': 'json returns structured results; text returns plain text.'}, 'binarize': {'type': 'boolean', 'title': 'Force black and white', 'default': False, 'description': 'Force the picture to pure black and white before reading it. Off by default because it destroys text in uneven light; try it on faint or washed-out scans.'}, 'languages': {'type': 'string', 'default': 'en', 'description': "Which language or languages the writing is in. One code, or several separated by commas (en,fr); a plus sign works too, as Tesseract writes it (eng+fra). Two-letter codes are the usual form: en, fr, de, es, pt, it, nl, ru, ar, zh, ja, ko. Tesseract's own codes (eng, fra, deu, chi_sim, chi_tra, ...) are also accepted; each of the two reading engines is handed its own spelling of the language. A language whose reading pack is not installed on our server is refused with a message that says so, rather than reported as an engine fault. Letters and underscores only, not case-sensitive; a value with no code in it, such as a lone comma, is refused with a 400. Field name is languages, not language."}, 'preprocess': {'type': 'boolean', 'default': True, 'description': 'Apply image preprocessing before OCR.'}, 'binarize_threshold': {'type': 'integer', 'x-ui': {'unit': '%'}, 'default': 60, 'maximum': 99, 'minimum': 1, 'description': 'The cut-off between black and white, as a percent. Lower keeps more of the picture black. Only used when black and white is forced on; anything outside 1-99 quietly reverts to 60.', 'x-show-when': {'binarize': ['true']}}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Hard 10 MB cap (400 above it). JPG/PNG/WebP/BMP only — no GIF/HEIC. Big images risk the 120s upscale timeout.'}, 'model': {'enum': ['fast', 'quality'], 'type': 'string', 'x-ui': {'labels': {'fast': 'Fast — about 15 seconds', 'quality': 'Best detail — up to 4 minutes'}}, 'default': 'fast', 'description': 'fast (default) — ~16s at any scale, softer on very fine texture. quality — best fine detail but 50s at 2x and 245s at 4x on CPU; expect a wait.'}, 'scale': {'enum': [2, 4], 'type': 'integer', 'default': 2, 'description': 'Upscale factor; invalid values silently fall back to 2. With the default fast model 4x costs the same as 2x.'}, 'face_enhance': {'type': 'boolean', 'default': False, 'description': 'Run the additional face-enhancement pass.'}, 'output_format': {'enum': ['jpg', 'png', 'webp'], 'type': 'string', 'x-ui': {'unset_label': 'Keeps input format'}, 'description': 'Optional output format; defaults to the input format.'}}}
输入模式
{'type': 'object', 'x-draw': {'mark': {'noun': 'watermark', 'shape': 'stamp', 'title': 'Watermark on the photo'}}, 'required': ['file', 'text'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'JPG, PNG, WebP, GIF, BMP, HEIC, TIFF. Max 25 MB. Output keeps the input format, except that a HEIC or HEIF photo comes back as a JPG.'}, 'text': {'type': 'string', 'x-ui': {'draw': {'of': 'mark', 'face': 'noto-sans-condensed', 'role': 'text'}}, 'description': "The words stamped onto the photo. Required; there is no default. A leading '@' is removed."}, 'color': {'type': 'string', 'x-ui': {'draw': {'of': 'mark', 'role': 'color', 'names': {'red': [220, 38, 38], 'blue': [37, 99, 235], 'cyan': [6, 182, 212], 'gray': [128, 128, 128], 'grey': [128, 128, 128], 'pink': [236, 72, 153], 'black': [0, 0, 0], 'brown': [120, 63, 4], 'green': [22, 163, 74], 'white': [255, 255, 255], 'orange': [234, 88, 12], 'purple': [147, 51, 234], 'yellow': [250, 204, 21], 'magenta': [192, 38, 211]}}}, 'title': 'Watermark colour', 'default': '#ffffff', 'description': 'A hex colour, or one of white, black, gray, grey, red, orange, yellow, green, blue, cyan, magenta, purple, pink, brown. Anything else falls back to white.'}, 'opacity': {'type': 'integer', 'x-ui': {'draw': {'of': 'mark', 'max': 100, 'role': 'opacity', 'leading_number': True}, 'unit': '%'}, 'default': 50, 'maximum': 100, 'minimum': 0, 'description': 'INTEGER percent 0-100 — a fraction like 0.5 parses as 0 (invisible watermark).'}, 'position': {'enum': ['NorthWest', 'North', 'NorthEast', 'West', 'Center', 'East', 'SouthWest', 'South', 'SouthEast'], 'type': 'string', 'x-ui': {'draw': {'of': 'mark', 'role': 'anchor', 'cells': {'East': 'mr', 'West': 'ml', 'North': 'tc', 'South': 'bc', 'Center': 'mc', 'NorthEast': 'tr', 'NorthWest': 'tl', 'SouthEast': 'br', 'SouthWest': 'bl'}}, 'labels': {'East': 'Middle right', 'West': 'Middle left', 'North': 'Top centre', 'South': 'Bottom centre', 'Center': 'Middle centre', 'NorthEast': 'Top right', 'NorthWest': 'Top left', 'SouthEast': 'Bottom right', 'SouthWest': 'Bottom left'}}, 'default': 'SouthEast', 'description': "Case-sensitive ImageMagick gravity name — 'center' (lowercase) or 'top-left' are NOT recognized and silently fall back to SouthEast."}, 'font_size': {'type': 'integer', 'x-ui': {'draw': {'of': 'mark', 'role': 'size', 'measure': 'font-px', 'out_of_range': 'default', 'leading_number': True}, 'unit': 'px'}, 'default': 36, 'maximum': 500, 'minimum': 6, 'description': 'How big the lettering is, measured in PIXELS of the photo rather than points on a page: the words are drawn straight onto the bitmap, so the same number gives the same size here, on the Signature Generator and on PDF to Images. Out-of-range values (<6 or >500) silently reset to 36 — no error returned.'}, 'stroke_color': {'type': 'string', 'x-ui': {'draw': {'of': 'mark', 'role': 'outline_color', 'names': {'red': [220, 38, 38], 'blue': [37, 99, 235], 'cyan': [6, 182, 212], 'gray': [128, 128, 128], 'grey': [128, 128, 128], 'pink': [236, 72, 153], 'black': [0, 0, 0], 'brown': [120, 63, 4], 'green': [22, 163, 74], 'white': [255, 255, 255], 'orange': [234, 88, 12], 'purple': [147, 51, 234], 'yellow': [250, 204, 21], 'magenta': [192, 38, 211]}, 'light_luma': 140}, 'unset_label': 'Picked to stand out from the text'}, 'title': 'Outline colour', 'description': 'The outline behind the text, which is what keeps a watermark readable over a white dress or a black suit. Leave it unset and it is picked for you - black behind a light colour, white behind a dark one. Same colour names as above.'}, 'stroke_width': {'type': 'string', 'x-ui': {'draw': {'of': 'mark', 'max': 20, 'auto': {'max': 8, 'min': 1, 'per': 18}, 'role': 'outline_width', 'leading_number': True}}, 'title': 'Outline thickness', 'default': 'auto', 'description': 'How thick the outline behind the text is. Leave it on auto and it scales with the text size. 0 turns the outline off; otherwise a whole number up to 20 - anything larger is treated as 20.'}}}
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': "Max 500 MB. The multipart part's Content-Type becomes the download's MIME — omit it and the file serves as octet-stream."}, 'filename': {'type': 'string', 'x-ui': {'unset_label': "Keeps the file's own name"}, 'description': 'Optional download name. Falls back to the multipart filename.'}}, 'x-passes-no-file': True}
输入模式
{'type': 'object', 'required': ['url'], 'properties': {'url': {'type': 'string', 'description': 'http(s) URL containing the table'}, 'output': {'enum': ['json', 'csv'], 'type': 'string', 'default': 'json', 'description': 'How the table comes back: JSON gives rows you can feed to the next step, CSV gives one block of comma-separated text. Either way it is data, not a downloadable file.'}, 'timeout_ms': {'type': 'integer', 'x-ui': {'unit': 'ms'}, 'default': 30000, 'maximum': 60000, 'minimum': 1000, 'description': 'How long to wait for the page before giving up, in milliseconds (30000 = 30 seconds).'}, 'user_agent': {'type': 'string', 'description': 'Advanced: how we introduce ourselves to the site. Left blank we identify as JohnsEssentialsBot.'}, 'table_index': {'type': 'integer', 'default': 0, 'maximum': 50, 'minimum': 0, 'description': 'Which table on the page, counting from 0 for the first one. If the page has fewer tables than this, the error tells you how many it found.'}, 'acknowledge_robots': {'type': 'boolean', 'default': False, 'description': "Business plan: read the table even when the site's robots.txt asks bots to stay away. On any other plan this switch does nothing and the page is still refused."}}}
输入模式
{'type': 'object', 'required': ['url'], 'properties': {'url': {'type': 'string', 'description': 'http(s) URL to fetch'}, 'timeout_ms': {'type': 'integer', 'x-ui': {'unit': 'ms'}, 'default': 30000, 'maximum': 60000, 'minimum': 1000, 'description': 'How long to wait for the page before giving up, in milliseconds (30000 = 30 seconds).'}, 'user_agent': {'type': 'string', 'description': 'What to tell the site we are. Leave blank and we identify honestly as JohnsEssentialsBot/1.0.'}, 'acknowledge_robots': {'type': 'boolean', 'default': False, 'description': "Business plan only: fetch the page even when the site's rules file (robots.txt) asks crawlers to stay away. On other plans this switch has no effect."}}}
输入模式
{'type': 'object', 'required': ['url'], 'properties': {'url': {'type': 'string', 'description': 'http(s) URL to scrape'}, 'mode': {'enum': ['readability', 'selectors'], 'type': 'string', 'default': 'readability', 'description': "Readability gives you the page's main article as clean text. Selectors gives you only the specific bits you name below."}, 'selectors': {'type': 'object', 'description': 'One CSS selector per thing you want, named: {"headline": "h1", "price": ".price"}. Needed only when you pick Selectors above.', 'x-show-when': {'mode': ['selectors']}}, 'timeout_ms': {'type': 'integer', 'x-ui': {'unit': 'ms'}, 'default': 30000, 'maximum': 60000, 'minimum': 1000, 'description': 'How long to wait for the page before giving up, in milliseconds (30000 = 30 seconds).'}, 'user_agent': {'type': 'string', 'description': 'Advanced: how we introduce ourselves to the site. Left blank we identify as JohnsEssentialsBot.'}, 'acknowledge_robots': {'type': 'boolean', 'default': False, 'description': "Business plan: scrape the page even when the site's robots.txt asks bots to stay away. On any other plan this switch does nothing and the page is still refused."}}}
近期工具变更
类似的 MCP 服务器
HelpySelf
Provides utilities for PDF and image conversion, compression, redaction, scanning, encoding, calculations, accessibility checks, …
JustBlogged
Manages JustBlogged sites, posts, pages, collections, redirects, themes, revisions, and content review workflows.
Postlyra
Creates, edits, previews, schedules, and publishes rich media posts to Telegram channels and groups.
convertfilefast
Converts and manipulates documents, images, PDFs, and data files, including compression, extraction, merging, splitting, rotation…
flask
Uploads and organizes videos and supports timestamped comments, recordings, annotations, review threads, and feedback analytics.
convert-pdf-to-word-docx
Uploads and inspects PDFs, extracts text, and performs page operations such as merging, splitting, rotating, stamping, and reorde…
split-pdf
Offline tools for uploading, inspecting, extracting, merging, splitting, rotating, reordering, stamping and managing PDF files.
Notipo
Creates, edits, synchronizes, publishes, and manages Markdown blog posts across Notion and WordPress, including images, SEO metad…