@zentiq/node
v0.2.0
Published
Official Node.js SDK for the Zentiq AI avatar API (server-side): manage personas, voices, avatars, mint session tokens, steer live sessions, and verify webhooks.
Maintainers
Readme
@zentiq/node
Official server-side SDK for the Zentiq AI avatar API. Manage personas, voices and avatars, mint live session tokens, steer sessions mid-call, and verify webhooks.
npm install @zentiq/nodeimport { Zentiq } from "@zentiq/node";
const zentiq = new Zentiq({ apiKey: process.env.ZENTIQ_API_KEY! });
// mint a token on your backend, hand it to the browser (never expose the API key)
const session = await zentiq.sessions.createToken({
personaId: "pa_…",
identity: "user-42",
overrides: { greeting: "Hey {{name}}!", variables: { name: "Roger" } },
});
// -> { sessionId, sessionToken, url, room, persona }Sessions
await zentiq.sessions.say("sess_…", { text: "Repeat after me: guten Morgen." });
await zentiq.sessions.steer("sess_…", { systemPrompt: "Now reply only in German." });
const { turns } = await zentiq.sessions.transcript("sess_…");
await zentiq.sessions.end("sess_…");Resources (paginated lists)
const { data, nextCursor } = await zentiq.personas.list({ limit: 50 });
await zentiq.personas.create({ name: "Ava", systemPrompt: "…", settings: { engine: "premier", language: "English" } });
// Global voice tier (70+ languages, prebuilt voices):
await zentiq.personas.update("pa_…", { settings: { engine: "global", globalVoice: "Aoede" } });
await zentiq.voices.clone({ name: "Founder", audioBase64: "data:audio/wav;base64,…" });
await zentiq.avatars.create({ name: "CEO", imageUrl: "https://…/ceo.png" });Idempotency
Pass an idempotency key to any create call so a network retry can't double-create:
await zentiq.personas.create({ … }, "my-unique-key");Webhooks
import { verifyWebhook } from "@zentiq/node";
// in your webhook handler — pass the RAW body string
const event = verifyWebhook(rawBody, req.headers, process.env.ZENTIQ_WEBHOOK_SECRET!);
// throws on a bad signature or replayed timestamp
if (event.type === "session.ended") { /* … */ }Every method returns the data payload and throws a ZentiqError on failure — the API's uniform
error body is { error: { code, message } }, surfaced as .code, .status and .requestId
(from the X-Request-Id response header).
