Track Exchange Rates for International Pricing Updates
Pull live and historical FX rates for 340+ currencies as JSON and keep international price lists, invoices, and forecasts on current exchange data.

TL;DR — The Currency Rates Scraper exports live and historical exchange rates for 340+ fiat and crypto currencies as clean JSON. Give it base and target currencies plus an optional date range; it returns pair, rate, inverse rate, and converted amounts. Built for ops teams keeping international price lists and invoices on current FX data.
Why track exchange rates for international pricing
Every price you publish in a foreign currency is a bet on an exchange rate you set once and probably forgot. When USD/INR moves three percent, a catalog pegged to last quarter's rate is suddenly over- or under-priced in every Indian checkout. The BIS triennial survey puts daily FX turnover above $7.5 trillion — these rates move constantly, and manual updates lag by weeks.
The job is not trading. It is hygiene: recompute list prices when rates drift past a threshold, timestamp invoices with the day's rate, and keep a defensible record of which rate you used when. That means a repeatable pull of rates in a structured format — not a screenshot of a converter website.
How does this compare to the alternatives?
| DIY Python script | Generic scraping API | Thirdwatch actor | |
|---|---|---|---|
| Cost | Free but your time | Subscription required | Pay per result |
| Reliability | Breaks on provider changes | Generic, not FX-aware | Handles source failover |
| Setup time | Hours of parsing work | Moderate | Minutes |
| Maintenance | Yours | Shared | Maintained |
A homemade script works until a provider changes its response shape. A generic scraping API still leaves you parsing HTML tables. The actor returns the rate as data, ready for a spreadsheet or a reprice job.
How to track exchange rates for pricing in 4 steps
How do I run the actor once?
Run it through the Apify API with apify-client. Set your base and the currencies you price in:
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("thirdwatch/currency-rates-scraper").call(
run_input={
"baseCurrencies": ["USD"],
"targetCurrencies": ["EUR", "GBP", "INR", "JPY"],
"provider": "auto",
"amount": 1,
"maxResults": 10,
}
)
rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())
print(f"{len(rows)} rate records")Each call returns one record per base-target pair: pair, rate, inverse_rate, converted_amount, and the provider that served it.
How do I pull a specific historical date?
Set date to an ISO day. The actor resolves that day's published fix rather than today's:
run = client.actor("thirdwatch/currency-rates-scraper").call(
run_input={
"baseCurrencies": ["USD"],
"targetCurrencies": ["INR"],
"date": "2026-06-30",
"amount": 250,
}
)This is the right mode for backdating an invoice or explaining a margin swing in a quarterly review — the record carries date so the audit trail is built in.
How do I get a time series instead of one day?
Pass startDate and endDate. You get one row per day per pair, which loads directly into pandas:
import pandas as pd
df = pd.DataFrame(rows)
df["date"] = pd.to_datetime(df["date"])
ts = df.pivot_table(index="date", columns="pair", values="rate")
print(ts.tail())A month of daily USD/EUR and USD/INR in one run is enough to spot drift worth repricing around.
How do I turn rates into a reprice trigger?
Compare today's rate to the rate your catalog assumed, and flag pairs beyond your threshold:
assumed = {"USD/INR": 83.0, "USD/EUR": 0.92}
for row in rows:
old = assumed.get(row["pair"])
if old and abs(row["rate"] - old) / old > 0.02:
print(f"Reprice {row['pair']}: assumed {old}, now {row['rate']}")Two percent is a common trigger band; pick yours based on margin. Schedule the run daily and you have a drift alarm for the price of one small record set.
Sample output
One record per pair per day, with the provider named so you can reconcile sources later:
{"base_currency": "USD", "quote_currency": "INR", "pair": "USD/INR",
"date": "2026-09-11", "rate": 95.513702, "inverse_rate": 0.0104697,
"amount": 250, "converted_amount": 23878.4255,
"provider": "erapi", "provider_name": "ExchangeRate-API open access"}pair is the join key for your price table. rate and inverse_rate cover both quoting directions. converted_amount is amount × rate precomputed. provider and provider_name tell you which source answered, useful when you compare feeds for consistency.
Common pitfalls
Rates from free providers update once a day, not tick-by-tick — do not build intraday pricing on them. Crypto pairs can disagree across providers by more than fiat majors do, so sanity-check a second source before repricing on a crypto rate. Weekend and holiday dates return the nearest published fix; if your pipeline needs a row for every calendar day, forward-fill deliberately rather than assuming a row exists. Thirdwatch's actor names the provider on every record precisely so you can detect a stale or divergent source instead of trusting it blindly.
Related use cases
- Build a crypto price monitor with CoinGecko data — same pattern, crypto-native source.
- Monitor competitor pricing with a price tracker — pair FX rates with competitor price pages.
- Guide to scraping business data — the broader playbook for company and market data.
- More workflows on the blog hub.
Frequently asked questions
Does this Actor need an API key?
No. It reads from free, keyless exchange-rate sources and returns normalized JSON. You set base and target currencies, optional dates, and a result limit; the Actor handles source selection and retries.
Can I get historical rates, not just today's?
Yes. Pass a single date for a point-in-time rate or a startDate/endDate pair for a time series. The Actor returns one record per currency pair per day so the output drops straight into a chart or table.
How many currencies are covered?
More than 340 fiat and crypto currencies, with any of them usable as the base. Common majors like USD, EUR, GBP, INR, and JPY are prefilled and you can extend the list freely.
How fresh are the rates?
Live runs return the most recent published fix from each provider, typically updated daily. For intraday trading-grade data you would need a paid market-data feed; this Actor is built for pricing, invoicing, and reporting.
Can I convert amounts, not just read rates?
Yes. Set the amount field and each record returns both the rate and the converted amount, so you do not need to multiply in a second step.
Related
100 free credits, no credit card.
About 30 real searches. Add the MCP to Claude or Cursor in two minutes.