Garmin VO2 max from FIT file

Hello! I believe there are already a couple of threads on this topic but I can’t understand if there was a conclusion. Is it possible to get the VO2 max from the activity fit file? The reason to it is that Garmin Connect only reports the integer value, but the fit file (and the glance view on my 955) shows two decimal digits. This would help understand better the elusive Garmin training statuses (productive, unproductive, etc…). Thanks!

I’m going to hijack this thread a bit.

  • modern Garmin Watches have a HRV Status Widget - that nightly data get’s synced as Wellness (Intervals → Settings → Garmin) into the rMSSD Field (at least it looks that way to me)
  • apparently if one used the right combination of device and heart rate monitor (and settings), garmin saves HRV values onto the fit file, which also get parsed by Intervals? (do they overwrite my nightly HRV value in the daily wellness fields?)

On the Garmin watch there is this setting: System > Data recording > Log HRV. Default value is false.

That’s what I meant with settings. The question is do I want this activated or will it override my nightly or morning measurement HRV values?

I don’t think so, I’m getting the morning HRV values regularly and I also see HRV from activities in runanalyze. Also in runanalyze I see the 2 digits VO2 max that I’m after.

I had a look in a couple of your files and I didn’t see anything that looked like a vo2max number? Can you point me at it?

However I don’t think it is likely to be accurate enough so the decimals matter. I have checked and the data Garmin sends doesn’t have decimals.

Mmmm… I have this setting activated for a week and I do not see any value on my fit files. Perhaps it is only internal for garmin and it is not shared.

Hi David,
it is more about the trend than about the accuracy. If you look at the glance from the watch you can see the progress over time in a much clearer way:

I will try to figure out where in the data is this.

That is HRV during exercise and has nothing to do with morning HRV. The setting enables your device to store all RR intervals during exercise in the FIT file as a ‘special’ field.
If you download the Intervals ‘streams csv’ file from the interval data page, you will see them. Golden Cheetah and Runalyze also see that field. Intervals isn’t doing anything with the data at this moment but it could calculate dfa-a1 in the future. More on that in the HRV guided training thread in this forum.

No it will not override morning HRV data simply because it is something entirely different. If you have it activated, you can analyse it with Runalyze. But the AlphaHRV IQ field for Garmin now does this live. So it’s becoming less important.


Hi @david I went through a few threads on the Garmin forums and the post activity VO2 max can be found here:

message 140 field 7

To convert to VO2 max it needs to be multiplied by 3.5/65536, so, in this case:
VO2 Max = 827048*3.5/65536 = 44.17

I checked about 10 of my activities and it matches with the graph on my watch and with what runanalyze shows.

I also looked at one of my yoga activity, that don’t generate a new VO2 max and it looks like this:


I was able to re-create the graph on my watch in Google Sheets, using the amazing API and the python-fitparser package. Thanks for all the help!
These are the lines that give the Garmin estimated VO2 Max for an activity:

    fit = requests.get(f'{ride["id"]}/file', auth=basic)
    fit_parsed = fitparse.FitFile(fit.content)

    for record in fit_parsed.get_messages("event"):
        date = record.get_values()['timestamp']
    for record in fit_parsed.get_messages("unknown_140"):
        vo2_max = round(record.get_values()['unknown_7'] * 3.5 / 65536, 2)