Skip to content

Server-Side Integration

The SDK supports server-side entitlement checks and placement decisions using the local runtime mode — all logic runs against an ExportedConfig snapshot with no network calls required.

| Use case | Client SDK | Server SDK | |---|---|---| | Render placements in React | ✅ | — | | Gate API endpoints | — | ✅ | | Enforce usage limits before processing | — | ✅ | | SSR placement decisions | ✅ (local mode) | ✅ | | Track server-side events | — | 🔜 Coming soon |

The local runtime evaluates entitlements and placements entirely from an ExportedConfig JSON snapshot. No API server connection required.

Terminal window
pnpm add @revturbine/sdk
import { initRevTurbine } from '@revturbine/sdk';
import exportedConfig from './exported_config.json';
const sdk = initRevTurbine({
localRuntime: { exportedConfig },
user: {
id: 'user_123',
plan: { id: 'starter', name: 'Starter' },
entitlements: { data_export: false },
},
});
// Check an entitlement
const result = await sdk.checkEntitlement('data_export');
if (!result.allowed) {
// deny access — user needs to upgrade
console.log('Upgrade required:', result.status);
}

Resolve placements server-side for SSR or email templates:

import { initRevTurbine } from '@revturbine/sdk';
import exportedConfig from './exported_config.json';
const sdk = initRevTurbine({
localRuntime: { exportedConfig },
user: {
id: req.user.id,
plan: { id: req.user.planId },
},
});
// Report current usage
sdk.updateUsage({ api_calls: req.user.apiCallCount });
// Resolve a specific slot's placement
const banner = await sdk.getPlacement({
slotId: 'dashboard_banner',
surfaceTemplateIds: ['banner_placement'],
});
if (banner) {
// Render banner.content into your template
}

For frameworks like Next.js, resolve placements with the local runtime and hydrate client-side:

components/Dashboard.tsx
'use client';
import { RevTurbineProvider, FixedSurfaceSlot } from '@revturbine/sdk';
import exportedConfig from './exported_config.json';
import { useMemo } from 'react';
export default function Dashboard({ user }) {
const options = useMemo(() => ({
localRuntime: { exportedConfig },
user: {
id: user.id,
plan: { id: user.planId, name: user.planName },
entitlements: user.entitlements,
},
}), [user]);
return (
<RevTurbineProvider options={options}>
<FixedSurfaceSlot
id="dashboard_banner"
surfaceTemplateIds={["banner_placement"]}
/>
{/* rest of your dashboard */}
</RevTurbineProvider>
);
}

A Python server SDK is also available, with byte-identical decisioning parity to the Node SDK:

| Language | Package | Status | |---|---|---| | Node.js | @revturbine/sdk (local runtime) | ✅ Available | | Python | revturbine (PyPI) | ✅ Available |

See the Python SDK guide for setup and usage.