Skip to main content
Thirdwatchthirdwatch
Business & local data

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.

Sep 21, 2026 · 4 min read · 836 words
See the scraper →

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

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

Try it yourself

100 free credits, no credit card.

About 30 real searches. Add the MCP to Claude or Cursor in two minutes.