@nexbasira/node
Server-side TypeScript SDK. Dekker alle offentlige-API-ressurser med typede forespørsels- og responsformer, hjelpere for cursor-paginering og en webhook-signaturverifiserer som kjører i konstant tid.
Installasjon
npm install @nexbasira/node Krever Node 18+. Både ESM og CommonJS støttes.
Initialiser
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
}); Ressurser
Hver offentlige-API-ressurs har en typet klient på cvp-instansen:
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 Vanlige mønstre
Opprett + inviter
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-paginering
Liste-endepunkter returnerer en async-iterator som paginerer transparent. Ikke mer «husk å sende cursor fra forrige respons»:
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 Idempotent POST
Send en idempotencyKey for å gjøre en skriving trygg å prøve på nytt:
const session = await nb.sessions.create(
{ notes: "..." },
{ idempotencyKey: crypto.randomUUID() },
); Backend-en cacher responsen etter (key, credential) i 24 timer. En POST som prøves på nytt med samme nøkkel returnerer den opprinnelige responsen uten å opprette ressursen på nytt.
Verifisere en webhook
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;
}
}); Typede feil
SDK-en kaster et lite hierarki av typede feil slik at du kan håndtere hver klasse bevisst:
| Klasse | Når |
|---|---|
AuthenticationError | 401 — ugyldige legitimasjonsopplysninger eller manglende nøkkel |
PermissionError | 403 — legitimasjonen mangler scope |
NotFoundError | 404 — ressursen finnes ikke eller er ikke i organisasjonen din |
RateLimitError | 429 — traff struping. Har retryAfterMs |
InvalidSignatureError | Bare fra constructEvent() — ugyldig / manglende / utløpt signatur |
NexBasiraError | Basisklasse — fang denne for «hvilken som helst SDK-feil» |
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-typer
SDK-en leveres med openapi-typescript-genererte forespørsels- og responstyper under @nexbasira/node/types. Importer dem direkte hvis du vil ha sterkt typede handlere oppstrøms for SDK-kallet:
import type { Session, Evidence, WebhookEvent } from "@nexbasira/node/types";
function onSessionCompleted(session: Session) {
// ...
}