Crypto-as-a-Service: Complete KYB Verification

Programmatically verify businesses, associated persons, and documents for regulatory compliance. See the Guide.

  1. You create a business enterprise inside your organization. BitGo creates its primary user and assigns the service user and organization administrators. Save the returned enterpriseId and userId.

    Prerequisites: You must be the service user and have an organization configured.

    API Reference

  2. You create a user for each beneficial owner, control person, and platform admin. Save each returned userId for the associated person's identity.

    API Reference

  3. You create the business identity with the requested products, then add its location and legal entity structure. BitGo uses these values to generate the business requirements.

    API Reference

  4. You create and link an individual identity for each associated person. Submit location first so BitGo generates that person's requirements, then submit the remaining personal information. Use exactly one controlPerson and add beneficialOwner entries for owners holding at least 10%.

    API Reference

  5. You identify the required documents, generate an upload URL, upload and verify each file, and associate it with the correct business or individual identity. To replace a document, update the existing association.

    API Reference

  6. You fetch the business or individual identity and inspect requestedProducts, requirements, documents, and associatedPeople. Resolve missing business information, documents, or associated-person requirements before finalizing.

    API Reference

  7. You set finalizeSubmission to true only after all requirements are submitted and requested products are ready. Finalization is permanent and sends the identity for BitGo review.

    API Reference

  8. You sign the required enterprise contracts before BitGo activates the products. Submit the master-agreement and distributed-custody-mic contracts in separate calls as described in the guide.

    API Reference

// 1. Create Enterprise and Primary User
export ORGANIZATION_ID="<YOUR_ORGANIZATION_ID>"
export SERVICE_USER_TOKEN="<SERVICE_USER_ACCESS_TOKEN>"
export EMAIL="<YOUR_USER_EMAIL>"
export IDEMPOTENCY_KEY="<UUID_V4>"

curl -X POST \
  "https://app.bitgo-test.com/api/v2/organization/$ORGANIZATION_ID/enterprise" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $SERVICE_USER_TOKEN" \
  -d '{
    "email": "'"$EMAIL"'",
    "idempotencyKey": "'"$IDEMPOTENCY_KEY"'",
    "additionalAdmins": [],
    "accountType": "entity"
  }'
// 2. Create Users for Associated Persons
export ENTERPRISE_ID="<YOUR_ENTERPRISE_ID>"
export EMAIL="<YOUR_USER_EMAIL>"

curl -X POST \
  "https://app.bitgo-test.com/api/v2/organization/$ORGANIZATION_ID/enterprise/$ENTERPRISE_ID/user" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $SERVICE_USER_TOKEN" \
  -d '{
    "email": "'"$EMAIL"'"
  }'

// 3. Set Up Business Identity
// 3.1 Create Business Identity
export BUSINESS_IDENTITY_ID="<YOUR_BUSINESS_IDENTITY_ID>"

curl -X POST \
  "https://app.bitgo-test.com/api/identity-service/v1/identities" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $SERVICE_USER_TOKEN" \
  -d '{
    "type": "business",
    "enterpriseId": "'"$ENTERPRISE_ID"'",
    "organizationId": "'"$ORGANIZATION_ID"'",
    "requestedProducts": [
      {
        "name": "Trade",
        "bitgoOrg": "BitGo Trust"
      },
      {
        "name": "Go Account",
        "bitgoOrg": "BitGo Trust"
      }
    ]
  }'

// 3.2 Add Business Location and Legal Entity Structure
curl -X PATCH \
  "https://app.bitgo-test.com/api/identity-service/v1/identities/$BUSINESS_IDENTITY_ID" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $SERVICE_USER_TOKEN" \
  -d '{
    "business": {
      "physicalBusinessAddress": {
        "street1": "123 4th St",
        "city": "San Francisco",
        "subdivision": "CA",
        "zip": "94103",
        "country": "USA"
      },
      "legalEntityStructure": "corporationCAndS",
      "primaryBusinessType": "Crypto Services (Exchange, ATM, Borrow/Lend)",
      "incorporationCountryCode": "USA",
      "primaryOperationsCountryCode": "USA"
    }
  }'

// 4. Set Up Associated Persons
// 4.1 Create Individual Identities for Associated Persons
export ASSOCIATED_PERSON_USER_ID="<USER_ID_FOR_THIS_ASSOCIATED_PERSON>"
export INDIVIDUAL_IDENTITY_ID="<YOUR_INDIVIDUAL_IDENTITY_ID>"

curl -X POST \
  "https://app.bitgo-test.com/api/identity-service/v1/identities" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $SERVICE_USER_TOKEN" \
  -d '{
    "type": "individual",
    "userId": "'"$ASSOCIATED_PERSON_USER_ID"'",
    "requestedProducts": []
  }'

// 4.2 Add Associated Persons to Business Identity
curl -X PATCH \
  "https://app.bitgo-test.com/api/identity-service/v1/identities/$BUSINESS_IDENTITY_ID" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $SERVICE_USER_TOKEN" \
  -d '{
    "associatedPeople": [
      {
        "role": "beneficialOwner",
        "identityId": "<BENEFICIAL_OWNER_IDENTITY_ID>",
        "percentageOwnership": 25
      },
      {
        "role": "controlPerson",
        "identityId": "<CONTROL_PERSON_IDENTITY_ID>"
      }
    ]
  }'

// 4.3 Update Associated Persons with Location Information
curl -X PATCH \
  "https://app.bitgo-test.com/api/identity-service/v1/identities/$INDIVIDUAL_IDENTITY_ID" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $SERVICE_USER_TOKEN" \
  -d '{
    "individual": {
      "countryOfResidence": "USA",
      "countryOfCitizenship": "USA"
    }
  }'

// 4.4 Update Individual Identities with Required Information
curl -X PATCH \
  "https://app.bitgo-test.com/api/identity-service/v1/identities/$INDIVIDUAL_IDENTITY_ID" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $SERVICE_USER_TOKEN" \
  -d '{
    "individual": {
      "nameFirst": "John",
      "nameLast": "Doe",
      "email": "john.doe@acme.com",
      "birthdate": {
        "month": "01",
        "day": "01",
        "year": "2000"
      },
      "identificationNumber": "12345678",
      "phoneNumber": {
        "countryCode": "1",
        "phoneNumber": "5559876543"
      },
      "occupation": "Other",
      "countryOfResidence": "USA",
      "countryOfCitizenship": "USA",
      "address": {
        "street1": "123 4th St",
        "city": "San Francisco",
        "subdivision": "CA",
        "zip": "94103",
        "country": "USA"
      },
      "politicallyExposedPerson": false
    }
  }'

// 4.5 Remove an Associated Person (Optional)
export ASSOCIATED_PERSON_ID="<ASSOCIATED_PERSON_ID>"

curl -X DELETE \
  "https://app.bitgo-test.com/api/identity-service/v1/identities/$BUSINESS_IDENTITY_ID/associated-people/$ASSOCIATED_PERSON_ID" \
  -H "Authorization: Bearer $SERVICE_USER_TOKEN"

// 5. Upload Required Documents
// 5.1 Identify Business Type and Documents
// Review the requirements array for entries with kind: "document".

// 5.2 Generate Document Upload URL
export DOCUMENT_ID="<YOUR_DOCUMENT_ID>"

curl -X POST \
  "https://app.bitgo-test.com/api/document-service/v1/documents" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $SERVICE_USER_TOKEN" \
  -d '{
    "documentType": "w9"
  }'

// 5.3 Upload Document
export UPLOAD_URL="<DOCUMENT_UPLOAD_URL>"
export FILE_PATH="</path/to/your/document.pdf>"
export CONTENT_TYPE="application/pdf"

curl -X POST "$UPLOAD_URL" \
  -F "file=@$FILE_PATH;type=$CONTENT_TYPE"

// 5.4 Verify Document
curl -X POST \
  "https://app.bitgo-test.com/api/document-service/v1/documents/$DOCUMENT_ID/verify" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $SERVICE_USER_TOKEN" \
  -d '{}'

// 5.5 Associate Documents with Identity
export IDENTITY_ID="<YOUR_IDENTITY_ID>"

curl -X POST \
  "https://app.bitgo-test.com/api/identity-service/v1/identities/$IDENTITY_ID/documents" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $SERVICE_USER_TOKEN" \
  -d '{
    "documents": [
      {
        "documentId": "'"$DOCUMENT_ID"'",
        "documentType": "w9",
        "documentSubType": null
      }
    ]
  }'

// 5.6 Update Document Association (Optional)
export IDENTITY_DOCUMENT_ID="<IDENTITY_DOCUMENT_ID>"
export NEW_DOCUMENT_ID="<NEW_DOCUMENT_SERVICE_ID>"

curl -X PUT \
  "https://app.bitgo-test.com/api/identity-service/v1/identities/$IDENTITY_ID/documents/$IDENTITY_DOCUMENT_ID" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $SERVICE_USER_TOKEN" \
  -d '{
    "documentId": "'"$NEW_DOCUMENT_ID"'",
    "documentType": "w9"
  }'

// 6. Check Statuses
export IDENTITY_ID="<BUSINESS_IDENTITY_ID>"

curl -X GET \
  "https://app.bitgo-test.com/api/identity-service/v1/identities/$IDENTITY_ID" \
  -H "Authorization: Bearer $SERVICE_USER_TOKEN"

// 7. Finalize Submission
curl -X PATCH \
  "https://app.bitgo-test.com/api/identity-service/v1/identities/$IDENTITY_ID" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $SERVICE_USER_TOKEN" \
  -d '{
    "finalizeSubmission": true
  }'

// 8. Sign Contracts
export CONTRACT_ID="<CONTRACT_ID>"

curl -X POST \
  "https://app.bitgo-test.com/api/v2/organization/$ORGANIZATION_ID/enterprise/$ENTERPRISE_ID/contract" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $SERVICE_USER_TOKEN" \
  -d '{
    "contractType": "master-agreement",
    "contractId": "'"$CONTRACT_ID"'"
  }'
Response
// 1. Create Enterprise and Primary User Response
{
  "enterpriseId": "68cc1b65564dc0f83892a49d1ee75626",
  "userId": "68cc1b63564dc0f83892a32072a8b5c7"
}

// 2. Create Users for Associated Persons Response
{
  "userId": "68cc1bc8b1b5017f12c5c1e3c04cd1d4"
}

// 3. Set Up Business Identity Response
{
  "type": "business",
  "organizationId": "659706890515c624f4f0871b879b00a6",
  "enterpriseId": "68cc1b65564dc0f83892a49d1ee75626",
  "business": {},
  "associatedPeople": [],
  "id": "c1ecba6b-0914-4bc3-ae67-4188e061aa3e",
  "requestedProducts": [
    {
      "id": "1a595191-b22d-48f9-b816-4ca311a3f5a4",
      "name": "Trade",
      "bitgoOrg": "BitGo Trust",
      "status": "missingLocation"
    },
    {
      "id": "81948454-f74e-438e-b51e-75e3fdbac1d3",
      "name": "Go Account",
      "bitgoOrg": "BitGo Trust",
      "status": "missingLocation"
    }
  ],
  "requirements": [],
  "documents": [],
  "finalizeSubmission": false
}

// 4.3 Update Associated Persons with Location Information Response
{
  "type": "individual",
  "userId": "68cc1bc8b1b5017f12c5c1e3c04cd1d4",
  "id": "df114ee7-7dc9-431e-aeae-fe4294f789cc",
  "individual": {
    "countryOfResidence": "USA",
    "countryOfCitizenship": "USA"
  },
  "requirements": [
    { "kind": "data", "name": "nameFirst", "status": "missing" },
    { "kind": "data", "name": "nameLast", "status": "missing" },
    { "kind": "data", "name": "birthdate", "status": "missing" }
  ],
  "finalizeSubmission": false
}

// 5.2 Generate Document Upload URL Response
{
  "documentId": "d8e00cc7-1be4-581e-94g4-b07df154e923",
  "uploadUrl": "https://app.bitgo-test.com/api/document-service/v1/documents/upload/abc123",
  "expiresAt": "2025-09-18T16:20:00.000Z"
}

// 5.4 Verify Document Response
{
  "id": "d8e00cc7-1be4-581e-94g4-b07df154e923",
  "status": "verified"
}

// 5.5 Associate Documents with Identity Response
{
  "acceptedDocuments": [
    {
      "id": "identity-document-id",
      "documentId": "d8e00cc7-1be4-581e-94g4-b07df154e923",
      "documentType": "w9",
      "status": "accepted"
    }
  ]
}

// 5.6 Update Document Association (Optional) Response
{
  "id": "identity-document-id",
  "documentId": "new-document-id",
  "documentType": "w9",
  "status": "accepted",
  "createdAt": "2025-09-18T16:25:52.045Z",
  "updatedAt": "2025-09-18T16:35:12.011Z"
}

// 7. Finalize Submission Response
{
  "type": "business",
  "id": "c1ecba6b-0914-4bc3-ae67-4188e061aa3e",
  "finalizeSubmission": true,
  "requirements": [
    { "name": "businessName", "status": "submitted" }
  ]
}