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

Address0x8d7F...91ab
NetworkSelect manually
TokenSelect manually
AmountCopy & paste
ConfirmationNone

With MoneyID

Addressalice@shop.co
NetworkAuto-negotiated
TokenAuto-negotiated
AmountPre-set or open
ConfirmationInstant

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.

01

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.

02

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.

03

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.

04

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.