Exchange Rate Scraper — 30+ Fiat FX, Historical Deltas, CSV
Pricing
Pay per usage
Exchange Rate Scraper — 30+ Fiat FX, Historical Deltas, CSV
18 runs. Backed by 951-run Trustpilot flagship + 31-actor portfolio. Daily FX rates CSV/JSON — 30+ currencies from ECB via Frankfurter. Historical delta + % change. Free, no API. Treasury + cross-border pricing + accounting close. spinov001@gmail.com · blog.spinov.online · t.me/scraping_ai
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Alex
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Share
Exchange Rate Scraper — Real-Time & Historical Currency Conversion
Get real-time and historical exchange rates for ~32 world currencies. Powered by European Central Bank (ECB) data via the Frankfurter API. Compare rates over time, calculate percentage changes, and export individual currency pairs. Free, no API key needed.
Features
- Real-Time Rates — current exchange rates from the European Central Bank
- ~32 Currencies — USD, EUR, GBP, JPY, CHF, CAD, AUD, and the rest of Frankfurter's supported set
- Historical Comparison — fetch rates from any past date (back to 1999) and calculate absolute + percentage changes
- Currency Pairs — outputs one flat
PAIRrecord per(base, target)for easy filtering - Multiple Base Currencies — query rates for several base currencies in one run
- ECB Data Source — institutional-grade rates, updated once per business day
Output Example
Summary record (1 per base currency, optionally with historical fields):
{"base": "USD","date": "2026-03-18","rates": {"EUR": 0.9234,"GBP": 0.7891,"JPY": 149.52,"CHF": 0.8812,"CAD": 1.3621},"ratesCount": 30,"historicalDate": "2026-01-01","historicalRates": { "EUR": 0.9102, "GBP": 0.7800, "JPY": 148.10 },"changes": {"EUR": {"current": 0.9234,"historical": 0.9102,"change": 0.013200,"changePercent": 1.4505}},"scrapedAt": "2026-03-18T10:00:00.000Z"}
PAIR record (one per target currency, current rates only — historical rates do NOT produce PAIR records):
{"_type": "PAIR","pair": "USD/EUR","base": "USD","target": "EUR","rate": 0.9234,"date": "2026-03-18","scrapedAt": "2026-03-18T10:00:00.000Z"}
So a single base currency yields 1 summary + ~30 PAIR records per run (PAIR counts reflect current rates only, regardless of includeHistorical).
Use Cases
- E-Commerce Pricing — automatically update product prices based on current exchange rates
- Financial Analysis — track currency movements and calculate historical changes
- Travel Budgeting — compare conversion rates across multiple currencies at once
- Accounting & Invoicing — fetch daily rates for multi-currency bookkeeping
- Forex Research — monitor ECB rate trends and currency pair volatility
- Data Pipelines — feed structured rate data into dashboards and reporting tools
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
baseCurrencies | array | ["USD"] | Base currencies (e.g., "USD", "EUR", "GBP"). Auto-uppercased. |
targetCurrencies | array | [] | Target currencies to filter (empty = all ~30 supported). Auto-uppercased. |
includeHistorical | boolean | false | Fetch historical rates for comparison |
historicalDate | string | "" | Date for historical rates (YYYY-MM-DD) — required when includeHistorical=true |
How It Works
The actor queries https://api.frankfurter.app/latest?from={base} for current rates per base currency, then optionally https://api.frankfurter.app/{historicalDate}?from={base} for historical rates. When historical comparison is enabled, it computes per-currency change (6-decimal absolute) and changePercent (4-decimal relative) for every currency present in BOTH responses.
Honest disclosure on inputs and behavior
- ⚠️ Outer try/catch wraps the entire run (
src/main.jslines 23-89). A single failed fetch on any base currency (e.g. invalid currency code passed to Frankfurter, transient HTTP 5xx, network timeout) halts the entire run — remaining base currencies in the same batch are skipped silently. Historical fetches have their own inner try/catch, so historical-data errors don't kill the run, but the primary/latestcall is unprotected. - No retry, no proxy. Single
fetch()per URL. Frankfurter has no published rate limit (it's a free best-effort service), but is not guaranteed against intermittent 502/504s during ECB-publish bursts. changesis intersection-only. If a currency exists in current but not historical (or vice versa), it's silently dropped from thechangesmap — no error field, no null sentinel. Frankfurter occasionally adds/removes currencies; date-spread runs on this boundary will skip those. Recover the original maps fromratesandhistoricalRatesif you need symmetric coverage.- Historical mode does NOT emit PAIR records. PAIR records are pushed exclusively from
currentData.rates(line 73). If you need flat PAIR records for the historical date too, request a custom build. - ECB weekend / holiday handling. ECB publishes business-day rates only (Mon-Fri, ~16:00 CET). Frankfurter falls back to the most recent business-day rate for queries on weekends, holidays, or pre-publish hours. The
datefield reflects what Frankfurter actually returned, not your input date — check it explicitly if exact-date matching matters. - No crypto, no precious metals. Frankfurter is fiat-only. For BTC/ETH use the Crypto Price Scraper; gold/silver require a separate paid data feed.
Free Data APIs (No Key Required)
Part of a collection of no-auth-needed data tools:
| Tool | Data |
|---|---|
| IP Geolocation | Country, city, ISP |
| Weather Data | Temperature, forecast |
| Exchange Rates | Currency conversion (this) |
| Country Info | Population, languages, currencies |
| Crypto Price Scraper | Crypto prices via CoinGecko |
All free on Apify Store.
Need a custom build?
Apify-as-a-Service tiers:
- Pilot — $97: 1 actor, basic config, 7-day support. Good for one-off "EUR/USD weekly snapshot" cron.
- Standard — $297: custom actor + Slack/email alerts on threshold (e.g. "ping me when USD/JPY crosses 150"), 30-day support.
- Premium — $797: custom actor + dashboard + 90-day support + 1 modification round. For recurring multi-base, multi-date FX dashboards with historical PAIR records and retry+circuit-breaker.
Email: spinov001@gmail.com Portfolio: apify.com/knotless_cadence — 31 published actors (78 total). Trustpilot 949+ runs, Reddit 80+, Email Extractor 30+. Recently delivered a paid 3-article series for a client in the proxy industry ($150). Blog (case studies): https://blog.spinov.online Tips & tutorials: t.me/scraping_ai
Honest disclosure
- Public Frankfurter API only (ECB-backed) — no key, no auth, single-attempt fetch with no retry/proxy.
- ECB publishes rates once per business day around 16:00 CET; weekends/holidays return Friday's rate via Frankfurter fallback. The
datefield reflects what was returned, not the input. - ~32 fiat currencies supported (no crypto, no precious metals).
- Outer try/catch — single base-currency failure halts the entire batch. Historical fetches have inner-try protection.
changesis intersection-only — currencies missing from either date are silently dropped.- PAIR records are emitted only from current rates, never from historical.
- Independent project — not affiliated with the ECB or Frankfurter.