Use client tokens for browser and mobile realtime connections.
Client tokens are short-lived keys you create on your backend, then pass to your frontend for client.realtime.connect().
Never expose your permanent API key (sk-...) in client-side code. Use client tokens (ek_...) for all browser and mobile realtime sessions.
Why client tokens
Safe to send to browsers and mobile apps
Short-lived (10 minute TTL)
Limited scope (cannot create new tokens)
Expiration blocks new connections, but does not disconnect active realtime sessions
End-to-end flow
Create token on your backend
Your backend uses your permanent API key to create a client token.
Return token to the frontend
Return apiKey and expiresAt from your backend endpoint.
Connect with the client token
Your frontend uses the token as apiKey when connecting to realtime.
Backend examples
Next.js Route Handler
Express
FastAPI
// app/api/realtime-token/route.ts
import { createDecartClient } from "@decartai/sdk" ;
import { NextResponse } from "next/server" ;
const client = createDecartClient ({
apiKey: process . env . DECART_API_KEY ,
});
export async function POST () {
try {
const token = await client . tokens . create ();
return NextResponse . json ( token );
} catch {
return NextResponse . json ({ error: "Failed to create token" }, { status: 500 });
}
}
Frontend example
import { createDecartClient , models } from "@decartai/sdk" ;
const model = models . realtime ( "lucy_2_rt" );
async function connectRealtime () {
const tokenResponse = await fetch ( "/api/realtime-token" , { method: "POST" });
const { apiKey } = await tokenResponse . json ();
const stream = await navigator . mediaDevices . getUserMedia ({
video: { frameRate: model . fps , width: model . width , height: model . height },
audio: true ,
});
const client = createDecartClient ({ apiKey });
return client . realtime . connect ( stream , {
model ,
onRemoteStream : ( remoteStream ) => {
document . getElementById ( "output" ). srcObject = remoteStream ;
},
initialState: {
prompt: { text: "Anime style" , enhance: true },
},
});
}
Rotation strategy
Create tokens on demand when users open a realtime session
Refresh token before starting a new session if the old token is near expiry
Do not persist client tokens in local storage
Revoke permanent keys in dashboard if you suspect leakage