Skip to main content
Ideal for companies that have verified users through their own identity verification (IDV) provider.
Companies can compliantly pass user KYC data to Crossmint, enabling seamless USDC onramp purchase flows. If you prefer to have individual users provide their KYC data client-side, Crossmint supports that as well. See the React Quickstart for that approach.

How It Works

Crossmint relies on your company running KYC, ID verification, and liveness checks with your own IDV provider (such as Persona or Sumsub). You then share the full KYC data with Crossmint via API. In order to complete orders, Crossmint runs sanction and PEP (Politically Exposed Persons) screens, and performs ongoing monitoring to ensure compliance.

Register User with Full KYC Data

To register a user’s KYC data with Crossmint, make a PUT request to the users endpoint with the full KYC payload. Use Crossmint API key with scope users.create.
const userLocator = "userId:johnd-123";

const options = {
  method: 'PUT',
  headers: {
    'X-API-KEY': '<x-api-key>',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    userDetails: {
      firstName: "John",
      lastName: "Doe",
      dateOfBirth: "1990-05-15",
      countryOfResidence: "DE",
    }
    kycData: {
      addressOfResidence: {
        line1: "123 Hauptstrasse",
        line2: "Apt 5",
        city: "Berlin",
        postalCode: "10115"
      },
      email: "[email protected]"
      identityDocument: {
        type: "passport",
        number: "AS12321",
        image: {
          frontImg: "<base 64 encoded file (10mb limit)>",
          backImg: "<base 64 encoded file (10mb limit)>"
        }
      }
    },
    dueDiligence: {
      employmentStatus: "full time",
      sourceOfFunds: "employment income", 
      industry: "Money Service Business"
    }, 
    enhancedDueDiligence: {
      proofOfIncome: "<base 64 encoded file (10mb limit)>",
      proofOfAddress: "<base 64 encoded file (10mb limit)>"
    }, 
    verificationHistory: {
      idVerificationTimestamp: "2024-11-15T10:35:00Z",
      livenessVerificationTimestamp: "2024-11-15T10:35:00Z"
    }
  })
};

fetch(`https://staging.crossmint.com/api/2025-06-09/users/${userLocator}`, options)
  .then(response => response.json())
  .then(response => console.log(response))
  .catch(err => console.error(err));

User Data Fields

userDetails
object
required
Basis user details
kycData
object
User’s KYC data
dueDiligence
object
User’s employment information
enhancedDueDiligence
object
User’s proof of income and proof of address documentation
verificationHistory
object
Verification results from your IDV provider

Create an Onramp Order

Once the user is registered with their KYC data, you can create an onramp order. The order will use the registered KYC data for compliance checks.
const options = {
  method: 'POST',
  headers: {
    'X-API-KEY': '<x-api-key>',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    recipient: {
      walletAddress: "<recipient-user-wallet-address>"
    },
    payment: {
      method: "card",
      receiptEmail: "[email protected]"
    },
    lineItems: {
      tokenLocator: "base-sepolia:0x036CbD53842c5426634e7929541eC2318f3dCF7e",
      executionParameters: {
        mode: "exact-in",
        amount: "1"
      }
    }
  })
};

fetch('https://staging.crossmint.com/api/2022-06-09/orders', options)
  .then(response => response.json())
  .then(response => console.log(response))
  .catch(err => console.error(err));

Order Responses

Success: Full KYC Data Present

When all required KYC data has been provided and validated, the order moves to the payment phase:
{
  "clientSecret": "...",
  "order": {
    "orderId": "987e81ab-8c8f-464e-95e9-11ceda80d559",
    "phase": "payment",
    "locale": "en-US",
    "lineItems": [...],
    "quote": {...},
    "payment": {
      "method": "card",
      "currency": "usd",
      "status": "awaiting-payment"
    }
  }
}

Success: Additional KYC Inquiry

When full KYC data is present but Crossmint needs to run additional compliance checks, the order enters a processing state. This typically resolves within a few seconds as Crossmint runs the appropriate checks:
{
  "clientSecret": "...",
  "order": {
    "orderId": "987e81ab-8c8f-464e-95e9-11ceda80d559",
    "phase": "payment",
    "locale": "en-US",
    "lineItems": [...],
    "quote": {...},
    "payment": {
      "method": "card",
      "currency": "usd",
      "status": "processing-kyc-verification"
    }
  }
}

Error: Missing KYC Data

If no user personal data is provided, or if the data is insufficient, the order will fail:
{
  "error": true,
  "message": "Required full KYC user data is missing to complete the order"
}

Next Steps