changedInput schema / properties / fees / description
Previous value: -"Fees to audit, each with name, amount, frequency and optional category"New value: +"Non-empty list of fees to audit, each {name, amount, frequency, category?}"
changedInput schema / properties / fees / items / properties / amount / description
Previous value: -"Amount charged in USD"New value: +"Amount per charge in USD, greater than 0, e.g. 38 or 15.99 (for monthly fees, the monthly amount)"
addedInput schema / properties / fees / items / properties / amount / exclusiveMinimum
Added value: +0
changedInput schema / properties / fees / items / properties / category / description
Previous value: -"Optional benchmark category key, e.g. bank_overdraft"New value: +"Optional benchmark category key (case-insensitive; spaces/hyphens become underscores). One of: bank_overdraft, bank_monthly_maintenance, atm_out_of_network, late_payment, gym_membership_monthly, streaming_monthly, airline_checked_bag, airline_seat_fee, ticket_convenience, rental_application, subscription_app_monthly, delivery_fee, airline_change_fee, hotel_resort_fee. Unknown keys are ignored."
changedInput schema / properties / fees / items / properties / frequency / description
Previous value: -"How often the fee recurs"New value: +"How often the fee is charged: 'monthly' (x12 per year), 'annual' or 'one-time'"
changedInput schema / properties / fees / items / properties / name / description
Previous value: -"Fee description, e.g. 'Overdraft fee'"New value: +"Fee label as it appears on the statement, e.g. 'Overdraft fee' or 'Netflix'"
addedInput schema / properties / fees / items / properties / name / minLength
Added value: +1
addedInput schema / properties / fees / minItems
Added value: +1
changedOutput schema / (root)
Previous value: -nullNew value: +{
+ "properties": {
+ "currency": {
+ "description": "Currency of all amounts; always USD",
+ "type": "string"
+ },
+ "fees": {
+ "description": "One audited row per input fee, in input order",
+ "items": {
+ "properties": {
+ "amount": {
+ "description": "Amount per charge, USD, rounded to cents",
+ "type": "number"
+ },
+ "annualized": {
+ "description": "Yearly cost of this fee, USD (monthly x12; annual and one-time as-is)",
+ "type": "number"
+ },
+ "flags": {
+ "description": "Problem flags; empty when none apply",
+ "items": {
+ "enum": [
+ "above typical",
+ "duplicate name",
+ "worth disputing"
+ ],
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "frequency": {
+ "description": "Charge frequency as given",
+ "enum": [
+ "monthly",
+ "annual",
+ "one-time"
+ ],
+ "type": "string"
+ },
+ "name": {
+ "description": "Trimmed fee name",
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "amount",
+ "frequency",
+ "annualized",
+ "flags"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "flagged_count": {
+ "description": "Number of fees with at least one flag",
+ "type": "integer"
+ },
+ "note": {
+ "description": "Plain-language summary of the audit result",
+ "type": "string"
+ },
+ "total_annual": {
+ "description": "Sum of all annualized fees, USD",
+ "type": "number"
+ },
+ "total_monthly_average": {
+ "description": "total_annual divided by 12, USD",
+ "type": "number"
+ }
+ },
+ "required": [
+ "currency",
+ "fees",
+ "total_annual",
+ "total_monthly_average",
+ "flagged_count",
+ "note"
+ ],
+ "type": "object"
+}