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.
When to Use Server-Side
Section titled “When to Use Server-Side”| 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 |
Local Runtime (Available Now)
Section titled “Local Runtime (Available Now)”The local runtime evaluates entitlements and placements entirely from an ExportedConfig JSON snapshot. No API server connection required.
Installation
Section titled “Installation”pnpm add @revturbine/sdkEntitlement Checks
Section titled “Entitlement Checks”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 entitlementconst result = await sdk.checkEntitlement('data_export');
if (!result.allowed) { // deny access — user needs to upgrade console.log('Upgrade required:', result.status);}Placement Decisions (SSR)
Section titled “Placement Decisions (SSR)”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 usagesdk.updateUsage({ api_calls: req.user.apiCallCount });
// Resolve a specific slot's placementconst banner = await sdk.getPlacement({ slotId: 'dashboard_banner', surfaceTemplateIds: ['banner_placement'],});
if (banner) { // Render banner.content into your template}SSR with React (Local Mode)
Section titled “SSR with React (Local Mode)”For frameworks like Next.js, resolve placements with the local runtime and hydrate client-side:
'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> );}RevTurbineServer Provider
Section titled “RevTurbineServer Provider”Python server SDK
Section titled “Python server SDK”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.
Next Steps
Section titled “Next Steps”- Entitlements Guide — entitlement types and checking patterns
- Runtime Modes — choosing the right runtime mode
- Headless API — imperative SDK usage without React