Description
n8n-nodes-iotools
An n8n community node for iotools.cloud — run any of its 800+ tools
(converters, generators, formatters, calculators, editors, utilities) from a workflow, on top of the public
iotools.cloud API (GET /v1/openapi).
Install
In n8n: Settings → Community Nodes → Install, package name n8n-nodes-iotools.
Credentials
Add an iotools.cloud API credential:
- API Key — mint one under Account → API Keys.
- Base URL — defaults to
https://api.iotools.cloud; only change it for a self-hosted or staging deployment. - Tool — a searchable resource picker (backed by
GET /v1/tools/search) or a manual slug, e.g.case-converter. - Fields — populated dynamically from the selected tool’s input schema (
GET /v1/tool/{slug}). Enums become - Additional Fields (JSON) — a JSON object merged on top of Fields, for anything the mapper can’t represent well,
- Simplify — on (default), returns just the tool’s
outputs; off returns the full response envelope
The IO Tools node
One node, six operations:
| Operation | What it does |
| — | — |
| Run Tool | Pick a tool (searchable list or a known slug), fill its fields, run it. |
| List Tools | Every tool with an API — one output item per tool. |
| Search Tools | Find a tool by name, slug, description or tag. |
| Get Tool Schema | A tool’s input/output JSON Schema and credit cost, without running it. |
| Get Credits | The key’s remaining credit balance for the current period. |
| Get Usage | The key’s recent credit spend, one item per (tool, day, surface) row. |
Run Tool
dropdowns; everything else maps to a string, number, or boolean field. Array and base64-blob inputs fall back to a
string field (paste JSON / base64 text) — there’s no matching n8n field type for either.
or to override a single field with an expression. Defaults to {} (no-op).
(tool, toolversion, outputs, creditsused, credits_remaining).
A failed call throws using the API’s own RFC 9457 problem document — the error message
is the specific detail (falling back to the category title), and the code shows up in the error’s description.
Example: run a tool
A minimal workflow — a Manual Trigger feeding a Run Tool call to case-converter — looks like this. Import it via
n8n’s Import from File / URL (or paste into a new workflow with Ctrl/Cmd+V):
{
"nodes": [
{
"parameters": {},
"name": "When clicking 'Execute workflow'",
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [-200, 0]
},
{
"parameters": {
"operation": "runTool",
"tool": { "mode": "id", "value": "case-converter" },
"fields": { "mappingMode": "defineBelow", "value": {} },
"additionalFieldsJson": "{n "inputString": "hello world",n "caseStyle": "param-case"n}"
},
"name": "IO Tools",
"type": "n8n-nodes-iotools.ioTools",
"typeVersion": 1,
"position": [0, 0],
"credentials": {
"ioToolsApi": { "id": "REPLACEWITHYOURCREDENTIALID", "name": "iotools.cloud API" }
}
}
],
"connections": {
"When clicking 'Execute workflow'": { "main": [[{ "node": "IO Tools", "type": "main", "index": 0 }]] }
}
}
Swap case-converter for any slug from List Tools / Search Tools. This example puts the tool’s input
(inputString, caseStyle) in Additional Fields (JSON) for a self-contained, pasteable workflow — when building
by hand, the dynamic Fields table above it populates from the tool’s schema instead.
Rate limits
API keys are limited to 60 requests/minute per endpoint (higher on paid tiers) — easy to hit with more than one IO
Tools node in a workflow, or one processing many input items. A rate-limited call is retried automatically (up to 3
times, waiting the time the API itself reports) rather than failing the run; only a rate limit that outlasts those
retries surfaces as an error.
Development
pnpm install
pnpm typecheck
pnpm test
pnpm build # -> dist/, loadable by n8n
pnpm dev # starts n8n with this node loaded, hot reload
src/ holds framework-agnostic logic (API types, JSON-Schema → resourceMapper-field mapping, request-body merging) —
unit tested directly with vitest. credentials/ and nodes/IoTools/ are the n8n-facing glue.
To test against a real n8n instance without publishing anything, use n8n’s “private node” install: npm pack the
built package, then on the target instance run npm install inside its .n8n/nodes folder (creating it
with npm init -y first if needed) and restart n8n — no Settings → Community Nodes step required. See
n8n’s community-node docs for details.