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
- Ethereum
0x71C2…9f2E - Base
0x71C2…9f2E - Arbitrum
0x71C2…9f2E - Polygon
0x71C2…9f2E - Tron
TQm4Zb…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.
Create the customer
One POST with your own user id as the reference. This is the record everything else hangs off.
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.
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.
curl https://api.molnpay.com/v1/customers \ -H "Authorization: Bearer $MOLNPAY_SECRET_KEY" \ -H "Idempotency-Key: user_4471" \ -d reference_id="user_4471"
{
"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.