KYTRIX Developer documentation Financial Crime Control Plane

Financial Crime Control Plane

KYTRIX developer documentation

Send us what your business does. Get back alerts, episodes and a risk posture you can act on — with the evidence attached.

Payload schema_version 2026-09-01 · generated from @kytrix/contracts

#Start here

If you are integrating for the first time, read the integration guide end to end once before writing code. It is ordered the way the work is: sign a request, get money and time right, retry safely, handle errors, receive webhooks, prove it with the conformance CLI.

#What KYTRIX is

A financial-crime control plane. You send facts about your business — customers, accounts, instruments, movements, relationships and what your own controls did. KYTRIX builds a canonical model and a behavioural and network picture on top of it, and hands back alerts, episodes and a banded risk posture.

#The shape of it

You sendYou read back
POST /v1/parties · /accounts · /instruments · /movements · /relationships · /control-events — one event, or up to 1000 mixed events on POST /v1/batchesGET /v1/events/{id} for processing status · GET /v1/posture/... for a band · GET /v1/alerts and /v1/episodes for findings · canonical reads for what KYTRIX made of your data
POST /v1/validate — the dry-run: identical validation, stores nothingSigned webhooks for alert.opened, episode.escalated, recommendation.issued and 16 more

#The shortest real request

Every request is HMAC-signed; there is no bearer token. The dry-run is the right first call because it proves your signing without writing anything:

typescript
import { KytrixClient } from '@kytrix/sdk';

const kytrix = new KytrixClient({
  baseUrl: process.env.KYTRIX_BASE_URL!,   // https://api.kytrix.io
  keyId:   process.env.KYTRIX_KEY_ID!,     // kx_test_… in the sandbox
  secret:  process.env.KYTRIX_API_SECRET!, // shown once at key creation
});

const report = await kytrix.validate({
  object: 'movement',
  event: {
    external_id: 'ledger-8842',
    schema_version: '2026-09-01',
    occurred_at: '2026-09-02T09:15:00-04:00',
    data: {
      type: 'p2p',
      status: 'completed',
      amount: { value: '180000', asset: 'DOP', scale: 2 },   // 1,800.00 DOP — a STRING
      debit:  { account_id: 'wallet-1' },
      credit: { account_id: 'wallet-2' },
    },
  },
});

console.log(report.valid, report.results);

Not on Node? The integration guide has the same request as plain HTTP, with a dependency-free signing implementation that is executed against the published test vectors every time these docs are built.

#The three things people get wrong

TrapWhat happensDo this
Money as a floatSilently wrong by a factor of 100. No error, ever — just a monitoring system watching the wrong thresholds.One tested conversion helper. { value: "180000", asset: "DOP", scale: 2 }, value always a string of minor units. More
Re-serializing the body after signingEvery request fails with kytrix:auth/invalid_signature and the cause is invisible.Serialize once; hash and send the same buffer. More
An idempotency key that changes per attemptA retry after a lost response creates a second movement.Derive the key from a durable id — your outbox row. More

#How these docs are produced

The API reference, the error catalog, the webhook catalog and the worksheet’s target paths are generated from the same zod schemas the server validates against, at build time. A hand-maintained reference drifts from the contract; this one cannot.