Customer quickstart / Guida cliente
KINETIPROOF™ / EN / 01Activate 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 / 02Install the sensor in two minutes
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 / 03Run 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 / 04Read 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.
| ID | Measurement |
|---|
| T1 | Key rhythm and hold intervals |
|---|
| T2 | Distribution of key hold times |
|---|
| T3 | Insertion and correction sequence |
|---|
| M4 | Pointer velocity profile |
|---|
| M5 | Clock regularity and quantization in click plans |
|---|
| M6 | Click position relative to target |
|---|
| M7 | Dwell intervals and focus changes |
|---|
| M8 | Scroll reversals relative to net direction |
|---|
| M9 | Intervals between actions |
|---|
● Consistent ▲ Flagged ○ UnobservedGreen: 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 / 01Attiva 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 / 02Installa il sensore in due minuti
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 / 03Esegui 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 / 04Leggi 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.
| ID | Misura |
|---|
| T1 | Ritmo dei tasti e intervalli di pressione |
|---|
| T2 | Distribuzione delle durate di pressione |
|---|
| T3 | Sequenza di inserimenti e correzioni |
|---|
| M4 | Profilo di velocità del puntatore |
|---|
| M5 | Regolarità e quantizzazione del clock nei piani di clic |
|---|
| M6 | Posizione del clic rispetto al bersaglio |
|---|
| M7 | Tempi di sosta e cambi di focus |
|---|
| M8 | Inversioni rispetto alla direzione netta di scorrimento |
|---|
| M9 | Intervalli tra azioni successive |
|---|
● Compatibile ▲ Anomalia ○ Non osservatoVerde: 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.