Skip to main content
In order to execute a regulated transfer, Crossmint is required to screen recipients against OFAC sanctions lists. To perform these required checks, you must provide Crossmint with certain information you must collect from them.

Step 1: Register Recipient as User

First, you must register the recipient of the transfer as a user within your Crossmint project, and associate it with its wallet address. There are two ways to create a user:
Note:
This method only works if the recipient wallet is a Crossmint managed wallet.
Create a wallet for a user and associate it to a userLocator by setting the owner property. This method creates in a single API call both the wallet, and the user associated with it.
const userLocator = "userId:johnd-123";

const options = {
    method: 'POST',
    headers: {'X-API-KEY': '<x-api-key>', 'Content-Type': 'application/json'},
    body: JSON.stringify({
        chainType: "evm",
        config: {
            adminSigner: {
                type: "email",
                email: "johnd@example.com"
            }
        },
        owner: userLocator
    })
};

fetch('https://staging.crossmint.com/api/2025-06-09/wallets', options)
    .then(response => response.json())
    .then(response => console.log(response))
    .catch(err => console.error(err));
The owner field accepts a userLocator. This associates the wallet with the user identifier in your system.
Register a user with Crossmint without creating a wallet yet. Later, when you create a wallet for that registered user, you can link the wallet’s owner field to that user’s registered userLocator value.Step 1: Register the user
const userLocator = "userId:johnd-123";

const options = {
    method: 'POST',
    headers: {'X-API-KEY': '<x-api-key>', 'Content-Type': 'application/json'},
    body: JSON.stringify({
        userLocator: userLocator
    })
};

fetch('https://staging.crossmint.com/api/2025-06-09/users/', options)
    .then(response => response.json())
    .then(response => console.log(response))
    .catch(err => console.error(err));
The owner field accepts a userLocator. This associates the wallet with the user identifier in your system.Step 2: Create wallet and link to registered userWhen you’re ready to create a wallet for the registered user, use the same userLocator in the owner field:
const userLocator = "userId:johnd-123";

const options = {
    method: 'POST',
    headers: {'X-API-KEY': '<x-api-key>', 'Content-Type': 'application/json'},
    body: JSON.stringify({
        chainType: "evm",
        config: {
            adminSigner: {
                type: "email",
                email: "johnd@example.com"
            }
        },
        owner: userLocator
    })
};

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

Step 2: Registering Personal Data

Once a user is registered (either through Method 1 or Method 2), you can attach personal data to their user object. This personal data is required for compliant regulated transfers.
const userLocator = "userId:johnd-123";

const options = {
    method: 'PUT',
    headers: {'X-API-KEY': '<x-api-key>', 'Content-Type': 'application/json'},
    body: JSON.stringify({
        personalData: {
            firstName: "John",
            lastName: "Doe",
            dateOfBirth: "2007-01-01",
            countryCode: "US"
        }
    })
};

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));
Alternative approach: You can also include the personalData field in the initial user registration POST call (Method 2, Step 1) instead of making a separate PATCH request. This allows you to register the user and attach their personal data in a single API call.

Personal Data Fields

firstName
string
required
User’s first name
lastName
string
required
User’s last name
dateOfBirth
string
required
User’s date of birth in YYYY-MM-DD format
countryCode
string
required
User’s country code in ISO 3166-1 alpha-2 format (e.g., “US”, “GB”, “CA”)

How Personal Data is Used

The personal data you provide is used to run appropriate AML and sanctions screens for the recipient whenever a treasury wallet sends funds to a recipient. This ensures compliance with regulatory requirements for money transmission.
Transfers will fail if the recipient wallet has not provided all required personal data or if the recipient does not pass the necessary compliance checks. See the Transfers page for details on potential errors.

Next Steps