Skip to main content
This page has been updated for Wallets SDK V1. If you are using the previous version, see the previous version of this page or the V1 migration guide.
This quickstart integrates the Crossmint Kotlin SDK into an Android app to create a non-custodial wallet for a user, fund it with testnet USDC on Base Sepolia, and send USDC to another wallet.

Before you start

Set up your project and get an API key.

Android Demo App

See a full working example with a repository to clone.
1

Install the SDK

Add the Crossmint dependencies to your app’s build.gradle.kts file:
build.gradle.kts
libs.versions.toml

Requirements

  • Minimum Android SDK: API 24 (Android 7.0+)
  • JDK 11 or newer
  • Jetpack Compose
2

Configure your API key

The Crossmint SDK requires a client API key for authentication.
Get your client API key using the Crossmint Console.
3

Initialize the Crossmint SDK

Initialize the SDK in your Application class, then wrap your composable tree with CrossmintNonCustodialSignerProvider to enable the non-custodial signing layer. This example uses Crossmint Auth but you can use any authentication provider of your choice.
MyApplication.kt
Then wrap your top-level composable with CrossmintNonCustodialSignerProvider:
The environment (staging vs production) is automatically determined by your API key. Staging keys start with ck_staging_, production keys with ck_production_.

Access SDK instances

Inside the CrossmintNonCustodialSignerProvider, access SDK functionality using LocalCrossmintSDK.current:
4

Authenticate users

Actions within the SDK are user-based, so first you need to authenticate a user. Choose your authentication method:
Use Crossmint’s built-in OTP authentication for easy, email-based login.
1

Send OTP to user's email

2

Enter the OTP sent to the user's email

See the Android Demo App repository for a complete UI implementation example with ViewModels and Compose screens.
5

Create a wallet

After authentication, create the user’s wallet. This example uses Base Sepolia (Base testnet) but you can choose any supported chain.
Use getWallet(EVMChain.BaseSepolia) for returning users to fetch their existing wallet without creating a new one.
6

Check wallet balance

Before sending tokens, check the wallet balance:
7

Fund the wallet

Before sending USDC, you need to get some into the wallet.Option 1: Use the staging fund method (staging only)
Option 2: Use the USDC FaucetGet the wallet address and use the USDC Faucet:
Navigate to the faucet, select Base Sepolia, and enter the wallet address.Circle faucet — Base Sepolia selected
8

Send USDC

Send USDC to another wallet using the wallet.send function:
The very first time that a wallet sends a transaction on this device, an OTP will be required, sent to the user via email.Following transactions sent from the same device will not need OTP verification.To handle the OTP flow, collect the isOTPRequired flow from the SDK in your composable:
Here is a simple OTP dialog component you can use:
And that is it! You just created a non-custodial wallet for your user and made a USDC transaction on Base Sepolia.

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 client API key on the API Keys page with the API scopes users.create, users.read, wallets.read, wallets.create, wallets:transactions.create, wallets:transactions.sign, wallets:balance.read, wallets.fund
  3. Update your local.properties with the production API key
  4. Use your own authentication provider: For production applications, Crossmint recommends using third-party authentication (Option 2 from Step 4) with providers like Auth0, Firebase, or Supabase, rather than Crossmint Auth (OTP). Configure JWT authentication in the Crossmint Console under API Keys → JWT Authentication.