A time-zone dropdown that lists 400 IANA names ("America/Argentina/Buenos_Aires") is a usability problem. Most products only need the UTC offsets — and there are 39 of them in use, not 400.
Every offset in use
curl "https://countries.dev/timezones"[
{ "timezone": "UTC-12:00", "countries": 1 },
{ "timezone": "UTC-11:00", "countries": 5 },
{ "timezone": "UTC-10:00", "countries": 6 },
{ "timezone": "UTC-09:30", "countries": 2 },
{ "timezone": "UTC-09:00", "countries": 3 }
]They come back sorted by real offset, from UTC-12:00 up to UTC+14:00 — not alphabetically — so the list drops straight into a <select> in the order people expect. The countries count tells you how common each offset is, which is handy for ordering or de-emphasising the rare half-hour and quarter-hour zones.
Building the dropdown
const zones = await fetch("https://countries.dev/timezones").then((r) => r.json());
select.innerHTML = zones
.map((z) => `<option value="${z.timezone}">${z.timezone}</option>`)
.join("");From an offset back to countries
Once a user picks an offset, /timezone/{offset} gives you every country that observes it:
curl "https://countries.dev/timezone/UTC+01:00?fields=name"For the other reference lists — currencies, languages and regions — see the rest of the API reference.
Written by
Dov Azencot
At
Thu Jun 25 2026