Skip to main content
Most tools on IOTools.cloud are also an API endpoint and an MCP tool — 900+ of them. One key, one credit balance, both surfaces.
The API and MCP server are in Beta. Endpoints and response shapes are stable day to day, but not yet covered by a formal deprecation policy — breaking changes are possible with less notice than after a 1.0 release.

Get started

First call in about two minutes

API reference

Every endpoint, with a live playground

Use it from an agent

Claude, Cursor, Windsurf — one config block

Credits

What a call costs

One call

Be careful calling a tool in a loop. Every call is metered — see Credits — so a loop with no exit condition, an off-by-one, or a retry with no backoff burns through your monthly allowance fast and can leave you with insufficient_credits failures partway through a batch. Check credits_remaining on the response, or GET /v1/me/credits, before running an unattended loop over many inputs.

Table and card outputs

Most output fields are plain strings. Two kinds are not: a table (a breakdown, a schedule, a list of matches) and a card grid (generated names, suggestions). Both arrive as real JSON — an array you index into, not a string you parse. A table is one object per row, keyed by column:
The keys are not guesswork — GET /v1/tool/{slug} describes the row on the field itself, as items.properties, each carrying its column’s header as a description. So a generated client hands you a typed row. The same schema backs the MCP output_schema, and both surfaces return the same shape. Alongside it, x-iotools-columns lists those keys in column order:
Use it if you are rendering headers or writing a CSV. JSON Schema’s properties is an unordered map, and JavaScript reorders integer-like keys inside any object — so a column named 2024 would silently sort ahead of its neighbours if you read the order off Object.keys(). A card grid is { title, description?, image? } per card:
Two things worth knowing:
  • Cell values are always strings. A table row is a map of string to string — numbers arrive formatted ("$16.67", "100,000"), because that is what the tool computed.
  • A few tools build their columns from your input (pivot tables, matrix operations, CSV column extraction). There is no fixed key map for those, so their rows are arrays of cells in column order. You can tell from the schema: their items.type is array rather than object, and they carry no x-iotools-columns.
This shape arrived with tool_version 1.0.1. Before that, a table or card grid was a JSON-encoded string holding positional rows — "[[\"Area\",\"25 cm²\"],…]" — so older code that calls JSON.parse() on the field will now throw, and code that indexes row[0] needs row.metric. Nothing else in the envelope changed.

Two things to know first

Using a tool in your browser is free and unlimited. Calling it from code costs credits. Every tool call over the API or MCP costs credits, including tools that cost nothing on the website — a per-plan minimum, or the tool’s own weight if that is higher. Reading the catalog costs nothing. See Credits. Not every tool has an API. 900+ tools on the site do. The rest run entirely in your browser — camera capture, some PDF and image editing — and have no server-side equivalent to call. Calling one returns tool_not_allowed; see Errors.

What you get

900+ endpoints

Formatters, converters, generators, calculators, encoders — the same code that runs on the site.

One schema everywhere

The OpenAPI document, the MCP inputSchema and the runtime validator come from one source, so they cannot disagree.

Failed calls are free

Credits are charged on entry and refunded on any 4xx or 5xx.

RFC 9457 errors

Every failure is a problem document with a stable code to branch on.