MolnPay
Keyless crypto custody and payments for businesses — a deposit address per customer on every chain, balances, sweeps, payouts and signed webhooks, from one API.
MolnPay is a custodial wallet service and payment gateway. You create customers, we derive a deposit address per customer per chain, we watch the chains, credit an internal double-entry ledger when deposits confirm, notify you by signed webhook, sweep funds into your master wallet, and send payouts on your instruction.
What it is not: not an exchange, not a trading venue, not a fiat on-ramp. It moves crypto and keeps an accurate ledger. Nothing else.
Addresses have no key
A customer's deposit address is a smart account the factory creates at an address known in advance — the same address on every EVM chain, and no private key anywhere. Only the operator can move its funds, and only into destinations you allowed. That is the custody model, and it is why a merchant never holds a key for a customer address.
Where to start
| You want to… | Read |
|---|---|
| Decide between the wallet service and hosted checkout | Which product do I need? |
| Prove your key works | Your first call |
| Go end to end: customer → address → deposit → payout | Quickstart |
| Receive events and verify them | Webhooks, then Verify a signature |
| Rehearse without real money | Test mode |
| See every endpoint and schema | API reference |
The five things that will break your integration if you skip them
These are not style preferences. Each one has a specific, expensive failure mode.
- Amounts are decimal strings, never JSON numbers.
1 ETHis1000000000000000000wei, pastNumber.MAX_SAFE_INTEGER. Use a big-integer type end to end. Money representation. - USDT and USDC on BSC have 18 decimals. Everywhere else, 6.
POST /v1/payoutsmakes you echo the asset'sdecimalsand refuses a mismatch. Read them fromGET /v1/chains; never hardcode 6. - Verify webhook signatures over the raw request body. Not a re-serialised object. The header is
MolnPay-Signature. Verify a signature. Idempotency-Keyis mandatory onPOST /v1/payouts. A retried POST without one can send funds twice. Idempotency.- Only
deposit.confirmedis money — and it can be retracted.deposit.detectedmeans seen on chain, and a confirmed deposit can be reorged out (deposit.orphaned), in which case you reverse what you credited.
For agents
The whole contract is machine-readable: /openapi.json carries every endpoint, every
schema and every webhook payload, and its info.description inlines the same quickstart these guides are
built from. /llms.txt indexes this site; append .md to any page for its Markdown.