Skip to content

Search is only available in production builds. Try building and previewing the site to test it out locally.

JavaScript / TypeScript SDK

The JavaScript SDK provides typed clients for every Reactor capability. Install the packages you need, or use @reactor/client as a unified entry point.

Terminal window
npm install @reactor/client
# Or install individual packages:
npm install @reactor/auth @reactor/data @reactor/storage @reactor/functions
import { createClient } from '@reactor/client';
const reactor = createClient({
url: process.env.REACTOR_URL ?? 'http://localhost:8000',
token: process.env.REACTOR_TOKEN,
});

For client-side apps, use the anon key and enable RLS on your tables:

const reactor = createClient({
url: 'https://api.reactor.cloud',
token: import.meta.env.VITE_REACTOR_ANON_KEY,
});
import { createAuthClient } from '@reactor/auth';
const auth = createAuthClient({ url, token });
// Sign up
const { user, session } = await auth.signUp({
email: 'user@example.com',
password: 'secure-password',
});
// Sign in
const { session } = await auth.signInWithPassword({
email: 'user@example.com',
password: 'secure-password',
});
// Get current user
const user = await auth.getUser();

PostgREST-style query builder:

import { createDataClient } from '@reactor/data';
const data = createDataClient({ url, token });
// Select
const { data: posts } = await data
.from('posts')
.select('id, title, created_at')
.eq('published', true)
.order('created_at', { ascending: false })
.limit(20);
// Insert
const { data: newPost } = await data
.from('posts')
.insert({ title: 'Hello', body: 'World' })
.select()
.single();
// Update
await data.from('posts').update({ published: true }).eq('id', postId);
// Delete
await data.from('posts').delete().eq('id', postId);
import { createRealtimeClient } from '@reactor/realtime';
const realtime = createRealtimeClient({ url, token });
const channel = realtime.channel('posts');
channel.on('postgres_changes', {
event: 'INSERT',
schema: 'public',
table: 'posts',
}, (payload) => {
console.log('New post:', payload.new);
});
await channel.subscribe();
import { createStorageClient } from '@reactor/storage';
const storage = createStorageClient({ url, token });
// Upload
await storage.from('avatars').upload('user-123.png', file);
// Download
const { data: blob } = await storage.from('avatars').download('user-123.png');
// Signed URL
const { signedUrl } = await storage
.from('avatars')
.createSignedUrl('user-123.png', 3600);
import { createFunctionsClient } from '@reactor/functions';
const functions = createFunctionsClient({ url, token });
const { data } = await functions.invoke('process-order', {
body: { orderId: '123' },
});
import { createJobsClient } from '@reactor/jobs';
const jobs = createJobsClient({ url, token });
await jobs.trigger('send-digest', { userId: 'abc' });
import { createAiClient } from '@reactor/ai';
const ai = createAiClient({ url, token });
const response = await ai.chat.completions.create({
model: 'anthropic/claude-sonnet-4.6',
messages: [{ role: 'user', content: 'Hello!' }],
});
import { createConnectClient } from '@reactor/connect';
const connect = createConnectClient({ url, token });
const result = await connect.instances('stripe-main').action('createCustomer', {
email: 'customer@example.com',
});

All SDK methods throw typed errors:

import { ReactorError } from '@reactor/client';
try {
await data.from('posts').insert({ title: 'Test' });
} catch (err) {
if (err instanceof ReactorError) {
console.error(err.code, err.message);
}
}

Auto-generated TypeDoc output for each package is available under the generated docs directory. Regenerate with:

Terminal window
cd platform/apps/reactor-cloud/sites/docs
npm run generate:sdk

SDK source lives in the monorepo at reactor-cloud/sdks/js/packages/.