Setu Recipes: reusable workflows across every app.Browse templates
Setuसेतु
Documentation menu

SDK reference

Both SDKs wrap the REST API, retry safely, and raise typed errors. They have no heavy dependencies.

TypeScript: @setu/sdk#

TypeScript
import { Setu, SetuError } from "@setu/sdk";
const setu = new Setu({ apiKey, baseUrl, maxRetries: 2, timeoutMs: 60_000 });
Call Returns
setu.toolkits.list() / .get(slug) Catalog entries
setu.tools.list({ toolkits, format }) Tool definitions
setu.tools.search(query, { toolkits, limit, format }) Ranked tool definitions
setu.connections.initiate({ userId, toolkit, redirectUrl?, scopes? }) Connection with connectUrl and waitUntilActive()
setu.connections.connectApiKey({ userId, toolkit, apiKey }) Connection id
setu.connections.list({ userId?, toolkit? }), .get(id), .delete(id) Connection info
setu.execute({ userId, action, input, connectionId?, confirm? }) { data, httpStatus }
setu.sessions.create({ userId, toolkits?, actions?, mode?, ttlSeconds? }) { sessionId, mcpUrl, expiresAt }
setu.handleToolCalls({ userId, format, toolCalls }) Messages to append to the conversation

SetuError has code, status, retryable, details, requestId and needsConnection.

Python: setu#

Python
from setu import Setu, AsyncSetu, SetuError

setu = Setu(api_key=None, base_url=None, max_retries=2, timeout=60.0)

The surface mirrors TypeScript with snake_case names: setu.tools.search(...), setu.connections.initiate(...), setu.execute(...), setu.sessions.create(...), setu.handle_tool_calls(user_id, tool_calls). AsyncSetu has the same methods as coroutines. Use either client as a context manager to close the HTTP connection pool.

Environment variables#

Variable Default
SETU_API_KEY none (required)
SETU_BASE_URL https://api.setuagent.com