An AML platform engineers don't dread.
A small, well-documented API. SDKs that sign, retry and fail open for you. A sandbox that's free forever. Your first event can be in Sentinel before lunch.
const { SentinelClient } = require('@airvend/sentinel-client')
const sentinel = new SentinelClient({ url, apiKey, secret })
// Ask before money moves. Times out at 300 ms and fails open.
const decision = await sentinel.decide({
subject: { external_id: 'cus_8812', bvn, tier: '2' },
transaction: { reference, direction: 'out', type: 'transfer', amount: 4_850_000 },
context: { ip, device_id },
})
if (decision.outcome === 'block') return refuse()
if (decision.outcome === 'review') return stepUpAuth()
use Sentinel\Client\Laravel\Sentinel;
// Before debiting on risky flows
$decision = Sentinel::decide(
['external_id' => $user->id, 'bvn' => $user->bvn],
['reference' => $ref, 'direction' => 'out',
'type' => 'transfer', 'amount' => 4850000],
);
if ($decision->blocked()) { /* refuse */ }
if ($decision->needsReview()) { /* hold or step up */ }
// After every transaction (queued, never throws)
Sentinel::transaction($subject, $tx + ['status' => 'success']);
from sentinel_client import SentinelClient
sentinel = SentinelClient(url=URL, api_key=KEY, secret=SECRET)
decision = sentinel.decide(
{"external_id": "cus_8812", "bvn": bvn},
{"reference": ref, "direction": "out",
"type": "transfer", "amount": 4850000},
SentinelClient.context_from_request(request),
)
if decision["outcome"] == "block":
raise PaymentBlocked()
// POST /api/v1/decisions → 200
{
"outcome": "review",
"score": 64,
"reasons": [
{ "rule": "GLB_STRUCTURING_IN", "action": "review",
"reason": "3 transfers in 7 days just under ₦5m" },
{ "rule": "GLB_NEW_DEVICE_HIGH_VALUE", "action": "review",
"reason": "High value from a device first seen today" }
],
"decision_id": 991,
"latency_ms": 12
}
Three calls cover almost everything.
Report what happened
Send transactions, logins and customer updates, one at a time or up to 100 per request. Idempotent on event_id, so retries are always safe. Rules run within seconds.
Ask before money moves
Get allow, review or block with a score and the reasons, in milliseconds. Call it with a short timeout and fail open.
Verify an identity
Check a BVN, NIN, CAC number, bank account or phone number with name and date-of-birth matching. Results attach to the customer automatically.
Official libraries for your stack.
Server SDKs handle request signing, retries, queueing and fail-open behaviour. Device SDKs give every device a stable token and report emulator, root, automation and tampering signals.
Node.js
Promise-based client with an optional Bull queue for reliable delivery.
npm install @airvend/sentinel-client
PHP · Laravel
Facade, middleware that captures request context, and queued delivery.
composer require airvend/sentinel-client
Python
Sync and async clients, plus webhook signature verification.
pip install sentinel-client
Web
A small script for your web app's login, signup and checkout pages.
npm install @airvend/sentinel-device
Android
Android 6.0+ with no third-party dependencies.
com.sentinel-tms:sentinel-device
iOS
Swift Package Manager and CocoaPods.
pod 'SentinelDevice'
React the moment something happens.
Subscribe your systems to alerts, decisions, cases, screening matches and identity checks. Every delivery is signed with HMAC-SHA256 and a timestamp, and retried if your endpoint is down.
// Headers on every webhook delivery
X-Sentinel-Event: decision.blocked
X-Sentinel-Delivery: 7c1e0b9a-…
X-Sentinel-Signature: t=1790685666,v1=5f2c…
// Verify: HMAC_SHA256(secret, "<t>.<raw body>") == v1
{
"id": "7c1e0b9a-…",
"type": "decision.blocked",
"created_at": "2026-10-01T09:41:02+01:00",
"data": { "decision_id": 991, "score": 86, … }
}
From sandbox to production
Get sandbox keys
Sign up and create an integration. Sandbox keys start with stl_test_ and are free forever.
Send events
Report every transaction state change, login and KYC update. Watch them arrive in the dashboard's API log.
Add decisions
Call the decisions API on payouts and transfers, with a 300 ms timeout and fail-open.
Go live
Swap in stl_live_ keys, restrict them to your server IPs, and subscribe to webhooks.
See Sentinel on your own transaction patterns.
Book a 30-minute walkthrough with our team, or start in the free sandbox today and send your first event in minutes.