Crypto payments
Buy a PrivacyFlow subscription with privacy-preserving crypto — invoice lifecycle, supported assets, and the rate-limit lift that comes with paid tier.
PrivacyFlow bills in privacy-preserving crypto. No billing address, no credit card, no KYC. The dashboard’s Billing section issues an invoice, you pay to the displayed address, and on confirmation your account moves to paid tier — which lifts the send rate limit from 600 to 2000 messages per minute.
Open Billing
- Sign in to the dashboard.
- Open Billing (or Transactions / Invoices, depending on your dashboard version).
Warning
Screenshot placeholder — Billing section overview showing current tier, supported assets, and an “New invoice” button.
Supported assets and prices
The dashboard reads supported crypto assets and their prices from the backend’s /dashboard/configuration endpoint at runtime — the dashboard never hardcodes them. That means the asset list you see may differ from what’s described here; treat the list below as illustrative.
Warning
Illustrative — your dashboard shows current supported assets and prices. The data below is a sample, not a contract.
| Asset (sample) | Network | Notes |
|---|---|---|
| XMR | Monero | Native asset, strongest privacy. |
| ETH | Ethereum / Base / Polygon / BSC | Native coins on several EVM networks. |
| USDC | multiple networks | Stablecoin — predictable fiat value. |
| USDT | multiple networks | Stablecoin — predictable fiat value. |
| TRON | TRON | Native coin. |
For real prices and the current asset list, open your dashboard’s Billing section — the /dashboard/configuration fetch is what populates the UI.
Create an invoice
- From Billing, click New Invoice.
- Pick the asset you want to pay in.
- The dashboard creates the invoice and opens the Crypto Payment Modal.
Warning
Screenshot placeholder — Crypto Payment Modal showing asset, amount, a QR code, and the destination address with a Copy button.
The modal shows:
- The destination address (copyable).
- A QR code encoding the address and amount for wallet scanning.
- The invoice status (
pending,confirming,paid,expired,cancelled). - A Cancel button if you change your mind before payment.
Invoice lifecycle
| Status | Meaning |
|---|---|
pending | Invoice created, awaiting payment to the address. |
confirming | Payment received, awaiting on-chain confirmations. |
paid | Confirmed. Paid tier activates within seconds. |
expired | Invoice window elapsed with no payment. Create a new one. |
cancelled | Operator- or user-initiated cancellation. |
The dashboard polls /dashboard/invoices/:id/payment-status to update the modal in real time. You can leave the modal open and watch the status flip from confirming to paid.
What paid tier unlocks
The most operationally relevant benefit: the send rate limit rises from 600 to 2000 messages per minute per credential. Polling rate is unchanged.
| Endpoint | Free | Paid |
|---|---|---|
GET /api/v1/messages/poll | 100 req/min | 100 req/min |
POST /api/v1/messages/send | 600 messages/min | 2000 messages/min |
For a broadcast of 5,000 messages, free-tier finishes in ~8 minutes (10 batches of 50); paid-tier in ~2.5 minutes. The paid tier also removes any per-account caps the operator may set on the free tier.
See rate limiting for how the limits are enforced and why the limit counts messages, not requests.
Cancel an invoice
From the Crypto Payment Modal or the Invoices list, click Cancel. The invoice moves to cancelled and the destination address stops accepting payments. Any crypto already sent before cancellation still confirms per normal chain rules — coordinate cancellation before you pay.
After payment
Once the invoice hits paid, the dashboard flips your account tier in the next /dashboard/user fetch. The new rate limit takes effect on the next /api/v1/messages/send call — no restart, no re-issue of credentials. Existing pf_live_... keys keep working with the higher budget immediately.
Tip
Paid tier applies to your account, not to individual credentials. Every credential issued under a paid account gets the 2000/min send budget. Re-issue keys if you want; rotation isn’t required for the tier change.
Underlying API calls
| UI action | API route |
|---|---|
| Billing page loads — supported cryptos + prices | GET /dashboard/api/dashboard/configuration (returns BillingConfiguration; publicly readable, no session required) |
| Current tier / invoices list | GET /dashboard/api/dashboard/invoices |
| Click “New invoice” → pick asset → generate | POST /dashboard/api/dashboard/invoices with { asset, planId } |
| Crypto Payment Modal polls for status | GET /dashboard/api/dashboard/invoices/:invoiceId/payment-status (polled until paid) |
| Click “Cancel” | POST /dashboard/api/dashboard/invoices/:invoiceId/cancel with empty body |
| Get a single invoice by id | GET /dashboard/api/dashboard/invoices/:invoiceId |
Pricing and supported assets must never be hardcoded — the dashboard pulls them from GET /dashboard/configuration at runtime. See the dashboard’s AGENTS.md “Billing configuration” section for why. The account API reference covers the full route surface.