Toolorah
Developers

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"}}'

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.

PlanInputs per request
Free—
Pro25
Elite250

Utility endpoints

Two GET endpoints for discovering what you can call and how much budget you have left. Both need the same bearer key.

EndpointBody
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.

ToolEndpointOptions
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.

ToolEndpointBody
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 key
  • 403 — your plan has no API access
  • 404 — unknown tool
  • 422 — bad input (for example invalid JSON or regex)
  • 429 — daily limit reached