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, swept by us, 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 factory and its own address maths, 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 address is computed in advance from the customer's salt, so 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, sweep what lands, and pay the network fee to do it. Sweeps are visible to you and read-only: they never change 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
- It is a contract at an address we computed before anyone funded it. Only the factory can move what lands there, only our operator can call the factory, and only into destinations allowed on chain. There is no seed phrase, so there is nothing to lose.
- One address on every EVM chain
- The factory deploys to the same address on all ten EVM chains, so a customer who memorised their Ethereum address can use it on Base. Tron has its own factory and its own address maths.
- You never hold gas
- Our operator wallet funds every sweep on every chain, so you never buy TRX to move USDT and your customer never lands on an address they cannot spend from.
- Merchants do not sweep
- There is no sweep endpoint for you to call. Sweeping is ours, it is what the keyless design exists to make safe, and it does not affect your balance either way.
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.