Cross-Chain Wallet Infrastructure: What It Means for Your Business and How to Integrate It
·7 min read- What this is
- Why businesses end up needing this
- What changes in your architecture
- What you can build with it
- How to integrate
- The two properties worth designing around
- Custody: what you are and are not taking on
- One thing to plan for: there is no sandbox
- Pairing wallets with payouts
- Rate limits and onboarding
- Get started
What this is
Minisend's Wallet API issues a real onchain address for any reference you supply, and you never touch a private key. One POST call with a user ID returns an address. Call it again with the same ID and you get the same address back. Your users get somewhere to receive stablecoins; you get no key custody problem.
Why businesses end up needing this
The moment a product accepts stablecoins from more than one customer, a question appears: where does each customer's money land? There are three usual answers and two of them are bad.
One shared address for everyone. Cheap to build, painful to operate. You reconcile by amount and timing, which breaks the first time two customers send the same amount within the same minute.
Run your own wallet infrastructure. Correct, and expensive. Now you are storing key material, thinking about HSMs, rotation, backup, insider risk, and the regulatory posture of holding customer keys. This is a real engineering org's worth of work, and it is not your product.
Per-user addresses from an API. You get clean attribution without becoming a custodian. Funds arriving at an address are unambiguously that user's, because nothing else can arrive there.
The Wallet API is the third option.
What changes in your architecture
| Without per-user addresses | With per-user addresses |
|---|---|
| Reconcile deposits by amount and timestamp | Deposit is attributed by the address it arrived at |
| Ambiguity when two users send the same amount | No ambiguity, ever |
| You store or broker private keys | No keys, no seed phrases, on your side or your users' |
| Adding a chain means new key handling | Activate the chain, reuse the same user reference |
| Onboarding a user requires wallet UX | Address exists the moment the user record does |
The practical effect is that "which user paid?" stops being a heuristic and becomes a lookup.
What you can build with it
- Deposit addresses inside your app. Every user has a funding address on day one, no wallet connect flow required.
- Per-customer accounts. A B2B product can give each business customer a persistent address for topping up a balance.
- Per-order addresses. Issue an address per invoice or order and reconciliation becomes exact by construction.
- Onchain features without being a wallet company. Add stablecoin receiving to an existing product without shipping key management.
How to integrate
Three steps. The whole thing is one endpoint.
1. Activate a chain
In the dashboard, go to Wallets and activate the chain you want to issue addresses on. Each activated chain is backed by a master wallet, which is the container your issued addresses belong to. Chain availability depends on your plan: Base on the free tier, and Base, Arbitrum, Avalanche, Ethereum, Optimism, and Polygon on Premium and above.
2. Create an API key
Wallet API keys carry the wsk_live_ prefix and are shown once, so store the value immediately. Keep it in an environment variable, never in client code, and use a separate key per environment so you can rotate one without disturbing the others.
3. Create a wallet
curl -X POST https://merchant.minisend.xyz/api/v1/wallets \
-H "Authorization: Bearer wsk_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{"walletRef": "user-9214"}'walletRef is your own identifier: a user ID, a customer ID, an order number. The response comes back with the wallet ID, your reference, the onchain address, the chain, status, mode, an optional metadata object, and a creation timestamp.
Store the returned address against your user record. That is the integration.
The two properties worth designing around
It is idempotent. Calling the endpoint again with the same walletRef returns the existing wallet rather than creating a second one. This means you do not need to track whether you have already provisioned a user. Call it on first login, call it on every login, call it from a retry after a timeout: same address, no duplicates. It also means a failed request is safe to retry blindly.
One reference spans chains. The same walletRef can hold separate addresses on Base, Arbitrum, and the other activated chains. Your internal identity stays one row while the onchain surface grows.
Custody: what you are and are not taking on
Creating an address through this API does not hand you or your end users a private key or a seed phrase to store. Users never receive keys to manage, which removes the most common support burden in consumer crypto products and keeps you out of the business of protecting key material.
Be deliberate about how you describe this to your users. They have an address that receives funds; they do not have a self-custodial wallet they can export.
One thing to plan for: there is no sandbox
Keys are live-only. Every address you create is a real address on mainnet. There is no test mode that simulates the flow with fake funds.
That shapes how you test:
- Use a dedicated
walletRefnamespace for testing, something liketest-, so test records are trivially filterable later. - Run the real flow with a trivial amount. An off-ramp order clears from 0.50 USDC, so an end-to-end test costs cents.
- Keep a separate API key for staging and rotate it independently.
Pairing wallets with payouts
Wallet addresses are most useful next to the off-ramp. A user funds their address with USDC or USDT, and you convert that balance to local currency through the off-ramp API, settling to M-Pesa, a Buy Goods till, a Paybill number, mobile money, or a bank account across Kenya, Nigeria, Ghana, and Uganda. The off-ramp is non-custodial: USDC moves from the wallet directly into settlement, and Minisend delivers the local payout.
Together that is a full loop inside your own product: receive stablecoins, hold them, pay out in shillings, naira, cedi, or Ugandan shillings.
Rate limits and onboarding
The default API limit is 60 requests per minute per IP, and support can raise it. Going live with payouts requires KYB: incorporation documents, founder and director details, and proof of address for both the business and the director dated within the last three months. You get an acknowledgement within one business day and most reviews finish within two.
Get started
The full reference lives at docs.minisend.xyz. To discuss volume terms or activate off-ramp access, email info@minisend.xyz or see Minisend for business.
Frequently asked questions
- What does the Minisend Wallet API do?
- It issues a real onchain address for any reference you supply, such as a user ID or an order number, through a single POST to /api/v1/wallets. Your application gets a dedicated deposit address per user without managing wallet infrastructure or private keys.
- Do I have to hold private keys or seed phrases?
- No. Creating an address through the Wallet API does not hand you or your end users a private key or seed phrase to store. Users never receive keys to manage, so key custody never becomes your problem.
- How do I create a wallet address for a user?
- Send a POST to https://merchant.minisend.xyz/api/v1/wallets with an Authorization: Bearer header carrying your wsk_live_ key and a JSON body containing walletRef set to your own user identifier. The response returns the wallet ID, reference, onchain address, chain, status, mode, metadata, and creation time.
- What happens if I call the wallet endpoint twice for the same user?
- Nothing duplicates. The endpoint is idempotent: the same walletRef returns the existing wallet and the same address. That makes retries safe and means you do not need to track whether a user was already provisioned.
- Which chains can I issue wallet addresses on?
- Base on the free tier. Base, Arbitrum, Avalanche, Ethereum, Optimism, and Polygon on Premium and above. One walletRef can hold a separate address on each activated chain.
- Is there a sandbox for testing the Wallet API?
- No. Keys are live-only and every address created is a real mainnet address. Test by running the real flow with a trivial amount, using a dedicated walletRef namespace for test records and a separate API key you can rotate independently.
- Can users cash the balance out to local currency?
- Yes. Pair the Wallet API with the off-ramp API to convert a balance to KES, NGN, GHS, or UGX, settling to M-Pesa, a Buy Goods till, a Paybill number, mobile money, or a bank account. The off-ramp is non-custodial: USDC moves from the wallet straight into settlement.
