How the UVA Index is calculated
This is the technical companion to the calculator. It walks through exactly how we estimate surface UVA irradiance (the unweighted 315–400 nm band, in W/m²), how we turn that into the 0–11+ UVA Index, every parameter and coefficient we use — and, just as importantly, the factors we deliberately leave out.
The model in one line
UVA irradiance is a clear-sky value from a radiative-transfer calculation, multiplied by a short chain of factors for the conditions of the moment:
Every factor defaults to 1 (no effect) when its input is
missing, so the estimate degrades gracefully rather than failing. Each
factor is also shown in the calculator's Model breakdown table,
so any reading can be traced back to its parts.
Step 1 — Solar position
The single biggest driver of UVA is how high the sun is in the sky. We
compute the solar zenith angle θ (0° =
directly overhead, 90° = on the horizon) in the browser from your
latitude, longitude and the instant, using the
NOAA solar position algorithm — the same maths behind
the NOAA Solar Calculator. The same algorithm gives the
Earth–Sun distance used in step 5. When the sun is
below the horizon, UVA is reported as 0.
Step 2 — Clear sky, from a radiative-transfer table
Rather than a hand-tuned curve, the clear-sky part of the model comes from a physics calculation done once, ahead of time. We ran DISORT — the standard multiple-scattering solver used in atmospheric science — over a layered model atmosphere for every combination of:
- sun angle, 0–90° in 5° steps;
- aerosol optical depth (haze, at 550 nm), 0–3;
- surface air pressure, 500–1060 hPa (sea level to about 5,500 m),
and integrated the result over 315–400 nm. The page interpolates that table (about 1,800 numbers, 13 KB) for your conditions. The table captures, from first principles, everything the old rules of thumb approximated:
- The fall-off with sun angle, including the large share of UVA that arrives as diffuse skylight — which is why UVA drops far more slowly than UVB as the sun sinks.
- Rayleigh scattering by the air, scaled by the actual surface pressure, which is how altitude enters.
- Haze with its real direct-to-diffuse trade-off: aerosol removes light from the direct beam but scatters most of it forward, so much of it still reaches the ground as skylight.
- Ozone absorption at the short end of the band, at a typical 300 Dobson Units.
- The curvature of the atmosphere for a low sun (the Kasten–Young air mass), which a flat-atmosphere 1/cos θ overstates near the horizon.
The atmosphere assumed:
| Ingredient | Assumption |
|---|---|
| Sunlight above the atmosphere | ASTM G173-03 extraterrestrial spectrum, 85.5 W/m² over 315–400 nm |
| Air (Rayleigh) | Bodhaine et al. (1999) optical depth × pressure ÷ 1013.25 hPa |
| Ozone | 300 DU, centred at 22 km |
| Aerosol | Ångström exponent 1.14, single-scattering albedo 0.92, asymmetry 0.70, scale height 1.5 km |
| Solver | DISORT, 16 streams, 17 layers, 2.5 nm spectral bins |
For an overhead sun in clean air at sea level the table gives
64.5 W/m²; a moderate haze (AOD 0.15) trims
that by about 5% with the sun high and 9–12% with it low. As a check,
the direct-beam part matches NREL's independent SPECTRL2 model to within
1% at every sun angle tested; SPECTRL2's simpler diffuse-sky estimate
mostly comes out 4–18% lower, as expected from a model that doesn't
solve multiple scattering.
The generator, scripts/build_lut.py, is in the repository
for anyone to rerun or change.
Step 3 — Altitude (air pressure)
There is less air above you at altitude to scatter UVA back out to space. The model reads the forecast's surface pressure (falling back to a standard atmosphere for the terrain elevation) and lets the table do the rest. In clean air that is worth about +3% per kilometre. The larger 4–7%/km often measured for UVA in the mountains mostly comes from leaving haze behind in the valleys, and the model picks that up separately through the aerosol data for your point. UVA at altitude works through the numbers.
Step 4 — Surroundings (surface reflection)
Bright surroundings reflect UVA upward, and the sky scatters part of it
back down. For a surface of UV albedo r the table also
provides the atmosphere's spherical albedo
s (about 0.3 in the UVA), and the enhancement is exact for
an evenly reflecting surface:
| Surroundings | UV albedo r | Factor |
|---|---|---|
| Grass, soil or town | 0.03 | ×1.01 |
| Water | 0.07 | ×1.02 |
| Sand / beach | 0.15 | ×1.05 |
| Snow-covered terrain | 0.6 | ×1.24 |
What matters is the surroundings — the kilometre-scale area around you — not just the ground underfoot, because the reflected light has to come back down off the sky. On Auto (the default) the calculator switches to snow when the forecast has 5 cm or more on the ground. Fresh, unbroken snow (r ≈ 0.9) reaches about ×1.40. The much larger flux reflected straight up lands on your chin, nose and eyes rather than on a horizontal surface, so it isn't part of this number; Reflected UVA explains the distinction.
Step 5 — Earth–Sun distance
Earth's orbit is slightly elliptical: it is closest to the sun in early January (0.983 AU) and farthest in early July (1.017 AU). Sunlight scales with the inverse square of distance:
That is +3.4% in January and −3.3% in July — one reason a southern-hemisphere summer is a little stronger than a northern one at the same latitude.
Step 6 — Cloud
Clouds are the most variable influence on ground-level UVA, so the model uses the best input available for your location, in two tiers.
Preferred — derived from live UV data. Open-Meteo publishes both the actual UV Index and a clear-sky UV Index for the same hour. Their ratio is the erythemal cloud transmission for the real sky overhead, which beats any parameterisation of a cover percentage. UVA's transmission is taken from it as
Under thick cloud UVA can get through slightly better than the UVB-weighted UV Index, but measurements vary by cloud type (see UVA on cloudy days), so until the size of the effect is pinned down the neutral value is used. γ is the one cloud coefficient the validation below is set up to calibrate.
Fallback — parametric, from cloud cover. When the live UV pair is unavailable (for instance more than about five days ahead), we fall back to the reported total cloud-cover percentage:
The curve is deliberately gentle, because a reported "100% cover" is a statement about sky coverage, not optical depth — an overcast sky is far more often thin stratus than a storm base. At 100% cover this leaves about 60% of the clear-sky UVA. Clouds dim UVA; they rarely eliminate it.
From irradiance to the 0–11+ index
The raw irradiance in W/m² is precise but unfamiliar, so we put it on a 0–11+ scale just like the UV Index. The conversion is a single constant:
The divisor of 6 is chosen so a clear-sky overhead sun (~64–66 W/m²) reads about 11 — the same top-of-scale feel as a peak tropical UV Index. Because the index is strictly proportional to the irradiance, both numbers tell the same story, and every band boundary below is simply the index value times six. The category bands reuse the familiar WHO UV Index words and colours:
| UVA Index | Band | ≈ Irradiance |
|---|---|---|
| Under 3 | Low | Under 18 W/m² |
| 3 to under 6 | Moderate | 18 to under 36 W/m² |
| 6 to under 8 | High | 36 to under 48 W/m² |
| 8 to under 11 | Very High | 48 to under 66 W/m² |
| 11 and above | Extreme | 66 W/m² and above |
The inputs, at a glance
| Input | Source | Used for |
|---|---|---|
| Latitude / longitude | Geolocation or place search | Solar position |
| Solar zenith angle, Earth–Sun distance | Computed (NOAA) | Clear-sky table, distance factor |
| Surface pressure | Open-Meteo Forecast | Clear-sky table (altitude) |
| Terrain elevation | Open-Meteo Forecast | Pressure fallback |
| Aerosol optical depth | Open-Meteo Air-Quality (CAMS) | Clear-sky table (haze) |
| UV Index & clear-sky UV Index | Open-Meteo Air-Quality (CAMS) | Cloud factor |
| Cloud cover | Open-Meteo Forecast | Cloud fallback |
| Snow depth | Open-Meteo Forecast | Auto surroundings |
| Surroundings | You (or Auto) | Surroundings factor |
The same model also draws the UVA forecast: it is evaluated every 15 minutes across today and the next four days (in the location's own time zone), with the sun's position computed exactly at each step and the hourly cloud and aerosol values interpolated between hours. Each day's peak and the span when the UVA Index is Moderate (3) or higher come from that curve. The air-quality forecast that supplies the UV Index and aerosol only reaches about four to five days ahead; beyond that the model falls back to its cloud-cover curve, so later days are rougher.
What we don't take into account
This is an estimate built for clarity and transparency, not a calibrated radiometric measurement. Several real effects are simplified or left out on purpose — knowing them tells you when to trust the number and when to treat it as a rough guide:
- Live ozone. The table holds total-column ozone at 300 DU. Real columns range from about 250 to 450 DU, which moves UVA by only a couple of percent, and the free feed reports surface ozone (µg/m³) rather than the column, so it is shown for information only.
- Local aerosol type. The table assumes a typical continental aerosol. Desert dust (which absorbs more in the UV and has a flatter spectrum) and wildfire smoke differ, so heavy dust or smoke days carry more uncertainty than the AOD alone suggests.
- Cloud type and structure. The cloud effect comes from a coarse (~40 km) forecast model's UV Index. Cloud layering and broken-cloud "edge" effects (which can briefly raise UVA above clear sky) are not modelled.
- Local geometry and shade. Buildings, trees, terrain, surface tilt and orientation, and your body's posture all change real exposure and are not considered.
- Glass and indoor settings. The estimate is for being outdoors in the open. UVA passes through window glass while UVB mostly doesn't, so indoor or in-car exposure differs and isn't modelled.
- Other minor absorbers (NO₂, SO₂) and the wavelength-dependence of surface albedo are not included.
How the model is checked
The repository includes a validation script,
scripts/validate.mjs, that replays archived inputs for past
dates through the exact code the calculator runs and compares the result
hour by hour with independent UVA data: NASA's POWER service
(satellite-derived UVA from the CERES instruments, available worldwide)
or a file of ground measurements from a UVA radiometer. It reports the
bias and error by sun angle and by cloudiness, checks the clear-sky table
on its own, and fits the cloud exponent γ and an alternative cloud source.
Results from that comparison will be published here; until then, treat
the cloud term as the least certain part of the model.
MODEL block, and the clear-sky
table can be regenerated with different assumptions, without touching the
rest of the app. The full source is on
GitHub.
So how accurate is it?
Treat it as a well-grounded relative guide: it captures how UVA changes with the sun's height, the season, your latitude and altitude, and the day's cloud and haze — and it behaves correctly at the extremes (clear midday sun reads high, night reads zero, heavy overcast drops sharply, higher altitude reads higher). The absolute W/m² figure is a physically reasonable estimate, not an instrument-grade reading. For why this estimate exists at all, see About this site.
Try the UVA Index calculator and see the breakdown →