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.

Why a model at all? No mainstream free weather API serves pure UVA — they all publish the erythemally-weighted UV Index, which is mostly UVB. So instead of reading UVA off an API, we derive it from the physics of where the sun is, plus live atmospheric data that we know affects UVA.

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:

UVA = baseline × altitude × aerosol × surroundings × Earth–Sun distance × cloud

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:

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 atmosphere assumed:

IngredientAssumption
Sunlight above the atmosphereASTM G173-03 extraterrestrial spectrum, 85.5 W/m² over 315–400 nm
Air (Rayleigh)Bodhaine et al. (1999) optical depth × pressure ÷ 1013.25 hPa
Ozone300 DU, centred at 22 km
AerosolÅngström exponent 1.14, single-scattering albedo 0.92, asymmetry 0.70, scale height 1.5 km
SolverDISORT, 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 factor = 1 ÷ (1 − r × s)
SurroundingsUV albedo rFactor
Grass, soil or town0.03×1.01
Water0.07×1.02
Sand / beach0.15×1.05
Snow-covered terrain0.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:

distance factor = 1 ÷ rAU²

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

TUVA = TUVγ, with γ = 1

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:

cloud factor = 1 − 0.4 × (cover ÷ 100)1.5

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:

UVA Index = UVA irradiance ÷ 6

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 IndexBand≈ Irradiance
Under 3LowUnder 18 W/m²
3 to under 6Moderate18 to under 36 W/m²
6 to under 8High36 to under 48 W/m²
8 to under 11Very High48 to under 66 W/m²
11 and aboveExtreme66 W/m² and above

The inputs, at a glance

InputSourceUsed for
Latitude / longitudeGeolocation or place searchSolar position
Solar zenith angle, Earth–Sun distanceComputed (NOAA)Clear-sky table, distance factor
Surface pressureOpen-Meteo ForecastClear-sky table (altitude)
Terrain elevationOpen-Meteo ForecastPressure fallback
Aerosol optical depthOpen-Meteo Air-Quality (CAMS)Clear-sky table (haze)
UV Index & clear-sky UV IndexOpen-Meteo Air-Quality (CAMS)Cloud factor
Cloud coverOpen-Meteo ForecastCloud fallback
Snow depthOpen-Meteo ForecastAuto surroundings
SurroundingsYou (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:

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.

Built to be recalibrated. The few remaining tunable coefficients live in one 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 →