Skip to main content

Authentication

Get Current User

import { client } from '@getgraniteai/ts-sdk';

const user = await client.getCurrentUser();
console.log(`Logged in as: ${user.email}`);
console.log(`Organization: ${user.organization_name}`);

List Organizations

const orgs = await client.listOrganizations();
for (const org of orgs) {
  console.log(`${org.name} (${org.slug})`);
}

Processes

List All Processes

const jobs = await client.listWorkflowJobs();
for (const job of jobs) {
  console.log(`${job.name} - ${job.status}`);
}

Get Process Details

const job = await client.getWorkflowJob({
  jobId: 'job_abc123',
});
console.log(job.name);
console.log(job.description);

Running Automations

Trigger via API Endpoint

// Using the public endpoint invocation
const result = await client.invokeOrgEndpoint({
  orgIdentifier: 'your-org',
  slug: 'your-endpoint',
  body: {
    param1: 'value1',
    param2: 'value2',
  },
});

console.log(`Run ID: ${result.runId}`);
console.log(`Status: ${result.status}`);

Check Run Status

const run = await client.getAgentRun({
  runId: 'run_abc123',
});

console.log(`Status: ${run.status}`);
console.log(`Duration: ${run.duration}ms`);

List Recent Runs

const runs = await client.listAgentRuns({
  limit: 10,
  offset: 0,
});

for (const run of runs.items) {
  console.log(`${run.id} - ${run.status} - ${run.created_at}`);
}

API Keys

Create API Key

const key = await client.createApiKey({
  organizationId: 'org_123',
  name: 'Production Backend',
});

// Save this immediately - only shown once!
console.log(`API Key: ${key.key}`);

List API Keys

const keys = await client.listApiKeys({
  organizationId: 'org_123',
});

for (const key of keys) {
  console.log(`${key.name} - Created: ${key.created_at}`);
}

Revoke API Key

await client.revokeApiKey({
  organizationId: 'org_123',
  keyId: 'key_abc',
});
console.log('Key revoked');

Analytics

Get Batched Analytics

const analytics = await client.getBatchedAnalytics({
  timeRange: '7d',
  granularity: 'daily',
});

console.log(`Total executions: ${analytics.summary.total_executions}`);
console.log(`Success rate: ${analytics.summary.success_rate}%`);

Get Executions Over Time

const data = await client.getExecutionsOverTime({
  timeRange: '30d',
  granularity: 'daily',
});

for (const point of data.data) {
  console.log(`${point.date}: ${point.count} executions`);
}

Team Management

Invite Member

await client.inviteMember({
  organizationId: 'org_123',
  email: '[email protected]',
  role: 'member',
});
console.log('Invitation sent');

Update Member Role

await client.updateMemberRole({
  organizationId: 'org_123',
  memberId: 'mem_456',
  role: 'admin',
});

Error Handling Pattern

async function safeApiCall<T>(
  operation: () => Promise<T>
): Promise<T | null> {
  try {
    return await operation();
  } catch (error) {
    if (error.status === 401) {
      // Handle unauthorized - redirect to login
      window.location.href = '/login';
    } else if (error.status === 429) {
      // Handle rate limit - wait and retry
      await new Promise(r => setTimeout(r, 5000));
      return safeApiCall(operation);
    } else {
      console.error('API Error:', error.message);
    }
    return null;
  }
}

// Usage
const user = await safeApiCall(() => client.getCurrentUser());

Polling Pattern

async function waitForCompletion(runId: string): Promise<AgentRun> {
  while (true) {
    const run = await client.getAgentRun({ runId });

    if (['completed', 'failed', 'cancelled'].includes(run.status)) {
      return run;
    }

    // Wait 2 seconds before checking again
    await new Promise(r => setTimeout(r, 2000));
  }
}

// Usage
const result = await waitForCompletion('run_abc123');
console.log(`Final status: ${result.status}`);

Next Steps