Skip to main content
The facilitator loads YAML from FACILITATOR_CONFIG and reads secrets through named environment variables. The default self-hosted profile is facilitator/config/self-hosted.yaml; the Railway profile is facilitator/config/railway.yaml.

Minimal environment

The development testnet profile can create encrypted sponsor and channel keys and fund them through Friendbot. It never does this for pubnet.

Service and limits

Sponsor budgets are database-backed and shared by replicas:
Do not increase fee ceilings until legitimate enforcing-simulation p99 values have been measured for every enabled scheme and payer class.

Networks and assets

Each network declares an RPC endpoint, sponsor/channel source, allowed assets, scheme fee ceilings, and a maximum seller timeout:
Amounts remain decimal strings in atomic units. The facilitator does not convert dollars, assume seven decimals, or trust the configured symbol for settlement. asset.contract is the binding value. The checked-in testnet profile includes native XLM SAC and testnet USDC. Pubnet is packaged but disabled until audited upto deployment, funded channels, authentication, and measured pubnet fee ceilings are supplied.

Bazaar and discovery

Cataloging validates official Bazaar metadata, bounds and sanitizes it, checks route templates after percent-decoding, and soft-fails invalid declarations. Cataloging never changes a valid payment result. Icons are stored as URLs and never fetched during payment processing.

Search profiles

The search worker is optional. The payment service boots without embeddings, reranking, pgvector, or external keys.
Every vector generation records provider, model, revision, dimension, pooling, and normalization. Changing any of those creates a new typed generation and requires an explicit reindex. A provider timeout or missing model degrades to lexical retrieval and reports partialResults.

Fixed security invariants

Operators cannot configure away payment correctness or security. These are fixed: signed asset, payer, recipient, network, contract, amount, maximum, facilitator, and settlement-ID binding; auth-tree validation; ledger-expiry ordering; record-then-enforcing simulation; enforcing fee gates; channel fencing; durable hash-before-send; transaction-hash polling; exact transfer or upto pull/pay/refund event checks; terminal zero settlement; hook self/token-contract rejection; and pubnet development-funding prohibition. Catalog invariants are also fixed: official schema validation, soft-drop behavior, MCP identity as (resource.url, toolName), append-only versions and payment options, and no in-place overwrite of another seller’s payTo.

Index operations

Run these commands from facilitator/:
Jobs use PostgreSQL row locks, leases, and fencing tokens. No Redis or separate worker database is required.
Last modified on August 10, 2026