You can download historical forex data as CSV or Excel without writing an API request. Open SiftingIO Market Data Export, choose Forex and a pair such as EURUSD, then load the chart and download the file. The no-account preview covers completed bars from the latest 24 hours. For longer history and more intervals, create a free account and get an API key.
This guide takes you from that first download to a worksheet you can use: how to choose the format, read the timestamps and calculate a price change without confusing missing rows or unfinished candles with a complete history.
Download your first EURUSD file#
Start with one pair and one-hour bars. A small file makes it easier to check the result before downloading a longer period.
- Open the export tool and select Forex.
- Enter EURUSD, choose 1 hour, and leave the period at 24 hours.
- Select Show chart. Check the pair, interval, first timestamp and last timestamp above the chart.
- Choose Download Excel for a workbook, or Download CSV for a plain data file.
Without an account, the available intervals are 5 minutes, 15 minutes, 30 minutes and 1 hour. The preview returns up to 300 completed bars from the latest 24 hours. It does not move the window back to a previous trading day when the market is closed.
For a longer period, sign in and connect your API key. Your key's market access and request allowance apply. Loading the data uses API requests; downloading the already loaded result does not fetch it again. Available history depends on the instrument and interval.
CSV or Excel: which should you download?#
| What you want to do | Choose | Why |
|---|---|---|
| Review prices and build a spreadsheet chart | Excel (.xlsx) | The workbook keeps prices in a Data sheet and dataset details in a Metadata sheet. |
| Load prices into Python, SQL or your own software | CSV | Seven named columns make the file straightforward to import. Keep the dataset details alongside it. |
| Repeat the same download automatically | Historical REST API | A script can save requests, handle pagination and update the dataset on a schedule. |
For a first look, use Excel. The Metadata sheet helps you keep the requested period, actual interval and completeness information with the prices. A CSV alone cannot explain every assumption behind a dataset.
If the file is only the first step toward an application, the Forex API overview explains the product, while the historical forex documentation covers automated requests.
Read the columns before calculating anything#
The CSV uses this order:
| Column | Field | Meaning |
|---|---|---|
| A | Time (UTC) | The bar's opening time, written as an ISO timestamp ending in Z. |
| B | Timestamp (ms) | The same instant as Unix epoch milliseconds. It is not a seconds value. |
| C–F | Open, High, Low, Close | Price observations summarized over the bar's interval. |
| G | Volume | The reported per-bar volume value, or a blank when unavailable. Preserve its documented unit and meaning. |
For EURUSD, a price of 1.1000 means 1.10 US dollars per euro. Reversing the pair changes the interpretation, not just its label.
Keep the raw download unchanged and do calculations in a separate sheet or copy. Record the pair, interval and requested period with the file. If you combine exports later, add an instrument column before stacking different pairs together.
If Excel puts the CSV into one column#
Use Data → From Text/CSV and select a comma delimiter in the import preview. Check that prices are recognized as numbers and that the decimal point is interpreted correctly. Menu labels vary by Excel version; Microsoft's CSV import instructions show the supported import options.
Leave the original UTC text column intact. A date displayed without a timezone is easier to misread when the workbook moves between colleagues or computers. Downloading the .xlsx version is the simpler option if you do not need a CSV.
Why a 24-hour selection can contain 25 rows#
Count bar labels, not just elapsed hours. From 10:00 on Monday to 10:00 on Tuesday, there are 24 elapsed hours but 25 hourly opening timestamps if both endpoints are included.
Those rows do not necessarily represent 25 finished hours. With your own API key, the latest returned candle may still be forming. A candle labelled 10:00 represents the interval beginning at 10:00; it is not a statement that the entire hour has finished.
The no-account preview filters for completed bars. The CSV itself has no per-row “closed” flag. If your calculation requires closed candles, check the final bar's opening time and interval rather than assuming the last row is final.
Also distinguish a forming candle from a partial result. A partial result means the requested dataset was not loaded in full. Shorten the requested period and load it again before treating it as complete. Neither the chart's appearance nor the presence of a download button proves full coverage.
A small Excel calculation you can check by hand#
Once prices are numeric, sort the whole table by Timestamp (ms) ascending. Never sort the timestamp column on its own, which would separate times from their prices.
Here is a synthetic example, not an observed market result:
| Bar opening time (UTC) | Close | Change from previous listed close |
|---|---|---|
| 09:00 | 1.1000 | Leave blank |
| 10:00 | 1.1011 | +0.10% |
| 11:00 | 1.1000 | Approximately −0.0999% |
In an unmodified export, Close is column F and the first data row is row 2. Add a Close change column in H. Leave H2 blank, then enter this in H3 and fill down:
=F3/F2-1
Format H as Percentage. Do not multiply the formula by 100 as well: percentage formatting already handles the display. The example assumes both closing prices are present, numeric and positive. Investigate a blank, zero or invalid price before filling the calculation through that row.
The two percentages above differ because the denominator changes. Moving from 1.1000 to 1.1011 is a 0.10% increase; returning to 1.1000 uses 1.1011 as the starting value.
This measures the change between two listed closing prices. It is not a trading profit calculation: spread, execution, fees and position sizing are absent. If two rows are separated by a weekend or another gap, the result spans that gap; do not label it a one-hour return simply because you selected hourly bars.
Four checks before using a longer history#
- Coverage: compare the requested period with the first and last returned bars, and inspect any partial-result warning. A successful download can still be shorter than the history you wanted.
- Timestamps: check ordering and duplicates after editing or joining files. Do not manufacture weekend candles just to make every timestamp equally spaced.
- Price consistency: each bar's low should be no higher than its open or close; its high should be no lower than either. These checks catch malformed rows, not every possible data-quality issue.
- Volume: keep blanks as unavailable. Read the export's volume metadata before using the column in a model; the word “Volume” alone does not establish its unit or justify replacing missing values with zero.
SiftingIO provides aggregated reference data. Treat it as a research input, not a record of the exact fills your broker would have given you. Match the data definition to your task before drawing conclusions from it.
For a larger file, our DuckDB CSV recipes show how to inspect coverage and timestamp gaps with SQL. If you need a worksheet that refreshes quotes instead of a saved historical file, use the separate Excel Power Query guide.
Start with one file, then extend it#
Download a small EURUSD sample, check its timestamps and prices, and run the calculation above. Once that works, connect your account's key and choose the history you actually need. You can evaluate the format before building an integration or committing to a large download.



