Core guides
Pro Pay · Merchant checkout
Full partner setup so third parties (and OpenPay) let users pay with OpenPay Pro payment methods — earnings credit to the merchant’s Pro @username or wallet address. Auth, API, env, dashboard, copy-paste.
/charges settle to your OpenPay partner wallet. To land OUSD on an OpenPay Pro @username / 0x, call inbound with pro_xfer:. The multi-rail Top Up screen (Pi, Banxa, MoonPay, …) is a deep-link into Pro — not provider API keys in your app.00
Overview — three paths
A · Charges
POST /charges → PayButton → poll paid. Earnings on partner OpenPay balance.
B · Pro inbound
After paid, POST inbound to credit merchant @user / 0x on Pro.
C · Deep-link
Send buyers to /topup (full methods) then /pay/@merchant.
Buyer → Your checkout → POST /charges (opk_live_)
→ Pay on OpenPay → poll GET /charges/:id = paid
→ POST https://openpaypro.space/api/public/openpay/inbound
{ to: "@shop", note: "pro_xfer:@shop:r_order", openpay_tx_id }
→ Merchant Pro wallet +$OUSD01
Set receive wallet (merchant dashboard)
Merchants configure where funds arrive. Store these in your partner dashboard:
- Pro @username — Settings / profile on OpenPay Pro
- Pro 0x wallet — Wallet screen address
- Partner OpenPay owner — charge proceeds via Partner portal
- Optional
opdk_…at /developer (inbound to your own Pro wallet only)
{
"merchant_id": "m_123",
"pro_username": "@shop",
"pro_wallet": "0x7bf2…851a",
"openpay_client_id": "uuid…",
"receive_mode": "pro_inbound"
}02
Env & API keys
# Required — Partner Transfer
OPENPAY_CLIENT_ID="your-client-uuid"
OPENPAY_PARTNER_API_KEY="opk_live_..."
OPENPAY_PARTNER_API_BASE="https://araojncyittkahvvpdrn.supabase.co/functions/v1/partner-transfer-api"
# Optional — Connect OAuth
OPENPAY_REDIRECT_URI="https://yourapp.com/openpay/callback"
# Merchant receive (your dashboard)
MERCHANT_PRO_USERNAME="@shop"
MERCHANT_PRO_WALLET="0x..."
PRO_INBOUND_URL="https://openpaypro.space/api/public/openpay/inbound"
# Optional — Pro developer key (own wallet inbound only)
OPENPAY_PRO_DEVELOPER_KEY="opdk_..."Never expose opk_ / opdk_ in browsers or VITE_ env.
03
Auth — Connect with OpenPay
profile balance. Codes expire in 10 minutes; opa_live_ tokens last 30 days.https://openpy.space/connect
?client_id=YOUR_CLIENT_ID
&redirect_uri=https://yourapp.com/openpay/callback
&scope=profile%20balance
&state=RANDOM_CSRFcurl -X POST "https://araojncyittkahvvpdrn.supabase.co/functions/v1/partner-transfer-api/oauth/token" \
-H "Content-Type: application/json" \
-d '{
"grant_type": "authorization_code",
"code": "opc_...",
"redirect_uri": "https://yourapp.com/openpay/callback",
"client_id": "YOUR_CLIENT_ID",
"client_secret": "opk_live_YOUR_KEY"
}'Pro wallet sign-in methods (OpenPay, Telegram, Solana, Pi, Phantom, WalletConnect, MetaMask): /docs/auth.
04
Create checkout — PayButton charges
Buyer pays with OpenPay Balance. Funds credit your partner-app owner. Poll status — no partner webhooks yet.
curl -X POST "https://araojncyittkahvvpdrn.supabase.co/functions/v1/partner-transfer-api/charges" \
-H "Authorization: Bearer opk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"amount": 250.00,
"currency": "OUSD",
"description": "Order #9001",
"reference": "order_9001",
"success_url": "https://yourapp.com/pay/thanks?ref=order_9001",
"cancel_url": "https://yourapp.com/pay/cancel?ref=order_9001"
}'
# → { id, checkout_url, status, expires_at } · TTL ~2h# Poll
curl -H "Authorization: Bearer opk_live_YOUR_KEY" \
https://araojncyittkahvvpdrn.supabase.co/functions/v1/partner-transfer-api/charges/CHARGE_ID
# created | paid | canceled | expired
# Cancel unpaid
curl -X POST -H "Authorization: Bearer opk_live_YOUR_KEY" \
https://araojncyittkahvvpdrn.supabase.co/functions/v1/partner-transfer-api/charges/CHARGE_ID/cancel05
Credit Pro @username / wallet
After paid, land OUSD on the merchant’s Pro receive identity:
curl -X POST "https://openpaypro.space/api/public/openpay/inbound" \
-H "Authorization: Bearer opk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": "@shop",
"amount": 250.00,
"openpay_tx_id": "CHARGE_OR_TX_ID",
"note": "pro_xfer:@shop:r_order_9001",
"from_username": "buyer"
}'to accepts @user, 0x…, or uid_…. Idempotent on openpay_tx_id.
06
QR Pay · method openpay_pro
openpay_pro. Same settle path as Path A+B: PayButton charge → poll → inbound to Pro receive wallet.| Method id | openpay_pro |
|---|---|
| Label | OpenPay Pro |
| Pay rail | OpenPay Balance via POST /charges |
| Receive | @username and/or 0x… on OpenPay Pro |
| Note | pro_xfer:@shop:r_order_9001 |
# Create charge for QR Pay order
curl -X POST "https://araojncyittkahvvpdrn.supabase.co/functions/v1/partner-transfer-api/charges" \
-H "Authorization: Bearer opk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"amount": 25.00,
"currency": "OUSD",
"description": "QR Pay order_9001",
"reference": "qr_order_9001",
"success_url": "https://openpy.space/qrpay/thanks?ref=qr_order_9001",
"cancel_url": "https://openpy.space/qrpay/cancel?ref=qr_order_9001"
}'
# Show checkout_url (or QR of that URL) to buyer
# Poll until paid, then inbound:curl -X POST "https://openpaypro.space/api/public/openpay/inbound" \
-H "Authorization: Bearer opk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": "@shop",
"amount": 25.00,
"openpay_tx_id": "CHARGE_OR_TX_ID",
"note": "pro_xfer:@shop:r_qr_order_9001"
}'07
OpenPay Pro payment methods
| Method | Label | Description |
|---|---|---|
| pi | Pi Network (π) | Pay with Pi · live π price → OUSD ($1) credited instantly |
| openpay_balance | OpenPay Balance | Pay from your connected OpenPay account · real debit |
| moonpay | MoonPay | Card / Apple Pay / Google Pay · MoonPay → OUSD |
| usdc | USDC Pay | Pay with USDC · MoonPay Commerce → OUSD |
| helio | Crypto Deposit | SOL / crypto · MoonPay Commerce → OUSD |
| solana_pay | Solana Pay | Commerce Kit · wallet connect, PaymentButton, Solana Pay QR → OUSD |
| circle_mint | Circle Deposit | Circle Mint · USDC payin (payment intent + list payments) → OUSD |
| cash_pay | Pay with CASH | Phantom CASH (Solana SPL) · ledger balance or Solana Pay QR → OUSD 1:1 |
| wallet_usdt | Wallet USDT | Pay with your OpenPay Pro USDT balance → OUSD 1:1 |
| wallet_usdc | Wallet USDC | Pay with your OpenPay Pro USDC balance → OUSD 1:1 |
| wallet_sol | Wallet SOL | Pay with your OpenPay Pro SOL balance · live Solana price → OUSD |
| banxa_apple_pay | Apple Pay | Banxa · Apple Pay (Face ID / Touch ID) → crypto settle → OUSD |
| banxa_google_pay | Google Pay | Banxa · Google Pay → crypto settle → OUSD |
| banxa_card | Card | Banxa · debit / credit card → crypto settle → OUSD |
| banxa_bank | Bank Transfer | Banxa · bank transfer (ACH / SEPA / Faster Payments / PayID) → OUSD |
| scan_pay | Scan to pay | Multi-chain QR · SOL / USDC / USDT / CASH stables → verify TX → OUSD on OpenLedger |
08
Deep-link Top Up + pay merchant
# Buyer funds self with full Pro methods (Pi, Banxa, MoonPay, USDT…)
https://openpaypro.space/topup
# Then pay merchant
https://openpaypro.space/pay/@shop?amount=250&asset=OUSD¬e=order_9001
# Or OpenPay hosted pay tag + pro_xfer note (then inbound)
https://openpy.space/pay/YOUR_PARTNER_TAG
?amount=250¤cy=OUSD
¬e=pro_xfer:@shop:r_order_9001
&success_url=https://yourapp.com/thanks
&cancel_url=https://yourapp.com/cancel09
Dashboard & earnings
Partner portal — keys, redirects, owner balance
GET /me · /balance — server earnings after charges
Pro wallet / activity — OUSD after inbound
Ledger API — reconcile buy / receive
curl -H "Authorization: Bearer opk_live_YOUR_KEY" \
https://araojncyittkahvvpdrn.supabase.co/functions/v1/partner-transfer-api/balance10
Copy-paste Node
const API = process.env.OPENPAY_PARTNER_API_BASE || "https://araojncyittkahvvpdrn.supabase.co/functions/v1/partner-transfer-api";
const KEY = process.env.OPENPAY_PARTNER_API_KEY;
const INBOUND = process.env.PRO_INBOUND_URL || "https://openpaypro.space/api/public/openpay/inbound";
const MERCHANT = process.env.MERCHANT_PRO_USERNAME || "@shop";
export async function createCheckout({ amount, reference, success_url, cancel_url }) {
const res = await fetch(`${API}/charges`, {
method: "POST",
headers: {
Authorization: `Bearer ${KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
amount,
currency: "OUSD",
description: reference,
reference,
success_url,
cancel_url,
}),
});
if (!res.ok) throw new Error(await res.text());
return res.json(); // { id, checkout_url }
}
export async function waitUntilPaid(chargeId) {
for (;;) {
const res = await fetch(`${API}/charges/${chargeId}`, {
headers: { Authorization: `Bearer ${KEY}` },
});
const data = await res.json();
if (data.status === "paid") return data;
if (data.status === "canceled" || data.status === "expired") {
throw new Error(`Charge ${data.status}`);
}
await new Promise((r) => setTimeout(r, 2000));
}
}
export async function creditMerchantPro({ amount, openpay_tx_id, reference }) {
const res = await fetch(INBOUND, {
method: "POST",
headers: {
Authorization: `Bearer ${KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
to: MERCHANT,
amount,
openpay_tx_id,
note: `pro_xfer:${MERCHANT}:r_${reference}`,
}),
});
if (!res.ok) throw new Error(await res.text());
return res.json();
}11
Launch checklist
- ✓Partner app + opk_live_ on server only
- ✓Merchant Pro @username and/or 0x saved in your dashboard
- ✓Connect redirect URIs exact-matched (if using OAuth)
- ✓Charges create → redirect → poll paid
- ✓Inbound credits Pro receive wallet (Path B)
- ✓QR Pay method openpay_pro wired (if using OpenPay QR)
- ✓/topup + /pay/@merchant tested (Path C)
- ✓Earnings via GET /balance and/or Pro wallet