Graceful degradation
The public SDK surface is fail-silent by design. Your integration should keep the core app path moving when a sponsored slot cannot be created, when a decision does not fill, or when delivery falls back between modes.
Basic fallback pattern
fallback.ts
typescript
const job = await client.createJob({ job_type: "chat" });
if (!job) {
// keep the app path moving without assuming a sponsored slot exists
return { decision: null };
}
const decision = await client.getDecision(job.slot_ids[0]);
if (!decision || decision.fill !== true) {
return { decision: null };
}Create-job failure
createJob() may resolve to null. Treat that as a failed handoff and continue without a sponsored placement.
Delivery fallback
The SDK supports explicit polling, websocket, and callback delivery. The SDK-side auto path falls back when the preferred delivery channel is unavailable.
No-fill behavior
A no-fill should leave your primary GenAI response untouched. The widget renders nothing for pending or no-fill decisions, and your app should treat that as a normal outcome.
API first, Script Tag second, SDK third
These pages are the advanced package layer for teams that intentionally choose @csl/wrapper-sdk. Primary onboarding still lives in the API docs, and browser-first installs should start with the Script Tag. Use contact only when you want rollout review, enterprise coordination, or help with non-standard integration constraints. Beacon billing rules live in SDK Concepts.