The card catalog
Budvo can estimate what your credit cards earn: put groceries on the card that pays the most for groceries, see the rewards a month of spending is likely to bring in, and weigh them against the annual fee. To do that it needs to know each card's earn rates, caps and fees. That list is the card catalog, and you can browse all of it on the card catalog page.
Rewards in Budvo are estimates, not financial advice. Card terms change often, and the issuer's terms always win over anything Budvo shows.
Why Budvo keeps its own catalog
Commercial card databases exist, but their data can't be redistributed to every Budvo server, and Budvo never ships a third party's key or data. So Budvo curates its own catalog:
- Facts from the issuer. Every card links to its sources, ideally the issuer's own page for that card. When sources disagree, the issuer wins and the card is flagged.
- Budvo's own wording. Facts like "3% on dining" aren't anyone's property, but other sites' descriptions are. Notes in the catalog are written for Budvo.
- No affiliate links. Budvo doesn't earn anything when you open a card, so the catalog stays neutral.
Confidence and "as of"
Each card shows the date its facts were last checked against the sources, and a confidence:
- Checked on the issuer's page (high): the rates were read straight from the issuer.
- Mostly checked (medium): most facts are confirmed, with a detail or two still to verify (a card's network, for example).
- Not verified yet (low): the issuer's page couldn't be read fully, or the sources disagree. Treat these numbers as a starting point and check them yourself.
Point values are conservative cash values. Budvo asks you for a value when a program's points are worth very different amounts depending on how you redeem them.
How servers get the catalog
Every Budvo server ships with a built-in copy of the catalog, so card rewards work offline and on a server that never checks for updates. Newer catalogs come from a signed feed on this site:
- The server reads
GET /api/cards, which describes the latest version: its number, its SHA-256, a signature, when it was published, how many cards it has and its size. - It downloads that version from
/api/cards/<version>and checks that the bytes hash to that SHA-256. - It verifies the signature with the marketplace key built into Budvo, the same key that signs add-ons and official language packs. The signed message is
budvo-cards:v1, the version and the SHA-256 on three lines, so a catalog signature can never pass as an add-on or a language pack, or the other way round. - Only a catalog that passes every check replaces the copy the server has. If anything fails, the server keeps its last good copy.
The owner decides whether the server checks for catalog updates, in the dashboard's settings. Turning it off keeps the built-in or last downloaded copy.
{ "format": 1, "latest": { "version": 3, "sha256": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08", "signature": "base64...", "published_at": "2026-10-21T18:22:04Z", "cards": 36, "size": 45462, "url": "/api/cards/3" }}Your edits always win
Picking a card from the catalog copies its rates into your card in Budvo. You can change anything: a rate, a cap, the annual fee, or build a card from scratch for a credit union or store card the catalog doesn't have.
A new catalog never overwrites your card silently. When the catalog changes a card you use, Budvo shows what changed (for example "dining 3x to 4x") and you choose to apply it or keep yours.
Rotating categories
Some cards earn a bonus on categories that change every quarter, like Chase Freedom Flex and Discover it. The catalog has a calendar for each: the quarter, its categories, the cap and the date to activate by. One catalog update covers every Budvo server, and Budvo reminds you to activate before the deadline. A quarter you haven't activated counts at the base rate.
Card faces
Budvo doesn't show issuer card art. The card faces you see are generated from a color and the card's name, so nothing is copied from the issuer and the network marks stay untouched.
Suggest a correction
Spot a wrong rate, a new annual fee or a card that's missing? Use Suggest a correction under any card on the card catalog page, or from your Budvo dashboard. Say what the catalog has, what it should say, and link to the source, ideally the issuer's own page. No account, name or email is needed, and nothing about you or your money is sent.
Every correction is reviewed by hand against its source. Accepted corrections go into the next catalog, and servers pick them up on their next check.
Servers and scripts can send corrections too, as JSON to POST /api/cards/corrections:
{ "card_id": "chase-freedom-flex", "kind": "earn_rate", "category": "dining", "current": "3% on dining", "proposed": "3% on dining, plus the Q4 bonus", "source_url": "https://creditcards.chase.com/cash-back-credit-cards/freedom/flex", "note": "", "catalog_version": 3, "app_version": "0.9.0"}card_idis a catalog card id, or""for a missing card (thencard_nameis required).kindisearn_rate,annual_fee,network,rotating,new_cardorother.category(optional) is a catalog category ormerchant:<name>.proposed(up to 500 characters) andsource_url(an https link, up to 500 characters) are required;current(300) andnote(1000) are optional.- The body is at most 16 KB, and unknown fields are refused. A good correction gets
201 {"id": "...", "status": "pending"}; a problem gets an error naming the field.
For maintainers: publishing a catalog
The catalog's source is cards/catalog.json in the website's repository, edited by hand. The review queue at /cards/admin (sign in with a NullDaily account that has the budvo:admin role; before NullDaily sign-in is set up on the site, with a token from npm run translations:admin-token) lists pending corrections first; the accepted ones are the checklist for the next edit.
- Edit
cards/catalog.json. Update each changed card'sas_of,sourcesandconfidence. - Check it:
npm run cards:checklists every problem (unknown keys, a rate over 100, a source that isn't https, a calendar for a family no card has). - Try the publish with
--dry-run, then publish for real:
BUDVO_SIGNING_KEY_FILE=~/.config/budvo/marketplace-signing.pem npm run cards:publish -- --dry-runBUDVO_SIGNING_KEY_FILE=~/.config/budvo/marketplace-signing.pem npm run cards:publishThe script refuses an invalid catalog. It gives the catalog the next version (or --version N, which must be higher than the latest), writes format, version and published_at first, signs the exact bytes servers will download, stores them, and marks every accepted correction as published with that version. It prints the version, the number of cards, the SHA-256, the signature and the corrections it marked, and warns when the key isn't the marketplace key. The signing key never leaves the maintainer's machine, and no part of the website signs anything.