Exchange Rate Scraper — 30+ Fiat FX, Historical Deltas, CSV avatar

Exchange Rate Scraper — 30+ Fiat FX, Historical Deltas, CSV

Pricing

Pay per usage

Go to Apify Store
Exchange Rate Scraper — 30+ Fiat FX, Historical Deltas, CSV

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

Alex

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

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 PAIR record 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

ParameterTypeDefaultDescription
baseCurrenciesarray["USD"]Base currencies (e.g., "USD", "EUR", "GBP"). Auto-uppercased.
targetCurrenciesarray[]Target currencies to filter (empty = all ~30 supported). Auto-uppercased.
includeHistoricalbooleanfalseFetch historical rates for comparison
historicalDatestring""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.js lines 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 /latest call 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.
  • changes is intersection-only. If a currency exists in current but not historical (or vice versa), it's silently dropped from the changes map — no error field, no null sentinel. Frankfurter occasionally adds/removes currencies; date-spread runs on this boundary will skip those. Recover the original maps from rates and historicalRates if 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 date field 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:

ToolData
IP GeolocationCountry, city, ISP
Weather DataTemperature, forecast
Exchange RatesCurrency conversion (this)
Country InfoPopulation, languages, currencies
Crypto Price ScraperCrypto 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 date field 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.
  • changes is 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.