LIVE · AUDIT-KÆDE · EU-HOSTET
SYSTEM · 99,99 % OPPETID
v 1.0 ↗ FREMSTILLET I EU

@nexbasira/node

Server-side TypeScript-SDK. Dækker hver offentlig-API-ressource med typede request- + response-former, cursor-pagineringshjælpere og en webhook-signaturverifikator, der kører i konstant tid.

Installér

npm install @nexbasira/node

Kræver Node 18+. Både ESM + CommonJS understøttes.

Initialisér

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
});

Ressourcer

Hver offentlig-API-ressource 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

Almindelige mønstre

Opret + invitér

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

List-endpoints returnerer en async-iterator, der paginerer gennemsigtigt. Ikke mere "husk at sende cursor fra det forrige svar":

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 at gøre en skrivning genforsøgssikker:

const session = await nb.sessions.create(
  { notes: "..." },
  { idempotencyKey: crypto.randomUUID() },
);

Backenden cacher svaret efter (key, credential) i 24 timer. En gentaget POST med samme nøgle returnerer det oprindelige svar uden at genskabe ressourcen.

Verificering af 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 fejl

SDK'en kaster et lille hierarki af typede fejl, så du kan håndtere hver klasse bevidst:

KlasseHvornår
AuthenticationError401 — dårlig legitimation eller manglende nøgle
PermissionError403 — legitimationen mangler scopet
NotFoundError404 — ressourcen findes ikke eller er ikke i din org
RateLimitError429 — ramte throttlen. Har retryAfterMs
InvalidSignatureErrorKun fra constructEvent() — dårlig / manglende / udløbet signatur
NexBasiraErrorBasisklasse — fang denne for "enhver SDK-fejl"
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-genererede request- + response-typer under @nexbasira/node/types. Importér dem direkte, hvis du vil have stærkt typede handlere upstream af SDK-kaldet:

import type { Session, Evidence, WebhookEvent } from "@nexbasira/node/types";

function onSessionCompleted(session: Session) {
  // ...
}

Hvad er det næste