Skip to content

SDKs ​

Official SDKs for integrating Experiment Plus into your applications.

Installation ​

bash
npm install @experiment-plus/sdk
bash
pnpm add @experiment-plus/sdk
bash
yarn add @experiment-plus/sdk
bash
pip install experiment-plus

Quick Start ​

typescript
import { ExperimentPlus } from '@experiment-plus/sdk'

const client = new ExperimentPlus({
  apiKey: process.env.EXPERIMENT_PLUS_API_KEY!,
  localEvaluation: true,
})

// Identify the user
client.identify('user-123', { plan: 'pro', country: 'US' })

// Check a feature flag
const variant = await client.getFeatureFlag('new-checkout')

if (variant === 'variant-a') {
  // Show new checkout
} else {
  // Show control
}

// Track conversion
client.track('checkout_completed', { value: 99.99 })

// Cleanup on shutdown
await client.shutdown()
python
from experiment_plus import ExperimentPlus

client = ExperimentPlus(
    api_key="sk_live_...",
    local_evaluation=True,
)

# Identify the user
client.identify("user-123", {"plan": "pro", "country": "US"})

# Check a feature flag
variant = client.get_feature_flag("new-checkout")

if variant == "variant-a":
    # Show new checkout
    pass
else:
    # Show control
    pass

# Track conversion
client.track("checkout_completed", value=99.99)

# Cleanup
client.shutdown()
python
from experiment_plus import ExperimentPlus

async def main():
    client = ExperimentPlus(
        api_key="sk_live_...",
        local_evaluation=True,
    )

    client.identify("user-123", {"plan": "pro"})

    variant = await client.get_feature_flag_async("new-checkout")

    await client.shutdown_async()

Configuration ​

OptionTypeDefaultDescription
apiKeystringRequiredYour API key (pk_* for client, sk_* for server)
baseUrlstringhttps://api.experiment-plus.ioAPI base URL
localEvaluationbooleanfalseEnable local flag evaluation
cache.ttlnumber60000Cache TTL in milliseconds
batching.flushIntervalnumber5000Event flush interval in ms
batching.maxBatchSizenumber100Max events per batch
timeoutnumber30000Request timeout in ms
retriesnumber3Max retries on failure

Core Methods ​

identify(distinctId, properties?) ​

Set the user context for all subsequent evaluations.

typescript
client.identify('user-123', {
  plan: 'pro',
  country: 'US',
  signupDate: '2024-01-15'
})

getFeatureFlag(flagKey, context?) ​

Evaluate a feature flag and get the variant key.

typescript
const variant = await client.getFeatureFlag('new-checkout')
// Returns: 'control' | 'variant-a' | 'variant-b' | ...

isFeatureEnabled(flagKey, context?) ​

Check if a boolean flag is enabled.

typescript
if (await client.isFeatureEnabled('dark-mode')) {
  enableDarkMode()
}

getFeatureFlagWithPayload(flagKey, context?) ​

Get the variant with its associated payload data.

typescript
const result = await client.getFeatureFlagWithPayload('pricing-test')
// result.variant = 'variant-a'
// result.payload = { price: 9.99, currency: 'USD' }

track(eventName, options?) ​

Track an event (batched automatically).

typescript
client.track('purchase', {
  value: 49.99,
  properties: { productId: 'sku-123' }
})

flush() ​

Manually flush queued events.

typescript
await client.flush()

shutdown() ​

Gracefully shutdown the client, flushing all pending events.

typescript
await client.shutdown()

Local Evaluation ​

When localEvaluation: true is set, flags are evaluated client-side using cached configurations. This provides:

  • Lower latency: No network round-trip for each evaluation
  • Offline support: Works when the network is unavailable
  • Consistent bucketing: Uses MurmurHash3 for deterministic user assignment

The SDK automatically fetches and caches flag configurations, refreshing them based on the cache.ttl setting.

typescript
const client = new ExperimentPlus({
  apiKey: 'pk_live_...',
  localEvaluation: true,
  cache: { ttl: 30_000 }, // Refresh every 30s
})

Error Handling ​

typescript
import { ExperimentPlus, RateLimitError, AuthenticationError } from '@experiment-plus/sdk'

try {
  const variant = await client.getFeatureFlag('my-flag')
} catch (error) {
  if (error instanceof RateLimitError) {
    // Back off and retry
  } else if (error instanceof AuthenticationError) {
    // Check API key
  }
}

Context Manager (Python) ​

The Python SDK supports context managers for automatic cleanup:

python
with ExperimentPlus(api_key="sk_live_...") as client:
    client.identify("user-123")
    variant = client.get_feature_flag("my-flag")
# Automatically calls shutdown()

# Async version
async with ExperimentPlus(api_key="sk_live_...") as client:
    variant = await client.get_feature_flag_async("my-flag")

Next Steps ​

Built with VitePress