The rule engine

16 rule kinds. No short-circuit

No tiering by feature. A free personal card gets the same engine as a program running millions.

RuleWhat it doesHow it is enforced
conditionIf/else. True runs the then-branch, false the else — a false condition never declines.branch control
merchant_lockOnly at merchants you name.card per purchase
merchant_blockNever at merchants you name.card per purchase
mcc_blockWhole categories, allowed or denied.processor controls
amount_ceilingNo single purchase over your number.funding
spend_capA rolling total per day, week or month.funding
velocityAt most N purchases in a window.funding
time_windowOnly between two hours, in your timezone.funding
max_usesA fixed number of uses, then done.funding
cooldownA required wait between purchases.funding
repeatA while loop over the payment stream. Iterations count from the ledger; once the loop is complete, it declines.funding
approval_thresholdAbove an amount, a person has to say yes.funding
new_merchant_reviewAsk a person the first time anywhere new.card per purchase
per_merchant_spend_capA cap that applies to one merchant only.card per purchase
duplicate_charge_guardRefuses an identical charge inside a window.funding
webhook_checkYour own endpoint decides. Any rule you can write.your endpoint

A rulebook

Written once, carried by the card.

[ { "kind": "merchant_lock", "config": { "allow": ["ferguson.com","grainger.com"] } }, { "kind": "amount_ceiling", "config": { "max_cents": 100000 } }, { "kind": "spend_cap", "config": { "max_total_cents": 500000, "window": "week" } }, { "kind": "time_window", "config": { "start_hour": 6, "end_hour": 19, "tz": "America/Chicago" } }, { "kind": "approval_threshold", "config": { "above_cents": 50000 } }, { "kind": "new_merchant_review", "config": {} }, { "kind": "duplicate_charge_guard","config": { "window_sec": 900 } }, { "kind": "webhook_check", "config": { "url": "https://you.example.com/appen" } } ]
Try it in the sandbox →