{"version":"1.266.8fa65d","categories":[{"slug":"pdf","name":"PDF Operations","sortOrder":1},{"slug":"format-conversion","name":"Format Conversion","sortOrder":2},{"slug":"image","name":"Image Operations","sortOrder":3},{"slug":"excel-csv","name":"Excel \u0026 CSV","sortOrder":4},{"slug":"barcode-qr","name":"Barcode \u0026 QR","sortOrder":5},{"slug":"text","name":"Text Utilities","sortOrder":6},{"slug":"array","name":"Array Utilities","sortOrder":7},{"slug":"crypto","name":"Crypto \u0026 Security","sortOrder":8},{"slug":"archive","name":"Archive","sortOrder":9},{"slug":"email-web","name":"Email \u0026 Web","sortOrder":10},{"slug":"ai-esign","name":"E-Signature","sortOrder":11},{"slug":"word","name":"Word Operations","sortOrder":12},{"slug":"powerpoint","name":"PowerPoint","sortOrder":13},{"slug":"cross-format","name":"Cross-Format","sortOrder":14},{"slug":"edi","name":"EDI / X12","sortOrder":15},{"slug":"fhir","name":"FHIR / Healthcare","sortOrder":16},{"slug":"redaction","name":"Redaction \u0026 PII","sortOrder":17},{"slug":"document-ai","name":"Document AI","sortOrder":18},{"slug":"personal-vault","name":"Personal Vault","sortOrder":19},{"slug":"sources","name":"Sources","sortOrder":19},{"slug":"destinations","name":"Destinations","sortOrder":20}],"endpoints":[{"name":"MergePdfs","category":"pdf","tokens":1,"description":"Combines multiple PDF documents into a single PDF.","responseType":"pdf","sample":"{\u0022pdfs\u0022: [\u0022\u003Cbase64-pdf-1\u003E\u0022, \u0022\u003Cbase64-pdf-2\u003E\u0022], \u0022returnBase64\u0022: true}","parameters":[{"name":"pdfs","required":true,"desc":"Array of base64-encoded PDF strings"},{"name":"returnBase64","required":false,"desc":"Return base64 JSON"}]},{"name":"SplitPdf","category":"pdf","tokens":1,"description":"Extracts specific pages from a PDF. Pages are 1-indexed.","responseType":"pdf","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022, \u0022pages\u0022: \u00221-3,5\u0022, \u0022returnBase64\u0022: true}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"},{"name":"pages","required":true,"desc":"Page spec: \u00221-3,5,7-9\u0022"},{"name":"returnBase64","required":false,"desc":"Return base64 JSON"}]},{"name":"WatermarkPdf","category":"pdf","tokens":1,"description":"Adds a text or image watermark to PDF pages.","responseType":"pdf","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022, \u0022watermark\u0022: {\u0022text\u0022: \u0022CONFIDENTIAL\u0022, \u0022fontSize\u0022: 60, \u0022opacity\u0022: 0.3}, \u0022returnBase64\u0022: true}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"},{"name":"watermark.text","required":false,"desc":"Watermark text"},{"name":"watermark.fontSize","required":false,"desc":"Font size"},{"name":"watermark.opacity","required":false,"desc":"Opacity 0-1"},{"name":"watermark.rotation","required":false,"desc":"Degrees"},{"name":"watermark.position","required":false,"desc":"center, top-left, top-right, etc"},{"name":"pages","required":false,"desc":"\u0022all\u0022 or \u00221-3,5\u0022"},{"name":"returnBase64","required":false,"desc":"Return base64 JSON"}]},{"name":"StampPdf","category":"pdf","tokens":1,"description":"Draws text and/or images at arbitrary (x,y) regions onto a PDF that has no form fields. Coordinates use a top-left origin (y measured down from the top of the page), in PDF points.","responseType":"pdf","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022, \u0022stamps\u0022: [{\u0022type\u0022: \u0022text\u0022, \u0022page\u0022: 1, \u0022x\u0022: 100, \u0022y\u0022: 200, \u0022text\u0022: \u0022Jamie Miley\u0022, \u0022size\u0022: 12}, {\u0022type\u0022: \u0022image\u0022, \u0022page\u0022: 1, \u0022x\u0022: 50, \u0022y\u0022: 400, \u0022image\u0022: \u0022\u003Cbase64-png\u003E\u0022, \u0022width\u0022: 120, \u0022height\u0022: 60}], \u0022returnBase64\u0022: true}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"},{"name":"stamps","required":true,"desc":"Array of stamp objects. Each: type (\u0022text\u0022|\u0022image\u0022), page (1-based), x, y (top-left origin, points). Text: text, size, color {r,g,b} 0-1, font (Helvetica/HelveticaBold/TimesRoman/Courier), rotation, opacity. Image: image (base64 png/jpg), width, height, opacity"},{"name":"returnBase64","required":false,"desc":"Return base64 JSON"}]},{"name":"AddPdfPageNumbers","category":"pdf","tokens":1,"description":"Add page numbers to every page of a PDF.","responseType":"pdf","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022, \u0022options\u0022: {\u0022format\u0022: \u0022Page {n} of {total}\u0022, \u0022position\u0022: \u0022bottom-center\u0022}}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"},{"name":"options.format","required":false,"desc":"Format: \u0022Page {n} of {total}\u0022"},{"name":"options.position","required":false,"desc":"Position on page"},{"name":"options.fontSize","required":false,"desc":"Font size"},{"name":"options.margin","required":false,"desc":"Distance from the page edge, in points"},{"name":"options.startPage","required":false,"desc":"First page to number, 1-based"},{"name":"options.endPage","required":false,"desc":"Last page to number; the last page of the document when omitted"}]},{"name":"AddPdfTextHeaderFooter","category":"pdf","tokens":1,"description":"Add text headers and/or footers to PDF pages.","responseType":"pdf","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022, \u0022header\u0022: \u0022CONFIDENTIAL\u0022, \u0022footer\u0022: \u0022Company Name\u0022}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"},{"name":"header","required":false,"desc":"Header text"},{"name":"footer","required":false,"desc":"Footer text"},{"name":"options.fontSize","required":false,"desc":"Font size"},{"name":"options.margin","required":false,"desc":"Distance from the page edge, in points"},{"name":"options.pages","required":false,"desc":"Pages to stamp: \u0022all\u0022 or \u00221-3,5\u0022"}]},{"name":"RotatePdfPages","category":"pdf","tokens":1,"description":"Rotate specific pages by 90, 180, or 270 degrees.","responseType":"pdf","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022, \u0022rotation\u0022: 90, \u0022pages\u0022: \u0022all\u0022}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"},{"name":"rotation","required":true,"desc":"90, 180, or 270"},{"name":"pages","required":false,"desc":"Pages to rotate"}]},{"name":"DeletePdfPages","category":"pdf","tokens":1,"description":"Remove specific pages from a PDF.","responseType":"pdf","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022, \u0022pages\u0022: [2, 4]}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"},{"name":"pages","required":true,"desc":"Array of page numbers to delete (1-indexed)"}]},{"name":"DeleteBlankPdfPages","category":"pdf","tokens":1,"description":"Detect and remove blank pages from a PDF.","responseType":"pdf","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022, \u0022threshold\u0022: 0.02}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"},{"name":"threshold","required":false,"desc":"Blank detection threshold 0-1"}]},{"name":"ResizePdfPages","category":"pdf","tokens":1,"description":"Resize PDF pages to explicit dimensions (e.g. Letter = 612 x 792 pt \u2014 see the paper-size table on the API reference overview).","responseType":"pdf","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022, \u0022width\u0022: 612, \u0022height\u0022: 792, \u0022unit\u0022: \u0022pt\u0022}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"},{"name":"width","required":true,"desc":"Target page width"},{"name":"height","required":true,"desc":"Target page height"},{"name":"unit","required":false,"desc":"Unit for width/height"},{"name":"pages","required":false,"desc":"Pages to resize: \u0022all\u0022 or \u00221-3,5\u0022"}]},{"name":"FlattenPdf","category":"pdf","tokens":1,"description":"Flatten all annotations into page content.","responseType":"pdf","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"}]},{"name":"FlattenPdfForms","category":"pdf","tokens":1,"description":"Flatten form fields, embedding values into page content.","responseType":"pdf","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"}]},{"name":"FillPdfForm","category":"pdf","tokens":1,"description":"Fill PDF form fields with provided values.","responseType":"pdf","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022, \u0022fields\u0022: {\u0022name\u0022: \u0022John Doe\u0022, \u0022email\u0022: \u0022john@example.com\u0022}, \u0022flatten\u0022: false}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"},{"name":"fields","required":true,"desc":"Object mapping field names to values"},{"name":"flatten","required":false,"desc":"Flatten after filling"}]},{"name":"SecurePdf","category":"pdf","tokens":1,"description":"Add password protection to a PDF.","responseType":"pdf","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022, \u0022userPassword\u0022: \u0022secret123\u0022}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"},{"name":"userPassword","required":true,"desc":"Password to open"},{"name":"ownerPassword","required":false,"desc":"Owner password"}]},{"name":"UnlockPdf","category":"pdf","tokens":1,"description":"Remove password protection from a PDF.","responseType":"pdf","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022, \u0022password\u0022: \u0022secret123\u0022}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"},{"name":"password","required":true,"desc":"Current password"}]},{"name":"SetPdfMetadata","category":"pdf","tokens":1,"description":"Set PDF document metadata.","responseType":"pdf","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022, \u0022metadata\u0022: {\u0022title\u0022: \u0022My Document\u0022, \u0022author\u0022: \u0022DocFlow\u0022}}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"},{"name":"metadata.title","required":false,"desc":"Document title"},{"name":"metadata.author","required":false,"desc":"Author"},{"name":"metadata.subject","required":false,"desc":"Subject"},{"name":"metadata.keywords","required":false,"desc":"Keywords"}]},{"name":"GetPdfMetadata","category":"pdf","tokens":1,"description":"Extract PDF document metadata.","responseType":"json","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"}]},{"name":"ExtractPdfText","category":"pdf","tokens":1,"description":"Extract all text content from a PDF.","responseType":"json","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"}]},{"name":"ExtractPdfTextByPage","category":"pdf","tokens":1,"description":"Extract text from specific pages.","responseType":"json","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022, \u0022pages\u0022: \u00221-3\u0022}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"},{"name":"pages","required":false,"desc":"Page numbers: \u00221-3,5\u0022"}]},{"name":"ExtractPdfFormData","category":"pdf","tokens":1,"description":"Extract form field names and values.","responseType":"json","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"}]},{"name":"ExtractPdfHyperlinks","category":"pdf","tokens":1,"description":"Extract all hyperlinks from a PDF.","responseType":"json","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"}]},{"name":"ExtractPdfImages","category":"pdf","tokens":1,"description":"Extract embedded images from a PDF.","responseType":"json","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022, \u0022format\u0022: \u0022png\u0022}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"},{"name":"format","required":false,"desc":"png or jpeg"}]},{"name":"ExtractPdfPages","category":"pdf","tokens":1,"description":"Extract pages as individual PDF files.","responseType":"json","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022, \u0022pages\u0022: \u00221-3\u0022}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"},{"name":"pages","required":true,"desc":"Pages: \u00221-3,5\u0022"}]},{"name":"ExtractPdfPagesByText","category":"pdf","tokens":2,"description":"Extract pages containing specific text.","responseType":"json","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022, \u0022searchText\u0022: \u0022invoice\u0022, \u0022caseSensitive\u0022: false}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"},{"name":"searchText","required":true,"desc":"Text to search for"},{"name":"caseSensitive","required":false,"desc":"Case-sensitive"}]},{"name":"CheckPdfPassword","category":"pdf","tokens":1,"description":"Check if a PDF is password-protected.","responseType":"json","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"},{"name":"password","required":false,"desc":"Password to verify"}]},{"name":"AddPdfAttachments","category":"pdf","tokens":1,"description":"Embed file attachments into a PDF.","responseType":"pdf","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022, \u0022attachments\u0022: [{\u0022name\u0022: \u0022data.csv\u0022, \u0022content\u0022: \u0022\u003Cbase64\u003E\u0022, \u0022mimeType\u0022: \u0022text/csv\u0022}]}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"},{"name":"attachments","required":true,"desc":"Array of {name, content, mimeType}"}]},{"name":"CropPdfPages","category":"pdf","tokens":1,"description":"Sets the crop (or media/bleed/trim/art) box on some or all pages, so the visible page is the region you name. Cropping is VISUAL \u2014 content outside the box is still in the file. To remove it, use the Redaction endpoints.","responseType":"json","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022, \u0022box\u0022: {\u0022x\u0022: 0, \u0022y\u0022: 0, \u0022width\u0022: 400, \u0022height\u0022: 600}, \u0022unit\u0022: \u0022pt\u0022, \u0022origin\u0022: \u0022bottom-left\u0022}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"},{"name":"box","required":true,"desc":"{ x, y, width, height } in the unit given by \u0022unit\u0022. width and height must be greater than zero"},{"name":"pages","required":false,"desc":"Pages to crop: \u0022all\u0022, \u00221-3,5\u0022, or an array of 1-based page numbers"},{"name":"unit","required":false,"desc":"Unit the box is expressed in"},{"name":"boxType","required":false,"desc":"Which PDF box to set"},{"name":"origin","required":false,"desc":"Where box.y is measured from. PDF user space is bottom-left; design and screenshot tools measure from the top"}]},{"name":"InsertPdfPages","category":"pdf","tokens":1,"description":"Inserts pages from one PDF into another at a chosen position \u2014 the one-call version of split-then-merge.","responseType":"json","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022, \u0022insert\u0022: \u0022\u003Cbase64-pdf\u003E\u0022, \u0022at\u0022: 2, \u0022pages\u0022: \u00221-2\u0022}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF to insert INTO"},{"name":"insert","required":true,"desc":"Base64-encoded PDF to take pages FROM"},{"name":"at","required":false,"desc":"1-based position: these pages become page N. Omit (or pass pageCount\u002B1) to append"},{"name":"pages","required":false,"desc":"Which pages of \u0022insert\u0022 to take: \u0022all\u0022, \u00221-3,5\u0022, or an array of 1-based page numbers"}]},{"name":"ReorderPdfPages","category":"pdf","tokens":1,"description":"Rewrites a PDF\u0027s page order in one call. \u0022order\u0022 must be a PERMUTATION \u2014 every page listed exactly once \u2014 so a typo cannot silently drop or duplicate a page.","responseType":"json","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022, \u0022order\u0022: [3, 1, 2]}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"},{"name":"order","required":true,"desc":"Every 1-based page number, exactly once, in the order you want them"}]},{"name":"AddPdfBookmarks","category":"pdf","tokens":1,"description":"Adds a bookmark (outline) tree to a PDF from a nested list of titles and target pages, so readers get a navigable pane in Acrobat, Chrome and Edge.","responseType":"json","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022, \u0022bookmarks\u0022: [{\u0022title\u0022: \u0022Chapter 1\u0022, \u0022page\u0022: 1, \u0022children\u0022: [{\u0022title\u0022: \u0022Section 1.1\u0022, \u0022page\u0022: 2}]}, {\u0022title\u0022: \u0022Chapter 2\u0022, \u0022page\u0022: 5, \u0022collapsed\u0022: true}]}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"},{"name":"bookmarks","required":true,"desc":"Nested list of { title, page, collapsed?, children? }. page is 1-based and must exist in the document"},{"name":"replace","required":false,"desc":"Overwrite an outline the document already has. Pass false to be told instead of losing it"},{"name":"openPane","required":false,"desc":"Open the reader\u0027s bookmark pane automatically (sets /PageMode /UseOutlines)"}]},{"name":"InsertPdfToc","category":"pdf","tokens":1,"description":"Generates table-of-contents page(s) with clickable entries and inserts them into the PDF. Every target page is renumbered for the pages the contents itself adds, so the links land where the text says.","responseType":"json","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022, \u0022bookmarks\u0022: [{\u0022title\u0022: \u0022Introduction\u0022, \u0022page\u0022: 1, \u0022children\u0022: [{\u0022title\u0022: \u0022Background\u0022, \u0022page\u0022: 3}]}], \u0022addBookmarks\u0022: true}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"},{"name":"entries","required":false,"desc":"Flat list of { title, page, level? } \u2014 level indents the line (1 = flush left)"},{"name":"bookmarks","required":false,"desc":"Nested { title, page, children? } tree instead of entries; nesting becomes the indent level"},{"name":"at","required":false,"desc":"1-based position for the contents pages"},{"name":"title","required":false,"desc":"Heading printed at the top"},{"name":"pageSize","required":false,"desc":"Paper size for the generated pages. Defaults to matching the document\u0027s first page"},{"name":"orientation","required":false,"desc":"Orientation, when pageSize is named"},{"name":"fontSize","required":false,"desc":"Entry text size in points"},{"name":"titleFontSize","required":false,"desc":"Heading size in points"},{"name":"indent","required":false,"desc":"Points of indent per level"},{"name":"addBookmarks","required":false,"desc":"Also write the outline pane from the same tree (needs the nested \u0022bookmarks\u0022 input)"}]},{"name":"CompressPdf","category":"pdf","tokens":1,"description":"Shrinks a PDF by re-encoding the images inside it at a lower quality, and optionally downsampling or converting them to grayscale. Best on scans and photos; a text-only PDF will barely change.","responseType":"json","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022, \u0022imageQuality\u0022: 50, \u0022maxImageDimension\u0022: 1600}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"},{"name":"imageQuality","required":false,"desc":"JPEG quality for re-encoded images, 1-100. Lower is smaller"},{"name":"maxImageDimension","required":false,"desc":"Downsample any image whose longest side exceeds this many pixels. Omit to keep pixel dimensions"},{"name":"grayscale","required":false,"desc":"Convert re-encoded images to grayscale"}]},{"name":"SignPdf","category":"pdf","tokens":1,"description":"Applies a cryptographic digital signature to a PDF using YOUR PKCS#12 certificate, producing the signed-document banner Acrobat shows. Different from the e-signature endpoints, which orchestrate a person signing.","responseType":"json","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022, \u0022pfx\u0022: \u0022\u003Cbase64-p12\u003E\u0022, \u0022passphrase\u0022: \u0022\u003Ccertificate password\u003E\u0022, \u0022reason\u0022: \u0022Approved by finance\u0022, \u0022name\u0022: \u0022A. Signer\u0022}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"},{"name":"pfx","required":true,"desc":"Your PKCS#12 bundle (.p12 / .pfx) as base64. Used for this call only and never stored"},{"name":"passphrase","required":false,"desc":"Password protecting the PKCS#12 bundle"},{"name":"reason","required":false,"desc":"Reason recorded in the signature"},{"name":"name","required":false,"desc":"Signer name recorded in the signature"},{"name":"location","required":false,"desc":"Location recorded in the signature"},{"name":"contactInfo","required":false,"desc":"Contact details recorded in the signature"},{"name":"pades","required":false,"desc":"Use the ETSI PAdES SubFilter instead of the Adobe one"},{"name":"signatureLength","required":false,"desc":"Bytes reserved for the signature. Raise only if signing fails because it does not fit"}]},{"name":"ConvertHtmlToPdf","category":"format-conversion","tokens":1,"description":"Converts an HTML string to a PDF document using a headless Chromium browser.","responseType":"pdf","sample":"{\u0022html\u0022: \u0022\u003Ch1\u003EHello World\u003C/h1\u003E\\n\u003Cp\u003EGenerated by DocFlow.\u003C/p\u003E\u0022, \u0022options\u0022: {\u0022pageSize\u0022: \u0022Letter\u0022}, \u0022returnBase64\u0022: true}","parameters":[{"name":"html","required":true,"desc":"HTML content to convert"},{"name":"returnBase64","required":false,"desc":"Send true for base64 JSON. This endpoint defaults to RAW BINARY \u2014 omit the field and you get the PDF bytes back with Content-Type: application/pdf, which is the opposite of MergePdfs, SplitPdf, WatermarkPdf and the rest of the API (#2227)"},{"name":"options.pageSize","required":false,"desc":"Named paper size \u2014 see the paper-size table on the API reference overview. Case- and punctuation-insensitive; aliases such as \u0022US Letter\u0022 are accepted. Via raw JSON a custom size object is also accepted: {\u0022width\u0022: n, \u0022height\u0022: n, \u0022units\u0022: \u0022pt|px|in|mm|cm\u0022} (units default pt; 1-14400pt / 200in per side). An unknown size, unit, or orientation returns 400 \u2014 nothing silently falls back. Legacy key options.format is still accepted"},{"name":"options.orientation","required":false,"desc":"Page orientation. \u0022landscape\u0022 puts the long edge horizontal. Omit to keep the size\u0027s own orientation (portrait for every named size except Ledger)"},{"name":"options.printBackground","required":false,"desc":"Include CSS backgrounds"},{"name":"options.margin","required":false,"desc":"{ top, right, bottom, left } in CSS units"}]},{"name":"ConvertPdfToImage","category":"format-conversion","tokens":3,"description":"Convert PDF pages to PNG or JPEG images.","responseType":"json","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022, \u0022options\u0022: {\u0022format\u0022: \u0022png\u0022, \u0022pages\u0022: [1], \u0022dpi\u0022: 150}}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"},{"name":"options.format","required":false,"desc":"png or jpeg"},{"name":"options.pages","required":false,"desc":"Pages to convert (default all)"},{"name":"options.dpi","required":false,"desc":"Resolution 72-600"}]},{"name":"ConvertPdfToText","category":"format-conversion","tokens":1,"description":"Extract text content from a PDF document.","responseType":"json","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"}]},{"name":"ConvertHtmlToImage","category":"format-conversion","tokens":1,"description":"Render HTML as a PNG or JPEG screenshot.","responseType":"json","sample":"{\u0022html\u0022: \u0022\u003Ch1\u003EHello World\u003C/h1\u003E\u0022, \u0022options\u0022: {\u0022format\u0022: \u0022png\u0022, \u0022width\u0022: 800, \u0022height\u0022: 600}}","parameters":[{"name":"html","required":true,"desc":"HTML content"},{"name":"options.format","required":false,"desc":"png or jpeg"},{"name":"options.width","required":false,"desc":"Viewport width"},{"name":"options.height","required":false,"desc":"Viewport height"}]},{"name":"ConvertTextToPdf","category":"format-conversion","tokens":1,"description":"Convert plain text to a formatted PDF.","responseType":"pdf","sample":"{\u0022text\u0022: \u0022This is plain text content.\u0022, \u0022options\u0022: {\u0022fontSize\u0022: 12, \u0022pageSize\u0022: \u0022Letter\u0022}}","parameters":[{"name":"text","required":true,"desc":"Plain text content"},{"name":"options.fontSize","required":false,"desc":"Font size"},{"name":"options.pageSize","required":false,"desc":"Named paper size \u2014 see the paper-size table on the API reference overview. Case- and punctuation-insensitive; aliases such as \u0022US Letter\u0022 are accepted. Via raw JSON a custom size object is also accepted: {\u0022width\u0022: n, \u0022height\u0022: n, \u0022units\u0022: \u0022pt|px|in|mm|cm\u0022} (units default pt; 1-14400pt / 200in per side). An unknown size, unit, or orientation returns 400 \u2014 nothing silently falls back"},{"name":"options.orientation","required":false,"desc":"Page orientation. \u0022landscape\u0022 puts the long edge horizontal. Omit to keep the size\u0027s own orientation (portrait for every named size except Ledger)"}]},{"name":"ConvertMarkdownToHtml","category":"format-conversion","tokens":1,"description":"Convert Markdown text to HTML using GitHub-Flavored Markdown.","responseType":"json","sample":"{\u0022markdown\u0022: \u0022# Hello World\\n\\nThis is **bold** and *italic* text.\u0022}","parameters":[{"name":"markdown","required":true,"desc":"Markdown text to convert"},{"name":"options.wrapInDocument","required":false,"desc":"Wrap in full HTML document"},{"name":"options.gfm","required":false,"desc":"Use GitHub-Flavored Markdown"},{"name":"options.breaks","required":false,"desc":"Convert line breaks to \u003Cbr\u003E"},{"name":"options.css","required":false,"desc":"Additional CSS to include"}]},{"name":"ConvertMarkdownToPdf","category":"format-conversion","tokens":1,"description":"Convert Markdown text to a styled PDF document via Chromium rendering.","responseType":"pdf","sample":"{\u0022markdown\u0022: \u0022# Report\\n\\n## Summary\\n\\nKey findings:\\n- Item 1\\n- Item 2\u0022}","parameters":[{"name":"markdown","required":true,"desc":"Markdown text to convert"},{"name":"options.pageSize","required":false,"desc":"Named paper size \u2014 see the paper-size table on the API reference overview. Case- and punctuation-insensitive; aliases such as \u0022US Letter\u0022 are accepted. Via raw JSON a custom size object is also accepted: {\u0022width\u0022: n, \u0022height\u0022: n, \u0022units\u0022: \u0022pt|px|in|mm|cm\u0022} (units default pt; 1-14400pt / 200in per side). An unknown size, unit, or orientation returns 400 \u2014 nothing silently falls back. Legacy key options.format is still accepted"},{"name":"options.orientation","required":false,"desc":"Page orientation. \u0022landscape\u0022 puts the long edge horizontal. Omit to keep the size\u0027s own orientation (portrait for every named size except Ledger)"},{"name":"options.gfm","required":false,"desc":"Use GitHub-Flavored Markdown"},{"name":"options.css","required":false,"desc":"Additional CSS to include"},{"name":"options.margin","required":false,"desc":"Page margins {top, right, bottom, left}"}]},{"name":"ConvertDocxToHtml","category":"format-conversion","tokens":1,"description":"Convert a Word DOCX document to HTML using mammoth.","responseType":"json","sample":"{\u0022file\u0022: \u0022\u003Cbase64-docx\u003E\u0022}","parameters":[{"name":"file","required":true,"desc":"Base64-encoded DOCX file"},{"name":"options.wrapInDocument","required":false,"desc":"Wrap in full HTML document"},{"name":"options.styleMap","required":false,"desc":"Custom mammoth style map rules"},{"name":"options.css","required":false,"desc":"CSS for document wrapper"}]},{"name":"ConvertDocxToMarkdown","category":"format-conversion","tokens":1,"description":"Convert a Word DOCX document to Markdown text.","responseType":"json","sample":"{\u0022file\u0022: \u0022\u003Cbase64-docx\u003E\u0022}","parameters":[{"name":"file","required":true,"desc":"Base64-encoded DOCX file"},{"name":"options.styleMap","required":false,"desc":"Custom mammoth style map rules"}]},{"name":"ConvertDocxToPdf","category":"format-conversion","tokens":2,"description":"Convert a Word DOCX document to PDF via mammoth HTML conversion and Chromium rendering.","responseType":"pdf","sample":"{\u0022file\u0022: \u0022\u003Cbase64-docx\u003E\u0022}","parameters":[{"name":"file","required":true,"desc":"Base64-encoded DOCX file"},{"name":"options.pageSize","required":false,"desc":"Named paper size \u2014 see the paper-size table on the API reference overview. Case- and punctuation-insensitive; aliases such as \u0022US Letter\u0022 are accepted. Via raw JSON a custom size object is also accepted: {\u0022width\u0022: n, \u0022height\u0022: n, \u0022units\u0022: \u0022pt|px|in|mm|cm\u0022} (units default pt; 1-14400pt / 200in per side). An unknown size, unit, or orientation returns 400 \u2014 nothing silently falls back. Legacy key options.format is still accepted"},{"name":"options.orientation","required":false,"desc":"Page orientation. \u0022landscape\u0022 puts the long edge horizontal. Omit to keep the size\u0027s own orientation (portrait for every named size except Ledger)"},{"name":"options.css","required":false,"desc":"Additional CSS for styling"},{"name":"options.margin","required":false,"desc":"Page margins {top, right, bottom, left}"}]},{"name":"ConvertHtmlToDocx","category":"format-conversion","tokens":1,"description":"Convert HTML content to a Word DOCX document.","responseType":"json","sample":"{\u0022html\u0022: \u0022\u003Ch1\u003EHello World\u003C/h1\u003E\u003Cp\u003ETest document from \u003Cstrong\u003EHTML\u003C/strong\u003E.\u003C/p\u003E\u0022}","parameters":[{"name":"html","required":true,"desc":"HTML content to convert"},{"name":"options.title","required":false,"desc":"Document title metadata"},{"name":"options.orientation","required":false,"desc":"Page orientation. \u0022landscape\u0022 puts the long edge horizontal. Omit to keep the size\u0027s own orientation (portrait for every named size except Ledger)"},{"name":"options.pageSize","required":false,"desc":"Named paper size \u2014 see the paper-size table on the API reference overview. Case- and punctuation-insensitive; aliases such as \u0022US Letter\u0022 are accepted. Via raw JSON a custom size object is also accepted: {\u0022width\u0022: n, \u0022height\u0022: n, \u0022units\u0022: \u0022pt|px|in|mm|cm\u0022} (units default pt; 1-14400pt / 200in per side). An unknown size, unit, or orientation returns 400 \u2014 nothing silently falls back. A0, A1, and A2 exceed Word\u0027s 22-inch page cap and are rejected for DOCX"}]},{"name":"ConvertCsvToExcel","category":"format-conversion","tokens":1,"description":"Convert CSV text to an Excel XLSX workbook.","responseType":"json","sample":"{\u0022csv\u0022: \u0022Name,Age,City\\nAlice,30,London\\nBob,25,Paris\u0022, \u0022options\u0022: {\u0022hasHeaders\u0022: true}}","parameters":[{"name":"csv","required":true,"desc":"CSV text data"},{"name":"options.hasHeaders","required":false,"desc":"First row is headers"},{"name":"options.delimiter","required":false,"desc":"CSV delimiter"},{"name":"options.sheetName","required":false,"desc":"Worksheet name"}]},{"name":"ConvertExcelToCsv","category":"format-conversion","tokens":1,"description":"Convert an Excel XLSX worksheet to CSV text.","responseType":"json","sample":"{\u0022file\u0022: \u0022\u003Cbase64-xlsx\u003E\u0022, \u0022options\u0022: {\u0022worksheet\u0022: \u0022Sheet1\u0022}}","parameters":[{"name":"file","required":true,"desc":"Base64-encoded XLSX file"},{"name":"options.worksheet","required":false,"desc":"Sheet name or index (default first)"},{"name":"options.delimiter","required":false,"desc":"CSV delimiter"}]},{"name":"ConvertExcelToJson","category":"format-conversion","tokens":1,"description":"Convert an Excel XLSX worksheet to a JSON array.","responseType":"json","sample":"{\u0022file\u0022: \u0022\u003Cbase64-xlsx\u003E\u0022, \u0022options\u0022: {\u0022worksheet\u0022: \u0022Sheet1\u0022, \u0022hasHeaders\u0022: true}}","parameters":[{"name":"file","required":true,"desc":"Base64-encoded XLSX file"},{"name":"options.worksheet","required":false,"desc":"Sheet name or index (default first)"},{"name":"options.hasHeaders","required":false,"desc":"First row is headers"}]},{"name":"ConvertExcelToPdf","category":"format-conversion","tokens":2,"description":"Print an Excel XLSX workbook to PDF: every visible worksheet as a table, with its number formats, fonts, fills, borders, merged cells and column widths.","responseType":"pdf","sample":"{\u0022file\u0022: \u0022\u003Cbase64-xlsx\u003E\u0022}","parameters":[{"name":"file","required":true,"desc":"Base64-encoded XLSX file"},{"name":"options.worksheet","required":false,"desc":"Sheet name or index to print (default: every visible sheet)"},{"name":"options.pageSize","required":false,"desc":"Named paper size \u2014 see the paper-size table on the API reference overview. Case- and punctuation-insensitive; aliases such as \u0022US Letter\u0022 are accepted. Via raw JSON a custom size object is also accepted: {\u0022width\u0022: n, \u0022height\u0022: n, \u0022units\u0022: \u0022pt|px|in|mm|cm\u0022} (units default pt; 1-14400pt / 200in per side). An unknown size, unit, or orientation returns 400 \u2014 nothing silently falls back. Legacy key options.format is still accepted"},{"name":"options.orientation","required":false,"desc":"Page orientation. \u0022landscape\u0022 puts the long edge horizontal. Omit to keep the size\u0027s own orientation (portrait for every named size except Ledger)"},{"name":"options.margin","required":false,"desc":"Page margins {top, right, bottom, left}"}]},{"name":"ConvertImageToPdf","category":"format-conversion","tokens":1,"description":"Turns JPEG and PNG images into a PDF \u2014 one page per image, in the order supplied. A batch of scanned pages becomes a single document.","responseType":"json","sample":"{\u0022images\u0022: [\u0022\u003Cbase64-jpeg\u003E\u0022, \u0022\u003Cbase64-png\u003E\u0022], \u0022pageSize\u0022: \u0022fit\u0022, \u0022dpi\u0022: 96}","parameters":[{"name":"images","required":true,"desc":"Array of base64-encoded JPEG or PNG images (max 200 per call, 64 MB decoded in total). Use \u0022image\u0022 instead for a single file"},{"name":"image","required":false,"desc":"A single base64-encoded JPEG or PNG \u2014 the convenience form of \u0022images\u0022"},{"name":"pageSize","required":false,"desc":"\u0022fit\u0022 makes each page the image\u0027s own size at \u0022dpi\u0022 (nothing is scaled). Any named paper size instead scales the image to fit inside the page minus \u0022margin\u0022, centered, aspect preserved"},{"name":"orientation","required":false,"desc":"Page orientation. \u0022landscape\u0022 puts the long edge horizontal. Omit to keep the size\u0027s own orientation (portrait for every named size except Ledger)"},{"name":"dpi","required":false,"desc":"Pixels per inch used to size the page (1-2400)"},{"name":"margin","required":false,"desc":"Margin in points around the image. Only valid with a named pageSize \u2014 with \u0022fit\u0022 the page IS the image, so a margin is refused"}]},{"name":"ConvertTiffToPdf","category":"format-conversion","tokens":1,"description":"Turns a multi-page TIFF \u2014 including the CCITT G3/G4 that inbound faxes arrive as \u2014 into a PDF with every page present. A multi-page TIFF previews as page 1 only in Outlook and most mail clients, which reads as a dropped attachment when every page was there all along.","responseType":"json","sample":"{\u0022tiff\u0022: \u0022\u003Cbase64-tiff\u003E\u0022, \u0022pageSize\u0022: \u0022fit\u0022, \u0022dpi\u0022: 200}","parameters":[{"name":"tiff","required":true,"desc":"Base64-encoded TIFF (max 64 MB decoded)"},{"name":"pages","required":false,"desc":"Which pages to convert: \u00221-3,5\u0022 or an array of 1-based page numbers (max 200 converted per call). Omit for every page"},{"name":"pageSize","required":false,"desc":"\u0022fit\u0022 makes each page the image\u0027s own size at \u0022dpi\u0022. Any named paper size instead scales each page to fit inside it minus \u0022margin\u0022, centered"},{"name":"orientation","required":false,"desc":"Page orientation. \u0022landscape\u0022 puts the long edge horizontal. Omit to keep the size\u0027s own orientation (portrait for every named size except Ledger)"},{"name":"dpi","required":false,"desc":"Pixels per inch used to size the page. Defaults to the TIFF\u0027s own resolution tag when it has one, otherwise 200 (the fax norm)"},{"name":"margin","required":false,"desc":"Margin in points. Only valid with a named pageSize"}]},{"name":"ResizeImage","category":"image","tokens":1,"description":"Resize an image with flexible fit options.","responseType":"json","sample":"{\u0022image\u0022: \u0022\u003Cbase64-image\u003E\u0022, \u0022width\u0022: 800, \u0022height\u0022: 600, \u0022fit\u0022: \u0022contain\u0022}","parameters":[{"name":"image","required":true,"desc":"Base64-encoded image"},{"name":"width","required":false,"desc":"Target width"},{"name":"height","required":false,"desc":"Target height"},{"name":"fit","required":false,"desc":"cover, contain, fill, inside, outside"}]},{"name":"CropImage","category":"image","tokens":1,"description":"Extract a rectangular region from an image.","responseType":"json","sample":"{\u0022image\u0022: \u0022\u003Cbase64-image\u003E\u0022, \u0022left\u0022: 100, \u0022top\u0022: 100, \u0022width\u0022: 400, \u0022height\u0022: 300}","parameters":[{"name":"image","required":true,"desc":"Base64-encoded image"},{"name":"left","required":true,"desc":"X offset"},{"name":"top","required":true,"desc":"Y offset"},{"name":"width","required":true,"desc":"Crop width"},{"name":"height","required":true,"desc":"Crop height"}]},{"name":"RotateImage","category":"image","tokens":1,"description":"Rotate an image by a specified angle.","responseType":"json","sample":"{\u0022image\u0022: \u0022\u003Cbase64-image\u003E\u0022, \u0022angle\u0022: 90}","parameters":[{"name":"image","required":true,"desc":"Base64-encoded image"},{"name":"angle","required":true,"desc":"Rotation in degrees"}]},{"name":"FlipImage","category":"image","tokens":1,"description":"Flip an image horizontally or vertically.","responseType":"json","sample":"{\u0022image\u0022: \u0022\u003Cbase64-image\u003E\u0022, \u0022direction\u0022: \u0022horizontal\u0022}","parameters":[{"name":"image","required":true,"desc":"Base64-encoded image"},{"name":"direction","required":true,"desc":"horizontal or vertical"}]},{"name":"CompressImage","category":"image","tokens":1,"description":"Compress an image with quality control.","responseType":"json","sample":"{\u0022image\u0022: \u0022\u003Cbase64-image\u003E\u0022, \u0022quality\u0022: 75, \u0022format\u0022: \u0022jpeg\u0022}","parameters":[{"name":"image","required":true,"desc":"Base64-encoded image"},{"name":"quality","required":false,"desc":"Quality 1-100"},{"name":"format","required":false,"desc":"jpeg, png, webp"}]},{"name":"ConvertImage","category":"image","tokens":1,"description":"Convert an image between formats.","responseType":"json","sample":"{\u0022image\u0022: \u0022\u003Cbase64-image\u003E\u0022, \u0022format\u0022: \u0022webp\u0022}","parameters":[{"name":"image","required":true,"desc":"Base64-encoded image"},{"name":"format","required":true,"desc":"png, jpeg, webp, tiff, gif"}]},{"name":"AddImageTextWatermark","category":"image","tokens":1,"description":"Overlay text watermark on an image.","responseType":"json","sample":"{\u0022image\u0022: \u0022\u003Cbase64-image\u003E\u0022, \u0022text\u0022: \u0022DRAFT\u0022, \u0022options\u0022: {\u0022fontSize\u0022: 48, \u0022position\u0022: \u0022center\u0022}}","parameters":[{"name":"image","required":true,"desc":"Base64-encoded image"},{"name":"text","required":true,"desc":"Watermark text"},{"name":"options.fontSize","required":false,"desc":"Font size"},{"name":"options.color","required":false,"desc":"Text color"},{"name":"options.position","required":false,"desc":"center, top-left, etc"}]},{"name":"AddImageWatermark","category":"image","tokens":1,"description":"Overlay a watermark image on another image.","responseType":"json","sample":"{\u0022image\u0022: \u0022\u003Cbase64-image\u003E\u0022, \u0022watermark\u0022: \u0022\u003Cbase64-watermark\u003E\u0022, \u0022options\u0022: {\u0022opacity\u0022: 0.5, \u0022position\u0022: \u0022center\u0022}}","parameters":[{"name":"image","required":true,"desc":"Base64-encoded image"},{"name":"watermark","required":true,"desc":"Base64 watermark image"},{"name":"options.opacity","required":false,"desc":"Opacity 0-1"},{"name":"options.position","required":false,"desc":"center, tile, etc"}]},{"name":"ExtractExifData","category":"image","tokens":1,"description":"Extract EXIF metadata from an image.","responseType":"json","sample":"{\u0022image\u0022: \u0022\u003Cbase64-image\u003E\u0022}","parameters":[{"name":"image","required":true,"desc":"Base64-encoded image"}]},{"name":"RemoveExifData","category":"image","tokens":1,"description":"Strip all metadata from an image.","responseType":"json","sample":"{\u0022image\u0022: \u0022\u003Cbase64-image\u003E\u0022}","parameters":[{"name":"image","required":true,"desc":"Base64-encoded image"}]},{"name":"CleanDocumentImage","category":"image","tokens":1,"description":"Clean and enhance scanned document images.","responseType":"json","sample":"{\u0022image\u0022: \u0022\u003Cbase64-image\u003E\u0022, \u0022sharpen\u0022: true, \u0022normalize\u0022: true}","parameters":[{"name":"image","required":true,"desc":"Base64-encoded image"},{"name":"sharpen","required":false,"desc":"Apply sharpening"},{"name":"normalize","required":false,"desc":"Normalize contrast"}]},{"name":"CleanPhoto","category":"image","tokens":1,"description":"Auto-enhance photo brightness, contrast, and color.","responseType":"json","sample":"{\u0022image\u0022: \u0022\u003Cbase64-image\u003E\u0022}","parameters":[{"name":"image","required":true,"desc":"Base64-encoded image"}]},{"name":"RotateImageExif","category":"image","tokens":1,"description":"Auto-rotate based on EXIF orientation data.","responseType":"json","sample":"{\u0022image\u0022: \u0022\u003Cbase64-image\u003E\u0022}","parameters":[{"name":"image","required":true,"desc":"Base64-encoded image"}]},{"name":"ExcelAddRows","category":"excel-csv","tokens":1,"description":"Add rows to an Excel worksheet.","responseType":"json","sample":"{\u0022file\u0022: \u0022\u003Cbase64-xlsx\u003E\u0022, \u0022rows\u0022: [[\u0022Name\u0022, \u0022Email\u0022], [\u0022John\u0022, \u0022john@test.com\u0022]]}","parameters":[{"name":"file","required":true,"desc":"Base64 Excel file"},{"name":"worksheet","required":false,"desc":"Sheet name or index"},{"name":"rows","required":true,"desc":"Array of row arrays or objects"},{"name":"startRow","required":false,"desc":"Insert position"}]},{"name":"ExcelDeleteRows","category":"excel-csv","tokens":1,"description":"Delete rows from an Excel worksheet.","responseType":"json","sample":"{\u0022file\u0022: \u0022\u003Cbase64-xlsx\u003E\u0022, \u0022rows\u0022: [2, 3, 4]}","parameters":[{"name":"file","required":true,"desc":"Base64 Excel file"},{"name":"worksheet","required":false,"desc":"Sheet name"},{"name":"rows","required":true,"desc":"Array of row numbers to delete (1-indexed)"}]},{"name":"ExcelExtractRows","category":"excel-csv","tokens":1,"description":"Extract rows as JSON.","responseType":"json","sample":"{\u0022file\u0022: \u0022\u003Cbase64-xlsx\u003E\u0022, \u0022hasHeaders\u0022: true}","parameters":[{"name":"file","required":true,"desc":"Base64 Excel file"},{"name":"worksheet","required":false,"desc":"Sheet name"},{"name":"hasHeaders","required":false,"desc":"First row has headers"},{"name":"startRow","required":false,"desc":"First row to read, 1-based"},{"name":"endRow","required":false,"desc":"Last row to read; the worksheet\u0027s last row when omitted"}]},{"name":"ExcelUpdateRows","category":"excel-csv","tokens":1,"description":"Update specific cells in an Excel worksheet.","responseType":"json","sample":"{\u0022file\u0022: \u0022\u003Cbase64-xlsx\u003E\u0022, \u0022updates\u0022: [{\u0022row\u0022: 1, \u0022col\u0022: 1, \u0022value\u0022: \u0022Updated\u0022}]}","parameters":[{"name":"file","required":true,"desc":"Base64 Excel file"},{"name":"worksheet","required":false,"desc":"Sheet name"},{"name":"updates","required":true,"desc":"Array of {row, col, value}"}]},{"name":"ExcelFindReplace","category":"excel-csv","tokens":1,"description":"Find and replace text in cells.","responseType":"json","sample":"{\u0022file\u0022: \u0022\u003Cbase64-xlsx\u003E\u0022, \u0022find\u0022: \u0022old\u0022, \u0022replace\u0022: \u0022new\u0022}","parameters":[{"name":"file","required":true,"desc":"Base64 Excel file"},{"name":"find","required":true,"desc":"Text to find"},{"name":"replace","required":true,"desc":"Replacement text"},{"name":"worksheet","required":false,"desc":"Specific sheet"}]},{"name":"ExcelMergeFiles","category":"excel-csv","tokens":1,"description":"Merge multiple Excel files into one.","responseType":"json","sample":"{\u0022files\u0022: [\u0022\u003Cbase64-xlsx-1\u003E\u0022, \u0022\u003Cbase64-xlsx-2\u003E\u0022]}","parameters":[{"name":"files","required":true,"desc":"Array of base64 Excel files"}]},{"name":"ExcelMergeRows","category":"excel-csv","tokens":1,"description":"Merge rows from multiple Excel files into one.","responseType":"json","sample":"{\u0022files\u0022: [\u0022\u003Cbase64-xlsx-1\u003E\u0022, \u0022\u003Cbase64-xlsx-2\u003E\u0022], \u0022hasHeaders\u0022: true}","parameters":[{"name":"files","required":true,"desc":"Array of base64-encoded Excel files"},{"name":"worksheet","required":false,"desc":"Sheet name to merge from each file"},{"name":"hasHeaders","required":false,"desc":"First row is headers"}]},{"name":"ExcelSplitWorksheets","category":"excel-csv","tokens":1,"description":"Split each worksheet into separate files.","responseType":"json","sample":"{\u0022file\u0022: \u0022\u003Cbase64-xlsx\u003E\u0022}","parameters":[{"name":"file","required":true,"desc":"Base64 Excel file"}]},{"name":"ExcelDeleteWorksheets","category":"excel-csv","tokens":1,"description":"Delete specific worksheets.","responseType":"json","sample":"{\u0022file\u0022: \u0022\u003Cbase64-xlsx\u003E\u0022, \u0022worksheets\u0022: [\u0022Sheet2\u0022]}","parameters":[{"name":"file","required":true,"desc":"Base64 Excel file"},{"name":"worksheets","required":true,"desc":"Sheet names or indices"}]},{"name":"ExcelExtractWorksheets","category":"excel-csv","tokens":1,"description":"Extract specific worksheets as separate files.","responseType":"json","sample":"{\u0022file\u0022: \u0022\u003Cbase64-xlsx\u003E\u0022, \u0022worksheets\u0022: [\u0022Sheet1\u0022]}","parameters":[{"name":"file","required":true,"desc":"Base64 Excel file"},{"name":"worksheets","required":true,"desc":"Sheet names or indices"}]},{"name":"ExcelSecure","category":"excel-csv","tokens":1,"description":"Encrypt a workbook with a password (ECMA-376 agile, AES-256). The password is required to open the file and is not recoverable.","responseType":"json","sample":"{\u0022file\u0022: \u0022\u003Cbase64-xlsx\u003E\u0022, \u0022password\u0022: \u0022secret\u0022}","parameters":[{"name":"file","required":true,"desc":"Base64 Excel file (.xlsx, unencrypted)"},{"name":"password","required":true,"desc":"Open password, max 255 characters"}]},{"name":"ExcelUnlock","category":"excel-csv","tokens":1,"description":"Decrypt a password-protected workbook (ECMA-376 agile, ExcelSecure\u0027s counterpart) and remove worksheet protection.","responseType":"json","sample":"{\u0022file\u0022: \u0022\u003Cbase64-xlsx\u003E\u0022, \u0022password\u0022: \u0022secret\u0022}","parameters":[{"name":"file","required":true,"desc":"Base64 Excel file (.xlsx, encrypted or unencrypted)"},{"name":"password","required":false,"desc":"Open password, required when the workbook is encrypted"}]},{"name":"ParseCsv","category":"excel-csv","tokens":1,"description":"Parse CSV into structured JSON.","responseType":"json","sample":"{\u0022csv\u0022: \u0022name,email\\nJohn,john@test.com\u0022, \u0022options\u0022: {\u0022hasHeaders\u0022: true}}","parameters":[{"name":"csv","required":true,"desc":"CSV string or base64"},{"name":"options.delimiter","required":false,"desc":"Delimiter character"},{"name":"options.hasHeaders","required":false,"desc":"First row has headers"}]},{"name":"JsonToExcel","category":"excel-csv","tokens":1,"description":"Convert JSON data to an Excel file.","responseType":"json","sample":"{\u0022data\u0022: [{\u0022name\u0022: \u0022John\u0022, \u0022email\u0022: \u0022john@test.com\u0022}], \u0022worksheetName\u0022: \u0022Users\u0022}","parameters":[{"name":"data","required":true,"desc":"Array of objects"},{"name":"worksheetName","required":false,"desc":"Worksheet name"},{"name":"headers","required":false,"desc":"Column order and header row; taken from the keys of the first object when omitted"}]},{"name":"ExcelPopulateTemplate","category":"excel-csv","tokens":1,"description":"Find {placeholder} cells in an Excel template and replace with JSON values.","responseType":"json","sample":"{\u0022file\u0022: \u0022\u003Cbase64-xlsx\u003E\u0022, \u0022data\u0022: {\u0022name\u0022: \u0022John Doe\u0022, \u0022total\u0022: \u00221500.00\u0022}}","parameters":[{"name":"file","required":true,"desc":"Base64-encoded XLSX file"},{"name":"data","required":true,"desc":"Key-value pairs mapping placeholders to values"},{"name":"worksheet","required":false,"desc":"Specific sheet name"}]},{"name":"ExcelAddWatermark","category":"excel-csv","tokens":1,"description":"Add a diagonal text watermark as a background image to Excel worksheets.","responseType":"json","sample":"{\u0022file\u0022: \u0022\u003Cbase64-xlsx\u003E\u0022, \u0022text\u0022: \u0022DRAFT\u0022, \u0022fontSize\u0022: 48, \u0022opacity\u0022: 0.3}","parameters":[{"name":"file","required":true,"desc":"Base64-encoded XLSX file"},{"name":"text","required":true,"desc":"Watermark text"},{"name":"fontSize","required":false,"desc":"Font size"},{"name":"opacity","required":false,"desc":"Opacity 0-1"},{"name":"color","required":false,"desc":"Hex color"}]},{"name":"ExcelHeaderFooter","category":"excel-csv","tokens":1,"description":"Set headers and footers on Excel worksheets.","responseType":"json","sample":"{\u0022file\u0022: \u0022\u003Cbase64-xlsx\u003E\u0022, \u0022header\u0022: {\u0022center\u0022: \u0022CONFIDENTIAL\u0022}, \u0022footer\u0022: {\u0022right\u0022: \u0022Page \u0026P of \u0026N\u0022}}","parameters":[{"name":"file","required":true,"desc":"Base64-encoded XLSX file"},{"name":"header","required":false,"desc":"{left, center, right} text"},{"name":"footer","required":false,"desc":"{left, center, right} text"},{"name":"worksheet","required":false,"desc":"Specific sheet name"}]},{"name":"CreateBarcode","category":"barcode-qr","tokens":1,"description":"Generate a barcode image (Code128, EAN, UPC, etc).","responseType":"json","sample":"{\u0022data\u0022: \u00221234567890\u0022, \u0022type\u0022: \u0022code128\u0022, \u0022options\u0022: {\u0022scale\u0022: 2, \u0022height\u0022: 100}}","parameters":[{"name":"data","required":true,"desc":"Data to encode"},{"name":"type","required":false,"desc":"code128, ean13, upc, code39"},{"name":"options.scale","required":false,"desc":"Scale factor"},{"name":"options.height","required":false,"desc":"Bar height in pixels"}]},{"name":"CreateQrCode","category":"barcode-qr","tokens":1,"description":"Generate a QR code image.","responseType":"json","sample":"{\u0022data\u0022: \u0022https://example.com\u0022, \u0022options\u0022: {\u0022width\u0022: 256, \u0022errorCorrectionLevel\u0022: \u0022M\u0022}}","parameters":[{"name":"data","required":true,"desc":"Data to encode"},{"name":"options.width","required":false,"desc":"Size in pixels"},{"name":"options.errorCorrectionLevel","required":false,"desc":"L, M, Q, H"}]},{"name":"CreateSwissQrCode","category":"barcode-qr","tokens":1,"description":"Generate a Swiss QR-bill payment code.","responseType":"json","sample":"{\u0022account\u0022: \u0022CH9300762011623852957\u0022, \u0022amount\u0022: 199.95, \u0022currency\u0022: \u0022CHF\u0022, \u0022creditor\u0022: {\u0022name\u0022: \u0022Company AG\u0022, \u0022zip\u0022: \u00228000\u0022, \u0022city\u0022: \u0022Zurich\u0022, \u0022country\u0022: \u0022CH\u0022}}","parameters":[{"name":"account","required":true,"desc":"IBAN number"},{"name":"amount","required":true,"desc":"Payment amount"},{"name":"currency","required":true,"desc":"CHF or EUR"},{"name":"creditor","required":true,"desc":"{name, address, zip, city, country}"}]},{"name":"ReadBarcodeImage","category":"barcode-qr","tokens":1,"description":"Read barcodes from an image.","responseType":"json","sample":"{\u0022image\u0022: \u0022\u003Cbase64-image\u003E\u0022}","parameters":[{"name":"image","required":true,"desc":"Base64-encoded image"}]},{"name":"ReadQrCodeImage","category":"barcode-qr","tokens":1,"description":"Read QR codes from an image.","responseType":"json","sample":"{\u0022image\u0022: \u0022\u003Cbase64-image\u003E\u0022}","parameters":[{"name":"image","required":true,"desc":"Base64-encoded image"}]},{"name":"ReadSwissQrCode","category":"barcode-qr","tokens":1,"description":"Read and parse Swiss QR-bill data.","responseType":"json","sample":"{\u0022image\u0022: \u0022\u003Cbase64-image\u003E\u0022}","parameters":[{"name":"image","required":true,"desc":"Base64 image of QR-bill"}]},{"name":"ReadBarcodeDocument","category":"barcode-qr","tokens":2,"description":"Read barcodes from a PDF document.","responseType":"json","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022, \u0022pages\u0022: [1, 2, 3]}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"},{"name":"pages","required":false,"desc":"Array of page numbers to scan (default all)"}]},{"name":"ReadQrCodeDocument","category":"barcode-qr","tokens":2,"description":"Read QR codes from a PDF document.","responseType":"json","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022, \u0022pages\u0022: [1, 2, 3]}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"},{"name":"pages","required":false,"desc":"Array of page numbers to scan (default all)"}]},{"name":"CleanText","category":"text","tokens":1,"description":"Clean and normalize text (trim, collapse whitespace, remove control chars).","responseType":"json","sample":"{\u0022text\u0022: \u0022  Hello   World  \u0022, \u0022options\u0022: {\u0022removeExtraSpaces\u0022: true, \u0022removeControlChars\u0022: true}}","parameters":[{"name":"text","required":true,"desc":"Text to clean"},{"name":"options","required":false,"desc":"{removeExtraSpaces, removeHtml, removeControlChars, removeSpecialChars}"}]},{"name":"CompareText","category":"text","tokens":1,"description":"Compare two text strings and return differences.","responseType":"json","sample":"{\u0022text1\u0022: \u0022Hello World\u0022, \u0022text2\u0022: \u0022Hello world\u0022, \u0022options\u0022: {\u0022caseSensitive\u0022: true}}","parameters":[{"name":"text1","required":true,"desc":"First text"},{"name":"text2","required":true,"desc":"Second text"},{"name":"options.caseSensitive","required":false,"desc":"Case-sensitive comparison"},{"name":"options.trimWhitespace","required":false,"desc":"Trim leading and trailing whitespace before comparing. Send false to compare the strings exactly as given"}]},{"name":"ConcatenateText","category":"text","tokens":1,"description":"Concatenate multiple strings with separator.","responseType":"json","sample":"{\u0022texts\u0022: [\u0022Hello\u0022, \u0022World\u0022], \u0022separator\u0022: \u0022 \u0022}","parameters":[{"name":"texts","required":true,"desc":"Array of strings"},{"name":"separator","required":false,"desc":"Separator"}]},{"name":"ConvertJsonToXml","category":"text","tokens":1,"description":"Convert JSON to XML format.","responseType":"json","sample":"{\u0022json\u0022: {\u0022name\u0022: \u0022John\u0022, \u0022age\u0022: 30}, \u0022options\u0022: {\u0022rootName\u0022: \u0022person\u0022}}","parameters":[{"name":"json","required":true,"desc":"JSON object"},{"name":"options.rootName","required":false,"desc":"Root element name"},{"name":"options.indentation","required":false,"desc":"The literal string used to indent each nesting level \u2014 two spaces by default, or \u0022\\t\u0022 for tabs. It is passed straight through to the XML writer, so a number here indents with that digit"}]},{"name":"ConvertXmlToJson","category":"text","tokens":1,"description":"Convert XML to JSON format.","responseType":"json","sample":"{\u0022xml\u0022: \u0022\u003Cperson\u003E\u003Cname\u003EJohn\u003C/name\u003E\u003Cage\u003E30\u003C/age\u003E\u003C/person\u003E\u0022}","parameters":[{"name":"xml","required":true,"desc":"XML string"}]},{"name":"ExtractEmailAddresses","category":"text","tokens":1,"description":"Extract all email addresses from text.","responseType":"json","sample":"{\u0022text\u0022: \u0022Contact john@example.com or jane@test.com\u0022}","parameters":[{"name":"text","required":true,"desc":"Text to search"}]},{"name":"ExtractTextBetween","category":"text","tokens":1,"description":"Extract text between two markers.","responseType":"json","sample":"{\u0022text\u0022: \u0022Hello [World] Goodbye\u0022, \u0022startDelimiter\u0022: \u0022[\u0022, \u0022endDelimiter\u0022: \u0022]\u0022}","parameters":[{"name":"text","required":true,"desc":"Source text"},{"name":"startDelimiter","required":true,"desc":"Start marker"},{"name":"endDelimiter","required":true,"desc":"End marker"}]},{"name":"ExtractUrls","category":"text","tokens":1,"description":"Extract all URLs from text.","responseType":"json","sample":"{\u0022text\u0022: \u0022Visit https://example.com or http://test.com\u0022}","parameters":[{"name":"text","required":true,"desc":"Text to search"}]},{"name":"FormatDate","category":"text","tokens":1,"description":"Format a date to a specified pattern.","responseType":"json","sample":"{\u0022date\u0022: \u00222026-01-15T10:30:00Z\u0022, \u0022format\u0022: \u0022DD/MM/YYYY HH:mm\u0022}","parameters":[{"name":"date","required":true,"desc":"Date string or ISO date"},{"name":"format","required":true,"desc":"Output format: YYYY-MM-DD, DD/MM/YYYY, etc"},{"name":"timezone","required":false,"desc":"IANA time zone the output is rendered in, e.g. America/Chicago"}]},{"name":"GenerateGuid","category":"text","tokens":1,"description":"Generate a UUID/GUID.","responseType":"json","sample":"{\u0022format\u0022: \u0022standard\u0022}","parameters":[{"name":"format","required":false,"desc":"standard is lowercase with dashes, noDashes is the 32 characters without dashes, uppercase is standard in capitals"}]},{"name":"GeneratePassword","category":"text","tokens":1,"description":"Generate a secure random password.","responseType":"json","sample":"{\u0022length\u0022: 20, \u0022options\u0022: {\u0022uppercase\u0022: true, \u0022numbers\u0022: true, \u0022symbols\u0022: true}}","parameters":[{"name":"length","required":false,"desc":"Password length"},{"name":"options.uppercase","required":false,"desc":"Include uppercase"},{"name":"options.numbers","required":false,"desc":"Include numbers"},{"name":"options.symbols","required":false,"desc":"Include symbols \u2014 opt in, unlike the other three character classes"}]},{"name":"GenerateRandomNumber","category":"text","tokens":1,"description":"Generate random number in a range.","responseType":"json","sample":"{\u0022min\u0022: 1, \u0022max\u0022: 1000, \u0022count\u0022: 3}","parameters":[{"name":"min","required":false,"desc":"Minimum value (inclusive)"},{"name":"max","required":false,"desc":"Maximum value (inclusive)"},{"name":"count","required":false,"desc":"How many numbers to draw, a whole number from 1 to 1000. The response is always an array, even when count is 1"},{"name":"decimals","required":false,"desc":"Decimal places, a whole number from 0 to 15. 0 draws whole numbers"}]},{"name":"GetDateDifference","category":"text","tokens":1,"description":"Calculate difference between two dates.","responseType":"json","sample":"{\u0022date1\u0022: \u00222026-01-01\u0022, \u0022date2\u0022: \u00222026-12-31\u0022, \u0022unit\u0022: \u0022days\u0022}","parameters":[{"name":"date1","required":true,"desc":"First date"},{"name":"date2","required":true,"desc":"Second date"},{"name":"unit","required":false,"desc":"days, hours, minutes, seconds"}]},{"name":"GetFileExtension","category":"text","tokens":1,"description":"Get file extension from a filename.","responseType":"json","sample":"{\u0022filename\u0022: \u0022document.pdf\u0022}","parameters":[{"name":"filename","required":true,"desc":"Filename or path"}]},{"name":"HtmlEscape","category":"text","tokens":1,"description":"Escape HTML special characters.","responseType":"json","sample":"{\u0022text\u0022: \u0022\u003Cscript\u003Ealert(\u0027XSS\u0027)\u003C/script\u003E\u0022}","parameters":[{"name":"text","required":true,"desc":"Text to escape"}]},{"name":"HtmlUnescape","category":"text","tokens":1,"description":"Unescape HTML entities.","responseType":"json","sample":"{\u0022text\u0022: \u0022\u0026lt;p\u0026gt;Hello \u0026amp; World\u0026lt;/p\u0026gt;\u0022}","parameters":[{"name":"text","required":true,"desc":"Text with HTML entities"}]},{"name":"ParseHtmlTable","category":"text","tokens":1,"description":"Parse HTML table to JSON rows.","responseType":"json","sample":"{\u0022html\u0022: \u0022\u003Ctable\u003E\u003Ctr\u003E\u003Cth\u003EName\u003C/th\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003EJohn\u003C/td\u003E\u003C/tr\u003E\u003C/table\u003E\u0022}","parameters":[{"name":"html","required":true,"desc":"HTML containing a table"},{"name":"options.hasHeaders","required":false,"desc":"First row is headers"},{"name":"options.tableIndex","required":false,"desc":"Which table to read when the HTML holds several, 0-based"}]},{"name":"RemoveDiacritics","category":"text","tokens":1,"description":"Remove accent marks from text.","responseType":"json","sample":"{\u0022text\u0022: \u0022Hello World cafe resume\u0022}","parameters":[{"name":"text","required":true,"desc":"Text with diacritics"}]},{"name":"RegexReplace","category":"text","tokens":1,"description":"Replace text using regular expression.","responseType":"json","sample":"{\u0022text\u0022: \u0022Hello 123 World 456\u0022, \u0022pattern\u0022: \u0022\\\\d\u002B\u0022, \u0022replacement\u0022: \u0022#\u0022, \u0022flags\u0022: \u0022g\u0022}","parameters":[{"name":"text","required":true,"desc":"Source text"},{"name":"pattern","required":true,"desc":"Regex pattern"},{"name":"replacement","required":true,"desc":"Replacement string"},{"name":"flags","required":false,"desc":"g, i, m"}]},{"name":"SplitText","category":"text","tokens":1,"description":"Split text by delimiter.","responseType":"json","sample":"{\u0022text\u0022: \u0022apple,banana,cherry\u0022, \u0022delimiter\u0022: \u0022,\u0022}","parameters":[{"name":"text","required":true,"desc":"Text to split"},{"name":"delimiter","required":true,"desc":"Delimiter"}]},{"name":"SplitTextRegex","category":"text","tokens":1,"description":"Split text using a regular expression.","responseType":"json","sample":"{\u0022text\u0022: \u0022apple123banana456cherry\u0022, \u0022pattern\u0022: \u0022\\\\d\u002B\u0022}","parameters":[{"name":"text","required":true,"desc":"Text to split"},{"name":"pattern","required":true,"desc":"Regex pattern"}]},{"name":"TextChangeCase","category":"text","tokens":1,"description":"Change text case (upper, lower, title, camel, etc).","responseType":"json","sample":"{\u0022text\u0022: \u0022hello world example\u0022, \u0022caseType\u0022: \u0022title\u0022}","parameters":[{"name":"text","required":true,"desc":"Text to transform"},{"name":"caseType","required":true,"desc":"upper, lower, title, sentence, camel, pascal, snake, kebab"}]},{"name":"ValidateEmail","category":"text","tokens":1,"description":"Validate an email address format.","responseType":"json","sample":"{\u0022email\u0022: \u0022user@example.com\u0022}","parameters":[{"name":"email","required":true,"desc":"Email to validate"}]},{"name":"ValidateGuid","category":"text","tokens":1,"description":"Validate a GUID/UUID format.","responseType":"json","sample":"{\u0022guid\u0022: \u0022550e8400-e29b-41d4-a716-446655440000\u0022}","parameters":[{"name":"guid","required":true,"desc":"GUID to validate"}]},{"name":"ValidateJson","category":"text","tokens":1,"description":"Validate a JSON string.","responseType":"json","sample":"{\u0022json\u0022: \u0022{\\\u0022name\\\u0022:\\\u0022John\\\u0022,\\\u0022age\\\u0022:30}\u0022}","parameters":[{"name":"json","required":true,"desc":"JSON string to validate"}]},{"name":"ValidateUrl","category":"text","tokens":1,"description":"Validate a URL format.","responseType":"json","sample":"{\u0022url\u0022: \u0022https://example.com/path?query=value\u0022}","parameters":[{"name":"url","required":true,"desc":"URL to validate"}]},{"name":"VerifyUrlAvailable","category":"text","tokens":1,"description":"Check if a URL is reachable.","responseType":"json","sample":"{\u0022url\u0022: \u0022https://example.com\u0022, \u0022timeout\u0022: 5000}","parameters":[{"name":"url","required":true,"desc":"URL to check"},{"name":"timeout","required":false,"desc":"Timeout in ms"}]},{"name":"ArrayAddItem","category":"array","tokens":1,"description":"Add an item to an array.","responseType":"json","sample":"{\u0022array\u0022: [\u0022a\u0022, \u0022b\u0022, \u0022c\u0022], \u0022item\u0022: \u0022d\u0022}","parameters":[{"name":"array","required":true,"desc":"Source array"},{"name":"item","required":true,"desc":"Item to add"},{"name":"index","required":false,"desc":"Zero-based index to insert at; the item is appended when omitted"}]},{"name":"ArrayCombine","category":"array","tokens":1,"description":"Combine two arrays into an object (keys \u002B values).","responseType":"json","sample":"{\u0022array1\u0022: [\u0022name\u0022, \u0022age\u0022], \u0022array2\u0022: [\u0022John\u0022, 30]}","parameters":[{"name":"array1","required":true,"desc":"Array of keys"},{"name":"array2","required":true,"desc":"Array of values"}]},{"name":"ArrayContains","category":"array","tokens":1,"description":"Check if array contains a value.","responseType":"json","sample":"{\u0022array\u0022: [\u0022Apple\u0022, \u0022Banana\u0022], \u0022value\u0022: \u0022banana\u0022, \u0022caseSensitive\u0022: false}","parameters":[{"name":"array","required":true,"desc":"Array to search"},{"name":"value","required":true,"desc":"Value to find. Case matters unless caseSensitive is false"},{"name":"field","required":false,"desc":"Compare this property of each item instead of the item itself"},{"name":"caseSensitive","required":false,"desc":"Send false to match text regardless of case. Numbers, true/false values and objects always compare exactly"}]},{"name":"ArrayCount","category":"array","tokens":1,"description":"Count items in an array.","responseType":"json","sample":"{\u0022array\u0022: [1, 2, 3, 4, 5]}","parameters":[{"name":"array","required":true,"desc":"Array to count"}]},{"name":"ArrayFilter","category":"array","tokens":1,"description":"Filter array by condition.","responseType":"json","sample":"{\u0022array\u0022: [{\u0022name\u0022: \u0022apple\u0022}, {\u0022name\u0022: \u0022banana\u0022}], \u0022field\u0022: \u0022name\u0022, \u0022operator\u0022: \u0022startsWith\u0022, \u0022value\u0022: \u0022ap\u0022}","parameters":[{"name":"array","required":true,"desc":"Array to filter"},{"name":"field","required":true,"desc":"Field to check"},{"name":"operator","required":true,"desc":"equals, contains, startsWith, gt, lt"},{"name":"value","required":true,"desc":"Value to match"}]},{"name":"ArrayFilterRegex","category":"array","tokens":1,"description":"Filter array items using regex.","responseType":"json","sample":"{\u0022array\u0022: [\u0022apple\u0022, \u0022banana\u0022, \u0022avocado\u0022], \u0022pattern\u0022: \u0022^a\u0022}","parameters":[{"name":"array","required":true,"desc":"Array of strings"},{"name":"pattern","required":true,"desc":"Regex pattern"},{"name":"flags","required":false,"desc":"Regex flags, e.g. \u0022i\u0022 for case-insensitive"},{"name":"field","required":false,"desc":"Test this property of each item instead of the item itself"},{"name":"invert","required":false,"desc":"Send true to keep the items that do NOT match instead, the same result as Array Remove by Regex"}]},{"name":"ArrayGetItem","category":"array","tokens":1,"description":"Get item by index.","responseType":"json","sample":"{\u0022array\u0022: [\u0022first\u0022, \u0022second\u0022, \u0022third\u0022], \u0022index\u0022: -1}","parameters":[{"name":"array","required":true,"desc":"Source array"},{"name":"index","required":true,"desc":"Zero-based index (-1 for last)"}]},{"name":"ArrayMerge","category":"array","tokens":1,"description":"Merge multiple arrays.","responseType":"json","sample":"{\u0022arrays\u0022: [[1, 2], [2, 3]], \u0022unique\u0022: true}","parameters":[{"name":"arrays","required":true,"desc":"Array of arrays"},{"name":"unique","required":false,"desc":"Send true to drop repeated values, keeping the first one, by the same rule as Array Remove Duplicates"}]},{"name":"ArrayRemoveDuplicates","category":"array","tokens":1,"description":"Remove duplicate values.","responseType":"json","sample":"{\u0022array\u0022: [\u0022a\u0022, \u0022b\u0022, \u0022a\u0022, \u0022c\u0022, \u0022b\u0022]}","parameters":[{"name":"array","required":true,"desc":"Array with duplicates"}]},{"name":"ArrayRemoveItem","category":"array","tokens":1,"description":"Remove items by value.","responseType":"json","sample":"{\u0022array\u0022: [1, 2, 3, 2, 4], \u0022value\u0022: 2}","parameters":[{"name":"array","required":true,"desc":"Source array"},{"name":"value","required":true,"desc":"Value to remove"},{"name":"removeAll","required":false,"desc":"Remove every occurrence. Only the FIRST match is removed when omitted"}]},{"name":"ArrayRemoveRegex","category":"array","tokens":1,"description":"Remove items matching regex.","responseType":"json","sample":"{\u0022array\u0022: [\u0022apple\u0022, \u0022banana\u0022, \u0022avocado\u0022], \u0022pattern\u0022: \u0022^a\u0022}","parameters":[{"name":"array","required":true,"desc":"Array of strings"},{"name":"pattern","required":true,"desc":"Regex pattern"}]},{"name":"ArrayReplace","category":"array","tokens":1,"description":"Replace values in an array.","responseType":"json","sample":"{\u0022array\u0022: [\u0022hello\u0022, \u0022world\u0022, \u0022hello\u0022], \u0022find\u0022: \u0022hello\u0022, \u0022replace\u0022: \u0022hi\u0022}","parameters":[{"name":"array","required":true,"desc":"Source array"},{"name":"find","required":true,"desc":"Value to find"},{"name":"replace","required":true,"desc":"Replacement value"}]},{"name":"ArrayReverse","category":"array","tokens":1,"description":"Reverse array order.","responseType":"json","sample":"{\u0022array\u0022: [1, 2, 3, 4, 5]}","parameters":[{"name":"array","required":true,"desc":"Array to reverse"}]},{"name":"ArraySort","category":"array","tokens":1,"description":"Sort an array.","responseType":"json","sample":"{\u0022array\u0022: [3, 1, 4, 1, 5, 9], \u0022direction\u0022: \u0022asc\u0022}","parameters":[{"name":"array","required":true,"desc":"Array to sort"},{"name":"direction","required":false,"desc":"asc or desc"},{"name":"field","required":false,"desc":"Property name to sort objects by"},{"name":"type","required":false,"desc":"Compare values as this type"}]},{"name":"ArraySplit","category":"array","tokens":1,"description":"Split array into chunks.","responseType":"json","sample":"{\u0022array\u0022: [1, 2, 3, 4, 5, 6, 7, 8, 9], \u0022chunkSize\u0022: 3}","parameters":[{"name":"array","required":true,"desc":"Array to split"},{"name":"chunkSize","required":true,"desc":"Chunk size"}]},{"name":"ArrayToJson","category":"array","tokens":1,"description":"Convert array to JSON string.","responseType":"json","sample":"{\u0022array\u0022: [{\u0022name\u0022: \u0022John\u0022}], \u0022pretty\u0022: true}","parameters":[{"name":"array","required":true,"desc":"Array to convert"},{"name":"pretty","required":false,"desc":"Pretty-print"}]},{"name":"ArrayToXml","category":"array","tokens":1,"description":"Convert array to XML.","responseType":"json","sample":"{\u0022array\u0022: [\u0022apple\u0022, \u0022banana\u0022], \u0022rootName\u0022: \u0022fruits\u0022, \u0022itemName\u0022: \u0022fruit\u0022}","parameters":[{"name":"array","required":true,"desc":"Array to convert"},{"name":"rootName","required":false,"desc":"Root element name"},{"name":"itemName","required":false,"desc":"Item element name"}]},{"name":"HashDocument","category":"crypto","tokens":1,"description":"Compute a SHA-256, SHA-512 or SHA-0Z fingerprint of any document for integrity verification. SHA-0Z is a 100-character SHAKE256 fingerprint written in base 36; what is computed today is SHA-0Z version 1, so a sha0z response also carries algorithmVersion 1, and sha0z-v1 is accepted as another name for sha0z. SHA-1 and MD5 remain available as legacy algorithms and are flagged legacy-insecure. Supports HMAC with a salt for keyed hashing (hex algorithms only). Optionally verify a document against a previously stored hash.","responseType":"json","sample":"{\u0022file\u0022: \u0022SGVsbG8gV29ybGQ=\u0022, \u0022algorithm\u0022: \u0022sha256\u0022}","parameters":[{"name":"file","required":true,"desc":"Base64-encoded document"},{"name":"algorithm","required":false,"desc":"sha256, sha512, or sha0z (SHA-0Z version 1: a 100-character SHAKE256 fingerprint in base 36; sha0z-v1 is the same). Legacy: sha1, md5"},{"name":"compareHash","required":false,"desc":"Hash to verify against (hex for sha256/sha512, 100 base-36 characters for sha0z; case-insensitive)"},{"name":"salt","required":false,"desc":"HMAC salt for keyed hashing (not available with sha0z)"}]},{"name":"AnchorHash","category":"crypto","tokens":1,"description":"Write a document hash to a tamper-evident confidential ledger for certification. The hash is stored immutably together with the algorithm that produced it, and can be independently verified by any party. Accepts exactly what HashDocument returns: a SHA-256 or SHA-512 hex digest, or a 100-character SHA-0Z base-36 fingerprint (legacy SHA-1 and MD5 are accepted and flagged legacy-insecure). A sha0z anchor\u0027s response also carries algorithmVersion 1. Use with HashDocument for a complete certification flow. Anchor an unsalted digest: a keyed (salt/HMAC) digest has the same shape as the plain one, is recorded under the plain algorithm, and cannot be recomputed by anyone without the salt.","responseType":"json","sample":"{\u0022hash\u0022: \u0022a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e\u0022, \u0022algorithm\u0022: \u0022sha256\u0022}","parameters":[{"name":"hash","required":true,"desc":"The digest to anchor, as HashDocument returns it: hex for sha256/sha512 (64/128 characters), 100 base-36 characters for sha0z. Case-insensitive; checked against the algorithm"},{"name":"algorithm","required":false,"desc":"The algorithm that produced the hash, recorded on the anchor: sha256, sha512, or sha0z (SHA-0Z version 1; sha0z-v1 is recorded as sha0z). Legacy: sha1, md5"},{"name":"metadata","required":false,"desc":"Optional JSON object stored under its own metadata key on the anchor, so it cannot restate the hash, algorithm or owner. Anything other than an object is refused"}]},{"name":"VerifyAnchor","category":"crypto","tokens":1,"description":"Verify a document hash exists in the confidential ledger by transaction ID. Optionally compare a provided hash against the stored ledger entry to confirm document integrity. Returns the algorithm recorded on the anchor; an anchor written before algorithms were recorded reads as sha256 when its hash is 64 hex characters. A sha0z anchor also carries algorithmVersion 1.","responseType":"json","sample":"{\u0022transactionId\u0022: \u00222.315\u0022, \u0022hash\u0022: \u0022a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e\u0022}","parameters":[{"name":"transactionId","required":true,"desc":"Transaction ID from AnchorHash response"},{"name":"hash","required":false,"desc":"Hash to compare against the ledger entry: hex, or 100 base-36 characters for a sha0z anchor (case-insensitive)"}]},{"name":"AesEncrypt","category":"crypto","tokens":1,"description":"AES encrypt data with a key.","responseType":"json","sample":"{\u0022data\u0022: \u0022Hello secret world\u0022, \u0022key\u0022: \u0022my-secret-key-32-chars-long!!!!!\u0022}","parameters":[{"name":"data","required":true,"desc":"Data to encrypt"},{"name":"key","required":true,"desc":"Encryption key"},{"name":"algorithm","required":false,"desc":"aes-256-cbc, aes-128-cbc, aes-256-gcm"}]},{"name":"AesDecrypt","category":"crypto","tokens":1,"description":"AES decrypt data with a key.","responseType":"json","sample":"{\u0022encrypted\u0022: \u0022\u003Cbase64\u003E\u0022, \u0022key\u0022: \u0022my-secret-key-32-chars-long!!!!!\u0022, \u0022iv\u0022: \u0022\u003Cbase64\u003E\u0022}","parameters":[{"name":"encrypted","required":true,"desc":"Encrypted data"},{"name":"key","required":true,"desc":"Decryption key"},{"name":"iv","required":true,"desc":"Initialization vector"},{"name":"algorithm","required":false,"desc":"Algorithm used"}]},{"name":"RsaEncrypt","category":"crypto","tokens":1,"description":"RSA encrypt with public key.","responseType":"json","sample":"{\u0022data\u0022: \u0022Secret message\u0022, \u0022publicKey\u0022: \u0022-----BEGIN PUBLIC KEY-----...\u0022}","parameters":[{"name":"data","required":true,"desc":"Data to encrypt"},{"name":"publicKey","required":true,"desc":"PEM-format public key"}]},{"name":"RsaDecrypt","category":"crypto","tokens":1,"description":"RSA decrypt with private key.","responseType":"json","sample":"{\u0022encrypted\u0022: \u0022\u003Cbase64\u003E\u0022, \u0022privateKey\u0022: \u0022-----BEGIN PRIVATE KEY-----...\u0022}","parameters":[{"name":"encrypted","required":true,"desc":"Encrypted data"},{"name":"privateKey","required":true,"desc":"PEM-format private key"}]},{"name":"GenerateRsaKeyPair","category":"crypto","tokens":1,"description":"Generate an RSA public/private key pair.","responseType":"json","sample":"{\u0022modulusLength\u0022: 2048}","parameters":[{"name":"modulusLength","required":false,"desc":"2048 or 4096"}]},{"name":"GenerateHash","category":"crypto","tokens":1,"description":"Generate a hash digest.","responseType":"json","sample":"{\u0022data\u0022: \u0022Hello World\u0022, \u0022algorithm\u0022: \u0022sha256\u0022}","parameters":[{"name":"data","required":true,"desc":"Data to hash"},{"name":"algorithm","required":false,"desc":"sha256, sha512, md5, sha1"},{"name":"encoding","required":false,"desc":"hex or base64"}]},{"name":"GenerateHmac","category":"crypto","tokens":1,"description":"Generate an HMAC signature.","responseType":"json","sample":"{\u0022data\u0022: \u0022Hello World\u0022, \u0022key\u0022: \u0022my-secret\u0022, \u0022algorithm\u0022: \u0022sha256\u0022}","parameters":[{"name":"data","required":true,"desc":"Data to sign"},{"name":"key","required":true,"desc":"Secret key"},{"name":"algorithm","required":false,"desc":"sha256, sha512"}]},{"name":"GenerateJwt","category":"crypto","tokens":1,"description":"Generate a signed JWT token.","responseType":"json","sample":"{\u0022payload\u0022: {\u0022sub\u0022: \u0022user123\u0022, \u0022name\u0022: \u0022John\u0022}, \u0022secret\u0022: \u0022your-secret\u0022, \u0022options\u0022: {\u0022algorithm\u0022: \u0022HS256\u0022, \u0022expiresIn\u0022: \u00221h\u0022}}","parameters":[{"name":"payload","required":true,"desc":"JWT payload"},{"name":"secret","required":true,"desc":"Signing secret"},{"name":"options.algorithm","required":false,"desc":"HS256, RS256"},{"name":"options.expiresIn","required":false,"desc":"Expiry: 1h, 7d, 30m"}]},{"name":"CreateZip","category":"archive","tokens":1,"description":"Create a ZIP archive from multiple files.","responseType":"json","sample":"{\u0022files\u0022: [{\u0022name\u0022: \u0022file1.txt\u0022, \u0022content\u0022: \u0022SGVsbG8=\u0022}, {\u0022name\u0022: \u0022file2.txt\u0022, \u0022content\u0022: \u0022V29ybGQ=\u0022}]}","parameters":[{"name":"files","required":true,"desc":"Array of {name, content (base64)}"},{"name":"compression","required":false,"desc":"deflate or store"},{"name":"level","required":false,"desc":"Deflate level 0-9"}]},{"name":"ExtractZip","category":"archive","tokens":1,"description":"Extract all files from a ZIP archive.","responseType":"json","sample":"{\u0022zip\u0022: \u0022\u003Cbase64-zip\u003E\u0022}","parameters":[{"name":"zip","required":true,"desc":"Base64-encoded ZIP"}]},{"name":"ExtractZipV2","category":"archive","tokens":1,"description":"Extract ZIP with filtering and path options.","responseType":"json","sample":"{\u0022zip\u0022: \u0022\u003Cbase64-zip\u003E\u0022, \u0022filter\u0022: \u0022*.pdf\u0022, \u0022flatExtract\u0022: true}","parameters":[{"name":"zip","required":true,"desc":"Base64-encoded ZIP"},{"name":"filter","required":false,"desc":"Glob pattern to filter"},{"name":"flatExtract","required":false,"desc":"Ignore the folder structure and return every entry by file name alone"},{"name":"maxFiles","required":false,"desc":"Stop after this many entries; 0 means no limit"}]},{"name":"UpdateZipEntry","category":"archive","tokens":1,"description":"Replace one named entry inside an existing ZIP. Every other entry is preserved byte-for-byte.","responseType":"json","sample":"{\u0022zip\u0022: \u0022\u003Cbase64-zip\u003E\u0022, \u0022path\u0022: \u0022data/proposal-data.json\u0022, \u0022contentText\u0022: \u0022{\\\u0022client\\\u0022:\\\u0022Contoso\\\u0022}\u0022}","parameters":[{"name":"zip","required":true,"desc":"Base64-encoded ZIP"},{"name":"path","required":true,"desc":"Entry path inside the archive, e.g. data/proposal-data.json"},{"name":"contentText","required":false,"desc":"New content as a UTF-8 string (e.g. JSON)"},{"name":"content","required":false,"desc":"Or: new content, base64-encoded"},{"name":"entries","required":false,"desc":"Or: array of {path, content|contentText} to replace several in one call"},{"name":"createIfMissing","required":false,"desc":"Insert the path if it is not already in the archive"},{"name":"compression","required":false,"desc":"deflate or store (written entries only)"},{"name":"level","required":false,"desc":"0-9"}]},{"name":"ReadZipEntry","category":"archive","tokens":1,"description":"Read one named entry out of a ZIP without extracting the whole archive.","responseType":"json","sample":"{\u0022zip\u0022: \u0022\u003Cbase64-zip\u003E\u0022, \u0022path\u0022: \u0022data/proposal-data.json\u0022, \u0022asText\u0022: true}","parameters":[{"name":"zip","required":true,"desc":"Base64-encoded ZIP"},{"name":"path","required":true,"desc":"Entry path inside the archive"},{"name":"asText","required":false,"desc":"Also return the entry decoded as a UTF-8 string"}]},{"name":"SendEmail","category":"email-web","tokens":1,"description":"Send an HTML email from DocButterfly\u0027s sender.","responseType":"json","sample":"{\u0022to\u0022: [\u0022recipient@example.com\u0022], \u0022subject\u0022: \u0022Test from DocFlow\u0022, \u0022body\u0022: \u0022\u003Ch1\u003EHello\u003C/h1\u003E\u003Cp\u003ESent via DocFlow API.\u003C/p\u003E\u0022}","parameters":[{"name":"to","required":true,"desc":"Recipient(s)"},{"name":"subject","required":true,"desc":"Subject line"},{"name":"body","required":true,"desc":"HTML body"},{"name":"cc","required":false,"desc":"CC recipients"},{"name":"bcc","required":false,"desc":"BCC recipients"},{"name":"attachments","required":false,"desc":"Array of {name, contentType, content}"},{"name":"importance","required":false,"desc":"normal, high, low"},{"name":"saveToSentItems","required":false,"desc":"Keep a copy of the message in the mailbox we send from. Only for accounts we enable on request; ignored for every other account"}]},{"name":"ParseEmail","category":"email-web","tokens":1,"description":"Parse an email\u0027s metadata: EML/MIME or Outlook .msg.","responseType":"json","sample":"{\u0022email\u0022: \u0022\u003Cbase64-eml\u003E\u0022}","parameters":[{"name":"email","required":true,"desc":"Base64 EML/MIME message or Outlook .msg file"}]},{"name":"ExtractEmailAttachments","category":"email-web","tokens":1,"description":"Extract the attachments from an email: EML/MIME or Outlook .msg.","responseType":"json","sample":"{\u0022email\u0022: \u0022\u003Cbase64-eml\u003E\u0022}","parameters":[{"name":"email","required":true,"desc":"Base64 EML/MIME message or Outlook .msg file"}]},{"name":"ConvertEmailToPdf","category":"email-web","tokens":2,"description":"Turn an email (EML/MIME or Outlook .msg) into one PDF: a From, To, Date and Subject header, the message, a page listing its attachments, then its PDF attachments.","responseType":"pdf","sample":"{\u0022email\u0022: \u0022\u003Cbase64-eml-or-msg\u003E\u0022}","parameters":[{"name":"email","required":true,"desc":"Base64 EML/MIME message or Outlook .msg file"},{"name":"includeAttachments","required":false,"desc":"List every attachment on a page of its own and add the PDF attachments after the message"},{"name":"options.loadRemoteImages","required":false,"desc":"Fetch the https images the message links to on the web. Off, only the images inside the email show"},{"name":"options.pageSize","required":false,"desc":"Named paper size \u2014 see the paper-size table on the API reference overview. Case- and punctuation-insensitive; aliases such as \u0022US Letter\u0022 are accepted. Via raw JSON a custom size object is also accepted: {\u0022width\u0022: n, \u0022height\u0022: n, \u0022units\u0022: \u0022pt|px|in|mm|cm\u0022} (units default pt; 1-14400pt / 200in per side). An unknown size, unit, or orientation returns 400 \u2014 nothing silently falls back"},{"name":"options.orientation","required":false,"desc":"Page orientation. \u0022landscape\u0022 puts the long edge horizontal. Omit to keep the size\u0027s own orientation (portrait for every named size except Ledger)"},{"name":"options.margin","required":false,"desc":"Page margins {top, right, bottom, left}"}]},{"name":"CaptureWebPage","category":"email-web","tokens":2,"description":"Capture a URL as PDF or screenshot.","responseType":"pdf","sample":"{\u0022url\u0022: \u0022https://example.com\u0022, \u0022output\u0022: \u0022pdf\u0022, \u0022options\u0022: {\u0022pageSize\u0022: \u0022Letter\u0022}, \u0022returnBase64\u0022: true}","parameters":[{"name":"url","required":true,"desc":"URL to capture"},{"name":"output","required":false,"desc":"pdf or screenshot"},{"name":"options.captureMode","required":false,"desc":"screen (full visual fidelity), print (traditional), fast (minimal wait)"},{"name":"options.pageSize","required":false,"desc":"Named paper size \u2014 see the paper-size table on the API reference overview. Case- and punctuation-insensitive; aliases such as \u0022US Letter\u0022 are accepted. Via raw JSON a custom size object is also accepted: {\u0022width\u0022: n, \u0022height\u0022: n, \u0022units\u0022: \u0022pt|px|in|mm|cm\u0022} (units default pt; 1-14400pt / 200in per side). An unknown size, unit, or orientation returns 400 \u2014 nothing silently falls back. PDF output only; legacy key options.format is still accepted"},{"name":"options.orientation","required":false,"desc":"Page orientation. \u0022landscape\u0022 puts the long edge horizontal. Omit to keep the size\u0027s own orientation (portrait for every named size except Ledger)"},{"name":"options.fullPage","required":false,"desc":"Full page capture"},{"name":"options.viewport","required":false,"desc":"{width, height} in pixels"},{"name":"options.timeout","required":false,"desc":"Navigation timeout in ms (max 60000)"},{"name":"returnBase64","required":false,"desc":"Return base64"}]},{"name":"RequestSignature","category":"ai-esign","tokens":50,"description":"Sends a document out for signature on our e-signature account, so no e-signature subscription of your own is required. Returns the envelope id immediately; each signer is emailed in routing order.","responseType":"json","sample":"{\u0022document\u0022: {\u0022name\u0022: \u0022contract.pdf\u0022, \u0022content\u0022: \u0022\u003Cbase64-pdf\u003E\u0022}, \u0022signers\u0022: [{\u0022email\u0022: \u0022signer@example.com\u0022, \u0022name\u0022: \u0022John Doe\u0022, \u0022routingOrder\u0022: 1}], \u0022emailSubject\u0022: \u0022Please sign this document\u0022, \u0022status\u0022: \u0022sent\u0022}","parameters":[{"name":"document.content","required":true,"desc":"Base64-encoded PDF to be signed"},{"name":"document.name","required":false,"desc":"File name the signers see"},{"name":"signers","required":true,"desc":"Who signs, in order: [{email, name, routingOrder, tabs}]. Every signer needs both email and name"},{"name":"emailSubject","required":false,"desc":"Subject line of the signature request email"},{"name":"emailMessage","required":false,"desc":"Body of the signature request email"},{"name":"status","required":false,"desc":"\u0022sent\u0022 mails the signers now; \u0022created\u0022 leaves the envelope as a draft in the account"}]},{"name":"RequestSignatureBYOK","category":"ai-esign","tokens":1,"description":"E-signature with your own DocuSign credentials.","responseType":"json","sample":"{\u0022document\u0022: {\u0022name\u0022: \u0022contract.pdf\u0022, \u0022content\u0022: \u0022\u003Cbase64-pdf\u003E\u0022}, \u0022signers\u0022: [{\u0022email\u0022: \u0022signer@example.com\u0022, \u0022name\u0022: \u0022John\u0022}], \u0022byok\u0022: {\u0022accountId\u0022: \u0022your-id\u0022, \u0022accessToken\u0022: \u0022your-token\u0022}, \u0022status\u0022: \u0022sent\u0022}","parameters":[{"name":"document.content","required":true,"desc":"Base64 PDF"},{"name":"signers","required":true,"desc":"Array of {email, name}"},{"name":"byok.accountId","required":true,"desc":"Your DocuSign account ID"},{"name":"byok.accessToken","required":true,"desc":"Your DocuSign access token"},{"name":"emailSubject","required":false,"desc":"Email subject"},{"name":"status","required":false,"desc":"sent or created"}]},{"name":"WordPopulateTemplate","category":"word","tokens":1,"description":"Fill {placeholder} tags in a DOCX template with JSON data.","responseType":"json","sample":"{\u0022file\u0022: \u0022\u003Cbase64-docx\u003E\u0022, \u0022data\u0022: {\u0022name\u0022: \u0022John Doe\u0022, \u0022company\u0022: \u0022ACME Corp\u0022, \u0022date\u0022: \u00222026-02-06\u0022}}","parameters":[{"name":"file","required":true,"desc":"Base64-encoded DOCX file"},{"name":"data","required":true,"desc":"Key-value pairs mapping placeholders to values"}]},{"name":"WordMergeDocuments","category":"word","tokens":1,"description":"Combine multiple DOCX files into a single document with page breaks between them.","responseType":"json","sample":"{\u0022files\u0022: [\u0022\u003Cbase64-docx-1\u003E\u0022, \u0022\u003Cbase64-docx-2\u003E\u0022]}","parameters":[{"name":"files","required":true,"desc":"Array of base64-encoded DOCX files"}]},{"name":"WordExtractText","category":"word","tokens":1,"description":"Extract plain text content from a DOCX document.","responseType":"json","sample":"{\u0022file\u0022: \u0022\u003Cbase64-docx\u003E\u0022}","parameters":[{"name":"file","required":true,"desc":"Base64-encoded DOCX file"}]},{"name":"WordExtractImages","category":"word","tokens":1,"description":"Extract all embedded images from a DOCX document.","responseType":"json","sample":"{\u0022file\u0022: \u0022\u003Cbase64-docx\u003E\u0022}","parameters":[{"name":"file","required":true,"desc":"Base64-encoded DOCX file"}]},{"name":"WordExtractMetadata","category":"word","tokens":1,"description":"Extract document properties and metadata from a DOCX file.","responseType":"json","sample":"{\u0022file\u0022: \u0022\u003Cbase64-docx\u003E\u0022}","parameters":[{"name":"file","required":true,"desc":"Base64-encoded DOCX file"}]},{"name":"WordAddTextWatermark","category":"word","tokens":1,"description":"Add a diagonal text watermark to a DOCX document.","responseType":"json","sample":"{\u0022file\u0022: \u0022\u003Cbase64-docx\u003E\u0022, \u0022text\u0022: \u0022CONFIDENTIAL\u0022, \u0022fontSize\u0022: 72, \u0022color\u0022: \u0022CCCCCC\u0022}","parameters":[{"name":"file","required":true,"desc":"Base64-encoded DOCX file"},{"name":"text","required":true,"desc":"Watermark text"},{"name":"fontSize","required":false,"desc":"Font size in pt"},{"name":"color","required":false,"desc":"Hex color without #"}]},{"name":"WordAddImageWatermark","category":"word","tokens":1,"description":"Add an image watermark behind document content.","responseType":"json","sample":"{\u0022file\u0022: \u0022\u003Cbase64-docx\u003E\u0022, \u0022image\u0022: \u0022\u003Cbase64-image\u003E\u0022, \u0022opacity\u0022: 0.5}","parameters":[{"name":"file","required":true,"desc":"Base64-encoded DOCX file"},{"name":"image","required":true,"desc":"Base64-encoded image"},{"name":"opacity","required":false,"desc":"Opacity 0-1"}]},{"name":"WordAddTextHeaderFooter","category":"word","tokens":1,"description":"Add text headers and/or footers to a DOCX document.","responseType":"json","sample":"{\u0022file\u0022: \u0022\u003Cbase64-docx\u003E\u0022, \u0022header\u0022: {\u0022center\u0022: \u0022CONFIDENTIAL\u0022}, \u0022footer\u0022: {\u0022left\u0022: \u0022DocFlow\u0022, \u0022right\u0022: \u0022Page 1\u0022}}","parameters":[{"name":"file","required":true,"desc":"Base64-encoded DOCX file"},{"name":"header","required":false,"desc":"{left, center, right} text"},{"name":"footer","required":false,"desc":"{left, center, right} text"}]},{"name":"WordAddImageHeaderFooter","category":"word","tokens":1,"description":"Add images to DOCX headers and/or footers.","responseType":"json","sample":"{\u0022file\u0022: \u0022\u003Cbase64-docx\u003E\u0022, \u0022headerImage\u0022: \u0022\u003Cbase64-image\u003E\u0022, \u0022width\u0022: 200, \u0022height\u0022: 50}","parameters":[{"name":"file","required":true,"desc":"Base64-encoded DOCX file"},{"name":"headerImage","required":false,"desc":"Base64 image for header"},{"name":"footerImage","required":false,"desc":"Base64 image for footer"},{"name":"width","required":false,"desc":"Image width in px"},{"name":"height","required":false,"desc":"Image height in px"}]},{"name":"WordFindReplace","category":"word","tokens":1,"description":"Find and replace text across a DOCX document including headers and footers.","responseType":"json","sample":"{\u0022file\u0022: \u0022\u003Cbase64-docx\u003E\u0022, \u0022replacements\u0022: [{\u0022find\u0022: \u0022{{name}}\u0022, \u0022replace\u0022: \u0022John Doe\u0022}, {\u0022find\u0022: \u0022{{date}}\u0022, \u0022replace\u0022: \u00222026-02-06\u0022}]}","parameters":[{"name":"file","required":true,"desc":"Base64-encoded DOCX file"},{"name":"replacements","required":true,"desc":"Array of {find, replace} or object {find: replace}"}]},{"name":"WordSetMetadata","category":"word","tokens":1,"description":"Set document properties and metadata on a DOCX file.","responseType":"json","sample":"{\u0022file\u0022: \u0022\u003Cbase64-docx\u003E\u0022, \u0022metadata\u0022: {\u0022title\u0022: \u0022Updated Report\u0022, \u0022creator\u0022: \u0022DocFlow API\u0022}}","parameters":[{"name":"file","required":true,"desc":"Base64-encoded DOCX file"},{"name":"metadata","required":true,"desc":"{title, subject, creator, keywords, description, category}"}]},{"name":"WordSplitDocument","category":"word","tokens":1,"description":"Split a DOCX at section breaks or page breaks into separate files.","responseType":"json","sample":"{\u0022file\u0022: \u0022\u003Cbase64-docx\u003E\u0022, \u0022splitBy\u0022: \u0022section\u0022}","parameters":[{"name":"file","required":true,"desc":"Base64-encoded DOCX file"},{"name":"splitBy","required":false,"desc":"section or pagebreak"}]},{"name":"ConvertMarkdownToDocx","category":"word","tokens":1,"description":"Convert Markdown text to a DOCX document. Supports four engines: html (the default \u2014 Markdown rendered to HTML and then to DOCX), mohtasham (best for business docs with TOC/page breaks), remark (best for code with syntax highlighting), vace (best for technical docs with math/footnotes).","responseType":"json","sample":"{\u0022markdown\u0022: \u0022# Hello World\\n\\nThis is **bold** and *italic* text.\\n\\n- Item 1\\n- Item 2\\n\\n| Col A | Col B |\\n|-------|-------|\\n| 1 | 2 |\u0022, \u0022engine\u0022: \u0022mohtasham\u0022}","parameters":[{"name":"markdown","required":true,"desc":"Raw Markdown text"},{"name":"engine","required":false,"desc":"html (default), mohtasham, remark, or vace"},{"name":"options","required":false,"desc":"Engine-specific options (styling, theme, metadata)"}]},{"name":"PptxMerge","category":"powerpoint","tokens":1,"description":"Combine multiple PPTX presentations into one.","responseType":"json","sample":"{\u0022files\u0022: [\u0022\u003Cbase64-pptx-1\u003E\u0022, \u0022\u003Cbase64-pptx-2\u003E\u0022]}","parameters":[{"name":"files","required":true,"desc":"Array of base64-encoded PPTX files"}]},{"name":"PptxDeleteSlides","category":"powerpoint","tokens":1,"description":"Remove specific slides from a PPTX presentation.","responseType":"json","sample":"{\u0022file\u0022: \u0022\u003Cbase64-pptx\u003E\u0022, \u0022slides\u0022: \u00222,4\u0022}","parameters":[{"name":"file","required":true,"desc":"Base64-encoded PPTX file"},{"name":"slides","required":true,"desc":"Slides to delete: \u00222,4-6\u0022 or array [2,4,5,6]"}]},{"name":"PptxReplaceText","category":"powerpoint","tokens":1,"description":"Find and replace text across all slides in a PPTX.","responseType":"json","sample":"{\u0022file\u0022: \u0022\u003Cbase64-pptx\u003E\u0022, \u0022replacements\u0022: [{\u0022find\u0022: \u0022{{title}}\u0022, \u0022replace\u0022: \u0022Q1 Report\u0022}]}","parameters":[{"name":"file","required":true,"desc":"Base64-encoded PPTX file"},{"name":"replacements","required":true,"desc":"Array of {find, replace} or object {find: replace}"}]},{"name":"PptxSplit","category":"powerpoint","tokens":1,"description":"Split a PPTX into individual slide files.","responseType":"json","sample":"{\u0022file\u0022: \u0022\u003Cbase64-pptx\u003E\u0022}","parameters":[{"name":"file","required":true,"desc":"Base64-encoded PPTX file"}]},{"name":"PptxPopulateTemplate","category":"powerpoint","tokens":1,"description":"Fill a PPTX template with data, resolving {tokens} even when PowerPoint splits them across text runs.","responseType":"json","sample":"{\u0022file\u0022: \u0022\u003Cbase64-pptx\u003E\u0022, \u0022data\u0022: {\u0022name\u0022: \u0022Jamie\u0022, \u0022status\u0022: \u0022Open\u0022}}","parameters":[{"name":"file","required":true,"desc":"Base64-encoded PPTX template"},{"name":"data","required":true,"desc":"Key-value pairs; {key} tokens in the slides are replaced"}]},{"name":"SearchReplaceText","category":"cross-format","tokens":1,"description":"Find and replace text across document formats (DOCX, XLSX, TXT). Auto-detects format.","responseType":"json","sample":"{\u0022file\u0022: \u0022\u003Cbase64-file\u003E\u0022, \u0022replacements\u0022: [{\u0022find\u0022: \u0022old\u0022, \u0022replace\u0022: \u0022new\u0022}]}","parameters":[{"name":"file","required":true,"desc":"Base64-encoded file"},{"name":"replacements","required":true,"desc":"Array of {find, replace} or object {find: replace}"},{"name":"format","required":false,"desc":"docx, xlsx, txt (auto-detect if omitted)"}]},{"name":"ReplaceTextWithImage","category":"cross-format","tokens":2,"description":"Replace a placeholder tag in a DOCX with an inline image.","responseType":"json","sample":"{\u0022file\u0022: \u0022\u003Cbase64-docx\u003E\u0022, \u0022placeholder\u0022: \u0022{logo}\u0022, \u0022image\u0022: \u0022\u003Cbase64-image\u003E\u0022, \u0022width\u0022: 5, \u0022height\u0022: 3}","parameters":[{"name":"file","required":true,"desc":"Base64-encoded DOCX"},{"name":"placeholder","required":true,"desc":"Text to find e.g. {logo}"},{"name":"image","required":true,"desc":"Base64-encoded image"},{"name":"width","required":false,"desc":"Width in cm"},{"name":"height","required":false,"desc":"Height in cm"}]},{"name":"HttpRequest","category":"cross-format","tokens":1,"description":"Make an HTTP request to an external URL. Blocks private/internal IPs and never follows a redirect to one. Text responses come back in body; binary responses (PDF, images, archives) come back as contentBase64 with contentType and no body (#1485). Send a binary body with contentBase64 instead of body (#1487); the Content-Type header you set wins, otherwise application/octet-stream. Bodies are capped at 5 MB in both directions.","responseType":"json","sample":"{\u0022url\u0022: \u0022https://httpbin.org/get\u0022, \u0022method\u0022: \u0022GET\u0022}","parameters":[{"name":"url","required":true,"desc":"Target URL"},{"name":"method","required":false,"desc":"GET, POST, PUT, DELETE, PATCH"},{"name":"headers","required":false,"desc":"Request headers"},{"name":"body","required":false,"desc":"Request body as text (use contentBase64 for binary)"},{"name":"contentBase64","required":false,"desc":"Request body as base64 for binary payloads; decoded to exact bytes, 5 MB decoded cap, invalid base64 is a 400 and nothing is sent; null means absent (#3068)"},{"name":"timeout","required":false,"desc":"Timeout in ms (max 30000)"}]},{"name":"RestRequest","category":"cross-format","tokens":1,"description":"Call any REST API through a saved connection \u2014 the credential lives in the connection, never in the request. Source and destination: GET to read, POST/PUT/PATCH to write. Supports bearer, basic, API-key header, and OAuth2 client-credentials. Text responses (by media type, case-insensitive) come back in body with any echo of the connection\u0027s credential redacted; binary responses come back as contentBase64 with contentType and no body (#3060); a 204 has neither. A binary response whose bytes contain the connection\u0027s own credential is refused as a 502 CREDENTIAL_ECHO_REFUSED at 0 tokens, with statusCode and contentType but no bytes and no headers (#3068). An invalid contentBase64 on a write is a 400 at 0 tokens and nothing is sent; contentBase64: null means absent, the same as leaving it out (#3068). Bodies are capped at 5 MB in both directions.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_1a2b3c\u2026\u0022, \u0022path\u0022: \u0022orders\u0022, \u0022method\u0022: \u0022GET\u0022, \u0022query\u0022: {\u0022limit\u0022: 10}}","parameters":[{"name":"connectionId","required":true,"desc":"A registry connection of type \u0022rest\u0022"},{"name":"path","required":false,"desc":"Path appended under the connection\u0027s baseUrl (or an absolute URL on the same origin)"},{"name":"method","required":false,"desc":"GET, POST, PUT, PATCH, DELETE, HEAD"},{"name":"query","required":false,"desc":"Query string values; an array value repeats the key"},{"name":"headers","required":false,"desc":"Extra request headers. Authorization is owned by the connection and cannot be overridden"},{"name":"body","required":false,"desc":"Request body \u2014 an object is sent as JSON. Provide this OR contentBase64"},{"name":"contentBase64","required":false,"desc":"Binary request body as base64 (max 5MB decoded). Provide this OR body; null means absent"},{"name":"timeout","required":false,"desc":"Timeout in ms (min 5000, max 30000; values outside that range are clamped)"},{"name":"paginate","required":false,"desc":"Follow the API\u0027s own paging and return the whole walk in one call. GET only. { mode: \u0022link\u0022 | \u0022cursor\u0022 | \u0022nextUrl\u0022 | \u0022offset\u0022 | \u0022page\u0022 | \u0022queryTemplate\u0022, itemsPath?, maxPages? (default 10, max 50), maxBytes? (default and max 5MB aggregate), maxMs? (default 60000, max 120000) } plus per-mode keys: cursor takes cursorPath, cursorParam and optional hasMorePath; nextUrl takes nextUrlPath; offset takes limitParam, offsetParam, pageSize and optional startOffset; page takes pageParam and optional pageSizeParam with pageSize, startPage and totalPagesPath; queryTemplate takes queryParam, pageSize, itemsPath and optional startOffset, and the value of that query parameter carries {offset} and {limit} once each, which every page fills in (QuickBooks Online: query = SELECT * FROM Vendor STARTPOSITION {offset} MAXRESULTS {limit}); link needs none. Omit the block entirely for the single-request behavior"},{"name":"conditional","required":false,"desc":"Guard a PATCH, PUT or DELETE against lost updates in one call: read the record first, take its version (ETag), and send the write only against that version. {} reads the same path, takes \u0022@odata.etag\u0022 from the body and sends it as If-Match (Business Central, Dataverse, Microsoft Graph). Options: readPath?, etagFrom? (\u0022body\u0022 | \u0022header\u0022), etagPath? (default \u0022@odata.etag\u0022), etagHeader? (default \u0022ETag\u0022), header? (default \u0022If-Match\u0022), ifMissing? (\u0022fail\u0022 | \u0022create\u0022), and for \u0022create\u0022 createPath plus createMethod? (\u0022POST\u0022 | \u0022PUT\u0022). Omit the block for a single request"}]},{"name":"ComposeFill","category":"cross-format","tokens":1,"description":"Fill a docx/pdf/xlsx/pptx/html template in one call \u2014 inline (base64 \u002B kind) or by saved templateId. Returns the filled document plus a dataHash for dedupe.","responseType":"json","sample":"{\u0022template\u0022: \u0022\u003Cbase64-docx\u003E\u0022, \u0022kind\u0022: \u0022docx\u0022, \u0022data\u0022: {\u0022name\u0022: \u0022Jamie\u0022}}","parameters":[{"name":"template","required":false,"desc":"Base64 template (one-off). Provide this OR templateId"},{"name":"templateId","required":false,"desc":"Saved template id \u2014 a Template Generator (HTML) template, or a PDF AcroForm template. Provide this OR template"},{"name":"kind","required":false,"desc":"docx, pdf, xlsx, pptx, html (required for inline)"},{"name":"data","required":true,"desc":"Merge data: {key: value}. May carry a reserved \u0022__choices\u0022 block mapping a field (or a repeating-section column) to its code/label list \u2014 see notes"},{"name":"outputFormat","required":false,"desc":"native or pdf (pdf only for html kind, Linux)"},{"name":"pageSize","required":false,"desc":"Named paper size \u2014 see the paper-size table on the API reference overview. Case- and punctuation-insensitive; aliases such as \u0022US Letter\u0022 are accepted. Via raw JSON a custom size object is also accepted: {\u0022width\u0022: n, \u0022height\u0022: n, \u0022units\u0022: \u0022pt|px|in|mm|cm\u0022} (units default pt; 1-14400pt / 200in per side). An unknown size, unit, or orientation returns 400 \u2014 nothing silently falls back. Applies to PDF output (outputFormat \u0022pdf\u0022 or an HTML saved template rendered to PDF); legacy key paperSize is still accepted"},{"name":"orientation","required":false,"desc":"Page orientation. \u0022landscape\u0022 puts the long edge horizontal. Omit to keep the size\u0027s own orientation (portrait for every named size except Ledger)"},{"name":"flatten","required":false,"desc":"Flatten PDF form fields"},{"name":"filename","required":false,"desc":"Output filename (no extension)"}]},{"name":"RunWorkflow","category":"cross-format","tokens":1,"description":"Runs another of your own published workflows as a step: the payload you give it becomes that workflow\u0027s $input, it runs to completion, and what it produced comes back as finalResult. The workflow must be published and must be yours. Workflows can nest up to three deep, and a workflow can never run itself, directly or through another one.","responseType":"json","sample":"{\u0022slug\u0022: \u0022send-invoice\u0022, \u0022payload\u0022: {\u0022invoiceId\u0022: \u0022INV-1001\u0022, \u0022email\u0022: \u0022ap@example.com\u0022}}","parameters":[{"name":"slug","required":true,"desc":"The published workflow to run. It must be one of yours"},{"name":"payload","required":false,"desc":"Becomes the workflow\u0027s $input. Defaults to an empty object"},{"name":"wait","required":false,"desc":"Must be true or left out: the workflow always finishes before this step answers"}]},{"name":"AnalyzeTemplateData","category":"cross-format","tokens":1,"description":"Flatten a sample JSON or XML payload into a field contract: dot-paths, inferred datatypes, sample values, and arrays promoted to repeating tables. No AI, no document required.","responseType":"json","sample":"{\u0022data\u0022: {\u0022invoice\u0022: {\u0022number\u0022: \u0022INV-1001\u0022, \u0022issuedOn\u0022: \u00222026-07-28\u0022, \u0022total\u0022: 1240.50, \u0022paid\u0022: false}, \u0022customer\u0022: {\u0022name\u0022: \u0022Acme Ltd\u0022, \u0022email\u0022: \u0022ap@acme.com\u0022}, \u0022lines\u0022: [{\u0022description\u0022: \u0022Consulting\u0022, \u0022qty\u0022: 10, \u0022amount\u0022: 100.00}, {\u0022description\u0022: \u0022License\u0022, \u0022qty\u0022: 1, \u0022amount\u0022: 240.50}]}}","parameters":[{"name":"data","required":false,"desc":"Sample payload as JSON. Provide this OR dataXml"},{"name":"dataXml","required":false,"desc":"Sample payload as XML. Provide this OR data"},{"name":"maxDepth","required":false,"desc":"Maximum nesting depth to map"},{"name":"dataDefinition","required":false,"desc":"The source system\u0027s form/optionset definition, pasted whole (SurveyJS or Dynamics Field Service shape). Any question with a choices list becomes a choice field so the document shows the label, not the code"},{"name":"choices","required":false,"desc":"Explicit code/label lists: {fieldName: [{value, label}]}. Overrides dataDefinition and the payload\u0027s own __choices block"}]},{"name":"GenerateTemplateFromData","category":"cross-format","tokens":5,"description":"Turn a sample JSON or XML payload into a ready-to-edit HTML document template with placeholders and repeating sections. AI drafts the layout; falls back to a standard layout if AI is unavailable.","responseType":"json","sample":"{\u0022dataXml\u0022: \u0022\u003Cinvoice\u003E\u003Cnumber\u003EINV-1001\u003C/number\u003E\u003CissuedOn\u003E2026-07-28\u003C/issuedOn\u003E\u003Ctotal\u003E1240.50\u003C/total\u003E\u003Clines\u003E\u003Cline\u003E\u003Cdescription\u003EConsulting\u003C/description\u003E\u003Cqty\u003E10\u003C/qty\u003E\u003Camount\u003E100.00\u003C/amount\u003E\u003C/line\u003E\u003Cline\u003E\u003Cdescription\u003ELicense\u003C/description\u003E\u003Cqty\u003E1\u003C/qty\u003E\u003Camount\u003E240.50\u003C/amount\u003E\u003C/line\u003E\u003C/lines\u003E\u003C/invoice\u003E\u0022, \u0022documentType\u0022: \u0022invoice\u0022, \u0022title\u0022: \u0022Invoice\u0022, \u0022pageSize\u0022: \u0022Letter\u0022, \u0022extraFields\u0022: [{\u0022name\u0022: \u0022invoice.dueDate\u0022, \u0022dataType\u0022: \u0022date\u0022}, {\u0022name\u0022: \u0022company.tagline\u0022, \u0022mode\u0022: \u0022static\u0022, \u0022value\u0022: \u0022Precision document automation\u0022}]}","parameters":[{"name":"data","required":false,"desc":"Sample payload as JSON. Provide this OR dataXml"},{"name":"dataXml","required":false,"desc":"Sample payload as XML. Provide this OR data"},{"name":"documentType","required":false,"desc":"Hint for the layout, e.g. invoice, purchase order, statement"},{"name":"title","required":false,"desc":"Document title"},{"name":"pageSize","required":false,"desc":"Named paper size for the template\u0027s @page rule \u2014 any name from the paper-size table (no custom dimensions here; an unrecognized name falls back to Letter)"},{"name":"extraFields","required":false,"desc":"Custom fields to include: [{name, dataType, mode, value}]"},{"name":"useAi","required":false,"desc":"Set false to skip AI and use the standard layout"},{"name":"dataDefinition","required":false,"desc":"The source system\u0027s form/optionset definition, pasted whole (SurveyJS or Dynamics Field Service shape). Questions with a choices list become choice fields, and the drafter is shown the decoded label rather than the code"},{"name":"choices","required":false,"desc":"Explicit code/label lists: {fieldName: [{value, label}]}. Overrides dataDefinition and the payload\u0027s own __choices block"},{"name":"background","required":false,"desc":"Page background: {image (data: or https:), color, opacity 0-1, fit: cover|contain|tile|stretch, showThrough: true to keep content elements\u0027 own background colors from hiding it}. When the template html already carries a background, omitted keys keep the designed values \u2014 opacity does not reset to 1"}]},{"name":"ImportHtmlTemplate","category":"cross-format","tokens":1,"description":"Bring your own HTML. Send a document you already have plus the JSON payload it was produced from, and get it back as a fill template: {{placeholders}} where the values were, a repeating section around the repeated block, and a field contract. Fill it repeatedly with ComposeFill.","responseType":"json","sample":"{\u0022html\u0022: \u0022\u003Ch1\u003ECedar Ridge Manufacturing\u003C/h1\u003E\u003Cp\u003EColumbus, OH\u003C/p\u003E\u003Ctable\u003E\u003Ctbody\u003E\u003Ctr\u003E\u003Ctd\u003EMarcus Handley\u003C/td\u003E\u003Ctd\u003E$525.00\u003C/td\u003E\u003C/tr\u003E\u003Ctr\u003E\u003Ctd\u003EAlina Petrova\u003C/td\u003E\u003Ctd\u003E$525.00\u003C/td\u003E\u003C/tr\u003E\u003C/tbody\u003E\u003C/table\u003E\u0022, \u0022data\u0022: {\u0022employer\u0022: \u0022Cedar Ridge Manufacturing\u0022, \u0022city_state\u0022: \u0022Columbus, OH\u0022, \u0022roster\u0022: [{\u0022name\u0022: \u0022Marcus Handley\u0022, \u0022allowance\u0022: 525.0}, {\u0022name\u0022: \u0022Alina Petrova\u0022, \u0022allowance\u0022: 525.0}]}}","parameters":[{"name":"html","required":false,"desc":"The authored document markup. Provide this OR htmlBase64. This is markup, never a URL \u2014 nothing here fetches"},{"name":"htmlBase64","required":false,"desc":"The same document, base64-encoded, for callers that would rather not escape it into JSON"},{"name":"data","required":true,"desc":"The payload the document was produced from. It is what the import matches the document\u0027s text against, and it becomes the field contract"},{"name":"sanitize","required":false,"desc":"Remove script, event handlers, embedded frames and unsafe URL schemes from the authored document"},{"name":"stripExternalReferences","required":false,"desc":"Also remove https: images and other external references, which sanitizing keeps by default"},{"name":"annotateForDesigner","required":false,"desc":"Stamp the data-tg-* designer attributes a generated template carries, so the import is manageable in the Template Generator"},{"name":"returnFilled","required":false,"desc":"Return the template filled with the payload you supplied, as proof the fill reproduces the original"}]},{"name":"ParseX12ToJson","category":"edi","tokens":2,"description":"Parse an EDI X12 document into structured JSON with segments and elements.","responseType":"json","sample":"{\u0022ediData\u0022: \u0022ISA*00*          *00*          *ZZ*SENDER         *ZZ*RECEIVER       *210101*1253*^*00501*000000001*0*P*:~GS*HP*SENDER*RECEIVER*20210101*1253*1*X*005010X221A1~ST*835*0001~BPR*I*500.00*C*ACH*CTX*01*999999999*DA*1234567890*1512345678**01*111111111*DA*9876543210*20210101~TRN*1*12345*1512345678~DTM*405*20210101~N1*PR*INSURANCE COMPANY~N1*PE*PROVIDER NAME*XX*1234567890~SE*8*0001~GE*1*1~IEA*1*000000001~\u0022}","parameters":[{"name":"ediData","required":true,"desc":"X12 EDI document as string"}]},{"name":"ValidateX12","category":"edi","tokens":1,"description":"Validate X12 document structure: ISA/IEA envelope, GS/GE groups, ST/SE transaction sets, and segment counts.","responseType":"json","sample":"{\u0022ediData\u0022: \u0022ISA*00*          *00*          *ZZ*SENDER         *ZZ*RECEIVER       *210101*1253*^*00501*000000001*0*P*:~GS*HP*SENDER*RECEIVER*20210101*1253*1*X*005010X221A1~ST*835*0001~BPR*I*500.00*C*ACH*CTX*01*999999999*DA*1234567890~SE*3*0001~GE*1*1~IEA*1*000000001~\u0022}","parameters":[{"name":"ediData","required":true,"desc":"X12 EDI document as string"}]},{"name":"GenerateX12FromJson","category":"edi","tokens":2,"description":"Build an X12 EDI document from structured JSON. Accepts header, functional groups, transactions, and segments.","responseType":"text","sample":"{\u0022ediJson\u0022: {\u0022header\u0022: [\u002200\u0022, \u0022          \u0022, \u002200\u0022, \u0022          \u0022, \u0022ZZ\u0022, \u0022SENDER         \u0022, \u0022ZZ\u0022, \u0022RECEIVER       \u0022, \u0022210101\u0022, \u00221253\u0022, \u0022^\u0022, \u002200501\u0022, \u0022000000001\u0022, \u00220\u0022, \u0022P\u0022, \u0022:\u0022], \u0022functionalGroups\u0022: [{\u0022header\u0022: [\u0022HP\u0022, \u0022SENDER\u0022, \u0022RECEIVER\u0022, \u002220210101\u0022, \u00221253\u0022, \u00221\u0022, \u0022X\u0022, \u0022005010X221A1\u0022], \u0022transactions\u0022: [{\u0022header\u0022: [\u0022835\u0022, \u00220001\u0022], \u0022segments\u0022: [{\u0022tag\u0022: \u0022BPR\u0022, \u0022elements\u0022: [\u0022I\u0022, \u0022500.00\u0022, \u0022C\u0022, \u0022ACH\u0022]}]}]}]}}","parameters":[{"name":"ediJson","required":true,"desc":"Structured EDI: {header, functionalGroups: [{header, transactions: [{header, segments: [{tag, elements}]}]}]}"},{"name":"options","required":false,"desc":"Serialization options: {elementDelimiter, segmentTerminator, endOfLine}"}]},{"name":"IdentifyEdiDocument","category":"edi","tokens":1,"description":"Detect X12 document type (850 Purchase Order, 837 Claim, 835 Remittance, etc.), version, sender, and receiver.","responseType":"json","sample":"{\u0022ediData\u0022: \u0022ISA*00*          *00*          *ZZ*SENDER         *ZZ*RECEIVER       *210101*1253*^*00501*000000001*0*P*:~GS*HP*SENDER*RECEIVER*20210101*1253*1*X*005010X221A1~ST*835*0001~BPR*I*500.00*C*ACH*CTX*01*999999999*DA*1234567890~SE*3*0001~GE*1*1~IEA*1*000000001~\u0022}","parameters":[{"name":"ediData","required":true,"desc":"X12 EDI document as string"}]},{"name":"ConvertX12ToCsv","category":"edi","tokens":2,"description":"Parse X12 and flatten all segments into CSV rows with transaction code, segment tag, and elements.","responseType":"text","sample":"{\u0022ediData\u0022: \u0022ISA*00*          *00*          *ZZ*SENDER         *ZZ*RECEIVER       *210101*1253*^*00501*000000001*0*P*:~GS*HP*SENDER*RECEIVER*20210101*1253*1*X*005010X221A1~ST*835*0001~BPR*I*500.00*C*ACH*CTX*01*999999999*DA*1234567890~SE*3*0001~GE*1*1~IEA*1*000000001~\u0022, \u0022includeHeaders\u0022: true}","parameters":[{"name":"ediData","required":true,"desc":"X12 EDI document as string"},{"name":"includeHeaders","required":false,"desc":"Include CSV header row"}]},{"name":"ConvertX12ToHtml","category":"edi","tokens":2,"description":"Parse X12 and render as a styled, human-readable HTML report with segment details.","responseType":"html","sample":"{\u0022ediData\u0022: \u0022ISA*00*          *00*          *ZZ*SENDER         *ZZ*RECEIVER       *210101*1253*^*00501*000000001*0*P*:~GS*HP*SENDER*RECEIVER*20210101*1253*1*X*005010X221A1~ST*835*0001~BPR*I*500.00*C*ACH*CTX*01*999999999*DA*1234567890~SE*3*0001~GE*1*1~IEA*1*000000001~\u0022, \u0022title\u0022: \u0022835 Remittance Report\u0022}","parameters":[{"name":"ediData","required":true,"desc":"X12 EDI document as string"},{"name":"title","required":false,"desc":"Report title"}]},{"name":"ValidateFhirResource","category":"fhir","tokens":1,"description":"Validate a FHIR R4 resource against the specification. Returns validation errors, warnings, and info messages.","responseType":"json","sample":"{\u0022resource\u0022: {\u0022resourceType\u0022: \u0022Patient\u0022, \u0022id\u0022: \u0022example\u0022, \u0022name\u0022: [{\u0022use\u0022: \u0022official\u0022, \u0022given\u0022: [\u0022John\u0022], \u0022family\u0022: \u0022Doe\u0022}], \u0022gender\u0022: \u0022male\u0022, \u0022birthDate\u0022: \u00221990-01-15\u0022}}","parameters":[{"name":"resource","required":true,"desc":"FHIR resource as JSON object"},{"name":"options","required":false,"desc":"Validation options: {errorOnUnexpected}"}]},{"name":"FhirPathQuery","category":"fhir","tokens":1,"description":"Execute a FHIRPath expression against a FHIR resource or bundle. Supports filtering, functions, and type-aware navigation.","responseType":"json","sample":"{\u0022resource\u0022: {\u0022resourceType\u0022: \u0022Patient\u0022, \u0022id\u0022: \u0022example\u0022, \u0022name\u0022: [{\u0022use\u0022: \u0022official\u0022, \u0022given\u0022: [\u0022John\u0022, \u0022Michael\u0022], \u0022family\u0022: \u0022Doe\u0022}], \u0022birthDate\u0022: \u00221990-01-15\u0022, \u0022telecom\u0022: [{\u0022system\u0022: \u0022email\u0022, \u0022value\u0022: \u0022john@example.com\u0022}, {\u0022system\u0022: \u0022phone\u0022, \u0022value\u0022: \u0022555-1234\u0022}]}, \u0022expression\u0022: \u0022Patient.name.given\u0022}","parameters":[{"name":"resource","required":true,"desc":"FHIR resource as JSON object"},{"name":"expression","required":true,"desc":"FHIRPath expression"},{"name":"variables","required":false,"desc":"Environment variables for the expression"}]},{"name":"FhirJsonToXml","category":"fhir","tokens":1,"description":"Convert a FHIR resource from JSON format to FHIR-compliant XML.","responseType":"text","sample":"{\u0022resource\u0022: {\u0022resourceType\u0022: \u0022Patient\u0022, \u0022id\u0022: \u0022example\u0022, \u0022name\u0022: [{\u0022use\u0022: \u0022official\u0022, \u0022given\u0022: [\u0022John\u0022], \u0022family\u0022: \u0022Doe\u0022}], \u0022gender\u0022: \u0022male\u0022, \u0022birthDate\u0022: \u00221990-01-15\u0022}}","parameters":[{"name":"resource","required":true,"desc":"FHIR resource as JSON object"}]},{"name":"FhirXmlToJson","category":"fhir","tokens":1,"description":"Convert a FHIR resource from XML format to JSON.","responseType":"json","sample":"{\u0022xml\u0022: \u0022\u003CPatient xmlns=\\\u0022http://hl7.org/fhir\\\u0022\u003E\u003Cid value=\\\u0022example\\\u0022/\u003E\u003Cname\u003E\u003Cuse value=\\\u0022official\\\u0022/\u003E\u003Cgiven value=\\\u0022John\\\u0022/\u003E\u003Cfamily value=\\\u0022Doe\\\u0022/\u003E\u003C/name\u003E\u003Cgender value=\\\u0022male\\\u0022/\u003E\u003CbirthDate value=\\\u00221990-01-15\\\u0022/\u003E\u003C/Patient\u003E\u0022}","parameters":[{"name":"xml","required":true,"desc":"FHIR resource as XML string"}]},{"name":"FhirBundleToHtml","category":"fhir","tokens":2,"description":"Render a FHIR Bundle (or single resource) as a styled, human-readable HTML report. Supports Patient, Observation, Condition, Medication, Allergy, Encounter, Procedure, and more.","responseType":"html","sample":"{\u0022resource\u0022: {\u0022resourceType\u0022: \u0022Bundle\u0022, \u0022type\u0022: \u0022collection\u0022, \u0022entry\u0022: [{\u0022resource\u0022: {\u0022resourceType\u0022: \u0022Patient\u0022, \u0022id\u0022: \u0022pat1\u0022, \u0022name\u0022: [{\u0022given\u0022: [\u0022Jane\u0022], \u0022family\u0022: \u0022Smith\u0022}], \u0022gender\u0022: \u0022female\u0022, \u0022birthDate\u0022: \u00221985-03-22\u0022}}, {\u0022resource\u0022: {\u0022resourceType\u0022: \u0022Observation\u0022, \u0022id\u0022: \u0022obs1\u0022, \u0022status\u0022: \u0022final\u0022, \u0022code\u0022: {\u0022coding\u0022: [{\u0022system\u0022: \u0022http://loinc.org\u0022, \u0022code\u0022: \u00228867-4\u0022, \u0022display\u0022: \u0022Heart rate\u0022}]}, \u0022valueQuantity\u0022: {\u0022value\u0022: 72, \u0022unit\u0022: \u0022beats/min\u0022}, \u0022effectiveDateTime\u0022: \u00222024-01-15\u0022}}]}, \u0022title\u0022: \u0022Patient Summary\u0022}","parameters":[{"name":"resource","required":true,"desc":"FHIR Bundle or resource as JSON"},{"name":"title","required":false,"desc":"Report title"}]},{"name":"FhirBundleToCsv","category":"fhir","tokens":2,"description":"Extract key fields from FHIR Bundle entries into CSV format. Type-aware extraction for Patient, Observation, Condition, Medication, and more.","responseType":"text","sample":"{\u0022resource\u0022: {\u0022resourceType\u0022: \u0022Bundle\u0022, \u0022type\u0022: \u0022collection\u0022, \u0022entry\u0022: [{\u0022resource\u0022: {\u0022resourceType\u0022: \u0022Observation\u0022, \u0022id\u0022: \u0022obs1\u0022, \u0022status\u0022: \u0022final\u0022, \u0022code\u0022: {\u0022coding\u0022: [{\u0022system\u0022: \u0022http://loinc.org\u0022, \u0022code\u0022: \u00228867-4\u0022, \u0022display\u0022: \u0022Heart rate\u0022}]}, \u0022valueQuantity\u0022: {\u0022value\u0022: 72, \u0022unit\u0022: \u0022beats/min\u0022}, \u0022effectiveDateTime\u0022: \u00222024-01-15\u0022}}, {\u0022resource\u0022: {\u0022resourceType\u0022: \u0022Observation\u0022, \u0022id\u0022: \u0022obs2\u0022, \u0022status\u0022: \u0022final\u0022, \u0022code\u0022: {\u0022coding\u0022: [{\u0022display\u0022: \u0022Blood pressure\u0022}]}, \u0022valueString\u0022: \u0022120/80 mmHg\u0022, \u0022effectiveDateTime\u0022: \u00222024-01-15\u0022}}]}, \u0022resourceTypeFilter\u0022: \u0022Observation\u0022}","parameters":[{"name":"resource","required":true,"desc":"FHIR Bundle or resource as JSON"},{"name":"resourceTypeFilter","required":false,"desc":"Filter to specific resource type"}]},{"name":"AnalyzePdf","category":"redaction","tokens":1,"description":"Scans a PDF for PII patterns (SSN, email, credit card, phone, etc.) and returns match coordinates without modifying the document. Optionally accepts a template to auto-detect field locations via AI extraction. Use the results to preview what would be redacted.","responseType":"json","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022, \u0022patterns\u0022: [\u0022ssn\u0022, \u0022email\u0022, \u0022credit_card\u0022, \u0022phone_us\u0022], \u0022pages\u0022: \u0022all\u0022, \u0022padding\u0022: 2}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"},{"name":"patterns","required":false,"desc":"PII pattern names to detect: ssn, email, credit_card, phone_us, date, currency, ip_address, etc."},{"name":"customPatterns","required":false,"desc":"Custom regex patterns: [{regex, label, color}]"},{"name":"templateId","required":false,"desc":"UUID of a saved template \u2014 auto-detects field locations for redaction"},{"name":"template","required":false,"desc":"Inline template definition: {prebuiltModel, fields: [{fieldKey, label, type}]}"},{"name":"redactFields","required":false,"desc":"Template field keys to include (omit to detect all template fields)"},{"name":"pages","required":false,"desc":"Pages to analyze: \u0022all\u0022 or \u00221-3,5\u0022"},{"name":"padding","required":false,"desc":"Padding around matches in points"}]},{"name":"RedactPdfText","category":"redaction","tokens":2,"description":"Finds text strings or regex patterns in a PDF and draws opaque colored rectangles over each match. Optionally accepts a template to auto-detect field locations for redaction. Fast overlay-based redaction \u2014 use RedactPdfFlatten for guaranteed text removal.","responseType":"pdf","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022, \u0022redactions\u0022: [{\u0022text\u0022: \u0022John Smith\u0022, \u0022color\u0022: \u0022#000000\u0022, \u0022caseSensitive\u0022: false}, {\u0022regex\u0022: \u0022\\\\b\\\\d{3}-\\\\d{2}-\\\\d{4}\\\\b\u0022, \u0022color\u0022: \u0022#FF0000\u0022}], \u0022pages\u0022: \u0022all\u0022, \u0022allowPartialFields\u0022: false, \u0022returnBase64\u0022: true}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"},{"name":"redactions","required":false,"desc":"Array of redaction rules: [{text, regex, color, caseSensitive}]"},{"name":"templateId","required":false,"desc":"UUID of a saved template \u2014 auto-detects field locations for redaction"},{"name":"template","required":false,"desc":"Inline template definition: {prebuiltModel, fields: [{fieldKey, label, type, optional}]}. A field marked optional: true that is not found in the document is reported in fieldResults, not refused. One that is found but cannot be blacked out still counts."},{"name":"redactFields","required":false,"desc":"Template field keys to redact (omit to redact all detected fields)"},{"name":"allowPartialFields","required":false,"desc":"Accept a document in which some requested template fields could not be blacked out. Default false: any such field returns 422 with no PDF. When true, the response is 207, never 200."},{"name":"pages","required":false,"desc":"Pages to redact: \u0022all\u0022 or \u00221-3,5\u0022"},{"name":"padding","required":false,"desc":"Padding around matches in points"},{"name":"returnBase64","required":false,"desc":"Return base64 JSON or raw binary"}]},{"name":"RedactPdfArea","category":"redaction","tokens":1,"description":"Draws opaque colored rectangles at specified coordinates on PDF pages. Use for targeted redaction of known regions.","responseType":"pdf","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022, \u0022areas\u0022: [{\u0022page\u0022: 1, \u0022x\u0022: 100, \u0022y\u0022: 200, \u0022width\u0022: 150, \u0022height\u0022: 20, \u0022color\u0022: \u0022#000000\u0022}, {\u0022page\u0022: 1, \u0022x\u0022: 300, \u0022y\u0022: 400, \u0022width\u0022: 200, \u0022height\u0022: 20, \u0022color\u0022: \u0022#000000\u0022}], \u0022allowPartialAreas\u0022: false, \u0022returnBase64\u0022: true}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"},{"name":"areas","required":true,"desc":"Array of areas: [{page, x, y, width, height, color}]"},{"name":"allowPartialAreas","required":false,"desc":"Accept a document in which some areas could not be applied. Default false: any such area returns 422 with no PDF. When true, the response is 207, never 200."},{"name":"returnBase64","required":false,"desc":"Return base64 JSON or raw binary"}]},{"name":"RedactPdfFlatten","category":"redaction","tokens":3,"description":"Securely redacts a PDF by rasterizing each page as an image, compositing black rectangles over redaction areas, and reassembling as a new PDF. Guarantees text is permanently removed \u2014 not just covered. Supports text/regex search, coordinate-based areas, and template-based AI field detection.","responseType":"pdf","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022, \u0022redactions\u0022: [{\u0022text\u0022: \u0022John Smith\u0022}, {\u0022regex\u0022: \u0022\\\\d{3}-\\\\d{2}-\\\\d{4}\u0022}], \u0022areas\u0022: [{\u0022page\u0022: 1, \u0022x\u0022: 100, \u0022y\u0022: 200, \u0022width\u0022: 150, \u0022height\u0022: 20}], \u0022allowPartialAreas\u0022: false, \u0022allowPartialFields\u0022: false, \u0022dpi\u0022: 150, \u0022returnBase64\u0022: true}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"},{"name":"redactions","required":false,"desc":"Text/regex redactions: [{text, regex}]"},{"name":"areas","required":false,"desc":"Area redactions: [{page, x, y, width, height}]"},{"name":"allowPartialAreas","required":false,"desc":"Accept a document in which some areas could not be applied. Default false: any such area returns 422 with no PDF. When true, the response is 207, never 200."},{"name":"templateId","required":false,"desc":"UUID of a saved template \u2014 auto-detects field locations for redaction"},{"name":"template","required":false,"desc":"Inline template definition: {prebuiltModel, fields: [{fieldKey, label, type, optional}]}. A field marked optional: true that is not found in the document is reported in fieldResults, not refused. One that is found but cannot be blacked out still counts."},{"name":"redactFields","required":false,"desc":"Template field keys to redact (omit to redact all detected fields)"},{"name":"allowPartialFields","required":false,"desc":"Accept a document in which some requested template fields could not be blacked out. Default false: any such field returns 422 with no PDF. When true, the response is 207, never 200."},{"name":"pages","required":false,"desc":"Pages to process: \u0022all\u0022 or \u00221-3,5\u0022"},{"name":"dpi","required":false,"desc":"Render resolution (higher = better quality, slower)"},{"name":"color","required":false,"desc":"Redaction rectangle color"},{"name":"returnBase64","required":false,"desc":"Return base64 JSON or raw binary"}]},{"name":"AnalyzeDocument","category":"document-ai","tokens":5,"description":"Sends a PDF through multiple AI engines (a document-layout model, a vision model, and PII regex) to detect all meaningful fields with bounding box coordinates. Returns labeled fields with types, confidence scores, and page positions. Use this to build templates for repeated extraction.","responseType":"json","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022, \u0022prebuiltModel\u0022: \u0022prebuilt-invoice\u0022}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"},{"name":"prebuiltModel","required":false,"desc":"Extraction model: prebuilt-invoice, prebuilt-receipt, prebuilt-layout, prebuilt-idDocument, prebuilt-businessCard"}]},{"name":"AiProcessInvoice","category":"document-ai","tokens":5,"description":"Extracts invoice fields \u2014 vendor, invoice number, dates, totals, tax and line items \u2014 using our invoice model. Same engine as AI Field Detection, but the model is pinned to prebuilt-invoice instead of being chosen by classification, so the result is repeatable for a known document type.","responseType":"json","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF or image"},{"name":"fileType","required":false,"desc":"Override magic-byte detection: pdf, jpeg, png, tiff, bmp, heif"},{"name":"classifyType","required":false,"desc":"Also return the AI\u0027s own label for the document type"}]},{"name":"AiProcessReceipt","category":"document-ai","tokens":5,"description":"Extracts receipt fields \u2014 merchant, transaction date and time, item lines, subtotal, tax, tip and total \u2014 using our receipt model. Pinned to prebuilt-receipt, so expense-capture flows do not depend on the document being classified correctly first.","responseType":"json","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-receipt-photo\u003E\u0022, \u0022fileType\u0022: \u0022jpeg\u0022}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF or image"},{"name":"fileType","required":false,"desc":"Override magic-byte detection: pdf, jpeg, png, tiff, bmp, heif"},{"name":"classifyType","required":false,"desc":"Also return the AI\u0027s own label for the document type"}]},{"name":"AiProcessIdDocument","category":"document-ai","tokens":5,"description":"Extracts identity-document fields \u2014 name, document number, date of birth, issuing authority and expiry \u2014 using our ID-document model. Pinned to prebuilt-idDocument. Covers passports and driver\u0027s licenses.","responseType":"json","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-id-scan\u003E\u0022, \u0022fileType\u0022: \u0022png\u0022}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF or image"},{"name":"fileType","required":false,"desc":"Override magic-byte detection: pdf, jpeg, png, tiff, bmp, heif"},{"name":"classifyType","required":false,"desc":"Also return the AI\u0027s own label for the document type"}]},{"name":"ExtractWithTemplate","category":"document-ai","tokens":5,"description":"Applies a saved template or inline template definition to a PDF document and extracts structured JSON data. Optionally redacts specified fields and returns a flattened redacted PDF. Use templateId to reference a saved template by UUID (scoped to your client account), or pass the full template object inline.","responseType":"json","sample":"{\u0022pdf\u0022: \u0022\u003Cbase64-pdf\u003E\u0022, \u0022templateId\u0022: \u00223fdf7d3a-43e6-4f9f-a98f-bd1b77b15a41\u0022}","parameters":[{"name":"pdf","required":true,"desc":"Base64-encoded PDF"},{"name":"templateId","required":false,"desc":"UUID of a saved template (alternative to inline template). Scoped to the calling client\u0027s account via API key."},{"name":"template","required":false,"desc":"Inline template definition (alternative to templateId). Required if templateId is not provided."},{"name":"template.prebuiltModel","required":false,"desc":"Extraction model to use"},{"name":"template.fields","required":false,"desc":"Field definitions: [{fieldKey, label, type, page, x, y, width, height}]"},{"name":"redactFields","required":false,"desc":"Field keys to redact in the output PDF"},{"name":"returnRedactedPdf","required":false,"desc":"Include a securely redacted PDF in the response"},{"name":"includeBoundingBoxes","required":false,"desc":"Include bounding box coordinates in field results"}]},{"name":"AiRunPrompt","category":"document-ai","tokens":3,"description":"Runs your own instruction against text with an AI model \u2014 summarize, classify, rewrite, pull out a value, answer a question about a document. The generic escape hatch for anything the specific extraction endpoints do not cover.","responseType":"json","sample":"{\u0022prompt\u0022: \u0022Summarize this contract in three bullet points.\u0022, \u0022input\u0022: \u0022\u003Cthe document text\u003E\u0022, \u0022maxTokens\u0022: 500}","parameters":[{"name":"prompt","required":true,"desc":"The instruction to run (max 32,000 characters)"},{"name":"input","required":false,"desc":"The text to run it against \u2014 typically the output of Convert PDF to Text or an extraction step (max 200,000 characters)"},{"name":"systemPrompt","required":false,"desc":"Overrides the default persona (\u0022a precise document-processing assistant\u2026 answer with the result only\u0022). Max 8,000 characters"},{"name":"temperature","required":false,"desc":"0 (deterministic) to 2 (creative)"},{"name":"maxTokens","required":false,"desc":"Ceiling on the length of the answer, 1-8000"},{"name":"jsonMode","required":false,"desc":"Force a JSON object back and parse it into the \u0022json\u0022 field. Requires the word \u0022JSON\u0022 to appear in the prompt or systemPrompt \u2014 say what shape you want"}]},{"name":"AiJobRun","category":"document-ai","tokens":12,"description":"The \u0022Send to AI\u0022 step for a dropped job: give it a zip holding instructions (instructions.md, .txt or .docx, or README.md) and the documents, and an AI model carries the instructions out using DocButterfly\u0027s own document tools \u2014 merge, split, watermark, extract text, convert Word to PDF, find and replace, find dates \u2014 then hands back output.zip with the originals under input/, everything it produced under output/, and a job report. Billed per 10,000 model tokens plus the tools it used, with a hard ceiling per job.","responseType":"json","sample":"{\u0022zipBase64\u0022: \u0022\u003Cbase64 job zip\u003E\u0022, \u0022zipName\u0022: \u0022incoming/job-42.zip\u0022}","parameters":[{"name":"zipBase64","required":false,"desc":"Base64-encoded job zip: instructions plus the documents. Send this OR files"},{"name":"files","required":false,"desc":"Instead of a zip: [{ name, contentBase64 }]"},{"name":"zipName","required":false,"desc":"The zip\u0027s file name or path; its base name becomes jobId when jobId is not given"},{"name":"jobId","required":false,"desc":"Names the job in the report and in the suggested SFTP paths (letters, digits, . _ -)"},{"name":"instructions","required":false,"desc":"Used when the zip carries no instructions file (max 32,000 characters)"},{"name":"aiConnectionId","required":false,"desc":"Run on your own AI model deployment through a saved connection instead of the hosted model. Never falls back to the hosted model if the connection cannot be used"},{"name":"maxModelTokens","required":false,"desc":"Model-token budget for the whole job, 2,000-300,000"},{"name":"maxToolCalls","required":false,"desc":"Tool-call budget for the whole job, 1-60"},{"name":"tools","required":false,"desc":"Limit the job to some of its tools: ConvertHtmlToPdf, MergePdfs, SplitPdf, WatermarkPdf, ExtractPdfText, ExtractDates, AnalyzeDocument, ConvertDocxToPdf, WordExtractText, SearchReplaceText, WordFindReplace, ExcelFindReplace, PptxReplaceText"},{"name":"includeInputFiles","required":false,"desc":"Also return each original as { name, path, contentBase64 } so a workflow can upload them one by one"}]},{"name":"ExtractDates","category":"document-ai","tokens":3,"description":"Pulls every date, deadline and time-sensitive commitment out of a block of text, each classified by what it is (deadline, renewal, payment, meeting, expiry\u2026), how important it is, and how many days ahead a reminder should fire. Optionally writes the results straight into an Outlook calendar.","responseType":"json","sample":"{\u0022text\u0022: \u0022The contract renewal date is March 15, 2026. Payment is due by April 1, 2026.\u0022, \u0022context\u0022: \u0022Contract for ACME Corp\u0022}","parameters":[{"name":"text","required":true,"desc":"The text to read. Typically the output of Convert PDF to Text or an extraction step"},{"name":"context","required":false,"desc":"One line telling the model what the document is (e.g. \u0022Contract for ACME Corp\u0022), which sharpens the descriptions it writes"},{"name":"createEvents","required":false,"desc":"Also create an Outlook calendar event per date found. Requires calendarEmail and the Graph settings; without them the dates still come back and event creation is skipped"},{"name":"calendarEmail","required":false,"desc":"The mailbox to create events in. Required when createEvents is true"},{"name":"timezone","required":false,"desc":"IANA time zone the events are written in (e.g. \u0022Europe/London\u0022)"}]},{"name":"VaultAsk","category":"personal-vault","tokens":1,"description":"Answers a plain-English question about one customer\u0027s stored documents \u2014 when something is due, how much was spent, what a document said. Common questions are answered from precomputed dates with no AI call at all, which is why they return in milliseconds.","responseType":"json","sample":"{\u0022question\u0022: \u0022When is my cat due for vaccinations?\u0022}","parameters":[{"name":"question","required":true,"desc":"The question, in plain English (e.g. \u0022When is my cat due for vaccinations?\u0022)"},{"name":"tenantId","required":false,"desc":"Admin key only \u2014 the vault to read. A client key always reads its own vault and cannot name another"}]},{"name":"VaultIngestDocument","category":"personal-vault","tokens":5,"description":"Files a receipt, statement or record into the customer\u0027s own document store: the original goes to their private container addressed by content hash, and any dated facts become searchable records with their follow-up dates already worked out.","responseType":"json","sample":"{\u0022fileContent\u0022: \u0022\u003Cbase64\u003E\u0022, \u0022mediaType\u0022: \u0022application/pdf\u0022, \u0022fields\u0022: {\u0022entityName\u0022: \u0022Fluffy\u0022, \u0022entityKind\u0022: \u0022pet\u0022, \u0022eventKind\u0022: \u0022vaccination\u0022, \u0022occurredOn\u0022: \u00222025-03-14\u0022, \u0022confidence\u0022: 0.94, \u0022attrs\u0022: {\u0022vaccine\u0022: \u0022Rabies 3-year\u0022}}}","parameters":[{"name":"fileContent","required":true,"desc":"The document as base64"},{"name":"mediaType","required":false,"desc":"MIME type of the document"},{"name":"fileName","required":false,"desc":"Original filename, kept as metadata (never part of the address)"},{"name":"fields","required":false,"desc":"Already-parsed facts: entityName, entityKind, eventKind, occurredOn, amount, currency, confidence, attrs"},{"name":"text","required":false,"desc":"Document text to index for search"},{"name":"tenantId","required":false,"desc":"Admin key only \u2014 the vault to file into"}]},{"name":"VaultUpcoming","category":"personal-vault","tokens":1,"description":"Lists what the customer owes attention to, soonest first \u2014 renewals, boosters, inspections, service intervals \u2014 each with the record it was worked out from.","responseType":"json","sample":"{\u0022withinDays\u0022: 30}","parameters":[{"name":"withinDays","required":false,"desc":"How far ahead to look"},{"name":"tenantId","required":false,"desc":"Admin key only \u2014 the vault to read"}]},{"name":"VaultEntities","category":"personal-vault","tokens":1,"description":"Lists the things this customer\u0027s vault knows about \u2014 their pets, vehicles, properties, policies \u2014 with the alternative names each one answers to.","responseType":"json","sample":"{\u0022kind\u0022: \u0022pet\u0022}","parameters":[{"name":"kind","required":false,"desc":"Filter to one kind: pet, vehicle, property, policy, person, merchant"},{"name":"tenantId","required":false,"desc":"Admin key only \u2014 the vault to read"}]},{"name":"VaultConfirmEvent","category":"personal-vault","tokens":1,"description":"Answers for a record the extractor was not certain about: accept it as read, correct a wrong field, or reject it. Accepting or correcting marks the fact as verified by a person and clears the \u0022unconfirmed\u0022 flag from every date worked out from it; a correction works those dates out again. Every answer is kept as a labeled example of how good the reading was.","responseType":"json","sample":"{\u0022eventId\u0022: 881, \u0022outcome\u0022: \u0022correct\u0022, \u0022corrections\u0022: {\u0022occurredOn\u0022: \u00222025-03-14\u0022}}","parameters":[{"name":"eventId","required":true,"desc":"The record to answer for"},{"name":"outcome","required":false,"desc":"accept (the reading is right), correct (a field is wrong: send corrections) or reject (the reading is not right)"},{"name":"corrections","required":false,"desc":"With outcome correct only: the fields to change. occurredOn and endedOn as YYYY-MM-DD, amount, currency, and attrs (merged into the record; a null value removes a key)"},{"name":"reason","required":false,"desc":"With outcome reject only: why, in a few words"},{"name":"tenantId","required":false,"desc":"Admin key only \u2014 the vault to act on"}]},{"name":"VaultIngestSelfDocument","category":"personal-vault","tokens":5,"description":"Reads a resume, letter or personal record and files what it says about the customer themselves \u2014 names, contact details, addresses, employers, schools and references \u2014 into their own profile, each fact carrying the document and page it came from. Answers with counts only, never with the values it read, so a whole folder can be filed and logged safely.","responseType":"json","sample":"{\u0022fileContent\u0022: \u0022\u003Cbase64\u003E\u0022, \u0022fileName\u0022: \u0022resume.docx\u0022, \u0022observedAt\u0022: \u00222026-07-27T00:00:00Z\u0022}","parameters":[{"name":"fileContent","required":true,"desc":"The document as base64. PDF, DOCX, Markdown or plain text"},{"name":"fileName","required":false,"desc":"Original filename. Decides how the document is read when the media type is generic"},{"name":"mediaType","required":false,"desc":"MIME type of the document"},{"name":"observedAt","required":false,"desc":"How OLD the document is (ISO timestamp). A newer document wins where two disagree, so this is the document\u0027s own date, not the time it was filed"},{"name":"sensitivity","required":false,"desc":"normal or restricted. A restricted document is never indexed for search"},{"name":"tenantId","required":false,"desc":"Admin key only \u2014 the vault to file into"}]},{"name":"VaultSelfProfile","category":"personal-vault","tokens":1,"description":"Returns everything the vault holds about the customer themselves \u2014 name, contact details, address history, employment, education and references, plus an open-ended list of every other fact their documents stated about them \u2014 assembled into one record, with the source document, page and confidence behind every fact.","responseType":"json","sample":"{}","parameters":[{"name":"tenantId","required":false,"desc":"Admin key only \u2014 the vault to read. A client key always reads its own"},{"name":"reveal","required":false,"desc":"The factKey of one masked identifier to return in full. The reveal is recorded and shows in the customer\u0027s own history"}]},{"name":"VaultSelfProfileWrite","category":"personal-vault","tokens":1,"description":"Stores a fact the customer entered themselves \u2014 a supervisor\u0027s phone number, a date of birth, a reference \u2014 into their own profile. A manually entered fact outranks anything read out of a document, permanently, so a later upload cannot revert a correction.","responseType":"json","sample":"{\u0022section\u0022: \u0022employment\u0022, \u0022factKey\u0022: \u0022employment:acme|analyst|2019-06\u0022, \u0022value\u0022: {\u0022employer\u0022: \u0022Acme\u0022, \u0022title\u0022: \u0022Analyst\u0022, \u0022from\u0022: \u00222019-06\u0022, \u0022supervisor\u0022: {\u0022name\u0022: \u0022Dana Reed\u0022, \u0022phone\u0022: \u0022555-0100\u0022}}}","parameters":[{"name":"section","required":true,"desc":"person, contacts, addresses, employment, education or references"},{"name":"value","required":true,"desc":"The edited entry, in the shape that section uses"},{"name":"factKey","required":false,"desc":"The fact being replaced or removed, from the provenance on the fact"},{"name":"remove","required":false,"desc":"Delete the fact named by factKey instead of writing one"},{"name":"edits","required":false,"desc":"Several of the above applied together"},{"name":"tenantId","required":false,"desc":"Admin key only \u2014 the vault to write. A client key always writes its own"}]},{"name":"VaultReExtractDocument","category":"personal-vault","tokens":5,"description":"Re-runs extraction over a document the vault already holds, reading the stored original \u2014 the customer does not upload it again. Use it when the way documents are read improves: the whole vault picks up the change without a byte of the original leaving the customer\u0027s storage.","responseType":"json","sample":"{}","parameters":[{"name":"observedAt","required":false,"desc":"Override how OLD the document is (ISO timestamp). By default the age recorded when it was first filed is reused, so a re-read never outranks a newer document"},{"name":"tenantId","required":false,"desc":"Admin key only \u2014 the vault to act on"}]},{"name":"VaultDocuments","category":"personal-vault","tokens":1,"description":"Lists the documents in the customer\u0027s vault, each with how many versions of it have been filed and how much text was read from the newest one.","responseType":"json","sample":"{}","parameters":[{"name":"limit","required":false,"desc":"How many documents to return"},{"name":"tenantId","required":false,"desc":"Admin key only \u2014 the vault to read. A client key always reads its own"}]},{"name":"VaultDocumentVersions","category":"personal-vault","tokens":1,"description":"Returns the version chain for one document, newest first, with how each version was recognized as belonging to it.","responseType":"json","sample":"{}","parameters":[{"name":"documentId","required":true,"desc":"In the path: /api/vault/documents/{documentId}/versions"},{"name":"tenantId","required":false,"desc":"Admin key only \u2014 the vault to read. A client key always reads its own"}]},{"name":"VaultDocumentVersionPages","category":"personal-vault","tokens":1,"description":"Returns the text of one version of one document, page by page \u2014 what the vault actually read, and what an answer citing that page is quoting.","responseType":"json","sample":"{}","parameters":[{"name":"documentId","required":true,"desc":"In the path: /api/vault/documents/{documentId}/versions/{versionNo}/pages"},{"name":"versionNo","required":true,"desc":"In the path \u2014 the version to read"},{"name":"tenantId","required":false,"desc":"Admin key only \u2014 the vault to read. A client key always reads its own"}]},{"name":"VaultSearch","category":"personal-vault","tokens":1,"description":"Searches everything one customer\u0027s vault holds at once \u2014 document names, the text on their pages, the facts read out of them, the answers kept from forms they have filled in, and their contacts \u2014 and returns the hits ranked, each one saying which document and page it came from.","responseType":"json","sample":"{}","parameters":[{"name":"q","required":false,"desc":"What to look for. An empty search returns the most recently filed documents"},{"name":"limit","required":false,"desc":"How many hits to return, 1-100"},{"name":"offset","required":false,"desc":"How far into the ranked list to start"},{"name":"kinds","required":false,"desc":"Comma-separated list to narrow the search: document, fact, answer, contact. Omitted searches all of them"},{"name":"tenantId","required":false,"desc":"Admin key only \u2014 the vault to search. A client key always searches its own"}]},{"name":"DataverseQueryRows","category":"sources","tokens":1,"description":"Reads rows out of a Dataverse (Dynamics 365 / Power Platform) table via a registry connection of type \u0027dataverse\u0027 owned by the calling client. SELECT-ONLY BY CONSTRUCTION: this endpoint issues nothing but GET requests, so there is no code path through it that could write. The connection holds the org URL and credential \u2014 neither ever appears in the workflow definition.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022, \u0022entitySet\u0022: \u0022contacts\u0022, \u0022top\u0022: 100, \u0022select\u0022: \u0022fullname,jobtitle\u0022, \u0022filter\u0022: [{\u0022attribute\u0022: \u0022_parentcustomerid_value\u0022, \u0022operator\u0022: \u0022eq\u0022, \u0022value\u0022: \u002207c59639-d6a8-f111-aaac-6045bd015278\u0022}], \u0022orderBy\u0022: [{\u0022attribute\u0022: \u0022fullname\u0022, \u0022direction\u0022: \u0022asc\u0022}]}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027dataverse\u0027, owned by the calling client (manage/connections)"},{"name":"entitySet","required":true,"desc":"Dataverse Web API entity set name \u2014 plural, lowercase (e.g. \u0027contacts\u0027, \u0027cr123_orders\u0027). Use DataverseListEntitySets to see what exists"},{"name":"top","required":false,"desc":"Page size: how many rows one call returns, 1 to 500. A value above 500 is refused rather than quietly reduced; a bigger result is read by following \u0027cursor\u0027"},{"name":"select","required":false,"desc":"Comma-separated attribute logical names to return (e.g. \u0027firstname,lastname,emailaddress1\u0027). Omit for every attribute the table exposes"},{"name":"filter","required":false,"desc":"Scope the read. An array of conditions, all ANDed: [{\u0022attribute\u0022: \u0022_parentcustomerid_value\u0022, \u0022operator\u0022: \u0022eq\u0022, \u0022value\u0022: \u0022\u003Cguid\u003E\u0022}]. Operators: eq, ne, gt, ge, lt, le, contains, startswith, endswith, null, notnull, in, notin (in and notin each take an array of up to 20 values). Add \u0022valueType\u0022 (string, number, boolean, guid, datetime) when the value\u0027s type is not obvious from JSON \u2014 a date-only value needs it. For OR, or to nest, pass {\u0022logic\u0022: \u0022or\u0022, \u0022conditions\u0022: [...]} instead of an array. A raw OData $filter string is deliberately NOT accepted: the clause is compiled by the endpoint so no caller-supplied text reaches the query"},{"name":"orderBy","required":false,"desc":"Sort order, up to 5 attributes: [{\u0022attribute\u0022: \u0022createdon\u0022, \u0022direction\u0022: \u0022desc\u0022}]. Direction defaults to \u0027asc\u0027. Worth setting whenever you page \u2014 without an order, which rows land on which page is undefined"},{"name":"cursor","required":false,"desc":"Continuation token. Pass back the \u0027cursor\u0027 from a previous response, unchanged, to read the next page. Only valid for the same query. It works the same way for a native FetchXML read, which pages with Dataverse\u0027s own paging cookie rather than a skip token \u2014 send the SAME \u0027fetchXml\u0027 document again with the cursor beside it, and the page number and paging cookie are written into the document by this endpoint"},{"name":"count","required":false,"desc":"Ask Dataverse for the total number of MATCHING rows alongside this page (returned as totalCount). On by default; set false to skip the count"},{"name":"expand","required":false,"desc":"Related data to pull alongside each row, one level deep: [{\u0022navigation\u0022: \u0022parentcustomerid_account\u0022, \u0022select\u0022: \u0022name,telephone1\u0022, \u0022top\u0022: 3}]. A lookup arrives as a nested object on the row, a child collection as a nested array; \u0027top\u0027 applies to child collections only (a lookup returns at most one row and refuses it). A child collection may also carry \u0027filter\u0027, the same structured shape the top-level filter takes, compiled into $expand=nav($filter=...) \u2014 OData has no filter inside a single-valued expand, so one on a lookup is refused rather than ignored. Every navigation name must be one DataverseListRelationships reports for this table, or the call is refused"},{"name":"fetchXml","required":false,"desc":"A native FetchXML document, run through the Web API\u0027s own ?fetchXml=. For the queries the structured filter cannot express \u2014 aggregates, relative dates (last-x-days), user-scoped operators, EXISTS joins, deeper and/or nesting. MUTUALLY EXCLUSIVE with select, filter, orderBy, expand and count: a FetchXML document is the whole query and the Web API composes nothing beside it, so sending both is a 400 naming which. Validated first: well-formed XML with no DOCTYPE, exactly one \u003Cfetch\u003E root and one \u003Centity\u003E, at most 20000 characters and 500 elements, no paging-cookie and no \u0027page\u0027 attribute, and a top/count inside the same 1-500 ceiling as \u0027top\u0027 (refused, never reduced). It DOES page: send the same document back with the \u0027cursor\u0027 from the previous response and the page number and paging cookie are written into the document by this endpoint, which is why a pasted one is refused. \u0027entitySet\u0027 is still required \u2014 it is the path the document is run against"}]},{"name":"DataverseListEntitySets","category":"sources","tokens":1,"description":"Lists the tables a Dataverse connection can see, as the entity set names DataverseQueryRows and DataverseCreateRows take. This is the discovery half of the source: \u0027process the customer\u0027s orders table\u0027 is unwritable if the only question you can ask is \u0027give me this exact table\u0027.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027dataverse\u0027, owned by the calling client (manage/connections)"}]},{"name":"DataverseListAttributes","category":"sources","tokens":1,"description":"Lists the columns of ONE Dataverse table. The column half of discovery: DataverseListEntitySets answers \u0027which tables\u0027, this answers \u0027which fields\u0027, which is what a field-mapping screen needs before it can propose anything. Two lists, chosen with \u0027mode\u0027: \u0027write\u0027 (the default) gives the columns DataverseCreateRows can set, and \u0027read\u0027 gives the columns a query can select \u2014 including createdon, statecode and the lookup ids, which are not writable and so are absent from the default list.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022, \u0022entitySet\u0022: \u0022contacts\u0022}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027dataverse\u0027, owned by the calling client (manage/connections)"},{"name":"entitySet","required":true,"desc":"Dataverse Web API entity set name \u2014 plural, lowercase (e.g. \u0027contacts\u0027, \u0027cr123_orders\u0027). Use DataverseListEntitySets to see what exists"},{"name":"mode","required":false,"desc":"Which list: \u0027write\u0027 (default) for the columns you can set when creating a row, or \u0027read\u0027 for the columns you can name in a query\u0027s select. Anything else is refused rather than defaulted"}]},{"name":"DataverseListRelationships","category":"sources","tokens":1,"description":"Lists the relationships of ONE Dataverse table: its lookups (the columns pointing at a parent row) and its child collections (the rows that point back at it). The third half of discovery \u2014 entity sets answer \u0027which tables\u0027, attributes answer \u0027which columns\u0027, and this answers \u0027what is this table connected to\u0027, which is what a query has to know before it can pull a contact together with the account it belongs to. The navigation property names it returns are exactly what DataverseQueryRows takes in its \u0027expand\u0027.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022, \u0022entitySet\u0022: \u0022contacts\u0022}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027dataverse\u0027, owned by the calling client (manage/connections)"},{"name":"entitySet","required":true,"desc":"Dataverse Web API entity set name \u2014 plural, lowercase (e.g. \u0027contacts\u0027, \u0027cr123_orders\u0027). Use DataverseListEntitySets to see what exists"}]},{"name":"DataverseReadFile","category":"sources","tokens":1,"description":"Reads the file held in a Dataverse File (or Image) column and returns it as base64, through a registry connection of type \u0027dataverse\u0027 owned by the calling client. This is the read end of the document drop point: a flow writes a bundle into a child record\u0027s file column, a workflow picks it up here, works on it, and writes it back. Dataverse serves files in chunks, and this endpoint reassembles them \u2014 the caller gets one complete document or an error, never a partial one.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022, \u0022entitySet\u0022: \u0022dbf_documentdrops\u0022, \u0022recordId\u0022: \u0022be83416a-45a9-f111-aaac-70a8a5b10a05\u0022, \u0022column\u0022: \u0022dbf_file\u0022}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027dataverse\u0027, owned by the calling client (manage/connections)"},{"name":"entitySet","required":true,"desc":"Dataverse Web API entity set name \u2014 plural, lowercase (e.g. \u0027dbf_documentdrops\u0027, \u0027contacts\u0027)"},{"name":"recordId","required":true,"desc":"The record\u0027s GUID, plain 8-4-4-4-12 form with no braces"},{"name":"column","required":true,"desc":"The File column\u0027s attribute logical name (e.g. \u0027dbf_file\u0027). DataverseListAttributes reports the column types"}]},{"name":"SqlQueryRows","category":"sources","tokens":1,"description":"Reads rows out of a SQL table via a registry connection of type \u0027sqlserver\u0027, \u0027postgresql\u0027, or \u0027mysql\u0027 owned by the calling client. SELECT-ONLY BY CONSTRUCTION: the caller NEVER supplies SQL text \u2014 the table and column names are validated against the identifier alphabet, verified to exist in INFORMATION_SCHEMA, and quoted per dialect, the WHERE clause is COMPILED by us from a structured filter with every value bound as a driver parameter, and the row limit is injected by us from a validated integer. The dialect comes from the connection; the request is identical for all three.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022, \u0022table\u0022: \u0022dbo.Invoices\u0022, \u0022top\u0022: 5, \u0022columns\u0022: \u0022id,customer,total\u0022, \u0022filter\u0022: [{\u0022column\u0022: \u0022customer\u0022, \u0022operator\u0022: \u0022eq\u0022, \u0022value\u0022: \u0022Acme Corp\u0022}], \u0022orderBy\u0022: [{\u0022column\u0022: \u0022id\u0022, \u0022direction\u0022: \u0022asc\u0022}]}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027sqlserver\u0027, \u0027postgresql\u0027, or \u0027mysql\u0027, owned by the calling client (manage/connections)"},{"name":"table","required":true,"desc":"Source table name, optionally schema-qualified (e.g. \u0027invoices\u0027, \u0027dbo.Invoices\u0027, \u0027public.orders\u0027). Names match exactly as stored \u2014 use SqlListTables to see what exists"},{"name":"top","required":false,"desc":"Page size: how many rows one call returns, 1 to 500. A value above 500 is refused rather than quietly reduced; a bigger result is read by following \u0027cursor\u0027"},{"name":"columns","required":false,"desc":"Comma-separated column names to return (e.g. \u0027id,customer,total\u0027). Every name is checked against the table\u0027s real columns first. Omit for every column"},{"name":"filter","required":false,"desc":"Scope the read. An array of conditions, all ANDed: [{\u0022column\u0022: \u0022status\u0022, \u0022operator\u0022: \u0022eq\u0022, \u0022value\u0022: \u0022open\u0022}]. Operators: eq, ne, gt, ge, lt, le, contains, startswith, endswith, null, notnull, in, notin (in and notin each take an array of up to 20 values). Add \u0022valueType\u0022 (string, number, boolean, guid, datetime) when the value\u0027s type is not obvious from JSON. For OR, or to nest, pass {\u0022logic\u0022: \u0022or\u0022, \u0022conditions\u0022: [...]} instead of an array. A raw WHERE string is deliberately NOT accepted: the clause is compiled by the endpoint and every value travels as a driver parameter, so no caller text reaches the statement"},{"name":"orderBy","required":false,"desc":"Sort order, up to 5 columns: [{\u0022column\u0022: \u0022created_at\u0022, \u0022direction\u0022: \u0022desc\u0022}]. Direction defaults to \u0027asc\u0027. Required before you can page \u2014 without a defined order, which rows land on which page is undefined and a cursor can repeat or skip a row"},{"name":"cursor","required":false,"desc":"Continuation token. Pass back the \u0027cursor\u0027 from a previous response, unchanged, to read the next page. It is bound to the query that issued it: the same table, columns, filter and orderBy"},{"name":"count","required":false,"desc":"Ask the database for the total number of MATCHING rows alongside this page (returned as totalCount). Off by default \u2014 it is a second COUNT(*) statement"}]},{"name":"SqlListTables","category":"sources","tokens":1,"description":"Lists the tables a SQL connection can see, with each table\u0027s columns and their data types, read from INFORMATION_SCHEMA in all three dialects, and each table\u0027s foreign keys (the columns that point at another table, paired with the columns they reference). The discovery half of the SQL source, and what the data browser builds its table picker and its related-tables list from.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027sqlserver\u0027, \u0027postgresql\u0027, or \u0027mysql\u0027, owned by the calling client (manage/connections)"}]},{"name":"BlobReadFile","category":"sources","tokens":1,"description":"Reads a file out of an Azure Blob Storage container via a registry connection of type \u0027blob\u0027 owned by the calling client. The read half of #1228\u0027s write: until it landed a pipeline could deliver a document into a customer\u0027s container and could never pick one up. The connection holds the account URL and the SAS token or storage connection string \u2014 neither ever appears in the workflow definition.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022, \u0022path\u0022: \u0022invoices/2026/inv-1.pdf\u0022}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027blob\u0027, owned by the calling client (manage/connections)"},{"name":"path","required":true,"desc":"Blob name, optionally with folder segments (e.g. \u0027invoices/2026/inv-1.pdf\u0027). Max 1024 characters; no leading slash, no \u0027..\u0027, no control characters"},{"name":"container","required":false,"desc":"Overrides the connection\u0027s default container. Azure naming rules: 3-63 lowercase alphanumerics and single dashes"},{"name":"encoding","required":false,"desc":"Which payload field to answer with. \u0027auto\u0027 decides from the blob\u0027s own content type; \u0027text\u0027 forces UTF-8 text; \u0027base64\u0027 forces bytes"}]},{"name":"BlobListFiles","category":"sources","tokens":1,"description":"Lists the blobs under a prefix in an Azure Blob Storage container via a registry connection of type \u0027blob\u0027. A source without discovery is half a source: \u0027process every PDF that landed today\u0027 is unwritable if the only question you can ask is \u0027give me this exact path\u0027.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022, \u0022container\u0022: \u0022invoices\u0022, \u0022prefix\u0022: \u00222026/\u0022}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027blob\u0027, owned by the calling client (manage/connections)"},{"name":"container","required":false,"desc":"Overrides the connection\u0027s default container. Azure naming rules: 3-63 lowercase alphanumerics and single dashes"},{"name":"prefix","required":false,"desc":"The start of the blob names to list (e.g. \u0027invoices/2026/\u0027). This is a name prefix, not a folder \u2014 it need not end at a \u0027/\u0027. Omit to list the whole container"}]},{"name":"SftpDownloadFile","category":"sources","tokens":1,"description":"Downloads a file from an SFTP server via a registry connection of type \u0027sftp\u0027 owned by the calling client. The read half of #1227\u0027s upload. The connection holds the host and the password or private key \u2014 neither ever appears in the workflow definition.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022, \u0022path\u0022: \u0022inbox/inv-1.pdf\u0022}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027sftp\u0027, owned by the calling client (manage/connections)"},{"name":"path","required":true,"desc":"Remote path relative to the connection\u0027s rootPath (e.g. \u0027inbox/inv-1.pdf\u0027). Max 1024 characters; absolute paths, \u0027..\u0027, backslashes, empty segments and control characters are refused"}]},{"name":"SftpListFiles","category":"sources","tokens":1,"description":"Lists a directory on an SFTP server via a registry connection of type \u0027sftp\u0027. This is the endpoint that makes \u0027process everything in the inbound folder\u0027 writable.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022, \u0022path\u0022: \u0022inbound\u0022, \u0022filesOnly\u0022: true}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027sftp\u0027, owned by the calling client (manage/connections)"},{"name":"path","required":false,"desc":"Remote directory relative to the connection\u0027s rootPath (e.g. \u0027inbound\u0027). Absolute paths, \u0027..\u0027, backslashes and control characters are refused"},{"name":"limit","required":false,"desc":"How many entries to return. Clamped to 500"},{"name":"filesOnly","required":false,"desc":"Drop directories, symlinks and anything else from the listing"}]},{"name":"SftpWatchPoll","category":"sources","tokens":1,"description":"Runs one SFTP watcher\u0027s check immediately: lists the watched folder, works out what is new or changed since the last poll, and starts the registered workflow for each file. The same thing the watcher\u0027s timer does on its schedule \u2014 this is the button for \u0027check now\u0027, and for seeing what a watcher would pick up before you leave it running.","responseType":"json","sample":"{\u0022watchId\u0022: \u0022sfw_0123456789abcdef0123456789abcdef\u0022}","parameters":[{"name":"watchId","required":true,"desc":"The watcher to poll (sfw_\u2026), created through manage/sftp/{clientId}/watchers"},{"name":"dryRun","required":false,"desc":"Report what WOULD be delivered without starting any workflow and without charging. The folder is not marked as seen either, so a real poll afterwards still finds the same files"}]},{"name":"StorageDownloadFile","category":"sources","tokens":1,"description":"Downloads one file from the DocButterfly folder in a person\u0027s own Dropbox, Google Drive, OneDrive or Box, through a registry connection of type \u0027dropbox\u0027, \u0027googledrive\u0027, \u0027msgraphdrive\u0027 or \u0027box\u0027 owned by the calling client. One generic step serves all four providers: the connection decides which one, so a workflow written against Dropbox runs unchanged against a Drive.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022, \u0022id\u0022: \u002201ABCDEF2GHIJK3LMNOP4QRSTU\u0022}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027dropbox\u0027, \u0027googledrive\u0027, \u0027msgraphdrive\u0027 or \u0027box\u0027, owned by the calling client (manage/connections). Any other type is refused by name with STORAGE_BAD_CONNECTION_TYPE before a token is spent"},{"name":"id","required":false,"desc":"The opaque file id StorageListFolder returns. Preferred: it works on all four providers and survives a rename. Give this or path"},{"name":"path","required":false,"desc":"The file name in the DocButterfly folder, as a convenience when you already know it. Give this or id"}]},{"name":"StorageListFolder","category":"sources","tokens":1,"description":"Lists one page of the DocButterfly folder in a person\u0027s own Dropbox, Google Drive, OneDrive or Box, through a registry connection of type \u0027dropbox\u0027, \u0027googledrive\u0027, \u0027msgraphdrive\u0027 or \u0027box\u0027. This is the step that makes \u0027process everything that landed in my Drive\u0027 writable, and the id it returns is what StorageDownloadFile takes.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022, \u0022limit\u0022: 100}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027dropbox\u0027, \u0027googledrive\u0027, \u0027msgraphdrive\u0027 or \u0027box\u0027, owned by the calling client (manage/connections). Any other type is refused by name with STORAGE_BAD_CONNECTION_TYPE before a token is spent"},{"name":"path","required":false,"desc":"A subfolder of the DocButterfly folder. Omit for the folder itself"},{"name":"cursor","required":false,"desc":"The cursor the previous page returned, passed back unchanged, to read the next page. A cursor this service did not issue is refused with STORAGE_CURSOR_NOT_ALLOWED"},{"name":"limit","required":false,"desc":"How many entries to return. Anything above 500 is clamped to 500 and the rest is paged with the cursor"}]},{"name":"StorageWatchPoll","category":"sources","tokens":1,"description":"Runs one storage watcher\u0027s check immediately: lists the DocButterfly folder in the connected Dropbox, Google Drive, OneDrive or Box, works out what is new or changed since the last poll, and starts the registered workflow for each file. The same thing the watcher\u0027s timer does on its schedule; this is the button for \u0027check now\u0027, and for seeing what a watcher would pick up before you leave it running.","responseType":"json","sample":"{\u0022watchId\u0022: \u0022stw_0123456789abcdef0123456789abcdef\u0022}","parameters":[{"name":"watchId","required":true,"desc":"The watcher to poll (stw_\u2026), created through manage/storage/{clientId}/watchers"},{"name":"dryRun","required":false,"desc":"Report what WOULD be delivered without starting any workflow and without charging. The folder is not marked as seen either, so a real poll afterwards still finds the same files"}]},{"name":"BlobWatchPoll","category":"sources","tokens":1,"description":"Runs one Azure Blob watcher\u0027s check immediately: lists the watched folder of the container, works out what is new or changed since the last poll, and starts the registered workflow for each file. The same thing the watcher\u0027s timer does on its schedule; this is the button for \u0027check now\u0027, and for seeing what a watcher would pick up before you leave it running.","responseType":"json","sample":"{\u0022watchId\u0022: \u0022bbw_0123456789abcdef0123456789abcdef\u0022}","parameters":[{"name":"watchId","required":true,"desc":"The watcher to poll (bbw_\u2026), created through manage/blob/{clientId}/watchers"},{"name":"dryRun","required":false,"desc":"Report what WOULD be delivered without starting any workflow and without charging. The folder is not marked as seen either, so a real poll afterwards still finds the same files"}]},{"name":"S3WatchPoll","category":"sources","tokens":1,"description":"Runs one S3 watcher\u0027s check immediately: lists the watched folder of the bucket, works out what is new or changed since the last poll, and starts the registered workflow for each file. Works with any S3-compatible provider the S3 connection serves. The same thing the watcher\u0027s timer does on its schedule; this is the button for \u0027check now\u0027, and for seeing what a watcher would pick up before you leave it running.","responseType":"json","sample":"{\u0022watchId\u0022: \u0022s3w_0123456789abcdef0123456789abcdef\u0022}","parameters":[{"name":"watchId","required":true,"desc":"The watcher to poll (s3w_\u2026), created through manage/s3/{clientId}/watchers"},{"name":"dryRun","required":false,"desc":"Report what WOULD be delivered without starting any workflow and without charging. The folder is not marked as seen either, so a real poll afterwards still finds the same files"}]},{"name":"TableWatchPoll","category":"sources","tokens":1,"description":"Runs one table watcher\u0027s check immediately: reads the rows of a Dataverse table or a SQL Server, PostgreSQL or MySQL table that come after the watcher\u0027s last position, and starts the registered workflow for each one. The same thing the watcher\u0027s timer does on its schedule; this is the button for \u0027check now\u0027, and for seeing what a watcher would pick up before you leave it running.","responseType":"json","sample":"{\u0022watchId\u0022: \u0022tbw_0123456789abcdef0123456789abcdef\u0022}","parameters":[{"name":"watchId","required":true,"desc":"The watcher to poll (tbw_\u2026), created through manage/table/{clientId}/watchers"},{"name":"dryRun","required":false,"desc":"Report what WOULD be delivered without starting any workflow and without the per-row charge. The watcher\u0027s position does not move either, so a real poll afterwards still finds the same rows"}]},{"name":"ServiceBusReceiveMessages","category":"sources","tokens":1,"description":"Peeks messages from an Azure Service Bus queue or topic subscription via a registry connection of type \u0027servicebus\u0027. PEEK-LOCK ONLY, AND IT NEVER SETTLES: nothing is consumed and nothing is removed. The connection holds the namespace and the connection string or SAS token \u2014 neither ever appears in the workflow definition.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022, \u0022queueOrTopic\u0022: \u0022orders\u0022, \u0022maxMessages\u0022: 10, \u0022waitSeconds\u0022: 5}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027servicebus\u0027, owned by the calling client (manage/connections)"},{"name":"queueOrTopic","required":false,"desc":"Overrides the connection\u0027s default entity. May be hierarchical (e.g. \u0027orders/eu\u0027, \u0027orders/subscriptions/eu\u0027)"},{"name":"subscription","required":false,"desc":"Subscription name, when the entity is a topic. A topic itself cannot be received from \u2014 only its subscriptions can"},{"name":"maxMessages","required":false,"desc":"How many messages to peek, 1-32. The REST peek-lock takes ONE message per request, so this is a loop and therefore a wall-clock cap as much as a size cap"},{"name":"waitSeconds","required":false,"desc":"How long Service Bus holds each request open waiting for a message, 0-30"}]},{"name":"S3GetObject","category":"sources","tokens":1,"description":"Reads an object out of an Amazon S3 bucket \u2014 or any S3-compatible store (MinIO, Cloudflare R2, Wasabi, Backblaze B2, Google Cloud Storage\u0027s interoperability API) \u2014 via a registry connection of type \u0027s3\u0027 owned by the calling client. S3 speaks its own signed HTTP protocol, so it cannot be expressed as a \u0027rest\u0027 connection and RestRequest does not cover it. The connection holds the bucket, region, optional endpoint, and the access key pair; none of them ever appear in the workflow definition.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022, \u0022key\u0022: \u0022invoices/2026/inv-1.pdf\u0022}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027s3\u0027, owned by the calling client (manage/connections)"},{"name":"key","required":true,"desc":"Object key, optionally with folder-style segments (e.g. \u0027invoices/2026/inv-1.pdf\u0027). Max 1024 characters; no leading slash, no \u0027..\u0027, no control characters"},{"name":"bucket","required":false,"desc":"Overrides the connection\u0027s default bucket. S3 naming rules: 3-63 lowercase alphanumerics, dots and dashes"},{"name":"encoding","required":false,"desc":"Which payload field to answer with. \u0027auto\u0027 decides from the object\u0027s own content type; \u0027text\u0027 forces UTF-8 text; \u0027base64\u0027 forces bytes"}]},{"name":"S3ListObjects","category":"sources","tokens":1,"description":"Lists the objects under a prefix in an S3 bucket (ListObjectsV2) via a registry connection of type \u0027s3\u0027. The discovery half of the S3 source, and the same connection type reaches every S3-compatible provider.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022, \u0022bucket\u0022: \u0022acme-docs\u0022, \u0022prefix\u0022: \u0022invoices/2026/\u0022}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027s3\u0027, owned by the calling client (manage/connections)"},{"name":"bucket","required":false,"desc":"Overrides the connection\u0027s default bucket. S3 naming rules: 3-63 lowercase alphanumerics, dots and dashes"},{"name":"prefix","required":false,"desc":"The start of the object keys to list (e.g. \u0027invoices/2026/\u0027). This is a key prefix, not a folder \u2014 it need not end at a \u0027/\u0027. Omit to list the whole bucket"}]},{"name":"SpGetFile","category":"sources","tokens":1,"description":"Pulls a document out of a SharePoint document library (or a OneDrive for Business drive \u2014 the same Graph surface) via a registry connection of type \u0027sharepoint\u0027. App-only Microsoft Graph with Sites.Selected: the app reaches only the sites a SharePoint administrator has explicitly granted it, never the tenant. Returns the bytes plus the library\u0027s own columns for that document, which is what makes \u0027extract the vendor with Document AI, then tag the invoice\u0027 one chain instead of two integrations.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022, \u0022path\u0022: \u0022Invoices/2026/inv-1.pdf\u0022}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027sharepoint\u0027, owned by the calling client (manage/connections)"},{"name":"itemId","required":false,"desc":"The Graph driveItem id. Stable across a rename or a move, and what a SpListFiles row hands back. Exactly one of itemId, path or sharingUrl"},{"name":"path","required":false,"desc":"Drive-relative path, e.g. \u0027Invoices/2026/inv-1.pdf\u0027. Max 1024 characters; no leading slash needed, no \u0027..\u0027, no backslashes. Exactly one of itemId, path or sharingUrl"},{"name":"sharingUrl","required":false,"desc":"A link copied from SharePoint\u0027s Share dialog. Carries its own site and drive, so the connection\u0027s site is not consulted. Exactly one of itemId, path or sharingUrl"},{"name":"siteUrl","required":false,"desc":"Address a different site than the connection\u0027s default. Still bound by the same grant \u2014 an ungranted site is refused"},{"name":"driveId","required":false,"desc":"Address a specific document library by id, overriding the connection\u0027s driveId/libraryName"},{"name":"libraryName","required":false,"desc":"Address a document library by name (e.g. \u0027Contracts\u0027), matched case-insensitively. Omit for the site\u0027s default library"},{"name":"encoding","required":false,"desc":"Which payload field to answer with. \u0027auto\u0027 decides from the document\u0027s own content type; \u0027text\u0027 forces UTF-8 text; \u0027base64\u0027 forces bytes"},{"name":"includeFields","required":false,"desc":"Return the library columns for this document as listItem.fields. One extra Graph call; set false when fetching many files and you only want bytes"}]},{"name":"SpListSites","category":"sources","tokens":1,"description":"Resolves the SharePoint site a connection points at, and \u2014 where the app registration allows it \u2014 searches for others. The first screen of a SharePoint picker.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027sharepoint\u0027, owned by the calling client (manage/connections)"},{"name":"siteUrl","required":false,"desc":"Resolve this site instead of the connection\u0027s default. Paste it from your browser\u0027s address bar"},{"name":"search","required":false,"desc":"A site name to search for. Attempted, not assumed: under Sites.Selected the search is refused and the answer says so"}]},{"name":"SpListLibraries","category":"sources","tokens":1,"description":"Lists the document libraries (drives) in a SharePoint site. The second screen of a SharePoint picker, and how you find the library name or drive id every other SharePoint call takes.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027sharepoint\u0027, owned by the calling client (manage/connections)"},{"name":"siteUrl","required":false,"desc":"List the libraries of this site instead of the connection\u0027s default"}]},{"name":"SpListFiles","category":"sources","tokens":1,"description":"Enumerates a folder in a SharePoint document library, with real paging and an optional recursive walk. Returns ids, paths and metadata WITHOUT content, so it is cheap to run over a whole library and then fan out to SpGetFile for the documents you actually want.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022, \u0022folderPath\u0022: \u0022Invoices/2026\u0022, \u0022filesOnly\u0022: true}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027sharepoint\u0027, owned by the calling client (manage/connections)"},{"name":"folderPath","required":false,"desc":"Drive-relative folder, e.g. \u0027Invoices/2026\u0027. Omit for the library root. No \u0027..\u0027, no backslashes"},{"name":"recursive","required":false,"desc":"Walk sub-folders too. Budgeted \u2014 see the notes"},{"name":"filesOnly","required":false,"desc":"Drop folders from the listing"},{"name":"limit","required":false,"desc":"How many items to return. Clamped to 500"},{"name":"cursor","required":false,"desc":"The nextCursor from a previous page. Must be a token this endpoint issued"},{"name":"siteUrl","required":false,"desc":"Address a different site than the connection\u0027s default"},{"name":"driveId","required":false,"desc":"Address a specific document library by id"},{"name":"libraryName","required":false,"desc":"Address a document library by name, matched case-insensitively"}]},{"name":"SpSearchFiles","category":"sources","tokens":1,"description":"Searches a SharePoint document library for a term and narrows the results by file extension and modified date. Metadata only, no content \u2014 the discovery half of \u0027process every invoice that arrived this week\u0027.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022, \u0022query\u0022: \u0022invoice\u0022, \u0022extensions\u0022: \u0022pdf\u0022, \u0022modifiedAfter\u0022: \u00222026-09-01T00:00:00Z\u0022}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027sharepoint\u0027, owned by the calling client (manage/connections)"},{"name":"query","required":true,"desc":"What to search for. Max 256 characters; quotes and backslashes are refused"},{"name":"folderPath","required":false,"desc":"Search inside this folder only"},{"name":"extensions","required":false,"desc":"Comma list or array of extensions to keep, e.g. \u0027pdf,docx\u0027"},{"name":"modifiedAfter","required":false,"desc":"ISO 8601 \u2014 keep items modified at or after this instant"},{"name":"modifiedBefore","required":false,"desc":"ISO 8601 \u2014 keep items modified at or before this instant"},{"name":"filesOnly","required":false,"desc":"Drop folders from the results"},{"name":"limit","required":false,"desc":"How many items to return. Clamped to 500"},{"name":"siteUrl","required":false,"desc":"Address a different site than the connection\u0027s default"},{"name":"driveId","required":false,"desc":"Address a specific document library by id"},{"name":"libraryName","required":false,"desc":"Address a document library by name, matched case-insensitively"}]},{"name":"SpWatchPoll","category":"sources","tokens":1,"description":"Runs one SharePoint watcher\u0027s check immediately: reads what changed in the watched folder since the last poll and starts the registered workflow for each new or changed file. The same thing the watcher\u0027s timer does on its schedule \u2014 this is the button for \u0027check now\u0027, and for seeing what a watcher would pick up before you leave it running.","responseType":"json","sample":"{\u0022watchId\u0022: \u0022spw_0123456789abcdef0123456789abcdef\u0022}","parameters":[{"name":"watchId","required":true,"desc":"The watcher to poll (spw_\u2026), created through manage/sharepoint/{clientId}/watchers"},{"name":"dryRun","required":false,"desc":"Report what WOULD be delivered without starting any workflow and without charging. The change token is not advanced either, so a real poll afterwards still sees the same files"}]},{"name":"SpGetMetadata","category":"sources","tokens":1,"description":"Reads the library column values on one document in a SharePoint or OneDrive library, via a registry connection of type \u0027sharepoint\u0027. These are the fields a library\u0027s views, filters and retention rules actually run on \u2014 the vendor, the invoice total, the status \u2014 not the file\u0027s own properties.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022, \u0022siteUrl\u0022: \u0022https://contoso.sharepoint.com/sites/Finance\u0022, \u0022libraryName\u0022: \u0022Documents\u0022, \u0022path\u0022: \u0022Invoices/2026/invoice-1042.pdf\u0022, \u0022includeColumns\u0022: true}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027sharepoint\u0027, owned by the calling client (manage/connections)"},{"name":"itemId","required":false,"desc":"Graph drive item id \u2014 what SpUploadFile and SpGetFile return. Use this or path"},{"name":"path","required":false,"desc":"The document\u0027s location inside the library (e.g. \u0027Invoices/2026/invoice-1042.pdf\u0027). Use this or itemId"},{"name":"siteUrl","required":false,"desc":"The site\u0027s browser address. Overrides the connection\u0027s site"},{"name":"siteId","required":false,"desc":"Graph site id. Overrides the connection\u0027s site"},{"name":"driveId","required":false,"desc":"Graph drive id of the library. Overrides the connection\u0027s library"},{"name":"libraryName","required":false,"desc":"The library\u0027s display name (e.g. \u0027Documents\u0027), matched within the site"},{"name":"includeColumns","required":false,"desc":"Also return the library\u0027s column DEFINITIONS \u2014 name, display name, type, required, choices \u2014 which is what a mapping screen needs before it can propose anything. One extra Graph call, so it is opt-in"}]},{"name":"DocButterflyReadTemplate","category":"sources","tokens":1,"description":"Reads one template saved on your own DocButterfly account, by id, through a connection of type \u0027dbfClient\u0027 (DocButterfly, this account). The connection has no credential: the account that owns it is the account it reads, so a workflow picks the account\u0027s own templates the way it picks any other source.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022, \u0022templateId\u0022: \u00223f2b8c1e-5d4a-4f6b-9c0d-1e2f3a4b5c6d\u0022}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027dbfClient\u0027, owned by the calling client (manage/connections)"},{"name":"templateId","required":true,"desc":"The id of a template saved on this account"}]},{"name":"DocButterflyReadVaultDocument","category":"sources","tokens":1,"description":"Reads one document out of your own DocButterfly vault, from its non-lockbox side, through a connection of type \u0027dbfClient\u0027 (DocButterfly, this account). The newest version unless you name one, as the original file\u0027s bytes.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022, \u0022documentId\u0022: 42}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027dbfClient\u0027, owned by the calling client (manage/connections)"},{"name":"documentId","required":true,"desc":"The vault document\u0027s id, a positive whole number"},{"name":"version","required":false,"desc":"Which version to read. Leave it out for the newest"},{"name":"side","required":false,"desc":"Which side of the vault to read. Only the non-lockbox side can be read by a workflow; \u0027lockbox\u0027 is refused with 403 VAULT_LOCKBOX_SEALED"}]},{"name":"ConnectionTest","category":"sources","tokens":1,"description":"Answers \u0027does this saved connection actually work?\u0027 for every registry connection type \u2014 dataverse, rest, sqlserver, postgresql, mysql, sftp, blob and servicebus \u2014 with one request shape. Each type has its own read-only probe: a WhoAmI call, a GET of the base URL, SELECT 1, an stat of the SFTP root, getProperties on the container, or a GET of the Service Bus entity description.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of any type, owned by the calling client (manage/connections)"}]},{"name":"DataverseCreateRows","category":"destinations","tokens":1,"description":"Creates rows in a Dataverse (Dynamics 365 / Power Platform) table via a registry connection of type \u0027dataverse\u0027 owned by the calling client. The connection holds the org URL and credential \u2014 neither ever appears in the workflow definition.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022, \u0022entitySet\u0022: \u0022contacts\u0022, \u0022rows\u0022: [{\u0022firstname\u0022: \u0022Ada\u0022, \u0022lastname\u0022: \u0022Lovelace\u0022}]}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027dataverse\u0027, owned by the calling client (manage/connections)"},{"name":"entitySet","required":true,"desc":"Dataverse Web API entity set name \u2014 plural, lowercase (e.g. \u0027contacts\u0027, \u0027cr123_orders\u0027)"},{"name":"rows","required":true,"desc":"Non-empty array of row objects; keys are Dataverse logical attribute names"},{"name":"fieldMap","required":false,"desc":"Maps submission field names to destination columns: {\u0022surname\u0022: \u0022lastname\u0022}. When set, ONLY mapped fields are sent \u2014 unmapped keys are dropped, and a field a row does not carry contributes no attribute at all (never a null, which would clear the column). Omit it and rows pass through exactly as before."},{"name":"lookupBinds","required":false,"desc":"Sets LOOKUPS from an id the row already carries: {\u0022parentcustomerid_account.accountid\u0022: \u0022accounts\u0022} reads the related record\u0027s id at that path and sends \u0022parentcustomerid_account@odata.bind\u0022: \u0022/accounts(\u003Cguid\u003E)\u0022. A row with no id there gets no bind at all (never a null, which would clear the lookup), and the response names those navigations in \u0027skippedLookups\u0027. It never creates the related record"},{"name":"idempotencyKeyColumn","required":false,"desc":"OPT-IN idempotency. The logical name of a string column on this table that carries a PUBLISHED ALTERNATE KEY (e.g. \u0022dbf_idempotencykey\u0022, at least 72 characters wide). Set it and each row is written as an alternate-key upsert addressed by that column instead of a plain create, so repeating the write produces one row rather than two; row i of a multi-row call is keyed distinctly. Omit it and rows are created exactly as before. It is never assumed \u2014 addressing the wrong column would overwrite an unrelated record, which is worse than the duplicate it would prevent"},{"name":"continueOnError","required":false,"desc":"Keep creating remaining rows after one fails (result reports per-row errors)"}]},{"name":"DataverseWriteFile","category":"destinations","tokens":1,"description":"Writes a document into a Dataverse File (or Image) column, through a registry connection of type \u0027dataverse\u0027 owned by the calling client. This is the delivery end of the document drop point established by the child-table pattern: DocButterfly puts the finished document on the customer\u0027s record and their flow picks it up. Files above 4 MB are uploaded through Dataverse\u0027s chunked session automatically \u2014 the caller sends one request either way.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022, \u0022entitySet\u0022: \u0022dbf_documentdrops\u0022, \u0022recordId\u0022: \u0022be83416a-45a9-f111-aaac-70a8a5b10a05\u0022, \u0022column\u0022: \u0022dbf_file\u0022, \u0022fileName\u0022: \u0022proposal-bundle.zip\u0022, \u0022contentBase64\u0022: \u0022UEsDBBQ\u2026\u0022}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027dataverse\u0027, owned by the calling client (manage/connections)"},{"name":"entitySet","required":true,"desc":"Dataverse Web API entity set name \u2014 plural, lowercase (e.g. \u0027dbf_documentdrops\u0027, \u0027contacts\u0027)"},{"name":"recordId","required":true,"desc":"The record\u0027s GUID, plain 8-4-4-4-12 form with no braces. The record must already exist \u2014 this writes a column, it does not create rows (see DataverseCreateRows)"},{"name":"column","required":true,"desc":"The File column\u0027s attribute logical name (e.g. \u0027dbf_file\u0027)"},{"name":"fileName","required":true,"desc":"The file\u0027s name, e.g. \u0027proposal-bundle.zip\u0027. REQUIRED, and it carries the extension: Dataverse stores no media type, so the name is the only thing that tells a later read what the file is. Printable ASCII, no path separators, no \u0027..\u0027"},{"name":"contentBase64","required":true,"desc":"The file\u0027s bytes, base64-encoded. Up to 33554432 bytes (32 MB) decoded"}]},{"name":"DataverseDeleteFile","category":"destinations","tokens":1,"description":"Clears the file out of a Dataverse File (or Image) column, through a registry connection of type \u0027dataverse\u0027 owned by the calling client. The third operation of the drop-point pattern: a flow drains the document and then empties the column so the next one is unambiguous. It clears a COLUMN \u2014 the record itself is untouched.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022, \u0022entitySet\u0022: \u0022dbf_documentdrops\u0022, \u0022recordId\u0022: \u0022be83416a-45a9-f111-aaac-70a8a5b10a05\u0022, \u0022column\u0022: \u0022dbf_file\u0022}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027dataverse\u0027, owned by the calling client (manage/connections)"},{"name":"entitySet","required":true,"desc":"Dataverse Web API entity set name \u2014 plural, lowercase (e.g. \u0027dbf_documentdrops\u0027)"},{"name":"recordId","required":true,"desc":"The record\u0027s GUID, plain 8-4-4-4-12 form with no braces"},{"name":"column","required":true,"desc":"The File column\u0027s attribute logical name (e.g. \u0027dbf_file\u0027)"}]},{"name":"DataverseWriteEmailAttachment","category":"destinations","tokens":1,"description":"Replaces the placeholder attachment on a DRAFT email in Dataverse (Dynamics 365) with your document, through a registry connection of type \u0027dataverse\u0027 owned by the calling client. Built for the proposal path: the CRM creates the draft email and a placeholder attachment at the right sales stage, a workflow fills the proposal, and this puts it in the placeholder\u0027s place, so the email is ready to go with the real document on it.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022, \u0022attachmentId\u0022: \u00225d1c2b3a-9f8e-4d7c-a6b5-0123456789ab\u0022, \u0022fileName\u0022: \u0022proposal-Q-01042.pdf\u0022, \u0022contentBase64\u0022: \u0022JVBERi0xLjcK\u2026\u0022}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027dataverse\u0027, owned by the calling client (manage/connections)"},{"name":"attachmentId","required":true,"desc":"The email attachment\u0027s GUID (its activitymimeattachmentid), plain 8-4-4-4-12 form with no braces. It must belong to an email that is still a Draft"},{"name":"fileName","required":true,"desc":"The name the recipient sees on the attachment, with its extension, e.g. \u0027proposal-Q-01042.pdf\u0027. Printable ASCII, no path separators, no \u0027..\u0027"},{"name":"contentBase64","required":true,"desc":"The document\u0027s bytes, base64-encoded. Up to 33554432 bytes (32 MB) decoded"},{"name":"mimeType","required":false,"desc":"The media type stored on the attachment, e.g. \u0027application/pdf\u0027. Leave it out and it is worked out from the bytes, then from the file name\u0027s extension; mimeTypeSource in the response says which"}]},{"name":"SqlInsertRows","category":"destinations","tokens":1,"description":"Inserts rows into a SQL table via a registry connection of type \u0027sqlserver\u0027, \u0027postgresql\u0027, or \u0027mysql\u0027 owned by the calling client. The dialect comes from the connection \u2014 the request is identical for all three. The connection holds the host, database, and credential; none of them ever appear in the workflow definition.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022, \u0022table\u0022: \u0022dbo.Invoices\u0022, \u0022rows\u0022: [{\u0022customer\u0022: \u0022Acme Corp\u0022, \u0022total\u0022: 582.62}]}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027sqlserver\u0027, \u0027postgresql\u0027, or \u0027mysql\u0027, owned by the calling client (manage/connections)"},{"name":"table","required":true,"desc":"Target table name, optionally schema-qualified (e.g. \u0027invoices\u0027, \u0027dbo.Invoices\u0027, \u0027public.orders\u0027)"},{"name":"rows","required":true,"desc":"Non-empty array of row objects (max 100 per call); keys are column names"},{"name":"fieldMap","required":false,"desc":"Maps submission field names to destination columns: {\u0022Full Name\u0022: \u0022full_name\u0022}. When set, ONLY mapped fields are sent \u2014 unmapped keys are dropped, and a field a row does not carry contributes no column at all (never a null). Omit it and rows pass through exactly as before."},{"name":"continueOnError","required":false,"desc":"Keep inserting remaining rows after one fails (result reports per-row errors)"}]},{"name":"BlobWriteFile","category":"destinations","tokens":1,"description":"Writes a file into an Azure Blob Storage container via a registry connection of type \u0027blob\u0027 owned by the calling client. The connection holds the account URL and the SAS token or storage connection string \u2014 neither ever appears in the workflow definition.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022, \u0022path\u0022: \u0022invoices/2026/inv-1.pdf\u0022, \u0022contentBase64\u0022: \u0022JVBERi0xLjcK...\u0022, \u0022contentType\u0022: \u0022application/pdf\u0022}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027blob\u0027, owned by the calling client (manage/connections)"},{"name":"path","required":true,"desc":"Blob name, optionally with folder segments (e.g. \u0027invoices/2026/inv-1.pdf\u0027). Max 1024 characters; no leading slash, no \u0027..\u0027, no control characters"},{"name":"contentBase64","required":true,"desc":"The file\u0027s bytes, base64-encoded (max 32 MB per call)"},{"name":"container","required":false,"desc":"Overrides the connection\u0027s default container. Azure naming rules: 3-63 lowercase alphanumerics and single dashes"},{"name":"contentType","required":false,"desc":"MIME type stored on the blob"},{"name":"overwrite","required":false,"desc":"Replace an existing blob at that path instead of failing with 409"},{"name":"createContainer","required":false,"desc":"Create the container if it does not exist"}]},{"name":"SftpUploadFile","category":"destinations","tokens":1,"description":"Uploads a file to an SFTP server via a registry connection of type \u0027sftp\u0027 owned by the calling client. The connection holds the host and the password or private key \u2014 neither ever appears in the workflow definition.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022, \u0022path\u0022: \u0022inbox/inv-1.pdf\u0022, \u0022contentBase64\u0022: \u0022JVBERi0xLjcK...\u0022, \u0022createDirectories\u0022: true}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027sftp\u0027, owned by the calling client (manage/connections)"},{"name":"path","required":true,"desc":"Remote path relative to the connection\u0027s rootPath (e.g. \u0027inbox/inv-1.pdf\u0027). Max 1024 characters; absolute paths, \u0027..\u0027, backslashes, empty segments and control characters are refused"},{"name":"contentBase64","required":true,"desc":"The file\u0027s bytes, base64-encoded (max 32 MB per call)"},{"name":"overwrite","required":false,"desc":"Replace an existing file at that path instead of failing with 409"},{"name":"createDirectories","required":false,"desc":"Create the parent directories if they do not exist"}]},{"name":"SftpMoveFile","category":"destinations","tokens":1,"description":"Moves (renames) one file on an SFTP server via a registry connection of type \u0027sftp\u0027 owned by the calling client \u2014 for example filing a dropped job zip into its own job folder once a workflow has picked it up. No file bytes pass through DocButterfly.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022, \u0022fromPath\u0022: \u0022inbound/job0001.zip\u0022, \u0022toPath\u0022: \u0022job0001/input/job0001.zip\u0022}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027sftp\u0027, owned by the calling client (manage/connections)"},{"name":"fromPath","required":true,"desc":"The file to move, relative to the connection\u0027s rootPath (e.g. \u0027inbound/job0001.zip\u0027). Absolute paths, \u0027..\u0027, backslashes, empty segments and control characters are refused"},{"name":"toPath","required":true,"desc":"Where the file should end up, relative to the connection\u0027s rootPath (e.g. \u0027job0001/input/job0001.zip\u0027). Same rules as fromPath. Missing parent folders are created"},{"name":"overwrite","required":false,"desc":"Replace an existing FILE at toPath instead of failing with 409. A folder at toPath is never replaced"}]},{"name":"StorageUploadFile","category":"destinations","tokens":1,"description":"Writes one file into the DocButterfly folder in a person\u0027s own Dropbox, Google Drive, OneDrive or Box, through a registry connection of type \u0027dropbox\u0027, \u0027googledrive\u0027, \u0027msgraphdrive\u0027 or \u0027box\u0027 owned by the calling client. One generic step serves all four providers: the connection decides which one, so the same workflow delivers to whichever the customer connected.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022, \u0022path\u0022: \u0022invoice-9.pdf\u0022, \u0022contentBase64\u0022: \u0022JVBERi0xLjcK...\u0022, \u0022contentType\u0022: \u0022application/pdf\u0022}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027dropbox\u0027, \u0027googledrive\u0027, \u0027msgraphdrive\u0027 or \u0027box\u0027, owned by the calling client (manage/connections). Any other type is refused by name with STORAGE_BAD_CONNECTION_TYPE before a token is spent"},{"name":"path","required":true,"desc":"The FILE NAME to write, not a path. Everything lands in the DocButterfly folder itself; separators, control characters and leading or trailing dots are removed rather than refused, and the name is shortened to 200 characters"},{"name":"contentBase64","required":true,"desc":"The file\u0027s bytes, base64-encoded (max 4 MB per call)"},{"name":"contentType","required":false,"desc":"The media type to store the file as"}]},{"name":"ServiceBusSendMessages","category":"destinations","tokens":1,"description":"Sends a batch of messages to an Azure Service Bus queue or topic via a registry connection of type \u0027servicebus\u0027 owned by the calling client. The connection holds the namespace and the connection string or SAS token \u2014 neither ever appears in the workflow definition.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022, \u0022queueOrTopic\u0022: \u0022orders\u0022, \u0022messages\u0022: [{\u0022body\u0022: {\u0022orderId\u0022: 42}, \u0022label\u0022: \u0022order-created\u0022, \u0022contentType\u0022: \u0022application/json\u0022, \u0022properties\u0022: {\u0022source\u0022: \u0022docbutterfly\u0022}}]}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027servicebus\u0027, owned by the calling client (manage/connections)"},{"name":"messages","required":true,"desc":"1-100 messages. Each is either a plain string, or an object { body, contentType?, timeToLiveSeconds?, properties?, messageId?, correlationId?, sessionId?, label?, partitionKey?, replyTo?, to? }. An object body is sent as JSON text"},{"name":"queueOrTopic","required":false,"desc":"Overrides the connection\u0027s default entity. May be hierarchical (e.g. \u0027orders/eu\u0027)"}]},{"name":"S3PutObject","category":"destinations","tokens":1,"description":"Writes an object into an Amazon S3 bucket \u2014 or any S3-compatible store (MinIO, Cloudflare R2, Wasabi, Backblaze B2, Google Cloud Storage\u0027s interoperability API) \u2014 via a registry connection of type \u0027s3\u0027 owned by the calling client. The connection holds the bucket, region, optional endpoint, and the access key pair; none of them ever appear in the workflow definition.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022, \u0022key\u0022: \u0022invoices/2026/inv-1.pdf\u0022, \u0022contentBase64\u0022: \u0022JVBERi0xLjcK...\u0022, \u0022contentType\u0022: \u0022application/pdf\u0022}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027s3\u0027, owned by the calling client (manage/connections)"},{"name":"key","required":true,"desc":"Object key, optionally with folder-style segments (e.g. \u0027invoices/2026/inv-1.pdf\u0027). Max 1024 characters; no leading slash, no \u0027..\u0027, no control characters"},{"name":"contentBase64","required":true,"desc":"The file\u0027s bytes, base64-encoded (max 32 MB per call)"},{"name":"bucket","required":false,"desc":"Overrides the connection\u0027s default bucket. S3 naming rules: 3-63 lowercase alphanumerics, dots and dashes"},{"name":"contentType","required":false,"desc":"MIME type stored on the object"},{"name":"overwrite","required":false,"desc":"Replace an existing object at that key. See the notes \u2014 this defaults TRUE, unlike BlobWriteFile"}]},{"name":"SpUploadFile","category":"destinations","tokens":1,"description":"Files a document into a SharePoint or OneDrive document library via a registry connection of type \u0027sharepoint\u0027 owned by the calling client. Authentication is app-only Microsoft Graph with Sites.Selected, so the app reaches only the sites your administrator granted it \u2014 one at a time, never the tenant. The connection holds the tenant, the app registration and its secret, and may carry a default site, library and folder that a call overrides.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022, \u0022siteUrl\u0022: \u0022https://contoso.sharepoint.com/sites/Finance\u0022, \u0022libraryName\u0022: \u0022Documents\u0022, \u0022folderPath\u0022: \u0022Invoices/2026\u0022, \u0022fileName\u0022: \u0022invoice-1042.pdf\u0022, \u0022contentBase64\u0022: \u0022JVBERi0xLjcK...\u0022, \u0022conflictBehavior\u0022: \u0022rename\u0022}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027sharepoint\u0027, owned by the calling client (manage/connections)"},{"name":"fileName","required":true,"desc":"The file\u0027s name inside the library (e.g. \u0027invoice-1042.pdf\u0027). SharePoint refuses \u003C \u003E : \u0022 | ? * \\ / and control characters, and names that end in a period"},{"name":"contentBase64","required":true,"desc":"The file\u0027s bytes, base64-encoded (max 100 MB per call). Anything over 4 MB is uploaded through a Graph upload session automatically"},{"name":"siteUrl","required":false,"desc":"The site\u0027s browser address (https://contoso.sharepoint.com/sites/Finance). Overrides the connection\u0027s site"},{"name":"libraryName","required":false,"desc":"The library\u0027s display name (e.g. \u0027Documents\u0027), matched within the site. Use it instead of driveId"},{"name":"folderPath","required":false,"desc":"Folder inside the library, \u0027/\u0027-separated (e.g. \u0027Invoices/2026\u0027). Omit to write to the library root; overrides the connection\u0027s folder"},{"name":"conflictBehavior","required":false,"desc":"What to do when a file of that name is already there: \u0027rename\u0027 keeps both, \u0027replace\u0027 overwrites the existing one, \u0027fail\u0027 refuses with 409 and changes nothing"},{"name":"siteId","required":false,"desc":"Graph site id, if you already have one. Overrides the connection\u0027s site"},{"name":"driveId","required":false,"desc":"Graph drive id of the target library. Overrides the connection\u0027s library"},{"name":"createFolders","required":false,"desc":"Create the folders on folderPath if they are missing. Set false to require the folder to exist (404 naming it)"},{"name":"contentType","required":false,"desc":"MIME type sent with the bytes"},{"name":"fields","required":false,"desc":"Library column values to set on the new item in the same call, validated exactly as SpSetMetadata validates them: {\u0022Vendor\u0022: \u0022Acme\u0022, \u0022InvoiceTotal\u0022: 582.62}"}]},{"name":"SpSetMetadata","category":"destinations","tokens":1,"description":"Writes library column values onto one document in a SharePoint or OneDrive library, via a registry connection of type \u0027sharepoint\u0027. This is the second half of \u0027extract it, then tag it\u0027: the values Document AI reads off an invoice become the columns the library\u0027s own views, filters and retention rules run on.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022, \u0022siteUrl\u0022: \u0022https://contoso.sharepoint.com/sites/Finance\u0022, \u0022libraryName\u0022: \u0022Documents\u0022, \u0022path\u0022: \u0022Invoices/2026/invoice-1042.pdf\u0022, \u0022fields\u0022: {\u0022Vendor\u0022: \u0022Acme\u0022, \u0022InvoiceTotal\u0022: 582.62, \u0022Status\u0022: \u0022Open\u0022}}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027sharepoint\u0027, owned by the calling client (manage/connections)"},{"name":"fields","required":true,"desc":"The columns to set, by INTERNAL name: {\u0022Vendor\u0022: \u0022Acme\u0022, \u0022InvoiceTotal\u0022: 582.62, \u0022Status\u0022: \u0022Open\u0022}. An explicit null clears a column"},{"name":"itemId","required":false,"desc":"Graph drive item id \u2014 what SpUploadFile and SpGetFile return. Use this or path"},{"name":"path","required":false,"desc":"The document\u0027s location inside the library (e.g. \u0027Invoices/2026/invoice-1042.pdf\u0027). Use this or itemId"},{"name":"siteUrl","required":false,"desc":"The site\u0027s browser address. Overrides the connection\u0027s site"},{"name":"siteId","required":false,"desc":"Graph site id. Overrides the connection\u0027s site"},{"name":"driveId","required":false,"desc":"Graph drive id of the library. Overrides the connection\u0027s library"},{"name":"libraryName","required":false,"desc":"The library\u0027s display name (e.g. \u0027Documents\u0027), matched within the site"}]},{"name":"AdoUploadAttachment","category":"destinations","tokens":1,"description":"Uploads one file to Azure DevOps as a work item attachment, through a registry connection of type \u0027rest\u0027 pointing at https://dev.azure.com/\u003Corganization\u003E and owned by the calling client. It answers with the attachment\u0027s url, which is what a work item create or update then relates as an AttachedFile. There is deliberately no separate create-work-item endpoint: a work item is created by RestRequest against the same connection, and the fields, the parent link and the attachment relations all ride in ONE JSON Patch document on that call.","responseType":"json","sample":"{\u0022connectionId\u0022: \u0022conn_0123456789abcdef0123456789abcdef\u0022, \u0022project\u0022: \u0022Fabrikam Fiber\u0022, \u0022fileName\u0022: \u0022inspection-report.pdf\u0022, \u0022contentBase64\u0022: \u0022JVBERi0xLjcK...\u0022}","parameters":[{"name":"connectionId","required":true,"desc":"Registry connection id (conn_\u2026) of type \u0027rest\u0027 whose baseUrl is your Azure DevOps organization, owned by the calling client (manage/connections)"},{"name":"project","required":true,"desc":"The Azure DevOps project the attachment belongs to, by name or id. Spaces and hyphens are fine; \u0027/\u0027, \u0027\\\u0027, \u0027?\u0027 and \u0027#\u0027 are refused because they would retarget the call"},{"name":"fileName","required":true,"desc":"The name the file appears under on the work item, e.g. \u0027inspection-report.pdf\u0027. Azure DevOps stores no media type, so the extension here is what tells a reader what the file is. No path separators and no \u0027..\u0027"},{"name":"contentBase64","required":true,"desc":"The file\u0027s bytes, base64-encoded. Up to 33554432 bytes (32 MB) decoded"},{"name":"ext","required":false,"desc":"Replaces fileName\u0027s extension. It exists for one case: a compose step that had to fall back to HTML reports the format it actually produced, and attaching HTML bytes under a .pdf name hands the reader a file their viewer refuses to open"},{"name":"apiVersion","required":false,"desc":"Azure DevOps api-version for this call. It is mandatory on every Azure DevOps request and rides as a query parameter"}]},{"name":"SendWithFlyaDoc","category":"destinations","tokens":1,"description":"Sends one file to a FlyaDoc address from a workflow. The file is locked to the recipient\u0027s own published keys before it is stored, the same way the FlyaDoc page locks it in a browser, and it arrives, notifies the recipient and is received exactly like a file sent by hand, with the same receipt once they open it. Pair it with a folder watcher to send every new file in an SFTP or cloud folder to someone\u0027s FlyaDoc address.","responseType":"json","sample":"{\u0022address\u0022: \u0022acme-records@flyadoc.com\u0022, \u0022fileName\u0022: \u0022invoice-1042.pdf\u0022, \u0022contentBase64\u0022: \u0022JVBERi0xLjcK...\u0022, \u0022contentType\u0022: \u0022application/pdf\u0022}","parameters":[{"name":"address","required":true,"desc":"The FlyaDoc address to send to: name@flyadoc.com, @name or name. An email address at any other domain is refused"},{"name":"fileName","required":true,"desc":"The name the recipient sees on the file, e.g. \u0027invoice-1042.pdf\u0027. Up to 255 characters, with no slashes, colons, asterisks, question marks, quotation marks, angle brackets or vertical bars"},{"name":"contentBase64","required":true,"desc":"The file\u0027s bytes, base64-encoded. Up to 33554432 bytes (32 MB) decoded"},{"name":"contentType","required":false,"desc":"The file\u0027s media type, e.g. application/pdf. Defaults to application/octet-stream"},{"name":"safetyCode","required":false,"desc":"The safety code the recipient publishes with their address: 10 letters and digits, in any letter case (a 20-digit code from before still works). When given, the send is refused if the address\u0027s keys no longer match it, for example after the recipient reset their box"},{"name":"coverAnswers","required":false,"desc":"Answers to the box\u0027s cover sheet, by field name: {\u0022case_number\u0022: \u00222026-CV-0142\u0022}. A field the box does not ask for is refused"}]}]}