Deposits

Create deposit workflows for receiving any crypto in your app

⚠️

IMPORTANT: Deposits is currently available for beta testing on devnet only. Login here: https://moonpay.dev.hel.io/ and use the following query parameter: ?permission=deposit. Only use devnet funds!!

Let users fund your app with any crypto, ideal for gaming deposits, embedded wallets and trading apps. This works via unique, self-custodial deposit addresses that are securely generated and identifiable per customer.

How It Works

  • Set up a Deposit in the MoonPay Commerce dashboard
  • Generate unique customer deposit IDs via API
  • Serve the deposit widget in your app via iframe/API
    • User copies/scan the wallet QR code to deposit their crypto of choice
  • MoonPay Commerce auto-bridges/swaps the crypto to your preferred currency & recipient wallet
  • Use webhooks to confirm deposits on your backend and credit the deposit to your customer's account
  1. Set Up a Deposit ID

Login to the MoonPay Commerce dashboard, create a payment and select Deposits as the payment type.

  • Deposit name - Set a name for the deposit. You can also enable options such as “Pay with card” and email notifications for successful deposits.
  • Recipient currency – The currency in which you want to receive the payment
  1. Create A Customer Deposit via the API

Once you’ve set up a deposit in the dashboard, you can programmatically create deposits for individual customers using the deposit endpoint.

Example Request:

curl --request POST \
  --url "https://api.dev.hel.io/v1/deposit-customers/api-key?apiKey=YOUR_PUBLIC_KEY" \        
  --header 'Authorization: Bearer YOUR_PRIVATE_KEY' \  
  --header 'Content-Type: application/json' \           
  --data '{
    "customerId": "<customer-identifier>", // The ID you set for the customer
    "depositId": "68f23471cff6f1f4c16cb7c8", // ID of the deposit
    "recipientPublicKeys": [ // Recipient public key
      "Gvga5AysVCokomFstCDJRmNjLFnJt7VkmqxXJVgfKLGj"
    ],
    "additionalJSON": "{\"createdFromTempDemoUi\": true}" // Optional metadata
  }'

Example Response:

{
    "id": "68f2348ecff6f1f4c16cb7e1", // Unique identifier for this transaction or operation
    "deposit": "68f23471cff6f1f4c16cb7c8", // Reference ID of the related deposit
    "token": "acac3ec9-f8f6-4128-8159-a91e418e2581", // API or session token used for authentication
    "customerId": "<customer-identifier>", // Unique identifier of the customer
    "recipientPublicKeys": [ // Array of recipient public keys
        "Gvga5AysVCokomFstCDJRmNjLFnJt7VkmqxXJVgfKLGj"
    ]
}
  1. Serve the Deposit UI in Your App via Iframe

Embed a Helio deposit widget using the HTML snippet below. It lets users deposit crypto or pay by card directly on your site without leaving your app.

<iframe
  allow="clipboard-write"
  style="width:420px; height:260px;"
  src="https://moonpay.hel.io/embed/deposit/acac3ec9-f8f6-4128-8159-a91e418e2581"
/>

Replace the token at the end of the src URL with your own token returned when creating the customer deposit via the API (e.g. acac3ec9-f8f6-4128-8159-a91e418e2581) to render the correct deposit widget.

  1. Use Webhooks to Confirm Deposits on Your Backend

You can create a webhook to listen for customer deposit events using the curl request below.

curl --request POST \
  --url "https://api.dev.hel.io/v1/webhook/deposit/api-key?apiKey=YOUR_PUBLIC_KEY" \        
  --header 'Authorization: Bearer YOUR_PRIVATE_KEY' \  
  --header 'Content-Type: application/json' \           
  --data '{
    "name": "string",
    "depositId": "string",
    "targetUrl": "string"
  }'

Listen to the webhook payload, which includes details such as customerId, amount received, fees, and amount sent (if you choose to credit the full amount and absorb the fees). Use the Get Deposit function to query this data via the API.

Supported Chains and Currencies

These are the supported currencies per chain that the deposit widget can receive. Users can choose their preferred network and token when making a payment. Deposited funds will be bridged and swapped into your specified recipient currency.

ChainSupported Currencies
SolanaSOL, USDC, USDT
Ethereum (EVM)ETH, USDC, USDT
Polygon (EVM)POL, USDC, USDT
Base (EVM)ETH, USDC, USDT
Binance Smart Chain (EVM)BNB, USDT
Arbitrum (EVM)ARB, USDC, USDT

*More asset support coming soon including USDT on Tron, XRP and more.

User FAQ - How to Use Transfer Crypto?

  • Open the MoonPay Commerce widget and select Transfer Crypto.
  • Choose the token and chain you want to send (Solana, Bitcoin, Ethereum, Base, BNB, Tron, and more coming soon).
  • Copy the deposit address (or scan the QR code). Note: the address may change depending on your selection.
  • Paste the address into your exchange or wallet withdrawal page.
  • Enter the amount you’d like to send. (Transfers below the minimum won’t be processed.)
  • Double-check the address to stay secure, then confirm the withdrawal.
  • Track progress in the widget — most transfers arrive in under a minute

Other User FAQs

What fee will I pay?

It depends on the app you’re funding. The gas fee varies by chain (e.g. Solana and L2s – free, ETH – ~$3, BTC – ~$2). Do I always need to send gas tokens? No, we cover that. For example, you can send USDT on Ethereum and we’ll handle the ETH gas fee.

Are there deposit limits? Yes. Minimums are $5 on Solana and $25 on EVM chains & Bitcoin. No maximums.

How long does it take? Usually under a minute, depending on the network.

Can I reuse the same deposit address? It depends on the app you're funding, addresses are customer ID specific. Always use the one shown in your current widget.

Need help? Reach us anytime through in-app chat or our support channels here