Crossmint on Solana: wallets, fiat checkout, and minting from one SDK
Crossmint bundles Solana wallets, fiat checkout, NFT minting, and policy-gated agent wallets behind one SDK. When to reach for it, and when not to.
If your Solana app needs to onboard non-crypto users — credit-card NFT purchases, custodial wallets created from an email, fiat-funded transactions, agent wallets — you have three plausible vendors: Privy, Web3Auth, and Crossmint. Crossmint is the one that started as "buy NFTs with a credit card" in 2022 and has since fanned out into a full wallet-and-payments stack across 40+ chains, Solana included.
The pitch: install one SDK, get wallets, fiat onramp, NFT minting, KYC/credentials, and (more recently) agent wallets — all behind a single API surface, with the custodial/non-custodial split handled for you.
What's in the box
Crossmint isn't one product — it's five things glued together:
- Wallets — server-side, MPC, and smart wallets. Create them with an email, phone, or social login. Custodial or non-custodial.
- Checkout — credit card → NFT or token, with the fiat-to-crypto leg handled. Headless or hosted.
- Minting API — REST endpoint that mints an NFT on Solana (or any supported chain) without you touching Metaplex directly.
- Verifiable Credentials — issue and verify on-chain credentials (KYC, proof-of-attendance, ownership claims).
- Agent wallets — wallets specifically scoped for AI agents, with policy controls and spending limits.
Solana support is first-class on all five. The same @crossmint/client-sdk-react-ui package switches chains via a prop.
Install
npm install @crossmint/client-sdk-react-uiWrap your app in the provider:
import { CrossmintProvider, CrossmintAuthProvider } from "@crossmint/client-sdk-react-ui"
export default function App({ children }: { children: React.ReactNode }) {
return (
<CrossmintProvider apiKey={process.env.NEXT_PUBLIC_CROSSMINT_API_KEY!}>
<CrossmintAuthProvider
embeddedWallets={{ createOnLogin: "all-users", type: "solana-smart-wallet" }}
loginMethods={["email", "google", "farcaster"]}
>
{children}
</CrossmintAuthProvider>
</CrossmintProvider>
)
}That's the whole setup. Any component below can now call useWallet() and get a Solana wallet — created on the fly when the user logs in with email or a social provider.
Smart wallets on Solana
A Solana "smart wallet" in Crossmint terms is a wallet your app controls policies for — spending limits, allow/deny lists, session keys — without the user juggling seed phrases. Crossmint manages the keys (MPC or server-side, your choice), exposes a normal public key, and signs transactions on the user's behalf when your app calls wallet.sendTransaction().
import { useWallet } from "@crossmint/client-sdk-react-ui"
import { SystemProgram, Transaction, PublicKey, LAMPORTS_PER_SOL } from "@solana/web3.js"
function SendSol() {
const { wallet } = useWallet()
async function send() {
const tx = new Transaction().add(
SystemProgram.transfer({
fromPubkey: new PublicKey(wallet!.address),
toPubkey: new PublicKey("RecipientPubkeyHere"),
lamports: 0.01 * LAMPORTS_PER_SOL,
})
)
const sig = await wallet!.sendTransaction({ transaction: tx })
console.log("https://solscan.io/tx/" + sig)
}
return <button onClick={send}>Send 0.01 SOL</button>
}No @solana/wallet-adapter-*, no Phantom popup, no signTransaction round-trip. The user sees a UI that looks like a normal web app, and you get a Solana signature back.
Fiat checkout
The original Crossmint product. Drop the checkout in to let users buy a Solana NFT or token with a credit card:
import { CrossmintPayButton } from "@crossmint/client-sdk-react-ui"
<CrossmintPayButton
projectId="your-project-id"
collectionId="your-collection-id"
mintConfig={{ type: "candy-machine", totalPrice: "0.05" }}
/>Behind the scenes: Stripe (or equivalent) takes the card, Crossmint settles the SOL, mints from your candy machine, and delivers to either a Solana wallet address or an email (which auto-provisions a Crossmint wallet on first use). The user never touched a wallet.
This is the killer feature if your audience isn't already crypto-native — most consumer NFT and ticketing use cases.
Minting via REST
For server-side flows (loyalty drops, automated rewards, drip campaigns) the REST mint endpoint is simpler than wiring up Metaplex Token Metadata yourself:
curl -X POST https://www.crossmint.com/api/2022-06-09/collections/<collectionId>/nfts \
-H "X-API-KEY: $CROSSMINT_SERVER_KEY" \
-H "Content-Type: application/json" \
-d '{
"recipient": "solana:GsbwXfJraMomNxBcjK4PiPM5tHfTeqzhqJqg9oo6oNzn",
"metadata": {
"name": "Genesis Pass",
"image": "https://example.com/pass.png",
"description": "Founding member"
}
}'You get an id back to poll. No Bundlr/Arweave setup, no Metaplex SDK in your backend. For high-volume drops the trade-off is you're paying Crossmint's per-mint fee instead of raw network cost — fine for most ops, painful at six figures of mints.
Agent wallets
The newer product line: wallets shaped for AI agents. Same Solana smart-wallet primitive, but with delegated signers and spend policies baked in — your agent gets a key that can spend up to N SOL per day on whitelisted programs, and nothing else.
import { createCrossmint, CrossmintWallets } from "@crossmint/wallets-sdk"
const crossmint = createCrossmint({ apiKey: process.env.CROSSMINT_SERVER_KEY! })
const wallets = CrossmintWallets.from(crossmint)
const wallet = await wallets.createWallet({
chain: "solana",
signer: { type: "api-key" },
config: {
policies: [{ type: "spending-limit", value: "1 SOL", period: "day" }],
},
})If you're building an autonomous Solana agent — anything that signs transactions without a human in the loop — a wallet with explicit per-period limits is a much safer default than handing the agent a raw keypair.
When to reach for Crossmint (and when not to)
Use it when:
- Your users aren't crypto-native and you need email/social login → Solana wallet, no Phantom prompt
- You need credit-card checkout for NFTs, tickets, or token sales
- You want a managed wallet layer instead of running your own KMS
- You're shipping AI agents on Solana and want policy-gated signing out of the box
Reach for something else when:
- Your users are already on Phantom or Backpack and want their existing wallet — use
@solana/wallet-adapter-react, not Crossmint - You're minting hundreds of thousands of NFTs and per-mint pricing matters → roll Metaplex directly
- You need the deepest possible Solana feature surface (priority fees, custom compute budgets, hand-tuned Address Lookup Tables) — Crossmint abstracts some of this away
The docs
The good news: docs.crossmint.com is genuinely well-organized — separate quickstarts per product, code snippets in TypeScript and curl, and Solana-tagged examples throughout. Start with the wallets quickstart if you're building a consumer app, or the minting API reference if you're shipping a drop.
The SDK source lives at github.com/Crossmint/crossmint-sdk.
The honest summary
Crossmint is what you reach for when "the wallet" is something you want to disappear from the user's view. On Solana specifically, it competes with Privy and Web3Auth for the WaaS slot, and with Magic for the email-login slot. Where Crossmint wins is the breadth — you get wallets, fiat, mints, and agent infrastructure from one vendor instead of stitching three together. Where it loses is depth — if you need the bleeding edge of Solana program development, you'll outgrow the abstraction.
For 80% of consumer Solana apps, that breadth is the right trade.