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.

  1. You submit basic KYC information for your EU end user with transactionType: "euIndividual". BitGo returns the identity id and a status of initiating. 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, awaiting signature, and ends at approved or declined.

    API Reference: Get KYC Identity

  3. After BitGo approves the KYC verification, your end user signs to confirm. The required contractType values depend on your organization's agreements with BitGo.

    API Reference: Submit KYC Signatures

  4. 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

  5. You poll the IDV status for your end user. For deposit-verification, the endpoint keeps returning pending until the Trust review is complete. BitGo also sends an idvStatus webhook with the status liveness_complete when the end user's liveness check passes.

    API Reference: Get Sumsub IDV status

  6. If an end user's IDV is in pending or action_required state, you can switch them to another verification type and receive a fresh WebSDK link. Switching from deposit-verification isn'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"
  }'
Response
// 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"
}