conditions (groups of conditions: OR across groups, AND within a group) and one action.
merchantName, description, amount, direction, category, class, accountId, reference. Operators: contains, does_not_contain, equals/is, is_not, starts_with, is_in, is_not_in, and for amount gt, lt, eq, between. Actions: { "type": "skip" }, { "type": "email" } (notify by email, still written), { "type": "set_category", "value": "…" }, { "type": "set_merchant", "value": "…" }. Rules evaluate in position order; the first skip wins.
value is always a string, or an array of strings for between, is_in and is_not_in. A number is rejected with 400 parameter_invalid.
Dry-run a ruleset before attaching it: POST /v2/rulesets/{id}/preview returns the actions each recent transaction would receive, and writes nothing.