Every option on withPaywall, paidTool, the Moove provider and the stores.
option type default what it does providerPaymentProviderrequired Opens charges, settles them, issues handles. storeEntitlementStorerequired Where credits are spent from. Passed explicitly, never reached for. argumentNamestring tollboothTokenThe tool argument the agent carries the handle back in. copyIdstring v3Challenge copy variant. All five are measured; v3 ships. allowstring[] none Renderer ids permitted beyond the default. Deny-by-default otherwise. onSettlementfn(outcome) — Every settlement observation. Log underpaid loudly. onCallfn(event) — Every paid call, with a handle fingerprint — never the handle. now() ⇒ number Date.nowInjected clock. Must agree with the provider's.
Argument order mirrors Cloudflare Agents’ paidTool. pricing is a sku string or { sku, cost }; cost defaults to 1 and must be a positive integer. The sku must already be sold by the provider, or registration throws. The handler receives the arguments with the handle stripped, and extra.tollbooth set to { subject, sku, cost } so a server can rate-limit per handle.
all options copy
new MooveProvider({
client, store, prices,
chargeTtlMs: 60 * 60 * 1000, // default; floor 15 minutes
settlementPolicy: {
toleranceFraction: 0.005, // within 0.5%: grant in full
minimumFraction: 0.1, // below 10%: grant nothing
},
subjectTtlMs: 30 * 24 * 60 * 60 * 1000, // sliding; floor 1 hour
}); option default floor notes chargeTtlMs60 min 15 min How long a checkout stays payable. There is no deactivation endpoint; expiry is the only containment. settlementPolicy.toleranceFraction0.005 0 Within this shortfall, grant in full. See underpayment . settlementPolicy.minimumFraction0.1 0 Below this fraction, grant nothing. Must leave room below the tolerance band. subjectTtlMs30 days 1 hour Sliding window on a handle. See security . pricesrequired — Everything this server sells.
option default notes apiKeyrequired Held here and never leaves: not logged, not attached to errors, not sent on the public read. baseUrlhttps://api.moove.xyzThe host shown next to your key. Never guess it. maxAttempts4 Retries for 429 and 5xx only. The 4xx family is never retried. keyedLimiter2 req/s Governs authenticated calls, which consume the per-key budget. publicLimiter8 req/s Governs the keyless read, which consumes only the per-IP budget.
The limiter defaults are deliberately conservative despite measured headroom; the rate limits page says why.
store option notes MemoryEntitlementStoreacknowledgeEphemeralRequired outside tests; the store warns otherwise. Loses paid credits on restart. SqliteEntitlementStorepathFile path or :memory:. WAL mode; busyTimeoutMs defaults to 5000. PostgresEntitlementStoreconnectionStringUse Neon's pooled host. max (5), maxRetries (5), retryBaseMs (250), migrate (true).
variable required notes MOOVE_API_KEYyes The server exits without it. MOOVE_API_BASE_URLno Only if your key names a different host. DATABASE_URLno Postgres when set; SQLite otherwise. /health reports which. TOLLBOOTH_DBno SQLite path. Defaults to /data/tollbooth.sqlite in the HTTP entrypoint. PORTno 8080. TOLLBOOTH_LANDING_URLno Advertised by GET /.