Skip to content

Facilitator coverage

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.

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.

FacilitatorKeyless?PipRail live-testedMainnet exact networks
PayAI✅ keylessBase, Polygon, Arbitrum, Avalanche, Sei, SolanaBase, Solana, Avalanche, Polygon, Arbitrum, Sei +24
Ultravioleta DAO✅ keylessEthereum, Polygon, Arbitrum, Optimism, Unichain, HyperEVM, Base, MonadHyperEVM, 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✅ keylessBase, Polygon, Arbitrum, Optimism, Avalanche, BNBBase, BNB, Solana, Polygon, Arbitrum, Optimism, Avalanche (BNB: FDUSD/USD1/U only; ~$0.003 dynamic floor — sub-floor payments rejected)
Corbits✅ keylessSolana, Base, Polygon, MonadSolana, Base, Polygon, Monad +38
Polygon Labs✅ keylessPolygonPolygon (the official Polygon facilitator)
GoPlausible✅ keylessAlgorand + BaseAlgorand (the only keyless Algorand facilitator), Base, Solana
Pieverse✅ keylessMonad + BNBMonad, BNB, Base (BNB: FDUSD/USD1/U)
Cascade✅ keylessBaseBase, Solana
Satoshi (bitcoinsapi)✅ keylessBaseBase, Solana
OpenFacilitator✅ keyless✅ SolanaBase, Solana, Stacks
xpay✅ zero-fee✅ BaseBase
Daydreams🔑 API keyEthereum, Base, Solana
Questflow🔑 API keyBase
Coinbase CDP🔑 CDP authBase, Solana
Koraself-hostSolana

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.

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
// → undefined

Each 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.

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.