What rates are you actually looking for? Bid? Ask? Midpoint? What time of day? "Close of Business", or midnight? What time zone?
FX markets are basically always open. You are recognizing this in the framing of your question, but perhaps being a bit evasive in acknowledging that it is the core root of the problem you are seeing.
There is not really any such thing as a singular 'fx exchange', there are various methods of aligning buyers and sellers for currency conversions, at least for most currency pairs. What is critical is that you maintain consistency in your data set, and compare apples to apples, going deep into the T&C's of a particular data feed and acknowledge in your research specifically what that data set is providing. In many cases, what you will find is probably some degree of averaging according to different methods, perhaps in a way not 100% published.
These issues actually have significant financial impact. Over the past decade, there have been some significant legal cases around collusion for fx rate listings (see example here: https://www.law.ox.ac.uk/business-law-blog/blog/2021/12/european-commission-fines-five-global-banks-eu344-million-collusion). Because contracts will often define particular data points in the future for resolution, on any given day, what is considered the "closing fx rate" will make someone somewhere in the world a winner, and someone a loser.
Basically, the chance for manipulation could work something like the following:
(1) Assume you were a bank, and had a pending contract to buy $100M USD at the relevant "closing GBP price" on a future day. The contract would contain some type of reference to how that data point is defined. For simplicity let's assume it is simply "the final trade made on such and such exchange, at exactly 4:29:59.99 pm, GMT".
(2) Now let's assume you happened to have an excess $10M USD sitting in your drawer on that future day, which you need to get rid of anyway, to reduce the risk of your exposure to USD.
(3) You look at your watch at 4:29:59.98 PM. GBP is trading at 0.74 -> 1 USD. You decide it would be a jolly good day for an extra bonus on your net commission for the year.
(4) You place the order to sell that excess $10M USD noted in step 2, and instead of extracting the maximum 7.4M GBP possible from the market, you 'foolishly' sell it for only 7.3, effectively losing 100k GBP.
(5) The clock strikes 4:29:59.99 PM - and the reference rate for the day is now listed as 0.73 GBP. Your contract in step 1 is calculated - great news, you bought your 100M USD for just 73M GBP, which saves you 1M GBP compared to what the market rate would have been, before your 'foolish' sale in step 4.
(6) Your net gain between step 4 & 5 is 900k GBP!
Normally, artificially buying/selling at worse rate than the market doesn't net you any gain, because if you bought stock 'more cheaply than possible', you would also have 'sold it more cheaply than possible'. In this case, however, because the large initial contract's reference rate was changed by a much smaller transaction, double-dealing allows you to actually create a net gain for yourself, particularly if you are able to collude with other parties. See the above link for more details on a particular set of instances.
As a result of the above, some parties have decided to remove themselves from being usable as a reference rate, to prevent possible manipulation, or the appearance of manipulation. As an example, after something like 2018, the Bank of Canada provides historical information only on the average rate for each day, and specifically goes a step further to indicate that this is for indicative purposes only:
"The Bank of Canada does not guarantee the accuracy or completeness of these exchange rates. They are indicative rates only, derived from aggregated price quotes from financial institutions. They do not necessarily reflect the rates at which actual market transactions have been or could be conducted, and they may differ from the rates provided by financial institutions and other market sources."
Where other entities provide specific rates for the purpose of financial benchmarking, it typically involves some type of averaging weighted to noon / close of business in a particular timezone. This is done so that manipulation of the type outlined above would become too costly to be effective [if you averaged the last 10 minutes of GBPUSD trading, you would incorporate possibly billions of dollars of transactions, which would be too expensive to realistically manipulate for purposes of setting a reference rate on a given contract]. See example here, from Bloomberg on their 'BFIX' rate methodology https://data.bloomberglp.com/notices/sites/3/2016/04/bfix_methodology.pdf
So, why is the data different?
(1) Difference in timezones;
(2) Difference in specific data point requested [ask v buy v midpoint; noon rate vs close of business]
(3) Difference in methodology [averaging trades 5 minutes before the noted time, final trade, listed-governmental rate for restricted currencies...];
(4) Purposeful obfuscation [like the Bank of Canada, attempting to avoid being caught in the middle of a collusion dispute].
What is the one source of the truth?
That depends entirely on how you define what you are looking for. Consistency + acknowledgment of your method is what matters most. For tax impact, look to your tax jurisdiction to see if they have a preferred / required rate table. For 3rd party contracts, as long as the data is clearly defined, many approaches will be acceptable. For personal naval gazing... none of this matters too much.