How Airctc sources rates
The product question is simple: you have an amount in one currency — where do you actually receive the most of another? Rankings use money received after fees, not the poster rate.
What is live today
- Wise and Revolut — public quote feeds the sites themselves use, including fees where the provider publishes them.
- TD, RBC, Scotiabank, BMO — the same public JSON those Canadian bank pages load. Not a login API, and not a guessed markup on mid-market.
- State Bank of India — daily forex card PDF (TT and cash columns vs INR).
- National Bank of Pakistan — daily rate-sheet PDF linked from NBP’s public index (TT buying/selling vs PKR).
- VBCE — Vancouver cash buy/sell board, the same JSON the travel-rates page loads.
- XE converter — mid-market from xe.com’s public converter HTML. Not XE Money Transfer.
- Frankfurter, Bank of Canada, ECB, Bank of England, Norges Bank, FBIL, Banxico — official reference rates. BoE is sterling spots; Norges Bank is NOK series from their public SDMX feed. These are benchmarks, not places to exchange money.
What we will not do
Many banks and brokers only show rates after login, behind Cloudflare, or as an empty JavaScript app. European retail banks (Barclays, Lloyds, Deutsche Bank, Santander, ING, BNP) have no public customer FX board we can parse. CIBC, National Bank of Canada, OFX, Remitly, Western Union, Knightsbridge, Interchange Financial, Calforex, Continental, HDFC, ICICI, HBL, and Banorte stay in the directory with a link to the official page. Airctc will not estimate a spread, bypass a WAF, or treat a marketing “saved vs bank” or interbank mid-market number as a customer quote.
Adding a bank, country, or currency
Providers live in src/data/providers.ts. Locations live in src/data/locations.ts. A new live source is one adapter file registered in src/lib/providers/registry.ts. Currencies and cities are append-only catalogs. If the adapter cannot fetch a number, it must return unavailable.