Integration guide

Integrate Missing Linx™ into your bank's stack

A complete enterprise rollout — from signup to a live, signed event stream — in under a week. Backed by real solutions engineers.

Your rollout, step by step

Every enterprise customer follows the same six-step path.

STEP 01

Create your enterprise workspace

Sign up, tell us about your bank or platform, your traffic volume, and the systems you need to protect.

Start onboarding
STEP 02

Connect with a solutions engineer

A real engineer joins your private thread within hours. They map your ACH flows, compliance scope, and risk policy.

STEP 03

Provision API keys & sandbox

Test keys instantly. Production keys after a 30-minute compliance review. Rotate or revoke any key in one click.

STEP 04

Wire the Risk Score API

One POST per transaction returns PASS / REVIEW / BLOCK with a 0–1000 score and forensic layer breakdown.

STEP 05

Receive signed webhook events

We push verified events (decision_changed, anomaly_detected, identity_break) to your endpoint with HMAC signatures.

STEP 06

Stream realtime intelligence

Subscribe to a live event stream for fraud feeds, latency telemetry, and engine status — sub-second updates.

REST API · /v1/score

Score every transaction in <120ms

One endpoint, seven scoring layers, deterministic PASS / REVIEW / BLOCK decisions you can route through your existing ACH or core banking pipeline.

  • p50 latency 38ms / p99 119ms
  • Signed responses (HMAC-SHA256)
  • Idempotent via request_id
  • SDKs: Node, Python, Go, Java
curl -X POST https://api.missinglinx.io/v1/score \
  -H "Authorization: Bearer ml_live_••••••" \
  -H "Content-Type: application/json" \
  -d '{
    "request_id": "txn_8421",
    "subject": { "id": "acct_91", "email": "j@bank.com" },
    "context": { "ip": "8.8.8.8", "device_id": "d_42" },
    "transaction": { "amount": 24800, "currency": "USD", "type": "ach_debit" }
  }'
{
  "decision": "REVIEW",
  "score": 642,
  "layers": {
    "identity": 0.91, "behavior": 0.58, "network": 0.44,
    "device": 0.77, "velocity": 0.39, "consortium": 0.81, "intent": 0.62
  },
  "request_id": "txn_8421",
  "signature": "v1=8f2d..."
}
// Verify an incoming Missing Linx webhook (Node / TS)
import crypto from "node:crypto";

export function verify(signature: string, raw: string, secret: string) {
  const expected = crypto.createHmac("sha256", secret).update(raw).digest("hex");
  return crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected));
}

// Events you can subscribe to:
//   decision.changed     identity.break     anomaly.detected
//   chargeback.linked    license.quota_low  key.rotated
Signed webhooks

Push, don't poll

Every webhook is signed with your tenant secret and includes a replay-protection timestamp. Retries with exponential backoff up to 24 hours.

Realtime stream

Sub-second intelligence feed

Subscribe over WebSocket or Kafka. Used by fraud ops teams for live dashboards and SOAR pipelines.

// Realtime fraud feed (WebSocket)
const ws = new WebSocket("wss://stream.missinglinx.io/v1/events?token=ml_live_••••");

ws.onmessage = (e) => {
  const evt = JSON.parse(e.data);
  // { type: "score", decision: "BLOCK", score: 911, layers: {...}, ts: ... }
  pipeline.ingest(evt);
};
Drop-in React component

Copy-paste <VerifyButton /> into any website or app

One file. No SDK install. Submits identity verification to/api/public/v1/verify/identityand renders a PASS / REVIEW / BLOCK pill with the trust score.

  • Works in Next.js, Vite, Remix, CRA — any React 17+ app
  • Zero dependencies (Tailwind classes optional)
  • Color-coded result: green = PASS, amber = REVIEW, red = BLOCK
  • onResult callback to wire into your own UI / DB
  • For production, proxy the API key through your backend
Get a verify-scoped API key
// VerifyButton.tsx — drop into any React app (Next.js, Vite, Remix, CRA)
// Tailwind classes are optional — swap for your own styles.
import { useState } from "react";

type Decision = "PASS" | "REVIEW" | "BLOCK";
type Result = {
  decision: Decision;
  trust_score: number;
  subject_ref: string;
  factors?: { name: string; score: number }[];
};

export function VerifyButton({
  apiBase = "https://missing-linx-engine.lovable.app",
  apiKey,           // mlx_live_xxx with "verify" scope
  subject,          // { subject_ref, full_name, email, phone?, dob? }
  onResult,
  label = "Verify identity",
}: {
  apiBase?: string;
  apiKey: string;
  subject: {
    subject_ref: string;
    full_name: string;
    email: string;
    phone?: string;
    dob?: string;
  };
  onResult?: (r: Result) => void;
  label?: string;
}) {
  const [loading, setLoading] = useState(false);
  const [result, setResult]   = useState<Result | null>(null);
  const [error, setError]     = useState<string | null>(null);

  async function run() {
    setLoading(true); setError(null); setResult(null);
    try {
      const res = await fetch(`${apiBase}/api/public/v1/verify/identity`, {
        method: "POST",
        headers: {
          "Authorization": `Bearer ${apiKey}`,
          "Content-Type": "application/json",
        },
        body: JSON.stringify(subject),
      });
      const data = await res.json();
      if (!res.ok) throw new Error(data?.error ?? `HTTP ${res.status}`);
      setResult(data as Result);
      onResult?.(data as Result);
    } catch (e: any) {
      setError(e.message ?? "Verification failed");
    } finally {
      setLoading(false);
    }
  }

  const tone =
    result?.decision === "PASS"   ? "bg-green-100 text-green-800 border-green-300" :
    result?.decision === "REVIEW" ? "bg-amber-100 text-amber-800 border-amber-300" :
    result?.decision === "BLOCK"  ? "bg-red-100 text-red-800 border-red-300"     : "";

  return (
    <div className="space-y-3">
      <button
        onClick={run}
        disabled={loading}
        className="rounded-md bg-black px-4 py-2 text-sm font-semibold text-white disabled:opacity-60"
      >
        {loading ? "Verifying…" : label}
      </button>

      {error && (
        <p className="text-sm text-red-600">{error}</p>
      )}

      {result && (
        <div className={`rounded-lg border p-3 text-sm ${tone}`}>
          <div className="flex items-center justify-between">
            <span className="font-bold">{result.decision}</span>
            <span className="font-mono">Trust {result.trust_score}/100</span>
          </div>
          <p className="mt-1 text-xs opacity-80">Subject: {result.subject_ref}</p>
        </div>
      )}
    </div>
  );
}

// ── Usage ───────────────────────────────────────────────
// <VerifyButton
//   apiKey={process.env.NEXT_PUBLIC_MLX_KEY!}   // proxy via your backend in production
//   subject={{
//     subject_ref: "user_12345",
//     full_name:   "Jane Doe",
//     email:       "jane@example.com",
//     phone:       "+15551234567",
//     dob:         "1990-04-12",
//   }}
//   onResult={(r) => console.log("MLX:", r)}
// />

Ready when your compliance team is.

SOC 2 Type II · ISO 27001 · PCI DSS · GDPR · MSA & DPA ready.

Start enterprise onboarding