---
title: "DST transitions: next daylight-saving time changes for an IANA time zone"
method: GET
path: "/v1/time/dst"
tags: ["no-api-key", "time", "timezones", "dst"]
---

# DST transitions: next daylight-saving time changes for an IANA time zone

`GET /v1/time/dst`

## Request

- Base URL: `https://api.duoleads.com`
- URL: `https://api.duoleads.com/v1/time/dst`
- Auth: none declared

DST transitions: list the daylight-saving time changes for an IANA time zone over a date range: the exact instant of each shift, the offset before and after, and whether local clocks jump forward or back. Returns the current offset and DST state, and the next transition from a given instant. Zones without DST return an empty transition list rather than an error.

**Output (`data`):** zone, observes_dst, current {offset, offset_seconds, abbreviation, dst}, next (first transition after from, or null), transitions [{at, local_before, local_after, offset_before, offset_after, delta_seconds, direction forward|back, abbreviation_before, abbreviation_after}].

Deterministic only when the query fixes the instant; otherwise the answer depends on the current time and is served `no-store`. `meta.deterministic` says which.

Price: $0.05 USDC per call (x402, Base). Route contract version 1.0.0. Docs: https://api.duoleads.com/docs#time-dst

## Query parameters

- `zone` string, required
- `from` string
- `years` integer

## Response `200`

Paid and settled. `data` is route-specific; a route that judges its input returns 200 with `data.valid: false` for a bad value.

- object
  - `ok` unknown, required
  - `route` '/v1/time/dst', required
  - `version` '1.0.0', required
  - `data` object, required: zone, observes_dst, current {offset, offset_seconds, abbreviation, dst}, next (first transition after from, or null), transitions [{at, local_before, local_after, offset_before, offset_after, delta_seconds, direction forward|back, abbreviation_before, abbreviation_after}].
    - `zone` string, required
    - `observes_dst` boolean, required
    - `current` object, required
      - `offset` string, required
      - `offset_seconds` integer, required
      - `abbreviation` string, required
      - `dst` boolean, required
    - `next` object, nullable, required
      - `at` string, required
      - `local_before` string, required
      - `local_after` string, required
      - `offset_before` string, required
      - `offset_after` string, required
      - `delta_seconds` integer, required
      - `direction` string, required
      - `abbreviation_before` string, required
      - `abbreviation_after` string, required
    - `transitions` object[], required
      - `at` string, required
      - `local_before` string, required
      - `local_after` string, required
      - `offset_before` string, required
      - `offset_after` string, required
      - `delta_seconds` integer, required
      - `direction` string, required
      - `abbreviation_before` string, required
      - `abbreviation_after` string, required
  - `meta` Meta, required
    - `disclaimer` string, required: Legal short disclaimer, identical on every response.
    - `request_id` string, required: ULID.
    - `computed_at` string, date-time, required: RFC 3339 UTC with milliseconds.
    - `price_usd` string, required: Decimal string, "0.05".
    - `deterministic` boolean, required
    - `sources` object[]: Present only on routes that read a vendored dataset: the exact edition that answered.
      - `id` string, required
      - `version` string, required
      - `published` string, required
      - `attribution` string
      - `licence` string

## Other responses

- `400`: MISSING_PARAM, INVALID_PARAM or UNSUPPORTED_VALUE. Not charged: validation runs before the paywall.
- `402`: Payment required. No valid PAYMENT-SIGNATURE was supplied: read the base64 PAYMENT-REQUIRED header (or this body) for the price ($0.05 = 50000 atomic USDC on eip155:8453), sign an EIP-3009 authorization and retry. Also returned when settlement is declined (PAYMENT_FAILED). Nothing is charged on a 402.
- `404`: NOT_FOUND: unknown path. Not charged.
- `405`: METHOD_NOT_ALLOWED: only GET and HEAD are served. Not charged.
- `413`: INPUT_TOO_LARGE: a parameter exceeded its documented maximum length. Not charged.
- `500`: INTERNAL: a server bug. Not charged.

---

[API](https://skmtc.dev/duoleads/apis/duo-data-utilities-iban-isin-vat-tax-id-barcode-timezone-geo.md) · [All operations](https://skmtc.dev/duoleads/apis/duo-data-utilities-iban-isin-vat-tax-id-barcode-timezone-geo/llms.txt) · [OpenAPI document](https://skmtc.dev/duoleads/apis/duo-data-utilities-iban-isin-vat-tax-id-barcode-timezone-geo/revisions/18790d59615e?raw)
