22 deterministic tools: PDF, image, QR, CSV/Excel, HTML to PDF, DNS/RDAP, FX rates, time zones.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Optional mint API key (mint_...). Without it the free tier applies: 20 calls per day per IP. Create a key with POST https://data.voiddo.com/v1/keys; prepaid credits start at $5.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Profile a CSV, TSV, XLSX or JSON table: row and column counts plus type, nulls, distinct values, min, max and samples for every column. Cost: 1 credit per call. File input (file): base64 string, data: URI or {"url": "https://..."}. Output: JSON. {rows, cols, columns: [{name, inferred_type, null_count, distinct_count, distinct_capped, min, max, sample}]}
The table: base64 string (or data: URI) or {"url": "https://..."}. Up to 10 MB.
Source format. Omit to auto-detect.
xlsx input: sheet name, or 0-based sheet index (default: the first sheet).
The first row holds column names. false: columns are named col1, col2, ...
Text encoding of csv/tsv/json input (utf-8 falls back to cp1252).
Reject inputs with more data rows than this (413).
csv input: field delimiter (default: detected among , ; tab |).
Tool list last changed Oct 23, 2026.
Profile a CSV, TSV, XLSX or JSON table: row and column counts plus type, nulls, distinct values, min, max and samples for every column. Cost: 1 credit per call. File input (file): base64 string, data: URI or {"url": "https://..."}. Output: JSON. {rows, cols, columns: [{name, inferred_type, null_count, distinct_count, distinct_capped, min, max, sample}]}
| Argument | Type | Description |
|---|---|---|
| file* | string | object | The table: base64 string (or data: URI) or {"url": "https://..."}. Up to 10 MB. |
| from | string | Source format. Omit to auto-detect. |
| sheet | string | integer | xlsx input: sheet name, or 0-based sheet index (default: the first sheet). |
| header | boolean | The first row holds column names. false: columns are named col1, col2, ... |
| encoding | string | Text encoding of csv/tsv/json input (utf-8 falls back to cp1252). |
| max_rows | integer | Reject inputs with more data rows than this (413). |
| delimiter | string | csv input: field delimiter (default: detected among , ; tab |). |
{
"type": "object",
"required": [
"file"
],
"properties": {
"file": {
"type": [
"string",
"object"
],
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"maxLength": 2048
}
},
"description": "The table: base64 string (or data: URI) or {\"url\": \"https://...\"}. Up to 10 MB."
},
"from": {
"enum": [
"csv",
"tsv",
"xlsx",
"json"
],
"type": "string",
"description": "Source format. Omit to auto-detect."
},
"sheet": {
"type": [
"string",
"integer"
],
"minimum": 0,
"minLength": 1,
"description": "xlsx input: sheet name, or 0-based sheet index (default: the first sheet)."
},
"header": {
"type": "boolean",
"default": true,
"description": "The first row holds column names. false: columns are named col1, col2, ..."
},
"encoding": {
"type": "string",
"default": "utf-8",
"maxLength": 40,
"description": "Text encoding of csv/tsv/json input (utf-8 falls back to cp1252)."
},
"max_rows": {
"type": "integer",
"default": 200000,
"maximum": 1000000,
"minimum": 1,
"description": "Reject inputs with more data rows than this (413)."
},
"delimiter": {
"type": "string",
"maxLength": 1,
"minLength": 1,
"description": "csv input: field delimiter (default: detected among , ; tab |)."
}
},
"additionalProperties": false
}Latest and historical euro foreign exchange reference rates from the European Central Bank, with conversion between any two of its currencies. Cost: 1 credit per call. Output: JSON. latest: {base, date, rates}; convert: {amount, from, to, rate, result, date_used}; history: {base, quote, series[{date, rate}]}
| Argument | Type | Description |
|---|---|---|
| op | string | |
| to | string | Currency to convert to |
| base | string | Base currency (latest, history); for convert the alias of 'from' |
| date | string | YYYY-MM-DD; non-business days use the previous business day. Default: latest day |
| days | integer | history: calendar days ending at 'date' (default the latest day) |
| from | string | Currency to convert from (default EUR) |
| quote | string | Quote currency (history; latest filter; convert alias of 'to') |
| amount | number | Amount of the 'from' currency (convert) |
| quotes | array |
Look up A, AAAA, MX, TXT, NS, CNAME, SOA, CAA, SRV or PTR records of a public name through the Cloudflare and Google public resolvers. Cost: 1 credit per call. Output: JSON. {name, type, status, records:[{type, value, ttl}], count, resolver, elapsed_ms}
| Argument | Type | Description |
|---|---|---|
| all | boolean | Query the common set (A, AAAA, CNAME, MX, NS, TXT, SOA, CAA) in one call; 'type' is then ignored |
| name* | string | Public hostname, e.g. example.com (internationalised names are converted to punycode). For type PTR: an IPv4/IPv6 address or a complete in-addr.arpa / ip6.arpa name. |
| type | string | Record type |
{
"type": "object",
"required": [
"name"
],
"properties": {
"all": {
"type": "boolean",
"default": false,
"description": "Query the common set (A, AAAA, CNAME, MX, NS, TXT, SOA, CAA) in one call; 'type' is then ignored"
},
"name": {
"type": "string",
"maxLength": 253,
"minLength": 1,
"description": "Public hostname, e.g. example.com (internationalised names are converted to punycode). For type PTR: an IPv4/IPv6 address or a complete in-addr.arpa / ip6.arpa name."
},
"type": {
"enum": [
"A",
"AAAA",
"MX",
"TXT",
"NS",
"CNAME",
"SOA",
"CAA",
"SRV",
"PTR"
],
"type": "string",
"default": "A",
"description": "Record type"
}
},
"additionalProperties": false
}Public holidays of any of about 250 countries and regions for a given year, with optional subdivision, language and category. Cost: 1 credit per call. Output: JSON. {country, year, subdiv, holidays:[{date, name}], count}
| Argument | Type | Description |
|---|---|---|
| year* | integer | |
| subdiv | string | State / province / region code or name, e.g. BY, Bayern, CA, SCT |
| country* | string | ISO 3166-1 alpha-2 country code, e.g. US, DE, IL |
| language | string | Language of the holiday names, e.g. de or en_US; default: English where available, else the country's own language |
| observed | boolean | Include substitute days such as "Christmas Day (observed)" |
| categories | array | Holiday categories, default ["public"]; e.g. public, bank, school, government, optional, half_day |
{
"type": "object",
"required": [
"country",
"year"
],
"properties": {
"year": {
"type": "integer",
"maximum": 2100,
"minimum": 1990
},
"subdiv": {
"type": "string",
"maxLength": 60,
"minLength": 1,
"description": "State / province / region code or name, e.g. BY, Bayern, CA, SCT"
},
"country": {
"type": "string",
"pattern": "^[A-Za-z]{2}$",
"description": "ISO 3166-1 alpha-2 country code, e.g. US, DE, IL"
},
"language": {
"type": "string",
"pattern": "^[A-Za-z]{2,3}([_-][A-Za-z]{2,4})?$",
"description": "Language of the holiday names, e.g. de or en_US; default: English where available, else the country's own language"
},
"observed": {
"type": "boolean",
"default": true,
"description": "Include substitute days such as \"Christmas Day (observed)\""
},
"categories": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[A-Za-z_]{3,30}$"
},
"maxItems": 10,
"minItems": 1,
"description": "Holiday categories, default [\"public\"]; e.g. public, bank, school, government, optional, half_day",
"uniqueItems": true
}
},
"additionalProperties": false
}Render an HTML snippet to a PNG, JPEG or WEBP image at any width, with retina scaling and transparent background. Cost: 3 credits per call. Output: a file (image/png | image/jpeg | image/webp) returned inline, at most 1 MiB. The rendered image
| Argument | Type | Description |
|---|---|---|
| html* | string | The HTML document or fragment (UTF-8, up to 2 MB). JavaScript is not executed. |
| width | integer | Viewport width in CSS px |
| format | string | |
| height | integer | Viewport height in CSS px; omit for a full-page image that fits the content |
| quality | integer | jpeg / webp quality |
| transparent | boolean | Transparent page background (png / webp only) |
| device_scale_factor | number | Pixel density (2 = retina) |
{
"type": "object",
"required": [
"html"
],
"properties": {
"html": {
"type": "string",
"minLength": 1,
"description": "The HTML document or fragment (UTF-8, up to 2 MB). JavaScript is not executed."
},
"width": {
"type": "integer",
"default": 1200,
"maximum": 2560,
"minimum": 320,
"description": "Viewport width in CSS px"
},
"format": {
"enum": [
"png",
"jpeg",
"jpg",
"webp"
],
"type": "string",
"default": "png"
},
"height": {
"type": "integer",
"maximum": 16384,
"minimum": 50,
"description": "Viewport height in CSS px; omit for a full-page image that fits the content"
},
"quality": {
"type": "integer",
"default": 90,
"maximum": 100,
"minimum": 1,
"description": "jpeg / webp quality"
},
"transparent": {
"type": "boolean",
"default": false,
"description": "Transparent page background (png / webp only)"
},
"device_scale_factor": {
"type": "number",
"default": 1,
"maximum": 3,
"minimum": 1,
"description": "Pixel density (2 = retina)"
}
},
"additionalProperties": false
}Turn an HTML document into a print-ready PDF with page size, margins, orientation and page-numbered header and footer. Cost: 3 credits per call. Output: a file (application/pdf) returned inline, at most 1 MiB. The PDF document
| Argument | Type | Description |
|---|---|---|
| html* | string | The HTML document or fragment (UTF-8, up to 2 MB). JavaScript is not executed. |
| scale | number | Rendering scale |
| format | string | Paper size |
| landscape | boolean | |
| margin_mm | number | Page margin on all sides, millimetres |
| footer_text | string | Plain-text page footer; {page} and {pages} are replaced |
| header_text | string | Plain-text page header; {page} and {pages} are replaced |
| print_background | boolean | Print CSS backgrounds and colours |
{
"type": "object",
"required": [
"html"
],
"properties": {
"html": {
"type": "string",
"minLength": 1,
"description": "The HTML document or fragment (UTF-8, up to 2 MB). JavaScript is not executed."
},
"scale": {
"type": "number",
"default": 1,
"maximum": 2,
"minimum": 0.1,
"description": "Rendering scale"
},
"format": {
"enum": [
"A4",
"Letter",
"Legal",
"A3",
"A5"
],
"type": "string",
"default": "A4",
"description": "Paper size"
},
"landscape": {
"type": "boolean",
"default": false
},
"margin_mm": {
"type": "number",
"default": 15,
"maximum": 50,
"minimum": 0,
"description": "Page margin on all sides, millimetres"
},
"footer_text": {
"type": "string",
"maxLength": 300,
"description": "Plain-text page footer; {page} and {pages} are replaced"
},
"header_text": {
"type": "string",
"maxLength": 300,
"description": "Plain-text page header; {page} and {pages} are replaced"
},
"print_background": {
"type": "boolean",
"default": true,
"description": "Print CSS backgrounds and colours"
}
},
"additionalProperties": false
}Convert and resize images between PNG, JPEG, WEBP, GIF, BMP, TIFF and ICO, with quality, fit modes, transparency handling and optional metadata stripping. Cost: 1 credit per call. File input (file): base64 string, data: URI or {"url": "https://..."}. Output: a file (image/png | image/jpeg | image/webp | image/gif | image/bmp | image/tiff | image/x-icon) returned inline, at most 1 MiB. The converted image
| Argument | Type | Description |
|---|---|---|
| to* | string | Target format |
| fit | string | |
| file* | string | object | The image: base64 (or data: URI) string, or {"url": "https://..."}; up to 10 MB |
| width | integer | Target width in px |
| height | integer | Target height in px |
| quality | integer | jpeg / webp quality (webp 100 = lossless) |
| background | string | Colour for transparent areas when the target has no alpha, and for contain padding (default white / transparent) |
| strip_metadata | boolean | Drop EXIF / XMP / ICC (colours are converted to sRGB first) |
Reverse DNS name and registry record (network block, name, country) of a public IP address, from open registry data only. Cost: 1 credit per call. Output: JSON. {ip, version, is_private, reverse_dns, reverse_dns_all, network{name, country, ...}}
| Argument | Type | Description |
|---|---|---|
| ip* | string | Public IPv4 or IPv6 address |
{
"type": "object",
"required": [
"ip"
],
"properties": {
"ip": {
"type": "string",
"maxLength": 64,
"minLength": 2,
"description": "Public IPv4 or IPv6 address"
}
},
"additionalProperties": false
}Look up ISO 3166 country and subdivision codes, ISO 4217 currency codes and ISO 639 language codes by code or name fragment. Cost: 1 credit per call. Output: JSON. {type, query, results:[{alpha_2, alpha_3, numeric, name, ...}], count, total, truncated}
| Argument | Type | Description |
|---|---|---|
| type* | string | |
| limit | integer | |
| query* | string | Code or name fragment, case- and accent-insensitive |
| country | string | Only for type=subdivision: restrict to this country (ISO 3166-1 alpha-2) |
{
"type": "object",
"required": [
"type",
"query"
],
"properties": {
"type": {
"enum": [
"country",
"currency",
"language",
"subdivision"
],
"type": "string"
},
"limit": {
"type": "integer",
"default": 10,
"maximum": 50,
"minimum": 1
},
"query": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Code or name fragment, case- and accent-insensitive"
},
"country": {
"type": "string",
"pattern": "^[A-Za-z]{2}$",
"description": "Only for type=subdivision: restrict to this country (ISO 3166-1 alpha-2)"
}
},
"additionalProperties": false
}Validate a JSON document, or up to 1000 of them, against a JSON Schema (draft 7, 2019-09 or 2020-12) and list every error with its path. Cost: 1 credit per call. Output: JSON. {valid, errors: [{index, path, message, validator}], count}; meta: {draft, instances, truncated?}
| Argument | Type | Description |
|---|---|---|
| draft | any | JSON Schema draft. auto follows the schema's $schema and defaults to 2020-12. |
| schema* | object | The JSON Schema to validate against. |
| instance | any | One JSON value to validate (any type, including null). Use this or instances. |
| instances | array | Up to 1000 JSON values validated against the same schema. Use this or instance. |
{
"type": "object",
"required": [
"schema"
],
"properties": {
"draft": {
"enum": [
"auto",
"7",
7,
"2019-09",
"2020-12"
],
"default": "auto",
"description": "JSON Schema draft. auto follows the schema's $schema and defaults to 2020-12."
},
"schema": {
"type": "object",
"description": "The JSON Schema to validate against."
},
"instance": {
"description": "One JSON value to validate (any type, including null). Use this or instances."
},
"instances": {
"type": "array",
"maxItems": 1000,
"minItems": 1,
"description": "Up to 1000 JSON values validated against the same schema. Use this or instance."
}
},
"additionalProperties": false
}Convert text between JSON and YAML with safe parsing, indent, key sorting and minify options, and line-accurate error messages. Cost: 1 credit per call. Output: a file (application/json | application/yaml) returned inline, at most 1 MiB. converted.json or converted.yaml; meta: {from, to}
| Argument | Type | Description |
|---|---|---|
| to | string | Target format. Default: yaml for JSON input, json for YAML input. |
| from | string | Source format; auto tries JSON first, then YAML. |
| input* | string | The JSON or YAML text to convert (up to 2 MB). |
| indent | integer | Spaces per level. JSON: 0 puts items on their own lines without indentation. YAML: values below 2 are treated as 2. |
| minify | boolean | JSON: single line without spaces. YAML: single-line flow style. Overrides indent. |
| sort_keys | boolean | Sort object keys alphabetically (default: keep input order). |
{
"type": "object",
"required": [
"input"
],
"properties": {
"to": {
"enum": [
"json",
"yaml"
],
"type": "string",
"description": "Target format. Default: yaml for JSON input, json for YAML input."
},
"from": {
"enum": [
"json",
"yaml",
"auto"
],
"type": "string",
"default": "auto",
"description": "Source format; auto tries JSON first, then YAML."
},
"input": {
"type": "string",
"description": "The JSON or YAML text to convert (up to 2 MB)."
},
"indent": {
"type": "integer",
"default": 2,
"maximum": 8,
"minimum": 0,
"description": "Spaces per level. JSON: 0 puts items on their own lines without indentation. YAML: values below 2 are treated as 2."
},
"minify": {
"type": "boolean",
"default": false,
"description": "JSON: single line without spaces. YAML: single-line flow style. Overrides indent."
},
"sort_keys": {
"type": "boolean",
"default": false,
"description": "Sort object keys alphabetically (default: keep input order)."
}
},
"additionalProperties": false
}Check a KDP paperback interior and cover PDF against Amazon's published file specs and get a signed report. Cost: 5 credits per call. File inputs (interior, cover): base64 string, data: URI or {"url": "https://..."}. Output: JSON. {id, verdict: pass|warn|fail, label, ruleset, specs_date, created_at, files: {interior, cover?: {name, sha256, bytes}}, interior: {trim, pages, bleed, gutter_in, ...}, cover?, checks: [{id, part, status, title, detail}], signature, verify_url}
| Argument | Type | Description |
|---|---|---|
| trim | string | Trim size; found from the page size when omitted |
| cover | string | object | Optional wrap cover PDF (back, spine and front in one page, with bleed). |
| paper | string | |
| interior* | string | object | The interior PDF: base64 string (or data: URI) or {"url": "https://..."}. Up to 10 MB. |
{
"type": "object",
"required": [
"interior"
],
"properties": {
"trim": {
"enum": [
"5x8",
"5.06x7.81",
"5.25x8",
"5.5x8.5",
"6x9",
"6.14x9.21",
"6.69x9.61",
"7x10",
"7.44x9.69",
"7.5x9.25",
"8x10",
"8.25x6",
"8.25x8.25",
"8.5x8.5",
"8.5x11",
"8.27x11.69"
],
"type": "string",
"description": "Trim size; found from the page size when omitted"
},
"cover": {
"type": [
"string",
"object"
],
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"maxLength": 2048
}
},
"description": "Optional wrap cover PDF (back, spine and front in one page, with bleed)."
},
"paper": {
"enum": [
"white",
"cream",
"groundwood",
"standard_color",
"premium_color"
],
"type": "string",
"default": "white"
},
"interior": {
"type": [
"string",
"object"
],
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"maxLength": 2048
}
},
"description": "The interior PDF: base64 string (or data: URI) or {\"url\": \"https://...\"}. Up to 10 MB."
}
},
"additionalProperties": false
}A ready-to-upload KDP paperback puzzle book: interior PDF, wrap cover, signed file check, previews and listing notes. Cost: 500 credits per call. Output: a file (application/zip) returned inline, at most 1 MiB. ZIP: interior.pdf, cover.pdf, check-report.pdf/.json, preview/*.png, listing.txt, README.txt
| Argument | Type | Description |
|---|---|---|
| mix | array | Variety books only: the kinds of puzzle, in book order (default: wordsearch, sudoku, cryptogram, maze). Levels easy, medium or hard. |
| kind* | string | sudoku, wordsearch, maze, cryptogram, wordscramble, numbersearch, kakuro, fillin or killersudoku; variety for a book of several kinds (see mix) |
| seed | integer | Rebuild an earlier book exactly; omit for a new one |
| trim | string | |
| count* | integer | Number of puzzles. The fewest allowed fill KDP's 24-page minimum; the most are 400 sudoku (300 at hard or expert), 150 word searches, 200 mazes, 300 cryptograms, 55 word scrambles (40 at easy or hard), 150 number searches, 150 kakuro (100 at hard), 150 fill ins, 150 killer sudoku (120 at hard), 150 puzzles in a variety book (shared evenly by its kinds, at least 4 of each, none past its own maximum) |
| level* | string | easy, medium, hard (and expert for sudoku and mazes) |
Look up a KDP file check report by id and confirm its signature and file fingerprints. Free tier only (credits do not apply to this tool). Output: JSON. {found, genuine, report?}
| Argument | Type | Description |
|---|---|---|
| id* | string | Report id (20 hex characters) |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"pattern": "^[0-9a-f]{20}$",
"description": "Report id (20 hex characters)"
}
},
"additionalProperties": false
}Full cover size, spine width, safe areas, barcode box, gutter and margins for an Amazon KDP paperback, with an optional PDF cover guide. Cost: 1 credit per call. Output: JSON. {valid, problems[], ruleset, specs_date, trim, pages, paper, page_limits, cover: {width_in, height_in, spine_in, bleed_in, width_px_300dpi, height_px_300dpi, spine_text_allowed, back_safe, front_safe, spine_text_box, barcode_area}, interior: {page_width_in, page_height_in, bleed…
| Argument | Type | Description |
|---|---|---|
| trim | string | Trim size in inches, width x height |
| bleed | boolean | Interior pages with bleed (pictures to the edge) |
| pages* | integer | Interior page count |
| paper | string | white, cream, groundwood, standard_color or premium_color |
| template | boolean | Also return a PDF cover guide (base64) |
{
"type": "object",
"required": [
"pages"
],
"properties": {
"trim": {
"enum": [
"5x8",
"5.06x7.81",
"5.25x8",
"5.5x8.5",
"6x9",
"6.14x9.21",
"6.69x9.61",
"7x10",
"7.44x9.69",
"7.5x9.25",
"8x10",
"8.25x6",
"8.25x8.25",
"8.5x8.5",
"8.5x11",
"8.27x11.69"
],
"type": "string",
"default": "6x9",
"description": "Trim size in inches, width x height"
},
"bleed": {
"type": "boolean",
"default": false,
"description": "Interior pages with bleed (pictures to the edge)"
},
"pages": {
"type": "integer",
"maximum": 1000,
"minimum": 1,
"description": "Interior page count"
},
"paper": {
"enum": [
"white",
"cream",
"groundwood",
"standard_color",
"premium_color"
],
"type": "string",
"default": "white",
"description": "white, cream, groundwood, standard_color or premium_color"
},
"template": {
"type": "boolean",
"default": false,
"description": "Also return a PDF cover guide (base64)"
}
},
"additionalProperties": false
}Render Markdown to a sanitised HTML page or fragment, or to a PDF, with tables, fenced code, heading anchors, an optional table of contents and a choice of themes. Cost: 1 credit per call. Output: a file (text/html | application/pdf) returned inline, at most 1 MiB. document.html / fragment.html (text/html; charset=utf-8) or document.pdf. meta: {format, theme, title, headings, bytes, pages?}. pdf costs 3 credits, html and fragment 1.
| Argument | Type | Description |
|---|---|---|
| css | string | Alias of theme |
| toc | boolean | Add a table of contents above the content |
| theme | string | Built-in stylesheet for html and pdf |
| title | string | Page title; default is the first level-1 heading |
| format | string | html = complete page (1 credit), fragment = content only (1 credit), pdf = A4 document (3 credits) |
| markdown* | string | The Markdown source (up to 1 MB of text) |
{
"type": "object",
"required": [
"markdown"
],
"properties": {
"css": {
"enum": [
"default",
"github",
"plain"
],
"type": "string",
"description": "Alias of theme"
},
"toc": {
"type": "boolean",
"default": false,
"description": "Add a table of contents above the content"
},
"theme": {
"enum": [
"default",
"github",
"plain"
],
"type": "string",
"default": "default",
"description": "Built-in stylesheet for html and pdf"
},
"title": {
"type": "string",
"maxLength": 200,
"description": "Page title; default is the first level-1 heading"
},
"format": {
"enum": [
"html",
"fragment",
"pdf"
],
"type": "string",
"default": "html",
"description": "html = complete page (1 credit), fragment = content only (1 credit), pdf = A4 document (3 credits)"
},
"markdown": {
"type": "string",
"description": "The Markdown source (up to 1 MB of text)"
}
},
"additionalProperties": false
}Read a PDF's page count, encryption flag, metadata, page sizes in millimetres, text-layer presence and bookmark count. Cost: 1 credit per call. File input (file): base64 string, data: URI or {"url": "https://..."}. Output: JSON. {page_count, encrypted, password_required, metadata: {title, author, subject, creator, producer}, page_sizes_mm: [{n, width, height}] (first 50 pages), has_text, outline_count}
| Argument | Type | Description |
|---|---|---|
| file* | string | object | The PDF: base64 string (or data: URI) or {"url": "https://..."}. Up to 10 MB. |
{
"type": "object",
"required": [
"file"
],
"properties": {
"file": {
"type": [
"string",
"object"
],
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"maxLength": 2048
}
},
"description": "The PDF: base64 string (or data: URI) or {\"url\": \"https://...\"}. Up to 10 MB."
}
},
"additionalProperties": false
}Merge 2 to 20 PDF files into one document in the order given, optionally keeping their bookmarks. Cost in credits: ceil(total pages / 20), minimum 1. File input (files): base64 string, data: URI or {"url": "https://..."}. Output: a file (application/pdf) returned inline, at most 1 MiB. merged.pdf; meta: {page_count, files}
| Argument | Type | Description |
|---|---|---|
| files* | array | 2 to 20 PDFs in merge order; all together up to 10 MB. |
| keep_bookmarks | boolean | Keep the bookmarks (outline) of the input files. |
{
"type": "object",
"required": [
"files"
],
"properties": {
"files": {
"type": "array",
"items": {
"type": [
"string",
"object"
],
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"maxLength": 2048
}
},
"description": "A PDF: base64 string (or data: URI) or {\"url\": \"https://...\"}."
},
"maxItems": 20,
"minItems": 2,
"description": "2 to 20 PDFs in merge order; all together up to 10 MB."
},
"keep_bookmarks": {
"type": "boolean",
"default": true,
"description": "Keep the bookmarks (outline) of the input files."
}
},
"additionalProperties": false
}Split a PDF into parts by page ranges such as '1-2,5-' or every N pages, returned as one PDF or a zip of parts. Cost in credits: ceil(pages written / 20), minimum 1. File input (file): base64 string, data: URI or {"url": "https://..."}. Output: a file (application/pdf | application/zip) returned inline, at most 1 MiB. part_01.pdf when there is one part, otherwise split.zip holding part_01.pdf ...; meta: {parts, page_count}
| Argument | Type | Description |
|---|---|---|
| file* | string | object | The PDF: base64 string (or data: URI) or {"url": "https://..."}. Up to 10 MB. |
| ranges | string | Comma-separated page ranges, one part each: '1-2,5-' ('5-' runs to the last page). |
| every_n | integer | Alternative to ranges: parts of this many pages. |
{
"type": "object",
"required": [
"file"
],
"properties": {
"file": {
"type": [
"string",
"object"
],
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"maxLength": 2048
}
},
"description": "The PDF: base64 string (or data: URI) or {\"url\": \"https://...\"}. Up to 10 MB."
},
"ranges": {
"type": "string",
"maxLength": 1000,
"description": "Comma-separated page ranges, one part each: '1-2,5-' ('5-' runs to the last page)."
},
"every_n": {
"type": "integer",
"maximum": 100000,
"minimum": 1,
"description": "Alternative to ranges: parts of this many pages."
}
},
"additionalProperties": false
}Extract the text of a PDF page by page as plain text or Markdown, with page selection, an optional layout-preserving mode and the document metadata. Cost in credits: ceil(pages extracted / 20), minimum 1. File input (file): base64 string, data: URI or {"url": "https://..."}. Output: JSON. {page_count, pages: [{n, text}] (Markdown: [{n, markdown}]), chars, metadata: {title, author, subject, keywords, creator, producer, created, modified}}; meta.note when the PDF has no text layer.
| Argument | Type | Description |
|---|---|---|
| file* | string | object | The PDF: base64 string (or data: URI) or {"url": "https://..."}. Up to 10 MB. |
| pages | string | Pages to extract, e.g. '1-3,7' or '5-' (default: all pages). |
| format | string | text: the plain text of each page. markdown: headings, bold and italic, lists and paragraphs as Markdown, page headers and footers that repeat on most pages left out (layout does not apply). |
| layout | boolean | Preserve the visual layout (columns, spacing) instead of reading order. |
{
"type": "object",
"required": [
"file"
],
"properties": {
"file": {
"type": [
"string",
"object"
],
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"maxLength": 2048
}
},
"description": "The PDF: base64 string (or data: URI) or {\"url\": \"https://...\"}. Up to 10 MB."
},
"pages": {
"type": "string",
"maxLength": 1000,
"description": "Pages to extract, e.g. '1-3,7' or '5-' (default: all pages)."
},
"format": {
"enum": [
"text",
"markdown"
],
"type": "string",
"default": "text",
"description": "text: the plain text of each page. markdown: headings, bold and italic, lists and paragraphs as Markdown, page headers and footers that repeat on most pages left out (layout does not apply)."
},
"layout": {
"type": "boolean",
"default": false,
"description": "Preserve the visual layout (columns, spacing) instead of reading order."
}
},
"additionalProperties": false
}Turn text or a URL into a crisp QR code as PNG or SVG, with size and error-correction control. Cost: 1 credit per call. Output: a file (image/png | image/svg+xml) returned inline, at most 1 MiB. The QR image
| Argument | Type | Description |
|---|---|---|
| bg | string | |
| fg | string | |
| size | integer | Edge length in px (png) |
| text* | string | Text or URL to encode |
| format | string | |
| margin | integer | Quiet zone in modules |
| error_correction | string |
{
"type": "object",
"required": [
"text"
],
"properties": {
"bg": {
"type": "string",
"default": "#ffffff",
"pattern": "^#[0-9a-fA-F]{6}$"
},
"fg": {
"type": "string",
"default": "#000000",
"pattern": "^#[0-9a-fA-F]{6}$"
},
"size": {
"type": "integer",
"default": 512,
"maximum": 2048,
"minimum": 64,
"description": "Edge length in px (png)"
},
"text": {
"type": "string",
"maxLength": 2000,
"minLength": 1,
"description": "Text or URL to encode"
},
"format": {
"enum": [
"png",
"svg"
],
"type": "string",
"default": "png"
},
"margin": {
"type": "integer",
"default": 2,
"maximum": 10,
"minimum": 0,
"description": "Quiet zone in modules"
},
"error_correction": {
"enum": [
"L",
"M",
"Q",
"H"
],
"type": "string",
"default": "M"
}
},
"additionalProperties": false
}Look up the public registration record of a domain, IP address or AS number from its registry's RDAP service, without personal contact data. Cost: 1 credit per call. Output: JSON. Normalised registration record: domain, IP network or autonomous system
| Argument | Type | Description |
|---|---|---|
| query* | string | Domain name (example.com), IPv4/IPv6 address (1.1.1.1) or AS number (AS15169) |
| fields | string | compact: normalised summary; full: summary plus the registry answer without contact data under 'raw' |
{
"type": "object",
"required": [
"query"
],
"properties": {
"query": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "Domain name (example.com), IPv4/IPv6 address (1.1.1.1) or AS number (AS15169)"
},
"fields": {
"enum": [
"compact",
"full"
],
"type": "string",
"default": "compact",
"description": "compact: normalised summary; full: summary plus the registry answer without contact data under 'raw'"
}
},
"additionalProperties": false
}Capture a public web page as a PNG, JPEG or WEBP image: any viewport size, full page, retina scaling, optional cookie-banner hiding. Free tier only (credits do not apply to this tool). Output: a file (image/png | image/jpeg | image/webp) returned inline, at most 1 MiB. The screenshot
| Argument | Type | Description |
|---|---|---|
| url* | string | Public http(s) URL (robots.txt is honoured), or an inline data:text/html URL |
| width | integer | Viewport width in CSS px |
| format | string | |
| height | integer | Viewport height in CSS px |
| quality | integer | jpeg / webp quality |
| delay_ms | integer | Extra wait after load, before the shot |
| full_page | boolean | Capture the whole scrollable page (capped at 16384 CSS px / 50 megapixels) |
| device_scale_factor | number | Pixel density (2 = retina) |
| block_cookie_banners |
Render an SVG document to a PNG at a chosen width, height or scale and background; external files, network references and XML entities are never loaded. Cost: 1 credit per call. File input (file): base64 string, data: URI or {"url": "https://..."}. Output: a file (image/png) returned inline, at most 1 MiB. The rendered PNG
| Argument | Type | Description |
|---|---|---|
| svg | string | The SVG markup as text (up to 2 MB). Use `file` instead for a base64 / URL / uploaded .svg or .svgz |
| file | string | object | Alternative to `svg`: an .svg or .svgz file as base64, data: URI or {"url": "https://..."} |
| scale | number | Multiplier of the SVG's own size (default 1); not combinable with width / height |
| width | integer | Output width in px (height follows the aspect ratio unless given) |
| height | integer | Output height in px (width follows the aspect ratio unless given) |
| background | string | transparent, #rrggbb or #rrggbbaa |
{
"type": "object",
"properties": {
"svg": {
"type": "string",
"description": "The SVG markup as text (up to 2 MB). Use `file` instead for a base64 / URL / uploaded .svg or .svgz"
},
"file": {
"type": [
"string",
"object"
],
"description": "Alternative to `svg`: an .svg or .svgz file as base64, data: URI or {\"url\": \"https://...\"}"
},
"scale": {
"type": "number",
"maximum": 16,
"minimum": 0.05,
"description": "Multiplier of the SVG's own size (default 1); not combinable with width / height"
},
"width": {
"type": "integer",
"maximum": 8192,
"minimum": 1,
"description": "Output width in px (height follows the aspect ratio unless given)"
},
"height": {
"type": "integer",
"maximum": 8192,
"minimum": 1,
"description": "Output height in px (width follows the aspect ratio unless given)"
},
"background": {
"type": "string",
"default": "transparent",
"pattern": "^(transparent|#[0-9a-fA-F]{6}([0-9a-fA-F]{2})?)$",
"description": "transparent, #rrggbb or #rrggbbaa"
}
},
"additionalProperties": false
}Convert tables between CSV, TSV, XLSX and JSON with format, delimiter and encoding detection, header control and exact number and date handling. Cost in credits: 1 credit; 2 credits when the output is xlsx. File input (file): base64 string, data: URI or {"url": "https://..."}. Output: a file (text/csv | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet | application/json) returned inline, at most 1 MiB. The converted table. meta: {rows, cols, from, to, sheet?, sheets?, encoding?, delimiter?}.
| Argument | Type | Description |
|---|---|---|
| to* | string | Target format. |
| file* | string | object | The table: base64 string (or data: URI) or {"url": "https://..."}. Up to 10 MB. |
| from | string | Source format. Omit to auto-detect. |
| sheet | string | integer | xlsx input: sheet name, or 0-based sheet index (default: the first sheet). |
| header | boolean | The first row is a header (becomes JSON keys). false: no header row is read or written, and JSON output is an array of arrays. |
| encoding | string | Text encoding of csv/tsv/json input. utf-8 falls back to cp1252; any other value is strict. |
| max_rows |
Convert a date and time between IANA time zones with exact daylight-saving handling, inspect a zone's offset and transitions, or list a country's zones. Cost: 1 credit per call. Output: JSON. convert: {input, output, offset_from, offset_to, dst_from, dst_to, utc, ...}; info: {tz, offset, abbreviation, dst, previous_transition, next_transition}; list: {country, zones, count}
| Argument | Type | Description |
|---|---|---|
| op | string | |
| tz | string | info: the zone to describe, an IANA name or a fixed offset (from_tz is accepted as an alias). Required for info. |
| query | string | list: only zones whose name contains this text (case-insensitive), e.g. york or europe/ |
| to_tz | string | convert: target zone, an IANA name or a fixed offset. Required for convert. |
| country | string | list: ISO 3166-1 alpha-2 code, e.g. US. Omit to list every zone. |
| from_tz | string | convert: source zone, an IANA name such as Europe/Berlin or a fixed offset such as +05:30. Required when datetime has no offset. |
| datetime | string | ISO 8601, e.g. 2026-03-29T01:30:00 (wall clock in from_tz / tz) or 2026-03-29T00:30:00Z / 2026-03-29T01:30:00+01:00 (exact instant). Required for convert and info. |
| Several quote currencies for latest; omit for all |
{
"type": "object",
"allOf": [
{
"if": {
"required": [
"op"
],
"properties": {
"op": {
"const": "convert"
}
}
},
"then": {
"required": [
"amount"
]
}
}
],
"properties": {
"op": {
"enum": [
"latest",
"convert",
"history"
],
"type": "string",
"default": "latest"
},
"to": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"description": "Currency to convert to"
},
"base": {
"type": "string",
"default": "EUR",
"pattern": "^[A-Za-z]{3}$",
"description": "Base currency (latest, history); for convert the alias of 'from'"
},
"date": {
"type": "string",
"pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$",
"description": "YYYY-MM-DD; non-business days use the previous business day. Default: latest day"
},
"days": {
"type": "integer",
"default": 30,
"maximum": 365,
"minimum": 1,
"description": "history: calendar days ending at 'date' (default the latest day)"
},
"from": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"description": "Currency to convert from (default EUR)"
},
"quote": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"description": "Quote currency (history; latest filter; convert alias of 'to')"
},
"amount": {
"type": "number",
"maximum": 1000000000000,
"minimum": 0,
"description": "Amount of the 'from' currency (convert)"
},
"quotes": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"maxItems": 40,
"minItems": 1,
"description": "Several quote currencies for latest; omit for all",
"uniqueItems": true
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"file",
"to"
],
"properties": {
"to": {
"enum": [
"png",
"jpeg",
"jpg",
"webp",
"gif",
"bmp",
"tiff",
"ico"
],
"type": "string",
"description": "Target format"
},
"fit": {
"enum": [
"inside",
"contain",
"cover",
"fill"
],
"type": "string",
"default": "inside"
},
"file": {
"type": [
"string",
"object"
],
"description": "The image: base64 (or data: URI) string, or {\"url\": \"https://...\"}; up to 10 MB"
},
"width": {
"type": "integer",
"maximum": 8192,
"minimum": 1,
"description": "Target width in px"
},
"height": {
"type": "integer",
"maximum": 8192,
"minimum": 1,
"description": "Target height in px"
},
"quality": {
"type": "integer",
"default": 85,
"maximum": 100,
"minimum": 1,
"description": "jpeg / webp quality (webp 100 = lossless)"
},
"background": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$",
"description": "Colour for transparent areas when the target has no alpha, and for contain padding (default white / transparent)"
},
"strip_metadata": {
"type": "boolean",
"default": true,
"description": "Drop EXIF / XMP / ICC (colours are converted to sRGB first)"
}
},
"additionalProperties": false
}| paper | string |
| title | string |
| author | string |
| themes | array | Word search, word scramble or fill in themes to use, in order (default: the everyday themes, shuffled; the Christmas and winter ones only by name) |
| subtitle | string |
| large_print | boolean |
{
"type": "object",
"required": [
"kind",
"count",
"level"
],
"properties": {
"mix": {
"type": "array",
"items": {
"enum": [
"sudoku",
"wordsearch",
"maze",
"cryptogram",
"wordscramble",
"numbersearch",
"kakuro",
"fillin",
"killersudoku"
],
"type": "string"
},
"maxItems": 9,
"minItems": 2,
"description": "Variety books only: the kinds of puzzle, in book order (default: wordsearch, sudoku, cryptogram, maze). Levels easy, medium or hard."
},
"kind": {
"enum": [
"sudoku",
"wordsearch",
"maze",
"cryptogram",
"wordscramble",
"numbersearch",
"kakuro",
"fillin",
"killersudoku",
"variety"
],
"type": "string",
"description": "sudoku, wordsearch, maze, cryptogram, wordscramble, numbersearch, kakuro, fillin or killersudoku; variety for a book of several kinds (see mix)"
},
"seed": {
"type": "integer",
"maximum": 4611686018427388000,
"minimum": 0,
"description": "Rebuild an earlier book exactly; omit for a new one"
},
"trim": {
"enum": [
"6x9",
"7x10",
"8x10",
"8.5x11",
"8.27x11.69"
],
"type": "string",
"default": "8.5x11"
},
"count": {
"type": "integer",
"maximum": 400,
"minimum": 1,
"description": "Number of puzzles. The fewest allowed fill KDP's 24-page minimum; the most are 400 sudoku (300 at hard or expert), 150 word searches, 200 mazes, 300 cryptograms, 55 word scrambles (40 at easy or hard), 150 number searches, 150 kakuro (100 at hard), 150 fill ins, 150 killer sudoku (120 at hard), 150 puzzles in a variety book (shared evenly by its kinds, at least 4 of each, none past its own maximum)"
},
"level": {
"enum": [
"easy",
"medium",
"hard",
"expert"
],
"type": "string",
"description": "easy, medium, hard (and expert for sudoku and mazes)"
},
"paper": {
"enum": [
"white",
"cream"
],
"type": "string",
"default": "white"
},
"title": {
"type": "string",
"maxLength": 70
},
"author": {
"type": "string",
"maxLength": 60
},
"themes": {
"type": "array",
"items": {
"type": "string",
"maxLength": 60
},
"maxItems": 80,
"description": "Word search, word scramble or fill in themes to use, in order (default: the everyday themes, shuffled; the Christmas and winter ones only by name)"
},
"subtitle": {
"type": "string",
"maxLength": 120
},
"large_print": {
"type": "boolean",
"default": true
}
},
"additionalProperties": false
}| boolean |
| Hide common cookie-consent dialogs (best effort) |
{
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"maxLength": 120000,
"minLength": 1,
"description": "Public http(s) URL (robots.txt is honoured), or an inline data:text/html URL"
},
"width": {
"type": "integer",
"default": 1280,
"maximum": 2560,
"minimum": 320,
"description": "Viewport width in CSS px"
},
"format": {
"enum": [
"png",
"jpeg",
"jpg",
"webp"
],
"type": "string",
"default": "png"
},
"height": {
"type": "integer",
"default": 800,
"maximum": 4000,
"minimum": 240,
"description": "Viewport height in CSS px"
},
"quality": {
"type": "integer",
"default": 90,
"maximum": 100,
"minimum": 1,
"description": "jpeg / webp quality"
},
"delay_ms": {
"type": "integer",
"default": 0,
"maximum": 3000,
"minimum": 0,
"description": "Extra wait after load, before the shot"
},
"full_page": {
"type": "boolean",
"default": false,
"description": "Capture the whole scrollable page (capped at 16384 CSS px / 50 megapixels)"
},
"device_scale_factor": {
"type": "number",
"default": 1,
"maximum": 3,
"minimum": 1,
"description": "Pixel density (2 = retina)"
},
"block_cookie_banners": {
"type": "boolean",
"default": false,
"description": "Hide common cookie-consent dialogs (best effort)"
}
},
"additionalProperties": false
}| integer |
| Reject inputs with more data rows than this (413) instead of truncating silently. |
| delimiter | string | csv input: field delimiter (default: detected among , ; tab |). |
| infer_types | boolean | csv/tsv input to json/xlsx output: turn exact numbers (and, for xlsx, ISO dates) and true/false into typed values. |
{
"type": "object",
"required": [
"file",
"to"
],
"properties": {
"to": {
"enum": [
"csv",
"tsv",
"xlsx",
"json"
],
"type": "string",
"description": "Target format."
},
"file": {
"type": [
"string",
"object"
],
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"maxLength": 2048
}
},
"description": "The table: base64 string (or data: URI) or {\"url\": \"https://...\"}. Up to 10 MB."
},
"from": {
"enum": [
"csv",
"tsv",
"xlsx",
"json"
],
"type": "string",
"description": "Source format. Omit to auto-detect."
},
"sheet": {
"type": [
"string",
"integer"
],
"minimum": 0,
"minLength": 1,
"description": "xlsx input: sheet name, or 0-based sheet index (default: the first sheet)."
},
"header": {
"type": "boolean",
"default": true,
"description": "The first row is a header (becomes JSON keys). false: no header row is read or written, and JSON output is an array of arrays."
},
"encoding": {
"type": "string",
"default": "utf-8",
"maxLength": 40,
"description": "Text encoding of csv/tsv/json input. utf-8 falls back to cp1252; any other value is strict."
},
"max_rows": {
"type": "integer",
"default": 200000,
"maximum": 1000000,
"minimum": 1,
"description": "Reject inputs with more data rows than this (413) instead of truncating silently."
},
"delimiter": {
"type": "string",
"maxLength": 1,
"minLength": 1,
"description": "csv input: field delimiter (default: detected among , ; tab |)."
},
"infer_types": {
"type": "boolean",
"default": true,
"description": "csv/tsv input to json/xlsx output: turn exact numbers (and, for xlsx, ISO dates) and true/false into typed values."
}
},
"additionalProperties": false
}{
"type": "object",
"properties": {
"op": {
"enum": [
"convert",
"info",
"list"
],
"type": "string",
"default": "convert"
},
"tz": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "info: the zone to describe, an IANA name or a fixed offset (from_tz is accepted as an alias). Required for info."
},
"query": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "list: only zones whose name contains this text (case-insensitive), e.g. york or europe/"
},
"to_tz": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "convert: target zone, an IANA name or a fixed offset. Required for convert."
},
"country": {
"type": "string",
"pattern": "^[A-Za-z]{2}$",
"description": "list: ISO 3166-1 alpha-2 code, e.g. US. Omit to list every zone."
},
"from_tz": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "convert: source zone, an IANA name such as Europe/Berlin or a fixed offset such as +05:30. Required when datetime has no offset."
},
"datetime": {
"type": "string",
"maxLength": 48,
"minLength": 8,
"description": "ISO 8601, e.g. 2026-03-29T01:30:00 (wall clock in from_tz / tz) or 2026-03-29T00:30:00Z / 2026-03-29T01:30:00+01:00 (exact instant). Required for convert and info."
}
},
"additionalProperties": false
}