Crypto-as-a-Service: Complete KYC Verification (EU Unregulated)
Verify your EU end users with KYC and IDV, including the deposit-verification flow. See the Guide.
-
You submit basic KYC information for your EU end user with
transactionType: "euIndividual". BitGo returns the identityidand a status ofinitiating. ThelastKycCompletionDatemust be within the last two years of the request.API Reference: Create KYC Identity
-
You poll the KYC status to determine next steps. The status moves through
initiating,in review,awaiting signature, and ends atapprovedordeclined.API Reference: Get KYC Identity
-
After BitGo approves the KYC verification, your end user signs to confirm. The required
contractTypevalues depend on your organization's agreements with BitGo.API Reference: Submit KYC Signatures
-
You start the IDV process and receive a BitGo-hosted WebSDK link for your end user. Pass
verificationType: "deposit-verification"for the in-house deposit flow: the end user completes a liveness check, then sends a SEPA transfer of any amount above €0.01 to a per-client vIBAN. BitGo sends the deposit instructions to you in a webhook and can retry deposits to the same vIBAN for up to 30 days.The cURL tab also includes the request for reusing an existing Sumsub applicant with a
sumsubShareToken.API Reference: Initiate Sumsub IDV for a user
-
You poll the IDV status for your end user. For
deposit-verification, the endpoint keeps returningpendinguntil the Trust review is complete. BitGo also sends anidvStatuswebhook with the statusliveness_completewhen the end user's liveness check passes.API Reference: Get Sumsub IDV status
-
If an end user's IDV is in
pendingoraction_requiredstate, you can switch them to another verification type and receive a fresh WebSDK link. Switching fromdeposit-verificationisn't available yet.
// 1. Submit KYC
export SERVICE_USER_TOKEN="<SERVICE_USER_ACCESS_TOKEN>"
export ORGANIZATION_ID="<YOUR_ORGANIZATION_ID>"
curl -X POST \
https://app.bitgo-test.com/api/evs/v1/identity \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $SERVICE_USER_TOKEN" \
-d '{
"enterpriseId": "59cd72485007a239fb00282ed480da1f",
"userId": "67d28e3dea178ede86f2962e959865a0",
"organizationId": "'"$ORGANIZATION_ID"'",
"externalUserId": "external-user-hans-mueller-001",
"transactionType": "euIndividual",
"nameFirst": "Hans",
"nameLast": "Müller",
"dateOfBirth": {
"year": "1985",
"month": "06",
"day": "15"
},
"cityOfBirth": "Frankfurt am Main",
"countryOfBirth": "DEU",
"countryOfCitizenship": "DEU",
"countryOfResidence": "DEU",
"taxId": "12345678901",
"countryOfTaxResidence": "DEU",
"industry": "Software & IT Services",
"employmentStatus": "Employee",
"sourceOfFunds": "Income from Employment",
"email": "hans.mueller@example.com",
"phoneNumber": "+4969123456789",
"politicallyExposedPerson": false,
"idvPerformed": false,
"initialKycCompletionDate": {
"year": "<INITIAL_KYC_YEAR>",
"month": "<INITIAL_KYC_MONTH>",
"day": "<INITIAL_KYC_DAY>"
},
"lastKycCompletionDate": {
"year": "<LAST_KYC_YEAR_WITHIN_2_YEARS>",
"month": "<LAST_KYC_MONTH>",
"day": "<LAST_KYC_DAY>"
},
"addressStreet1": "Mainzer Landstraße 50",
"addressCity": "Frankfurt am Main",
"addressPostalCode": "60325",
"debugStatus": "passed",
"debugFailureReason": ""
}'
// 2. (Optional) Check KYC Status
export ENTERPRISE_ID="<CHILD_ENTERPRISE_ID>"
export IDENTITY_ID="<END_USER_IDENTITY_ID>"
curl -X GET \
"https://app.bitgo-test.com/api/evs/v1/identity?organizationId=$ORGANIZATION_ID&enterpriseId=$ENTERPRISE_ID&identityId=$IDENTITY_ID" \
-H "Authorization: Bearer $SERVICE_USER_TOKEN"
// 3. Sign Completed KYC
curl -X POST \
"https://app.bitgo-test.com/api/evs/v1/identity/$IDENTITY_ID/signatures" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $SERVICE_USER_TOKEN" \
-d '[
{
"contractSignerNameFull": "Hans Müller",
"contractSignedDate": "2025-03-13 13:14:09.767480+00:00",
"contractSignedIPAddress": "123.123.123.123",
"contractVersion": "1.0",
"contractType": "<EU_CONTRACT_TYPE>",
"userAgreesToTerms": true
}
]'
// 4. Initiate IDV
curl -X POST \
https://app.bitgo-test.com/api/sumsub-service/v1/idv \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $SERVICE_USER_TOKEN" \
-d '{
"userId": "<END_USER_USER_ID>",
"enterpriseId": "'"$ENTERPRISE_ID"'",
"verificationType": "<VERIFICATION_TYPE>"
}'
// 5. (Optional) Check IDV Status
export IDV_ID="<IDV_ID>"
curl -X GET \
"https://app.bitgo-test.com/api/sumsub-service/v1/idv/$IDV_ID" \
-H "Authorization: Bearer $SERVICE_USER_TOKEN"
// 6. (Optional) Switch Verification Type
curl -X POST \
"https://app.bitgo-test.com/api/sumsub-service/v1/idv/$IDV_ID/change-verification-type" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $SERVICE_USER_TOKEN" \
-d '{
"verificationType": "video-id"
}'
// 1. Submit KYC
// Use the cURL tab for this step
// 2. (Optional) Check KYC Status
import superagent from 'superagent';
const SERVICE_USER_TOKEN = '<SERVICE_USER_ACCESS_TOKEN>';
const organizationId = '<YOUR_ORGANIZATION_ID>';
const enterpriseId = '<CHILD_ENTERPRISE_ID>';
const identityId = '<END_USER_IDENTITY_ID>';
const apiUrl = `https://app.bitgo-test.com/api/evs/v1/identity?organizationId=${organizationId}&enterpriseId=${enterpriseId}&identityId=${identityId}`;
const response = await superagent
.get(apiUrl)
.set('Authorization', `Bearer ${SERVICE_USER_TOKEN}`);
// 3. Sign Completed KYC
// Use the cURL tab for this step
// 4. Initiate IDV
// Use the cURL tab for this step
// 5. (Optional) Check IDV Status
// Use the cURL tab for this step
// 6. (Optional) Switch Verification Type
// Use the cURL tab for this step
// 1. Submit KYC Response
{
"id": "993ec85b-ad23-4259-bde5-703a071a0783",
"status": "initiating"
}
// 2. (Optional) Check KYC Status Response
{
"identities": [
{
"id": "5436ff2e-1129-49f1-8334-1510955ffe00",
"status": "in review",
"organizationId": "68928b9066417fe09212fe9965c88552",
"enterpriseId": "690a234346b3252214cdaf72070c549e",
"userId": "690a234046b3252214cdadfe8600df80",
"createdAt": "2025-11-04T16:05:15.359Z",
"updatedAt": "2025-11-04T16:05:17.975Z",
"signaturesSubmitted": [],
"signaturesRequired": []
}
]
}
// 3. Sign Completed KYC Response
{
"id": "cf5d766d-bef1-4874-8b02-54ded0e8333e",
"status": "signature submitted",
"organizationId": "6573806ef79cafdd1aff42fbffc2ab20",
"enterpriseId": "67d28e40ea178ede86f296ac90032286",
"userId": "67d28e3dea178ede86f2962e959865a0",
"updatedAt": "2025-03-13T07:59:52.564Z",
"createdAt": "2025-03-13T07:54:18.842Z",
"errorDescription": "",
"signaturesSubmitted": ["<CONTRACT_TYPE_1>", "<CONTRACT_TYPE_2>"],
"signaturesRequired": []
}
// 4. Initiate IDV Response
{
"idvId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "pending",
"url": "https://verify.example.com/p/abc123...",
"expiresAt": "2026-05-01T12:00:00Z"
}
// 5. (Optional) Check IDV Status Response
{
"idvId": "98f20884-f3ce-4949-a969-4a6010ae00e1",
"status": "approved",
"verificationType": "deposit-verification",
"userId": "69fce210ac533caa20ef5bdcfc2ef3d4",
"enterpriseId": "69fce212ac533caa20ef5c13ff183e84",
"organizationId": "69e291d44afc2b668a3ac76d16fef106",
"rejectLabels": null
}
// 6. (Optional) Switch Verification Type Response
{
"url": "https://verify.example.com/p/xyz789...",
"expiresAt": "2026-05-01T12:00:00Z"
}