LIVE · AUDIT-CHAINED · EU-RESIDENT
SYSTEM · 99.99% UPTIME
v 1.0 ↗ MADE IN EU
Integration

Public API + SDKs + embed widget

Four first-party SDKs over a versioned REST API. Cursor pagination, Idempotency-Key headers, HMAC webhook signing, async-iterator helpers, typed errors. The developer-experience pieces that should be there — not afterthoughts.

The four SDKs

Node

@nexbasira/node

Server-side. Typed against the OpenAPI schema; async iterators for paginated lists; constructEvent(body, sig, secret) for webhook verify. Zero runtime dependencies beyond the global fetch.

Read the Node guide →
Python

nexbasira (PyPI)

Server-side. Pydantic v2 models generated from the schema. Sync + async clients share the same surface; webhook verify lives at WebhookSigner.verify(body, sig, secret).

Read the Python guide →
React

@nexbasira/react

Hooks + components for the operator surface. <CertivisioSessionView /> renders the in-session UI with branding, evidence, and chat. Drop into your existing React app — no portal redirect.

Read the React guide →
Embed

Iframe widget

<script src=".../nb-embed.js"> + a div — the lowest-friction integration. For ops teams who run the operator UI from a non-React stack. Branding inherits from the embedding page via postMessage.

Read the Embed guide →

Built on the OpenAPI spec

The Node + Python SDKs are generated from the same filtered OpenAPI 3.1 schema we publish at app.nexbasira.com/api/public-schema/ — so if you want to skip the SDK and generate your own typed client in Go or Rust, you can:

# Node typed client
npx openapi-typescript https://app.nexbasira.com/api/public-schema/ -o src/nb-types.ts

# Python typed models
datamodel-codegen \
  --url https://app.nexbasira.com/api/public-schema/ \
  --input-file-type openapi \
  --output-model-type pydantic_v2.BaseModel \
  --output cvp_models.py

The hand-written ergonomic surface (typed errors, async iterators, webhook verify) goes on top of those generated types. You're not picking between "fast typed client" and "nice DX" — both ship.

REST conventions, made boring on purpose

ConventionWhy
Cursor paginationStable under concurrent writes. next_cursor in the response; pass it back as ?cursor=….
Idempotency-Key headerSend a UUID; retry on timeout; the server returns the original response either way.
HMAC-SHA256 webhooksNB-Signature: t=…,v1=…. SDKs ship a one-liner verify; 5-min replay window.
Versioned URL prefix/api/v1/public/. Breaking changes move to /v2/ with 12 months of overlap.
Scope-gated credentialsEvery credential carries explicit scopes (sessions:write, evidence:read, …). Rotate without losing a tenant.
Typed error envelopeSame shape every endpoint. code, detail, retry_after_seconds when relevant.

Stability promise

Additive changes — new optional fields, new endpoints, new webhook event types — ship in place; the SDKs treat unknown fields as forward-compatible. Breaking changes move to a new URL prefix and overlap with the previous version for at least 12 months. You won't wake up to a green-to-red migration on a Tuesday morning.

Start with the quickstart

Create a session, mint a field invite, verify a webhook — in under 5 minutes. Copy-paste curl + Node + Python in the same page.