Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Active credit card transfer bonuses from Amex, Chase, Capital One, Citi, Bilt, and Rove. Weekly-refreshed data with confidence markers. Use when pricing an award booking that involves a points transfer or deciding whether to wait for a better bonus.
.claude/skills/borski-transfer-bonuses/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-17 | ✗→✓ | ▲ Improved | 125% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 229% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 98% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 101% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 135% | 0% |
Authoritative reference for current credit card transfer bonuses. Reads from data/transfer-bonuses.json, which is refreshed weekly by scripts/refresh-transfer-bonuses.py (run automatically every Monday via .github/workflows/refresh-data.yml, and manually any time). The script scrapes Frequent Miler (canonical) and cross-checks each bonus against AwardWallet. Each active bonus carries a confidence marker (VERIFIED if both FM and AwardWallet agree, LIKELY if only FM, UNVERIFIED if single weak source) per the toolkit's Research Integrity Protocol. TPG is sometimes consulted manually as a sanity check but is NOT scraped programmatically — TPG often shows expired bonuses as active.
The data file is a snapshot; bonuses commonly end on month-end dates between refreshes. On 2026-07-07 the file listed 7 "active" bonuses of which 5 had ended a week earlier — an agent quoting the file raw would have priced a Chase→Marriott transfer at 1.55x when the real ratio was 1.0. So, mechanically, every time:
end_date_inclusive to today. Past-dated = expired, regardless of which array it sits in. Never present an expired bonus as available.active_bonuses entry is past-dated, or _meta.last_updated is more than 7 days old, refresh first: python3 scripts/refresh-transfer-bonuses.py (use --dry-run to preview). Then re-read the file.frequent_recurring_bonuses_to_watch), it may be worth waiting.data/transfer-bonuses.json. Schema (relevant fields):
| Field | Description | |-------|-------------| | _meta.last_updated | ISO date, last refresh | | _meta.staleness_days | TTL in days; integrated with scripts/check-data-freshness.sh | | _meta.primary_sources | Frequent Miler, AwardWallet (TPG consulted manually only) | | active_bonuses[].bonus_pct | The bonus percentage (e.g., 30 for 30%) | | active_bonuses[].ratio | Multiplier on standard ratio (1.30 = 30% bonus) | | active_bonuses[].standard_ratio | Baseline transfer ratio (1.0 = 1:1, 0.75 = 4:3) | | active_bonuses[].effective_ratio | Final ratio after bonus (standard_ratio * ratio) | | active_bonuses[].end_date_inclusive | Last day the bonus is active | | active_bonuses[].confidence | VERIFIED, LIKELY, or UNVERIFIED | | active_bonuses[].sources[] | Direct URLs to primary source posts | | active_bonuses[].notes | Strategic context, including "but you shouldn't" warnings | | expired_recently[] | Bonuses that ended in the last 30 days. Useful for noticing TPG/AW staleness. | | frequent_recurring_bonuses_to_watch{} | Bonuses that historically recur, with typical % and frequency. Use for "should I wait?" decisions. | | decision_rules{} | Six concrete rules for how to factor bonuses into a transfer decision. |
Run weekly (or on-demand) via:
bashpython3 scripts/refresh-transfer-bonuses.py
The script:
expired_recently[]._meta.last_updated.scripts/check-data-freshness.sh flags this file as stale after 7 days.
If the script fails (Frequent Miler's HTML changed, network issue, etc.), fall back to manual update by visiting the two primary sources (Frequent Miler, AwardWallet) and editing the JSON by hand. TPG can be consulted as a sanity check but is not authoritative because it frequently shows expired bonuses as active. NEVER fabricate a bonus. Per the Research Integrity Protocol, if you cannot verify a bonus from a primary source, do not include it.
When the user asks "what bonuses are active right now?", read data/transfer-bonuses.json and produce a markdown table. Sample format (illustrative — pull live values from the data file, not from this example):
| From | To | Bonus | End Date | Effective Ratio | Confidence | Notes |
|------|----|-------|----------|-----------------|------------|-------|
| Amex MR | Hilton Honors | 20% | YYYY-MM-DD | 1:2.4 | VERIFIED | Skip unless specific Hilton stay; effective ~1.2 cpp |
| Chase UR | Aeroplan | 20% (30% w/ Aeroplan Visa) | YYYY-MM-DD | 1:1.20 (1.30) | VERIFIED | Star Alliance; no fuel surcharges; stackable |
| Chase UR | IHG | 70% | YYYY-MM-DD | 1:1.70 | VERIFIED | "But you shouldn't" - Chase Travel portal (dynamic Points Boost; verify actual quote) typically wins for IHG bookings |
| Capital One | JAL | 30% | YYYY-MM-DD | 1:0.975 | VERIFIED | Brings standard 4:3 to ~1:1; oneworld |
| Citi TYP | Leading Hotels | 25% | YYYY-MM-DD | 1:1.25 | LIKELY | Niche luxury; only useful for specific LHW stays |(The table format and notes apply across program-pairs. The actual current end dates and effective ratios live in data/transfer-bonuses.json and update weekly via scripts/refresh-transfer-bonuses.py.)
Then below the table:
For any award redemption that requires a transfer, compute the effective cost both ways:
Without bonus:
points_required_in_card_currency = miles_required / standard_ratioWith bonus:
points_required_in_card_currency = miles_required / effective_ratioExample: book a 70k JAL business class award via Capital One during April 2026:
When sources disagree:
current-point-transfer-bonuses page is updated daily and is the most accurate near-realtime source.If TPG shows a bonus that Frequent Miler doesn't, treat it as expired or never-existed unless you can verify from the original promotion source (the airline's own page).
This skill exists in part because LLMs are tempted to confidently invent transfer bonuses. Never list a bonus that isn't in the data file. If the data file is stale (check-data-freshness.sh reports STALE), refresh it before answering. If refresh fails, tell the user "the data file is stale and I can't refresh right now" rather than guessing.
Other measured skills in the registry, with their headline benchmark lift.