Quickstart

Start with the Node/server package entry. The first quickstart uses the released @csl/wrapper-sdk surface.

node-server.ts

typescript

NODE ENTRY
import { CslClient } from "@csl/wrapper-sdk";

const client = new CslClient({
  baseUrl: process.env.CSL_BASE_URL ?? "http://127.0.0.1:3000",
  getApiKey: () => process.env.CSL_WRAPPER_API_KEY ?? "",
  decisionDelivery: "polling",
});

const job = await client.createJob({
  job_type: "chat",
  model_id: "gpt-4o-mini",
  locale: "en-US",
  consent: {
    semantic_targeting: true,
    session_persistence: false,
    cross_session_persistence: false,
  },
  prompt: { text: "I want a travel deal for a weekend trip." },
  slots_requested: 1,
});

const decision = job?.slot_ids[0] ? await client.getDecision(job.slot_ids[0]) : null;
console.log(decision);

What happens to the prompt text-

The prompt field is sent to the CSL, wavebird's middleware layer, where the data firewall extracts only an abstract topic category and the language. These two signals are the only data that reaches the ad market. The raw prompt text stays within the CSL and is never forwarded to SSPs, DSPs, or advertisers. If you want to understand the full data flow, see How wavebird works and Data Firewall.

Copy the code first, then move to Integration flow, Configuration, and the CslClient reference for the deeper lifecycle and type details.

  • Shows the released Node/server entry with getApiKey() and explicit polling delivery.
  • Matches the README quickstart for @csl/wrapper-sdk.

Read next

Ask about integration

Ask about integration

Start with Node direct for the recommended production-ready integration path.