Developer hub

One API runs the whole platform.
Reach it however you like.

Agents, CRM, knowledge, config, jobs, observability — all of it behind one REST API. It is the same API Smooth Operator calls when it does the work for you; pointing your own code at it just means you are the one asking.

Your first call, start to finish

// 1. Exchange client credentials for an access token
const tokenRes = await fetch("https://auth.smoo.ai/token", {
    method: "POST",
    headers: { "Content-Type": "application/x-www-form-urlencoded" },
    body: new URLSearchParams({
        grant_type: "client_credentials",
        provider: "client_credentials",
        client_id: process.env.SMOO_CLIENT_ID!,
        client_secret: process.env.SMOO_CLIENT_SECRET!,
    }),
});
const { access_token } = await tokenRes.json();

// 2. Call the API with the bearer token
const orgs = await fetch("https://api.smoo.ai/organizations", {
    headers: { Authorization: `Bearer ${access_token}` },
}).then((r) => r.json());
console.log(orgs);

Credentials come from Settings → API Keys in the dashboard, or smoo api keys create --type m2m.

Three ways in, same operations

Write every call yourself. Or stop writing them.

Nothing here is a different product — it is the same API at three levels of leverage. Pick the one that matches how much you want to type.

1 · Write the calls

The REST API

OAuth 2.0 client credentials, then plain HTTP. Every object in the platform — agents, CRM, knowledge, config, jobs, observability — is addressable, and the reference has a Try It button on every endpoint.

Open the reference

2 · Type one command

The th CLI

A single static binary that speaks the same API — auth, CRM, knowledge, config, jobs, observability. No Docker, no Node, no SDK to keep in sync. Every command returns JSON.

Explore th

3 · Describe the outcome

Your coding agent

Because every command is scriptable and returns JSON, an agent like Claude Code can act on your org directly: read state, make the change, verify the result. Install the plugin and it knows the commands.

See it drive

The top of the ladder

Hand the work to the agent you already have open.

Every th command is scriptable and returns JSON, so a coding agent can act on your org and check its own work — no SDK, no wrapper, no glue code from you.

Claude Code driving th
you ▸ add [email protected] to the CRM and show me how many contacts we have

agent ▸ smoo api crm contacts create ./ada.json
        { "id": "cnt_9f3a...", "email": "[email protected]", "createdAt": "2026-07-03T..." }

agent ▸ smoo api crm contacts list --json | jq 'length'
        128

agent ◂ Done — Ada Lovelace is contact cnt_9f3a. Your org now has 128 contacts.

The same write, at every rung

One request, four languages and the CLI. org_id comes from the organizations list in the quickstart above.

const res = await fetch("https://api.smoo.ai/organizations/{org_id}/crm/contacts", {
    method: "POST",
    headers: {
        Authorization: `Bearer ${process.env.SMOO_ACCESS_TOKEN}`,
        "Content-Type": "application/json",
    },
    body: JSON.stringify({
        "firstName": "Ada",
        "lastName": "Lovelace",
        "email": "[email protected]",
        "phone": "+15555550100"
    }),
});
const data = await res.json();
console.log(data);

Install once

brew install SmooAI/tools/th or the curl installer — a single static binary, no Docker and no Node. Then smoo auth login --m2m.

Teach your agent

Add the smooth plugin marketplace, then /plugin install smooth-agent@smooth so Claude Code knows the command surface.

Read the source

th is Rust, built on smooth-operator-core, the open-source agent engine. MIT — extend it or self-host it.