KYC and KYB

Identity verification is required for many payment and OTC flows. The API chooses KYC vs KYB from the active team and role — you do not pick a mode in the request body.

Prerequisites#

  • Session from OTP onboarding for the profile you want to verify
  • For business admin on a business team: KYB applies
  • Otherwise: individual KYC applies

Check current status before creating a new verification attempt.

1. Check verification status#

curl -sS https://api-stg.vudy.app/v1/kyc/status \
  -H "x-api-key: vudy_sandbox_YOUR_KEY" \
  -H "Authorization: Bearer SESSION_JWT"

If data.isVerified is true, continue to the gated workflow. Otherwise create a verification session.

2. Create a verification session#

Auth: API key + session. Context is the login profile/team.

curl -sS https://api-stg.vudy.app/v1/kyc/session \
  -H "x-api-key: vudy_sandbox_YOUR_KEY" \
  -H "Authorization: Bearer SESSION_JWT" \
  -H "Content-Type: application/json" \
  -d '{"email":"alex@example.com"}'
const { data } = await fetch("https://api-stg.vudy.app/v1/kyc/session", {
	method: "POST",
	headers: {
		"x-api-key": process.env.VUDY_API_KEY,
		Authorization: `Bearer ${session}`,
		"Content-Type": "application/json",
	},
	body: JSON.stringify({
		email: "alex@example.com",
		metadata: { source: "integration" }, // optional
	}),
}).then((r) => r.json());

// data: { sessionUrl, verificationId, status }
// Open sessionUrl for the hosted verification UI

Do not send x-profile-id expecting a different actor. The selected profile and team come from the session.

3. Open the hosted flow and poll status#

curl -sS https://api-stg.vudy.app/v1/kyc/status \
  -H "x-api-key: vudy_sandbox_YOUR_KEY" \
  -H "Authorization: Bearer SESSION_JWT"
const { data } = await fetch("https://api-stg.vudy.app/v1/kyc/status", {
	headers: {
		"x-api-key": process.env.VUDY_API_KEY,
		Authorization: `Bearer ${session}`,
	},
}).then((r) => r.json());
// { isVerified, status, verification }

Open sessionUrl for the user, then poll. isVerified is true when the applicable user KYC or team KYB is approved.

Status transitions#

Typical values:

none / not_startedin_progressin_review → terminal approved | declined | expired | abandoned | kyc_expired

Poll until a terminal state before starting gated payments or OTC create.

List prior user verifications#

curl -sS https://api-stg.vudy.app/v1/kyc/verifications \
  -H "x-api-key: vudy_sandbox_YOUR_KEY" \
  -H "Authorization: Bearer SESSION_JWT"

This lists user KYC records. For business-admin KYB, rely on GET /v1/kyc/status.

Compliance fee (when gated)#

Some OTC and channel flows require a paid yearly compliance fee. Check OTC gating (missing.complianceFee). To pay:

curl -sS https://api-stg.vudy.app/v1/compliance/checkout \
  -H "x-api-key: vudy_sandbox_YOUR_KEY" \
  -H "Authorization: Bearer SESSION_JWT" \
  -H "x-profile-id: PROFILE_UUID" \
  -H "x-team-id: TEAM_UUID" \
  -H "Content-Type: application/json" \
  -d '{"successUrl":"https://your.app/ok","cancelUrl":"https://your.app/cancel"}'

Next steps#