earnrate 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -20
- package/data/cards/amex-blue-business-plus.yaml +1 -0
- package/data/cards/amex-blue-cash-everyday.yaml +4 -3
- package/data/cards/amex-blue-cash-preferred.yaml +5 -7
- package/data/cards/amex-gold.yaml +1 -0
- package/data/cards/amex-platinum.yaml +1 -0
- package/data/cards/bank-of-america-atmos-rewards-ascent.yaml +6 -6
- package/data/cards/bank-of-america-atmos-rewards-summit.yaml +6 -6
- package/data/cards/chase-freedom-flex.yaml +5 -1
- package/data/cards/chase-southwest-plus.yaml +5 -5
- package/data/cards/chase-southwest-premier-business.yaml +8 -5
- package/data/cards/chase-southwest-premier.yaml +6 -6
- package/data/cards/chase-southwest-priority.yaml +6 -6
- package/data/cards/citi-aadvantage-business.yaml +6 -6
- package/data/cards/citi-aadvantage-platinum-select.yaml +10 -7
- package/data/cards/citi-costco-anywhere-visa-business.yaml +4 -4
- package/dist/brand.js +2 -3
- package/dist/cli/args.js +64 -51
- package/dist/cli/cheatsheet.js +9 -12
- package/dist/cli/explore.js +28 -27
- package/dist/cli/import.js +3 -8
- package/dist/cli/offers.js +7 -6
- package/dist/cli/run.js +17 -13
- package/dist/cli/wallet.js +7 -6
- package/dist/data/file-store.js +54 -15
- package/dist/data/load.js +1 -1
- package/dist/data/store.js +0 -16
- package/dist/data/wallet-edit.js +78 -3
- package/dist/engine/bonus.js +15 -12
- package/dist/engine/cheat-sheet.js +2 -2
- package/dist/engine/evaluate.js +56 -13
- package/dist/engine/explore.js +9 -22
- package/dist/engine/offers.js +10 -22
- package/dist/engine/periods.js +9 -0
- package/dist/engine/recommend.js +14 -53
- package/dist/engine/record.js +2 -7
- package/dist/engine/setup.js +2 -2
- package/dist/engine/simulate.js +12 -19
- package/dist/engine/text.js +53 -0
- package/dist/engine/transient.js +5 -0
- package/dist/engine/valuation.js +1 -1
- package/dist/engine/wallet-change.js +46 -19
- package/dist/engine/wallet-summary.js +4 -8
- package/dist/format/card-text.js +79 -0
- package/dist/format/cheat-sheet.js +1 -1
- package/dist/format/explore.js +3 -13
- package/dist/format/offers.js +15 -18
- package/dist/{cli/format.js → format/recommendation.js} +2 -6
- package/dist/format/wallet.js +57 -0
- package/dist/import/analyze.js +17 -19
- package/dist/mcp/context.js +92 -0
- package/dist/mcp/inputs.js +155 -0
- package/dist/mcp/schemas.js +2 -1
- package/dist/mcp/server.js +15 -819
- package/dist/mcp/tools/account.js +78 -0
- package/dist/mcp/tools/answers.js +338 -0
- package/dist/mcp/tools/wallet.js +128 -0
- package/dist/merchants/from-env.js +1 -1
- package/dist/merchants/resolve.js +3 -3
- package/dist/schema/card.js +4 -0
- package/package.json +3 -2
- package/dist/data/wallet-setup.js +0 -60
- package/dist/data/wallet-write.js +0 -140
- /package/dist/{cli → format}/cards.js +0 -0
package/README.md
CHANGED
|
@@ -7,12 +7,12 @@
|
|
|
7
7
|
|
|
8
8
|
I wanted a ghost card: one card that always charges the best of my cards. The card networks won't allow one, so I built the next best thing.
|
|
9
9
|
|
|
10
|
-
**earnrate is the best-card decision layer for people and AI agents.** Give it a merchant, and it tells you which card earns the most there, from your own cards or from every card it knows, and why.
|
|
10
|
+
**earnrate is the best-card decision layer for people and AI agents.** Give it a merchant, and it tells you which card earns the most there, from your own cards or from every card it knows, and why. Save your cards and it tracks your caps and chosen categories. It's valuation-aware and transparent about its assumptions. It never sees a card number.
|
|
11
11
|
|
|
12
|
-
- Runs on your machine, in your browser at [earnrate.dev](https://earnrate.dev), or in Claude as a connector at `https://mcp.earnrate.dev`, with nothing to install. No account
|
|
13
|
-
-
|
|
12
|
+
- Runs on your machine, in your browser at [earnrate.dev](https://earnrate.dev), or in Claude as a connector at `https://mcp.earnrate.dev`, with nothing to install. No account and no affiliate links; the hosted server counts requests by tool name, nothing about what you ask. See the [privacy page](https://earnrate.dev/privacy).
|
|
13
|
+
- U.S. cards and U.S. merchants, for now.
|
|
14
14
|
|
|
15
|
-
> **Status:** early, and it works: the engine, CLI, optional Claude merchant lookup, MCP server and the hosted Claude connector. See [the benchmark](docs/benchmark.md) for how it compares to an existing card-picking MCP server.
|
|
15
|
+
> **Status:** early, and it works: the engine, CLI, optional Claude merchant lookup, MCP server and the hosted Claude connector. See [the benchmark](docs/benchmark.md) (run 2026-10-24) for how it compares to an existing card-picking MCP server.
|
|
16
16
|
|
|
17
17
|
## Try it
|
|
18
18
|
|
|
@@ -27,13 +27,13 @@ earnrate whole foods 80 --cards amex-gold,chase-prime-visa # just these cards
|
|
|
27
27
|
You never have to enter your cards: with none, every answer covers every card earnrate knows. To have earnrate remember yours, track caps and welcome bonuses, and give a cheat sheet for your own wallet, save them:
|
|
28
28
|
|
|
29
29
|
```sh
|
|
30
|
-
earnrate cards sapphire # find your cards'
|
|
30
|
+
earnrate cards sapphire # find your cards' IDs
|
|
31
31
|
earnrate add chase-sapphire-preferred
|
|
32
32
|
earnrate add amex-gold
|
|
33
33
|
earnrate whole foods 80
|
|
34
34
|
```
|
|
35
35
|
|
|
36
|
-
Adding a card tells you anything else it needs to earn correctly, such as the categories you picked on Cash+, Amazon Prime for Prime Visa's 5%, or which rotating categories you've activated. `earnrate update` sets those. Using an AI assistant instead? [Add
|
|
36
|
+
Adding a card tells you anything else it needs to earn correctly, such as the categories you picked on Cash+, Amazon Prime for Prime Visa's 5%, or which rotating categories you've activated. `earnrate update` sets those. Using an AI assistant instead? [Add earnrate to it](#use-it-in-an-ai-assistant-mcp) and ask; name your cards or save them there.
|
|
37
37
|
|
|
38
38
|
With the [example wallet](wallet.example.yaml), it prints:
|
|
39
39
|
|
|
@@ -81,7 +81,7 @@ cards:
|
|
|
81
81
|
two-percent: [gas-ev-charging]
|
|
82
82
|
```
|
|
83
83
|
|
|
84
|
-
Rule IDs for `activated`, the choice slots for `chosen` and the membership IDs that unlock bonuses (such as `bofa-rewards-premier` for a BofA Rewards tier) are in each card's file. Currencies and their default values are in [`data/currencies.yaml`](data/currencies.yaml). Spending caps fill up as you record purchases from an AI
|
|
84
|
+
Rule IDs for `activated`, the choice slots for `chosen` and the membership IDs that unlock bonuses (such as `bofa-rewards-premier` for a BofA Rewards tier) are in each card's file. Currencies and their default values are in [`data/currencies.yaml`](data/currencies.yaml). Spending caps fill up as you record purchases from an AI assistant or import a statement with `--apply`, and reset with each period.
|
|
85
85
|
|
|
86
86
|
### Merchants earnrate doesn't know
|
|
87
87
|
|
|
@@ -113,7 +113,7 @@ While the bonus is open, that card wins wherever it's accepted, and the answer s
|
|
|
113
113
|
|
|
114
114
|
### Which new card?
|
|
115
115
|
|
|
116
|
-
|
|
116
|
+
These compare every card earnrate knows:
|
|
117
117
|
|
|
118
118
|
```sh
|
|
119
119
|
earnrate best groceries # every card, ranked for one purchase
|
|
@@ -165,7 +165,7 @@ Something the format can't express yet (Bilt's rent earning, Citi Nights) is lis
|
|
|
165
165
|
|
|
166
166
|
Spotted a wrong rate, or want a card added? [Open an issue](https://github.com/cwasley/earnrate/issues) with a link to the issuer's own page.
|
|
167
167
|
|
|
168
|
-
## Use it
|
|
168
|
+
## Use it in an AI assistant (MCP)
|
|
169
169
|
|
|
170
170
|
**In Claude, nothing to install:** add a custom connector (Settings → Connectors) with the address `https://mcp.earnrate.dev`. It works in Claude on the web, desktop and phone. Questions need no sign-in. If you ask it to save your cards, it opens an earnrate page where you start an anonymous wallet: no email, just a recovery code you keep. The wallet tracks caps and welcome bonuses across your Claude apps, and you can export it for the command line or delete it from the chat. In Claude Code:
|
|
171
171
|
|
|
@@ -173,7 +173,9 @@ Spotted a wrong rate, or want a card added? [Open an issue](https://github.com/c
|
|
|
173
173
|
claude mcp add --transport http earnrate https://mcp.earnrate.dev
|
|
174
174
|
```
|
|
175
175
|
|
|
176
|
-
|
|
176
|
+
Or install it as a Claude Code plugin, which connects Claude Code and Cowork to the same server: `/plugin marketplace add cwasley/earnrate`, then `/plugin install earnrate@earnrate`.
|
|
177
|
+
|
|
178
|
+
**Or run it on your computer:** `earnrate mcp` runs earnrate as a local MCP server over stdio, with 13 tools (the connector has the same ones, plus `export_wallet`, `import_wallet` and `delete_wallet` for its saved wallets):
|
|
177
179
|
|
|
178
180
|
- `best_card_for_purchase`: which card to use, with reasons
|
|
179
181
|
- `best_cards_for` and `simulate_spending`: compare every card earnrate knows, for one purchase or a year of spending, with no wallet needed
|
|
@@ -184,13 +186,11 @@ claude mcp add --transport http earnrate https://mcp.earnrate.dev
|
|
|
184
186
|
- `record_purchase`: books a purchase against its cap and any open welcome bonus in your wallet file, keeping your comments
|
|
185
187
|
- `search_cards`, `add_card`, `update_card`, `remove_card` and `set_memberships`: set up the wallet in conversation
|
|
186
188
|
|
|
187
|
-
|
|
189
|
+
Saving cards is optional: name them in the conversation for one answer, or ask the assistant to save them, and it finds them, adds them, and asks about anything a card needs, like this quarter's Cash+ picks.
|
|
188
190
|
|
|
189
191
|
For a merchant earnrate doesn't know, the calling model can pass a `category` (e.g. `grocery.supermarket`). It's used only for unknown merchants and is labeled in the answer. The command line takes the same thing as `--category`.
|
|
190
192
|
|
|
191
|
-
**Claude
|
|
192
|
-
|
|
193
|
-
**Claude Desktop, one click:** download [earnrate.mcpb](https://github.com/cwasley/earnrate/releases/latest/download/earnrate.mcpb) and open it; Claude Desktop installs it (Settings → Extensions). No terminal or Node install needed. Its one setting is where your wallet file lives, by default `~/.earnrate/wallet.yaml`, the same file the command line uses.
|
|
193
|
+
**Claude Desktop, running locally:** download [earnrate.mcpb](https://github.com/cwasley/earnrate/releases/latest/download/earnrate.mcpb) and open it; Claude Desktop installs it (Settings → Extensions). No terminal or Node install needed. Its one setting is where your wallet file lives, by default `~/.earnrate/wallet.yaml`, the same file the command line uses.
|
|
194
194
|
|
|
195
195
|
To run it locally in Claude Code:
|
|
196
196
|
|
|
@@ -222,12 +222,12 @@ merchant text
|
|
|
222
222
|
|
|
223
223
|
- **Card terms are data, not code.** Each card is a YAML file of rules (category, rate, cap, channel, dates, activation, required membership), validated with Zod. Every rule carries a short quote from the issuer's own page, and a test fails if one is missing. The engine has no card-specific branches.
|
|
224
224
|
- **Merchants resolve to a category plus the assumption behind it.** "Whole Foods codes as a supermarket (MCC 5411)" is stated in the answer, and venues that can code more than one way (a restaurant inside a stadium or hotel) come back at medium confidence with the alternative spelled out. Unknown merchants fall back to base rates, or to an opt-in, cached and labeled Claude guess.
|
|
225
|
-
- **The engine is pure and deterministic.** Given a purchase, a date and a
|
|
225
|
+
- **The engine is pure and deterministic.** Given a purchase, a date and a set of cards (yours, or every card), it checks every rule against network acceptance, the date window, caps already used (split when a purchase straddles one), quarterly picks and activations, then values points at your cents-per-point, including pooling (Freedom Unlimited points are worth Sapphire points when you hold both). Ties, the valuation at which the runner-up would win, stale data, and a rotating card whose new quarter isn't in the data yet all show up in the answer.
|
|
226
226
|
- **Wallet edits keep your file intact.** Adding or changing a card, or recording a purchase, splices in only the lines that changed and checks the result before saving, so comments and formatting in your YAML survive.
|
|
227
227
|
- **Drift detection.** A weekly GitHub Action opens each issuer page in a headless browser, checks every quote is still there, and opens an issue when terms move. It stores only hashes of issuer text.
|
|
228
228
|
- **Tested end to end.** Golden cases written from issuer terms, CLI snapshot tests, an MCP round trip over real stdio, an install test that packs and installs the npm package, and a check that no committed file contains a card number. CI runs all of it on every push.
|
|
229
229
|
|
|
230
|
-
The code is TypeScript run directly by Node 24 (`src/`), with the engine in `src/engine/`, merchant resolution in `src/merchants/`, and the CLI and MCP server as thin layers over them.
|
|
230
|
+
The code is TypeScript run directly by Node 24 (`src/`), with the engine in `src/engine/`, merchant resolution in `src/merchants/`, and the CLI and MCP server as thin layers over them. `site/` is earnrate.dev, which runs the same engine in the browser, and `remote/` is the hosted server at mcp.earnrate.dev.
|
|
231
231
|
|
|
232
232
|
## Keeping card data current
|
|
233
233
|
|
|
@@ -242,18 +242,21 @@ Rotating categories (Freedom Flex) are added each quarter once the issuer posts
|
|
|
242
242
|
|
|
243
243
|
## Privacy Policy
|
|
244
244
|
|
|
245
|
-
earnrate needs no account
|
|
245
|
+
earnrate needs no account. The local version has no telemetry; the hosted server counts requests by tool name only. The full policy is at [earnrate.dev/privacy](https://earnrate.dev/privacy); in short:
|
|
246
246
|
|
|
247
|
-
- **The Claude connector:** earnrate's server at mcp.earnrate.dev receives each question Claude asks it (a store or kind of purchase, and any amount, spending or cards you gave) and answers without keeping it; request logging is off. It counts requests by tool name only. A saved wallet is optional and anonymous (a recovery code, no email), holds card
|
|
248
|
-
- **What it stores locally:** your wallet, a YAML file on your computer (`~/.earnrate/wallet.yaml` unless you set `EARNRATE_WALLET`). It lists cards by product
|
|
247
|
+
- **The Claude connector:** earnrate's server at mcp.earnrate.dev receives each question Claude asks it (a store or kind of purchase, and any amount, spending or cards you gave) and answers without keeping it; request logging is off. It counts requests by tool name only. A saved wallet is optional and anonymous (a recovery code, no email), holds card IDs and the details you gave, never card numbers, and is encrypted with its own key that only your recovery code or your connected apps can unlock. Delete it any time; it's deleted automatically after 13 months unused, or a week if it's never used.
|
|
248
|
+
- **What it stores locally:** your wallet, a YAML file on your computer (`~/.earnrate/wallet.yaml` unless you set `EARNRATE_WALLET`). It lists cards by product ID, like `amex-gold`, plus your category picks, activations and how much you've spent toward caps. earnrate never asks for or stores card numbers, expiry dates, security codes or bank logins.
|
|
249
249
|
- **What the local version sends:** nothing, by default. The optional merchant lookup (off unless you turn it on with your own Anthropic API key) sends only the name of a store earnrate doesn't recognize to Anthropic's API, and saves the answer in `~/.earnrate/merchant-cache.json`.
|
|
250
250
|
- **AI assistants:** when you use earnrate through Claude or another assistant, that assistant's provider sees the conversation, including earnrate's answers, under its own privacy policy.
|
|
251
251
|
- **earnrate.dev:** everything you enter on the site stays in your browser. The site counts visits with Cloudflare Web Analytics, without cookies.
|
|
252
|
-
- **Retention:** locally, your data lives only in files you control, for as long as you keep them. Delete the wallet file, or clear the site's data in your browser, to remove it. A
|
|
252
|
+
- **Retention:** locally, your data lives only in files you control, for as long as you keep them. Delete the wallet file, or clear the site's data in your browser, to remove it. A saved wallet on mcp.earnrate.dev lasts until you delete it or leave it unused for 13 months.
|
|
253
|
+
- **Terms:** [earnrate.dev/terms](https://earnrate.dev/terms).
|
|
253
254
|
- **Contact:** [hello@earnrate.dev](mailto:hello@earnrate.dev).
|
|
254
255
|
|
|
255
256
|
## Working on earnrate
|
|
256
257
|
|
|
258
|
+
Development needs Node 24 or later.
|
|
259
|
+
|
|
257
260
|
```sh
|
|
258
261
|
git clone https://github.com/cwasley/earnrate.git && cd earnrate
|
|
259
262
|
yarn install
|
|
@@ -14,6 +14,7 @@ welcome_offer:
|
|
|
14
14
|
points: 50000
|
|
15
15
|
spend: 5000
|
|
16
16
|
months: 3
|
|
17
|
+
varies: true
|
|
17
18
|
note: 'The public offer is "as high as" 50,000 points; Amex shows the exact amount after you apply. "Welcome offers vary and you may not be eligible for an offer." The card-specific eligibility rules are in the offer terms, which the headless browser can''t load.'
|
|
18
19
|
rules:
|
|
19
20
|
- id: amex-travel
|
|
@@ -3,8 +3,8 @@ name: American Express Blue Cash Everyday Card
|
|
|
3
3
|
issuer: amex
|
|
4
4
|
network: amex
|
|
5
5
|
currency: cash
|
|
6
|
-
last_verified: 2026-10-
|
|
7
|
-
verified_by:
|
|
6
|
+
last_verified: 2026-10-31
|
|
7
|
+
verified_by: claude
|
|
8
8
|
source_urls:
|
|
9
9
|
- https://www.americanexpress.com/us/credit-cards/card/blue-cash-everyday/
|
|
10
10
|
- https://www.americanexpress.com/en-us/credit-cards/apply/terms/personal/blue-cash-everyday-credit-card/25330-10-0
|
|
@@ -14,6 +14,7 @@ welcome_offer:
|
|
|
14
14
|
dollars: 200
|
|
15
15
|
spend: 2000
|
|
16
16
|
months: 6
|
|
17
|
+
varies: true
|
|
17
18
|
note: 'Paid as Reward Dollars, redeemable for a statement credit or at Amazon.com checkout. The card page says "Earn $200"; the offer terms say "as high as $200", with the exact amount shown before you accept. Not available if you have or have had this Card, the Cash Magnet Card, the Blue Cash Preferred Card (including the Morgan Stanley version) or previous versions of these Cards.'
|
|
18
19
|
rules:
|
|
19
20
|
- id: us-supermarkets
|
|
@@ -62,7 +63,7 @@ evidence:
|
|
|
62
63
|
quote: 'at supermarkets located in the U.S. (superstores, convenience stores, warehouse clubs,'
|
|
63
64
|
- rule: us-online-retail
|
|
64
65
|
url: https://www.americanexpress.com/en-us/credit-cards/apply/terms/personal/blue-cash-everyday-credit-card/25330-10-0
|
|
65
|
-
quote: '3% cash back on the first
|
|
66
|
+
quote: '3% cash back on the first $6,000 of U.S. online retail purchases'
|
|
66
67
|
- rule: us-online-retail
|
|
67
68
|
url: https://www.americanexpress.com/en-us/credit-cards/apply/terms/personal/blue-cash-everyday-credit-card/25330-10-0
|
|
68
69
|
quote: 'from a U.S. retail merchant that sells physical goods or merchandise directly to consumers'
|
|
@@ -3,8 +3,8 @@ name: American Express Blue Cash Preferred Card
|
|
|
3
3
|
issuer: amex
|
|
4
4
|
network: amex
|
|
5
5
|
currency: cash
|
|
6
|
-
last_verified: 2026-10-
|
|
7
|
-
verified_by:
|
|
6
|
+
last_verified: 2026-10-31
|
|
7
|
+
verified_by: claude
|
|
8
8
|
source_urls:
|
|
9
9
|
- https://www.americanexpress.com/us/credit-cards/card/blue-cash-preferred/
|
|
10
10
|
- https://www.americanexpress.com/en-us/credit-cards/apply/terms/personal/blue-cash-preferred-credit-card/25330-10-0#offer-terms
|
|
@@ -15,7 +15,8 @@ welcome_offer:
|
|
|
15
15
|
dollars: 300
|
|
16
16
|
spend: 3000
|
|
17
17
|
months: 6
|
|
18
|
-
|
|
18
|
+
varies: true
|
|
19
|
+
note: 'Paid as Reward Dollars, redeemable for a statement credit or at Amazon.com checkout. Up to $300: the offer terms say "as high as $300", with the exact amount shown after you apply and before you accept. The card page''s headline has shown both "Earn $300" and "As High As $300". Not available if you have or have had this Card, the Morgan Stanley Blue Cash Preferred or previous versions of these Cards.'
|
|
19
20
|
rules:
|
|
20
21
|
- id: us-supermarkets
|
|
21
22
|
match: { categories: [grocery.supermarket] }
|
|
@@ -67,10 +68,7 @@ evidence:
|
|
|
67
68
|
quote: 'will be $0 for the first year of Card Membership'
|
|
68
69
|
- rule: welcome_offer
|
|
69
70
|
url: https://www.americanexpress.com/us/credit-cards/card/blue-cash-preferred/
|
|
70
|
-
quote: '
|
|
71
|
-
- rule: welcome_offer
|
|
72
|
-
url: https://www.americanexpress.com/us/credit-cards/card/blue-cash-preferred/
|
|
73
|
-
quote: 'after you spend $3,000 in purchases on your new Card in the first 6 months of Card Membership'
|
|
71
|
+
quote: 'after you spend $3,000 in purchases on your new Card within the first 6 months of Card Membership'
|
|
74
72
|
- rule: welcome_offer
|
|
75
73
|
url: https://www.americanexpress.com/en-us/credit-cards/apply/terms/personal/blue-cash-preferred-credit-card/25330-10-0#offer-terms
|
|
76
74
|
quote: 'As High As $300 Cash Back Welcome Offer'
|
|
@@ -14,6 +14,7 @@ welcome_offer:
|
|
|
14
14
|
points: 100000
|
|
15
15
|
spend: 8000
|
|
16
16
|
months: 6
|
|
17
|
+
varies: true
|
|
17
18
|
note: 'The public offer is "as high as" 100,000 points; Amex shows the exact amount (which may be lower, or no offer) after you apply and before you accept. Not available if you have or have had this Card, the Premier Rewards Gold Card, the Platinum Card (including the Schwab and Morgan Stanley versions) or previous versions of these Cards; Amex may also decline based on your card history.'
|
|
18
19
|
rules:
|
|
19
20
|
- id: restaurants
|
|
@@ -14,6 +14,7 @@ welcome_offer:
|
|
|
14
14
|
points: 175000
|
|
15
15
|
spend: 12000
|
|
16
16
|
months: 6
|
|
17
|
+
varies: true
|
|
17
18
|
note: 'The public offer is "as high as" 175,000 points; Amex shows the exact amount (which may be lower, or no offer) after you apply and before you accept. Not available if you have or have had this Card, the Schwab or Morgan Stanley Platinum Card, or previous versions of these Cards; Amex may also decline based on your card history.'
|
|
18
19
|
# One cap covers flights booked directly and through Amex Travel.
|
|
19
20
|
caps:
|
|
@@ -3,15 +3,15 @@ name: Atmos Rewards Ascent Visa Signature Credit Card
|
|
|
3
3
|
issuer: bank-of-america
|
|
4
4
|
network: visa
|
|
5
5
|
currency: atmos-points
|
|
6
|
-
last_verified: 2026-10-
|
|
7
|
-
verified_by:
|
|
6
|
+
last_verified: 2026-10-31
|
|
7
|
+
verified_by: claude
|
|
8
8
|
source_urls:
|
|
9
9
|
- https://www.bankofamerica.com/credit-cards/products/alaska-airlines-credit-card/
|
|
10
10
|
base_rate: 1
|
|
11
11
|
annual_fee: 95
|
|
12
12
|
welcome_offer:
|
|
13
|
-
points:
|
|
14
|
-
spend:
|
|
13
|
+
points: 70000
|
|
14
|
+
spend: 2500
|
|
15
15
|
months: 3
|
|
16
16
|
note: Limited-time online offer, no end date stated; it may not be available elsewhere after leaving the page. The window is 90 days from account opening. The offer also includes a $99 Companion Fare (plus taxes and fees from $23).
|
|
17
17
|
rules:
|
|
@@ -62,10 +62,10 @@ evidence:
|
|
|
62
62
|
quote: '$95 annual fee'
|
|
63
63
|
- rule: welcome_offer
|
|
64
64
|
url: https://www.bankofamerica.com/credit-cards/products/alaska-airlines-credit-card/
|
|
65
|
-
quote: 'Get
|
|
65
|
+
quote: 'Get 70,000 bonus points and a $99 Companion Fare (plus taxes and fees from $23) with this offer.'
|
|
66
66
|
- rule: welcome_offer
|
|
67
67
|
url: https://www.bankofamerica.com/credit-cards/products/alaska-airlines-credit-card/
|
|
68
|
-
quote: 'spend $
|
|
68
|
+
quote: 'spend $2,500 or more on purchases within the first 90 days of opening your account'
|
|
69
69
|
todo:
|
|
70
70
|
- 'The 10% rewards bonus rules use a proposed membership id, bank-of-america-account. Bank of America does not say on this page which accounts are "eligible".'
|
|
71
71
|
- 20% back on Alaska and Hawaiian inflight purchases is a rebate, not points, and isn't modeled.
|
|
@@ -3,15 +3,15 @@ name: Atmos Rewards Summit Visa Infinite Credit Card
|
|
|
3
3
|
issuer: bank-of-america
|
|
4
4
|
network: visa
|
|
5
5
|
currency: atmos-points
|
|
6
|
-
last_verified: 2026-10-
|
|
7
|
-
verified_by:
|
|
6
|
+
last_verified: 2026-10-31
|
|
7
|
+
verified_by: claude
|
|
8
8
|
source_urls:
|
|
9
9
|
- https://www.bankofamerica.com/credit-cards/products/alaska-airlines-infinite-credit-card/
|
|
10
10
|
base_rate: 1
|
|
11
11
|
annual_fee: 395
|
|
12
12
|
welcome_offer:
|
|
13
|
-
points:
|
|
14
|
-
spend:
|
|
13
|
+
points: 80000
|
|
14
|
+
spend: 4000
|
|
15
15
|
months: 3
|
|
16
16
|
note: Limited-time online offer, no end date stated; it may not be available elsewhere after leaving the page. The window is 90 days from account opening. The offer also includes a 25,000-point Global Companion Award.
|
|
17
17
|
rules:
|
|
@@ -61,10 +61,10 @@ evidence:
|
|
|
61
61
|
quote: '$395 annual fee and no foreign transaction fees'
|
|
62
62
|
- rule: welcome_offer
|
|
63
63
|
url: https://www.bankofamerica.com/credit-cards/products/alaska-airlines-infinite-credit-card/
|
|
64
|
-
quote: 'Earn
|
|
64
|
+
quote: 'Earn 80,000 bonus points and a 25,000-point Global Companion Award after spending $4,000 or more on purchases'
|
|
65
65
|
- rule: welcome_offer
|
|
66
66
|
url: https://www.bankofamerica.com/credit-cards/products/alaska-airlines-infinite-credit-card/
|
|
67
|
-
quote: '$
|
|
67
|
+
quote: '$4,000 or more on purchases within the first 90 days of opening your account'
|
|
68
68
|
todo:
|
|
69
69
|
- '3x on "foreign transaction" purchases (anything charged in a foreign currency or processed abroad) is not modeled: rules have no foreign-only geography. It would make this card the pick for most purchases abroad.'
|
|
70
70
|
- 'The 10% rewards bonus rules use a proposed membership id, bank-of-america-account. Bank of America does not say on this page which accounts are "eligible".'
|
|
@@ -66,7 +66,7 @@ rules:
|
|
|
66
66
|
requires: { activation: true }
|
|
67
67
|
valid_from: 2026-10-01
|
|
68
68
|
valid_to: 2026-12-31
|
|
69
|
-
note:
|
|
69
|
+
note: Chase says activated categories earn 5% total (4% on top of the 1% base) and doesn't say whether that stacks with the 3% dining rate, so earnrate shows 5%, not 7%, until the $1,500 quarterly cap.
|
|
70
70
|
- id: q4-2026-american-red-cross
|
|
71
71
|
match: { merchants: [american-red-cross] }
|
|
72
72
|
rate: 5
|
|
@@ -120,6 +120,9 @@ evidence:
|
|
|
120
120
|
- rule: q4-2026-dining
|
|
121
121
|
url: https://creditcards.chase.com/cash-back-credit-cards/freedom/flex
|
|
122
122
|
quote: 'Dining American Red Cross'
|
|
123
|
+
- rule: q4-2026-dining
|
|
124
|
+
url: https://creditcards.chase.com/cash-back-credit-cards/freedom/flex
|
|
125
|
+
quote: '5% Cash Back rewards total for each $1 spent until $1,500 is spent'
|
|
123
126
|
- rule: q4-2026-american-red-cross
|
|
124
127
|
url: https://creditcards.chase.com/cash-back-credit-cards/freedom/flex
|
|
125
128
|
quote: 'American Red Cross'
|
|
@@ -144,4 +147,5 @@ evidence:
|
|
|
144
147
|
todo:
|
|
145
148
|
- "Chase's offer-details overlays for the Q4 2026 and Q1 2027 categories (exact grocery exclusions, what counts for American Red Cross) didn't render in the page dump; rules follow the calendar labels and the rewards-category FAQ."
|
|
146
149
|
- 'q4-2026-american-red-cross: what counts (presumably donations) is unconfirmed.'
|
|
150
|
+
- 'q4-2026-dining: whether the 4% additional stacks on the 3% dining rate (7% total) is unstated; showing 5% until Chase says.'
|
|
147
151
|
- 'Q2 2027 (Apr-Jun) shows "Coming Soon"; add it after Chase posts it (activation opens March 15, 2027).'
|
|
@@ -3,18 +3,18 @@ name: Southwest Rapid Rewards Plus Credit Card
|
|
|
3
3
|
issuer: chase
|
|
4
4
|
network: visa
|
|
5
5
|
currency: southwest-rapid-rewards
|
|
6
|
-
last_verified: 2026-10-
|
|
7
|
-
verified_by:
|
|
6
|
+
last_verified: 2026-10-31
|
|
7
|
+
verified_by: claude
|
|
8
8
|
source_urls:
|
|
9
9
|
- https://creditcards.chase.com/travel-credit-cards/southwest/plus
|
|
10
10
|
- https://www.chase.com/personal/credit-cards/rewards-category-faq
|
|
11
11
|
base_rate: 1
|
|
12
12
|
annual_fee: 99
|
|
13
13
|
welcome_offer:
|
|
14
|
-
points:
|
|
14
|
+
points: 80000
|
|
15
15
|
spend: 1000
|
|
16
16
|
months: 3
|
|
17
|
-
note: 'Not available to current cardmembers of any Southwest Rapid Rewards Credit Card, or previous cardmembers of any Southwest Rapid Rewards Credit Card who received a new Cardmember bonus within the last 24 months (this does not apply to business cards).'
|
|
17
|
+
note: 'Chase labels it a limited-time offer and states no end date. Not available to current cardmembers of any Southwest Rapid Rewards Credit Card, or previous cardmembers of any Southwest Rapid Rewards Credit Card who received a new Cardmember bonus within the last 24 months (this does not apply to business cards).'
|
|
18
18
|
caps:
|
|
19
19
|
- id: gas-and-grocery
|
|
20
20
|
amount: 5000
|
|
@@ -48,7 +48,7 @@ evidence:
|
|
|
48
48
|
quote: '$99 applied to first billing statement.'
|
|
49
49
|
- rule: welcome_offer
|
|
50
50
|
url: https://creditcards.chase.com/travel-credit-cards/southwest/plus
|
|
51
|
-
quote: 'Earn
|
|
51
|
+
quote: 'Earn 80,000 bonus points after you spend $1,000 on purchases in the first 3 months from account opening'
|
|
52
52
|
- rule: base_rate
|
|
53
53
|
url: https://creditcards.chase.com/travel-credit-cards/southwest/plus
|
|
54
54
|
quote: 'Earn 1 point for each dollar spent on all other purchases.'
|
|
@@ -3,8 +3,8 @@ name: Southwest Rapid Rewards Premier Business Credit Card
|
|
|
3
3
|
issuer: chase
|
|
4
4
|
network: visa
|
|
5
5
|
currency: southwest-rapid-rewards
|
|
6
|
-
last_verified: 2026-10-
|
|
7
|
-
verified_by:
|
|
6
|
+
last_verified: 2026-10-31
|
|
7
|
+
verified_by: claude
|
|
8
8
|
source_urls:
|
|
9
9
|
- https://creditcards.chase.com/southwest/premier-business-credit-card
|
|
10
10
|
- https://creditcards.chase.com/business-credit-cards/southwest/premier-business
|
|
@@ -12,10 +12,10 @@ base_rate: 1
|
|
|
12
12
|
business: true
|
|
13
13
|
annual_fee: 149
|
|
14
14
|
welcome_offer:
|
|
15
|
-
points:
|
|
15
|
+
points: 60000
|
|
16
16
|
spend: 3000
|
|
17
17
|
months: 3
|
|
18
|
-
note: '
|
|
18
|
+
note: 'Not available to current cardmembers of this business card, or previous cardmembers who received a new Cardmember bonus for this business card within the last 24 months.'
|
|
19
19
|
caps:
|
|
20
20
|
- id: gas-and-dining
|
|
21
21
|
amount: 8000
|
|
@@ -48,7 +48,10 @@ evidence:
|
|
|
48
48
|
quote: '$149 applied to first billing statement.'
|
|
49
49
|
- rule: welcome_offer
|
|
50
50
|
url: https://creditcards.chase.com/business-credit-cards/southwest/premier-business
|
|
51
|
-
quote: '
|
|
51
|
+
quote: 'Earn 60,000 points'
|
|
52
|
+
- rule: welcome_offer
|
|
53
|
+
url: https://creditcards.chase.com/business-credit-cards/southwest/premier-business
|
|
54
|
+
quote: 'after you spend $3,000 on purchases in the first 3 months from account opening'
|
|
52
55
|
- rule: base_rate
|
|
53
56
|
url: https://creditcards.chase.com/southwest/premier-business-credit-card
|
|
54
57
|
quote: 'You’ll earn 1 point for each $1 spent on all other purchases'
|
|
@@ -3,18 +3,18 @@ name: Southwest Rapid Rewards Premier Credit Card
|
|
|
3
3
|
issuer: chase
|
|
4
4
|
network: visa
|
|
5
5
|
currency: southwest-rapid-rewards
|
|
6
|
-
last_verified: 2026-10-
|
|
7
|
-
verified_by:
|
|
6
|
+
last_verified: 2026-10-31
|
|
7
|
+
verified_by: claude
|
|
8
8
|
source_urls:
|
|
9
9
|
- https://creditcards.chase.com/travel-credit-cards/southwest/premier
|
|
10
10
|
- https://www.chase.com/personal/credit-cards/rewards-category-faq
|
|
11
11
|
base_rate: 1
|
|
12
12
|
annual_fee: 149
|
|
13
13
|
welcome_offer:
|
|
14
|
-
points:
|
|
15
|
-
spend:
|
|
14
|
+
points: 85000
|
|
15
|
+
spend: 2000
|
|
16
16
|
months: 3
|
|
17
|
-
note: 'Not available to current cardmembers of any Southwest Rapid Rewards Credit Card, or previous cardmembers of any Southwest Rapid Rewards Credit Card who received a new Cardmember bonus within the last 24 months (this does not apply to business cards).'
|
|
17
|
+
note: 'Chase labels it a limited-time offer and states no end date. Not available to current cardmembers of any Southwest Rapid Rewards Credit Card, or previous cardmembers of any Southwest Rapid Rewards Credit Card who received a new Cardmember bonus within the last 24 months (this does not apply to business cards).'
|
|
18
18
|
caps:
|
|
19
19
|
- id: grocery-and-dining
|
|
20
20
|
amount: 8000
|
|
@@ -48,7 +48,7 @@ evidence:
|
|
|
48
48
|
quote: '$149 applied to first billing statement.'
|
|
49
49
|
- rule: welcome_offer
|
|
50
50
|
url: https://creditcards.chase.com/travel-credit-cards/southwest/premier
|
|
51
|
-
quote: 'Earn
|
|
51
|
+
quote: 'Earn 85,000 bonus points after you spend $2,000 on purchases in the first 3 months from account opening'
|
|
52
52
|
- rule: base_rate
|
|
53
53
|
url: https://creditcards.chase.com/travel-credit-cards/southwest/premier
|
|
54
54
|
quote: 'Earn 1 point for each dollar spent on all other purchases.'
|
|
@@ -3,17 +3,17 @@ name: Southwest Rapid Rewards Priority Credit Card
|
|
|
3
3
|
issuer: chase
|
|
4
4
|
network: visa
|
|
5
5
|
currency: southwest-rapid-rewards
|
|
6
|
-
last_verified: 2026-10-
|
|
7
|
-
verified_by:
|
|
6
|
+
last_verified: 2026-10-31
|
|
7
|
+
verified_by: claude
|
|
8
8
|
source_urls:
|
|
9
9
|
- https://creditcards.chase.com/travel-credit-cards/southwest/priority
|
|
10
10
|
base_rate: 1
|
|
11
11
|
annual_fee: 229
|
|
12
12
|
welcome_offer:
|
|
13
|
-
points:
|
|
14
|
-
spend:
|
|
13
|
+
points: 90000
|
|
14
|
+
spend: 3000
|
|
15
15
|
months: 3
|
|
16
|
-
note: 'Not available to current cardmembers of any Southwest Rapid Rewards Credit Card, or previous cardmembers of any Southwest Rapid Rewards Credit Card who received a new Cardmember bonus within the last 24 months (this does not apply to business cards).'
|
|
16
|
+
note: 'Chase labels it a limited-time offer and states no end date. Not available to current cardmembers of any Southwest Rapid Rewards Credit Card, or previous cardmembers of any Southwest Rapid Rewards Credit Card who received a new Cardmember bonus within the last 24 months (this does not apply to business cards).'
|
|
17
17
|
rules:
|
|
18
18
|
- id: southwest
|
|
19
19
|
match: { merchants: [southwest] }
|
|
@@ -37,7 +37,7 @@ evidence:
|
|
|
37
37
|
quote: '$229 applied to first billing statement.'
|
|
38
38
|
- rule: welcome_offer
|
|
39
39
|
url: https://creditcards.chase.com/travel-credit-cards/southwest/priority
|
|
40
|
-
quote: 'Earn
|
|
40
|
+
quote: 'Earn 90,000 bonus points after you spend $3,000 on purchases in the first 3 months from account opening'
|
|
41
41
|
- rule: base_rate
|
|
42
42
|
url: https://creditcards.chase.com/travel-credit-cards/southwest/priority
|
|
43
43
|
quote: 'Earn 1 point for each dollar spent on all other purchases.'
|
|
@@ -3,8 +3,8 @@ name: Citi / AAdvantage Business World Elite Mastercard
|
|
|
3
3
|
issuer: citi
|
|
4
4
|
network: mastercard
|
|
5
5
|
currency: aadvantage-miles
|
|
6
|
-
last_verified: 2026-10-
|
|
7
|
-
verified_by:
|
|
6
|
+
last_verified: 2026-10-31
|
|
7
|
+
verified_by: claude
|
|
8
8
|
source_urls:
|
|
9
9
|
- https://www.citi.com/credit-cards/citi-aadvantage-business-credit-card
|
|
10
10
|
# Miles post to the company's AAdvantage Business account, not a personal
|
|
@@ -14,9 +14,9 @@ business: true
|
|
|
14
14
|
annual_fee: 99
|
|
15
15
|
first_year_fee: 0
|
|
16
16
|
welcome_offer:
|
|
17
|
-
points:
|
|
18
|
-
spend:
|
|
19
|
-
months:
|
|
17
|
+
points: 75000
|
|
18
|
+
spend: 5000
|
|
19
|
+
months: 5
|
|
20
20
|
note: "Miles post to the business's AAdvantage Business account. Not available if you received a new account bonus for a Citi / AAdvantage Business account in the past 48 months, or converted another Citi card on which you earned a new account bonus in the last 48 months into one."
|
|
21
21
|
rules:
|
|
22
22
|
- id: american-airlines
|
|
@@ -72,7 +72,7 @@ evidence:
|
|
|
72
72
|
quote: 'The annual fee is $99. However, this fee is waived for the first 12 months.'
|
|
73
73
|
- rule: welcome_offer
|
|
74
74
|
url: https://www.citi.com/credit-cards/citi-aadvantage-business-credit-card
|
|
75
|
-
quote: '
|
|
75
|
+
quote: '75,000 AAdvantage® bonus miles For your business after $5,000 in purchases within the first 5 months of account opening'
|
|
76
76
|
- rule: welcome_offer
|
|
77
77
|
url: https://www.citi.com/credit-cards/citi-aadvantage-business-credit-card
|
|
78
78
|
quote: 'new account bonus for a Citi® / AAdvantage® Business account in the past 48 months'
|
|
@@ -3,18 +3,18 @@ name: Citi / AAdvantage Platinum Select World Elite Mastercard
|
|
|
3
3
|
issuer: citi
|
|
4
4
|
network: mastercard
|
|
5
5
|
currency: aadvantage-miles
|
|
6
|
-
last_verified: 2026-10-
|
|
7
|
-
verified_by:
|
|
6
|
+
last_verified: 2026-10-31
|
|
7
|
+
verified_by: claude
|
|
8
8
|
source_urls:
|
|
9
9
|
- https://www.citi.com/credit-cards/citi-aadvantage-platinum-elite-credit-card
|
|
10
10
|
base_rate: 1
|
|
11
11
|
annual_fee: 99
|
|
12
12
|
first_year_fee: 0
|
|
13
13
|
welcome_offer:
|
|
14
|
-
points:
|
|
15
|
-
spend:
|
|
16
|
-
months:
|
|
17
|
-
note: '
|
|
14
|
+
points: 50000
|
|
15
|
+
spend: 2500
|
|
16
|
+
months: 3
|
|
17
|
+
note: 'Not available if you received a new account bonus for a Citi / AAdvantage Platinum Select account in the past 48 months, or converted another Citi card on which you earned a new account bonus in the last 48 months into one.'
|
|
18
18
|
rules:
|
|
19
19
|
- id: american-airlines
|
|
20
20
|
match: { merchants: [american-airlines] }
|
|
@@ -62,7 +62,10 @@ evidence:
|
|
|
62
62
|
quote: 'Annual fee - $99, waived for the first 12 months.'
|
|
63
63
|
- rule: welcome_offer
|
|
64
64
|
url: https://www.citi.com/credit-cards/citi-aadvantage-platinum-elite-credit-card
|
|
65
|
-
quote: 'Earn
|
|
65
|
+
quote: 'Earn 50,000 AAdvantage® bonus miles'
|
|
66
|
+
- rule: welcome_offer
|
|
67
|
+
url: https://www.citi.com/credit-cards/citi-aadvantage-platinum-elite-credit-card
|
|
68
|
+
quote: 'after $2,500 in purchases in the first 3 months'
|
|
66
69
|
- rule: welcome_offer
|
|
67
70
|
url: https://www.citi.com/credit-cards/citi-aadvantage-platinum-elite-credit-card
|
|
68
71
|
quote: 'new account bonus for a Citi® / AAdvantage® Platinum Select® account in the past 48 months'
|
|
@@ -3,8 +3,8 @@ name: Costco Anywhere Visa Business Card by Citi
|
|
|
3
3
|
issuer: citi
|
|
4
4
|
network: visa
|
|
5
5
|
currency: cash
|
|
6
|
-
last_verified: 2026-10-
|
|
7
|
-
verified_by:
|
|
6
|
+
last_verified: 2026-10-31
|
|
7
|
+
verified_by: claude
|
|
8
8
|
source_urls:
|
|
9
9
|
- https://www.citi.com/credit-cards/costco-anywhere-visa-business-card
|
|
10
10
|
# Paid once a year as a Costco reward certificate after the February statement,
|
|
@@ -30,7 +30,7 @@ rules:
|
|
|
30
30
|
exclude: { categories: [gas.superstore, gas.grocery_store] }
|
|
31
31
|
rate: 4
|
|
32
32
|
cap: gas-and-ev-combined
|
|
33
|
-
note: Other eligible gas and EV charging worldwide. Gas or EV charging at superstores, supermarkets
|
|
33
|
+
note: Other eligible gas and EV charging worldwide. Gas or EV charging at some superstores, supermarkets and warehouse clubs other than Costco, and fuel for non-automobile use, earn 1%. Citi keeps a list of excluded merchants at citi.com/Costco_Exclusions.
|
|
34
34
|
- id: restaurants
|
|
35
35
|
match: { categories: [dining] }
|
|
36
36
|
rate: 3
|
|
@@ -63,7 +63,7 @@ evidence:
|
|
|
63
63
|
quote: '4% cash back on other eligible gas and electric vehicle (EV) charging purchases worldwide'
|
|
64
64
|
- rule: gas-and-ev-charging
|
|
65
65
|
url: https://www.citi.com/credit-cards/costco-anywhere-visa-business-card
|
|
66
|
-
quote: 'for gas or EV charging purchased at some superstores, supermarkets
|
|
66
|
+
quote: 'for gas or EV charging purchased at some superstores, supermarkets and warehouse clubs other than Costco'
|
|
67
67
|
- rule: restaurants
|
|
68
68
|
url: https://www.citi.com/credit-cards/costco-anywhere-visa-business-card
|
|
69
69
|
quote: '3% cash back on restaurant purchases (including cafes, bars, lounges, and fast food restaurants)'
|
package/dist/brand.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
//
|
|
2
|
-
//
|
|
3
|
-
export const PRODUCT_NAME = 'earnrate';
|
|
1
|
+
// Names users type or set. package.json's `name` and `bin` must match
|
|
2
|
+
// CLI_NAME by hand, since JSON can't import this.
|
|
4
3
|
export const CLI_NAME = 'earnrate';
|
|
5
4
|
export const MCP_SERVER_NAME = 'earnrate';
|
|
6
5
|
export const CONFIG_DIR = '.earnrate'; // under the home directory
|