// developer_api/ REST v1

Integrate any tool.

Access 150 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 150 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 150 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

150 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· Mortgage Calculator· Simple Interest Calculator· Investment Calculator· SIP Calculator· EMI Calculator· Profit Margin Calculator· Margin and Markup Calculator· Commission Calculator· Sales Tax Calculator· GST Calculator· Inflation Calculator· Retirement Calculator· Debt Payoff Calculator· Savings Goal Calculator· Split Bill Calculator· Freelance Rate Calculator· Macro Calculator· Sleep Calculator· Water Intake Calculator· Body Fat Calculator· BMR Calculator· Ideal Weight Calculator· Calorie Calculator· Running Pace Calculator· TDEE Calculator· Due Date Calculator· Ovulation Calculator· One Rep Max Calculator· Date Calculator· Fraction Calculator· Ratio Calculator· Average Calculator· Standard Deviation Calculator· GPA Calculator· Grade Calculator· Final Grade Calculator· Test Grade Calculator· Grade Curve Calculator· Percentage to CGPA Calculator· Meeting Cost Calculator· Fuel Cost Calculator· Appliance Energy Cost Calculator· Dog Age Calculator· Aspect Ratio Calculator· Military Time Converter· Timesheet Calculator· Overtime Calculator· PTO Calculator· Salary Converter· Dutch Mortgage Calculator· Dutch Salary Calculator· Dutch Student Finance Calculator· Dutch Exam Grade Calculator· Card Number Validator· Add Line Numbers· Add Prefix and Suffix· Remove Line Breaks· TSV to CSV· CSV Column Extractor· Character Counter· Text to Binary· Upside Down Text· Leetspeak Translator· Keyword Density Analyzer· Readability Checker· Text Similarity Analyzer
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"}'
POST/api/v1/tools/mortgage-calculator

Mortgage Calculator

Work out the payment on a home loan from the price, the deposit, the rate and the term, paid monthly, bi-weekly or weekly. Returns the payment per period, the total paid, the total interest, the loan-to-value ratio and an amortisation schedule of up to 360 periods showing how each payment splits between principal and interest.

Try the browser version of this tool

· Request body
· request.json
{
  "homePrice": 350000,
  "downPayment": 70000,
  "annualRatePercent": 4.5,
  "termYears": 30,
  "paymentFrequency": "monthly"
}
· Response
· response.json
{
  "homePrice": 350000,
  "downPayment": 70000,
  "loanAmount": 280000,
  "annualRatePercent": 4.5,
  "termYears": 30,
  "frequency": "monthly",
  "periodsPerYear": 12,
  "totalPeriods": 360,
  "periodicPayment": 1418.72,
  "totalPayment": 510738.79,
  "totalInterest": 230738.79,
  "loanToValuePercent": 80,
  "schedule": [
    {
      "period": 1,
      "payment": 1418.72,
      "principal": 368.72,
      "interest": 1050,
      "balance": 279631.28
    }
  ],
  "scheduleTruncated": false
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/mortgage-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"homePrice":350000,"downPayment":70000,"annualRatePercent":4.5,"termYears":30,"paymentFrequency":"monthly"}'
POST/api/v1/tools/simple-interest-calculator

Simple Interest Calculator

Interest at a flat rate on the original principal only, I = P x r x t, over a period given in years or months. Returns the interest, the final amount, and what the same money would have made with annual compounding, so the two methods can be compared before signing anything.

Try the browser version of this tool

· Request body
· request.json
{
  "principal": 10000,
  "annualRatePercent": 5,
  "time": 3,
  "timeUnit": "years"
}
· Response
· response.json
{
  "principal": 10000,
  "annualRatePercent": 5,
  "time": 3,
  "timeUnit": "years",
  "timeYears": 3,
  "interest": 1500,
  "totalAmount": 11500,
  "compoundTotalAmount": 11576.25,
  "compoundInterest": 1576.25,
  "compoundAdvantage": 76.25
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/simple-interest-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"principal":10000,"annualRatePercent":5,"time":3,"timeUnit":"years"}'
POST/api/v1/tools/investment-calculator

Investment Calculator

Project a lump sum plus a monthly contribution at a yearly return, compounded monthly with the contribution going in at the start of each month. Returns the final value, everything paid in, the growth, and a year-by-year table of balance and growth.

Try the browser version of this tool

· Request body
· request.json
{
  "initialInvestment": 10000,
  "monthlyContribution": 500,
  "annualReturnPercent": 7,
  "years": 20
}
· Response
· response.json
{
  "initialInvestment": 10000,
  "monthlyContribution": 500,
  "annualReturnPercent": 7,
  "years": 20,
  "finalValue": 302370.09,
  "totalContributed": 130000,
  "totalGrowth": 172370.09,
  "growthPercent": 57,
  "yearlyBreakdown": [
    {
      "year": 1,
      "contributed": 16000,
      "growth": 955.34,
      "balance": 16955.34
    }
  ]
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/investment-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"initialInvestment":10000,"monthlyContribution":500,"annualReturnPercent":7,"years":20}'
POST/api/v1/tools/sip-calculator

SIP Calculator

Returns on a systematic investment plan: the same amount invested every month for a number of years at an expected annual return, using the annuity due formula Indian SIP calculators publish. Returns the total value, the amount invested, the returns earned and a year-by-year table.

Try the browser version of this tool

· Request body
· request.json
{
  "monthlyInvestment": 5000,
  "expectedAnnualReturnPercent": 12,
  "years": 10
}
· Response
· response.json
{
  "monthlyInvestment": 5000,
  "expectedAnnualReturnPercent": 12,
  "years": 10,
  "totalValue": 1161695.38,
  "investedAmount": 600000,
  "estimatedReturns": 561695.38,
  "returnsPercent": 48.4,
  "yearlyBreakdown": [
    {
      "year": 1,
      "invested": 60000,
      "returns": 4046.64,
      "value": 64046.64
    }
  ]
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/sip-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"monthlyInvestment":5000,"expectedAnnualReturnPercent":12,"years":10}'
POST/api/v1/tools/emi-calculator

EMI Calculator

The equated monthly instalment on a loan from the amount, the annual rate and a tenure in years or months. Returns the instalment, the total paid, the total interest, interest as a share of the total, and an amortisation schedule grouped by year.

Try the browser version of this tool

· Request body
· request.json
{
  "loanAmount": 1000000,
  "annualRatePercent": 8.5,
  "tenure": 20,
  "tenureUnit": "years"
}
· Response
· response.json
{
  "loanAmount": 1000000,
  "annualRatePercent": 8.5,
  "tenure": 20,
  "tenureUnit": "years",
  "months": 240,
  "emi": 8678.23,
  "totalPayment": 2082775.76,
  "totalInterest": 1082775.76,
  "interestPercent": 52,
  "yearlyBreakdown": [
    {
      "year": 1,
      "principalPaid": 19902.29,
      "interestPaid": 84236.5,
      "balance": 980097.71
    }
  ]
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/emi-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"loanAmount":1000000,"annualRatePercent":8.5,"tenure":20,"tenureUnit":"years"}'
POST/api/v1/tools/profit-margin-calculator

Profit Margin Calculator

Gross margin, markup and profit on one sale. In margin mode give the cost and the selling price; in price mode give the cost and the margin you want and it returns the price to charge. Margin is profit over the price, markup is profit over the cost, and both come back either way.

Try the browser version of this tool

· Request body
· request.json
{
  "mode": "margin",
  "cost": 60,
  "revenue": 100,
  "targetMarginPercent": 40
}
· Response
· response.json
{
  "mode": "margin",
  "cost": 60,
  "revenue": 100,
  "profit": 40,
  "grossMarginPercent": 40,
  "markupPercent": 66.67
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/profit-margin-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"mode":"margin","cost":60,"revenue":100,"targetMarginPercent":40}'
POST/api/v1/tools/margin-calculator

Margin and Markup Calculator

Give any two of cost, revenue and gross margin and this solves for the rest, including the markup. Use costRevenue when you know both amounts, costMargin to price up from a cost, and revenueMargin to work out what a product may cost to hit a margin at a fixed price.

Try the browser version of this tool

· Request body
· request.json
{
  "mode": "costRevenue",
  "cost": 60,
  "revenue": 100,
  "marginPercent": 40
}
· Response
· response.json
{
  "mode": "costRevenue",
  "cost": 60,
  "revenue": 100,
  "profit": 40,
  "grossMarginPercent": 40,
  "markupPercent": 66.67
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/margin-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"mode":"costRevenue","cost":60,"revenue":100,"marginPercent":40}'
POST/api/v1/tools/commission-calculator

Commission Calculator

Commission on a sale and what is left after it. Flat mode pays one rate on the whole amount; tiered mode works like tax brackets, each rate paid only on the slice of the sale inside its band, which is why the effective rate lands between the lowest and highest tier.

Try the browser version of this tool

· Request body
· request.json
{
  "saleAmount": 50000,
  "mode": "tiered",
  "ratePercent": 5,
  "tiers": [
    {
      "upTo": 10000,
      "ratePercent": 3
    },
    {
      "upTo": 30000,
      "ratePercent": 5
    },
    {
      "ratePercent": 8
    }
  ]
}
· Response
· response.json
{
  "mode": "tiered",
  "saleAmount": 50000,
  "commission": 2900,
  "net": 47100,
  "effectiveRatePercent": 5.8,
  "breakdown": [
    {
      "label": "Up to 10,000",
      "amount": 10000,
      "ratePercent": 3,
      "commission": 300
    }
  ]
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/commission-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"saleAmount":50000,"mode":"tiered","ratePercent":5,"tiers":[{"upTo":10000,"ratePercent":3},{"upTo":30000,"ratePercent":5},{"ratePercent":8}]}'
POST/api/v1/tools/sales-tax-calculator

Sales Tax Calculator

Add sales tax to a net price, or pull it back out of a price that already includes it. Works for US sales tax and for VAT alike. Returns the net, the tax and the gross, rounded so that net plus tax is exactly the gross.

Try the browser version of this tool

· Request body
· request.json
{
  "amount": 100,
  "ratePercent": 8.875,
  "mode": "add"
}
· Response
· response.json
{
  "mode": "add",
  "ratePercent": 8.875,
  "net": 100,
  "tax": 8.88,
  "gross": 108.88
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/sales-tax-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"amount":100,"ratePercent":8.875,"mode":"add"}'
POST/api/v1/tools/gst-calculator

GST Calculator

Add GST to a base price or remove it from an inclusive one, at any rate including the Indian slabs of 5, 12, 18 and 28 percent. Returns the net, the GST and the gross, plus the CGST and SGST halves for an intra-state supply, split so the two halves add up to the tax exactly.

Try the browser version of this tool

· Request body
· request.json
{
  "amount": 10000,
  "ratePercent": 18,
  "mode": "add"
}
· Response
· response.json
{
  "mode": "add",
  "ratePercent": 18,
  "net": 10000,
  "gst": 1800,
  "gross": 11800,
  "cgst": 900,
  "sgst": 900
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/gst-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"amount":10000,"ratePercent":18,"mode":"add"}'
POST/api/v1/tools/inflation-calculator

Inflation Calculator

What an amount is worth after inflation, or what it was worth before. Fixed mode applies a rate you choose over a number of years. CPI mode uses the published US CPI-U annual averages from 1913 to 2025, so two years can be compared with the figures the BLS actually reported.

Try the browser version of this tool

· Request body
· request.json
{
  "mode": "cpi",
  "amount": 100,
  "annualRatePercent": 3,
  "years": 10,
  "fromYear": 1990,
  "toYear": 2025
}
· Response
· response.json
{
  "mode": "cpi",
  "amount": 100,
  "years": 35,
  "annualRatePercent": 2.61,
  "futureCost": 246.37,
  "purchasingPower": 40.59,
  "cumulativeInflationPercent": 146.37,
  "fromYear": 1990,
  "toYear": 2025,
  "fromIndex": 130.7,
  "toIndex": 322
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/inflation-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"mode":"cpi","amount":100,"annualRatePercent":3,"years":10,"fromYear":1990,"toYear":2025}'
POST/api/v1/tools/retirement-calculator

Retirement Calculator

Project a pension pot from what is saved now, what goes in every month, the return and the years left until retirement. Returns the pot at the retirement age, the same pot restated in today's money at an inflation rate, what the 4% rule would pay per month, and a year-by-year table.

Try the browser version of this tool

· Request body
· request.json
{
  "currentAge": 30,
  "retirementAge": 67,
  "currentSavings": 25000,
  "monthlyContribution": 500,
  "annualReturnPercent": 7,
  "annualInflationPercent": 2.5
}
· Response
· response.json
{
  "currentAge": 30,
  "retirementAge": 67,
  "yearsToRetire": 37,
  "currentSavings": 25000,
  "monthlyContribution": 500,
  "annualReturnPercent": 7,
  "annualInflationPercent": 2.5,
  "nestEgg": 1385133.21,
  "nestEggInTodaysMoney": 555531.29,
  "totalContributed": 247000,
  "totalGrowth": 1138133.21,
  "monthlyIncome": 4617.11,
  "monthlyIncomeInTodaysMoney": 1851.77,
  "yearlyBreakdown": [
    {
      "age": 31,
      "contributed": 31000,
      "balance": 33039.69,
      "todaysValue": 32233.84
    }
  ]
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/retirement-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"currentAge":30,"retirementAge":67,"currentSavings":25000,"monthlyContribution":500,"annualReturnPercent":7,"annualInflationPercent":2.5}'
POST/api/v1/tools/debt-payoff-calculator

Debt Payoff Calculator

Take a list of debts with balance, APR and minimum payment, add whatever extra you can pay each month, and simulate both payoff strategies: snowball, which clears the smallest balance first, and avalanche, which clears the dearest first. Returns months to debt free, total interest and the payoff order for each, plus what avalanche saves.

Try the browser version of this tool

· Request body
· request.json
{
  "debts": [
    {
      "name": "Credit card",
      "balance": 3500,
      "aprPercent": 21,
      "minPayment": 90
    },
    {
      "name": "Car loan",
      "balance": 9000,
      "aprPercent": 7.5,
      "minPayment": 260
    }
  ],
  "extraMonthlyPayment": 200
}
· Response
· response.json
{
  "totalBalance": 12500,
  "totalMinimumPayment": 350,
  "extraMonthlyPayment": 200,
  "snowball": {
    "strategy": "snowball",
    "months": 28,
    "totalInterest": 1407.79,
    "payoffOrder": [
      {
        "name": "Credit card",
        "month": 14
      }
    ],
    "paidOff": true
  },
  "avalanche": {
    "strategy": "avalanche",
    "months": 28,
    "totalInterest": 1407.79,
    "payoffOrder": [
      {
        "name": "Credit card",
        "month": 14
      }
    ],
    "paidOff": true
  },
  "interestSavedByAvalanche": 0,
  "monthsSavedByAvalanche": 0,
  "underwater": []
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/debt-payoff-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"debts":[{"name":"Credit card","balance":3500,"aprPercent":21,"minPayment":90},{"name":"Car loan","balance":9000,"aprPercent":7.5,"minPayment":260}],"extraMonthlyPayment":200}'
POST/api/v1/tools/savings-goal-calculator

Savings Goal Calculator

A savings goal from either end. monthsToGoal walks the months at a given deposit until the balance clears the goal and reports the quarter marks along the way; requiredDeposit solves the other way round for the monthly amount a deadline needs. Both include interest compounded monthly.

Try the browser version of this tool

· Request body
· request.json
{
  "mode": "monthsToGoal",
  "goal": 10000,
  "currentSavings": 1500,
  "monthlyDeposit": 300,
  "months": 24,
  "annualRatePercent": 2.5
}
· Response
· response.json
{
  "mode": "monthsToGoal",
  "goal": 10000,
  "currentSavings": 1500,
  "annualRatePercent": 2.5,
  "alreadyThere": false,
  "months": 28,
  "monthlyDeposit": 300,
  "totalDeposited": 8400,
  "interestEarned": 330.58,
  "finalBalance": 10230.58,
  "schedule": [
    {
      "month": 1,
      "balance": 1803.13,
      "note": ""
    }
  ]
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/savings-goal-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"mode":"monthsToGoal","goal":10000,"currentSavings":1500,"monthlyDeposit":300,"months":24,"annualRatePercent":2.5}'
POST/api/v1/tools/split-bill-calculator

Split Bill Calculator

Settle up a group who have been paying for each other. Each expense is paid by one person and shared evenly by everyone or by the people named on it, with an optional tip added first. Returns what each person paid, owes and is owed, plus the shortest set of transfers that clears the group, optionally rounded to whole notes.

Try the browser version of this tool

· Request body
· request.json
{
  "people": [
    "Alex",
    "Sam",
    "Kim"
  ],
  "expenses": [
    {
      "payer": "Alex",
      "description": "Dinner",
      "amount": 84
    },
    {
      "payer": "Sam",
      "description": "Taxi",
      "amount": 21
    }
  ],
  "tipPercent": 10,
  "roundTransfersTo": 5
}
· Response
· response.json
{
  "people": [
    "Alex",
    "Sam",
    "Kim"
  ],
  "total": 105,
  "tipPercent": 0,
  "balances": [
    {
      "person": "Alex",
      "paid": 84,
      "owed": 35,
      "balance": 49
    }
  ],
  "transfers": [
    {
      "from": "Kim",
      "to": "Alex",
      "amount": 35
    }
  ]
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/split-bill-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"people":["Alex","Sam","Kim"],"expenses":[{"payer":"Alex","description":"Dinner","amount":84},{"payer":"Sam","description":"Taxi","amount":21}],"tipPercent":10,"roundTransfersTo":5}'
POST/api/v1/tools/freelance-rate-calculator

Freelance Rate Calculator

The hourly and day rate a Dutch freelancer has to charge to take home a target net income. Works backwards from the net through the 2026 box 1 brackets, the zelfstandigenaftrek, the mkb-winstvrijstelling, the tax credits and the Zvw contribution, adds business costs and a buffer, and divides by the hours left after holidays and non-billable time. Dutch ZZP rules only.

Try the browser version of this tool

· Request body
· request.json
{
  "targetNetIncome": 45000,
  "businessCosts": 5000,
  "nonBillablePercent": 30,
  "vacationWeeks": 5,
  "hoursPerWeek": 40,
  "bufferPercent": 10,
  "monthlyDisabilityInsurance": 150,
  "monthlyPensionDeposit": 250,
  "hoursPerDay": 8
}
· Response
· response.json
{
  "targetNetIncome": 45000,
  "billableHours": 1316,
  "hourlyRate": 52.75,
  "dayRate": 422,
  "hoursPerDay": 8,
  "revenue": 63108.06,
  "revenueWithBuffer": 69418.86,
  "buffer": 6310.81,
  "costs": 5000,
  "profit": 58108.06,
  "incomeTax": 10698.54,
  "healthcareContribution": 2409.52,
  "disabilityInsurance": 0,
  "pensionDeposit": 0,
  "equivalentEmployeeSalary": 61830.07
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/freelance-rate-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"targetNetIncome":45000,"businessCosts":5000,"nonBillablePercent":30,"vacationWeeks":5,"hoursPerWeek":40,"bufferPercent":10,"monthlyDisabilityInsurance":150,"monthlyPensionDeposit":250,"hoursPerDay":8}'
POST/api/v1/tools/macro-calculator

Macro Calculator

Daily protein, carbohydrate and fat grams for a calorie target and a goal. Calories come from the Mifflin-St Jeor basal rate times an activity factor, shifted by 500 kcal down to lose or 300 kcal up to gain and never below 1200, and are then split three ways: balanced 30/40/30, low carb 40/20/40 and high protein 40/30/30. This is an indication, not medical advice.

Try the browser version of this tool

· Request body
· request.json
{
  "age": 30,
  "sex": "male",
  "heightCm": 178,
  "weightKg": 75,
  "activity": "moderate",
  "goal": "maintain"
}
· Response
· response.json
{
  "bmr": 1718,
  "tdee": 2662,
  "calories": 2662,
  "goal": "maintain",
  "activity": "moderate",
  "activityFactor": 1.55,
  "formula": "Mifflin-St Jeor (1990)",
  "splits": [
    {
      "id": "balanced",
      "label": "Balanced",
      "protein": 30,
      "carbs": 40,
      "fat": 30,
      "proteinG": 200,
      "carbsG": 266,
      "fatG": 89
    }
  ],
  "note": "This is an indication, not medical advice."
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/macro-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"age":30,"sex":"male","heightCm":178,"weightKg":75,"activity":"moderate","goal":"maintain"}'
POST/api/v1/tools/sleep-calculator

Sleep Calculator

Bedtimes or wake-up times that complete whole sleep cycles. From one clock time it counts six, five, four and three blocks of 90 minutes, plus the 15 minutes an average adult needs to fall asleep, so the alarm lands between cycles instead of in deep sleep. This is an indication, not medical advice.

Try the browser version of this tool

· Request body
· request.json
{
  "time": "07:00",
  "mode": "wake"
}
· Response
· response.json
{
  "mode": "wake",
  "time": "07:00",
  "cycleMinutes": 90,
  "fallAsleepMinutes": 15,
  "options": [
    {
      "cycles": 6,
      "time": "9:45 PM",
      "hours": 9,
      "quality": "Optimal (9 h sleep)",
      "tone": "optimal"
    }
  ],
  "note": "This is an indication, not medical advice."
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/sleep-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"time":"07:00","mode":"wake"}'
POST/api/v1/tools/water-intake-calculator

Water Intake Calculator

Daily water intake from weight, activity and climate. The base is 35 ml per kilogram of body weight, the midpoint of the usual 30 to 40 ml guideline, plus 350 ml for every 30 minutes of exercise and a flat 500 ml in a hot or humid climate, reported in litres and in 250 ml glasses. This is an indication, not medical advice.

Try the browser version of this tool

· Request body
· request.json
{
  "weightKg": 75,
  "exerciseMinutes": 30,
  "climate": "normal"
}
· Response
· response.json
{
  "weightKg": 75,
  "exerciseMinutes": 30,
  "climate": "normal",
  "baseL": 2.625,
  "exerciseL": 0.35,
  "climateL": 0,
  "totalL": 2.975,
  "glasses": 12,
  "note": "This is an indication, not medical advice."
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/water-intake-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"weightKg":75,"exerciseMinutes":30,"climate":"normal"}'
POST/api/v1/tools/body-fat-calculator

Body Fat Calculator

Body fat percentage from tape measurements using the US Navy method. The Hodgdon and Beckett (1984) circumference formula takes height, neck and waist for men and adds the hip for women, returns the American Council on Exercise category band, and splits a body weight into fat and lean mass when one is given. This is an indication, not medical advice.

Try the browser version of this tool

· Request body
· request.json
{
  "sex": "male",
  "heightCm": 178,
  "neckCm": 38,
  "waistCm": 85,
  "hipCm": 95,
  "weightKg": 80
}
· Response
· response.json
{
  "sex": "male",
  "bodyFatPercent": 16.44,
  "category": "Fitness",
  "fatMassKg": 13.15,
  "leanMassKg": 66.85,
  "formula": "US Navy circumference method (Hodgdon and Beckett, 1984)",
  "categories": [
    {
      "id": "fit",
      "label": "Fitness",
      "male": [
        14,
        17
      ],
      "female": [
        21,
        24
      ]
    }
  ],
  "note": "This is an indication, not medical advice."
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/body-fat-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"sex":"male","heightCm":178,"neckCm":38,"waistCm":85,"hipCm":95,"weightKg":80}'
POST/api/v1/tools/bmr-calculator

BMR Calculator

Basal metabolic rate from sex, age, height and weight, by both Mifflin-St Jeor (1990) and the revised Harris-Benedict (Roza and Shizgal, 1984), so the spread between them shows the uncertainty. Also returns total daily energy expenditure at all five activity factors, from 1.2 sedentary to 1.9 extra active. This is an indication, not medical advice.

Try the browser version of this tool

· Request body
· request.json
{
  "sex": "male",
  "age": 30,
  "heightCm": 178,
  "weightKg": 75
}
· Response
· response.json
{
  "sex": "male",
  "age": 30,
  "mifflin": 1718,
  "harris": 1777,
  "formulas": [
    "Mifflin-St Jeor (1990)",
    "Harris-Benedict revised (1984)"
  ],
  "tdee": [
    {
      "id": "moderate",
      "label": "Moderately active (3-5 days/week)",
      "factor": 1.55,
      "mifflin": 2662,
      "harris": 2754
    }
  ],
  "note": "This is an indication, not medical advice."
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/bmr-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"sex":"male","age":30,"heightCm":178,"weightKg":75}'
POST/api/v1/tools/ideal-weight-calculator

Ideal Weight Calculator

Ideal body weight from height and sex by the common formulas: Robinson (1983), Miller (1983), Devine (1974) and Hamwi (1964), with their average and the WHO healthy BMI band of 18.5 to 24.9 for the same height, all in kilograms and pounds. This is an indication, not medical advice.

Try the browser version of this tool

· Request body
· request.json
{
  "heightCm": 178,
  "sex": "male"
}
· Response
· response.json
{
  "sex": "male",
  "heightCm": 178,
  "formulas": [
    {
      "name": "Robinson (1983)",
      "kg": 71.15,
      "lb": 156.86
    }
  ],
  "averageKg": 72.49,
  "averageLb": 159.81,
  "healthyBmiRange": {
    "minKg": 58.61,
    "maxKg": 78.89,
    "minLb": 129.21,
    "maxLb": 173.92
  },
  "note": "This is an indication, not medical advice."
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/ideal-weight-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"heightCm":178,"sex":"male"}'
POST/api/v1/tools/calorie-calculator

Calorie Calculator

Daily calories to maintain, lose or gain weight from your details and activity. Mifflin-St Jeor (1990) sets the basal rate and drives the targets, revised Harris-Benedict (1984) is returned beside it for comparison, and the maintenance figure is also split into the balanced 30/40/30 macros. Consult a registered dietitian for personalized nutrition advice.

Try the browser version of this tool

· Request body
· request.json
{
  "sex": "male",
  "age": 30,
  "heightCm": 178,
  "weightKg": 75,
  "activity": "moderate"
}
· Response
· response.json
{
  "sex": "male",
  "activity": "moderate",
  "activityFactor": 1.55,
  "bmrMifflin": 1718,
  "bmrHarris": 1777,
  "tdeeMifflin": 2662,
  "tdeeHarris": 2754,
  "maintenance": 2662,
  "weightLoss": 2162,
  "weightGain": 3162,
  "macros": {
    "protein": 200,
    "carbs": 266,
    "fat": 89
  },
  "formulas": [
    "Mifflin-St Jeor (1990)",
    "Harris-Benedict revised (1984)"
  ],
  "note": "Consult a registered dietitian for personalized nutrition advice."
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/calorie-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"sex":"male","age":30,"heightCm":178,"weightKg":75,"activity":"moderate"}'
POST/api/v1/tools/running-pace-calculator

Running Pace Calculator

Pace, time or distance from the other two, with splits. Give any two of the three and it returns the missing one, the pace in both minutes per kilometre and per mile, the speed in km/h, a cumulative split for every whole unit, and the finish time at that same pace for seven race distances from 1 km to the marathon.

Try the browser version of this tool

· Request body
· request.json
{
  "solve": "pace",
  "unit": "km",
  "distance": 10,
  "time": "55:00",
  "pace": "5:30"
}
· Response
· response.json
{
  "solve": "pace",
  "unit": "km",
  "distance": 10,
  "timeSeconds": 3300,
  "time": "55:00",
  "paceSeconds": 330,
  "pace": "5:30",
  "pacePerKm": "5:30",
  "pacePerMile": "8:51",
  "speedKmh": 10.909,
  "resultLabel": "Pace per km",
  "resultValue": "5:30 /km",
  "splits": [
    {
      "at": 1,
      "time": "5:30"
    }
  ],
  "predictions": [
    {
      "label": "Marathon",
      "km": 42.195,
      "time": "3:52:04"
    }
  ]
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/running-pace-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"solve":"pace","unit":"km","distance":10,"time":"55:00","pace":"5:30"}'
POST/api/v1/tools/tdee-calculator

TDEE Calculator

Total daily energy expenditure from BMR and activity level. The basal rate is Mifflin-St Jeor (1990) and comes from the same function the BMR tool uses, multiplied by an activity factor from 1.2 to 1.9, with five ready-made calorie targets from a 500 kcal cut to a 500 kcal bulk. This is an indication, not medical advice.

Try the browser version of this tool

· Request body
· request.json
{
  "sex": "male",
  "age": 30,
  "heightCm": 178,
  "weightKg": 75,
  "activityFactor": 1.55
}
· Response
· response.json
{
  "sex": "male",
  "activityFactor": 1.55,
  "bmr": 1718,
  "tdee": 2662,
  "formula": "Mifflin-St Jeor (1990)",
  "targets": [
    {
      "label": "Maintenance",
      "kcal": 2662,
      "note": "Hold current weight"
    }
  ],
  "note": "This is an indication, not medical advice."
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/tdee-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"sex":"male","age":30,"heightCm":178,"weightKg":75,"activityFactor":1.55}'
POST/api/v1/tools/due-date-calculator

Due Date Calculator

Estimated due date and current week from the last period or conception date. Naegele's rule adds 280 days to the first day of the last menstrual period, or 266 days when counting from conception, and the result also carries gestational age, trimester and the 12, 20, 28 and 37 week milestone dates. Estimate only, consult your midwife or doctor.

Try the browser version of this tool

· Request body
· request.json
{
  "date": "2026-01-01",
  "method": "lmp",
  "today": "2026-03-01"
}
· Response
· response.json
{
  "method": "lmp",
  "from": "2026-01-01",
  "lmpDate": "2026-01-01",
  "dueDate": "2026-10-08",
  "gestationalAge": {
    "weeks": 8,
    "days": 3,
    "totalDays": 59
  },
  "trimester": "First trimester",
  "milestones": [
    {
      "label": "Full term (37 weeks)",
      "date": "2026-09-17"
    }
  ],
  "formula": "LMP + 280 days (Naegele's rule)",
  "note": "Estimate only, consult your midwife or doctor."
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/due-date-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"date":"2026-01-01","method":"lmp","today":"2026-03-01"}'
POST/api/v1/tools/ovulation-calculator

Ovulation Calculator

Fertile window and ovulation day from the last period and cycle length. The calendar method places ovulation 14 days before the next period rather than 14 days after the last one, opens the fertile window five days before it and closes it one day after, and projects the same pattern across three cycles. Estimate only, consult your midwife or doctor.

Try the browser version of this tool

· Request body
· request.json
{
  "lastPeriod": "2026-03-01",
  "cycleLength": 28,
  "today": "2026-03-10"
}
· Response
· response.json
{
  "cycleLength": 28,
  "cycles": [
    {
      "periodStart": "2026-03-01",
      "ovulation": "2026-03-15",
      "fertileStart": "2026-03-10",
      "fertileEnd": "2026-03-16",
      "nextPeriod": "2026-03-29"
    }
  ],
  "ovulation": "2026-03-15",
  "fertileWindow": {
    "start": "2026-03-10",
    "end": "2026-03-16"
  },
  "nextPeriod": "2026-03-29",
  "daysUntilOvulation": 5,
  "daysUntilNextPeriod": 19,
  "note": "Estimate only, consult your midwife or doctor."
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/ovulation-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"lastPeriod":"2026-03-01","cycleLength":28,"today":"2026-03-10"}'
POST/api/v1/tools/one-rep-max-calculator

One Rep Max Calculator

Estimated one repetition maximum from a weight and reps, with percentages. Four formulas run side by side, Epley, Brzycki, Lombardi and O'Conner, and their average drives a training table from 95% down to 50% with the usual rep range for each load. This is an indication for training purposes, not medical advice.

Try the browser version of this tool

· Request body
· request.json
{
  "weight": 100,
  "reps": 5
}
· Response
· response.json
{
  "weight": 100,
  "reps": 5,
  "epley": 116.67,
  "brzycki": 112.5,
  "lombardi": 117.46,
  "oconner": 112.5,
  "average": 114.78,
  "tested": false,
  "formulas": [
    "Epley",
    "Brzycki",
    "Lombardi",
    "O'Conner"
  ],
  "percentages": [
    {
      "percent": 85,
      "weight": 97.56,
      "reps": "5-6",
      "focus": "Strength"
    }
  ],
  "note": "This is an indication for training purposes, not medical advice. Never attempt a true max without proper warm-up and a spotter."
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/one-rep-max-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"weight":100,"reps":5}'
POST/api/v1/tools/date-calculator

Date Calculator

Add or subtract days, weeks, months or years from a date and get the date you land on, written out with its weekday. The arithmetic is calendar aware and runs in UTC, so leap years and month lengths are handled and the answer never shifts with a time zone.

Try the browser version of this tool

· Request body
· request.json
{
  "amount": 90,
  "unit": "days",
  "operation": "add",
  "startDate": "2026-03-15"
}
· Response
· response.json
{
  "startDate": "2026-03-15",
  "startWeekday": "Sunday",
  "operation": "add",
  "amount": 90,
  "unit": "days",
  "resultDate": "2026-06-13",
  "weekday": "Saturday",
  "formatted": "Saturday, June 13, 2026",
  "daysDifference": 90
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/date-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"amount":90,"unit":"days","operation":"add","startDate":"2026-03-15"}'
POST/api/v1/tools/fraction-calculator

Fraction Calculator

Add, subtract, multiply or divide two fractions, mixed numbers included, and get the answer reduced to lowest terms. The arithmetic is exact whole-number arithmetic, so nothing is rounded through a decimal on the way, and the result comes back as a fraction, a mixed number and a decimal.

Try the browser version of this tool

· Request body
· request.json
{
  "a": {
    "numerator": 1,
    "denominator": 2
  },
  "b": {
    "numerator": 1,
    "denominator": 3
  },
  "operation": "+"
}
· Response
· response.json
{
  "numerator": 5,
  "denominator": 6,
  "fraction": "5/6",
  "mixed": "5/6",
  "decimal": 0.8333333333333334,
  "expression": "1/2 + 1/3 = 5/6"
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/fraction-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"a":{"numerator":1,"denominator":2},"b":{"numerator":1,"denominator":3},"operation":"+"}'
POST/api/v1/tools/ratio-calculator

Ratio Calculator

Reduce a ratio to lowest whole-number terms, solve a proportion A:B = C:D for the one value left out, or scale a ratio by a factor for a recipe or a mix. Reducing is exact whole-number arithmetic, so a ratio written with decimals is scaled to integers first rather than rounded.

Try the browser version of this tool

· Request body
· request.json
{
  "mode": "simplify",
  "a": 1920,
  "b": 1080,
  "c": 9,
  "d": 12,
  "factor": 1.5
}
· Response
· response.json
{
  "mode": "simplify",
  "a": 16,
  "b": 9,
  "ratio": "16:9",
  "decimal": 1.7777777777777777,
  "solvedFor": null,
  "solved": null
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/ratio-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"mode":"simplify","a":1920,"b":1080,"c":9,"d":12,"factor":1.5}'
POST/api/v1/tools/average-calculator

Average Calculator

Every average of a list of numbers in one call: mean, median, mode, sum, count, minimum, maximum, range, and the geometric and harmonic means. A list where nothing repeats has no mode, and the two positive-only means come back null when any value is zero or below.

Try the browser version of this tool

· Request body
· request.json
{
  "values": [
    12,
    15,
    9,
    21,
    15,
    18
  ]
}
· Response
· response.json
{
  "count": 6,
  "sum": 90,
  "mean": 15,
  "median": 15,
  "modes": [
    15
  ],
  "min": 9,
  "max": 21,
  "range": 12,
  "geometricMean": 14.47,
  "harmonicMean": 13.92,
  "sorted": [
    9,
    12,
    15,
    15,
    18,
    21
  ]
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/average-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"values":[12,15,9,21,15,18]}'
POST/api/v1/tools/standard-deviation-calculator

Standard Deviation Calculator

Standard deviation and variance of a list of numbers, both the sample and the population figures, plus the mean, the sum and the sum of squared deviations. The `type` field says which of the two the headline standardDeviation reports: the sample one unless asked otherwise, or the population one when there is a single value.

Try the browser version of this tool

· Request body
· request.json
{
  "values": [
    4,
    8,
    15,
    16,
    23,
    42
  ],
  "type": "sample"
}
· Response
· response.json
{
  "type": "sample",
  "count": 6,
  "sum": 108,
  "mean": 18,
  "sumOfSquares": 910,
  "sampleStandardDeviation": 13.49,
  "sampleVariance": 182,
  "populationStandardDeviation": 12.32,
  "populationVariance": 151.67,
  "standardDeviation": 13.49,
  "variance": 182,
  "min": 4,
  "max": 42,
  "values": [
    4,
    8,
    15,
    16,
    23,
    42
  ]
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/standard-deviation-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"values":[4,8,15,16,23,42],"type":"sample"}'
POST/api/v1/tools/gpa-calculator

GPA Calculator

Work out a grade point average from courses that each have a grade and a credit weight, on the 4.0 letter scale, the 10-point European scale or percentages. Returns the GPA on the 4.0 scale with its letter, its honours classification and the credits counted.

Try the browser version of this tool

· Request body
· request.json
{
  "courses": [
    {
      "name": "Calculus I",
      "grade": "A",
      "credits": 4
    },
    {
      "name": "English Composition",
      "grade": "A-",
      "credits": 3
    },
    {
      "name": "Introduction to CS",
      "grade": "B+",
      "credits": 3
    }
  ],
  "scale": "4.0"
}
· Response
· response.json
{
  "scale": "4.0",
  "gpa": 3.7,
  "letter": "A-",
  "classification": "Magna Cum Laude",
  "totalCredits": 10,
  "countedCourses": 3,
  "courses": [
    {
      "name": "Calculus I",
      "grade": "A",
      "credits": 4,
      "points": 4
    }
  ]
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/gpa-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"courses":[{"name":"Calculus I","grade":"A","credits":4},{"name":"English Composition","grade":"A-","credits":3},{"name":"Introduction to CS","grade":"B+","credits":3}],"scale":"4.0"}'
POST/api/v1/tools/grade-calculator

Grade Calculator

Average the assessments of one course into the weighted grade it stands at, from each item's score and what it is worth. Divides by the weight actually entered, so a half-graded course reports the average so far rather than a score dragged down by work not handed in yet.

Try the browser version of this tool

· Request body
· request.json
{
  "items": [
    {
      "name": "Homework",
      "score": 85,
      "weight": 20
    },
    {
      "name": "Midterm",
      "score": 78,
      "weight": 30
    },
    {
      "name": "Project",
      "score": 92,
      "weight": 20
    }
  ]
}
· Response
· response.json
{
  "weightedAverage": 84,
  "totalWeight": 70,
  "remainingWeight": 30,
  "countedItems": 3,
  "items": [
    {
      "name": "Homework",
      "score": 85,
      "weight": 20,
      "points": 1700
    }
  ]
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/grade-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"items":[{"name":"Homework","score":85,"weight":20},{"name":"Midterm","score":78,"weight":30},{"name":"Project","score":92,"weight":20}]}'
POST/api/v1/tools/final-grade-calculator

Final Grade Calculator

Work out the score needed on a final exam to finish a course at a target grade, from the grade so far and what the final is worth. Says plainly whether the target is reachable, already secured, or out of reach, and prices the usual A to D targets at the same weight.

Try the browser version of this tool

· Request body
· request.json
{
  "currentGrade": 85,
  "targetGrade": 90,
  "finalWeightPercent": 30
}
· Response
· response.json
{
  "currentGrade": 85,
  "targetGrade": 90,
  "finalWeightPercent": 30,
  "requiredScore": 101.67,
  "achievable": false,
  "alreadySecured": false,
  "verdict": {
    "text": "Not possible without extra credit",
    "kind": "impossible"
  },
  "commonTargets": [
    {
      "label": "A (90%)",
      "target": 90,
      "required": 101.67,
      "verdict": {
        "text": "Not possible without extra credit",
        "kind": "impossible"
      }
    }
  ]
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/final-grade-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"currentGrade":85,"targetGrade":90,"finalWeightPercent":30}'
POST/api/v1/tools/test-grade-calculator

Test Grade Calculator

Turn a number of questions and a number of wrong answers into a percentage and a letter grade, with a chart pricing every possible number of wrong answers on that test. The letter cutoffs default to the US ten point scale and can be replaced.

Try the browser version of this tool

· Request body
· request.json
{
  "questions": 25,
  "wrong": 3,
  "scale": {
    "a": 90,
    "b": 80,
    "c": 70,
    "d": 60
  }
}
· Response
· response.json
{
  "questions": 25,
  "wrong": 3,
  "correct": 22,
  "score": 88,
  "letter": "B",
  "scale": {
    "a": 90,
    "b": 80,
    "c": 70,
    "d": 60
  },
  "chart": [
    {
      "wrong": 0,
      "score": 100,
      "letter": "A"
    }
  ]
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/test-grade-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"questions":25,"wrong":3,"scale":{"a":90,"b":80,"c":70,"d":60}}'
POST/api/v1/tools/grade-curve-calculator

Grade Curve Calculator

Curve a set of test scores by one of the three methods teachers use: add the same points to everyone, take the square root and multiply by ten, or scale the highest score in the room up to 100. Returns every adjusted score plus the class mean, median, minimum and maximum before and after.

Try the browser version of this tool

· Request body
· request.json
{
  "scores": [
    72,
    85,
    64,
    91,
    58,
    77,
    69,
    88
  ],
  "method": "sqrt",
  "flatPoints": 5,
  "capAt100": true
}
· Response
· response.json
{
  "method": "sqrt",
  "capAt100": true,
  "flatPoints": 5,
  "count": 8,
  "scores": [
    {
      "original": 72,
      "curved": 84.85
    }
  ],
  "before": {
    "mean": 75.5,
    "median": 74.5,
    "min": 58,
    "max": 91
  },
  "after": {
    "mean": 86.65,
    "median": 86.3,
    "min": 76.16,
    "max": 95.39
  }
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/grade-curve-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"scores":[72,85,64,91,58,77,69,88],"method":"sqrt","flatPoints":5,"capAt100":true}'
POST/api/v1/tools/percentage-to-cgpa-calculator

Percentage to CGPA Calculator

Convert percentage marks to CGPA on the Indian 10-point scale using the CBSE divisor of 9.5, or convert a CGPA back to a percentage. Returns the indicative American 4-point GPA alongside it, which is what an overseas application asks for.

Try the browser version of this tool

· Request body
· request.json
{
  "value": 85,
  "direction": "toCgpa",
  "divisor": 9.5
}
· Response
· response.json
{
  "direction": "toCgpa",
  "divisor": 9.5,
  "input": 85,
  "cgpa": 8.95,
  "percentage": 85,
  "gpa4": 3.15,
  "formula": "85 / 9.5 = 8.95 CGPA"
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/percentage-to-cgpa-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"value":85,"direction":"toCgpa","divisor":9.5}'
POST/api/v1/tools/meeting-cost-calculator

Meeting Cost Calculator

Price a meeting in salary from the number of attendees, one blended hourly rate and how long it runs. Returns the total, the cost per minute and the cost per person, so a recurring meeting can be weighed against what it produces.

Try the browser version of this tool

· Request body
· request.json
{
  "attendees": 5,
  "hourlyRate": 75,
  "durationMinutes": 60,
  "currency": "USD"
}
· Response
· response.json
{
  "attendees": 5,
  "hourlyRate": 75,
  "durationMinutes": 60,
  "currency": "USD",
  "symbol": "$",
  "totalCost": 375,
  "costPerMinute": 6.25,
  "costPerHour": 375,
  "costPerPerson": 75,
  "formattedTotal": "$375.00"
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/meeting-cost-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"attendees":5,"hourlyRate":75,"durationMinutes":60,"currency":"USD"}'
POST/api/v1/tools/fuel-cost-calculator

Fuel Cost Calculator

Work out the fuel a journey burns and what it costs, from a distance in kilometres or miles, a consumption figure in any of the four common units, and a pump price per litre or gallon. Handles return trips, a repeat count for a monthly commute, and splitting the bill between passengers.

Try the browser version of this tool

· Request body
· request.json
{
  "distance": 100,
  "distanceUnit": "km",
  "consumption": 6.5,
  "consumptionUnit": "l100km",
  "price": 1.95,
  "priceUnit": "liter",
  "passengers": 1,
  "roundTrip": false,
  "trips": 1
}
· Response
· response.json
{
  "totalKm": 100,
  "liters": 6.5,
  "cost": 12.68,
  "costPerPerson": 12.68,
  "passengers": 1,
  "trips": 1,
  "roundTrip": false,
  "litersPer100Km": 6.5,
  "pricePerLiter": 1.95,
  "costPerTrip": 12.68
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/fuel-cost-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"distance":100,"distanceUnit":"km","consumption":6.5,"consumptionUnit":"l100km","price":1.95,"priceUnit":"liter","passengers":1,"roundTrip":false,"trips":1}'
POST/api/v1/tools/appliance-energy-cost-calculator

Appliance Energy Cost Calculator

Price what an appliance costs to run, from its wattage, how it is used and the price of a kilowatt hour. Takes either a daily pattern (hours a day) or a weekly one (runs per week times minutes a run), and returns kilowatt hours and money per day, per month and per year.

Try the browser version of this tool

· Request body
· request.json
{
  "watts": 90,
  "pricePerKwh": 0.3,
  "mode": "daily",
  "hoursPerDay": 4,
  "usesPerWeek": 4,
  "minutesPerUse": 60
}
· Response
· response.json
{
  "watts": 90,
  "mode": "daily",
  "pricePerKwh": 0.3,
  "kwhDay": 0.36,
  "kwhMonth": 10.96,
  "kwhYear": 131.49,
  "costDay": 0.11,
  "costMonth": 3.29,
  "costYear": 39.45,
  "hoursPerDay": 4
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/appliance-energy-cost-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"watts":90,"pricePerKwh":0.3,"mode":"daily","hoursPerDay":4,"usesPerWeek":4,"minutesPerUse":60}'
POST/api/v1/tools/dog-age-calculator

Dog Age Calculator

Convert a dog's age into human years with the epigenetic research formula, 16 x ln(age) + 31, and return the size-adjusted chart estimate and the old multiply-by-seven answer next to it. Cats are handled by the standard veterinary chart.

Try the browser version of this tool

· Request body
· request.json
{
  "age": 5,
  "species": "dog",
  "size": "medium"
}
· Response
· response.json
{
  "species": "dog",
  "size": "medium",
  "age": 5,
  "humanYears": 56.75,
  "method": "Modern research formula",
  "chartYears": 36,
  "sevenTimesRule": 35
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/dog-age-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"age":5,"species":"dog","size":"medium"}'
POST/api/v1/tools/aspect-ratio-calculator

Aspect Ratio Calculator

Reduce a width and a height to their aspect ratio, or work out the side that is missing at a given ratio so an image or a canvas keeps its proportions. Also returns the decimal ratio, the megapixels and whether the result is landscape, portrait or square.

Try the browser version of this tool

· Request body
· request.json
{
  "width": 1920,
  "height": 1080,
  "ratioWidth": 16,
  "ratioHeight": 9
}
· Response
· response.json
{
  "width": 1920,
  "height": 1080,
  "ratio": "16:9",
  "ratioWidth": 16,
  "ratioHeight": 9,
  "decimal": 1.7777777777777777,
  "megapixels": 2.0736,
  "orientation": "landscape",
  "solvedFor": "ratio"
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/aspect-ratio-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"width":1920,"height":1080,"ratioWidth":16,"ratioHeight":9}'
POST/api/v1/tools/military-time-converter

Military Time Converter

Convert a time between the 24-hour military clock and the 12-hour AM/PM clock, in either direction, and get both spellings plus the spoken military phrase. Accepts 1:30 PM, 130pm, 1330 and 13:00.

Try the browser version of this tool

· Request body
· request.json
{
  "time": "1:30 PM",
  "from": "auto"
}
· Response
· response.json
{
  "input": "1:30 PM",
  "readAs": "standard",
  "hours": 13,
  "minutes": 30,
  "military": "1330",
  "military24": "13:30",
  "standard": "1:30 PM",
  "spoken": "13 30 (1330 hours)"
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/military-time-converter \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"time":"1:30 PM","from":"auto"}'
POST/api/v1/tools/timesheet-calculator

Timesheet Calculator

Turn clock-in and clock-out times into hours worked: the net hours per day after the break, the weekly total in decimal hours and in hours and minutes, the split between regular and overtime hours at a threshold you choose, and gross pay at a flat hourly rate. Overnight shifts are handled, a day nobody worked is reported rather than guessed, and the result carries the page's caveat that this is an indication, not payroll or legal advice.

Try the browser version of this tool

· Request body
· request.json
{
  "days": [
    {
      "label": "Monday",
      "start": "09:00",
      "end": "17:30",
      "breakMinutes": 30
    },
    {
      "label": "Tuesday",
      "start": "09:00",
      "end": "17:30",
      "breakMinutes": 30
    },
    {
      "label": "Wednesday",
      "start": "09:00",
      "end": "17:30",
      "breakMinutes": 30
    },
    {
      "label": "Thursday",
      "start": "09:00",
      "end": "17:30",
      "breakMinutes": 30
    },
    {
      "label": "Friday",
      "start": "09:00",
      "end": "17:00",
      "breakMinutes": 30
    }
  ],
  "overtimeThresholdHours": 40,
  "hourlyRate": 25
}
· Response
· response.json
{
  "days": [
    {
      "label": "Monday",
      "start": "09:00",
      "end": "17:30",
      "breakMinutes": 30,
      "hours": 8,
      "overnight": false
    }
  ],
  "totalHours": 39.5,
  "totalHoursHm": "39h 30m",
  "regularHours": 39.5,
  "overtimeHours": 0,
  "overtimeThresholdHours": 40,
  "daysWorked": 5,
  "hourlyRate": 25,
  "grossPay": 987.5,
  "note": "Indication only, not payroll or legal advice."
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/timesheet-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"days":[{"label":"Monday","start":"09:00","end":"17:30","breakMinutes":30},{"label":"Tuesday","start":"09:00","end":"17:30","breakMinutes":30},{"label":"Wednesday","start":"09:00","end":"17:30","breakMinutes":30},{"label":"Thursday","start":"09:00","end":"17:30","breakMinutes":30},{"label":"Friday","start":"09:00","end":"17:00","breakMinutes":30}],"overtimeThresholdHours":40,"hourlyRate":25}'
POST/api/v1/tools/overtime-calculator

Overtime Calculator

Work out a pay packet that mixes rates: regular hours at the base rate, overtime hours at a multiplier such as the 1.5x the United States FLSA sets as a minimum, and double-time hours at twice the base rate. Returns each line, the total, the total hours and the effective rate across all of them, which is the number to compare a salaried offer against. An indication, not payroll or legal advice.

Try the browser version of this tool

· Request body
· request.json
{
  "hourlyRate": 25,
  "regularHours": 40,
  "overtimeHours": 5,
  "doubleTimeHours": 0,
  "overtimeMultiplier": 1.5
}
· Response
· response.json
{
  "hourlyRate": 25,
  "overtimeMultiplier": 1.5,
  "overtimeRate": 37.5,
  "doubleTimeRate": 50,
  "regularPay": 1000,
  "overtimePay": 187.5,
  "doubleTimePay": 0,
  "totalPay": 1187.5,
  "totalHours": 45,
  "effectiveRate": 26.39,
  "note": "Indication only, not payroll or legal advice."
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/overtime-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"hourlyRate":25,"regularHours":40,"overtimeHours":5,"doubleTimeHours":0,"overtimeMultiplier":1.5}'
POST/api/v1/tools/pto-calculator

PTO Calculator

Project a paid time off balance: give an accrual rate either as hours per pay period or as days per year, plus the hours in the bank and the hours already booked, and get the accrual per year and per month, the balance after what is planned, twelve months of projected balance, and the balance on a target date. Accrual caps, carry-over deadlines and waiting periods are deliberately not modelled, which the note repeats.

Try the browser version of this tool

· Request body
· request.json
{
  "mode": "perPeriod",
  "accrualPerPeriod": 4.62,
  "payFrequency": "biweekly",
  "daysPerYear": 15,
  "hoursPerDay": 8,
  "currentBalanceHours": 40,
  "plannedHours": 0,
  "targetDate": "2026-07-01",
  "today": "2026-01-01"
}
· Response
· response.json
{
  "hoursPerYear": 120.12,
  "daysPerYear": 15.02,
  "hoursPerMonth": 10.01,
  "hoursPerDay": 8,
  "balanceAfterPlanned": 40,
  "daysAfterPlanned": 5,
  "projected": {
    "date": "2026-07-01",
    "hours": 99.5,
    "days": 12.4,
    "months": 5.9
  },
  "schedule": [
    {
      "month": "Feb 2026",
      "hours": 50,
      "days": 6.3
    }
  ],
  "note": "Indication only. Accrual caps, carry-over limits, and waiting periods in your company policy are not modeled."
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/pto-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"mode":"perPeriod","accrualPerPeriod":4.62,"payFrequency":"biweekly","daysPerYear":15,"hoursPerDay":8,"currentBalanceHours":40,"plannedHours":0,"targetDate":"2026-07-01","today":"2026-01-01"}'
POST/api/v1/tools/salary-calculator-converter

Salary Converter

Express one gross salary in every pay period at once: per hour, per day, per week, per fortnight, per month and per year. Give the amount and the period it is quoted in, and adjust the hours per week and weeks per year for part-time, term-time or shift work. A day is a fifth of the working week rather than a fixed eight hours, so a 36 hour week converts honestly. Gross only: tax, contributions and benefits are not modelled.

Try the browser version of this tool

· Request body
· request.json
{
  "amount": 85000,
  "period": "annual",
  "hoursPerWeek": 40,
  "weeksPerYear": 52
}
· Response
· response.json
{
  "period": "annual",
  "amount": 85000,
  "hoursPerWeek": 40,
  "weeksPerYear": 52,
  "hoursPerYear": 2080,
  "annual": 85000,
  "monthly": 7083.33,
  "biweekly": 3269.23,
  "weekly": 1634.62,
  "daily": 326.92,
  "hourly": 40.87
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/salary-calculator-converter \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"amount":85000,"period":"annual","hoursPerWeek":40,"weeksPerYear":52}'
POST/api/v1/tools/hypotheek-calculator

Dutch Mortgage Calculator

Work out what a Dutch mortgage costs per month: an annuiteitenhypotheek, where the payment stays the same and the split between interest and repayment shifts, or a lineaire hypotheek, where the payment falls every month. Returns the first and last monthly payment, the interest in the first month, the total interest and the total cost, plus a net payment after hypotheekrenteaftrek when you give the deduction rate. An indication, not mortgage or tax advice: NHG, income tests and lender conditions are not modelled.

Try the browser version of this tool

· Request body
· request.json
{
  "amount": 300000,
  "years": 30,
  "annualRatePercent": 4.5,
  "type": "annuiteit",
  "deductionRatePercent": 36.97
}
· Response
· response.json
{
  "amount": 300000,
  "years": 30,
  "months": 360,
  "annualRatePercent": 4.5,
  "type": "annuiteit",
  "firstMonthlyPayment": 1520.06,
  "lastMonthlyPayment": 1520.06,
  "firstMonthInterest": 1125,
  "totalInterest": 247220.13,
  "totalCost": 547220.13,
  "deductionRatePercent": 36.97,
  "netFirstMonthlyPayment": 1104.15,
  "note": "This is an indication, not mortgage or tax advice."
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/hypotheek-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"amount":300000,"years":30,"annualRatePercent":4.5,"type":"annuiteit","deductionRatePercent":36.97}'
POST/api/v1/tools/salaris-calculator

Dutch Salary Calculator

Estimate a Dutch net salary from a gross one, or the gross salary needed for a net one, with the 2026 box 1 brackets (36.97% up to EUR 75,518, 49.50% above) and the two credits that follow income: the algemene heffingskorting and the arbeidskorting. Returns gross and net per year and per month, the tax before and after credits, each credit, and the effective rate. An estimate based on 2026 Dutch tax rates: it does not account for social security premiums, pension contributions, or individual circumstances, so it is not tax advice.

Try the browser version of this tool

· Request body
· request.json
{
  "amount": 45000,
  "period": "year",
  "mode": "grossToNet"
}
· Response
· response.json
{
  "mode": "grossToNet",
  "grossAnnual": 45000,
  "grossMonthly": 3750,
  "taxBeforeCredits": 16636.5,
  "generalTaxCredit": 2023.5,
  "employmentTaxCredit": 5203.77,
  "taxAfterCredits": 9409.24,
  "netAnnual": 35590.76,
  "netMonthly": 2965.9,
  "effectiveTaxRatePercent": 20.91,
  "note": "This calculation is an estimate based on 2026 Dutch tax rates."
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/salaris-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"amount":45000,"period":"year","mode":"grossToNet"}'
POST/api/v1/tools/dutch-student-finance-calculator

Dutch Student Finance Calculator

Estimate what DUO pays a Dutch student each month: the basisbeurs for mbo or hbo/wo, living at home or away, plus the aanvullende beurs that follows the parents' income, and the student travel product. The middle income band returns a range rather than a number, because DUO phases the aanvullende beurs out between roughly EUR 41,500 and EUR 70,000 of combined 2024 parental income. An indication, not advice: the official 2026 DUO amounts are indexed during the year.

Try the browser version of this tool

· Request body
· request.json
{
  "study": "hbowo",
  "living": "away",
  "parentalIncome": "low"
}
· Response
· response.json
{
  "study": "hbowo",
  "living": "away",
  "parentalIncome": "low",
  "basicGrant": 324.52,
  "supplementaryGrantLow": 491.08,
  "supplementaryGrantHigh": 491.08,
  "totalLow": 815.6,
  "totalHigh": 815.6,
  "travelProduct": "Free public transport on weekdays or weekends, by choice.",
  "supplementaryNote": "With a combined parental income below roughly EUR 41,500 you typically get the full aanvullende beurs.",
  "note": "This is an indication, not advice. Check duo.nl for your personal calculation."
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/dutch-student-finance-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"study":"hbowo","living":"away","parentalIncome":"low"}'
POST/api/v1/tools/dutch-exam-grade-calculator

Dutch Exam Grade Calculator

Turn Dutch exam results into final grades and a havo/vwo pass check: per subject the eindcijfer is the average of the schoolexamen and centraal examen grade rounded to a whole number, and the slaag-zakregeling is then applied in full, the CE average of 5.50, the kernvakkenregel for Nederlands, Engels and wiskunde, and the compensation rules. A CE grade may be given directly or derived from the points scored, the maximum score and the N-term. An indication, not an official determination, and vmbo has its own regulation.

Try the browser version of this tool

· Request body
· request.json
{
  "subjects": [
    {
      "name": "Nederlands",
      "se": 6.5,
      "ce": 6.2
    },
    {
      "name": "Engels",
      "se": 7.1,
      "ce": 6.8
    },
    {
      "name": "Wiskunde A",
      "se": 5.8,
      "ce": 5.4
    },
    {
      "name": "Geschiedenis",
      "se": 6.9,
      "ce": 7.2
    },
    {
      "name": "Biologie",
      "se": 6.4,
      "ce": 6.1
    },
    {
      "name": "Economie",
      "se": 7,
      "ce": 6.6
    }
  ]
}
· Response
· response.json
{
  "subjects": [
    {
      "name": "Nederlands",
      "se": 6.5,
      "ce": 6.2,
      "hasCe": true,
      "final": 6,
      "core": true
    }
  ],
  "subjectCount": 6,
  "ceAverage": 6.38,
  "finalAverage": 6.5,
  "passed": true,
  "checks": [
    {
      "ok": true,
      "text": "All final grades are 6 or higher"
    }
  ],
  "note": "This is an indication, not advice. Always check examenblad.nl."
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/dutch-exam-grade-calculator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"subjects":[{"name":"Nederlands","se":6.5,"ce":6.2},{"name":"Engels","se":7.1,"ce":6.8},{"name":"Wiskunde A","se":5.8,"ce":5.4},{"name":"Geschiedenis","se":6.9,"ce":7.2},{"name":"Biologie","se":6.4,"ce":6.1},{"name":"Economie","se":7,"ce":6.6}]}'
POST/api/v1/tools/credit-card-validator

Card Number Validator

Check a payment card number the way a checkout form does: the Luhn checksum that every major network uses to catch a mistyped digit, and the scheme behind the prefix (Visa, Mastercard, Amex, Discover, JCB, Diners). It is a format check and nothing more: it says nothing about whether a card exists, is active or has funds. The number is never logged, stored or returned, and the result shows at most the last four digits.

Try the browser version of this tool

· Request body
· request.json
{
  "cardNumber": "4242 4242 4242 4242"
}
· Response
· response.json
{
  "valid": true,
  "luhnValid": true,
  "scheme": "Visa",
  "length": 16,
  "masked": "**** **** **** 4242",
  "note": "Format check only. Nothing is logged or stored."
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/credit-card-validator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"cardNumber":"4242 4242 4242 4242"}'
POST/api/v1/tools/add-line-numbers

Add Line Numbers

Put a sequential number in front of every line of a text, with a chosen first number, step and separator. Blank lines can keep their place without taking a number, and the numbers can be padded so the text after them lines up. Use it to cite log lines, contract clauses or manuscript lines.

Try the browser version of this tool

· Request body
· request.json
{
  "text": "alpha\nbeta\ngamma",
  "start": 1,
  "step": 1,
  "separator": ". ",
  "skipEmptyLines": false,
  "padNumbers": false
}
· Response
· response.json
{
  "result": "1. alpha\n2. beta\n3. gamma",
  "lines": 3,
  "numbered": 3,
  "lastNumber": 3
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/add-line-numbers \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"text":"alpha\nbeta\ngamma","start":1,"step":1,"separator":". ","skipEmptyLines":false,"padNumbers":false}'
POST/api/v1/tools/add-prefix-suffix

Add Prefix and Suffix

Put the same text in front of and behind every line of a text. Nothing is escaped or interpreted, so quotes, commas, brackets and HTML tags all pass through as typed. Use it to wrap a column of values in quotes for a SQL IN clause, turn a keyword list into hashtags, or build list markup from plain lines.

Try the browser version of this tool

· Request body
· request.json
{
  "text": "apple\nbanana\ncherry",
  "prefix": "'",
  "suffix": "',",
  "skipEmptyLines": true
}
· Response
· response.json
{
  "result": "'apple',\n'banana',\n'cherry',",
  "lines": 3,
  "changed": 3
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/add-prefix-suffix \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"text":"apple\nbanana\ncherry","prefix":"'","suffix":"',","skipEmptyLines":true}'
POST/api/v1/tools/remove-line-breaks

Remove Line Breaks

Join lines that were broken in the wrong places back into flowing text. Each line is trimmed and blank lines are dropped before the join, and the separator can be a space, nothing, or any string such as a comma. Keeping paragraph breaks treats a blank line as a boundary, so a document keeps its shape instead of becoming one wall of text.

Try the browser version of this tool

· Request body
· request.json
{
  "text": "A sentence that\nwas broken\nin three.\n\nA second paragraph.",
  "separator": " ",
  "keepParagraphs": true
}
· Response
· response.json
{
  "result": "A sentence that was broken in three.\n\nA second paragraph.",
  "linesJoined": 4,
  "paragraphs": 2,
  "breaksRemoved": 2
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/remove-line-breaks \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"text":"A sentence that\nwas broken\nin three.\n\nA second paragraph.","separator":" ","keepParagraphs":true}'
POST/api/v1/tools/tsv-to-csv

TSV to CSV

Convert tab separated text to CSV, or CSV back to TSV, quoting every field that needs it. A field holding the output delimiter, a double quote, a line break or outer whitespace is wrapped in quotes with inner quotes doubled, which is what stops a value such as Hex bolt, stainless from silently gaining a column. Semicolon output and a UTF-8 byte order mark are there for Excel in comma-decimal locales.

Try the browser version of this tool

· Request body
· request.json
{
  "text": "product\tdescription\tprice\nAB-12\tHex bolt, stainless\t0,45",
  "direction": "tsv-to-csv",
  "delimiter": ",",
  "crlf": false,
  "byteOrderMark": false,
  "trailingNewline": false
}
· Response
· response.json
{
  "result": "product,description,price\nAB-12,\"Hex bolt, stainless\",\"0,45\"",
  "rows": 2,
  "columns": 3,
  "quotedFields": 2,
  "raggedLines": [],
  "delimiter": ","
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/tsv-to-csv \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"text":"product\tdescription\tprice\nAB-12\tHex bolt, stainless\t0,45","direction":"tsv-to-csv","delimiter":",","crlf":false,"byteOrderMark":false,"trailingNewline":false}'
POST/api/v1/tools/csv-column-extractor

CSV Column Extractor

Keep, drop or reorder the columns of a CSV. Columns are named by header text or by 1-based position, and the order they are asked for is the order they come back in, so the same call also reorders. The delimiter is detected when not given, quoted fields holding commas and line breaks survive, and the result is either CSV or one value per line.

Try the browser version of this tool

· Request body
· request.json
{
  "csv": "name,email,city\nAlice,alice@example.com,Amsterdam\nBob,bob@example.com,Utrecht",
  "columns": [
    "city",
    "name"
  ],
  "exclude": false,
  "delimiter": "auto",
  "firstRowHeader": true,
  "format": "csv"
}
· Response
· response.json
{
  "result": "city,name\nAmsterdam,Alice\nUtrecht,Bob",
  "headers": [
    "city",
    "name"
  ],
  "columns": 2,
  "rows": 2,
  "delimiter": ","
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/csv-column-extractor \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"csv":"name,email,city\nAlice,alice@example.com,Amsterdam\nBob,bob@example.com,Utrecht","columns":["city","name"],"exclude":false,"delimiter":"auto","firstRowHeader":true,"format":"csv"}'
POST/api/v1/tools/character-counter

Character Counter

Count the characters, characters without spaces, words, sentences, lines and paragraphs of a text, and rank how often each character appears. The shared counts are defined exactly as the word counter defines them, so the two never disagree about the same paragraph. Use it against a field limit: 280 for a post, 160 for an SMS, 155 for a meta description.

Try the browser version of this tool

· Request body
· request.json
{
  "text": "Hello world. This is a test!",
  "limit": 5
}
· Response
· response.json
{
  "characters": 28,
  "charactersNoSpaces": 23,
  "words": 6,
  "sentences": 2,
  "lines": 1,
  "paragraphs": 1,
  "readingTime": {
    "minutes": 0,
    "seconds": 2,
    "text": "2 sec"
  },
  "frequencies": [
    {
      "character": "l",
      "count": 3,
      "percent": 13.04
    }
  ]
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/character-counter \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"text":"Hello world. This is a test!","limit":5}'
POST/api/v1/tools/text-to-binary

Text to Binary

Turn text into its UTF-8 bytes written as binary, hexadecimal, octal and decimal, or read those numbers back into text. The unit is the byte, not the character, so an accented letter is two groups and an emoji four. Both directions return all four bases at once, and decoding rejects a value that is not a byte or a byte sequence that is not valid UTF-8.

Try the browser version of this tool

· Request body
· request.json
{
  "input": "Hi",
  "action": "encode",
  "format": "binary",
  "separator": "space"
}
· Response
· response.json
{
  "text": "Hi",
  "binary": "01001000 01101001",
  "hex": "48 69",
  "octal": "110 151",
  "decimal": "72 105",
  "characters": 2,
  "bytes": 2,
  "bits": 16
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/text-to-binary \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"input":"Hi","action":"encode","format":"binary","separator":"space"}'
POST/api/v1/tools/upside-down-text

Upside Down Text

Flip text upside down, or mirror it left to right, using Unicode characters that look like rotated or reflected Latin letters. The string is reversed after mapping, so it reads correctly when the screen is turned round or held up to a mirror. The result is ordinary text, so it can be pasted into a bio, a username or a chat message.

Try the browser version of this tool

· Request body
· request.json
{
  "text": "hello world",
  "mode": "upside"
}
· Response
· response.json
{
  "result": "plɹoʍ ollǝɥ",
  "mode": "upside",
  "mapped": 10,
  "unchanged": 1
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/upside-down-text \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"text":"hello world","mode":"upside"}'
POST/api/v1/tools/leetspeak-translator

Leetspeak Translator

Write text in leetspeak at one of three intensities, or read leetspeak back into plain text. Basic swaps the six canonical letters (a4 e3 i1 o0 s5 t7), advanced adds four more, and extreme builds most of the alphabet out of punctuation. Decoding is best effort because leet is ambiguous: the digit 1 stands for both i and l, and this resolves it to l.

Try the browser version of this tool

· Request body
· request.json
{
  "text": "paste your leet here",
  "action": "encode",
  "intensity": "basic"
}
· Response
· response.json
{
  "result": "p4573 y0ur l337 h3r3",
  "action": "encode",
  "intensity": "basic",
  "substitutions": 10
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/leetspeak-translator \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"text":"paste your leet here","action":"encode","intensity":"basic"}'
POST/api/v1/tools/keyword-density-analyzer

Keyword Density Analyzer

Count how often each word or phrase appears in a text and what share of it they take up. Phrases are one to five words long, stop words are left out of the table but still counted in the total, and one target keyword can be reported separately whatever its count. Each row is banded: under 1 percent is sparse, 1 to 3 is good, over 5 reads as stuffing.

Try the browser version of this tool

· Request body
· request.json
{
  "text": "Keyword density matters. Keyword density is the share of a page a keyword takes up. Good keyword density is between one and three percent.",
  "phraseLength": 2,
  "minCount": 2,
  "limit": 10,
  "excludeStopWords": true,
  "sortBy": "count",
  "order": "desc",
  "targetKeyword": "keyword density"
}
· Response
· response.json
{
  "totalWords": 24,
  "characters": 138,
  "uniqueKeywords": 2,
  "averageWordLength": 4.67,
  "keywords": [
    {
      "keyword": "keyword density",
      "count": 3,
      "density": 12.5,
      "band": "overstuffed"
    }
  ],
  "target": {
    "keyword": "keyword density",
    "count": 3,
    "density": 12.5,
    "band": "overstuffed"
  }
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/keyword-density-analyzer \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"text":"Keyword density matters. Keyword density is the share of a page a keyword takes up. Good keyword density is between one and three percent.","phraseLength":2,"minCount":2,"limit":10,"excludeStopWords":true,"sortBy":"count","order":"desc","targetKeyword":"keyword density"}'
POST/api/v1/tools/readability-checker

Readability Checker

Score how hard a text is to read with six named formulas: Flesch Reading Ease, Flesch-Kincaid Grade, Gunning Fog, SMOG, Coleman-Liau and the Automated Readability Index. Each is returned under its own name alongside the word, sentence and syllable counts it was built from, plus the mean grade, the school year it maps to and the audience that suits.

Try the browser version of this tool

· Request body
· request.json
{
  "text": "The quick brown fox jumps over the lazy dog. This is a sample text to demonstrate the readability checker tool."
}
· Response
· response.json
{
  "words": 20,
  "sentences": 2,
  "syllables": 31,
  "complexWords": 3,
  "letters": 90,
  "averageWordsPerSentence": 10,
  "averageSyllablesPerWord": 1.55,
  "scores": {
    "fleschReadingEase": 65.56,
    "fleschKincaidGrade": 6.6,
    "gunningFog": 10,
    "smogIndex": 9.71,
    "colemanLiauIndex": 7.7,
    "automatedReadabilityIndex": 4.77
  },
  "averageGrade": 7.75,
  "gradeLabel": "8th grade",
  "audience": "Middle school",
  "fleschLabel": "Standard"
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/readability-checker \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"text":"The quick brown fox jumps over the lazy dog. This is a sample text to demonstrate the readability checker tool."}'
POST/api/v1/tools/text-similarity-analyzer

Text Similarity Analyzer

Compare two texts with five named measures instead of one unexplained percentage: Jaccard over the word sets, cosine over the word counts, word overlap, Levenshtein edit distance with a ratio, and the longest common subsequence of words. It also returns the words the two share and the words only one of them has, plus word, character and sentence counts for each.

Try the browser version of this tool

· Request body
· request.json
{
  "textA": "The quick brown fox jumps over the lazy dog.",
  "textB": "The quick brown cat jumps over the lazy dog.",
  "commonWordLimit": 50,
  "uniqueWordLimit": 30
}
· Response
· response.json
{
  "overall": 0.84,
  "jaccard": 0.78,
  "cosine": 0.91,
  "wordOverlap": 0.78,
  "levenshteinDistance": 3,
  "levenshteinRatio": 0.93,
  "levenshteinTruncated": false,
  "longestCommonSubsequence": 8,
  "a": {
    "words": 9,
    "characters": 44,
    "sentences": 1
  },
  "b": {
    "words": 9,
    "characters": 44,
    "sentences": 1
  },
  "commonWords": [
    "the",
    "quick",
    "brown",
    "jumps",
    "over",
    "lazy",
    "dog"
  ],
  "onlyInA": [
    "fox"
  ],
  "onlyInB": [
    "cat"
  ]
}
· curl example
· terminal
curl -X POST https://toolforte.com/api/v1/tools/text-similarity-analyzer \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your_api_key_here" \
  -d '{"textA":"The quick brown fox jumps over the lazy dog.","textB":"The quick brown cat jumps over the lazy dog.","commonWordLimit":50,"uniqueWordLimit":30}'
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.