KYC tracking
UCRM supports four KYC ownership models — pick once per tenant, override per-player when needed.
Models
kyc_model | Who initiates | Who decides | Webhooks accepted |
|---|---|---|---|
platform_owns | Casino platform | Platform | Yes — kyc.* lifecycle webhooks update CRM state |
crm_owns | CRM admin (POST /v1/players/:id/kyc/request) | CRM admin (POST .../approve) | No — UCRM rejects inbound kyc.* webhooks (403) |
dual | Either side | Either side (split by KYC level — basic via platform, source-of-funds via CRM) | Yes |
none | Nobody (test envs only) | — | No |
State machine
none → pending → verified
→ rejected
verified → expired (TTL refresh)
verified → pending (level upgrade)
rejected → pending (resubmit)
expired → pending (re-verify)
Forward-only. No verified → rejected (admin uses POST .../revoke which transitions to expired).
Levels
Operator-defined integer 0..10:
0— no KYC1— basic ID (passport / driver's license)2— address verification (utility bill)3— source of funds4+— operator-specific (enhanced due diligence, etc.)
Storage
players.kyc_status, players.kyc_level, players.kyc_history (append-only JSONB), players.kyc_last_event_at, players.kyc_expires_at (TTL for verified KYC).