MCP 服务器

John's Essentials

com.johnsessentials/johns-essentials
媒体与内容 生产力 公开且可连接 MCP 2026-07-28

此 MCP 可以做什么

Analyzes and converts documents, images, audio, video, archives, data files, and other media formats, with PDF chat and file inspection utilities.

analyze_audio
Audio Analyzer — Analyse an audio file: duration, sample rate, bit rate, channels, codec, waveform data. [category: analyze]
只读
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (MP3, WAV, AAC, OGG, FLAC, M4A, WMA, OPUS or AIFF)'}}}
analyze_color_palette
Color Palette Extractor — Extract the dominant colour palette from an image. [category: analyze]
只读
输入模式
{'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.'}}}
analyze_csv
CSV Analyzer — Analyse a CSV file: row/column count, data types, null counts, min/max/mean per column. [category: analyze]
只读
输入模式
{'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.'}}}
analyze_duplicate_detector
Duplicate Detector — Identify duplicate or near-duplicate files in a batch upload using perceptual hashing. [category: analyze]
只读
输入模式
{'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.'}}}
analyze_encoding_detector
Encoding Detector — Detect the character encoding of a text or HTML file. Use when accented letters, apostrophes or quotation marks arrive as garbled symbols: it identifies which character set the file was saved in (UTF-8, Windows-1252, ISO-8859-1, UTF-16 and so on). It REPORTS the encoding only — it does not convert or rewrite the file. [category: analyze]
只读
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (TXT, HTML, CSV, XML)'}}}
analyze_file
File Analyzer — Analyse a file and return type, encoding, size, MIME type, magic bytes, and structure summary. [category: analyze]
只读
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (any)'}}}
analyze_file_diff
File Diff — Show a line-by-line diff between two text files (file_a + file_b) or two pasted texts (text_a + text_b). Provide one complete pair. [category: analyze]
只读
输入模式
{'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']]}
analyze_font_detector
Font Detector — Detect fonts used in a PDF or DOCX document. Images are not supported. [category: analyze]
只读
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (PDF, DOCX)'}}}
analyze_grammar_check
Grammar Checker — Hybrid LanguageTool + Grok grammar checker with rule citations, style-guide awareness (APA/MLA/Chicago/AP/IEEE), dialect enforcement (US/UK/CA/AU), and per-issue severity. [category: analyze]
只读
输入模式
{'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.'}}}
analyze_hash
Hash Generator (File) — Compute MD5, SHA-1, SHA-256, and SHA-512 hashes of an uploaded file. [category: analyze]
只读
输入模式
{'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']]}
analyze_image_quality
Image Quality Analyzer — Measure sharpness, noise level, compression artefacts, and BRISQUE quality score of an image. [category: analyze]
只读
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (JPG, PNG, WebP)'}}}
analyze_image_similarity
Image Similarity — Compute a perceptual similarity score between two images (pHash distance). Takes two separately-named uploads: 'file_a' and 'file_b'. [category: analyze]
只读
输入模式
{'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'}}}
analyze_json_xml_validator
JSON/XML Validator — Check that text is valid JSON or XML and tidy its layout. It answers valid true or false, and a document that is not valid is still an answer, not a failed step, so the steps after it run either way. To stop a workflow on a bad document, add an If/Else step that checks {{step_N.valid}} equals true, where N is this step's number. Then, on each step that should run only for a valid document, set Run when to true and add the If/Else step's number to its Depends On. This step passes no file on, so a step after it that needs the document must take its file from the step before this one. [category: analyze]
输入模式
{'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']]}
analyze_link_extractor
Link Extractor — Extract all hyperlinks from a PDF or HTML file, or from pasted text. Other file types are scanned as raw text. [category: analyze]
只读
输入模式
{'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']]}
analyze_metadata
Metadata Viewer — Extract and display all metadata from a file (EXIF, PDF info, document properties, audio tags). [category: analyze]
只读
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (any)'}}}
analyze_pdf_inspector
PDF Inspector — Deep inspection of a PDF: page count, fonts used, annotations, form fields, embedded files. [category: analyze]
只读
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (PDF)'}}}
analyze_readability
Readability Scorer — Calculate Flesch Reading Ease and Flesch-Kincaid Grade Level for a text. [category: analyze]
只读
输入模式
{'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']]}
analyze_ssl
SSL Checker — Check an SSL certificate for a hostname: expiry, issuer, validity, cipher suite. [category: analyze]
只读 可访问外部资源
输入模式
{'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.'}}}
analyze_video
Video Inspector — Inspect a video: duration, resolution, frame rate, codec, audio tracks, bitrate. [category: analyze]
只读
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (MP4, MOV, AVI, MKV, WebM, WMV, FLV, 3GP or MPG)'}}}
analyze_word_count
Word Counter — Count words, characters, sentences, paragraphs, and reading time in a text or uploaded document (.txt/.pdf/.docx). [category: analyze]
只读
输入模式
{'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']]}
analyze_word_frequency
Word Frequency Analyzer — Analyse word frequency distribution in a text or document file. [category: analyze]
只读
输入模式
{'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']]}
chatwithyourpdf
Chat With Your PDF — Read the text of the user's document — PDFs first and foremost, plus TXT/CSV/Markdown/JSON — so you can chat about it: answer questions, summarize it, or use facts from it in later steps. Business plan only. Returns up to max_chars characters. For Word files: convert with word_to_pdf first, then chat with the PDF. [category: content] [requires the business plan]
只读
输入模式
{'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.'}}}
convert_archive
Archive Converter — Convert between archive formats. Input: ZIP, RAR, 7Z, GZ/TAR.GZ, TAR.BZ2, TAR.XZ, TAR, CAB, ISO — recognized by filename extension or file signature, so misnamed uploads work. Output: ZIP, TAR, TAR.GZ, TAR.BZ2, TAR.XZ, 7Z. [category: convert]
输入模式
{'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)'}}}
convert_batch
Batch Converter — Convert many files in one request and download a ZIP of the results. Auto-target rules pick a sensible output format per file (docx→pdf, heic→jpg, mov→mp4, etc.) or specify a global target like 'pdf' or a per-extension override map. Free tier supports up to 5 files; Business tier up to 50. [category: convert]
输入模式
{'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.'}}}
convert_chain
Conversion Chain — Run a 1-5 step conversion pipeline in one job, e.g. docx → pdf → epub. Each step's engine is auto-picked from the conversion graph. Input format comes from the 'from' field when given, else magic-byte detection — ALWAYS pass 'from' for text-based inputs (csv, md, html, json): they have no magic bytes and detect as plain txt. Business tier only. [category: convert] [requires the business plan]
输入模式
{'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"}].'}}}
convert_contact
Contact Converter — Convert contact/calendar/email formats: vCard↔CSV, vCard→XLSX (vcf to excel), ICS→JSON/CSV, MSG→EML, EML→PDF. [category: convert]
输入模式
{'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.'}}}
convert_data
Data Converter — Convert a data file between formats (JSON, NDJSON/JSONL, CSV, TSV, XML, YAML, TOML, INI). Upload the data file and pick a target format; the result comes back as a downloadable file (so it chains in workflows). Inline text is also accepted via a JSON-body 'input' string instead of a file. [category: convert]
输入模式
{'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."}}}
convert_document
Document Converter — Office & document converter — DOCX/DOC/ODT/RTF/XLSX/XLS/ODS/CSV/PPTX/PPT/ODP/HTML/EPUB/TXT → PDF plus office round-trips (csv→xlsx, docx→odt, epub→pdf) via LibreOffice; MARKDOWN → pdf/docx/html/epub/txt via pandoc with real GFM semantics (headings, lists, tables, code fences); and DOCX/HTML/PDF → MARKDOWN (the LLM-ingestion direction — turn a document into clean GFM an agent can read; PDF via text-layer extraction); plus Jupyter notebooks (.ipynb) → pdf/html/docx/md via pandoc. Pass 'from' so the converter knows the source format. For images/audio/video use convert_file; for data-text transforms use convert_data. Capability envelope: a PDF source extracts to text/markdown only (to=md) — for editable output from a PDF use pdf_to_word / pdf_to_excel / pdf_to_text / pdf_to_images. Office conversions are same-category only (Word↔Word, Sheet↔Sheet, Slides↔Slides) plus any→pdf; cross-category conversions (e.g. Word→slides, Sheet→Word) are not supported. [category: convert]
输入模式
{'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.'}}}
convert_ebook
eBook Converter — Convert ebooks between formats with calibre: mobi, azw3, fb2, lit and pdf → EPUB, plus epub → mobi/azw3 for older devices. EPUB is the format modern Kindles accept for send-to-device, so →epub is the recommended direction. DRM-protected books cannot be converted. pdf→epub reflows fixed pages, so quality varies with layout complexity; epub→pdf is handled by convert_document (LibreOffice). [category: convert]
输入模式
{'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.'}}}
convert_file
Universal File Converter — Convert a file between formats: image↔image (jpg/png/webp/bmp/tiff/gif/avif/ico, plus heic/svg/psd as inputs), audio↔audio (mp3/wav/ogg/opus/flac/aac/m4a/wma/aiff, plus alac=Apple Lossless delivered as .m4a), video↔video/GIF (Business gate on some edges) plus legacy flv/wmv/3gp/mpg/vob/ts/m2ts → mp4, extract audio from video (mp4/mov/mkv/webm/avi → mp3/wav/aac/m4a/ogg/flac/opus/aiff/alac), subtitles (srt↔vtt, and srt/vtt→txt), DOC/DOCX/TXT→PDF, image→PDF, comic archive CBZ→PDF. Office/document conversions (xlsx, pptx, csv→xlsx, epub, html) live in convert_document; archives in convert_archive; data formats in convert_data. [category: convert]
输入模式
{'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']}}}}
convert_geo
GPS & Map Converter — Convert between GPX, KML, KMZ and GeoJSON — the GPS-track and mapping formats used by Garmin, Strava, Google Earth and every GIS tool. Track segments, per-point timestamps, elevations and polygon holes all survive the trip. Anything that cannot survive (a polygon becoming a GPX track, an unlocated feature) is reported in the X-Conversion-Notes header rather than dropped quietly; pass strict=true to refuse instead. [category: convert]
输入模式
{'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.'}}}
convert_jpg_to_pdf
JPG to PDF — Convert one or more JPG/PNG images to a PDF document. [category: convert]
输入模式
{'type': 'object', 'required': ['files'], 'properties': {'files': {'type': 'array', 'items': {'type': 'string', 'format': 'binary'}, 'description': 'Input files (JPG, PNG)'}}}
convert_parquet
Parquet Converter — Convert Apache Parquet to CSV, TSV, JSON, NDJSON or Excel — and back. Types are preserved in both directions: numbers stay numbers in JSON, blank cells become real nulls in Parquet, and identifier columns like '01924' stay text instead of losing their leading zero. Flat schemas only; nested or repeated columns are reported rather than silently flattened. [category: convert]
输入模式
{'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']}}}}
convert_sqlite
SQLite Converter — Export a SQLite database (.db/.sqlite) to CSV, JSON or Excel. A database holds many tables, so the output adapts: CSV gives one file per table (zipped when there are several), JSON gives rows as objects (keyed by table when there are several), and Excel gives ONE workbook with one worksheet per table. Pass an optional 'table' to export just one. [category: convert]
输入模式
{'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.'}}}
convert_text
Text Converter — Convert text/data formats: Markdown↔HTML, CSV↔JSON, JSON↔XML/YAML, Base64 and URL encode/decode. Takes 'text' + 'from' + 'to' — there is no 'conversion_type' field. [category: convert]
输入模式
{'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'."}}}
convert_unit_convert
Unit Converter — Convert between units of measurement: length, weight, temperature, volume, area, speed, time, and data sizes. [category: convert]
输入模式
{'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.'}}}
convert_url_to_pdf
Webpage to PDF — Convert a live web page (URL) to PDF. Fetches the page and every asset server-side through an SSRF-guarded fetcher, inlines them, and renders offline — pass a JSON-body 'url'. JavaScript is NOT executed (static rendering), so SPAs may render sparsely. [category: convert]
可访问外部资源
输入模式
{'type': 'object', 'required': ['url'], 'properties': {'url': {'type': 'string', 'description': 'The http(s) URL of the web page to render to PDF.'}}}
convert_video
Video Converter — Convert a video so it PLAYS or IMPORTS where it currently will not: a camera, phone or camcorder recording that your editing software, media player, website or social platform refuses to accept, open or upload. Converts between mp4, mov, webm, mkv, avi, and animated GIF with codec/resolution/bitrate control and TikTok/Reels/Shorts/Twitter/WhatsApp presets. Also converts legacy formats (flv, wmv, 3gp, mpg, vob, ts, m2ts) to mp4. Free tier covers mp4/mov/webm at ≤720p; mkv, avi, gif, 1080p+ and AV1 require Business. [category: convert]
输入模式
{'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']}}}}
convert_word_to_pdf
Word to PDF — Convert a Word document (.docx, .doc) to PDF using LibreOffice. [category: convert]
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (DOCX, DOC)'}}}
data_to_file
Save as File — Write the result of an earlier step to a real, downloadable file: .txt, .csv, .json or .md. Use after any step that produces text or data rather than a file — Color Palette Extractor, Password Generator, Photo to Text (OCR), EXIF Viewer, Scrape Page, Word Frequency, Describe Image, PDF to Text — so the result can be downloaded, emailed, zipped or converted. A list of values saved as CSV becomes a spreadsheet with a header row. [category: utility]
输入模式
{'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.'}}}
describe_image
Describe Image — Look at an image with a vision model and answer a question about it — what it shows, whether it's blurry or usable, visible text, etc. Business plan only. [category: content] [requires the business plan]
只读
输入模式
{'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.'}}}
drive_upload
Save to Google Drive — Save a finished file into the signed-in user's own Google Drive. Use as the last step of a workflow when the user asks for the result to be put in, saved to, or uploaded to their Drive. Needs their Google account to be connected on the Integrations page. Only ever writes: it cannot read, list or search anything already in their Drive. [category: utility] [requires the starter plan]
可访问外部资源
输入模式
{'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}
email_file
Email My File — Email a finished file to the user themselves, with the file attached. It goes to the Google account they connected, so it appears in both their Sent folder and their inbox. The recipient is ALWAYS the current user — this tool cannot email anyone else and cannot send custom or user-authored content. Use ONLY when the user explicitly asks to have a result emailed to them. [category: utility]
可访问外部资源
输入模式
{'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}
esign_place
PDF E-Signature — Place signature, initial, date or text fields onto a PDF — draw or type a signature — and (Pro+) append a cryptographic ed25519 audit trail. Free tier: 3 signed documents per month. [category: sign]
输入模式
{'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."}}}
esign_prepare
E-Sign: Prepare — Return page count and per-page point dimensions for a PDF so signature fields can be positioned by the editor. [category: sign]
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (PDF)'}}}
files_unzip
Open Archive — Open a .zip archive and hand the files inside it to the next step, as a list. Use when an earlier step produced a ZIP (PDF Thumbnails, PDF to Images, Split PDF, Extract Frames, the batch converters) and the next step works on the individual files. Converts nothing. Up to 200 files. [category: utility]
输入模式
{'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}}."}}}
files_zip
Zip Files — Bundle several files — uploads or the results of earlier steps — into ONE .zip archive, unchanged. Use when the user says zip / bundle / archive / put them all in one file, or wants several results delivered as one attachment. Converts nothing (for converting many files use convert_batch). 1-50 files. [category: utility]
输入模式
{'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.'}}}
generate_ascii_art
ASCII Art Generator — Convert text or an image to ASCII art. Mode 'text' (the default) draws the words in 'text'; mode 'image' converts 'file'. With no text and a file attached, the file is converted in either mode. [category: generate]
输入模式
{'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']}}}}
generate_barcode
Barcode Generator — Generate a barcode (Code128, EAN-13, DataMatrix, PDF417, etc.) as a PNG image. [category: generate]
输入模式
{'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.'}}}
generate_business_card
Business Card Generator — Generate a printable business card (PDF or PNG) from name, job title, company, and contact details. [category: generate]
输入模式
{'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 '#'."}}}
generate_certificate
Certificate Generator — Generate a printable certificate of achievement or completion as PDF or PNG. [category: generate]
输入模式
{'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'."}}}
generate_color_palette
Color Palette Generator — Build a set of colours that work together, starting from one colour you choose. The mirror image of the Color Palette Extractor, which pulls a palette out of a picture you already have. [category: generate]
输入模式
{'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."}}}
generate_favicon
Favicon Generator — Generate a favicon set (ico + png sizes) from a source image, with optional rounded corners. This is the tiny icon a browser shows in the tab, beside a bookmark, and on a phone home screen — without one, visitors see a blank page symbol next to your site's name. [category: generate]
输入模式
{'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).'}}}
generate_gradient
Gradient Generator — Blend two or more colours into a PNG image. Unlike the web page, which writes a line of CSS, this produces a real picture a later step can composite or stamp on. [category: generate]
输入模式
{'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']}}}}
generate_hash
Hash Generator — Compute MD5, SHA-1, SHA-256, and SHA-512 hashes of text (or an uploaded file). Always returns all four — there is no algorithm selection and bcrypt is not supported. [category: generate]
输入模式
{'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']]}
generate_lorem_ipsum
Lorem Ipsum Generator — Generate lorem ipsum placeholder text by word count or paragraph count. [category: generate]
输入模式
{'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."}}}
generate_password
Password Generator — Generate a cryptographically secure random password with configurable length and character sets. [category: generate]
输入模式
{'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).'}}}
generate_placeholder_image
Placeholder Image — Generate a placeholder image at any dimension with custom background colour and label text. [category: generate]
输入模式
{'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'."}}}
generate_qr_code
QR Code Generator — Generate a QR code from a URL, text, or vCard data as a PNG image. [category: generate]
输入模式
{'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'}}}
generate_signature
Signature Generator — Write a name out in a handwriting style and return it as a PNG with a see-through background, so a later step can stamp it onto a PDF. [category: generate]
输入模式
{'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."}}}
generate_uuid
UUID Generator — Generate unique identifiers — UUID v4 or v7, ULID, Nano ID, or plain random hex. Exists so a workflow gets real identifiers instead of asking a language model to invent them. [category: generate]
输入模式
{'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']}}}}
media_add_watermark
Video Watermark — Overlay a text watermark onto a video using FFmpeg, with position and opacity control. [category: media]
输入模式
{'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.'}}}
media_compress_video
Compress Video — Reduce video file size using H.264 re-encoding with FFmpeg (quality presets high/medium/low). [category: media]
输入模式
{'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."}}}
media_extract_audio
Extract Audio — Extract the audio track from a video file as MP3, WAV, OGG, FLAC, or AAC. [category: media]
输入模式
{'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.'}}}
media_extract_frames
Extract Frames — Extract frames from a video at a specified frame rate as JPEG images (returned as a ZIP). [category: media]
输入模式
{'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.'}}}
media_merge_audio
Merge Audio — Concatenate multiple audio files (at least 2) into one MP3 using FFmpeg. [category: media]
输入模式
{'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.'}}}
media_mute_video
Mute Video — Remove the audio track from a video file. [category: media]
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (MP4, MOV, AVI, MKV, WebM or MPG)'}}}
media_trim_audio
Trim Audio — Trim an audio file to a specified start and end time using FFmpeg. [category: media]
输入模式
{'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."}}}
media_trim_video
Trim Video — Trim a video clip to a specified start and end time without re-encoding. [category: media]
输入模式
{'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."}}}
octopus_delete
Delete a file. Default behaviour is a soft delete (the file goes to the trash and can be restored). Pass `hard: true` to permanently remove a file that's ALREADY in the trash — this also reclaims storage quota. [requires a signed-in account]
可能执行破坏性操作
输入模式
{'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'}}}
octopus_list
List My Files — List the user's own saved files (their file storage), newest first, with an optional folder filter. Returns file names, types, folders, and IDs — never file contents. Use it to see what files the user has or to find which one they mean. [category: files]
只读
输入模式
{'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.'}}}
octopus_make_folder
Create Folder — Create a folder (and any missing parent folders) in the user's file storage. [category: files]
可访问外部资源
输入模式
{'type': 'object', 'required': ['path'], 'properties': {'path': {'type': 'string', 'description': 'Folder path to create, e.g. /Clients/Acme.'}}, 'x-passes-no-file': True}
octopus_mkdir
Create a folder. Any missing parent folders along the path are auto-created. Idempotent — creating an existing folder is a no-op. [requires a signed-in account]
幂等
输入模式
{'type': 'object', 'required': ['path'], 'properties': {'path': {'type': 'string', 'description': 'Folder path to create, e.g. /Tax/2026/.'}}}
octopus_move
Move a file to a different folder in Octopus, optionally renaming it at the same time. Folders are auto-created if they don't exist. This is a metadata-only change — no bytes are copied. [requires a signed-in account]
幂等
输入模式
{'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.'}}}
octopus_move_file
Move File to Folder — Move one of the user's files — an upload or a result from a previous step — into a folder of their file storage, optionally renaming it. Creates the folder if it doesn't exist. Use when the user says save / put / move / file this into a folder. [category: files]
可访问外部资源
输入模式
{'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.'}}}
octopus_read
Read the contents of a file the user has stored in Octopus. Small files (<=2 MiB) come back inline as base64 (or UTF-8 text for text/* MIMEs). Larger files return a short-lived presigned download URL the agent can fetch. [requires a signed-in account]
只读
输入模式
{'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.'}}}
octopus_search
Search the user's Octopus files by filename, tag, or folder. Pass `query` as a substring to match against names; combine with `tag:` or `in:/path/` filter syntax (e.g. `query: invoice tag:tax in:/Finance/`). Returns up to `limit` matching files. [requires a signed-in account]
只读
输入模式
{'type': 'object', 'required': ['query'], 'properties': {'limit': {'type': 'integer', 'default': 25, 'maximum': 200}, 'query': {'type': 'string', 'description': 'Free-text + optional tag:/ in:/ qualifiers.'}}}
octopus_search_meta
Find My Files — Find the user's saved files by name, tag, or folder (metadata only — does NOT read file contents). Use it to resolve a reference like 'the invoice from this morning' or 'my Q1 report' to a real file. Returns matching names, types, folders, and IDs. [category: files]
只读
输入模式
{'type': 'object', 'required': ['query'], 'properties': {'query': {'type': 'string', 'description': 'Text matched against file names and tags.'}}}
octopus_write
Save a new file the agent has produced (a report, a summary, generated code, etc.) into Octopus. If `path` is omitted the file lands in `/agent/{session}/` — the convention that keeps agent output separate from user uploads. Provide ONE of `content_text` (UTF-8) or `content_base64` (binary). [requires a signed-in account]
输入模式
{'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.'}}}
pdf_compress
Compress PDF — Reduce PDF file size while preserving readability. Quality presets: light (300 DPI), balanced (150 DPI, default), mobile (96 DPI), maximum (72 DPI). Also supports metadata-only stripping and a target-size mode. [category: pdf]
输入模式
{'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.'}}}
pdf_crop
Crop PDF — Crop the visible area of all pages in a PDF by setting new margins. Margins are in PostScript points; EVERY omitted edge defaults to 36pt — send 0 to leave an edge uncropped. [category: pdf]
输入模式
{'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.'}}}
pdf_delete_pages
Delete Pages — Remove specific pages from a PDF. [category: pdf]
输入模式
{'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."}}}
pdf_excel_to_pdf
Excel to PDF — Convert Excel spreadsheets (.xlsx / .xls / .csv / .ods) to PDF with fit-to-page, orientation control, paper size, sheet selection, repeat header rows, custom header/footer, PDF/A output, password protection, watermark, and per-sheet split mode. Hybrid pipeline: excelize preprocesses the xlsx (page layout, sheet visibility) then LibreOffice converts. [category: pdf]
输入模式
{'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.'}}}
pdf_excel_to_pdf_batch
Excel to PDF (Batch) — Apply the same Excel-to-PDF configuration to up to 20 spreadsheets. Returns a ZIP with per-file subfolders. [category: pdf]
输入模式
{'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.'}}}
pdf_excel_to_pdf_inspect
Excel to PDF (Inspect) — Non-destructive workbook scan: returns per-sheet row/column counts, merged cells, PrintArea presence, and the auto-orientation heuristic's decision per sheet. Used by the frontend to preview before converting. [category: pdf]
只读
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (XLSX, XLS, CSV, ODS)'}}}
pdf_extract_pages
Extract Pages — Pull a chosen range of pages out of a PDF into a new PDF. To split a document into single pages, fixed chunks, or odd and even pages, use Split PDF instead. [category: pdf]
输入模式
{'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.'}}}
pdf_file_info
PDF File Info — Detailed info about a PDF: size, pages, version, encryption. [category: pdf]
只读
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (PDF)'}}}
pdf_flatten
Flatten PDF — Flatten PDF forms and annotations into static page content. Supports granular modes (annotations-only, forms-only, all), page ranges, signature-aware handling, link preservation, watermark stamping, image compression, PDF/A archival output, OCR for scanned inputs, and a ZIP bundle that exports form values + annotation metadata alongside the flattened file. [category: 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.'}}}
pdf_flatten_batch
Flatten PDFs (Batch) — Apply the same flatten configuration to up to 20 PDFs in one request. Returns a ZIP with each flattened file (and per-file error entries on failure). [category: pdf]
输入模式
{'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.'}}}
pdf_get_metadata
Get PDF Metadata — Read the metadata fields of a PDF: Title, Author, Subject, Keywords, Producer, Creator. [category: pdf]
只读
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (PDF)'}}}
pdf_grayscale
Grayscale PDF — Convert a PDF to grayscale, removing all colour information. [category: 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.'}}}
pdf_header_footer
Add Header/Footer — Add custom text headers and/or footers to every page of a PDF, with optional page numbers. At least one of header, footer, or pageNumbers (other than 'none') is required. [category: pdf]
输入模式
{'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']}}}}
pdf_html_to_pdf
HTML to PDF — Convert an HTML file (.html or .htm) to PDF using LibreOffice. File upload only — URLs are not fetched. [category: pdf]
可访问外部资源
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'HTML file (.html or .htm, max 25MB)'}}}
pdf_images_to_pdf
Images to PDF — Combine multiple images (JPG, PNG, TIFF) into a single PDF document. [category: pdf]
输入模式
{'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']}}}}
pdf_interleave
Interleave PDFs — Interleave pages from two PDFs alternately (useful for double-sided scans). [category: pdf]
输入模式
{'type': 'object', 'required': ['files'], 'properties': {'files': {'type': 'array', 'items': {'type': 'string', 'format': 'binary'}, 'description': 'Input files (PDF (exactly 2 files))'}}}
pdf_merge
Merge PDFs — Combine multiple PDF files (at least 2) into a single document in the order provided. Supports per-file page selection, blank separator pages, bookmarks, and output metadata. [category: pdf]
输入模式
{'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.'}}}
pdf_ocr
OCR PDF (Make Searchable) — Make a scanned PDF searchable and selectable by adding an invisible OCR text layer over the page images — the pages look identical, but the text becomes findable, copyable, and indexable. Uses ocrmypdf (Tesseract + Ghostscript); already-searchable pages are skipped, so it is safe to run on mixed documents. This CREATES a text layer — to EXTRACT text that already exists, use pdf_to_text instead. [category: pdf] [requires the starter plan]
输入模式
{'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.'}}}
pdf_page_count
PDF Page Count — Get the total number of pages in a PDF. [category: pdf]
只读
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (PDF)'}}}
pdf_page_numbers
Add Page Numbers — Add page numbers to a PDF at a specified position (top/bottom, left/center/right). [category: 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.'}}}
pdf_pptx_to_pdf
PowerPoint to PDF — Convert a PowerPoint presentation (.pptx, .ppt) to PDF using LibreOffice. [category: pdf]
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (PPTX, PPT)'}}}
pdf_protect
Password-Protect PDF — Add a password to a PDF to prevent unauthorised opening or printing. [category: pdf]
输入模式
{'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.'}}}
pdf_remove_metadata
Remove PDF Metadata — Strip all metadata (author, title, keywords, etc.) from a PDF for privacy. [category: pdf]
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (PDF)'}}}
pdf_remove_watermark
Remove PDF Watermark — Attempt to remove an existing watermark layer from a PDF. [category: 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.'}}}
pdf_reorder
Reorder PDF Pages — Reorder the pages of a PDF by supplying the desired page sequence. [category: pdf]
输入模式
{'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.'}}}
pdf_repair
Repair PDF — Attempt to repair a corrupted or malformed PDF using Ghostscript. [category: pdf]
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (PDF)'}}}
pdf_reverse
Reverse Page Order — Reverse the page order of a PDF (last page becomes first). [category: 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.'}}}
pdf_rotate
Rotate PDF — Rotate pages of a PDF by 90, 180, or 270 degrees — all pages or specific page numbers. [category: pdf]
输入模式
{'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.'}}}
pdf_rtf_to_pdf
RTF to PDF — Convert an RTF document to PDF using LibreOffice. [category: pdf]
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (RTF)'}}}
pdf_set_metadata
Set PDF Metadata — Write or update metadata fields (Title, Author, Subject, Keywords) in a PDF. Fields are soft-verified after writing (mismatches are logged, not failed). At least ONE of title/author/subject/keywords must be provided or the request is rejected. [category: pdf]
输入模式
{'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.'}}}
pdf_split
Split PDF — Split a PDF by page range, into individual pages, by fixed chunk size, or into even/odd pages. [category: pdf]
输入模式
{'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).'}}}
pdf_thumbnails
PDF Thumbnails — Generate thumbnail preview images for each page of a PDF. [category: pdf]
输入模式
{'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."}}}
pdf_to_excel
PDF to Excel — Extract tables from PDFs into XLSX / CSV / TSV / JSON. Uses tabula-java (lattice + stream modes) with LibreOffice as fallback. Supports page ranges, table selection, sheet strategy (per-table/per-page/single), OCR for scanned PDFs (Starter+), JSON output (Starter+), and a non-destructive inspect endpoint that reports row/col counts plus ragged/sparse confidence flags. [category: pdf]
输入模式
{'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."}}}
pdf_to_excel_batch
PDF to Excel (Batch) — Apply the same PDF-to-Excel configuration to up to 20 PDFs. Returns a ZIP with per-file subfolders. [category: pdf]
输入模式
{'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."}}}
pdf_to_excel_inspect
PDF to Excel Inspector — Non-destructive scan of a PDF's tables before converting: per-table row/column counts, confidence flags, warnings. [category: pdf]
只读
输入模式
{'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']}}}}
pdf_to_images
PDF to Images — Rasterize PDF pages to PNG / JPG / WEBP / TIFF (and AVIF, Starter+). Supports page ranges, quality/DPI controls, grayscale/mono color modes, transparent output, custom background color, max-dimension cap, area crop, text watermark, custom filename patterns, contact-sheet/filmstrip tile mode (Starter+), preset profiles (web/print/email/archive), and JSON / MinIO URL response modes. [category: pdf]
输入模式
{'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."}}}
pdf_to_images_batch
PDF to Images (Batch) — Apply the same rasterization configuration to up to 20 PDFs. Returns a ZIP with a subfolder per input file. [category: pdf]
输入模式
{'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."}}}
pdf_to_pdfa
PDF to PDF/A (Archival) — Convert a PDF to PDF/A-2b, the ISO archival profile required for long-term storage and by many legal, government and enterprise records systems. Embeds fonts and colour information so the document renders identically decades from now. Uses Ghostscript. If a PDF uses features that cannot be embedded (e.g. unlicensed fonts) the conversion fails honestly rather than returning a non-conformant file. [category: pdf]
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (PDF)'}}}
pdf_to_text
PDF to Text — COPY THE WORDS OUT of a PDF: get the wording, sentences and paragraphs as plain text you can paste into an email, a document or a spreadsheet. Extract the text that is already inside a PDF and return it as a plain .txt file. Reads the PDF's existing text layer using pdftotext with a Ghostscript txtwrite fallback — it does NOT run OCR. A scanned or photographed document has no text layer, so this tool refuses it with a 422 naming pdf_ocr rather than returning an empty file; run pdf_ocr first to add a searchable text layer, then extract. Mixed documents still succeed: pages that yielded no text are reported in the X-Conversion-Notes response header instead of being dropped silently. [category: pdf]
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (PDF)'}}}
pdf_to_word
PDF to Word — Convert a PDF to an editable Word document (.docx) using LibreOffice. [category: pdf]
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (PDF)'}}}
pdf_txt_to_pdf
TXT to PDF — Convert a plain text file to a formatted PDF document. [category: pdf]
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (TXT)'}}}
pdf_unlock
Unlock PDF — Remove password protection from a PDF (you must supply the current password). [category: pdf]
输入模式
{'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.'}}}
pdf_watermark
Add PDF Watermark — STAMP or watermark a PDF: overlay text or an image across every page (or selected pages) — the tool for stamping DRAFT, CONFIDENTIAL, PAID, APPROVED, COPY or any wording onto a document, marking pages, branding them, or adding a logo overlay. Watermark type is chosen by the 'mode' field. [category: pdf]
输入模式
{'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.'}}}
photo_add_border
Add Border — Add a solid-colour border around an image, keeping the format it arrived in. [category: photo]
输入模式
{'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.'}}}
photo_bg_remover
Background Remover — Cut out the subject and remove the background from an existing photo, producing a transparent PNG (or a solid fill color). Edits a user-supplied image; does not generate new imagery. [category: photo]
输入模式
{'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']}}}}
photo_collage
Photo Collage — Arrange 2-16 images into a smart-cropped collage with aspect-ratio-aware layouts, named magazine templates, or legacy NxM grids. Output: JPG, PNG, WebP, AVIF. [category: photo]
输入模式
{'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.'}}}
photo_collage_animated
Animated Photo Collage — Animated/video collage (MP4/GIF/WebM) with Ken Burns motion. Business-only. [category: photo] [requires the business plan]
输入模式
{'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.'}}}
photo_collage_mosaic
Photo Mosaic — Render one hero photo as a mosaic of many small tile photos, color-matched per region. Business-only. Takes two separately-named uploads: 'target_image' (exactly 1) and 'tile_files[]' (20-1000). [category: photo] [requires the business plan]
输入模式
{'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.'}}}
photo_color_adjuster
Color Adjuster — Adjust brightness, contrast, and saturation of an image. [category: photo]
输入模式
{'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'."}}}
photo_compress
Compress Image — Reduce image file size using lossy or lossless compression. Supports JPEG quality setting and target-size mode. [category: photo]
输入模式
{'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.'}}}
photo_compress_to_size
Compress Image to Size — Compress an image to hit a target file size in KB. [category: photo]
输入模式
{'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'."}}}
photo_crop
Crop Image — Crop an image to a specified region (x, y, width, height) in pixels. [category: photo]
输入模式
{'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.'}}}
photo_editor
Photo Editor — Apply a single named filter to an image: grayscale, sepia, blur, sharpen, negate, or vignette. [category: photo]
输入模式
{'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.'}}}
photo_exif_viewer
EXIF Viewer — Extract and display all EXIF metadata from a photo including camera, GPS, and settings. [category: photo]
只读
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (JPG, PNG, TIFF, HEIC)'}}}
photo_face_blur
Face Blur — Automatically detect and blur faces in a photo for privacy protection. [category: photo]
输入模式
{'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']}}}}
photo_face_detect
Face Detect — Detect faces in an image and return bounding boxes. [category: photo]
只读
输入模式
{'type': 'object', 'required': ['file'], 'properties': {'file': {'type': 'string', 'format': 'binary', 'description': 'Input file (JPG, PNG, WebP, BMP)'}}}
photo_flip_rotate
Flip / Rotate Image — Flip an image horizontally or vertically, rotate it by 90/180/270, or rotate by a custom angle. [category: photo]
输入模式
{'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']}}}}
photo_format_converter
Image Format Converter — Convert an image between formats: JPG, PNG, WebP, TIFF, BMP, GIF, AVIF. [category: photo]
输入模式
{'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."}}}
photo_image_diff
Image Diff — Compare two images and highlight the differences visually. Takes two separately-named uploads: 'image1' and 'image2'. [category: photo]
输入模式
{'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.'}}}
photo_image_overlay
Image Overlay — Composite one image on top of another at a specified position. Takes two separately-named uploads: 'background' and 'overlay'. [category: photo]
输入模式
{'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."}}}
photo_image_splitter
Image Splitter — Split an image into a grid of equal tiles (e.g. 2x2, 3x3). [category: photo]
输入模式
{'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.'}}}
photo_meme_generator
Meme Generator — Add bold top and bottom caption text to an image in Impact-style font. At least one of top_text/bottom_text is required. [category: photo]
输入模式
{'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."}}}
photo_noise_reducer
Noise Reducer — Reduce image noise and grain using ImageMagick's denoising filters. [category: photo]
输入模式
{'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.'}}}
photo_resize
Resize Image — Resize an image by pixel dimensions, percentage, fit-within-max, or exact canvas. Supports maintaining aspect ratio. [category: photo]
输入模式
{'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']}}}}
photo_rounded_corners
Rounded Corners — Round the corners of an image. The output is always a PNG, because the rounded-off corners are see-through and only PNG can hold that. [category: photo]
输入模式
{'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."}}}
photo_shadow_adder
Add Drop Shadow — Add a drop shadow effect to an image, producing a PNG with transparency. [category: photo]
输入模式
{'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.'}}}
photo_svg_to_png
SVG to PNG — Rasterize an SVG vector file to PNG (or JPG/WebP) at a chosen resolution, DPI, and background color. [category: photo]
输入模式
{'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.'}}}
photo_to_text
Photo to Text (OCR) — Extract text from an image via OCR. Language selection takes two-letter codes (en, fr, de, ...) separated by commas; Tesseract codes such as eng or chi_sim also work. [category: photo]
输入模式
{'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']}}}}
photo_upscaler
Image Upscaler — Enlarge an existing image 2x or 4x with super-resolution detail recovery, with an optional face-enhancement pass. Sharpens and upsizes a user-supplied photo; does not generate new imagery. [category: photo]
输入模式
{'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.'}}}
photo_watermark
Add Image Watermark — Overlay a text watermark on a photo with configurable position (ImageMagick gravity names), opacity, and font size. [category: photo]
输入模式
{'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.'}}}
share_create
Create Share Link — Create a public download link for a file that works for 24 hours — anyone with the link can download it, no sign-in needed. Use after a conversion to hand the result to a teammate without re-uploading. Business tier only. [category: convert] [requires the business plan]
可访问外部资源
输入模式
{'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}
web_extract_table
Extract Table — Extract an HTML table from a public web page at a user-provided http(s) URL, as JSON rows or CSV. [category: web]
只读 可访问外部资源
输入模式
{'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."}}}
web_fetch
Fetch URL — Fetch the raw (decoded) HTML of a public web page at a user-provided http(s) URL. SSRF-guarded, http/https only, 10 MB body cap, robots-aware. [category: web]
只读 可访问外部资源
输入模式
{'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."}}}
web_scrape_page
Scrape Page — Extract structured data from a public web page at a user-provided http(s) URL: CSS-selector mode returns text per selector; readability mode returns the main article as clean markdown. [category: web]
只读 可访问外部资源
输入模式
{'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."}}}
已更改
email_file
2026年10月1日 02:53
已更改
photo_rounded_corners
2026年10月1日 02:53
已更改
photo_add_border
2026年10月1日 02:53
已更改
photo_meme_generator
2026年10月1日 02:53
已更改
photo_image_splitter
2026年10月1日 02:53
已更改
photo_image_overlay
2026年10月1日 02:53
已更改
photo_shadow_adder
2026年10月1日 02:53
已更改
photo_face_blur
2026年10月1日 02:53
已更改
photo_watermark
2026年10月1日 02:53
已更改
photo_crop
2026年10月1日 02:53
已更改
pdf_to_excel_inspect
2026年9月29日 03:02
已更改
pdf_to_excel_batch
2026年9月29日 03:02
已更改
pdf_to_excel
2026年9月29日 03:02
已更改
pdf_header_footer
2026年9月29日 03:02
已更改
pdf_flatten_batch
2026年9月29日 03:02
已更改
pdf_flatten
2026年9月29日 03:02
已更改
pdf_grayscale
2026年9月29日 03:02
已更改
pdf_page_numbers
2026年9月29日 03:02
已更改
pdf_watermark
2026年9月29日 03:02
已更改
pdf_delete_pages
2026年9月29日 03:02
已更改
pdf_extract_pages
2026年9月29日 03:02
已更改
pdf_to_images_batch
2026年9月29日 03:02
已更改
pdf_to_images
2026年9月29日 03:02
已更改
pdf_rotate
2026年9月29日 03:02
已更改
pdf_split
2026年9月29日 03:02
已更改
pdf_merge
2026年9月29日 03:02
已更改
drive_upload
2026年9月27日 02:53
已更改
email_file
2026年9月27日 02:53
已更改
describe_image
2026年9月27日 02:53
已更改
photo_face_detect
2026年9月27日 02:53