Customer quickstart / Guida cliente

KINETIPROOF™ / EN / 01

Activate your subscription key

After payment, the supplier provisions your customer account and delivers its endpoint and dedicated API key through the agreed secure channel. The client dashboard’s demo key works only in the local sandbox.

01 · Store the key

Set SCUDO_API_URL to the assigned HTTPS origin and SCUDO_API_KEY in your backend secret store. Run the following from the backend with those variables loaded.

curl --fail-with-body -X POST "$SCUDO_API_URL/v1/challenge" \
  -H "Authorization: Bearer $SCUDO_API_KEY" \
  -H 'Content-Type: application/json' -d '{}'

02 · Confirm access

HTTP 200 and a challenge_id confirm access. Discard this test challenge. For 401, check origin and key; for 403, check the subscription and feature. Ask the issuer to rotate any exposed key.

KINETIPROOF™ / EN / 02

Install the sensor in two minutes

BrowserRelayAPI
Only the relay attaches the Bearer key.

Prerequisites: HTTPS, an authenticated same-origin relay at /scudo, and permission to collect. Configure the relay to accept only POST /v1/challenge and /v1/audit-session, enforce origin, session and rate limits, forward JSON with the server key, and return the upstream status and JSON.

Minute 1. Copy web_sensor_sdk/scudo-sensor.js to /assets/scudo-sensor.js on your site. Minute 2. In a module invoked after consent or other applicable authorization, start one capture. Exercise the page during the 15-second sample.

import {startScudoSensor} from '/assets/scudo-sensor.js';
const capture = await startScudoSensor(async (path, body) => {
  const r = await fetch('/scudo' + path, {method:'POST',
    headers:{'Content-Type':'application/json'}, body:JSON.stringify(body)});
  if (!r.ok) throw Error('Relay HTTP ' + r.status);
  return r.json();
});
await new Promise(done => setTimeout(done, 15000));
const result = await capture.audit();

Expect one challenge and one audit response. On withdrawal call capture.cancel(). After expiry start a fresh capture within the 60-second window.

KINETIPROOF™ / EN / 03

Run an audit from your toolchain

Run from the supplied kit root. plan.json is a measured QA plan with signals. session contains observed DOM integrity, events and the untrusted flag for the Python sensor client.

CLI

python3 scudo_cli.py --audit-json plan.json --export-report ./reports-client

Python · local HTTP relay

import json
from web_sensor_sdk.scudo_qa_sdk import ScudoQA
with open("session.json") as f:
    print(ScudoQA().audit(json.load(f)))

Node.js · CommonJS

const {ScudoClient} = require('./integrations/node_sdk');
const c = new ScudoClient(process.env.SCUDO_API_URL, process.env.SCUDO_API_KEY);
c.auditSession(require('./plan.json')).then(console.log).catch(e => {
  console.error(e.message); process.exitCode = 1;
});

Go

In your module, require scudo/biometric-sdk v0.0.0 and replace it with the local integrations/go_sdk directory. Import it as scudo, plus context and os. Inside your function with a measured plan:

c, err := scudo.NewClient(os.Getenv("SCUDO_API_URL"), os.Getenv("SCUDO_API_KEY"), nil)
if err != nil { return err }
_, err = c.AuditSession(context.Background(), plan)
return err

Playwright · Growth / Enterprise

Set both API variables in CI and use the wrapped page fixture in your existing test. Exercise pointer, keyboard, clicks and scrolling. Inspect scudo-reports on failure.

const test = require('./integrations/playwright_plugin/scudo_playwright_hook')
  .playwright(require('@playwright/test').test);
KINETIPROOF™ / EN / 04

Read the nine-panel certificate

On Growth or Enterprise request POST /v1/generate-certificate with a fresh nonce and the measured plan. Open certificates.html and retain certificates.json. Verify the signature with the issuer public key received independently.

IDMeasurement
T1Key rhythm and hold intervals
T2Distribution of key hold times
T3Insertion and correction sequence
M4Pointer velocity profile
M5Clock regularity and quantization in click plans
M6Click position relative to target
M7Dwell intervals and focus changes
M8Scroll reversals relative to net direction
M9Intervals between actions
● Consistent ▲ Flagged ○ Unobserved
Green: measured and compatible. Red: inspect the rejected hypothesis and repeat with another sample. Gray: insufficient evidence. If M8 is gray, capture actual scrolling before comparing runs.

Read the overall risk alongside panel coverage. A compatible sample alone cannot establish identity. Escalate adverse decisions to a human reviewer.

KINETIPROOF™ / IT / 01

Attiva la chiave di abbonamento

Dopo il pagamento il fornitore attiva l’account cliente e consegna endpoint e chiave dedicata tramite il canale sicuro concordato. La chiave demo della dashboard funziona solo nella sandbox locale.

01 · Conserva la chiave

Imposta SCUDO_API_URL sull’origine HTTPS assegnata e salva SCUDO_API_KEY nel gestore segreti del backend. Esegui dal backend con entrambe le variabili caricate.

curl --fail-with-body -X POST "$SCUDO_API_URL/v1/challenge" \
  -H "Authorization: Bearer $SCUDO_API_KEY" \
  -H 'Content-Type: application/json' -d '{}'

02 · Verifica l’accesso

HTTP 200 e challenge_id confermano l’accesso. Scarta questa sfida di prova. Per 401 verifica origine e chiave, per 403 verifica abbonamento e funzione inclusa. Chiedi all’emittente la rotazione di una chiave esposta.

KINETIPROOF™ / IT / 02

Installa il sensore in due minuti

BrowserRelayAPI
Solo il relay aggiunge la chiave Bearer.

Prerequisiti: HTTPS, relay autenticato sulla stessa origine in /scudo e autorizzazione alla raccolta. Configura il relay per accettare solo POST /v1/challenge e /v1/audit-session, verificare origine e sessione, limitare la frequenza e inoltrare il JSON con la chiave server restituendo stato e JSON originali.

Minuto 1. Copia web_sensor_sdk/scudo-sensor.js in /assets/scudo-sensor.js sul sito. Minuto 2. In un modulo eseguito dopo il consenso o altra autorizzazione applicabile, avvia una cattura. Interagisci con la pagina durante i 15 secondi del campione.

import {startScudoSensor} from '/assets/scudo-sensor.js';
const capture = await startScudoSensor(async (path, body) => {
  const r = await fetch('/scudo' + path, {method:'POST',
    headers:{'Content-Type':'application/json'}, body:JSON.stringify(body)});
  if (!r.ok) throw Error('Relay HTTP ' + r.status);
  return r.json();
});
await new Promise(done => setTimeout(done, 15000));
const result = await capture.audit();

Attendi una risposta challenge e una audit. Alla revoca chiama capture.cancel(). Dopo la scadenza avvia una nuova cattura e inviala entro 60 secondi.

KINETIPROOF™ / IT / 03

Esegui un audit dai tuoi strumenti

Esegui dalla radice del kit. plan.json è un piano QA con segnali misurati. session contiene integrità DOM osservata, eventi e flag untrusted per il client sensore Python.

CLI

python3 scudo_cli.py --audit-json plan.json --export-report ./reports-client

Python · relay HTTP locale

import json
from web_sensor_sdk.scudo_qa_sdk import ScudoQA
with open("session.json") as f:
    print(ScudoQA().audit(json.load(f)))

Node.js · CommonJS

const {ScudoClient} = require('./integrations/node_sdk');
const c = new ScudoClient(process.env.SCUDO_API_URL, process.env.SCUDO_API_KEY);
c.auditSession(require('./plan.json')).then(console.log).catch(e => {
  console.error(e.message); process.exitCode = 1;
});

Go

Nel tuo modulo richiedi scudo/biometric-sdk v0.0.0 e usa replace verso la cartella locale integrations/go_sdk. Importa il modulo come scudo insieme a context e os. Nella funzione, con un piano misurato:

c, err := scudo.NewClient(os.Getenv("SCUDO_API_URL"), os.Getenv("SCUDO_API_KEY"), nil)
if err != nil { return err }
_, err = c.AuditSession(context.Background(), plan)
return err

Playwright · Growth / Enterprise

Configura entrambe le variabili API nella CI e usa la fixture page del wrapper nel test esistente. Esercita puntatore, tastiera, clic e scroll. In caso di errore consulta scudo-reports.

const test = require('./integrations/playwright_plugin/scudo_playwright_hook')
  .playwright(require('@playwright/test').test);
KINETIPROOF™ / IT / 04

Leggi i nove quadranti del certificato

Su Growth o Enterprise invia POST /v1/generate-certificate con nonce appena ottenuto e piano misurato. Apri il contenuto certificates.html e conserva certificates.json. Verifica la firma con la chiave pubblica ricevuta separatamente dall’emittente.

IDMisura
T1Ritmo dei tasti e intervalli di pressione
T2Distribuzione delle durate di pressione
T3Sequenza di inserimenti e correzioni
M4Profilo di velocità del puntatore
M5Regolarità e quantizzazione del clock nei piani di clic
M6Posizione del clic rispetto al bersaglio
M7Tempi di sosta e cambi di focus
M8Inversioni rispetto alla direzione netta di scorrimento
M9Intervalli tra azioni successive
● Compatibile ▲ Anomalia ○ Non osservato
Verde: misura compatibile. Rosso: esamina l’ipotesi respinta e ripeti con un secondo campione. Grigio: prove insufficienti. Se M8 è grigio, acquisisci uno scorrimento reale prima del confronto.

Leggi il rischio complessivo insieme alla copertura dei quadranti. Un campione compatibile da solo non identifica la persona. Affida le decisioni sfavorevoli a un revisore umano.