Skip to main content
POST
Creates a new user and initiates KYC verification through Persona. Returns a verificationUrl where the user completes identity verification. This is the v2 flow using Persona for KYC — it requires fewer fields than the legacy v1 endpoint and provides a smoother verification experience.
string
required
Bearer token. Example: Bearer sk_staging_your_api_key
string
required
Unique key to prevent duplicate user creation. Use a UUID.
string
required
User’s first name. 1-100 characters.
string
required
User’s last name. 1-100 characters.
string
required
User’s email address. Must be unique across your partner account.
string
required
International phone number. Example: +14155555555
string
required
Purpose of the account. 1-200 characters. Example: personal use, business expenses.
string
required
User’s IP address at the time of registration.
boolean
required
Must be true. Confirms the user has accepted the terms of service.
string
required
Card program type. Either custodial or non_custodial.
string
Ethereum wallet address. Required if program is non_custodial.
string
HTTPS URL to redirect the user after Persona verification. Overrides the default redirect URL set in your profile.
string
required
User’s street address. 1-500 characters. Example: 123 Main Street.
string
required
User’s city. 1-100 characters.
string
required
User’s state or region. 1-100 characters. Example: CA, Lagos.
string
required
User’s postal/zip code. 1-20 characters.
string
required
ISO 3166-1 alpha-2 country code of the user’s country of residence. Example: US, KE, NG.

After User Creation

  1. Redirect the user to the verificationUrl to complete Persona KYC
  2. After verification, the user is redirected to your configured redirect URL with ?referenceId={serviceId}
  3. Listen for KYC webhook events to know when the user is approved
  4. Once approved (user.kyc.approved), you can create a card for the user

Sandbox Testing

In the staging environment, you can control the KYC outcome by appending a keyword to the user’s lastName field. This lets you test each scenario without going through real identity verification.
The keyword is case-sensitive and must be appended to the end of the last name with no spaces or separators.

Example Webhook Payloads

Approved
Denied
Needs Verification
verificationLink is only present on needsVerification events. reason is only present on denied events and contains one or more comma-separated denial codes.