{"openapi":"3.1.0","info":{"title":"ToolForte API","version":"1.1.0","description":"Deterministic utility endpoints for developers and AI agents: IBAN validation, VAT calculation, Dutch holidays and working days, cron parsing, regex testing, JSON/CSV/Base64 transforms, diffs, UUIDs, and Dutch test data. All endpoints accept POST with a JSON body and require a free API key. An MCP server with these tools plus file render tools (PDF, screenshots, QR) is available at https://toolforte.com/mcp.","termsOfService":"https://toolforte.com/terms","contact":{"url":"https://toolforte.com/contact"}},"servers":[{"url":"https://toolforte.com"}],"externalDocs":{"description":"API documentation and free API keys","url":"https://toolforte.com/developers"},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"API key (tf_...). Get a free key at https://toolforte.com/developers (1,000 calls/month)."}}},"tags":[{"name":"tools","description":"Deterministic utility tools"},{"name":"render","description":"Headless Chrome renders returning hosted files"}],"paths":{"/api/v1/tools/text-diff":{"post":{"operationId":"text_diff","summary":"Text Diff","description":"Compare two texts and return a structured diff with additions, deletions, and unchanged lines.","tags":["tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"original":{"type":"string"},"modified":{"type":"string"}}},"example":{"original":"Hello world","modified":"Hello there, world!"}}}},"responses":{"200":{"description":"Successful result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object","properties":{"changes":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"value":{"type":"string"}}}}}}}},"example":{"ok":true,"data":{"changes":[{"type":"equal","value":"Hello "},{"type":"delete","value":"world"},{"type":"insert","value":"there, world!"}]}}}}},"400":{"description":"Missing or invalid request fields"},"401":{"description":"Invalid or missing API key"},"429":{"description":"Monthly plan limit reached"}}}},"/api/v1/tools/json-formatter":{"post":{"operationId":"json_formatter","summary":"JSON Formatter","description":"Format, validate, and prettify JSON strings. Returns formatted output or validation errors.","tags":["tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"json":{"type":"string"},"indent":{"type":"integer"}}},"example":{"json":"{\"name\":\"ToolForte\",\"version\":1}","indent":2}}}},"responses":{"200":{"description":"Successful result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object","properties":{"formatted":{"type":"string"},"valid":{"type":"boolean"}}}}},"example":{"ok":true,"data":{"formatted":"{\n  \"name\": \"ToolForte\",\n  \"version\": 1\n}","valid":true}}}}},"400":{"description":"Missing or invalid request fields"},"401":{"description":"Invalid or missing API key"},"429":{"description":"Monthly plan limit reached"}}}},"/api/v1/tools/markdown-to-html":{"post":{"operationId":"markdown_to_html","summary":"Markdown to HTML","description":"Convert Markdown content to sanitized HTML. Supports GFM tables, code blocks, and task lists.","tags":["tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"markdown":{"type":"string"}}},"example":{"markdown":"# Hello\n\nThis is **bold** text."}}}},"responses":{"200":{"description":"Successful result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object","properties":{"html":{"type":"string"}}}}},"example":{"ok":true,"data":{"html":"<h1>Hello</h1>\n<p>This is <strong>bold</strong> text.</p>"}}}}},"400":{"description":"Missing or invalid request fields"},"401":{"description":"Invalid or missing API key"},"429":{"description":"Monthly plan limit reached"}}}},"/api/v1/tools/csv-to-json":{"post":{"operationId":"csv_to_json","summary":"CSV to JSON","description":"Parse CSV data into a JSON array of objects. Auto-detects delimiters and handles quoted fields.","tags":["tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"csv":{"type":"string"},"delimiter":{"type":"string"}}},"example":{"csv":"name,age\nAlice,30\nBob,25","delimiter":","}}}},"responses":{"200":{"description":"Successful result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"age":{"type":"string"}}}},"rows":{"type":"integer"},"columns":{"type":"integer"}}}}},"example":{"ok":true,"data":{"data":[{"name":"Alice","age":"30"},{"name":"Bob","age":"25"}],"rows":2,"columns":2}}}}},"400":{"description":"Missing or invalid request fields"},"401":{"description":"Invalid or missing API key"},"429":{"description":"Monthly plan limit reached"}}}},"/api/v1/tools/url-encoder":{"post":{"operationId":"url_encoder","summary":"URL Encoder/Decoder","description":"Encode or decode URL components. Handles special characters and unicode.","tags":["tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string"},"mode":{"type":"string"}}},"example":{"text":"hello world & foo=bar","mode":"encode"}}}},"responses":{"200":{"description":"Successful result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object","properties":{"result":{"type":"string"}}}}},"example":{"ok":true,"data":{"result":"hello%20world%20%26%20foo%3Dbar"}}}}},"400":{"description":"Missing or invalid request fields"},"401":{"description":"Invalid or missing API key"},"429":{"description":"Monthly plan limit reached"}}}},"/api/v1/tools/base64":{"post":{"operationId":"base64","summary":"Base64 Encode/Decode","description":"Encode text to Base64 or decode Base64 strings back to plain text.","tags":["tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string"},"mode":{"type":"string"}}},"example":{"text":"Hello, ToolForte!","mode":"encode"}}}},"responses":{"200":{"description":"Successful result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object","properties":{"result":{"type":"string"}}}}},"example":{"ok":true,"data":{"result":"SGVsbG8sIFRvb2xGb3J0ZSE="}}}}},"400":{"description":"Missing or invalid request fields"},"401":{"description":"Invalid or missing API key"},"429":{"description":"Monthly plan limit reached"}}}},"/api/v1/tools/regex-tester":{"post":{"operationId":"regex_tester","summary":"Regex Tester","description":"Test a regular expression against a string. Returns all matches with groups and indices.","tags":["tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"pattern":{"type":"string"},"flags":{"type":"string"},"text":{"type":"string"}}},"example":{"pattern":"(\\d{4})-(\\d{2})-(\\d{2})","flags":"g","text":"Today is 2026-04-08 and tomorrow is 2026-04-09."}}}},"responses":{"200":{"description":"Successful result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object","properties":{"matches":{"type":"array","items":{"type":"object","properties":{"match":{"type":"string"},"index":{"type":"integer"},"groups":{"type":"array","items":{"type":"string"}}}}},"count":{"type":"integer"}}}}},"example":{"ok":true,"data":{"matches":[{"match":"2026-04-08","index":9,"groups":["2026","04","08"]},{"match":"2026-04-09","index":37,"groups":["2026","04","09"]}],"count":2}}}}},"400":{"description":"Missing or invalid request fields"},"401":{"description":"Invalid or missing API key"},"429":{"description":"Monthly plan limit reached"}}}},"/api/v1/tools/color-converter":{"post":{"operationId":"color_converter","summary":"Color Converter","description":"Convert colors between HEX, RGB, HSL, and HSB formats. Returns all representations.","tags":["tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"color":{"type":"string"},"format":{"type":"string"}}},"example":{"color":"#4338ca","format":"hex"}}}},"responses":{"200":{"description":"Successful result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object","properties":{"hex":{"type":"string"},"rgb":{"type":"object","properties":{"r":{"type":"integer"},"g":{"type":"integer"},"b":{"type":"integer"}}},"hsl":{"type":"object","properties":{"h":{"type":"integer"},"s":{"type":"integer"},"l":{"type":"integer"}}},"hsb":{"type":"object","properties":{"h":{"type":"integer"},"s":{"type":"integer"},"b":{"type":"integer"}}}}}}},"example":{"ok":true,"data":{"hex":"#4338ca","rgb":{"r":67,"g":56,"b":202},"hsl":{"h":245,"s":58,"l":51},"hsb":{"h":245,"s":72,"b":79}}}}}},"400":{"description":"Missing or invalid request fields"},"401":{"description":"Invalid or missing API key"},"429":{"description":"Monthly plan limit reached"}}}},"/api/v1/tools/password-strength":{"post":{"operationId":"password_strength","summary":"Password Strength","description":"Analyze password strength and return a score with detailed feedback and suggestions.","tags":["tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"password":{"type":"string"}}},"example":{"password":"MyS3cur3P@ss!"}}}},"responses":{"200":{"description":"Successful result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object","properties":{"score":{"type":"integer"},"label":{"type":"string"},"crack_time":{"type":"string"},"feedback":{"type":"object","properties":{"suggestions":{"type":"array","items":{}},"warning":{"type":"null"}}}}}}},"example":{"ok":true,"data":{"score":4,"label":"Strong","crack_time":"centuries","feedback":{"suggestions":[],"warning":null}}}}}},"400":{"description":"Missing or invalid request fields"},"401":{"description":"Invalid or missing API key"},"429":{"description":"Monthly plan limit reached"}}}},"/api/v1/tools/word-counter":{"post":{"operationId":"word_counter","summary":"Word Counter","description":"Count words, characters, sentences, and paragraphs. Estimates reading and speaking time.","tags":["tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string"}}},"example":{"text":"The quick brown fox jumps over the lazy dog."}}}},"responses":{"200":{"description":"Successful result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object","properties":{"words":{"type":"integer"},"characters":{"type":"integer"},"characters_no_spaces":{"type":"integer"},"sentences":{"type":"integer"},"paragraphs":{"type":"integer"},"reading_time_seconds":{"type":"integer"}}}}},"example":{"ok":true,"data":{"words":9,"characters":44,"characters_no_spaces":36,"sentences":1,"paragraphs":1,"reading_time_seconds":2}}}}},"400":{"description":"Missing or invalid request fields"},"401":{"description":"Invalid or missing API key"},"429":{"description":"Monthly plan limit reached"}}}},"/api/v1/tools/cron-parser":{"post":{"operationId":"cron_parser","summary":"Cron Parser","description":"Parse a cron expression into a human-readable description and list the next N scheduled runs.","tags":["tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"expression":{"type":"string"},"count":{"type":"integer"}}},"example":{"expression":"0 9 * * MON-FRI","count":3}}}},"responses":{"200":{"description":"Successful result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object","properties":{"description":{"type":"string"},"next_runs":{"type":"array","items":{"type":"string"}},"valid":{"type":"boolean"}}}}},"example":{"ok":true,"data":{"description":"At 09:00 on every day-of-week from Monday through Friday","next_runs":["2026-04-09T09:00:00Z","2026-04-10T09:00:00Z","2026-04-11T09:00:00Z"],"valid":true}}}}},"400":{"description":"Missing or invalid request fields"},"401":{"description":"Invalid or missing API key"},"429":{"description":"Monthly plan limit reached"}}}},"/api/v1/tools/uuid-generator":{"post":{"operationId":"uuid_generator","summary":"UUID Generator","description":"Generate one or more UUIDs (v4). Optionally return as uppercase or without dashes.","tags":["tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"},"uppercase":{"type":"boolean"}}},"example":{"count":2,"uppercase":false}}}},"responses":{"200":{"description":"Successful result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object","properties":{"uuids":{"type":"array","items":{"type":"string"}}}}}},"example":{"ok":true,"data":{"uuids":["f47ac10b-58cc-4372-a567-0e02b2c3d479","7c9e6679-7425-40de-944b-e07fc1f90ae7"]}}}}},"400":{"description":"Missing or invalid request fields"},"401":{"description":"Invalid or missing API key"},"429":{"description":"Monthly plan limit reached"}}}},"/api/v1/tools/iban-validator":{"post":{"operationId":"iban_validator","summary":"IBAN Validator","description":"Validate an IBAN number. Returns country, bank code, and checksum verification.","tags":["tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"iban":{"type":"string"}}},"example":{"iban":"DE89370400440532013000"}}}},"responses":{"200":{"description":"Successful result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object","properties":{"valid":{"type":"boolean"},"country":{"type":"string"},"country_code":{"type":"string"},"bank_code":{"type":"string"},"checksum":{"type":"string"}}}}},"example":{"ok":true,"data":{"valid":true,"country":"Germany","country_code":"DE","bank_code":"37040044","checksum":"89"}}}}},"400":{"description":"Missing or invalid request fields"},"401":{"description":"Invalid or missing API key"},"429":{"description":"Monthly plan limit reached"}}}},"/api/v1/tools/slug-generator":{"post":{"operationId":"slug_generator","summary":"Slug Generator","description":"Convert any text into a URL-friendly slug. Handles unicode, diacritics, and special characters.","tags":["tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string"},"separator":{"type":"string"}}},"example":{"text":"Hello World! This is a Test.","separator":"-"}}}},"responses":{"200":{"description":"Successful result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object","properties":{"slug":{"type":"string"}}}}},"example":{"ok":true,"data":{"slug":"hello-world-this-is-a-test"}}}}},"400":{"description":"Missing or invalid request fields"},"401":{"description":"Invalid or missing API key"},"429":{"description":"Monthly plan limit reached"}}}},"/api/v1/tools/email-validator":{"post":{"operationId":"email_validator","summary":"Email Validator","description":"Validate email address syntax and check for common typos in popular domain names.","tags":["tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string"}}},"example":{"email":"user@gmial.com"}}}},"responses":{"200":{"description":"Successful result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object","properties":{"valid":{"type":"boolean"},"syntax_ok":{"type":"boolean"},"suggestion":{"type":"string"},"disposable":{"type":"boolean"}}}}},"example":{"ok":true,"data":{"valid":true,"syntax_ok":true,"suggestion":"user@gmail.com","disposable":false}}}}},"400":{"description":"Missing or invalid request fields"},"401":{"description":"Invalid or missing API key"},"429":{"description":"Monthly plan limit reached"}}}},"/api/v1/tools/vat-calculator":{"post":{"operationId":"vat_calculator","summary":"VAT Calculator","description":"Add VAT to a net amount or extract VAT from a gross amount, at any rate. Built for invoicing and pricing flows.","tags":["tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"amount":{"type":"integer"},"rate":{"type":"integer"},"mode":{"type":"string"}}},"example":{"amount":100,"rate":21,"mode":"add"}}}},"responses":{"200":{"description":"Successful result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object","properties":{"net":{"type":"integer"},"vat":{"type":"integer"},"gross":{"type":"integer"},"rate":{"type":"integer"}}}}},"example":{"ok":true,"data":{"net":100,"vat":21,"gross":121,"rate":21}}}}},"400":{"description":"Missing or invalid request fields"},"401":{"description":"Invalid or missing API key"},"429":{"description":"Monthly plan limit reached"}}}},"/api/v1/tools/vat-number-check":{"post":{"operationId":"vat_number_check","summary":"VAT Number Format Check","description":"Validate the format of EU (plus GB/CH) VAT numbers before storing them. Syntax check only, no VIES lookup.","tags":["tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"vatNumber":{"type":"string"}}},"example":{"vatNumber":"NL123456789B01"}}}},"responses":{"200":{"description":"Successful result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object","properties":{"input":{"type":"string"},"normalized":{"type":"string"},"country":{"type":"string"},"validFormat":{"type":"boolean"},"note":{"type":"string"}}}}},"example":{"ok":true,"data":{"input":"NL123456789B01","normalized":"NL123456789B01","country":"NL","validFormat":true,"note":"Format is valid. This is a syntax check only; use the EU VIES service to confirm registration."}}}}},"400":{"description":"Missing or invalid request fields"},"401":{"description":"Invalid or missing API key"},"429":{"description":"Monthly plan limit reached"}}}},"/api/v1/tools/dutch-holidays":{"post":{"operationId":"dutch_holidays","summary":"Dutch Public Holidays","description":"All Dutch public holidays for a given year, including movable feasts like Easter, Ascension Day, and King's Day.","tags":["tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer"}}},"example":{"year":2026}}}},"responses":{"200":{"description":"Successful result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object","properties":{"year":{"type":"integer"},"holidays":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string"},"name":{"type":"string"},"nameEn":{"type":"string"},"dayOff":{"type":"boolean"}}}}}}}},"example":{"ok":true,"data":{"year":2026,"holidays":[{"date":"2026-04-27","name":"Koningsdag","nameEn":"King's Day","dayOff":true}]}}}}},"400":{"description":"Missing or invalid request fields"},"401":{"description":"Invalid or missing API key"},"429":{"description":"Monthly plan limit reached"}}}},"/api/v1/tools/working-days":{"post":{"operationId":"working_days","summary":"Working Days Calculator","description":"Count working days (Monday to Friday) between two dates, optionally excluding Dutch public holidays. Ideal for SLA and payroll calculations.","tags":["tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"start":{"type":"string"},"end":{"type":"string"},"excludeDutchHolidays":{"type":"boolean"}}},"example":{"start":"2026-09-01","end":"2026-09-30","excludeDutchHolidays":true}}}},"responses":{"200":{"description":"Successful result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object","properties":{"start":{"type":"string"},"end":{"type":"string"},"totalDays":{"type":"integer"},"workingDays":{"type":"integer"},"weekendDays":{"type":"integer"},"holidaysExcluded":{"type":"array","items":{}}}}}},"example":{"ok":true,"data":{"start":"2026-09-01","end":"2026-09-30","totalDays":30,"workingDays":22,"weekendDays":8,"holidaysExcluded":[]}}}}},"400":{"description":"Missing or invalid request fields"},"401":{"description":"Invalid or missing API key"},"429":{"description":"Monthly plan limit reached"}}}},"/api/v1/tools/test-bsn-generator":{"post":{"operationId":"test_bsn_generator","summary":"Test BSN Generator","description":"Generate Dutch BSN test numbers that pass the elfproef (11-check) but are not linked to real persons. For development and test environments.","tags":["tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}},"example":{"count":3}}}},"responses":{"200":{"description":"Successful result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object","properties":{"count":{"type":"integer"},"bsns":{"type":"array","items":{"type":"string"}},"note":{"type":"string"}}}}},"example":{"ok":true,"data":{"count":3,"bsns":["111222333","123456782","987654321"],"note":"Test numbers that pass the elfproef (11-check). They are not linked to real persons."}}}}},"400":{"description":"Missing or invalid request fields"},"401":{"description":"Invalid or missing API key"},"429":{"description":"Monthly plan limit reached"}}}},"/api/v1/tools/test-iban-generator":{"post":{"operationId":"test_iban_generator","summary":"Test IBAN Generator","description":"Generate structurally valid test IBANs (correct mod-97 check digits) for NL, DE, BE, FR, or GB that are not linked to real bank accounts. For development and test environments.","tags":["tools"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"country":{"type":"string"},"count":{"type":"integer"}}},"example":{"country":"NL","count":3}}}},"responses":{"200":{"description":"Successful result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object","properties":{"count":{"type":"integer"},"country":{"type":"string"},"ibans":{"type":"array","items":{"type":"string"}},"note":{"type":"string"}}}}},"example":{"ok":true,"data":{"count":3,"country":"NL","ibans":["NL91ABNA0417164300","NL02RABO0123456789","NL39INGB0001234567"],"note":"Structurally valid IBANs (correct mod-97 check digits) not linked to real bank accounts. For test environments only."}}}}},"400":{"description":"Missing or invalid request fields"},"401":{"description":"Invalid or missing API key"},"429":{"description":"Monthly plan limit reached"}}}},"/api/v1/render/html-to-pdf":{"post":{"operationId":"render_html_to_pdf","summary":"HTML to PDF","description":"Render an HTML document to a real PDF with headless Chrome (full CSS support). Returns a hosted download URL valid for 24 hours. Free demo: 3 renders/day without a key; a free API key raises this to 50 renders/month, then 1 credit per render (packs from EUR 5).","tags":["render"],"security":[{"bearerAuth":[]},{}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["html"],"properties":{"html":{"type":"string","description":"Full HTML document to render (max 1MB)"},"format":{"type":"string","enum":["A4","Letter"]},"landscape":{"type":"boolean"}}},"example":{"html":"<html><body><h1>Invoice #42</h1></body></html>","format":"A4"}}}},"responses":{"200":{"description":"Hosted PDF download URL","content":{"application/json":{"example":{"ok":true,"data":{"url":"https://...signed-url.pdf","expiresAt":"2026-08-29T00:00:00.000Z","bytes":13870,"contentType":"application/pdf","metering":{"source":"allowance","remaining":49}}}}}},"400":{"description":"Missing or invalid html field"},"413":{"description":"HTML larger than 1MB"},"429":{"description":"Render limit reached (see error message)"},"502":{"description":"Render failed"}}}},"/api/v1/render/url-screenshot":{"post":{"operationId":"render_url_screenshot","summary":"URL screenshot","description":"Take a PNG screenshot of a public web page with headless Chrome. Returns a hosted download URL valid for 24 hours. Same metering as the other render endpoints: 3/day anonymous, 50/month with a free API key, then 1 credit per render.","tags":["render"],"security":[{"bearerAuth":[]},{}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"Public http(s) URL"},"width":{"type":"integer","minimum":320,"maximum":1920},"fullPage":{"type":"boolean"}}},"example":{"url":"https://example.com","width":1280}}}},"responses":{"200":{"description":"Hosted PNG download URL"},"400":{"description":"Invalid or private URL"},"429":{"description":"Render limit reached"},"502":{"description":"Render failed"}}}},"/api/v1/render/url-to-pdf":{"post":{"operationId":"render_url_to_pdf","summary":"URL to PDF","description":"Render a public web page to PDF with headless Chrome. Returns a hosted download URL valid for 24 hours. Same metering as the other render endpoints.","tags":["render"],"security":[{"bearerAuth":[]},{}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"Public http(s) URL"},"format":{"type":"string","enum":["A4","Letter"]},"landscape":{"type":"boolean"}}},"example":{"url":"https://example.com","format":"A4"}}}},"responses":{"200":{"description":"Hosted PDF download URL"},"400":{"description":"Invalid or private URL"},"429":{"description":"Render limit reached"},"502":{"description":"Render failed"}}}}}}