Toolorah API
Run our tools programmatically over HTTPS — one consistent endpoint per tool, JSON in and JSON out. Available on Pro (1,000 calls/day) and Elite (10,000 calls/day).
Quickstart
Every tool lives at the endpoint shown below. Send your API key as a bearer token and a JSON body containing input and options. Here is the same call in three languages: POST /api/v1/<tool> { input, options }
curl -X POST https://toolorah.com/api/v1/base64 \
-H "Authorization: Bearer nt_live_xxx" \
-H "Content-Type: application/json" \
-d '{"input":"hello world","options":{"mode":"encode"}}' const res = await fetch("https://toolorah.com/api/v1/base64", {
method: "POST",
headers: {
"Authorization": "Bearer nt_live_xxx",
"Content-Type": "application/json",
},
body: JSON.stringify({ input: "hello world", options: { mode: "encode" } }),
});
const data = await res.json();
console.log(data.result); // "aGVsbG8gd29ybGQ=" import requests
res = requests.post(
"https://toolorah.com/api/v1/base64",
headers={"Authorization": "Bearer nt_live_xxx"},
json={"input": "hello world", "options": {"mode": "encode"}},
)
print(res.json()["result"]) # aGVsbG8gd29ybGQ= Authentication
Create a key on your API keys page, then send it as a bearer token on every request: Get your API key
Authorization: Bearer nt_live_xxxxxxxxxxxxxxxx Keys carry the permissions of the plan they were created under. Treat them like passwords — keep them server-side, and revoke any key that leaks from the keys page.
Requests & responses
All endpoints use POST and accept a JSON body with two fields:
input— the text (or, for PDF tools, base64 file) to process.options— a per-tool object of settings. Optional; sensible defaults apply.
A successful call returns 200 with this envelope:
{
"tool": "base64",
"result": "aGVsbG8gd29ybGQ=",
"meta": { }
} Errors return a non-2xx status with a single error field:
{ "error": "Invalid or revoked API key." } Rate limits
- Pro — 1,000 calls/day
- Elite — 10,000 calls/day
Limits reset at 00:00 UTC. Every response includes your current budget:
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 942 Once you are over the limit, calls return 429 with a Retry-After header. Malformed requests do not count against your quota.
Endpoints
Text and utility tools. Pass the listed options to control behaviour.
| Tool | Endpoint | Options |
|---|---|---|
base64 | POST /api/v1/base64 | { "mode": "encode" } mode: encode | decode |
url-encoder | POST /api/v1/url-encoder | { "mode": "encode" } mode: encode | decode |
json-formatter | POST /api/v1/json-formatter | { "mode": "format", "indent": 2 } mode: format | minify | validate |
jwt-decoder | POST /api/v1/jwt-decoder | Decodes header and payload (no signature verification). |
hash-generator | POST /api/v1/hash-generator | { "algo": "SHA-256" } algo: SHA-1 | SHA-256 | SHA-512 |
regex-tester | POST /api/v1/regex-tester | { "pattern": "\\d+", "flags": "g", "mode": "match" } mode: match | replace (+ replaceWith) |
word-counter | POST /api/v1/word-counter | Returns word, character, and sentence counts. |
case-converter | POST /api/v1/case-converter | { "type": "title" } type: upper, lower, title, sentence, camel, pascal, snake, kebab, constant |
text-cleaner | POST /api/v1/text-cleaner | { "trim": true, "collapseSpaces": true } Cleans whitespace and special characters. |
remove-duplicate-lines | POST /api/v1/remove-duplicate-lines | { "caseSensitive": false } Removes duplicate lines. |
text-sorter | POST /api/v1/text-sorter | { "order": "asc", "numeric": false } Sorts lines. |
text-reverser | POST /api/v1/text-reverser | { "mode": "characters" } mode: characters | words | lines |
markdown-formatter | POST /api/v1/markdown-formatter | Converts Markdown to HTML. |
lorem-ipsum | POST /api/v1/lorem-ipsum | { "count": 3, "unit": "paragraphs" } unit: paragraphs | sentences | words (no input needed) |
password-generator | POST /api/v1/password-generator | { "length": 16, "symbols": true } No input needed. |
random-number | POST /api/v1/random-number | { "min": 1, "max": 100, "count": 5 } No input needed. |
percentage-calculator | POST /api/v1/percentage-calculator | { "operation": "percentOf", "a": 20, "b": 150 } operation: percentOf | isWhatPercentOf | percentChange |
uuid-generator | POST /api/v1/uuid-generator | { "count": 5, "upper": false, "noHyphens": false, "braces": false } Generates v4 UUIDs (no input needed). |
timestamp-converter | POST /api/v1/timestamp-converter | Accepts a Unix timestamp in seconds or milliseconds and returns ISO, UTC, local, and epoch values. |
css-minifier | POST /api/v1/css-minifier | Minifies CSS by removing comments and whitespace. |
html-formatter | POST /api/v1/html-formatter | { "mode": "beautify", "indent": 2 } mode: beautify | minify (indent: number | "tab") |
markdown-preview | POST /api/v1/markdown-preview | Converts Markdown to HTML. |
PDF endpoints
PDF tools work on files, so requests carry base64-encoded files in the JSON body and the response result is the base64 output PDF. Keep total decoded payload under about 4 MB per request. WebP images are browser-only — send PNG or JPG to the API.
| Tool | Endpoint | Body |
|---|---|---|
pdf-merger | POST /api/v1/pdf-merger | { "files": ["<base64>", "<base64>", …] } 2–20 PDFs, merged in array order. |
pdf-splitter | POST /api/v1/pdf-splitter | { "file": "<base64>", "options": { "mode": "extract", "pages": "1-3, 5" } } mode: extract | remove. Page ranges work like the UI tool. |
png-to-pdf | POST /api/v1/png-to-pdf | { "images": ["<base64>", …], "options": { "pageSize": "a4", "orientation": "auto", "margin": "small" } } 1–50 PNG/JPG images, one page each. pageSize: a4 | letter | fit; margin: none | small | large. |
# Merge two PDFs (bash)
curl -X POST https://toolorah.com/api/v1/pdf-merger \
-H "Authorization: Bearer nt_live_xxx" \
-H "Content-Type: application/json" \
-d "{\"files\":[\"$(base64 -w0 a.pdf)\",\"$(base64 -w0 b.pdf)\"]}" \
| jq -r '.result' | base64 -d > merged.pdf Errors
401— missing or invalid API key403— your plan has no API access404— unknown tool422— bad input (for example invalid JSON or regex)429— daily limit reached