@nexbasira/node
Server-side TypeScript-SDK. Dekt elke resource van de publieke API met getypeerde request- + response-vormen, cursor-paginatiehelpers en een webhook-handtekeningverificator die in constante tijd draait.
Installeren
npm install @nexbasira/node Vereist Node 18+. ESM + CommonJS beide ondersteund.
Initialiseren
import { NexBasira } from "@nexbasira/node";
const nb = new NexBasira({
apiKey: process.env.NB_PUBLIC_KEY!, // nb_pub_*
apiSecret: process.env.NB_SECRET_KEY!, // nb_sec_*
// baseURL: "https://app.nexbasira.com/api/v1/public", // default
// timeout: 30_000, // default
}); Resources
Elke resource van de publieke API heeft een getypeerde client op de cvp-instance:
nb.sessions // create / list / retrieve / end / invite
nb.evidence // list / retrieve / signed download URL
nb.whiteboards // list per session
nb.webhooks // register / rotate-secret / test-fire / constructEvent
nb.branding // read-only
nb.org // read-only Veelvoorkomende patronen
Aanmaken + uitnodigen
const session = await nb.sessions.create({
notes: "Vehicle damage claim CL-2026-0042",
scheduled_for: "2026-05-23T10:00:00Z",
locale: "fr",
});
const invite = await nb.sessions.invite(session.id, {
recipient_email: "alex@policyholder.com",
send_email: true,
});
console.log(invite.url); // shown ONCE Async-iterator-paginatie
List-endpoints retourneren een async iterator die transparant pagineert. Geen "vergeet niet de cursor uit de vorige response door te geven" meer:
for await (const session of nb.sessions.list({ limit: 50 })) {
console.log(session.id, session.status);
}
// Or a single page if you want pagination control:
const page = await nb.sessions.listPage({ limit: 25 });
// page.data, page.has_more, page.next_cursor Idempotente POST
Geef een idempotencyKey mee om een schrijfbewerking retry-veilig te maken:
const session = await nb.sessions.create(
{ notes: "..." },
{ idempotencyKey: crypto.randomUUID() },
); De backend cachet de response op (key, credential) gedurende 24 uur. Een herhaalde POST met dezelfde sleutel retourneert de oorspronkelijke response zonder de resource opnieuw aan te maken.
Een webhook verifiëren
import express from "express";
import { NexBasira, InvalidSignatureError } from "@nexbasira/node";
const app = express();
const nb = new NexBasira({ apiKey: "...", apiSecret: "..." });
// IMPORTANT: use express.raw() — constructEvent needs the untouched
// bytes the signature was computed over.
app.post("/nb-webhook", express.raw({ type: "application/json" }), (req, res) => {
try {
const event = nb.webhooks.constructEvent(
req.body,
req.header("NB-Signature")!,
process.env.NB_WEBHOOK_SECRET!,
);
// event.type is type-narrowed; event.data is the resource shape
switch (event.type) {
case "session.completed":
return onCompleted(event.data, res);
case "audit.anchored":
return onAnchored(event.data, res);
}
res.status(204).end();
} catch (err) {
if (err instanceof InvalidSignatureError) {
return res.status(401).send("bad signature");
}
throw err;
}
}); Getypeerde fouten
De SDK gooit een kleine hiërarchie van getypeerde fouten, zodat u elke klasse bewust kunt afhandelen:
| Klasse | Wanneer |
|---|---|
AuthenticationError | 401 — verkeerde credentials of ontbrekende sleutel |
PermissionError | 403 — credential mist de scope |
NotFoundError | 404 — resource bestaat niet of zit niet in uw org |
RateLimitError | 429 — throttle bereikt. Heeft retryAfterMs |
InvalidSignatureError | Alleen vanuit constructEvent() — verkeerde / ontbrekende / verlopen handtekening |
NexBasiraError | Basisklasse — vang deze op voor "elke SDK-fout" |
try {
await nb.sessions.create({ ... });
} catch (err) {
if (err instanceof RateLimitError) {
await sleep(err.retryAfterMs);
return retry();
}
if (err instanceof NexBasiraError) {
log.warn({ status: err.status, code: err.code }, "cvp error");
}
throw err;
} OpenAPI-types
De SDK wordt geleverd met request- + response-types gegenereerd door openapi-typescript onder @nexbasira/node/types. Importeer ze direct als u sterk getypeerde handlers wilt bovenstrooms van de SDK-call:
import type { Session, Evidence, WebhookEvent } from "@nexbasira/node/types";
function onSessionCompleted(session: Session) {
// ...
}