SDKs

Catentio ships SDKs in three languages with feature parity across all three. Same 25 resource namespaces, same Bearer auth, same envelope. Pick the one for your stack:

Language Package Install
Node.js @forjio/catentio-saas-node npm install @forjio/catentio-saas-node
Python catentio-saas (PyPI) pip install catentio-saas
Go github.com/hachimi-cat/saas-catentio/sdk/go go get github.com/hachimi-cat/saas-catentio/sdk/go

All three:

  • Implement the same surface — 25 resource namespaces, identical method names modulo language casing.
  • Support both static API key auth (apiKey / api_key / APIKey) and OIDC device-flow Bearer auth (Session).
  • Use @forjio/sdk (or its Python / Go peers) underneath for HTTP, JWT verify, and Session refresh — the same plumbing every other Forjio product SDK uses.
  • Provide a per-call token override so you can act on behalf of a different identity for one request without rebuilding the client.

The 25 namespaces

Namespace Surface
workspaces list, show, create, destroy, setState
agents list, get, invoke
runs list, get, cancel
projects list, get, create, plus per-project: listAttachments, addAttachment, listTasks, getTask, listSubtasks, getSubtask, listAttempts, listArtifacts, listEvents, cost, pause, resume, abandon, runStep, retrySubtask
templates list
tools list, get, create, update, delete
skills list, get
memory stats, listEntries, getEntry, createEntry, updateEntry
apiKeys list, create, delete
billing catalog, summary, subscribe
cost summary
integrations list, configure, delete
webhooks list, create, delete
scheduledJobs list, create, update, delete
featureFlags list, set
files list, upload, delete
outputDestinations list, get, create, update, delete
discord status, sendMessage
gojo sessions
heartbeats list, config, updateConfig
system info, health (unauth)
chat send, history
events list
inboundWebhooks list

The 25 namespaces match the control plane's resource layout 1:1. Adding a new resource on the server adds a namespace to every SDK in the same release.

Quick comparison

Same call in three languages — invoke an agent:

Node.js:

import { CatentioSaasClient } from '@forjio/catentio-saas-node';

const catentio = new CatentioSaasClient({ apiKey: process.env.CATENTIO_API_KEY });

const run = await catentio.agents.invoke('cimi', {
  message: 'Summarise the project board in three bullets.',
});

Python:

from catentio_saas import CatentioClient
import os

with CatentioClient(api_key=os.environ["CATENTIO_API_KEY"]) as catentio:
    run = catentio.agents.invoke("cimi", {
        "message": "Summarise the project board in three bullets.",
    })

Go:

import catentio "github.com/hachimi-cat/saas-catentio/sdk/go"

client, _ := catentio.NewClient(catentio.ClientOptions{
    APIKey: os.Getenv("CATENTIO_API_KEY"),
})

run, _ := client.Agents.Invoke(ctx, "cimi", catentio.AgentInvokeInput{
    Message: "Summarise the project board in three bullets.",
})

The differences are purely idiomatic: camelCase in Node, snake_case in Python, PascalCase in Go. The underlying call is identical.

Static key vs Bearer session

Both authentication modes work with every method. Pick at construction time:

// Server-to-server — static key
const catentio = new CatentioSaasClient({ apiKey: 'cat_ak_...' });

// Interactive — device-flow session
const catentio = new CatentioSaasClient({ session });

For mixed callers, you can override per call with the optional token last-arg:

// Use the client's apiKey for most calls...
const agents = await catentio.agents.list();

// ...but this one call uses a specific Bearer token instead.
const runs = await catentio.runs.list({}, '<specific-token>');

The Python and Go SDKs have the same per-call override pattern.

Versioning

All SDKs follow semantic versioning:

  • MAJOR bumps for breaking changes (rare; batched).
  • MINOR bumps for new features (most releases).
  • PATCH bumps for fixes.

Current versions are 0.x across the three. Pre-1.0 means small breaking changes can ship between minor versions; every break is documented in the changelog. Once we hit 1.0, the contract becomes strict.

Open-source

The SDKs live in the same repo as Catentio's portal + control plane:

PRs welcome through the same review path as the rest of the codebase.

Other languages

If your stack is Ruby, PHP, Rust, Elixir, or anything else, use the raw REST API directly. The OpenAPI spec is published from the runtime repo and works with any OpenAPI tooling.

We don't currently plan to publish additional language SDKs — the Forjio family has settled on Node / Python / Go as the canonical trio. If there's strong demand for a fourth, email hello@catentio.com.

Next