VetoVetoDocs
Reference

Policy fields

Every MerchantPolicy field, its type, default, and the reason code it fires. All fields are optional; safe defaults fill the rest.

MerchantPolicy is the acceptance policy the gate evaluates locally. Every field is optional; normalizePolicy() fills the gaps with safe defaults. Caps and rates you don't set stay undefined on purpose — "no cap" is a distinct, legitimate posture from "default cap".

interface MerchantPolicy {
  requireMandateOverUsd?: number;
  minReputationTier?: 'risky' | 'standard' | 'trusted' | 'elite';
  maxPerTransactionUsd?: number;
  maxPerAgentPerDayUsd?: number;
  ratePerAgentPerHour?: number;
  ratePerAgentPerDay?: number;
  blockedAgents?: string[];
  allowedRails?: ('x402' | 'card' | 'mock')[];
  forbiddenIntentKeywords?: string[];
  requiredIntentMatch?: boolean;
  holdForReviewBelowTier?: 'cautious' | 'standard' | 'trusted' | 'premium';
}

Fields

FieldDefaultFires
requireMandateOverUsd20MANDATE_REQUIRED
minReputationTierstandardREPUTATION_TOO_LOW
maxPerTransactionUsd500OVER_PER_TX_CAP
maxPerAgentPerDayUsd(none)OVER_DAILY_CAP
ratePerAgentPerHour(none)RATE_LIMITED_HOURLY
ratePerAgentPerDay(none)RATE_LIMITED_DAILY
blockedAgents[]AGENT_BLOCKED
allowedRails(all rails)RAIL_NOT_ALLOWED
forbiddenIntentKeywords[]INTENT_FORBIDDEN_KEYWORD
requiredIntentMatchfalseINTENT_MISMATCH
holdForReviewBelowTiercautiousHOLD_FOR_REVIEW

Preset values

FieldSTRICT()BALANCED()OPEN()
requireMandateOverUsd020Infinity
minReputationTiertrustedstandardrisky
maxPerTransactionUsd10050010000
maxPerAgentPerDayUsd2502000(none)
ratePerAgentPerHour1060(none)
ratePerAgentPerDay50300(none)
holdForReviewBelowTiertrustedcautiouscautious

requiredIntentMatch: true holds every transaction unless you also wire an intentMatcher into your CheckoutConfig — without a matcher there is no score to compare. The presets deliberately leave it off.