Skip to content

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

Created

Send exactly

112.507USDT

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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

The Neropay webview checkout on a sandbox order: order 10011 for Rp 100.000 with a countdown, USDT on Sepolia Testnet, and the MetaMask, WalletConnect and Trust Wallet options

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.

DashboardTransactionsWithdrawalsPayment linksPoint of saleSettings
The Neropay merchant dashboard: available balance, pending settlement, revenue over the selected period, transaction status breakdown and recent transactions

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);
201 Created · returns url, key, expired_at

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.