KYC assertion
Sub-Accounts & White-Label Retail KYC
/users/{userId}/kyc
KYC assertion
createKycAsserts the KYC status of a sub-account. MyStocks defers identity verification to your platform — you send us the result of your own KYC process. VERIFIED + BASIC is sufficient to unlock trading and asset subscriptions. FULL is required for higher transaction limits and private credit deals. REJECTED keeps the account gated and requires reasonCode plus customer-safe remediation text in reason; the response and kyc.updated webhook include reviewedAt. The reference field stores your internal KYC session ID for audit correlation. You may also attach an optional structured compliance profile (ID document type, date of birth, nationality, tax residency, PEP/sanctions screening result, risk rating, consent timestamp, evidence reference). Sensitive identifiers — idNumber and taxId — are stored as a sha256 fingerprint plus last-4 only and are never returned in full. All profile fields are optional and additive.
Parameters
userIdstringpathRequiredExample: usr_abc123
Headers
AuthorizationstringRequiredBearer sk_sandbox_<your_key> for sandbox requests.
Idempotency-KeystringheaderRequiredUnique string that makes write calls safe to retry on network failure. Required for money movement, trading, KYC, subscriptions, and webhook creation. Deduplicated for 24 hours -- duplicate keys return the cached response. HTTP 409 if a concurrent request with the same key is still in progress.
Example: dep_user42_1743152580
Request body
statusNONE | PENDING | VERIFIED | REJECTEDRequiredOverall KYC status of the user.
Example: "VERIFIED"
levelNONE | BASIC | FULLRequiredBASIC = government ID verified (sufficient for trading). FULL = address + enhanced due diligence.
Example: "BASIC"
providerstringName of the KYC provider that performed the verification (e.g. sumsub, smile_identity).
Example: "sumsub"
referencestringYour internal KYC session reference for audit correlation.
Example: "kyc_session_88721"
reasonCodestringRequired when status is REJECTED. Stable machine-readable rejection code.
Example: "DOCUMENT_EXPIRED"
reasonstringRequired when status is REJECTED. Human-readable remediation guidance safe to show to the customer.
Example: "Submit a current government-issued identity document."
idDocumentTypePASSPORT | NATIONAL_ID | DRIVERS_LICENSE | VOTERS_CARD | RESIDENCE_PERMIT | OTHERType of identity document verified during your KYC process.
Example: "NATIONAL_ID"
idNumberstringIdentity document number. Stored as a sha256 fingerprint plus the last 4 characters only — never persisted or returned in full. The response and webhook echo back idNumberLast4.
Example: "24681012"
dateOfBirthstringDate of birth in ISO YYYY-MM-DD format.
Example: "1990-04-17"
nationalitystringNationality as an ISO 3166-1 alpha-2 country code.
Example: "KE"
countryOfResidencestringCountry of residence as an ISO 3166-1 alpha-2 country code.
Example: "KE"
addressstringResidential address (free-form, up to 500 characters).
Example: "12 Kenyatta Ave, Nairobi"
taxResidencystringCountry of tax residency as an ISO 3166-1 alpha-2 country code.
Example: "KE"
taxIdstringTaxpayer identification number (TIN). Stored as a sha256 fingerprint plus the last 4 characters only — never persisted or returned in full. The response and webhook echo back taxIdLast4.
Example: "A012345678Z"
pepbooleanWhether the user is a politically exposed person.
Example: false
sanctionsResultCLEAR | FLAGGED | PENDINGResult of your sanctions/PEP screening.
Example: "CLEAR"
screeningProviderstringName of the sanctions/PEP screening provider.
Example: "comply_advantage"
riskRatingLOW | MEDIUM | HIGHRisk rating assigned to the user by your onboarding process.
Example: "LOW"
consentAtstringISO 8601 timestamp when the user granted consent for processing.
Example: "2026-07-11T09:30:00Z"
evidenceReferencestringYour reference/URL to the stored KYC evidence bundle for audit.
Example: "kyc_docs_88721"
employmentStatusEMPLOYED | SELF_EMPLOYED | UNEMPLOYED | STUDENT | RETIRED | OTHEREmployment status captured during onboarding.
Example: "EMPLOYED"
occupationstringUser occupation or role.
Example: "Software engineer"
employerNamestringEmployer or business name when available.
Example: "Acme Ltd"
sourceOfFundsunionSource of funds used for investing.
Example: "SALARY"
sourceOfWealthunionSource of accumulated wealth.
Example: "EMPLOYMENT_INCOME"
annualIncomeBandUNDER_10000 | 10000_50000 | 50000_100000 | 100000_250000 | 250000_1000000 | OVER_1000000Annual income band in USD-equivalent.
Example: "50000_100000"
netWorthBandUNDER_25000 | 25000_100000 | 100000_500000 | 500000_1000000 | 1000000_5000000 | OVER_5000000Net-worth band in USD-equivalent.
Example: "100000_500000"
investmentExperienceNONE | LIMITED | MODERATE | EXPERIENCED | PROFESSIONALUser's investing experience level.
Example: "LIMITED"
investmentObjectivesstring[]Investment objectives captured during suitability/appropriateness checks.
Example: ["GROWTH","RETIREMENT"]
riskToleranceLOW | MEDIUM | HIGHUser-declared or assessed risk tolerance.
Example: "MEDIUM"
suitabilityStatusNOT_ASSESSED | SUITABLE | UNSUITABLE | REVIEW_REQUIREDSuitability outcome assigned by your onboarding process.
Example: "SUITABLE"
appropriatenessStatusNOT_ASSESSED | SUITABLE | UNSUITABLE | REVIEW_REQUIREDAppropriateness outcome for execution-only brokerage products.
Example: "SUITABLE"
assessmentReferencestringYour suitability/appropriateness assessment reference.
Example: "suitability_88721"
usPersonbooleanFATCA US-person declaration.
Example: false
fatcaStatusNOT_US_PERSON | US_PERSON | EXEMPT | UNKNOWNFATCA classification asserted by your onboarding flow.
Example: "NOT_US_PERSON"
crsTaxResidenciesobject[]CRS tax residencies. Tax IDs are stored as sha256 fingerprint plus last4 only.
crsTaxResidencies[].countrystringRequiredExample: "KE"
crsTaxResidencies[].taxIdstringStored as fingerprint + last4 only.
Example: "A012345678Z"
crsTaxResidencies[].reasonNoTinstringReason no TIN was supplied, if applicable.
marketAccountReferencesobject[]Market-specific brokerage/CSD account references. Account numbers are stored as fingerprint plus last4 only.
marketAccountReferences[].marketstringRequiredExample: "NSE"
marketAccountReferences[].brokerstringExample: "MyStocks Securities"
marketAccountReferences[].brokerAccountNumberstringStored as fingerprint + last4 only.
marketAccountReferences[].csdNumberstringStored as fingerprint + last4 only.
Response fields
messagestringkycStatusNONE | PENDING | VERIFIED | REJECTEDkycLevelNONE | BASIC | FULLreasonCodestring | nullreasonstring | nullreviewedAtstring | nullprofileobjectEcho of the compliance fields asserted on this call (present only when a profile was supplied). Sensitive identifiers appear as idNumberLast4 / taxIdLast4 — never in full.
Response codes
200KYC status updated.