Creating a Client

createClient is the main entry point. It returns a fully-typed client object that covers every Terrantula API resource.

Signature

import { createClient } from '@terrantula/sdk'
import type { CreateClientOptions, TokenSource } from '@terrantula/sdk'

// Static token string
const client = createClient('https://terrantula.example.com', 'terr_xxxxxxxxxxxx')

// Options object
const client2 = createClient('https://terrantula.example.com', {
  token: 'terr_xxxxxxxxxxxx',
})

TokenSource

TokenSource is string | (() => string | Promise<string>). Pass a factory when the token rotates (e.g. fetched from a secrets manager at call time):

import { createClient } from '@terrantula/sdk'

const client = createClient('https://terrantula.example.com', {
  token: async () => {
    // Fetch a fresh token from your secrets manager on each request
    return 'terr_fresh_token'
  },
})

CreateClientOptions

PropertyTypeDescription
tokenTokenSource | undefinedAPI token or token factory. Omit for unauthenticated requests.
fetchtypeof globalThis.fetch | undefinedOverride the fetch implementation. Useful in tests — pass your Hono app's .fetch.

Project-scoped and env-scoped access

Resources are organized at three scopes. Every method takes a single params object:

Cloud scope — org and project management, GitHub integration:

import { createClient } from '@terrantula/sdk'

const client = createClient('https://terrantula.example.com', 'terr_xxxxxxxxxxxx')

// Create a project
const project = await client.projects.create({
  orgId: 'my-org',
  name: 'infra',
  slug: 'infra',
})

Project scope — entity types, cells, actions, audit log, stats:

import { createClient } from '@terrantula/sdk'

const client = createClient('https://terrantula.example.com', 'terr_xxxxxxxxxxxx')

// Project-scoped: entity types catalog
const entityTypes = await client.entityTypes.list({
  orgId: 'my-org',
  projectId: 'infra',
})
const cells = await client.cells.list({
  orgId: 'my-org',
  projectId: 'infra',
})

Env scope — entities, relationships, secrets (environment-isolated):

import { createClient } from '@terrantula/sdk'

const client = createClient('https://terrantula.example.com', 'terr_xxxxxxxxxxxx')

// Env-scoped: entities in the production environment
const entities = await client.entities.list({
  orgId: 'my-org',
  projectId: 'infra',
  envName: 'production',
})

Test usage

Pass a Hono app's .fetch to run against the real API handler in tests without starting a server:

import { createClient } from '@terrantula/sdk'

// In a test, pass app.fetch directly:
declare const app: { fetch: typeof globalThis.fetch }

const client = createClient('http://localhost', {
  token: 'test-token',
  fetch: app.fetch,
})