Skip to main content
Enterprise feature. Contact us for access.
This quickstart guide walks you through registering a user, uploading documents, and fetching document details using Crossmint’s APIs. These steps enable your users to access regulated products like onramp, offramp, and regulated transfers.
1

Create and register user information

Register a user with Crossmint by specifying their userLocator, their personal details, and KYC data using the Create User endpoint
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: "1995-01-01",
            countryOfResidence: "DE"
        },
        kycData: {
            addressOfResidence: {
                line1: "123 Hauptstrasse",
                line2: "Apt 5",
                city: "Berlin",
                postalCode: "10115"
            },
            email: "[email protected]",
            identityDocument: {
                type: "passport",
                number: "AS12321"
            }
        }
    })
};

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));
Calling this endpoint again with the same userLocator will update the existing user’s information. The endpoint is not additive so specify all relevant user information when updating the user.
2

Upload a document

Upload identity or supporting documents for the user using the Upload Document endpoint. Documents are associated with the user via their userLocator.
const options = {
    method: 'POST',
    headers: {'X-API-KEY': '<x-api-key>', 'Content-Type': 'application/json'},
    body: JSON.stringify({
        userLocator: "userId:johnd-123",
        documentType: "id-passport",
        data: "<base64-encoded-image>",
        expiresAt: "2026-05-30"
    })
};

fetch('https://staging.crossmint.com/api/2025-06-09/documents', options)
    .then(response => response.json())
    .then(response => console.log(response))
    .catch(err => console.error(err));
Supported document types:
  • Identity documents: id-ssn, id-passport, id-idcard-front, id-idcard-back
  • Supporting documents: proof-of-address, proof-of-income
Calling this endpoint again with the same userLocator and documentType will update the existing document’s registered information.
3

Run identity verification

Once you have registered the user’s information and uploaded the required documents, trigger the KYC verification process using the Trigger Identity Verification endpoint.
const userLocator = "userId:johnd-123";

const options = {
    method: 'PUT',
    headers: {
        'X-API-KEY': '<x-api-key>'
    }
};

fetch(`https://staging.crossmint.com/api/2025-06-09/users/${userLocator}/identity-verification`, options)
    .then(response => response.json())
    .then(response => console.log(response))
    .catch(err => console.error(err));
The response will include the eligibility status for each verification type (regulated-transfer, onramp, offramp):
{
    "eligibility": [
        {
            "type": "regulated-transfer",
            "status": "verified"
        },
        {
            "type": "onramp",
            "status": "requires-data",
            "missingData": ["due-diligence", "verification-history"],
            "missingDocuments": ["proof-of-address", "proof-of-income"] // documents requested in case of additional due diligence required 
        },
        {
            "type": "offramp",
            "status": "requires-data",
            "missingData": ["due-diligence", "verification-history"],
            "missingDocuments": ["proof-of-address", "proof-of-income"] // documents requested in case of additional due diligence required 
        }
    ]
}
The response returns a list of eligibility objects for different actions (e.g., onramp, offramp, regulated-transfer). Each object contains a status which can be:
  • not-started: Verification has not been initiated
  • requires-data: Additional user data or documents are needed
  • pending-review: Verification is in progress
  • verified: User has passed verification
  • rejected: User has failed verification
You should check the status for all the actions you want your user to perform. If any of them return requires-data, you must aggregate the missingData and missingDocuments arrays from those specific eligibility objects. Then, update the user’s information using the Update User endpoint and/or upload additional documents using the Upload Document endpoint, and finally re-trigger the verification.
// Example: Update user with missing dueDiligence and verificationHistory data
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: "1995-01-01",
            countryOfResidence: "DE"
        },
        kycData: {
            addressOfResidence: {
                line1: "123 Hauptstrasse",
                line2: "Apt 5",
                city: "Berlin",
                postalCode: "10115"
            },
            email: "[email protected]",
            identityDocument: {
                type: "passport",
                number: "AS12321"
            }
        },
        dueDiligence: {
            employmentStatus: "full-time",
            sourceOfFunds: "employment-income",
            industry: "finance-insurance"
        },
        verificationHistory: {
            idVerificationTimestamp: "2024-01-15T10:30:00Z",
            livenessVerificationTimestamp: "2024-01-15T10:32:00Z"
        }
    })
};

fetch(`https://staging.crossmint.com/api/2025-06-09/users/${userLocator}`, options)
    .then(response => response.json())
    .then(response => {
        console.log("User updated, re-triggering verification...");
        // Re-trigger verification after updating data
        return fetch(`https://staging.crossmint.com/api/2025-06-09/users/${userLocator}/identity-verification`, {
            method: 'PUT',
            headers: {'X-API-KEY': '<x-api-key>'}
        });
    })
    .then(response => response.json())
    .then(response => console.log(response))
    .catch(err => console.error(err));
4

Check verification status

After triggering the identity verification, the process usually completes within a few seconds. You can check the current status using the Get Identity Verification Status endpoint.This endpoint returns the eligibility status for each product type (regulated-transfer, onramp, offramp), which can be:
  • pending-review: Verification is still in progress.
  • verified: User has successfully passed verification.
  • rejected: User failed verification.
  • requires-data: Additional information or documents are needed.
  • not-started: Verification hasn’t been triggered yet.
const userLocator = "userId:johnd-123";

const options = {
    method: 'GET',
    headers: {
        'X-API-KEY': '<x-api-key>'
    }
};

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

Launching in Production

For production, the steps are almost identical, but some changes are required:
  1. Create a developer account on the production console
  2. Create a production server API key on the API Keys page with the API scopes users.create, users.read
  3. Replace your test API key with the production key
  4. Replace staging.crossmint.com with www.crossmint.com in the API URLs

Learn More