Skip to content

User ​

FieldTypeNotes
idStringCUID
emailString, uniqueLowercased by validation
passwordHashStringbcrypt, 12 rounds
displayNameString, unique3–24 chars [A-Za-z0-9_]; uniqueness checked case-insensitively at registration
phoneString?Normalised to +234…
roleRoleDefault USER
statusUserStatusDefault ACTIVE
emailVerifiedBoolean
emailVerifyTokenHashString?, uniqueSHA-256 of the emailed token
passwordResetTokenHashString?, uniqueSHA-256 of the emailed token
passwordResetExpiresAtDateTime?1 hour after request
kycStatusKycStatusDefault UNVERIFIED
kycIdTypeKycIdType?
kycIdLast4String?Last four digits only
kycIdHashString?, uniqueHMAC-SHA256 of TYPE:number keyed with ENCRYPTION_KEY
kycFullNameString?Name as submitted
kycReferenceString?Smile ID job ID
kycSubmittedAt / kycReviewedAtDateTime?
stellarPublicKeyString, uniqueWallet address
stellarSecretEncStringAES-256-GCM iv.tag.ciphertext (base64)
createdAt / updatedAtDateTime

Select shapes ​

Services never return a raw user. Two shapes in src/lib/selects.js control exposure:

ShapeUsed forIncludes
publicUserSelectOther usersid, displayName, kycStatus, createdAt
sessionUserSelectThe logged-in userPublic fields + email, phone, role, status, verification flags, KYC type/last4, Stellar address

Secret, hash and token fields are never selected for API responses.

Nexlm is a peer-to-peer facilitator and never holds customer Naira.