Timezones

Time zones are the core of the API: every IANA zone with live offsets, DST state, and upcoming transitions.

At a glance

Endpoint What you get
GET /v1/timezones Paginated, filterable list — concise rows built for pickers and tables.
GET /v1/timezones/{iana} One zone in full detail: live time, standard offset, next DST transition.

List time zones

GET /v1/timezones

Returns a paginated list of time zones. By default each row is concise — enough to render a list or populate a picker.

Example — power a timezone picker

Your user picked United States in a settings form; show them their country's zones in a friendly order:

curl "https://api.timezone.io/v1/timezones?country=us&sort=display_name" \
  -H "Authorization: Bearer YOUR_API_TOKEN"
{
    "data": [
        {
            "iana": "America/Adak",
            "display_name": "Adak",
            "country": { "code": "US", "name": "United States" },
            "current": {
                "utc_offset": "-09:00",
                "abbreviation": "HDT",
                "is_dst": true
            },
            "observes_dst": true,
            "links": {
                "self": "https://api.timezone.io/v1/timezones/America/Adak"
            }
        },
        {
            "iana": "America/Anchorage",
            "display_name": "Anchorage",
            "country": { "code": "US", "name": "United States" },
            "current": {
                "utc_offset": "-08:00",
                "abbreviation": "AKDT",
                "is_dst": true
            },
            "observes_dst": true,
            "links": {
                "self": "https://api.timezone.io/v1/timezones/America/Anchorage"
            }
        }
    ],
    "meta": {
        "current_page": 1,
        "per_page": 50,
        "total": 29,
        "tzdb_version": "2026d",
        "generated_at": "2026-06-12T09:00:00+00:00"
    },
    "links": {
        "first": "https://api.timezone.io/v1/timezones?country=us&sort=display_name&page=1",
        "last": "https://api.timezone.io/v1/timezones?country=us&sort=display_name&page=1",
        "prev": null,
        "next": null
    }
}

(Remaining 27 rows trimmed.) Show users the display_name and keep the iana value for your database — nobody picks "America/Indiana/Indianapolis" off a menu.

Query parameters

Parameter Type Description
country string ISO 3166-1 alpha-2 country code. Case-insensitive (fr, US).
observes_dst boolean true/false (also 1/0). Keep only zones that do or don't observe DST.
q string Literal search across the IANA identifier and display name. Max 100 characters.
sort string iana, display_name, or offset. Prefix with - for descending (e.g. -offset). Default iana.
offset string Filter by standard UTC offset, within ±14:00. Accepts -04:00 or bare minutes like -240.
abbreviation string Filter by abbreviation/code such as EST or CET. Case-insensitive, max 10 characters.
is_mainland boolean true/false. Keep only mainland (or outlying) zones.
detail string concise (default) or full. full returns the detail shape per row.
per_page integer Results per page, 1–100. Default 50.
page integer Page number, 1 or greater. Default 1.

Going deeper

  • offset filters on the standard offset, not the current one — a zone observing DST right now still matches its winter offset. To find zones currently at a given offset, filter by abbreviation instead, or use detail=full and read current.
  • detail=full trades payload size for round trips. One request for a country's zones with full DST detail beats N follow-up lookups — see rate limits.
  • Combine filters freely; they AND together (?country=us&observes_dst=false is the set of US zones that never change their clocks).

Retrieve a time zone

GET /v1/timezones/{iana}

Fetch a single zone by its IANA identifier (for example America/New_York). The slash in the identifier is part of the path.

Example — warn users about an upcoming clock change

A scheduling app wants to flag that a recurring 9 am New York meeting will shift for European invitees when the US falls back. dst.next_transition says exactly when and by how much:

curl https://api.timezone.io/v1/timezones/America/New_York \
  -H "Authorization: Bearer YOUR_API_TOKEN"
{
    "data": {
        "iana": "America/New_York",
        "display_name": "New York",
        "observes_dst": true,
        "is_mainland": true,
        "coordinates": { "latitude": 40.71416, "longitude": -74.00638 },
        "country": { "code": "US", "name": "United States" },
        "current": {
            "datetime": "2026-06-12T05:00:00-04:00",
            "utc_datetime": "2026-06-12T09:00:00Z",
            "utc_offset": "-04:00",
            "utc_offset_seconds": -14400,
            "abbreviation": "EDT",
            "name": "Eastern Daylight Time",
            "is_dst": true
        },
        "standard": {
            "utc_offset": "-05:00",
            "utc_offset_seconds": -18000,
            "abbreviation": "EST",
            "name": "Eastern Standard Time"
        },
        "dst": {
            "savings_seconds": 3600,
            "next_transition": {
                "type": "fall_back",
                "at": "2026-11-01T06:00:00Z",
                "utc_offset_after": "-05:00",
                "abbreviation_after": "EST",
                "clock_change_seconds": -3600
            }
        },
        "links": {
            "self": "https://api.timezone.io/v1/timezones/America/New_York",
            "country": "https://api.timezone.io/v1/countries/US",
            "abbreviation": "https://api.timezone.io/v1/abbreviations/eastern-daylight-time",
            "web": "https://timezone.io/iana/America/New_York"
        }
    },
    "meta": {
        "tzdb_version": "2026d",
        "generated_at": "2026-06-12T09:00:00+00:00"
    }
}

Reading it: on November 1, 2026 at 06:00 UTC the zone falls back (clock_change_seconds is -3600), after which it is EST at -05:00. Your 9 am New York meeting lands an hour later for everyone whose zone doesn't change that week.

Query parameters

Parameter Type Description
at string Compute the time-dependent fields at a specific moment instead of now. Accepts an ISO-8601 datetime (2026-01-15T12:00:00Z) or a Unix timestamp in seconds within years 2000–2100 (1768478400); use ISO-8601 for moments outside that range.

Response fields

The response is grouped into blocks:

Block Description
current Live local time, offset, abbreviation, friendly name, and DST flag.
standard The standard (non-DST) time the zone is on or returns to: offset, abbr., name.
dst DST savings and the next_transition (or null if none in the next 5 years).
coordinates Latitude and longitude (either may be null).
links Related API URLs plus web, the human-readable page on timezone.io.

Going deeper

  • Percent-encode +. For Etc/GMT+N zones, encode the + as %2B — e.g. Etc/GMT%2B5. A literal + in a URL decodes as a space and returns 404.
  • at answers historical and future questions. ?at=2026-01-15T12:00:00Z tells you what offset New York had in January; the dst.next_transition is computed relative to that moment too.
  • A zone with observes_dst: false still has a dst block, so your parsing code never branches: savings_seconds is 0, and next_transition is null unless one last switch is still ahead, such as a new abbreviation at the same offset.
  • The abbreviation and country links resolve to live Abbreviations and Countries endpoints. The abbreviation link uses the named zone's slug, never its code, because codes collide (AST names several zones) and a bare code can answer 300.

A missing identifier returns 404. See Errors for the full list of responses.