ECB Euro Reference FX: Rolling Window Rates
Pricing
from $0.00005 / actor start
ECB Euro Reference FX: Rolling Window Rates
Export published ECB EUR-base reference rates from the rolling XML feed with exact decimal strings, publication dates and explicit missing-currency/date outcomes.
Pricing
from $0.00005 / actor start
Rating
0.0
(0)
Developer
Michal Pšenčík
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
Export the European Central Bank's euro foreign exchange reference rates for the currencies and recent dates you choose, one dataset row per published date and currency, straight from the ECB's official rolling reference-rate file. Each row keeps the rate exactly as the ECB writes it (a decimal string, trailing digits untouched), states what it means (units of the quote currency for one euro), and carries the source URL with the SHA-256 of the file it came from. It is meant for small cost dashboards, reference-data notebooks and periodic reports that refresh the last week or so of rates without maintaining XML parsing themselves.
This is a narrow export of one official, informational series. The ECB publishes these rates for information only; they are not intended for market transactions, and this is not an execution quote, a live price or financial advice. The actor does not compute cross rates, inverse rates, averages or conversions, does not fill weekends or holidays, and covers only what the ECB's rolling file holds (about the last three months of publication days). It is independent of the ECB and not endorsed by it.
Input
{"currencies": ["USD", "GBP", "CZK"],"startDate": "2026-10-16","endDate": "2026-10-22","maxItems": 1000}
currencies: 1 to 10 three-letter codes, quoted against EUR. Surrounding spaces are trimmed and letters uppercased; duplicates collapse to the first occurrence and are billed once. Default["USD", "GBP", "CZK"].EURitself is refused, because the ECB publishes no EUR/EUR quotation. A code the ECB does not publish (for example RUB, suspended since 2022, or a mistyped code) is accepted and reported free as missing; it never becomes a rate.endDate: last publication date,YYYY-MM-DD, no later than today (UTC). Default: today.startDate: first publication date,YYYY-MM-DD, no earlier than 89 days before today (UTC). Default: six days beforeendDate(never earlier than that limit).maxItems: stop after this many rows are stored, 1 to 1000. Default 1000; ten currencies over 90 days is at most 900 rows.
The defaults are resolved once, from the UTC date at the start of the run, and recorded in SUMMARY. Unknown fields, null, wrong types, impossible dates, a reversed range and out-of-range values fail the run before any source request, with the reason in SUMMARY.
Output
One row per published date and requested currency, dates ascending, currencies in input order within a date:
{"schemaVersion": 1,"recordId": "ecb-fxref:2026-10-16:EUR:USD","deliveryId": "1ac5e099ee8121b51878843ec2882841822b5052984a5929031c66fc10e34050","observedAt": "2026-10-22T21:34:15.321Z","contentHash": "5a8cc6c5c388d062e4d99ba529be8edfb5f8c4abe304abb16a1d9d1d839af936","provenance": [{"url": "https://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist-90d.xml","sha256": "de1353c5b67ed4c04f1e9c1f7246fec82f8ddc6041880ef0b1345f82157e197b"}],"sourceDate": "2026-10-16","baseCurrency": "EUR","quoteCurrency": "USD","rate": "1.1253","rateMeaning": "quote_units_per_1_EUR","kind": "ECB_reference_not_transaction"}
rateis a string holding the ECB's exact digits: 1 EUR = 1.1253 USD here. It is never the inverse, never rounded, and never passed through a floating-point number.sourceDateis the ECB publication date (a calendar date, no time zone). The ECB normally publishes around 16:00 CET on working days, excluding TARGET closing days, so today's rate may not exist yet when the run starts.recordIdis stable across runs for the same date and currency.contentHashis the SHA-256 of the six source fields (keys sorted, compact JSON), so a corrected rate changes it and an unchanged repeat keeps it.deliveryIdidentifies this run's delivery of the row.observedAtis when the source file finished downloading.
A requested date or currency with no published rate gets no row. It is listed in SUMMARY instead: dates outside the file's current oldest..newest span as outside_current_publication_window, days inside the span with no publication (weekends, holidays) as no_source_publication, and published days without that currency as currency_not_quoted. These are never zero rates, carried-forward rates or claims about why the rate is absent. The whole file is validated before any row is delivered; if anything in it is malformed or contradictory, no rows are delivered and the reason goes to SUMMARY.
Export the dataset as JSON, CSV or Excel from the run's Storage tab or the API.
Run summary (free)
Every run writes a SUMMARY record to its key-value store, also on failure: run status (complete, partial, failed or capped), the resolved input, request, byte and row counts, and one outcome per currency (delivered, empty, missing, error or not_attempted) with an error code, HTTP status and warnings. The warnings give the requested range, the file's current oldest and newest publication date, how many publication dates fell in your range, and every missing date for that currency. empty means no publication date fell in the range at all (for example a weekend-only range); missing means dates were published but never for this currency. When a cap stops the run, firstUndeliveredKey names the first date and currency left undelivered, so you can rerun from there.
Pricing
Pay per event plus platform usage: besides the two events below, you pay the Apify platform usage of your own run (compute, storage and data transfer) at your plan's rates.
- $0.00005 per Actor start (one start unit at the default 256 MB).
- $0.0001 per date/currency rate stored in the dataset, including unchanged repeats.
The default run (three currencies, the last seven days) usually stores 12 to 15 rows, fewer in holiday weeks: $0.00125 to $0.00155 in events. One row costs $0.00015, ten $0.00105, the 900-row maximum $0.09005. A run finishes in seconds; at 256 MB it stops its own work after 300 seconds, so compute is at most about 0.021 compute units. Missing dates and currencies, failed runs and the SUMMARY record are free; a run that delivers no rows costs only the start fee. Every run fetches the current file and bills its rows again, even when nothing changed. There are no change alerts and no saved state between runs.
Limits and behaviour
- One anonymous HTTPS GET per run to
https://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist-90d.xml, whatever the currencies or dates; no key, login, cookies, browser or proxy. The daily file, the full-history file and the ECB Data Portal are never used as fallbacks. - Timeouts, connection resets and 5xx responses are retried twice (2 s, then 5 s, or longer if the source asks with
Retry-After, up to 60 s), with at least 1.2 seconds between requests. A 403, 429, challenge page or HTML instead of XML stops the run without retry. - Per run: 100 HTTP attempts, 4 MiB per response, 16 MiB of responses in total, 300 seconds of work. The file may hold at most 100 publication days and 50 currencies per day.
- No history beyond the rolling file, no revision tracking and no saved state between runs. A corrected rate appears under the same
recordIdwith a newcontentHash; earlier values are not reconstructed.
Support
Open an issue on the Actor's Issues tab. Source documentation: ECB euro foreign exchange reference rates and the ECB framework for the reference rates.