Crypto-as-a-Service: Complete KYC Verification (EU Regulated)
Verify your EU end users with KYC. See the Guide.
-
You submit KYC information for your EU end user with
transactionType: "euIndividual". BitGo returns the identityidand a status ofinitiating. For EU regulated enterprises, the four government ID fields (govIdType,govIdNumber,govIdExpiry,govIdCountryOfIssuance) are required. 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, andawaiting signature, and ends atapprovedordeclined. Pass both the organization ID and the enterprise ID.API Reference: Get KYC Identity
-
When the KYC status is
awaiting signature, your end user signs to confirm. Your organization's agreements with BitGo determine the requiredcontractTypevalues.API Reference: Submit KYC Signatures
// 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": true,
"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>"
},
"govIdType": "pp",
"govIdNumber": "C01X00T47",
"govIdExpiry": {
"year": "2030",
"month": "12",
"day": "31"
},
"govIdCountryOfIssuance": "DEU",
"addressStreet1": "Mainzer Landstraße 50",
"addressCity": "Frankfurt am Main",
"addressPostalCode": "60325",
"debugStatus": "passed",
"debugFailureReason": ""
}'
// 2. 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
}
]'
// 1. Submit KYC
// Use the cURL tab for this step
// 2. 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
// 1. Submit KYC Response
{
"id": "993ec85b-ad23-4259-bde5-703a071a0783",
"status": "initiating"
}
// 2. 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": []
}