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 transfer’s recipient as a user within your Crossmint project, and associate them with a Crossmint wallet address. There are two ways to create a user:
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.The owner property accepts a userLocator. This associates the wallet with the user identifier in your system.
  • If you have your own user IDs, set the wallet's "owner" property using the userId format (userId:<userId>, e.g., userId:johnd-123).
  • If you bring your own auth, Crossmint automatically extracts the user ID from your JWT and assigns it to the wallet's "owner" property.
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: "[email protected]"
            }
        },
        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));
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 property to that user’s registered userLocator value. This will associate the wallet with the user identifier in your system.
  • If you have your own user IDs, set the wallet's "owner" property using the userId format (userId:<userId>, e.g., userId:johnd-123).
  • If you bring your own auth, Crossmint automatically extracts the user ID from your JWT and assigns it to the wallet's "owner" property.
Step 1: Register the user
const userLocator = "userId:johnd-123";

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

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));
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: "[email protected]"
            }
        },
        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 User Data

User data must be attached to the user 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({
        userDetails: {
            firstName: "John",
            lastName: "Doe",
            dateOfBirth: "2007-01-01",
            countryOfResidence: "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));
userData could have been attached via the original user registration call (Method 2 -> Step 1) instead of making a separate PUT request.

User 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
countryOfResidence
string
required
User’s country of residence 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