Five lines of code. Zero dependencies. Compute what an AI may see — with a signed proof.
access.compute() · fabric.send() · verify() — one primitive, one meter.
INSTALL
npmbash
npm install @nodatachat/sdk
Zero dependencies. Works in Node.js, Bun, Deno, Cloudflare Workers — anything with fetch.
5 lines — access without handing over the data
Ask what a subject may see; get back a decision, an answer over only the authorized slice, and a signed proof.
TypeScriptts
import { NoData } from '@nodatachat/sdk';
const nd = new NoData({ apiKey: 'sk_live_...' });
// THE primitive — give AI access without giving it the data.
const { decision, answer, proof } = await nd.compute({
question: 'What is the claim status?',
clearance: 'internal',
sections: [
{ title: 'Status', text: 'Approved on 2026-07-14' },
{ title: 'SSN', text: '123-45-6789' }, // out of clearance → never sent
],
});
// decision: 'allow' · answer over the permitted sections only.
// The Prove verb — confirm the proof, without decrypting anything.
const v = await nd.verify(proof.id); // { authentic, unaltered, signer }
Zero-knowledge storage. You encrypt client-side. Server stores blindly.
nd.vault.create()nd.vault.read()nd.vault.delete()
M2MSecure Channel — system to system
Two systems need to exchange sensitive data. Neither trusts the other's infra. NoData sits in the middle — blind.
// System A — creates a channel
const ch = await nd.channel.create({
ttl: '1h',
requireVerification: true,
});
// System B — sends credit card data
await nd.channel.send({
token: ch.channel_token,
data: { card: '4111111111111111', cvv: '123', exp: '12/28' },
burnAfterRead: true,
});
// System A — receives
const result = await nd.channel.receive({
token: ch.channel_token,
verificationCode: '482901',
});
const card = JSON.parse(result.data);
System A ──── channel.create() ────→ NoData ←──── channel.send() ──── System B Server relays encrypted bytes. Never sees content. Never stores content.
PLUGINOne line — Express / Fastify
Large system? No rewrite needed. One line of middleware — every response with sensitive fields auto-encrypted.
Expressts
import express from 'express';
import { nodataExpress } from '@nodatachat/sdk/express';
const app = express();
app.use('/api/customers', nodataExpress({
apiKey: 'sk_live_...',
encryptFields: ['phone', 'email', 'id_number'],
}));
// Every response with phone/email/id_number → auto-encrypted
// No code changes in your routes
import { NoData } from '@nodatachat/sdk';
const nd = new NoData({ apiKey: process.env.NODATA_API_KEY! });
// Decide + answer over only the authorized sections, with a proof.
const { decision, answer, proof } = await nd.compute({
question: 'Is this customer past due?',
clearance: 'internal',
sections: [
{ title: 'Balance', text: customer.balance },
{ title: 'SSN', text: customer.ssn }, // out of clearance → never sent
],
});
// The model only ever saw the sections it was cleared for.