> ## Documentation Index
> Fetch the complete documentation index at: https://iotools.cloud/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Quick start

> Your first API call in about two minutes

## Prerequisites

* An [IOTools.cloud account](https://iotools.cloud/sign-up/) — free, and enough to use the API
* An API key

<Note>
  There is no paid plan to buy first. Any signed-in member can mint a key and call all 800+ API-enabled tools. The [Builder plan](https://iotools.cloud/pricing/) raises your monthly credits and rate limit; it does not unlock endpoints.
</Note>

<Steps>
  <Step title="Create an API key">
    Go to [Account → API keys](https://iotools.cloud/account/#api-keys) and create one.

    <Warning>
      The key is shown **once**, at creation. Store it before closing the dialog — you can always revoke it and mint another.
    </Warning>
  </Step>

  <Step title="Find the tool you want">
    Any tool page with an API tells you its endpoint: open the tool, click **Builder → REST API**, and copy the request.

    Or list them all:

    ```bash theme={"system"}
    curl https://api.iotools.cloud/v1/tools/list \
      -H "Authorization: Bearer YOUR_API_KEY"
    ```

    An endpoint is the tool's slug: `https://iotools.cloud/tool/case-converter/` is `POST /v1/tool/case-converter`.
  </Step>

  <Step title="Make the call">
    The body **is** the tool's fields, at the top level — there is no `inputs` wrapper. Field names always start with `io`, and `GET /v1/tool/{slug}` lists them with their types and defaults.

    <Tabs>
      <Tab title="cURL">
        ```bash theme={"system"}
        curl -X POST https://api.iotools.cloud/v1/tool/case-converter \
          -H "Authorization: Bearer YOUR_API_KEY" \
          -H "Content-Type: application/json" \
          -d '{ "ioInputString": "hello world", "ioCase": "uppercase" }'
        ```
      </Tab>

      <Tab title="Node.js">
        ```javascript theme={"system"}
        const res = await fetch("https://api.iotools.cloud/v1/tool/case-converter", {
          method: "POST",
          headers: {
            Authorization: `Bearer ${process.env.IOTOOLS_API_KEY}`,
            "Content-Type": "application/json",
          },
          body: JSON.stringify({ ioInputString: "hello world", ioCase: "uppercase" }),
        });

        const data = await res.json();
        console.log(data.outputs.ioOutputString); // HELLO WORLD
        ```
      </Tab>

      <Tab title="Python">
        ```python theme={"system"}
        import os, requests

        res = requests.post(
            "https://api.iotools.cloud/v1/tool/case-converter",
            headers={"Authorization": f"Bearer {os.environ['IOTOOLS_API_KEY']}"},
            json={"ioInputString": "hello world", "ioCase": "uppercase"},
        )

        print(res.json()["outputs"]["ioOutputString"])  # HELLO WORLD
        ```
      </Tab>
    </Tabs>
  </Step>

  <Step title="Read the response">
    ```json theme={"system"}
    {
      "request_id": "e4042b29-…",
      "tool": "case-converter",
      "tool_version": "1",
      "outputs": { "ioOutputString": "HELLO WORLD" },
      "credits_used": 1,
      "credits_remaining": 999
    }
    ```

    `credits_remaining` saves a second call to check your balance. Quote `request_id` in any support request — it is on the response, the `x-request-id` header and our logs.

    <Note>
      Tools with no required inputs can be called with **no body at all** — `curl -X POST <url> -H "Authorization: Bearer …"` runs them on their defaults.
    </Note>
  </Step>
</Steps>

## What to read next

<CardGroup cols={2}>
  <Card title="Credits" icon="coins" href="/docs/concepts/credits">
    What each call costs, and when it doesn't
  </Card>

  <Card title="Errors" icon="triangle-exclamation" href="/docs/concepts/errors">
    The codes to branch on
  </Card>
</CardGroup>
