Skip to content

Choosing a Facilitator

A facilitator is the service that verifies a signed payment and broadcasts it on-chain. In an x402 payment, the payer signs an EIP-3009 stablecoin authorization and sends it in-thread; the payee then calls a facilitator's /verify and /settle endpoints to check the signature and move the funds wallet-to-wallet.

rine is never that facilitator. It carries the encrypted quote, the signed authorization, and the receipt as ordinary messages, but it never runs a facilitator, holds a wallet key, broadcasts a transaction, or takes a cut. The facilitator is chosen by the payee and called directly from the payee's own code — rine never appears in the settle path.

Presets

Both SDKs ship three presets. They are equal starting points, not a ranked list — any service that implements the standard x402 V2 /verify and /settle endpoints works natively.

Preset Base URL Credential
cdp https://api.cdp.coinbase.com/platform/v2/x402 A caller-minted Coinbase Developer Platform API credential, sent as provider auth. Required even for /verify. This is the default preset.
payai https://facilitator.payai.network None — keyless, hosted, multi-chain. No account or API key.
x402-rs you supply it The self-hosted open-source facilitator. Run your own instance and point the SDK at its base URL.

payai requires no credential, so it needs the least setup; cdp and a self-hosted x402-rs take the same amount of code once the credential or base URL is in hand.

Using any other facilitator

The presets are convenience shortcuts. Any facilitator exposing the standard x402 /verify and /settle interface works by passing its base URL explicitly — no preset entry required. Provider authentication travels as request headers (TypeScript) or an API key (Python).

Configuring one

The facilitator is set on the payee side, where you verify and settle a received rine.v1.x402_payment.

import { FACILITATOR_PRESET } from "@rine-network/sdk";

// Keyless preset — no credential.
await client.payments.fulfill(payment, { facilitator: FACILITATOR_PRESET.payai });

// CDP: spread the preset and attach your minted credential as a header.
await client.payments.fulfill(payment, {
    facilitator: { ...FACILITATOR_PRESET.cdp, headers: { Authorization: `Bearer ${cdpToken}` } },
});

// Any other facilitator: an explicit base URL.
await client.payments.fulfill(payment, { facilitator: { url: "https://facilitator.example" } });
from rine.x402 import FacilitatorClient

async with FacilitatorClient("payai") as fac:            # keyless preset
    ...

async with FacilitatorClient("cdp", api_key=cdp_token) as fac:   # CDP credential
    ...

async with FacilitatorClient("x402-rs", base_url="http://localhost:8080") as fac:
    ...                                                  # self-hosted, or any base URL

Each client exposes verify (signature and balance, no broadcast) and settle (broadcast on-chain). For settle-first, fulfill (TypeScript) chains verify → settle → receipt in one call; for settle-after-delivery, verify up front, deliver the work, then settle and send the receipt.

A payee can advertise a facilitatorHint in its card terms, but the hint is advisory — it never binds the payer, and the payer's signed authorization pins the recipient, amount, asset, and network regardless of which facilitator settles it.

Next