Skip to main content
molnpay

Deposit addresses

One address per customer, per chain.

Create a customer once and hand them a permanent address on every chain you support. Deposits are credited to their balance and paid back out through the same API and the same balance.

Customer

user_4471

No private key
  • Ethereum0x71C2…9f2E
  • Base0x71C2…9f2E
  • Arbitrum0x71C2…9f2E
  • Polygon0x71C2…9f2E
  • TronTQm4Zb…7Ksp

One address per customer, identical on every EVM chain and permanent. Tron has its own address format, so it is the one that differs.

How it works.

  1. Create the customer

    One POST with your own user id as the reference. This is the record everything else hangs off.

  2. Ask for an address per chain

    One per (customer, chain), and it does not change. The same customer has the same address on every EVM chain, and you can show it again tomorrow without calling us.

  3. Credit on deposit.confirmed

    We watch every block, credit what lands, and pay the network fee to move it. Nothing we do behind an address ever changes what you are owed.

Your first call.

POST /v1/customers
curl https://api.molnpay.com/v1/customers \
  -H "Authorization: Bearer $MOLNPAY_SECRET_KEY" \
  -H "Idempotency-Key: user_4471" \
  -d reference_id="user_4471"
201 Created
{
  "object": "customer",
  "id": "cus_01K3…",
  "reference_id": "user_4471",
  "created_at": "2026-09-14T…"
}

Then `POST /v1/wallets` with a chain to get that customer their address on it. Call it again for the same pair and you get the same address back.

Worth knowing before you build.

The address has no private key
There is no seed phrase and no key file — nothing for you or for us to lose. Money that lands there can only ever leave for a destination that was allowed in advance.
One address on every EVM chain
A customer who memorised their Ethereum address can use it on Base: it is the same address on all ten EVM chains. Tron, Solana, TON, Bitcoin and Dogecoin each have their own address format, so those are issued separately.
You never hold gas
We pay the network fee on every chain, so you never buy TRX to move USDT and your customer never lands on an address they cannot spend from.
Nothing to operate
There is no collection step for you to run and no endpoint to call. What lands on an address is credited to the balance; how it gets there is ours, and it never affects what you are owed.

The events you will listen for.

Only one of these means money has arrived, and it is deposit.confirmed. Fulfilling on anything earlier — or on a browser redirect — is the most common integration bug in this category.

deposit.detected
Seen on chain, below finality. Not money.
deposit.confirmed
Final. This is the one that means money.
payout.sent
Broadcast to your customer's address.
payout.failed
Did not broadcast. Nothing left the balance.

The rest of the integration.

One key, one dashboard, one webhook signature. These are capabilities, not separate products to buy.

All 15 chainsWhich stablecoins are on each, what a sender's wallet calls the network, and the differences that cost integrators time.