SFOLN

Catalogue / Data utilities

Currency Exchange Rates API

sfoln/fx-rates · Developer tools, Automation, Ecommerce

Get latest or historical exchange rates for any currency pairs, with amount conversion: ECB and 100+ central-bank reference rates via Frankfurter, data back to 1948. $0.50 per 1,000 rates; invalid pairs and dates without data are free.

About

What it does

Currency Exchange Rates API gets latest or historical exchange rates for any list of currency pairs and converts an amount in the same call. Rates are mid-market reference rates published by the European Central Bank and 100+ other central banks and official sources, blended by the open-source Frankfurter service (data back to 1948). Ideal for invoicing, e-commerce price lists, accounting exports, spreadsheets and AI agents that need a reliable, citable rate.

Price

Price per delivered record

EventPricePer 1,000Charged for
Exchange rate
fx-rate
$0.0005$0.50 / 1,000Charged once per currency pair (and date) for which an exchange rate was returned.

Apify free plan: up to 10 items per run. Paid plans have no per-run cap; set maxTotalChargeUsd to cap spend.

Run

Call it from code, an agent or the Console

curl · synchronous run, rows in the response
curl -X POST "https://api.apify.com/v2/actors/sfoln~fx-rates/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"pairs":["USD/EUR","EUR/GBP","GBP/JPY@2024-01-05"]}'
mcp.json · hosted Apify MCP server
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/fx-rates"
    }
  }
}
asynchronous run · for large batches
POST https://api.apify.com/v2/actors/sfoln~fx-rates/runs?maxTotalChargeUsd=1
GET  https://api.apify.com/v2/actor-runs/{runId}            # until status is SUCCEEDED
GET  https://api.apify.com/v2/datasets/{defaultDatasetId}/items?format=json

Authenticate with an Apify API token. MCP clients can instead sign in with OAuth when prompted. Example prompt for an agent: Get today's USD/EUR, EUR/GBP and GBP/JPY exchange rates and convert 2,500 USD to EUR.

Input

Input fields

List currency pairs such as USD/EUR. Each pair produces one dataset record with the rate, its date and the converted amount.

FieldTypeDefaultMeaning
pairs *arrayrequiredCurrency pairs
Pairs as BASE/QUOTE with ISO 4217 codes, e.g. USD/EUR. Add @YYYY-MM-DD for a historical rate (EUR/GBP@2024-01-05). API callers can also pass objects {"base":"USD","quotes":["EUR","JPY"],"date":"2024-01-05","amount":250}. Accounts on the Apify free plan can process up to 10 currency pairs per run.
amountstring"1"Amount to convert
Amount in the base currency to convert: a plain number with a decimal point, e.g. 100 or 99.95 (no thousands separators, decimal commas or currency signs; otherwise the pairs are skipped as invalid). Default 1.
datestring—Date
Historical date (YYYY-MM-DD) applied to pairs without their own @date. Leave empty for the latest rates.
maxPairsinteger1000Max pairs
Safety cap on the number of pairs processed in this run. Range 1–10000.
concurrencyinteger5Concurrency
Parallel workers. Pairs sharing a base currency and date are fetched in one request. Range 1–10.
includeRawbooleanfalseInclude raw upstream response
Attach the unmodified Frankfurter row to each record.
Example input
{
  "pairs": [
    "USD/EUR",
    "EUR/GBP",
    "GBP/JPY@2024-01-05"
  ]
}

Output

One record per input item

Records land in the run's dataset; a synchronous call returns them directly. Each has a status (ok is charged; everything else is free) and a charged flag. The run's OUTPUT record totals items and charges.

FieldTypeMeaning
inputobjectInput
Parsed pair request.
pairstringPair e.g. "USD/EUR"
basestring | nullBase currency e.g. "USD"
quotestring | nullQuote currency e.g. "EUR"
ratenumber | nullRate
Units of quote currency per 1 unit of base currency (mid-market). e.g. 0.89273
inverseRatenumber | nullInverse rate
1 / rate, 10 significant digits.
datestringRate date
Date of the reference rate (YYYY-MM-DD).
requestedDatestring | nullRequested date
null = latest.
amountnumber | nullAmount
Amount in base currency (null when the given amount was not a plain number; the record is then skipped_invalid).
convertednumberConverted
amount × rate, in quote currency.
statusstringStatus
ok | not_found | error | skipped_invalid | skipped_budget | skipped_free_plan e.g. "ok"
chargedbooleanCharged
sourcestringSource
fetchedAtstringFetched at
Example record
{
  "input": {
    "pair": "USD/EUR",
    "base": "USD",
    "quote": "EUR",
    "amount": 100
  },
  "pair": "USD/EUR",
  "base": "USD",
  "quote": "EUR",
  "rate": 0.89273,
  "inverseRate": 1.120159511,
  "date": "2026-10-14",
  "requestedDate": null,
  "amount": 100,
  "converted": 89.273,
  "status": "ok",
  "charged": true,
  "chargedEvent": "fx-rate",
  "source": "frankfurter (ECB and other central banks)",
  "fetchedAt": "2026-10-14T10:00:00.000Z"
}

Machine-readable

This page for agents