Open Payment Protocol
The payment protocol for the digital dollar.
MoneyID lets wallets turn human-readable addresses (like alice@example.com) into full payment instructions. Chain, token, and amount are all negotiated over plain HTTPS and JSON.
What is MoneyID
An open protocol for identity-based stablecoin payments
Paying someone in stablecoins right now means copying a long hex address, picking the right network yourself, and double-checking the amount manually. Get one character wrong or pick the wrong chain, and you can lose your money for good.
MoneyID is a free, open protocol (two specs: MIP-01 and MIP-02) that lets wallets, exchanges, and terminals turn addresses like alice@shop.co into full payment instructions. Everything runs over HTTPS and JSON.
Without MoneyID
With MoneyID
Protocol
How MoneyID works
Every MoneyID payment goes through four steps. It's all standard HTTPS and JSON. No custom transport layer, no binary encoding.
Resolve identity
The wallet picks up a MoneyID address (say, bob@merchant.com) from a QR code, NFC tag, or text input. It follows the moneyid: URI scheme, so there's no ambiguity about what it is.
Discover rails
The wallet fires an HTTPS GET to the recipient's domain. Back comes a JSON response listing supported networks, accepted tokens, amount limits, and who the recipient is.
Create instruction
The wallet POSTs the payer's choice of chain and token. In return, it gets a fresh destination address, the precise amount (in the token's smallest unit), and an expiry time.
Send & confirm
The wallet sends the on-chain transfer. On the other end, the recipient's server watches for the transaction and confirms once it settles.
Protocol in action
A real payment flow
A customer pays $34.20 at a point-of-sale terminal. The terminal shows a QR code with moneyid:pay+terminal@moneyid.app. Here's the full exchange.
1 — Discovery
GET /.well-known/moneyid/pay+terminal
Host: moneyid.app{
"tag": "payRequest",
"callback": "https://moneyid.app/api/pay/terminal",
"metadata": [
["text/plain", "Terminal #4 — Downtown"],
["text/identifier", "pay@moneyid.app"],
["text/tag", "terminal"]
],
"currencies": [
{
"code": "USDC",
"name": "USD Coin",
"decimals": 6,
"chains": [
{
"network": "base",
"chainId": "8453",
"tokenAddress": "0x8335...2913"
}
],
"minSendable": "34200000",
"maxSendable": "34200000"
}
]
}2 — Payment instruction
POST /api/pay/terminal
Host: moneyid.app
{
"amount": "34200000",
"currency": "USDC",
"network": "base",
"chainId": "8453",
"tokenAddress": "0x8335...2913"
}{
"paymentInstruction": {
"address": "0x8d7F...91ab",
"network": "base",
"chainId": "8453",
"tokenAddress": "0x8335...2913",
"amount": "34200000",
"expiry": 1740816240
},
"successAction": {
"tag": "message",
"message": "Payment received — Terminal #4"
}
}Stablecoin-native
Built for the digital dollar
MoneyID is focused on dollar-denominated stablecoin payments. It supports multiple tokens and chains, and all amounts are integer strings in the token's native unit. No floating-point math, no rounding surprises.
Supported tokens
USDC · USDT · PYUSD · DAI · Any ERC-20
Supported networks
Ethereum · Base · Solana · Arbitrum · Tron · Polygon
Human-readable addresses
Pay alice@example.com instead of a long hex string. It's easier to remember, easier to verify, and way harder to mess up.
Stablecoin-native
Built around USDC, USDT, PYUSD, and any dollar-pegged token. Amounts are always integer strings in the token's native unit, so you won't hit floating-point rounding issues.
Multi-chain by default
One MoneyID address works across Ethereum, Base, Solana, Arbitrum, Tron, and Polygon. The sender's wallet just picks from whatever chains the recipient supports.
QR-ready payments
A MoneyID address fits in a standard QR code. When scanned, the wallet resolves the recipient and presents a pre-filled transaction — chain, token, and amount included.
POS-ready confirmations
Terminals get protocol-level confirmation that funds landed. Settlement checks happen server-side, no block explorer needed.
Open & fixed amount flows
Works for open payments where the sender picks the amount and for fixed invoices where the recipient sets it. Same protocol either way.
Integrate
Who should implement MoneyID
MoneyID is a protocol, not a product. If your app sends or receives stablecoin payments, you can implement MIP-01 and MIP-02. There are no API keys, no registration, and no vendor lock-in.
Wallets
Look up MoneyID addresses to find out what chains, tokens, and amounts the recipient accepts, then show the payer a clean payment flow straight from the protocol response.
Exchanges
Take deposits and handle withdrawals through MoneyID addresses. Since the protocol sorts out chain and token before anything gets signed, wrong-network mistakes go away.
POS terminals
Show a MoneyID address as a QR code. The customer's wallet scans it, handles the transfer, and your server confirms when the funds arrive on-chain.
Payment processors
Route stablecoin payments across chains and tokens with one protocol integration. You get address resolution and payment instructions for every supported network in a single pass.
Read the
specification.
MoneyID is defined by two open specs: MIP-01 (Protocol Foundation) and MIP-02 (Pay). It's free to implement. No registration, no permission needed.