Take stablecoin payments.
Withdraw in rupiah.
Neropay is a payment gateway for Indonesian businesses. Your customer pays USDT or USDC on Ethereum, BNB Smart Chain, Tron or Solana. The balance lands in your merchant account, and you withdraw to a bank account or to your own wallet.
- Priced in rupiah
- One address per order
- Testnet sandbox with a faucet
INV-24815
Order from your backend
Send exactly
Order priced at Rp 1.842.500 · rate fixed at creation
One-time address for this order
0x7a41E9c3F0b2Dd84cC19aF6b2E5d70B31c8A4e52
Waiting for transfer
Expires in 14:52
USDT and USDC on four networks
- EthereumETH · USDT · USDC
- BNB Smart ChainBSC · USDT · USDC
- TronTRX · USDT · USDC
- SolanaSOL · USDT · USDC
- EthereumETH · USDT · USDC
- BNB Smart ChainBSC · USDT · USDC
- TronTRX · USDT · USDC
- SolanaSOL · USDT · USDC
How a payment works
No wallet plugin, no seed phrase and no chain-picking on your side. Four things happen between the cart and your balance.
- 01
You create an order
Call the API from your backend, send a payment link, or ring it up on a cashier terminal. The order carries an amount in rupiah and your own order number.
- 02
Neropay issues a one-time address
Every order gets its own deposit address and an exact token amount. Two customers paying the same price never collide, because no two orders share an amount.
- 03
Your customer pays from any wallet
The checkout page shows a QR code and the address, watches the chain, and moves to the receipt by itself the moment the transfer lands.
- 04
The balance is credited to you
Paid addresses are swept into Neropay's wallet and credited to your merchant balance. Withdraw to a bank account or to a crypto address you control.
The checkout your customer sees
A real sandbox order in the Neropay webview: the amount fixed at creation, the token and its chain spelled out, and the wallets it ships with.
- 01
The order is priced before the wallet opens
Order number, rupiah amount and the expiry countdown are fixed when the order is created. Nothing is re-quoted once the customer is on this page.
- 02
One token, one chain, said out loud
The customer sees the token and the network it settles on — USDT on Sepolia Testnet in this sandbox order — and that the network fee is the sender's to pay.
- 03
A wallet they already have
MetaMask, WalletConnect or Trust Wallet. The customer approves the transfer in their own wallet; nobody creates a Neropay account to pay you.
- 04
Review, then send
The exact amount is confirmed before anything is signed. The page watches the chain and moves to the receipt the moment a transfer matches it.

Everything after the payment
Balances, settlement, payouts, payment links and cashier terminals. The half of a payment gateway that nobody demos, and the half you live in.

A balance for every token
Each token you accept carries its own balance, with settlement still in flight shown apart from what is already yours.
Transactions you can reconcile
Every row keeps your order number, the exact amount the customer sent, and a status of Created, Success, Expired or Invalid.
Withdrawals to bank or wallet
Save a recipient once — a bank account or a crypto address — and request a payout. The fee is calculated before you confirm.
A sandbox that mirrors production
Switch to testnet, mint test USDT and USDC from the faucet, and run the whole flow before a single rupiah is at stake.
One call creates a payment
Post an order, get a checkout URL, send the customer to it. There is no SDK to adopt and nothing to run on your side.
Your API key goes in an api-key header
Server-to-server calls carry the merchant key in an api-key header, checked against the merchant_id in the body on every request. Dashboard sessions use a separate JWT, so a leaked key never gives up the dashboard.
You get back a checkout URL
A created order returns url, key and expired_at. Redirect the customer to url, or render it inside your own webview — the flow, the QR and the warnings are all handled there.
Read the order back for its status
POST /v2/merchant/fiat/getOrder with merchant_id and order_no returns where the order stands: Created, Success, Expired or Invalid.
Testnet has its own endpoints and a faucet
Sandbox runs on separate endpoints backed by a separate schema, with a faucet that mints test USDT, USDC and gas so you can drive the full flow.
const res = await fetch(
"https://api.neropay.my/v2/merchant/fiat/order",
{
method: "POST",
headers: {
"api-key": process.env.NEROPAY_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
merchant_id: "MRC-0042",
order_no: "INV-24815",
amount: "1842500",
products: [
{ name: "Kopi Gayo 250g", price: 1842500, quantity: 1 },
],
}),
},
);
const { data } = await res.json();
// data.url is the Neropay checkout. Redirect the customer there,
// or open it inside your own webview.
return Response.redirect(data.url);Three ways to take a payment
Same orders, same checkout, same balance. What changes is how the order gets created.
How your money is handled
Worth reading before you integrate rather than after. This is the part most gateways leave vague.
Neropay holds the keys
Deposit addresses are derived from a wallet Neropay controls. Funds rest there until they are swept and credited to your balance. This is a custodial model, and it is worth knowing before you integrate.
One address per order
Addresses are derived per order and never reused, so a transfer on chain always traces back to exactly one order.
Exact-amount matching
An order is marked Success only when the amount received matches the order's final amount exactly. Anything else is written down as Invalid rather than quietly accepted.
Testnet and mainnet stay apart
Sandbox runs on its own schema and its own keys. Test money cannot reach a production balance, in either direction.
Pricing
Neropay charges a merchant discount rate — either a percentage of the transaction or a fixed amount, set per merchant rather than off a public rate card. You decide whether the fee comes out of your settlement or is added to what the customer pays. Withdrawal fees are calculated and shown before you confirm a payout.
Percentage or fixed
Both fee types are supported per merchant and per channel.
Absorbed or passed on
Charge the fee to yourself or add it to the customer's total.
Payout fees quoted first
A withdrawal returns its fee before you confirm it.
Questions merchants ask first
If it is not here, ask us directly — the answer comes from someone who works on the gateway.
USDT and USDC, on Ethereum, BNB Smart Chain, Tron and Solana. Your customer picks the network at checkout, and the checkout warns them to send only that token on that chain.
Tell us what you are building
Volume pricing, a payout arrangement, or a question the API reference did not answer. This inbox is read by the people who build Neropay.
Run a payment end to end on testnet today
Create an account, switch to sandbox, mint test USDT from the faucet, and watch an order go from Created to Success before you commit to anything.