Toolorah API
API access is not currently available for new subscriptions.
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://www.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://www.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://www.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.
Batch requests
Process many inputs in a single request instead of looping one HTTP call per item. Send inputs as an array of strings; options apply to every item. Available on Pro (25 inputs per request) and Elite (250).
curl -X POST https://www.toolorah.com/api/v1/base64/batch -H "Authorization: Bearer nt_live_..." -H "Content-Type: application/json" -d '{"inputs":["hello","world"],"options":{"mode":"encode"}}' {
"tool": "base64",
"count": 2,
"succeeded": 2,
"failed": 0,
"results": [
{ "index": 0, "result": "aGVsbG8=" },
{ "index": 1, "result": "d29ybGQ=" }
]
} Each input costs one call from your daily quota — batching saves round-trips, not quota. A batch that would cross your daily limit is rejected whole and nothing is processed, so you never get a half-finished result set.
Results come back in the same order as the inputs, each tagged with its index. One bad input does not discard the rest: it returns an error field for that index while every other result succeeds. Check succeeded and failed on the envelope.
| Plan | Inputs per request |
|---|---|
| Free | — |
| Pro | 25 |
| Elite | 250 |
Utility endpoints
Two GET endpoints for discovering what you can call and how much budget you have left. Both need the same bearer key.
| Endpoint | Body |
|---|---|
GET /api/v1/tools | Lists every callable tool with its endpoint, whether it takes text or a file, and your plan’s batch limit. Use it instead of hardcoding a tool list that goes stale when we add tools. |
GET /api/v1/usage | Returns your plan, today’s usage and remaining calls, your batch limit, and when the quota resets. It does NOT count against your quota, so you can poll it safely. |
{
"plan": "pro",
"daily": { "limit": 1000, "used": 42, "remaining": 958 },
"batch": { "maxInputsPerRequest": 25 },
"resetsAt": "2026-08-24T00:00:00.000Z"
} 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 |
bmi-calculator | POST /api/v1/bmi-calculator | { "weight": 70, "height": 175 } |
emi-calculator | POST /api/v1/emi-calculator | { "principal": 300000, "rate": 6.5, "months": 360 } |
sip-calculator | POST /api/v1/sip-calculator | { "amount": 10000, "rate": 12, "years": 10, "mode": "sip", "stepUp": 0 } |
gst-calculator | POST /api/v1/gst-calculator | { "amount": 1000, "rate": 18, "mode": "add", "supply": "intra" } |
income-tax-calculator | POST /api/v1/income-tax-calculator | { "income": 1500000, "regime": "new", "age": "below60", "deductions": 0 } |
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://www.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