Skip to main content

Documentation Index

Fetch the complete documentation index at: https://ventra.mintlify.app/llms.txt

Use this file to discover all available pages before exploring further.

Anti-money-laundering monitoring is run in-house — no third-party vendor. Real-time on big withdrawals; fire-and-forget for everything else, with pattern detection in the background and webhooks within 5 minutes.
Never expose rule codes, descriptions, or risk scores to end users. Tipping-off prohibitions apply. Use generic language only (“Account under review”).

Hybrid model

PathTriggerLatency
Real-timePOST /v1/aml/screenWithdrawals ≥ USD 10,000< 200 ms — returns allow / hold / reject
AsyncPOST /v1/aml/eventAll other transactions202 acknowledgement < 50 ms; webhook within 5 min if a rule trips

Rule catalogue

CodePatternTriggerModeSeverity
R-001Large withdrawalSingle withdrawal ≥ USD 10Kreal-time7
R-002Velocity5+ deposits in 1 hourasync6
R-003Structuring10+ deposits within $100 of a KYC tier in 7 daysasync9
R-004Minimal playDeposit > $5K with < 5% wagered in next 24hasync7
R-005Round-trippingDeposit + withdrawal within 5% within 24hasync8
R-006Multi-accountSame payment_method_fingerprint on 3+ usersasync8
R-007Geographic anomalyLogin country ≠ deposit country in same sessionasync5
R-008Dormant reactivation90+ days idle then >$5K activity in 24hasync6
risk_score = min(sum(triggered_severities) × 10, 100). Decision: <50 allow · 50–79 hold · 80+ reject.

Endpoints

MethodPathDescription
POST/v1/aml/screenReal-time check for large withdrawals. Mandatory ≥ $10K.
POST/v1/aml/eventFire-and-forget transaction event. Idempotent on (tenant, transaction_id).
GET/v1/aml/casesOpen and closed AML cases for a user.

POST /v1/aml/screen

curl https://sandbox.api.anunnakielite.com/v1/aml/screen \
  -H "Authorization: Bearer cur_sk_test_EXAMPLEKEY123456789012345678901234" \
  -H "Content-Type: application/json" \
  -d '{
    "user_id": "rt_usr_8a2f1c",
    "withdrawal_id": "wd_99f02a",
    "amount_cents": 1500000,
    "currency": "USD",
    "payment_method": "wire",
    "destination_country": "FR"
  }'
Allow:
{
  "decision": "allow",
  "user_id": "rt_usr_8a2f1c",
  "withdrawal_id": "wd_99f02a",
  "rules_evaluated": ["R-001"],
  "rules_triggered": [],
  "risk_score": 12
}
Hold:
{
  "decision": "hold",
  "user_id": "rt_usr_8a2f1c",
  "withdrawal_id": "wd_99f02a",
  "case_id": "aml_case_42a1",
  "rules_triggered": ["R-001", "R-005"],
  "risk_score": 78,
  "user_message": "Withdrawal under review. We will contact you within 48 hours.",
  "estimated_review_time": "24-48h"
}
Decision handling: allow → release; hold → keep funds blocked, await aml.cleared webhook; reject → return funds to player balance, log for SAR filing, do not process payout.

POST /v1/aml/event

Stream every deposit, wager, withdrawal, settlement, login, and account update.
curl https://sandbox.api.anunnakielite.com/v1/aml/event \
  -H "Authorization: Bearer cur_sk_test_EXAMPLEKEY123456789012345678901234" \
  -H "Content-Type: application/json" \
  -d '{
    "user_id": "rt_usr_8a2f1c",
    "event_type": "deposit",
    "transaction_id": "tx_8a2f1c",
    "amount_cents": 250000,
    "currency": "USD",
    "payment_method": "card",
    "metadata": {
      "ip_country": "FR",
      "card_country": "FR",
      "session_id": "sess_a1b2c3"
    },
    "occurred_at": "2026-05-24T15:02:00Z"
  }'
Acknowledgement (always 202 Accepted):
{
  "event_id": "aml_evt_99f02a",
  "transaction_id": "tx_8a2f1c",
  "received_at": "2026-05-24T15:02:00.234Z",
  "processing": "queued"
}
Event typeWhen to send
depositEvery deposit attempt — success and failure.
withdrawalEvery withdrawal request, including under $10K.
wagerEvery bet placed (settled or pending).
settlementEvery market settlement with player payouts.
loginEvery player login (used for R-007 geographic anomaly).
account_updatePayment method or address change.
A duplicate transaction_id returns processing: "duplicate_already_queued" without reprocessing.

GET /v1/aml/cases

Returns case codes only — never rule descriptions or context data.
{
  "user_id": "rt_usr_8a2f1c",
  "open_cases": 1,
  "cases": [
    {
      "case_id": "aml_case_42a1",
      "opened_at": "2026-05-24T15:07:22Z",
      "status": "under_review",
      "rules_triggered": ["R-003", "R-005"],
      "risk_score": 65
    }
  ]
}

Webhooks

EventFires when
aml.flaggedAn async rule tripped — case opened.
aml.heldReal-time hold confirmed by compliance — funds blocked.
aml.clearedCase reviewed and dismissed — release funds.
aml.escalatedCase requires SAR (Suspicious Activity Report) filing.
aml.account_frozenAccount suspended pending investigation.
{
  "event": "aml.flagged",
  "event_id": "evt_aml_a1b2c3",
  "timestamp": "2026-05-24T15:07:22Z",
  "data": {
    "case_id": "aml_case_42a1",
    "user_id": "rt_usr_8a2f1c",
    "rules_triggered": ["R-003", "R-005"],
    "risk_score": 65,
    "recommended_action": "review_user_activity",
    "transactions_to_review": ["tx_8a2f1c", "tx_3d4e5f"]
  }
}
Webhook payloads include rule codes only — never descriptions or rule context.

Operator policy

  • Vendor: in-house (no third-party — cheaper, full control).
  • Hybrid: real-time on USD 10K+, async on everything else.
  • Rule count: 8 at launch; tuned monthly based on false-positive rates.
  • Review SLA: 48 hours.
  • SAR filing: Anunnaki files reports with the KGC where required.

Error codes

StatusCode
400invalid_event
401unauthorized
409duplicate_event (safe to ignore)
429rate_limited (1000/min on /aml/event)
503queue_unavailable (retry with backoff)