Crypto-as-a-Service: Complete KYC Verification (EU Regulated)

Verify your EU end users with KYC. See the Guide.

  1. You submit KYC information for your EU end user with transactionType: "euIndividual". BitGo returns the identity id and a status of initiating. For EU regulated enterprises, the four government ID fields (govIdType, govIdNumber, govIdExpiry, govIdCountryOfIssuance) are required. The lastKycCompletionDate must be within the last two years of the request.

    API Reference: Create KYC Identity

  2. You poll the KYC status to determine next steps. The status moves through initiating, in review, and awaiting signature, and ends at approved or declined. Pass both the organization ID and the enterprise ID.

    API Reference: Get KYC Identity

  3. When the KYC status is awaiting signature, your end user signs to confirm. Your organization's agreements with BitGo determine the required contractType values.

    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
    }
  ]'
Response
// 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": []
}