Facilitator coverage
Introduction
Section titled “Introduction”When you offer a standard exact rail settled by a
third-party facilitator, you need to know which facilitator settles exact on your chain — and
ideally a keyless one, so neither you nor the buyer pays gas. PipRail ships that knowledge as plain
data (no hosted registry, no backend) plus a live reader, so you can choose or verify a facilitator up
front.
This is the honesty layer under the upcoming exact: true shorthand: it resolves a known keyless
facilitator for your gate’s network from this map, or fails with a clear message when none is known.
Live-verified facilitators
Section titled “Live-verified facilitators”The third-party x402 facilitators below were probed live (2026-06-14 → 2026-06-17) — each one’s
GET /supported was read, and every row marked ✅ was then settled with a real mainnet exact payment
through PipRail, where the buyer paid zero gas. “Keyless” means it settles with no API key, so the
facilitator sponsors the network fee for the buyer and the merchant. You point a gate at any of them
with exact: { settle: { facilitator: '<facilitator url>' } } — see
the exact rail seller guide. On a facilitator-sponsored
fee-payer rail the gate also bounds the fee a buyer can make the sponsor pay — see
sponsor protection.
| Facilitator | Keyless? | PipRail live-tested | Mainnet exact networks |
|---|---|---|---|
| PayAI | ✅ keyless | ✅ Base, Polygon, Arbitrum, Avalanche, Sei, Solana | Base, Solana, Avalanche, Polygon, Arbitrum, Sei +24 |
| Ultravioleta DAO | ✅ keyless | ✅ Ethereum, Polygon, Arbitrum, Optimism, Unichain, HyperEVM, Base, Monad | HyperEVM, Base, Monad, Celo, Unichain, Optimism, Scroll, Ethereum, Arbitrum, Polygon, Avalanche, BNB + Solana, Stellar, Sui, Algorand, NEAR, XRPL (18 listed — but Celo/Scroll/Avalanche contract_call_failed; non-EVM advertise-only) |
| Dexter | ✅ keyless | ✅ Base, Polygon, Arbitrum, Optimism, Avalanche, BNB | Base, BNB, Solana, Polygon, Arbitrum, Optimism, Avalanche (BNB: FDUSD/USD1/U only; ~$0.003 dynamic floor — sub-floor payments rejected) |
| Corbits | ✅ keyless | ✅ Solana, Base, Polygon, Monad | Solana, Base, Polygon, Monad +38 |
| Polygon Labs | ✅ keyless | ✅ Polygon | Polygon (the official Polygon facilitator) |
| GoPlausible | ✅ keyless | ✅ Algorand + Base | Algorand (the only keyless Algorand facilitator), Base, Solana |
| Pieverse | ✅ keyless | ✅ Monad + BNB | Monad, BNB, Base (BNB: FDUSD/USD1/U) |
| Cascade | ✅ keyless | ✅ Base | Base, Solana |
| Satoshi (bitcoinsapi) | ✅ keyless | ✅ Base | Base, Solana |
| OpenFacilitator | ✅ keyless | ✅ Solana | Base, Solana, Stacks |
| xpay | ✅ zero-fee | ✅ Base | Base |
| Daydreams | 🔑 API key | — | Ethereum, Base, Solana |
| Questflow | 🔑 API key | — | Base |
| Coinbase CDP | 🔑 CDP auth | — | Base, Solana |
| Kora | self-host | — | Solana |
Base URLs (pass to exact: { settle: { facilitator } }) — the keyless ones, live-proven:
https://facilitator.payai.network · https://facilitator.corbits.dev · https://pay.openfacilitator.io · https://facilitator.xpay.sh · https://facilitator.ultravioletadao.xyz · https://x402.dexter.cash · https://x402.polygon.technology (Polygon) · https://facilitator.goplausible.xyz (Algorand) · https://facilitator.pieverse.io · https://facilitator.cascade.fyi · https://facilitator.bitcoinsapi.com.
Live settlement proofs (real mainnet, sub-cent amounts): PayAI Solana
4dL8jRKH… ·
OpenFacilitator Solana
5BabDtX… ·
Corbits Solana
BCreYer… ·
xpay Base
0x2273d5… ·
Corbits Monad
0x7797be… ·
Ultravioleta HyperEVM
0x56af81….
The 2026-06-18 gasless-extension added 17 more live proofs across Ethereum, Polygon, Arbitrum,
Optimism, Avalanche, Sei, and Unichain (e.g. UVD Ethereum
0x7fcc3c… ·
PayAI Polygon
0xb37630…) —
the full per-pair tx hash lives in each KNOWN_FACILITATORS entry, and every one was re-verified
on-chain to confirm a third-party (the facilitator) paid the gas, never the buyer or merchant.
You’re never locked to any of them — keep one, swap it, or run your own (self-settle / Kora). See keep PayAI, or swap it. PipRail depends on no facilitator.
KNOWN_FACILITATORS — the seed map
Section titled “KNOWN_FACILITATORS — the seed map”A Record<Caip2, KnownFacilitator[]> mapping a CAIP-2 network to the facilitators known to settle
exact there. It is deliberately conservative — only endpoint-verified entries — and grows only
after a live /supported read confirms a new pair.
import { KNOWN_FACILITATORS, knownFacilitatorsFor, firstKeylessFacilitator } from '@piprail/sdk'
knownFacilitatorsFor('eip155:8453') // Base — eight live-verified keyless facilitators (all settle eip3009)// → [PayAI, xpay, Ultravioleta DAO, Dexter, Corbits, GoPlausible, Cascade, Satoshi]// (8 entries; each shaped { url, keyless: true, schemes: ['exact'], settles: ['eip3009'], note })
firstKeylessFacilitator('solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', 'svm')?.url// → 'https://facilitator.payai.network' (first of PayAI · OpenFacilitator · Corbits)
firstKeylessFacilitator('eip155:999999') // unknown network// → undefinedEach KnownFacilitator has a url (no trailing slash), a keyless boolean (true ⇒ no API key, the
facilitator sponsors gas), the schemes it settles (today 'exact'), the exact transfer settles
methods ('eip3009' | 'permit2' | 'svm' | 'algorand' | 'aptos' | 'near'), and an optional note.
Reading a facilitator’s live /supported
Section titled “Reading a facilitator’s live /supported”facilitatorCoverage(url) fetches a facilitator’s GET /supported and returns the (scheme, network)
kinds it advertises. It is best-effort and never throws — a dead or changed endpoint resolves to
[], mirroring the SDK’s other read-only methods.
import { facilitatorCoverage } from '@piprail/sdk'
await facilitatorCoverage('https://facilitator.payai.network')// → [{ scheme: 'exact', network: 'eip155:8453' },// { scheme: 'exact', network: 'solana:5eykt4Us…', feePayer: 'Fee…' }]Each kind also carries two optional fields when the facilitator advertises them: x402Version
(the envelope version it reports per kind) and assetTransferMethod ('eip3009' | 'permit2') — so a
reader can tell a v1 rail from a v2 rail, or a gasless EIP-3009 kind from a Permit2 one, straight from
/supported. Both are omitted entirely when absent (never a undefined key), so a facilitator that
reports neither parses exactly as before.
parseFacilitatorSupported(body) is the pure parser behind it (useful in tests or when you already
hold the body):
import { parseFacilitatorSupported } from '@piprail/sdk'
parseFacilitatorSupported({ kinds: [{ scheme: 'exact', network: 'eip155:8453' }] })// → [{ scheme: 'exact', network: 'eip155:8453' }]
parseFacilitatorSupported('garbage') // tolerant — never throws// → []Use these to verify a facilitator covers your CAIP-2 network before wiring a gate, or to generate a coverage table from live reads. See the exact rail seller guide for turning on the rail itself.