// developer_api/ REST v1

Integrate any tool.

Access 84 utility tools via REST API. Parse, validate, convert, and generate, all from a single integration. Both plans include the MCP server and the AI tools, spending one shared monthly balance of credits. Every endpoint is also a tool on the MCP server, and the catalog lists each one with a copyable example in curl, JavaScript, Python and plain words.

Get started →View endpoints →
Quick start

Three steps to your first call.

1. Get your API key

Create an account, then open your account page and create a key under API keys. The key is shown once, so copy it straight away.

2. Make your first request

All endpoints accept POST requests with a JSON body. Pass your API key in the X-API-Key header.

· terminal
curl -X POST https://toolforte.com/api/v1/tools/json-formatter \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"json": "{\"name\": \"ToolForte\"}", "indent": 2}'

3. Handle the response

Every response returns JSON with the tool-specific result. On success you get a 200 status code.

· response.json
{
  "formatted": "{\n  \"name\": \"ToolForte\"\n}",
  "valid": true
}
Authentication

API key in every header.

Authenticate every request by including your API key in the X-API-Key header. Never expose your key in client-side code or public repositories.

· terminal
curl -X POST https://toolforte.com/api/v1/tools/uuid-generator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: tf_live_abc123def456" \
  -d '{"count": 1}'

Security tip. Keep your API key server-side. If you suspect a key has been compromised, go to your account page, revoke it and create a replacement. Revoking takes effect immediately.

Pricing

Start free. One plan when you need more.

Both plans carry the same endpoints. The difference is the size of the monthly credit balance and how long we keep your usage history and agent memory. If a month runs short you can buy credits from 100 upwards (€1.00) on the pricing page, with no subscription required.

Free

Free
· 1,000 credits/month
  • ·All 84 endpoints
  • ·1,000 API or MCP tool calls, or 100 AI generations, or 40 renders, or any mix
  • ·MCP server and AI tools included
  • ·Agent memory at 0 credits, never metered
  • ·Extra credits any time, no subscription needed: 100 for €1.00, 1,000 for €5.00, 5,000 for €20.00. Bought credits never expire.
Popular

ToolForte Pro

€19/month
· 7,500 credits/month
  • ·All 84 endpoints
  • ·7,500 API or MCP tool calls, or 750 AI generations, or 300 renders, or any mix
  • ·MCP server and AI tools included
  • ·Usage history for 365 days
  • ·Agent memory kept for 365 days
  • ·€190 a year, which is 10 months, so 2 are free
Limits

What each plan holds.

· Plan· Credits per month· Usage history· Memory retention
Free1,0007 days30 days
ToolForte Pro7,500365 days365 days

There is no per-second or per-minute throttle. The only limit is the credit balance, and it comes back on every response: X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset.

Endpoints

84 REST endpoints.

All endpoints accept POST requests with a JSON body and return JSON responses.

· Text Diff· JSON Formatter· Markdown to HTML· CSV to JSON· URL Encoder/Decoder· Base64 Encode/Decode· Regex Tester· Color Converter· Password Strength· Word Counter· Cron Parser· UUID Generator· IBAN Validator· Slug Generator· Email Validator· VAT Calculator· VAT Number Format Check· Dutch Public Holidays· Working Days Calculator· Test BSN Generator· Test IBAN Generator· BRP Test Data Generator· UPA File Generator· Text Case Converter· Lorem Ipsum Generator· Sort Lines· Remove Duplicate Lines· Reverse Text· Find and Replace· Word Frequency Counter· Reading Time Calculator· ROT13 Cipher· Morse Code Translator· Numbers to Words· Roman Numeral Converter· Text Cleaner· JSON to CSV· JSON to YAML· YAML to JSON· XML to JSON· JSON to XML· XML Formatter· CSV to Markdown· SQL Formatter· HTML Entity Encoder· JSON to TypeScript· Hash Generator· JWT Decoder· Timestamp Converter· Number Base Converter· Password Generator· Random Number Generator· Chmod Calculator· HTTP Status Codes· PX to REM Converter· UTM Builder· Color Contrast Checker· Percentage Calculator· Compound Interest Calculator· Loan Calculator· BMI Calculator· Date Difference Calculator· Age Calculator· Week Number· Unit Converter· Discount Calculator· Tip Calculator· Timezone Converter· ROI Calculator· Break-even Calculator· AOW Age Calculator· Dutch Inheritance Tax Calculator· Dutch Gift Tax Calculator· Dutch WW Duration Calculator· 30% Ruling Calculator· Dutch Holiday Allowance Calculator· Dutch Notice Period Calculator· Dutch Severance Calculator· Test Document Number Generator· Dutch School Holidays· Dutch Mileage Allowance Calculator· Subtitle Converter· CSV Merge· CSV Split
POST/api/v1/tools/text-diff

Text Diff

Compare two texts and return a structured diff with additions, deletions, and unchanged lines.

Try the browser version of this tool

· Request body
· request.json
{
  "original": "Hello world",
  "modified": "Hello there, world!"
}
· Response
· response.json
{
  "changes": [
    {
      "type": "equal",
      "value": "Hello "
    },
    {
      "type": "delete",
      "value": "world"
    },
    {
      "type": "insert",
      "value": "there, world!"
    }
  ]
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/text-diff \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"original":"Hello world","modified":"Hello there, world!"}'
POST/api/v1/tools/json-formatter

JSON Formatter

Format, validate, and prettify JSON strings. Returns formatted output or validation errors.

Try the browser version of this tool

· Request body
· request.json
{
  "json": "{\"name\":\"ToolForte\",\"version\":1}",
  "indent": 2
}
· Response
· response.json
{
  "formatted": "{\n  \"name\": \"ToolForte\",\n  \"version\": 1\n}",
  "valid": true
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/json-formatter \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"json":"{\"name\":\"ToolForte\",\"version\":1}","indent":2}'
POST/api/v1/tools/markdown-to-html

Markdown to HTML

Convert Markdown content to sanitized HTML. Supports GFM tables, code blocks, and task lists.

Try the browser version of this tool

· Request body
· request.json
{
  "markdown": "# Hello\n\nThis is **bold** text."
}
· Response
· response.json
{
  "html": "<h1>Hello</h1>\n<p>This is <strong>bold</strong> text.</p>"
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/markdown-to-html \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"markdown":"# Hello\n\nThis is **bold** text."}'
POST/api/v1/tools/csv-to-json

CSV to JSON

Parse CSV data into a JSON array of objects. Auto-detects delimiters and handles quoted fields.

Try the browser version of this tool

· Request body
· request.json
{
  "csv": "name,age\nAlice,30\nBob,25",
  "delimiter": ","
}
· Response
· response.json
{
  "data": [
    {
      "name": "Alice",
      "age": "30"
    },
    {
      "name": "Bob",
      "age": "25"
    }
  ],
  "rows": 2,
  "columns": 2
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/csv-to-json \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"csv":"name,age\nAlice,30\nBob,25","delimiter":","}'
POST/api/v1/tools/url-encoder

URL Encoder/Decoder

Encode or decode URL components. Handles special characters and unicode.

Try the browser version of this tool

· Request body
· request.json
{
  "text": "hello world & foo=bar",
  "mode": "encode"
}
· Response
· response.json
{
  "result": "hello%20world%20%26%20foo%3Dbar"
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/url-encoder \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"text":"hello world & foo=bar","mode":"encode"}'
POST/api/v1/tools/base64

Base64 Encode/Decode

Encode text to Base64 or decode Base64 strings back to plain text.

Try the browser version of this tool

· Request body
· request.json
{
  "text": "Hello, ToolForte!",
  "mode": "encode"
}
· Response
· response.json
{
  "result": "SGVsbG8sIFRvb2xGb3J0ZSE="
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/base64 \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"text":"Hello, ToolForte!","mode":"encode"}'
POST/api/v1/tools/regex-tester

Regex Tester

Test a regular expression against a string. Returns all matches with groups and indices.

Try the browser version of this tool

· Request body
· request.json
{
  "pattern": "(\\d{4})-(\\d{2})-(\\d{2})",
  "flags": "g",
  "text": "Today is 2026-04-08 and tomorrow is 2026-04-09."
}
· Response
· response.json
{
  "matches": [
    {
      "match": "2026-04-08",
      "index": 9,
      "groups": [
        "2026",
        "04",
        "08"
      ]
    },
    {
      "match": "2026-04-09",
      "index": 37,
      "groups": [
        "2026",
        "04",
        "09"
      ]
    }
  ],
  "count": 2
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/regex-tester \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"pattern":"(\\d{4})-(\\d{2})-(\\d{2})","flags":"g","text":"Today is 2026-04-08 and tomorrow is 2026-04-09."}'
POST/api/v1/tools/color-converter

Color Converter

Convert colors between HEX, RGB, HSL, and HSB formats. Returns all representations.

Try the browser version of this tool

· Request body
· request.json
{
  "color": "#4338ca",
  "format": "hex"
}
· Response
· response.json
{
  "hex": "#4338ca",
  "rgb": {
    "r": 67,
    "g": 56,
    "b": 202
  },
  "hsl": {
    "h": 245,
    "s": 58,
    "l": 51
  },
  "hsb": {
    "h": 245,
    "s": 72,
    "b": 79
  }
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/color-converter \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"color":"#4338ca","format":"hex"}'
POST/api/v1/tools/password-strength

Password Strength

Analyze password strength and return a score with detailed feedback and suggestions.

Try the browser version of this tool

· Request body
· request.json
{
  "password": "MyS3cur3P@ss!"
}
· Response
· response.json
{
  "score": 4,
  "label": "Strong",
  "crack_time": "centuries",
  "feedback": {
    "suggestions": [],
    "warning": null
  }
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/password-strength \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"password":"MyS3cur3P@ss!"}'
POST/api/v1/tools/word-counter

Word Counter

Count words, characters, sentences, and paragraphs. Estimates reading and speaking time.

Try the browser version of this tool

· Request body
· request.json
{
  "text": "The quick brown fox jumps over the lazy dog."
}
· Response
· response.json
{
  "words": 9,
  "characters": 44,
  "characters_no_spaces": 36,
  "sentences": 1,
  "paragraphs": 1,
  "reading_time_seconds": 2
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/word-counter \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"text":"The quick brown fox jumps over the lazy dog."}'
POST/api/v1/tools/cron-parser

Cron Parser

Parse a cron expression into a human-readable description and list the next N scheduled runs.

Try the browser version of this tool

· Request body
· request.json
{
  "expression": "0 9 * * MON-FRI",
  "count": 3
}
· Response
· response.json
{
  "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
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/cron-parser \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"expression":"0 9 * * MON-FRI","count":3}'
POST/api/v1/tools/uuid-generator

UUID Generator

Generate one or more UUIDs (v4). Optionally return as uppercase or without dashes.

Try the browser version of this tool

· Request body
· request.json
{
  "count": 2,
  "uppercase": false
}
· Response
· response.json
{
  "uuids": [
    "f47ac10b-58cc-4372-a567-0e02b2c3d479",
    "7c9e6679-7425-40de-944b-e07fc1f90ae7"
  ]
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/uuid-generator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"count":2,"uppercase":false}'
POST/api/v1/tools/iban-validator

IBAN Validator

Validate an IBAN number. Returns country, bank code, and checksum verification.

Try the browser version of this tool

· Request body
· request.json
{
  "iban": "DE89370400440532013000"
}
· Response
· response.json
{
  "valid": true,
  "country": "Germany",
  "country_code": "DE",
  "bank_code": "37040044",
  "checksum": "89"
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/iban-validator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"iban":"DE89370400440532013000"}'
POST/api/v1/tools/slug-generator

Slug Generator

Convert any text into a URL-friendly slug. Handles unicode, diacritics, and special characters.

Try the browser version of this tool

· Request body
· request.json
{
  "text": "Hello World! This is a Test.",
  "separator": "-"
}
· Response
· response.json
{
  "slug": "hello-world-this-is-a-test"
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/slug-generator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"text":"Hello World! This is a Test.","separator":"-"}'
POST/api/v1/tools/email-validator

Email Validator

Validate email address syntax and check for common typos in popular domain names.

· Request body
· request.json
{
  "email": "user@gmial.com"
}
· Response
· response.json
{
  "valid": true,
  "syntax_ok": true,
  "suggestion": "user@gmail.com",
  "disposable": false
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/email-validator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"email":"user@gmial.com"}'
POST/api/v1/tools/vat-calculator

VAT Calculator

Add VAT to a net amount or extract VAT from a gross amount, at any rate. Built for invoicing and pricing flows.

Try the browser version of this tool

· Request body
· request.json
{
  "amount": 100,
  "rate": 21,
  "mode": "add"
}
· Response
· response.json
{
  "net": 100,
  "vat": 21,
  "gross": 121,
  "rate": 21
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/vat-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"amount":100,"rate":21,"mode":"add"}'
POST/api/v1/tools/vat-number-check

VAT Number Format Check

Validate the format of EU (plus GB/CH) VAT numbers before storing them. Syntax check only, no VIES lookup.

Try the browser version of this tool

· Request body
· request.json
{
  "vatNumber": "NL123456789B01"
}
· Response
· response.json
{
  "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."
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/vat-number-check \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"vatNumber":"NL123456789B01"}'
POST/api/v1/tools/dutch-holidays

Dutch Public Holidays

All Dutch public holidays for a given year, including movable feasts like Easter, Ascension Day, and King's Day.

Try the browser version of this tool

· Request body
· request.json
{
  "year": 2026
}
· Response
· response.json
{
  "year": 2026,
  "holidays": [
    {
      "date": "2026-04-27",
      "name": "Koningsdag",
      "nameEn": "King's Day",
      "dayOff": true
    }
  ]
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/dutch-holidays \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"year":2026}'
POST/api/v1/tools/working-days

Working Days Calculator

Count working days (Monday to Friday) between two dates, optionally excluding Dutch public holidays. Ideal for SLA and payroll calculations.

Try the browser version of this tool

· Request body
· request.json
{
  "start": "2026-09-01",
  "end": "2026-09-30",
  "excludeDutchHolidays": true
}
· Response
· response.json
{
  "start": "2026-09-01",
  "end": "2026-09-30",
  "totalDays": 30,
  "workingDays": 22,
  "weekendDays": 8,
  "holidaysExcluded": []
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/working-days \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"start":"2026-09-01","end":"2026-09-30","excludeDutchHolidays":true}'
POST/api/v1/tools/test-bsn-generator

Test BSN Generator

Generate Dutch BSN test numbers that pass the elfproef (11-check) but are not linked to real persons. For development and test environments.

Try the browser version of this tool

· Request body
· request.json
{
  "count": 3
}
· Response
· response.json
{
  "count": 3,
  "bsns": [
    "111222333",
    "123456782",
    "987654321"
  ],
  "note": "Test numbers that pass the elfproef (11-check). They are not linked to real persons."
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/test-bsn-generator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"count":3}'
POST/api/v1/tools/test-iban-generator

Test IBAN Generator

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.

Try the browser version of this tool

· Request body
· request.json
{
  "country": "NL",
  "count": 3
}
· Response
· response.json
{
  "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."
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/test-iban-generator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"country":"NL","count":3}'
POST/api/v1/tools/brp-test-data-generator

BRP Test Data Generator

Generate Dutch BRP/GBA test persons: valid BSNs, families, addresses and life events. Every setting on the tool page is a field here, and the same seed always returns the same people, so a test suite can assert on fixed values. Formats: json, csv, gba-totaalfile. Full parameter reference at /developers/generators.

Try the browser version of this tool

· Request body
· request.json
{
  "format": "json",
  "options": {
    "count": 25,
    "seed": 20270101,
    "minAge": 60,
    "maxAge": 80,
    "eventMix": {
      "married": 5,
      "widowed": 3,
      "deceased": 1
    }
  }
}
· Response
· response.json
{
  "format": "json",
  "count": 25,
  "seed": 20270101,
  "people": [
    {
      "bsn": "123456782",
      "lastName": "de Vries",
      "dateOfBirth": "19620314",
      "lifeEvent": "married"
    }
  ]
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/brp-test-data-generator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"format":"json","options":{"count":25,"seed":20270101,"minAge":60,"maxAge":80,"eventMix":{"married":5,"widowed":3,"deceased":1}}}'
POST/api/v1/tools/upa-file-generator

UPA File Generator

Generate UPA pension declaration XML for one or more periods: employments, schemes, household situations and, when you ask for them, deliberate defects that the receiving system should reject. Every setting on the tool page is a field here and the seed makes it repeatable. Formats: xml, summary, participants-csv. Full parameter reference at /developers/generators.

Try the browser version of this tool

· Request body
· request.json
{
  "format": "xml",
  "options": {
    "schemeType": "FPR",
    "population": {
      "count": 50,
      "seed": 20270101
    },
    "period": {
      "startYear": 2027,
      "startMonth": 1,
      "months": 3
    },
    "defects": {
      "invalidBsn": true
    }
  }
}
· Response
· response.json
{
  "format": "xml",
  "fileCount": 3,
  "peopleCount": 50,
  "warnings": [
    "1 deliberate defect injected. These files are meant to be rejected."
  ],
  "files": [
    {
      "name": "UPA_202701_001.xml",
      "periodLabel": "2027-01",
      "employments": 50,
      "content": "<?xml version=\"1.0\"?>…"
    }
  ]
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/upa-file-generator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"format":"xml","options":{"schemeType":"FPR","population":{"count":50,"seed":20270101},"period":{"startYear":2027,"startMonth":1,"months":3},"defects":{"invalidBsn":true}}}'
POST/api/v1/tools/text-case-converter

Text Case Converter

Convert a text to one case style: upper, lower, title, sentence, camel, pascal, snake or kebab. Returns the converted string.

Try the browser version of this tool

· Request body
· request.json
{
  "text": "hello world from ToolForte",
  "mode": "snake"
}
· Response
· response.json
{
  "result": "hello_world_from_tool_forte",
  "mode": "snake"
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/text-case-converter \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"text":"hello world from ToolForte","mode":"snake"}'
POST/api/v1/tools/lorem-ipsum-generator

Lorem Ipsum Generator

Generate classic lorem ipsum placeholder text as paragraphs, sentences, words or a list, optionally wrapped in HTML. Deterministic: the same options give the same text.

Try the browser version of this tool

· Request body
· request.json
{
  "count": 2,
  "type": "sentences",
  "startWithLorem": true,
  "html": false,
  "seed": 1
}
· Response
· response.json
{
  "text": "Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod tempor incididunt. Lorem ipsum dolor sit amet consectetur adipiscing elit.",
  "type": "sentences",
  "count": 2,
  "words": 26,
  "characters": 172,
  "paragraphs": 1
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/lorem-ipsum-generator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"count":2,"type":"sentences","startWithLorem":true,"html":false,"seed":1}'
POST/api/v1/tools/sort-lines

Sort Lines

Sort the lines of a text A to Z, Z to A, by length, in natural numeric order, or shuffle them with a seed. Can drop duplicates and ignore case. Returns the sorted text and line count.

Try the browser version of this tool

· Request body
· request.json
{
  "text": "banana\napple\nCherry\nitem10\nitem2",
  "mode": "natural",
  "caseInsensitive": true,
  "removeDuplicates": false,
  "reverse": false,
  "seed": 1
}
· Response
· response.json
{
  "result": "apple\nbanana\nCherry\nitem2\nitem10",
  "mode": "natural",
  "lines": 5,
  "removedDuplicates": 0
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/sort-lines \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"text":"banana\napple\nCherry\nitem10\nitem2","mode":"natural","caseInsensitive":true,"removeDuplicates":false,"reverse":false,"seed":1}'
POST/api/v1/tools/remove-duplicate-lines

Remove Duplicate Lines

Remove repeated lines from a text while keeping the original order. Returns the cleaned text with how many lines were removed.

Try the browser version of this tool

· Request body
· request.json
{
  "text": "apple\nbanana\napple\n banana\ncherry",
  "caseInsensitive": false,
  "trim": true,
  "keepFirst": true
}
· Response
· response.json
{
  "result": "apple\nbanana\ncherry",
  "total": 5,
  "kept": 3,
  "removed": 2
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/remove-duplicate-lines \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"text":"apple\nbanana\napple\n banana\ncherry","caseInsensitive":false,"trim":true,"keepFirst":true}'
POST/api/v1/tools/reverse-text

Reverse Text

Reverse a text by characters, by word order per line, or by the characters of each line. Returns the reversed string.

Try the browser version of this tool

· Request body
· request.json
{
  "text": "one two three",
  "mode": "words"
}
· Response
· response.json
{
  "result": "three two one",
  "mode": "words"
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/reverse-text \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"text":"one two three","mode":"words"}'
POST/api/v1/tools/find-and-replace

Find and Replace

Replace every occurrence of a string or regular expression in a text. Supports case sensitivity, whole word matching and regex groups in the replacement. Returns the new text and the number of replacements.

Try the browser version of this tool

· Request body
· request.json
{
  "text": "The cat sat on the mat with another cat.",
  "find": "cat",
  "replace": "dog",
  "caseSensitive": false,
  "wholeWord": true,
  "useRegex": false
}
· Response
· response.json
{
  "result": "The dog sat on the mat with another dog.",
  "count": 2
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/find-and-replace \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"text":"The cat sat on the mat with another cat.","find":"cat","replace":"dog","caseSensitive":false,"wholeWord":true,"useRegex":false}'
POST/api/v1/tools/word-frequency-counter

Word Frequency Counter

Count how often each word occurs in a text and return a ranked table, most frequent first, with counts and percentages. Can ignore case, skip short words and drop common stop words.

Try the browser version of this tool

· Request body
· request.json
{
  "text": "the cat and the dog and the bird",
  "ignoreCase": true,
  "minLength": 1,
  "excludeStopWords": false,
  "limit": 3
}
· Response
· response.json
{
  "words": [
    {
      "rank": 1,
      "word": "the",
      "count": 3,
      "percent": 37.5
    },
    {
      "rank": 2,
      "word": "and",
      "count": 2,
      "percent": 25
    },
    {
      "rank": 3,
      "word": "bird",
      "count": 1,
      "percent": 12.5
    }
  ],
  "totalWords": 8,
  "uniqueWords": 5
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/word-frequency-counter \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"text":"the cat and the dog and the bird","ignoreCase":true,"minLength":1,"excludeStopWords":false,"limit":3}'
POST/api/v1/tools/reading-time-calculator

Reading Time Calculator

Estimate how long a text takes to read and to speak aloud, from the text itself or a word count, at a chosen words-per-minute plus slow, average and fast presets.

Try the browser version of this tool

· Request body
· request.json
{
  "text": "Knowing how long your content takes to read helps you plan articles, documentation and talks. This short paragraph is here as a sample.",
  "readingWpm": 238,
  "speakingWpm": 150
}
· Response
· response.json
{
  "wordCount": 23,
  "characters": 135,
  "sentences": 2,
  "reading": {
    "label": "Custom",
    "wpm": 238,
    "minutes": 0.1,
    "time": "< 1 min"
  },
  "speaking": {
    "label": "Custom",
    "wpm": 150,
    "minutes": 0.15,
    "time": "< 1 min"
  },
  "readingPresets": [
    {
      "label": "Slow Reader",
      "wpm": 150,
      "minutes": 0.15,
      "time": "< 1 min"
    }
  ],
  "speakingPresets": [
    {
      "label": "Slow Speech",
      "wpm": 100,
      "minutes": 0.23,
      "time": "< 1 min"
    }
  ]
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/reading-time-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"text":"Knowing how long your content takes to read helps you plan articles, documentation and talks. This short paragraph is here as a sample.","readingWpm":238,"speakingWpm":150}'
POST/api/v1/tools/rot13

ROT13 Cipher

Apply ROT13, or any Caesar shift from 1 to 25, to a text. Letters rotate and keep their case; digits and punctuation stay as they are. Decoding with shift 13 gives the original back.

Try the browser version of this tool

· Request body
· request.json
{
  "text": "Hello, World!",
  "shift": 13,
  "decode": false
}
· Response
· response.json
{
  "result": "Uryyb, Jbeyq!",
  "shift": 13,
  "decode": false
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/rot13 \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"text":"Hello, World!","shift":13,"decode":false}'
POST/api/v1/tools/morse-code-translator

Morse Code Translator

Translate text to International Morse code or Morse back to text. Letters are separated by a space and words by a slash; characters without a Morse code are dropped.

Try the browser version of this tool

· Request body
· request.json
{
  "text": "SOS help",
  "mode": "encode"
}
· Response
· response.json
{
  "result": "... --- ... / .... . .-.. .--.",
  "mode": "encode"
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/morse-code-translator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"text":"SOS help","mode":"encode"}'
POST/api/v1/tools/numbers-to-words

Numbers to Words

Write a number out in English words, up to 999 quadrillion, with decimals read digit by digit or as a currency amount in dollars, euros or pounds. Optional British style with "and".

Try the browser version of this tool

· Request body
· request.json
{
  "number": "1234.56",
  "mode": "plain",
  "currency": "dollars",
  "british": false
}
· Response
· response.json
{
  "words": "One thousand two hundred thirty-four point five six",
  "number": "1234.56"
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/numbers-to-words \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"number":"1234.56","mode":"plain","currency":"dollars","british":false}'
POST/api/v1/tools/roman-numeral-converter

Roman Numeral Converter

Convert a whole number from 1 to 3999 into a Roman numeral, or a Roman numeral back into a number, with strict validation and a symbol-by-symbol breakdown. Detects the direction from the input unless a mode is given.

Try the browser version of this tool

· Request body
· request.json
{
  "value": "1994",
  "mode": "auto"
}
· Response
· response.json
{
  "direction": "toRoman",
  "roman": "MCMXCIV",
  "number": 1994,
  "parts": [
    {
      "value": 1000,
      "symbol": "M"
    }
  ],
  "breakdown": "M (1000) + CM (900) + XC (90) + IV (4)"
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/roman-numeral-converter \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"value":"1994","mode":"auto"}'
POST/api/v1/tools/text-cleaner

Text Cleaner

Clean up messy text: collapse extra spaces, trim lines, drop empty lines, strip HTML tags, remove punctuation, digits, emojis or control characters, and straighten smart quotes. Returns the cleaned text and how many characters each step removed.

Try the browser version of this tool

· Request body
· request.json
{
  "text": "<p>Hello   world</p>\n\n\n  “quoted”  text  ",
  "extraSpaces": true,
  "trimLines": true,
  "emptyLines": true,
  "lineBreaks": false,
  "htmlTags": true,
  "punctuation": false,
  "numbers": false,
  "emojis": false,
  "plainQuotes": true,
  "controlChars": false
}
· Response
· response.json
{
  "result": "Hello world\n\"quoted\" text",
  "charactersBefore": 41,
  "charactersAfter": 25,
  "charactersRemoved": 16,
  "steps": [
    {
      "option": "htmlTags",
      "charactersRemoved": 7
    }
  ],
  "changed": [
    "htmlTags",
    "plainQuotes",
    "trimLines",
    "emptyLines",
    "extraSpaces"
  ]
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/text-cleaner \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"text":"<p>Hello   world</p>\n\n\n  “quoted”  text  ","extraSpaces":true,"trimLines":true,"emptyLines":true,"lineBreaks":false,"htmlTags":true,"punctuation":false,"numbers":false,"emojis":false,"plainQuotes":true,"controlChars":false}'
POST/api/v1/tools/json-to-csv

JSON to CSV

Turn a JSON array of objects, or a JSON string holding one, into CSV text. Nested objects become dotted column names such as address.city, arrays are written as JSON inside the cell, and every key seen in any row becomes a column.

Try the browser version of this tool

· Request body
· request.json
{
  "json": "[{\"name\":\"Alice\",\"address\":{\"city\":\"Utrecht\"}},{\"name\":\"Bob\",\"address\":{\"city\":\"Leiden\"}}]",
  "delimiter": ",",
  "includeHeader": true,
  "flatten": true
}
· Response
· response.json
{
  "csv": "name,address.city\nAlice,Utrecht\nBob,Leiden",
  "columns": [
    "name",
    "address.city"
  ],
  "rowCount": 2
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/json-to-csv \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"json":"[{\"name\":\"Alice\",\"address\":{\"city\":\"Utrecht\"}},{\"name\":\"Bob\",\"address\":{\"city\":\"Leiden\"}}]","delimiter":",","includeHeader":true,"flatten":true}'
POST/api/v1/tools/json-to-yaml

JSON to YAML

Convert a JSON string to YAML text. Strings are quoted only when a YAML reader would otherwise see a number, boolean, date or empty value, multi-line strings become block scalars, and keys can be sorted.

Try the browser version of this tool

· Request body
· request.json
{
  "json": "{\"name\":\"ToolForte\",\"tags\":[\"fast\",\"free\"],\"owner\":null}",
  "indent": 2,
  "sortKeys": false,
  "nullStyle": "null"
}
· Response
· response.json
{
  "yaml": "name: ToolForte\ntags:\n  - fast\n  - free\nowner: null"
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/json-to-yaml \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"json":"{\"name\":\"ToolForte\",\"tags\":[\"fast\",\"free\"],\"owner\":null}","indent":2,"sortKeys":false,"nullStyle":"null"}'
POST/api/v1/tools/yaml-to-json

YAML to JSON

Parse YAML text and return both the value and its JSON text. Reads maps, lists, inline [lists] and {maps}, quoted and block scalars and comments. Anchors, aliases, merge keys, tags and multi-document files are not supported and are reported with the line number.

Try the browser version of this tool

· Request body
· request.json
{
  "yaml": "name: ToolForte\ntags:\n  - fast\n  - free\nport: 8080",
  "indent": 2
}
· Response
· response.json
{
  "value": {
    "name": "ToolForte",
    "tags": [
      "fast",
      "free"
    ],
    "port": 8080
  },
  "json": "{\n  \"name\": \"ToolForte\",\n  \"tags\": [\n    \"fast\",\n    \"free\"\n  ],\n  \"port\": 8080\n}"
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/yaml-to-json \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"yaml":"name: ToolForte\ntags:\n  - fast\n  - free\nport: 8080","indent":2}'
POST/api/v1/tools/xml-to-json

XML to JSON

Parse XML into a JSON object keyed by the root element. Attributes become keys with a prefix ("@id"), text beside attributes or children lands under "#text", repeated elements become arrays, and namespace prefixes can be dropped. Malformed XML is reported with the line number; DTD-declared entities are not expanded.

Try the browser version of this tool

· Request body
· request.json
{
  "xml": "<order id=\"42\"><item sku=\"A1\">Bolts</item><item sku=\"B2\">Nuts</item></order>",
  "attributePrefix": "@",
  "dropNamespaces": true,
  "indent": 2
}
· Response
· response.json
{
  "value": {
    "order": {
      "@id": "42",
      "item": [
        {
          "@sku": "A1",
          "#text": "Bolts"
        },
        {
          "@sku": "B2",
          "#text": "Nuts"
        }
      ]
    }
  },
  "json": "{\n  \"order\": {\n    \"@id\": \"42\",\n    \"item\": [\n      {\n        \"@sku\": \"A1\",\n        \"#text\": \"Bolts\"\n      },\n      {\n        \"@sku\": \"B2\",\n        \"#text\": \"Nuts\"\n      }\n    ]\n  }\n}",
  "elements": 3
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/xml-to-json \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"xml":"<order id=\"42\"><item sku=\"A1\">Bolts</item><item sku=\"B2\">Nuts</item></order>","attributePrefix":"@","dropNamespaces":true,"indent":2}'
POST/api/v1/tools/json-to-xml

JSON to XML

Serialise a JSON string as XML. Object keys become element names, array items repeat the parent key, null and empty objects become self-closing tags, and the root element name is yours to choose. A top-level array is wrapped in the root with one item element per entry.

Try the browser version of this tool

· Request body
· request.json
{
  "json": "{\"name\":\"ToolForte\",\"tags\":[\"fast\",\"free\"]}",
  "rootName": "product",
  "declaration": true
}
· Response
· response.json
{
  "xml": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<product>\n  <name>ToolForte</name>\n  <tags>fast</tags>\n  <tags>free</tags>\n</product>"
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/json-to-xml \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"json":"{\"name\":\"ToolForte\",\"tags\":[\"fast\",\"free\"]}","rootName":"product","declaration":true}'
POST/api/v1/tools/xml-formatter

XML Formatter

Pretty-print XML with consistent indentation, or minify it by removing the whitespace between tags. Elements that hold only text stay on one line, and comments, CDATA and processing instructions are kept. Malformed XML is reported with the line number rather than reshaped.

Try the browser version of this tool

· Request body
· request.json
{
  "xml": "<a><b x=\"1\">text</b><c/></a>",
  "mode": "pretty",
  "indent": 2
}
· Response
· response.json
{
  "xml": "<a>\n  <b x=\"1\">text</b>\n  <c/>\n</a>"
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/xml-formatter \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"xml":"<a><b x=\"1\">text</b><c/></a>","mode":"pretty","indent":2}'
POST/api/v1/tools/csv-to-markdown

CSV to Markdown

Turn CSV text into a GitHub-style Markdown table. Detects the delimiter (comma, semicolon, tab or pipe) unless told, reads quoted fields with embedded delimiters and newlines, and can align columns and pad cells so the table lines up in plain text.

Try the browser version of this tool

· Request body
· request.json
{
  "csv": "name,age\nAlice,30\nBob,25",
  "delimiter": "auto",
  "firstRowHeader": true,
  "padded": true,
  "alignment": "left"
}
· Response
· response.json
{
  "markdown": "| name  | age |\n| :---- | :-- |\n| Alice | 30  |\n| Bob   | 25  |",
  "rows": 2,
  "columns": 2,
  "delimiter": ",",
  "raggedLines": []
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/csv-to-markdown \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"csv":"name,age\nAlice,30\nBob,25","delimiter":"auto","firstRowHeader":true,"padded":true,"alignment":"left"}'
POST/api/v1/tools/sql-formatter

SQL Formatter

Pretty-print a SQL statement: keywords in upper case, each major clause (SELECT, FROM, WHERE, JOIN, GROUP BY, ORDER BY and so on) on its own line, and indentation inside CASE and parentheses. String literals are left untouched. A formatter, not a parser: it does not check that the SQL is valid.

Try the browser version of this tool

· Request body
· request.json
{
  "sql": "select id, name from users where active = 1 and role = 'admin' order by name"
}
· Response
· response.json
{
  "sql": "SELECT id, name\nFROM users\nWHERE active = 1\nAND role = 'admin'\nORDER BY name"
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/sql-formatter \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"sql":"select id, name from users where active = 1 and role = 'admin' order by name"}'
POST/api/v1/tools/html-entity-encoder

HTML Entity Encoder

Encode text as HTML entities or decode entities back to text. Encoding always covers &, <, >, quotes and common typographic characters, and can cover every non-ASCII character too, named where HTML has a name (&eacute;) and numeric otherwise. Decoding reads numeric references and HTML 4 named entities; unknown names are left as they are.

Try the browser version of this tool

· Request body
· request.json
{
  "text": "<a href=\"x\">Tom & Jerry</a>",
  "mode": "encode",
  "encodeNonAscii": false
}
· Response
· response.json
{
  "output": "&lt;a href=&quot;x&quot;&gt;Tom &amp; Jerry&lt;/a&gt;",
  "mode": "encode"
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/html-entity-encoder \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"text":"<a href=\"x\">Tom & Jerry</a>","mode":"encode","encodeNonAscii":false}'
POST/api/v1/tools/json-to-typescript

JSON to TypeScript

Derive TypeScript interfaces from a JSON sample. Nested objects become their own interfaces named after their key, arrays become typed arrays (a union when the items differ), null stays null, and properties can be made optional or readonly.

Try the browser version of this tool

· Request body
· request.json
{
  "json": "{\"id\":1,\"name\":\"Ada\",\"address\":{\"city\":\"Utrecht\"},\"tags\":[\"a\",\"b\"]}",
  "rootName": "User",
  "exportInterfaces": true,
  "optionalProps": false,
  "readonlyProps": false
}
· Response
· response.json
{
  "typescript": "export interface Address {\n  city: string;\n}\n\nexport interface User {\n  id: number;\n  name: string;\n  address: Address;\n  tags: string[];\n}",
  "declarations": 2
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/json-to-typescript \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"json":"{\"id\":1,\"name\":\"Ada\",\"address\":{\"city\":\"Utrecht\"},\"tags\":[\"a\",\"b\"]}","rootName":"User","exportInterfaces":true,"optionalProps":false,"readonlyProps":false}'
POST/api/v1/tools/hash-generator

Hash Generator

Hash a text with SHA-1, SHA-256, SHA-384 or SHA-512 and return the hex digest, or all four at once. Text is hashed as UTF-8. No MD5: it is broken and Web Crypto does not offer it.

Try the browser version of this tool

· Request body
· request.json
{
  "text": "hello world",
  "algorithm": "SHA-256"
}
· Response
· response.json
{
  "algorithms": [
    "SHA-256"
  ],
  "hashes": {
    "SHA-256": "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9"
  },
  "byteLength": 11
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/hash-generator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"text":"hello world","algorithm":"SHA-256"}'
POST/api/v1/tools/jwt-decoder

JWT Decoder

Decode a JSON Web Token into its header and payload, and explain the exp, iat and nbf claims as ISO dates with an expired flag. The signature is returned but never verified.

Try the browser version of this tool

· Request body
· request.json
{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c",
  "now": "2026-09-07T12:00:00Z"
}
· Response
· response.json
{
  "header": {
    "alg": "HS256",
    "typ": "JWT"
  },
  "payload": {
    "sub": "1234567890",
    "name": "John Doe",
    "iat": 1516239022
  },
  "signature": "SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c",
  "expiresAt": null,
  "issuedAt": {
    "unix": 1516239022,
    "iso": "2018-01-18T01:30:22.000Z"
  },
  "notBefore": null,
  "expired": null,
  "checkedAt": "2026-09-07T12:00:00.000Z",
  "verified": false
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/jwt-decoder \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c","now":"2026-09-07T12:00:00Z"}'
POST/api/v1/tools/timestamp-converter

Timestamp Converter

Convert a Unix timestamp (seconds or milliseconds) to an ISO 8601 UTC date, or an ISO date to a Unix timestamp. Returns both timestamps, the ISO and RFC 7231 forms, and the weekday.

Try the browser version of this tool

· Request body
· request.json
{
  "value": 1725710400,
  "unit": "auto"
}
· Response
· response.json
{
  "input": 1725710400,
  "interpretedAs": "seconds",
  "unixSeconds": 1725710400,
  "unixMilliseconds": 1725710400000,
  "iso": "2024-09-07T12:00:00.000Z",
  "utc": "Sat, 07 Sep 2024 12:00:00 GMT",
  "date": "2024-09-07",
  "time": "12:00:00",
  "weekday": "Saturday"
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/timestamp-converter \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"value":1725710400,"unit":"auto"}'
POST/api/v1/tools/number-base-converter

Number Base Converter

Convert a whole number from one base to another, any base 2 to 36, and also return its binary, octal, decimal and hexadecimal forms. Exact for numbers of any size, no rounding.

Try the browser version of this tool

· Request body
· request.json
{
  "value": "255",
  "fromBase": 10,
  "toBase": 2
}
· Response
· response.json
{
  "input": "255",
  "fromBase": 10,
  "toBase": 2,
  "output": "11111111",
  "negative": false,
  "binary": "11111111",
  "octal": "377",
  "decimal": "255",
  "hexadecimal": "FF"
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/number-base-converter \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"value":"255","fromBase":10,"toBase":2}'
POST/api/v1/tools/password-generator

Password Generator

Generate one or more random passwords of a chosen length from lower case, upper case, digits and symbols, optionally without look-alike characters. Returns the passwords with their entropy in bits and a rough crack time.

Try the browser version of this tool

· Request body
· request.json
{
  "length": 16,
  "uppercase": true,
  "lowercase": true,
  "numbers": true,
  "symbols": true,
  "excludeAmbiguous": false,
  "count": 1
}
· Response
· response.json
{
  "passwords": [
    "k7#Qm2$vLp9!Xw4Z"
  ],
  "length": 16,
  "charsetSize": 88,
  "entropyBits": 103,
  "strength": "Very strong",
  "crackTime": "32B+ years"
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/password-generator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"length":16,"uppercase":true,"lowercase":true,"numbers":true,"symbols":true,"excludeAmbiguous":false,"count":1}'
POST/api/v1/tools/random-number-generator

Random Number Generator

Draw random whole numbers between a minimum and maximum, inclusive, using cryptographic randomness. Ask for several at once, with or without repeats, for dice, lottery draws or samples.

Try the browser version of this tool

· Request body
· request.json
{
  "min": 1,
  "max": 6,
  "count": 3,
  "allowDuplicates": true
}
· Response
· response.json
{
  "numbers": [
    4,
    1,
    6
  ],
  "min": 1,
  "max": 6,
  "count": 3,
  "unique": true
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/random-number-generator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"min":1,"max":6,"count":3,"allowDuplicates":true}'
POST/api/v1/tools/chmod-calculator

Chmod Calculator

Convert Unix file permissions between octal (755) and symbolic (rwxr-xr-x) form. Returns both, a read/write/execute breakdown for owner, group and others, and the chmod command to apply them.

Try the browser version of this tool

· Request body
· request.json
{
  "permissions": "755"
}
· Response
· response.json
{
  "input": "755",
  "octal": "755",
  "symbolic": "rwxr-xr-x",
  "owner": {
    "read": true,
    "write": true,
    "execute": true,
    "octal": 7,
    "symbolic": "rwx"
  },
  "group": {
    "read": true,
    "write": false,
    "execute": true,
    "octal": 5,
    "symbolic": "r-x"
  },
  "others": {
    "read": true,
    "write": false,
    "execute": true,
    "octal": 5,
    "symbolic": "r-x"
  },
  "command": "chmod 755 <file>"
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/chmod-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"permissions":"755"}'
POST/api/v1/tools/http-status-codes

HTTP Status Codes

Look up what an HTTP status code means. Give a code (404), a class (4xx) or a word (timeout) and get the name, class, one-line meaning, typical use case and RFC reference for every match.

Try the browser version of this tool

· Request body
· request.json
{
  "query": "404"
}
· Response
· response.json
{
  "query": "404",
  "found": true,
  "count": 1,
  "matches": [
    {
      "code": 404,
      "name": "Not Found",
      "class": "4xx",
      "className": "Client Error",
      "description": "The server cannot find the requested resource. The URL is not recognized.",
      "useCase": "Deleted pages, typos in URLs, resources that never existed. Most common HTTP error.",
      "rfc": "RFC 9110"
    }
  ]
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/http-status-codes \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"query":"404"}'
POST/api/v1/tools/px-rem-converter

PX to REM Converter

Convert a pixel value to rem or a rem value to pixels for a given root font size, 16px unless told otherwise. Returns both numbers and CSS-ready strings.

Try the browser version of this tool

· Request body
· request.json
{
  "value": 24,
  "direction": "px-to-rem",
  "rootFontSize": 16
}
· Response
· response.json
{
  "input": 24,
  "direction": "px-to-rem",
  "rootFontSize": 16,
  "px": 24,
  "rem": 1.5,
  "pxText": "24px",
  "remText": "1.5rem"
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/px-rem-converter \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"value":24,"direction":"px-to-rem","rootFontSize":16}'
POST/api/v1/tools/utm-builder

UTM Builder

Add utm_source, utm_medium, utm_campaign, utm_term and utm_content to a URL, keeping any query parameters it already has. Returns the tagged link plus warnings about upper case or missing required tags.

Try the browser version of this tool

· Request body
· request.json
{
  "url": "https://example.com/pricing?ref=1",
  "source": "newsletter",
  "medium": "email",
  "campaign": "spring_sale",
  "term": "running_shoes",
  "content": "header_banner"
}
· Response
· response.json
{
  "url": "https://example.com/pricing?ref=1&utm_source=newsletter&utm_medium=email&utm_campaign=spring_sale&utm_term=running_shoes&utm_content=header_banner",
  "baseUrl": "https://example.com/pricing?ref=1",
  "params": {
    "utm_source": "newsletter",
    "utm_medium": "email",
    "utm_campaign": "spring_sale",
    "utm_term": "running_shoes",
    "utm_content": "header_banner"
  },
  "warnings": []
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/utm-builder \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"url":"https://example.com/pricing?ref=1","source":"newsletter","medium":"email","campaign":"spring_sale","term":"running_shoes","content":"header_banner"}'
POST/api/v1/tools/color-contrast-checker

Color Contrast Checker

Compute the WCAG 2 contrast ratio between a text colour and a background colour and say whether it passes AA and AAA for normal and large text. Accepts hex, rgb() or hsl(), and suggests a nearby colour when it fails.

Try the browser version of this tool

· Request body
· request.json
{
  "foreground": "#1e293b",
  "background": "#ffffff"
}
· Response
· response.json
{
  "foreground": "#1e293b",
  "background": "#ffffff",
  "ratio": 14.63,
  "ratioText": "14.63:1",
  "aa": {
    "normalText": true,
    "largeText": true
  },
  "aaa": {
    "normalText": true,
    "largeText": true
  },
  "suggestions": []
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/color-contrast-checker \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"foreground":"#1e293b","background":"#ffffff"}'
POST/api/v1/tools/percentage-calculator

Percentage Calculator

Answer one percentage question from two numbers: what x% of y is, what percent x is of y, the percentage change from x to y, or x increased or decreased by y%. Returns the number and a sentence stating it.

Try the browser version of this tool

· Request body
· request.json
{
  "mode": "percentOf",
  "x": 15,
  "y": 200
}
· Response
· response.json
{
  "mode": "percentOf",
  "x": 15,
  "y": 200,
  "result": 30,
  "resultIsPercent": false,
  "sentence": "15% of 200 is 30."
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/percentage-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"mode":"percentOf","x":15,"y":200}'
POST/api/v1/tools/compound-interest-calculator

Compound Interest Calculator

Grow a starting amount at an annual rate for a number of years, compounding monthly, quarterly or annually, with an optional monthly contribution. Returns the future value, total contributed, total interest and a year-by-year table.

Try the browser version of this tool

· Request body
· request.json
{
  "principal": 10000,
  "annualRatePercent": 7,
  "years": 10,
  "compoundsPerYear": 12,
  "monthlyContribution": 100
}
· Response
· response.json
{
  "principal": 10000,
  "annualRatePercent": 7,
  "years": 10,
  "compoundsPerYear": 12,
  "monthlyContribution": 100,
  "futureValue": 37506.06,
  "totalContributed": 22000,
  "totalInterest": 15506.06,
  "interestPercent": 41.34,
  "yearly": [
    {
      "year": 1,
      "contributions": 11200,
      "interest": 769.39,
      "balance": 11969.39
    }
  ]
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/compound-interest-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"principal":10000,"annualRatePercent":7,"years":10,"compoundsPerYear":12,"monthlyContribution":100}'
POST/api/v1/tools/loan-calculator

Loan Calculator

Work out an annuity loan from the amount, annual interest rate and term: the fixed monthly payment, total paid, total interest and an amortisation schedule of up to 360 months showing principal, interest and remaining balance.

Try the browser version of this tool

· Request body
· request.json
{
  "amount": 250000,
  "annualRatePercent": 4.5,
  "term": 30,
  "termUnit": "years"
}
· Response
· response.json
{
  "amount": 250000,
  "annualRatePercent": 4.5,
  "termMonths": 360,
  "monthlyPayment": 1266.71,
  "totalPaid": 456016.78,
  "totalInterest": 206016.78,
  "interestToPrincipalRatio": 0.82,
  "schedule": [
    {
      "month": 1,
      "payment": 1266.71,
      "principal": 329.21,
      "interest": 937.5,
      "balance": 249670.79
    }
  ],
  "scheduleTruncated": false
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/loan-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"amount":250000,"annualRatePercent":4.5,"term":30,"termUnit":"years"}'
POST/api/v1/tools/bmi-calculator

BMI Calculator

Body mass index from height and weight, in centimetres and kilograms or in inches and pounds. Returns the BMI, its category (underweight, normal weight, overweight, obese) and the weight range that would count as normal at that height.

Try the browser version of this tool

· Request body
· request.json
{
  "height": 175,
  "weight": 70,
  "units": "metric"
}
· Response
· response.json
{
  "units": "metric",
  "heightCm": 175,
  "weightKg": 70,
  "bmi": 22.9,
  "category": "Normal weight",
  "healthyWeightRange": {
    "min": 56.7,
    "max": 76.3,
    "unit": "kg"
  },
  "categories": [
    {
      "label": "Underweight",
      "range": "< 18.5"
    }
  ]
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/bmi-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"height":175,"weight":70,"units":"metric"}'
POST/api/v1/tools/date-difference-calculator

Date Difference Calculator

The time between two calendar dates: total days, weeks plus days, a years/months/days breakdown, hours, and the number of business days (Monday to Friday, no holidays). Order does not matter; the end date is excluded unless includeEndDate is true.

Try the browser version of this tool

· Request body
· request.json
{
  "startDate": "2026-01-01",
  "endDate": "2026-12-31",
  "includeEndDate": false
}
· Response
· response.json
{
  "start": "2026-01-01",
  "end": "2026-12-31",
  "startWeekday": "Thursday",
  "endWeekday": "Thursday",
  "swapped": false,
  "includeEndDate": false,
  "years": 0,
  "months": 11,
  "days": 30,
  "totalDays": 364,
  "totalWeeks": 52,
  "weeksAndDays": {
    "weeks": 52,
    "days": 0
  },
  "totalHours": 8736,
  "businessDays": 260
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/date-difference-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"startDate":"2026-01-01","endDate":"2026-12-31","includeEndDate":false}'
POST/api/v1/tools/age-calculator

Age Calculator

Exact age on a date from a birth date: years, months and days, total days, weeks and months lived, and the date of the next birthday with the days until it. Defaults to today when asOf is left out.

Try the browser version of this tool

· Request body
· request.json
{
  "birthDate": "1990-05-15",
  "asOf": "2026-09-07"
}
· Response
· response.json
{
  "birthDate": "1990-05-15",
  "asOf": "2026-09-07",
  "years": 36,
  "months": 3,
  "days": 23,
  "totalDays": 13264,
  "totalWeeks": 1894,
  "totalMonths": 435,
  "nextBirthday": {
    "date": "2027-05-15",
    "daysUntil": 250,
    "turning": 37
  }
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/age-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"birthDate":"1990-05-15","asOf":"2026-09-07"}'
POST/api/v1/tools/week-number

Week Number

The ISO 8601 week number and ISO year for a date, with the Monday and Sunday of that week, plus the US (Sunday-based) and UK/EU week numbers. Defaults to today when no date is given.

Try the browser version of this tool

· Request body
· request.json
{
  "date": "2026-09-07"
}
· Response
· response.json
{
  "date": "2026-09-07",
  "weekday": "Monday",
  "isoWeek": 37,
  "isoYear": 2026,
  "weekStart": "2026-09-07",
  "weekEnd": "2026-09-13",
  "usWeek": 37,
  "ukWeek": 37
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/week-number \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"date":"2026-09-07"}'
POST/api/v1/tools/unit-converter

Unit Converter

Convert a value between units of length (m, km, cm, mm, mi, yd, ft, in, nmi, um), weight (kg, g, mg, lb, oz, st, t, us_ton, imperial_ton, ug), temperature (c, f, k), speed (kmh, ms, mph, kn) or data (b, kb, mb, gb, tb, in 1024 steps). Units are matched by key, full name or common alias.

Try the browser version of this tool

· Request body
· request.json
{
  "value": 10,
  "from": "km",
  "to": "mi",
  "category": "length"
}
· Response
· response.json
{
  "value": 10,
  "from": {
    "key": "km",
    "name": "Kilometers (km)"
  },
  "to": {
    "key": "mi",
    "name": "Miles"
  },
  "category": "length",
  "result": 6.213711922373339,
  "formatted": "6.213712"
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/unit-converter \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"value":10,"from":"km","to":"mi","category":"length"}'
POST/api/v1/tools/discount-calculator

Discount Calculator

Final price and saving after a discount given as a percentage or a fixed amount, with optional extra stacked discounts applied one after another and optional VAT added on the discounted price. Money is rounded to cents.

Try the browser version of this tool

· Request body
· request.json
{
  "price": 80,
  "discountPercent": 25,
  "additionalDiscountPercents": [
    10
  ],
  "vatPercent": 21
}
· Response
· response.json
{
  "originalPrice": 80,
  "discountPercent": 32.5,
  "saving": 26,
  "finalPrice": 54,
  "vatPercent": 21,
  "vatAmount": 11.34,
  "finalPriceWithVat": 65.34,
  "steps": [
    {
      "step": 1,
      "percent": 25,
      "priceAfter": 60
    },
    {
      "step": 2,
      "percent": 10,
      "priceAfter": 54
    }
  ]
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/discount-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"price":80,"discountPercent":25,"additionalDiscountPercents":[10],"vatPercent":21}'
POST/api/v1/tools/tip-calculator

Tip Calculator

Tip on a restaurant bill at a percentage, the total, and the even split per person. Can round the total up to the next whole unit, in which case the tip absorbs the difference.

Try the browser version of this tool

· Request body
· request.json
{
  "bill": 86.4,
  "tipPercent": 15,
  "people": 4,
  "roundUp": false
}
· Response
· response.json
{
  "bill": 86.4,
  "tipPercent": 15,
  "people": 4,
  "roundUp": false,
  "tip": 12.96,
  "total": 99.36,
  "perPerson": {
    "total": 24.84,
    "tip": 3.24
  },
  "effectiveTipPercent": 15
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/tip-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"bill":86.4,"tipPercent":15,"people":4,"roundUp":false}'
POST/api/v1/tools/timezone-converter

Timezone Converter

Take a local date and time in one IANA time zone (such as Europe/Amsterdam) and express it in another, using the built-in Intl zone rules including daylight saving. Returns both wall-clock times with their UTC offsets, the UTC instant and the hour difference.

Try the browser version of this tool

· Request body
· request.json
{
  "dateTime": "2026-03-15T14:30",
  "from": "Europe/Amsterdam",
  "to": "America/New_York"
}
· Response
· response.json
{
  "input": "2026-03-15T14:30",
  "from": {
    "zone": "Europe/Amsterdam",
    "dateTime": "2026-03-15T14:30:00",
    "offset": "+01:00",
    "offsetMinutes": 60,
    "weekday": "Sunday"
  },
  "to": {
    "zone": "America/New_York",
    "dateTime": "2026-03-15T09:30:00",
    "offset": "-04:00",
    "offsetMinutes": -240,
    "weekday": "Sunday"
  },
  "utc": "2026-03-15T13:30:00Z",
  "differenceHours": -5
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/timezone-converter \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"dateTime":"2026-03-15T14:30","from":"Europe/Amsterdam","to":"America/New_York"}'
POST/api/v1/tools/roi-calculator

ROI Calculator

Return on investment from the amount invested and the total amount that came back: the gain, the ROI in percent and, when a holding period in years is given, the annualised return. An estimate, not financial advice.

Try the browser version of this tool

· Request body
· request.json
{
  "invested": 10000,
  "returned": 14000,
  "years": 3
}
· Response
· response.json
{
  "invested": 10000,
  "returned": 14000,
  "gain": 4000,
  "roiPercent": 40,
  "years": 3,
  "annualisedPercent": 11.87,
  "note": "Estimates for information only, not financial advice."
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/roi-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"invested":10000,"returned":14000,"years":3}'
POST/api/v1/tools/break-even-calculator

Break-even Calculator

Break-even point from fixed costs per period, the price per unit and the variable cost per unit: the units and revenue needed to cover costs, the contribution margin, profit at an optional sales volume, and scenarios at half to twice the break-even volume.

Try the browser version of this tool

· Request body
· request.json
{
  "fixedCosts": 5000,
  "variableCostPerUnit": 10,
  "pricePerUnit": 25,
  "volume": 500
}
· Response
· response.json
{
  "fixedCosts": 5000,
  "pricePerUnit": 25,
  "variableCostPerUnit": 10,
  "contributionMargin": 15,
  "contributionMarginPercent": 60,
  "breakEvenUnits": 333.33,
  "breakEvenUnitsRoundedUp": 334,
  "breakEvenRevenue": 8333.33,
  "volume": 500,
  "profitAtVolume": 2500,
  "scenarios": [
    {
      "multiplier": 0.5,
      "units": 167,
      "revenue": 4175,
      "profit": -2495
    }
  ]
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/break-even-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"fixedCosts":5000,"variableCostPerUnit":10,"pricePerUnit":25,"volume":500}'
POST/api/v1/tools/aow-age-calculator

AOW Age Calculator

Look up the Dutch state pension (AOW) age for a birth date from the official SVB table: the age in years and months, the date it starts, how long until then, and whether that age is legally fixed or still an expectation.

Try the browser version of this tool

· Request body
· request.json
{
  "birthDate": "1975-05-12",
  "today": "2026-08-28"
}
· Response
· response.json
{
  "status": "expected",
  "years": 68,
  "months": 0,
  "aowDate": "2043-05-12",
  "timeLeft": {
    "years": 16,
    "months": 8,
    "days": 15
  },
  "note": "This is an expectation, not a guarantee."
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/aow-age-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"birthDate":"1975-05-12","today":"2026-08-28"}'
POST/api/v1/tools/erfbelasting-calculator

Dutch Inheritance Tax Calculator

Estimate Dutch inheritance tax (erfbelasting) for one heir with the 2026 exemptions and two-bracket rates: give the inherited amount and the relationship to the deceased, get the exemption, taxable amount, tax per bracket, total tax and what the heir keeps.

Try the browser version of this tool

· Request body
· request.json
{
  "amount": 100000,
  "heir": "child"
}
· Response
· response.json
{
  "ok": true,
  "exemption": 26230,
  "exemptionApplied": 26230,
  "taxableAmount": 73770,
  "lowBracketTax": 7377,
  "highBracketTax": 0,
  "totalTax": 7377,
  "netReceived": 92623,
  "effectiveRate": 0.07377,
  "notes": [
    "Partners usually count as one person for inheritance tax."
  ]
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/erfbelasting-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"amount":100000,"heir":"child"}'
POST/api/v1/tools/schenkbelasting-calculator

Dutch Gift Tax Calculator

Estimate Dutch gift tax (schenkbelasting) with the 2026 exemptions and two-bracket rates: give the gift amount, the relationship to the donor and which exemption applies, get the exemption used, taxable amount, tax per bracket, total tax and what the recipient keeps.

Try the browser version of this tool

· Request body
· request.json
{
  "amount": 25000,
  "relationship": "child",
  "exemption": "annual"
}
· Response
· response.json
{
  "ok": true,
  "exemptionApplied": 6908,
  "taxableAmount": 18092,
  "lowBracketTax": 1809.2,
  "highBracketTax": 0,
  "totalTax": 1809.2,
  "netReceived": 23190.8,
  "effectiveRate": 0.072368,
  "notes": [
    "Partners count as one donor."
  ]
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/schenkbelasting-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"amount":25000,"relationship":"child","exemption":"annual"}'
POST/api/v1/tools/ww-duration-calculator

Dutch WW Duration Calculator

Estimate how many months of Dutch unemployment benefit (WW) an employment history gives: one month per year for the first ten years, half a month per year after that, between three and twenty-four months, with the notional years for people born in 1979 or earlier counted automatically.

Try the browser version of this tool

· Request body
· request.json
{
  "birthYear": 1975,
  "workedYearsSince1998": 20
}
· Response
· response.json
{
  "ok": true,
  "notionalYears": 5,
  "actualYears": 20,
  "totalYears": 25,
  "months": 17.5,
  "uncappedMonths": 17.5,
  "cappedAtMaximum": false,
  "raisedToMinimum": false,
  "note": "This is an estimate."
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/ww-duration-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"birthYear":1975,"workedYearsSince1998":20}'
POST/api/v1/tools/30-percent-ruling-calculator

30% Ruling Calculator

Work out the tax-free allowance under the Dutch 30% ruling for a gross annual salary with the 2026 salary norm and WNT cap, plus a simplified estimate of net pay with and without the ruling and the yearly advantage.

Try the browser version of this tool

· Request body
· request.json
{
  "grossAnnualSalary": 70000,
  "youngMaster": false
}
· Response
· response.json
{
  "ok": true,
  "grossAnnualSalary": 70000,
  "salaryNorm": 48013,
  "eligible": true,
  "allowancePerYear": 21000,
  "allowancePerMonth": 1750,
  "taxableSalaryWithRuling": 49000,
  "netPerYearWithoutRuling": 49000,
  "netPerYearWithRuling": 58000,
  "netAdvantagePerYear": 9000,
  "cappedByWnt": false,
  "limitedByNorm": false,
  "notes": [
    "Based on 2026 figures."
  ]
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/30-percent-ruling-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"grossAnnualSalary":70000,"youngMaster":false}'
POST/api/v1/tools/dutch-holiday-allowance-calculator

Dutch Holiday Allowance Calculator

Calculate Dutch holiday allowance (vakantiegeld) from a gross monthly salary and the months worked: the gross amount at the given percentage (statutory minimum 8%) and an estimate of the net payout after the special payroll tax rate (bijzonder tarief).

Try the browser version of this tool

· Request body
· request.json
{
  "monthlySalary": 3500,
  "monthsWorked": 12,
  "allowancePercent": 8,
  "specialRatePercent": 42.01
}
· Response
· response.json
{
  "ok": true,
  "grossAllowance": 3360,
  "taxWithheld": 1411.54,
  "netAllowance": 1948.46,
  "allowancePercent": 8,
  "specialRatePercent": 42.01,
  "note": "Based on 2026 figures."
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/dutch-holiday-allowance-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"monthlySalary":3500,"monthsWorked":12,"allowancePercent":8,"specialRatePercent":42.01}'
POST/api/v1/tools/dutch-notice-period-calculator

Dutch Notice Period Calculator

Find the statutory Dutch notice period (Article 7:672 Civil Code) for an employee or employer from the employment start date and the date notice is given, and the date the contract ends, since notice runs from the first of the next month. A contractual period can override the statutory one.

Try the browser version of this tool

· Request body
· request.json
{
  "givenBy": "employee",
  "startDate": "2019-03-01",
  "noticeDate": "2026-09-12",
  "contractMonths": 1
}
· Response
· response.json
{
  "ok": true,
  "serviceYears": 7.53,
  "statutoryMonths": 1,
  "appliedMonths": 1,
  "fromContract": true,
  "noticePeriodStarts": "2026-10-01",
  "employmentEnds": "2026-10-31",
  "note": "Based on Article 7:672 of the Dutch Civil Code."
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/dutch-notice-period-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"givenBy":"employee","startDate":"2019-03-01","noticeDate":"2026-09-12","contractMonths":1}'
POST/api/v1/tools/dutch-severance-calculator

Dutch Severance Calculator

Calculate the Dutch statutory transition payment (transitievergoeding) with the 2026 rules: one third of the monthly salary base per year of service, pro rata by day, capped at EUR 102,000 or one annual salary if higher. The base can include 8% holiday allowance and fixed yearly bonuses.

Try the browser version of this tool

· Request body
· request.json
{
  "monthlySalary": 3500,
  "fixedAnnualBonuses": 0,
  "includeHolidayAllowance": true,
  "startDate": "2018-01-01",
  "endDate": "2026-12-31"
}
· Response
· response.json
{
  "ok": true,
  "serviceDays": 3287,
  "serviceYears": 9,
  "monthlyBase": 3780,
  "formulaAmount": 11339.14,
  "statutoryMaximum": 102000,
  "payment": 11339.14,
  "capped": false,
  "note": "Based on 2026 figures."
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/dutch-severance-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"monthlySalary":3500,"fixedAnnualBonuses":0,"includeHolidayAllowance":true,"startDate":"2018-01-01","endDate":"2026-12-31"}'
POST/api/v1/tools/test-documentnummer-generator

Test Document Number Generator

Generate random Dutch test document numbers in the structural format of an ID card (4 letters + 5 digits), passport (2 letters + 7 digits) or driving licence (10 digits). Format only, no check digit, tied to no real document, for test environments.

Try the browser version of this tool

· Request body
· request.json
{
  "type": "idkaart",
  "count": 5
}
· Response
· response.json
{
  "type": "idkaart",
  "label": "ID Card (Identiteitskaart)",
  "format": "4 letters + 5 digits (e.g. SPFC12345)",
  "count": 5,
  "numbers": [
    "SPFC12345"
  ],
  "note": "Test numbers only. They follow the structural format of Dutch documents but are random, belong to no real document and carry no check digit."
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/test-documentnummer-generator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"type":"idkaart","count":5}'
POST/api/v1/tools/dutch-school-holidays

Dutch School Holidays

List the official Dutch school holidays (schoolvakanties) for a school year and region (noord, midden or zuid) with start and end dates, whether each is advisory, days until each one, and which break comes next. Covers 2026-2027 and 2027-2028 from Rijksoverheid.nl.

Try the browser version of this tool

· Request body
· request.json
{
  "schoolYear": "2026-2027",
  "region": "midden",
  "today": "2026-09-07"
}
· Response
· response.json
{
  "schoolYear": "2026-2027",
  "region": "midden",
  "holidays": [
    {
      "name": "Autumn break",
      "dutch": "Herfstvakantie",
      "start": "2026-10-17",
      "end": "2026-10-25",
      "advisory": true,
      "daysUntilStart": 40,
      "status": "upcoming"
    }
  ],
  "next": {
    "name": "Autumn break",
    "dutch": "Herfstvakantie",
    "start": "2026-10-17",
    "end": "2026-10-25",
    "advisory": true,
    "daysUntilStart": 40,
    "ongoing": false
  },
  "note": "Kerstvakantie and zomervakantie are set by the Ministry of Education."
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/dutch-school-holidays \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"schoolYear":"2026-2027","region":"midden","today":"2026-09-07"}'
POST/api/v1/tools/dutch-mileage-calculator

Dutch Mileage Allowance Calculator

Calculate a Dutch kilometre reimbursement per week, month and year from a distance per trip and trips per week (or a weekly total), working weeks and a rate, and show how much of it exceeds the 2026 tax-free maximum of EUR 0.25 per km.

Try the browser version of this tool

· Request body
· request.json
{
  "kmPerTrip": 25,
  "tripsPerWeek": 8,
  "kmPerWeek": 200,
  "weeksPerYear": 46,
  "ratePerKm": 0.25
}
· Response
· response.json
{
  "ok": true,
  "weeklyKm": 200,
  "yearlyKm": 9200,
  "perWeek": 50,
  "perMonth": 191.67,
  "perYear": 2300,
  "ratePerKm": 0.25,
  "taxFreeRate": 0.25,
  "aboveTaxFree": false,
  "taxablePartPerYear": 0,
  "note": "Based on 2026 figures."
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/dutch-mileage-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"kmPerTrip":25,"tripsPerWeek":8,"kmPerWeek":200,"weeksPerYear":46,"ratePerKm":0.25}'
POST/api/v1/tools/subtitle-converter

Subtitle Converter

Convert subtitles between SRT and WebVTT or to a plain transcript, shift or stretch the timing, append a second part, and repair order, overlaps, empty and flashing cues. Returns the rewritten subtitle text and a report of what changed.

Try the browser version of this tool

· Request body
· request.json
{
  "text": "1\n00:00:01,000 --> 00:00:03,500\nHello there.",
  "format": "vtt",
  "shiftSeconds": -2.5,
  "scalePercent": 104.271,
  "repair": true,
  "appendText": "1\n00:00:00,500 --> 00:00:02,000\nPart two begins.",
  "appendOffsetSeconds": 5400
}
· Response
· response.json
{
  "result": "WEBVTT\n\n00:00:01.000 --> 00:00:03.500\nHello there.\n",
  "format": "vtt",
  "inputFormat": "srt",
  "cues": 1,
  "durationMs": 3500,
  "notes": [],
  "repairs": {
    "reordered": false,
    "emptyRemoved": 0,
    "overlapsFixed": 0,
    "negativeClamped": 0,
    "tooShortExtended": 0
  }
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/subtitle-converter \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"text":"1\n00:00:01,000 --> 00:00:03,500\nHello there.","format":"vtt","shiftSeconds":-2.5,"scalePercent":104.271,"repair":true,"appendText":"1\n00:00:00,500 --> 00:00:02,000\nPart two begins.","appendOffsetSeconds":5400}'
POST/api/v1/tools/csv-merge

CSV Merge

Append several CSV files into one. By header, columns are matched by name (case-insensitive) and the headers are unioned, so files with different column orders or an extra column combine cleanly; by position, rows are appended under the first file's header. Optionally adds a Source column with each file's name. Returns the merged CSV.

Try the browser version of this tool

· Request body
· request.json
{
  "files": [
    {
      "name": "jan.csv",
      "text": "id,amount\n1,10\n"
    },
    {
      "name": "feb.csv",
      "text": "amount,id\n20,2\n"
    }
  ],
  "mode": "byHeader",
  "sourceColumn": true,
  "delimiter": ";"
}
· Response
· response.json
{
  "result": "id,amount,Source\n1,10,jan.csv\n2,20,feb.csv\n",
  "header": [
    "id",
    "amount",
    "Source"
  ],
  "rows": 2,
  "files": 2
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/csv-merge \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"files":[{"name":"jan.csv","text":"id,amount\n1,10\n"},{"name":"feb.csv","text":"amount,id\n20,2\n"}],"mode":"byHeader","sourceColumn":true,"delimiter":";"}'
POST/api/v1/tools/csv-split

CSV Split

Split one CSV into parts, either every N rows or one part per distinct value of a column. Every part keeps the header. Returns the parts as CSV text with a name each.

Try the browser version of this tool

· Request body
· request.json
{
  "text": "id,country\n1,NL\n2,BE\n3,NL\n",
  "by": "column",
  "size": 1000,
  "column": "country",
  "name": "orders"
}
· Response
· response.json
{
  "parts": [
    {
      "name": "orders-NL",
      "rows": 2,
      "csv": "id,country\n1,NL\n3,NL\n"
    },
    {
      "name": "orders-BE",
      "rows": 1,
      "csv": "id,country\n2,BE\n"
    }
  ],
  "count": 2,
  "totalRows": 3
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/csv-split \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"text":"id,country\n1,NL\n2,BE\n3,NL\n","by":"column","size":1000,"column":"country","name":"orders"}'
Render API

HTML to PDF rendering.

Next to the utility endpoints there is a render endpoint powered by headless Chrome. It returns a hosted download URL that stays valid for 24 hours. Renders draw on the same monthly balance as everything else, they just cost more of it: 25 credits against 1 for an API or MCP call, because a render boots a real browser. Without a key you get 3 renders a day to try it.

· POST /api/v1/render/html-to-pdf
curl -X POST https://toolforte.com/api/v1/render/html-to-pdf \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"html": "<html><body><h1>Invoice #42</h1></body></html>", "format": "A4"}'

The same headless browser powers something a plain HTTP client cannot do: reading pages that only exist after JavaScript runs. Fetch a single page app and you get an empty shell; this endpoint returns the content a visitor would see, as clean Markdown with navigation and cookie banners stripped.

· POST /api/v1/render/read-page
curl -X POST https://toolforte.com/api/v1/render/read-page \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"url": "https://example.com/app", "format": "markdown"}'

The image and PDF tools run server-side too, so a backend or an agent can do to a file behind a public URL what the browser tools do in the tab: resize, convert or compress an image, split a page range out of a PDF, or turn a batch of scans into one PDF. Each takes public URLs and returns a hosted download URL, metered like every other render.

· POST /api/v1/render/image-resize
# Resize an image (width or height; one side keeps the ratio)
curl -X POST https://toolforte.com/api/v1/render/image-resize \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"url": "https://example.com/photo.jpg", "width": 800}'

# Convert a format:  /api/v1/render/image-convert   {"url": "...", "format": "jpeg"}
# Compress to JPEG:  /api/v1/render/image-compress  {"url": "...", "quality": 60}
# Split a PDF range: /api/v1/render/pdf-split        {"url": "...", "from": 2, "to": 5}
# Scans into a PDF:  /api/v1/render/images-to-pdf    {"urls": ["...", "..."]}
# Strip metadata:    /api/v1/render/strip-metadata   {"url": "https://example.com/photo.jpg"}
# PDF to Word:       /api/v1/render/pdf-to-docx      {"url": "https://example.com/report.pdf"}
# Word to PDF:       /api/v1/render/docx-to-pdf      {"url": "https://example.com/offer.docx"}

All render endpoints (HTML to PDF, URL to PDF, screenshots, PDF merge, PDF split, images to PDF, image resize, convert and compress, read page) are also available through the ToolForte MCP server at /mcp, and documented in the OpenAPI spec at /openapi.json.

AI API

Six AI tools with typed answers.

A scam message checker, an Excel formula generator and explainer, SQL from a question, code translation, a prompt improver and an email writer. Each is a prompt ToolForte maintains around one model call, with the input validated and the answer returned as a fixed JSON shape, so your code reads fields instead of parsing prose. A call costs 10 credits from the same balance as every other call; without a key you get 5 a day. GET the same URL to see the fields, an example request and an example answer.

· POST /api/v1/ai/scam-message-check
curl -X POST https://toolforte.com/api/v1/ai/scam-message-check \
  -H "Authorization: Bearer tf_your_key" \
  -H "Content-Type: application/json" \
  -d '{"message": "Hoi mam, dit is mijn nieuwe nummer. Kun je vandaag 850 euro voorschieten?", "channel": "whatsapp"}'

# Excel formula:   /api/v1/ai/excel-formula     {"request": "sum column C where A is in January 2026", "locale": "nl"}
# SQL:             /api/v1/ai/sql-from-question {"question": "...", "dialect": "postgres", "schema": "..."}
# Translate code:  /api/v1/ai/code-translate    {"code": "...", "to": "TypeScript"}
# Improve prompt:  /api/v1/ai/prompt-improve    {"prompt": "write release notes"}
# Write email:     /api/v1/ai/email-write       {"purpose": "...", "tone": "formal", "keyPoints": "..."}

The same six are on the MCP server as check_scam_message, generate_excel_formula, generate_sql, translate_code, improve_prompt and write_email, and documented in the OpenAPI spec at /openapi.json.

Workflows

Several tools, one call.

A workflow is an ordered chain of the endpoints above, where each step can read an earlier step's output. Build one at /workflows and run it from here with its id. Run a saved workflow: an ordered chain of tool calls where each step can read an earlier step's output. The id is the workflow id from /workflows. Every step that runs costs its own tool's credits, charged before it runs, so a chain that stops halfway is billed for the steps that happened and no more. Workflows belong to an account, so the key must be one created while signed in.

· POST /api/v1/workflows/{id}/run
curl -X POST https://toolforte.com/api/v1/workflows/YOUR_WORKFLOW_ID/run \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"inputs":{"iban":"NL91 ABNA 0417 1643 00"}}'

The response says what happened rather than only whether it worked. A step that fails on its own terms still returns 200: the run happened, it is in your history, and stopReason, failedStep and creditsCharged tell you where it stopped and what it cost. A balance that runs out partway returns 402 with the steps that did run, and those are the only ones you pay for.

· Response
{
  "ok": true,
  "runId": "5f1d9a3e-0c2b-4d7e-9a11-2c6f0b8a4d33",
  "output": {
    "words": 3,
    "characters": 18
  },
  "steps": [
    {
      "stepId": "validate",
      "capabilityId": "iban-validator",
      "ok": true,
      "output": {
        "valid": true,
        "country": "NL"
      },
      "durationMs": 2
    }
  ],
  "creditsCharged": 2,
  "durationMs": 14,
  "stopReason": "completed"
}
Test data generators

Dutch test data, from a script.

The BRP/GBA and UPA generators are not just pages. Every setting on those pages is a field in a request body, and the same seed always returns the same data, so a test suite can assert on a fixed BSN and a pipeline can rebuild its fixtures in CI. It also fixes a specific failure: ask a language model for Dutch test data and it invents BSNs that fail the elfproef, because it is guessing digits. Calling the generator returns numbers that actually validate.

· POST /api/v1/tools/brp-test-data-generator
curl -X POST https://toolforte.com/api/v1/tools/brp-test-data-generator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"options": {"count": 25, "seed": 20270101, "minAge": 60}}'
· POST /api/v1/tools/upa-file-generator
curl -X POST https://toolforte.com/api/v1/tools/upa-file-generator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"options": {"population": {"count": 50}, "period": {"months": 3}}}'

Every option, with ranges, defaults and worked examples, is in the generator reference. That page is generated from the same definitions the API validates against, so it cannot fall behind the code.

Usage and limits

One balance, spent however you like.

Your plan includes the REST API, the MCP server and the AI tools together. There is one monthly pot of credits and you spend it on whatever you actually use: 1 per API or MCP tool call, 10 per AI generation, 25 per render, and 0 for agent memory. Mix them in any proportion. The monthly allowance resets on the first and does not roll over. Both plans can be topped up by buying credits in any amount when a month runs short, and bought credits never expire.

You never have to poll for your balance. Every response carries it:

· Response headers on every API call
X-RateLimit-Limit: 7500          # credits in your plan this month
X-RateLimit-Remaining: 7243      # credits left in the monthly allowance
X-RateLimit-Reset: 2026-09-01T00:00:00.000Z
X-Usage-Units-Cost: 1             # what this call cost
X-Usage-Units-Purchased: 100      # bought credits in reserve

When the balance runs low the warning comes to you rather than waiting to be asked: API responses and MCP tool results carry a notice well before the limit, so a long-running agent can react instead of failing at three in the morning. Exceeding the balance returns 429 with the exact numbers, never a surprise charge.

Agent memory

State that survives the session.

An AI agent starts every conversation from zero. Whatever it read, decided or half-finished is gone the moment the session ends, which is why long-running jobs get redone from the top. This endpoint gives it a private key-value store: write what matters, read it back tomorrow, in a different session or from a different tool. Private means scoped to the API key that wrote them, not local: this is the one endpoint whose whole purpose is to keep what you send it, so what an agent writes here is stored on ToolForte servers until it expires or you delete it. At 0 credits it never touches your balance. Entries are kept for 30 days on Free and 365 days on ToolForte Pro.

· POST /api/v1/memory
curl -X POST https://toolforte.com/api/v1/memory \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"key": "project/alpha/todo", "value": "{\"done\":[\"scrape\"],\"next\":\"summarise\"}"}'
· GET /api/v1/memory
# read one entry
curl "https://toolforte.com/api/v1/memory?key=project/alpha/todo" \
  -H "X-API-Key: your_api_key_here"

# list what an earlier session left behind
curl "https://toolforte.com/api/v1/memory?prefix=project/" \
  -H "X-API-Key: your_api_key_here"

Delete with DELETE /api/v1/memory?key=... Limits per API key: 100 KB per value, 1,000 entries, 10 MB in total. The same store is available over MCP as memory_set, memory_get, memory_list and memory_delete, so an agent can use it without any glue code.

Error codes

When things go wrong.

400

Bad Request

The request body is missing required fields or contains invalid data.

{ "error": "Missing required field: text", "code": 400 }
401

Unauthorized

API key is missing, invalid, or has been revoked.

{ "error": "Invalid or missing API key", "code": 401 }
429

Out of credits

Your monthly allowance is spent and there are no bought credits left. The response carries your limit, what remains and the reset date, so you know exactly where you stand.

{ "error": "Credit balance exhausted. Allowance resets on 2026-09-01", "code": 429 }
500

Internal Server Error

Something went wrong on our end. If this persists, contact support.

{ "error": "Internal server error", "code": 500 }
Base URL

One endpoint root.

https://toolforte.com/api/v1/tools/

All API traffic is served over HTTPS. HTTP requests are automatically redirected. The API supports gzip and brotli compression via the Accept-Encoding header.