---
title: "Migrate from Crossmint to BlindPay"
description: "Move the stablecoin-to-fiat leg of a Crossmint integration to BlindPay while Crossmint keeps handling wallets, checkout, or orchestration."
date: "2026-08-26"
category: "migrations"
products: ["payouts", "payins", "quotes", "compliance", "webhooks"]
---

Paste this prompt into your coding agent to port the payout and offramp leg of a Crossmint (docs.crossmint.com) integration to BlindPay, keeping Crossmint wallets in place.

## Prompt

```text
You are migrating the stablecoin-to-fiat leg of my application from Crossmint's offramp/payout surface to the BlindPay API. Crossmint wallets, checkout, or stablecoin orchestration may stay in place; only money movement to fiat is moving.

Before writing code, read these sources and follow them over any prior knowledge:
- https://blindpay.com/docs/llms.txt (read the quickstarts, customers, bank accounts, wallets, quotes, and webhooks pages)
- The OpenAPI spec: curl https://api.blindpay.com/doc

Do the migration in this order:
1. Inventory my Crossmint usage from the codebase: every call into Crossmint's offramp API (KYC/bring-your-own-KYC, bank accounts, payout requests), stablecoin orchestration pay-ins, wallet transfer webhooks (wallets.transfer.in, wallets.transfer.out), and payment/checkout webhooks, plus every stored Crossmint ID. Confirm exact endpoint names and payload shapes in the Crossmint docs rather than assuming, since offramp API routes are not fully public. Derive the mapping from what we actually use, roughly: Crossmint offramp customers and KYC map to BlindPay customers (re_) with KYC/KYB; Crossmint bank accounts map to BlindPay bank accounts (ba_) with rail-specific types (Pix, SPEI, SEPA, ACH, wire); Crossmint payout requests map to a BlindPay quote (qu_) followed by an executed payout (po_); if Crossmint receiving/deposit addresses are in use, map those to BlindPay virtual accounts (va_) or offramp wallets. Write the mapping table into a migration report and flag anything with no direct equivalent instead of guessing.
2. Decide what stays on Crossmint: if funds keep living in Crossmint wallets, register each wallet with BlindPay as an external wallet through the sign-message challenge flow and store the resulting bw_ ID, so BlindPay can pull from or verify ownership of the same wallet Crossmint already manages.
3. Re-onboard customers on BlindPay: terms of service, create customer, KYC/KYB via document upload, driven by customer.* webhooks. KYC does not transfer between providers, so plan for re-verification and sequence it before the cutover so approved customers are ready when we switch.
4. Rebuild the payout leg on BlindPay's explicit two-step model: request a quote, then execute the payout against it via POST /v1/instances/{instance_id}/payouts/evm before expires_at (about 5 minutes). Store qu_ and po_ IDs alongside the legacy Crossmint order IDs during the transition.
5. Port status handling to BlindPay's Svix-signed webhooks (svix-id, svix-timestamp, svix-signature verified against whsec_ with raw-body HMAC) in place of Crossmint's offramp order and wallet transfer webhooks, with svix-id dedup.
6. Cut over per corridor behind a feature flag: dual-run with new payouts on BlindPay while Crossmint settles in-flight orders, keep both webhook handlers live during the window, and only retire the Crossmint payout path once one full dual-run settlement cycle has cleared on BlindPay.

Constraints:
- Develop against a BlindPay development instance (USDB on testnets, KYC auto-approves, sentinel amounts $666.00 forced failed and $777.00 forced refunded for testing) before moving to mainnets.
- Amounts are integer minor units; API keys stay server-side.
- Produce a written migration report before changing code: the mapping table, gaps, and the re-KYC plan.

Deliverables: the migration report, re-onboarding script, the BlindPay client and payout/quote code paths behind a flag, external wallet registration for any Crossmint wallets that stay, webhook handlers, and a cutover checklist.
```

## How to use

1. Point the agent at your codebase so it inventories real Crossmint offramp and webhook usage rather than assuming undocumented endpoints.
2. Review the migration report, especially which wallets stay on Crossmint and the re-KYC sequencing, before approving code changes.
3. Dual-run at least one full settlement cycle per corridor before retiring the Crossmint payout path.

## Related docs

- [Introduction](https://blindpay.com/docs/introduction)
- [Customers](https://blindpay.com/docs/learn/customers)
- [Offramp wallets](https://blindpay.com/docs/offramp-wallets)
- [Crossmint offramp overview](https://docs.crossmint.com/offramp/overview)
